The ctx reference
Normal and Integration scripts reach the platform through ctx; Pure scripts have none. A function shown returning ok, result returns two values: when ok is true, result is the value shown; when it is false, result is the error message. Functions marked Integration only are available only in integrations; every other function is available in both profiles.
ctx.cache
ctx.cache.delete(key: string) -> ok, result: nil
Deletes a cache value: your account's cache, or in an integration the instance's.ctx.cache.get(key: string) -> ok, result: any
Reads a cache value: your account's cache, or in an integration the instance's.ctx.cache.set(input: { key: string, ttl: number | nil, value: any }) -> ok, result: nil
Writes a cache value (single-table input): your account's cache, or in an integration the instance's. ttl is in seconds (default 3600, capped at 604800 = 7 days); the encoded value is limited to 4 KB.
ctx.config
ctx.config.get(key?: string, default?: any) -> ok, result: any
Reads a config value, with an optional default: your account's config, or in an integration the instance's install-time config. With no key, returns the whole config table.
ctx.dataContainer
The older name for ctx.store: ctx.dataContainer.delete, ctx.dataContainer.get, ctx.dataContainer.list, ctx.dataContainer.put and ctx.dataContainer.query work the same way as their ctx.store counterparts.
ctx.device
ctx.device.forWorkcenter(workCenterId: string) -> WorkCenterDevice
The device assigned to this work center. Not available in integrations.ctx.device.get(idOrName: string) -> Device
The device with this id or name. In an integration, the id of one of the resources its manifest binds.ctx.device.http(idOrName: string, request: { auth: { basic: { password: string, username: string } | nil, bearer: string | nil } | nil, body: string | nil, headers: { [key: string]: string } | nil, method: string | nil, path: string | nil, query: { [key: string]: any } | nil, timeoutMs: number | nil, url: string | nil }) -> ok, result: { body: string | nil, headers: { [key: string]: string }, status: number }
Sandboxed HTTP request through a device connection. The request body must be a string (json.encode a table first); the response body is the raw string, never decoded (json.decode it).ctx.device.sql(idOrName: string, request: { bindings: any[] | nil, query: string }) -> ok, result: { columns: string[], executionTimeMs: number | nil, rows: any[][], rowsAffected: number | nil }
Sandboxed SQL through a device connection. Edge transport envelopes, including SQL results, are limited to 16 MiB (16,777,216 bytes, including protocol overhead). Select only needed columns and page large result sets.
ctx.edgeApp
ctx.edgeApp.invoke(handle: string, payload?: any) -> ok, result: any
Invokes a deployed edgeApp by handle.
ctx.graph
ctx.graph.impact(entityId: string, options?: { direction: string | nil, maxDepth: number | nil }) -> ok, result: { depth: number | nil, id: string, label: string | nil, status: string | nil, type: string }[]
Returns entities reachable up/downstream from a fulfillment entity.ctx.graph.provenanceImpact(entityId: string, options?: { direction: string | nil, maxDepth: number | nil }) -> ok, result: { depth: number | nil, id: string, label: string | nil, status: string | nil, type: string }[]
Returns entities reachable up/downstream from a provenance entity, over the structural composite (operational + fulfillment + provenance). Requires provenance:read.ctx.graph.provenanceTrace(entityId: string, options?: { direction: string | nil, maxDepth: number | nil }) -> ok, result: { edges: { rel: string, source: string, target: string }[], nodes: { depth: number | nil, id: string, label: string | nil, status: string | nil, type: string }[] }
Returns the cross-layer lineage subgraph (nodes + edges) around a provenance entity, over the structural composite (operational + fulfillment + provenance). Requires provenance:read.ctx.graph.trace(entityId: string, options?: { direction: string | nil, maxDepth: number | nil }) -> ok, result: { edges: { rel: string, source: string, target: string }[], nodes: { depth: number | nil, id: string, label: string | nil, status: string | nil, type: string }[] }
Returns the fulfillment lineage subgraph (nodes + edges) around an entity.ctx.graph.whatIf(seeds: string[], extraEdges: { rel: string | nil, source: string, target: string, weight: number | nil }[], options?: { direction: string | nil, maxDepth: number | nil }) -> ok, result: { affected: { depth: number | nil, id: string, label: string | nil, newlyReachable: boolean, status: string | nil, type: string }[], introducesCycle: boolean }
First-class hypothetical impact: the delta between the baseline reachable set from seeds and the reachable set with extraEdges unioned in (over the structural composite by default), plus whether the injected edges introduce a cycle. Requires provenance:read.
ctx.graphql
ctx.graphql.query(query: string, variables?: { [key: string]: any }) -> ok, result: { data: any | nil, errors: { message: string }[] | nil }
Runs a GraphQL operation with the caller's authorization. Validation infers selected result fields and variable types for literal operations and immutable query strings; dynamic documents retain the general result envelope.
ctx.integration
ctx.integration.getBindings() -> ok, result: { [key: string]: string }Integration only
The manifest resource bindings of this instance.ctx.integration.getId() -> ok, result: stringIntegration only
The integration instance ID.ctx.integration.getIntegrationId() -> ok, result: stringIntegration only
The integration definition ID.ctx.integration.getVersion() -> ok, result: stringIntegration only
The installed integration version.
ctx.jdf
ctx.jdf.build(ops: any[]) -> ok, result: string | nil
Renders a JDF build-operation list to JDF XML. Returns (ok, xml) — ok=false with the error message on failure.ctx.jdf.loadTemplate(name: string) -> ok, result: any
Loads a stored JDF template script by name and returns the value that script returns.ctx.jdf.parse(xml: string, options?: any) -> ok, result: any | nil
Parses JDF XML into a table. Returns (ok, doc) — ok=false with the error message on failure.
ctx.jmf
ctx.jmf.build(ops: any[]) -> ok, result: string | nil
Renders a JMF build-operation list to JMF XML. Returns (ok, xml) — ok=false with the error message on failure.ctx.jmf.loadTemplate(name: string) -> ok, result: any
Loads a stored JMF template script by name and returns the value that script returns.ctx.jmf.parse(xml: string, options?: any) -> ok, result: any | nil
Parses JMF XML into a table (kind = jmf or jdf_stub). Returns (ok, doc) — ok=false with the error message on failure.
ctx.knowledge
ctx.knowledge.query(seeds: string[], options?: { limit: number | nil, query: string | nil }) -> ok, result: { graph: { body: string, conceptId: string | nil, confirmations: number, contradicts: string[], entityId: string | nil, entityType: string | nil, id: string, provenance: string, scope: string, score: number }[], supporting: { body: string, conceptId: string | nil, confirmations: number, contradicts: string[], entityId: string | nil, entityType: string | nil, id: string, provenance: string, scope: string, score: number }[] }
Retrieves your account's knowledge relevant to the given bounded-entity seeds (TypeID strings; graph spread + attached notes, ranked). Optional free-textquerybiases the spread semantically.
ctx.log
ctx.log.error(message: string, attrs?: { [key: string]: any }) -> nil
Logs an ERROR message with optional structured attributes.ctx.log.info(message: string, attrs?: { [key: string]: any }) -> nil
Logs an INFO message with optional structured attributes.ctx.log.warn(message: string, attrs?: { [key: string]: any }) -> nil
Logs a WARNING message with optional structured attributes.
ctx.ml
ctx.ml.clusterSeries(series: number[][], options?: { epsilon: number | nil, metric: string | nil, minClusterSize: number | nil, window: number | nil }) -> ok, result: { labels: number[], nClusters: number }
DBSCAN clustering of series by DTW distance (augurs).ctx.ml.detectChangepoints(series: number[], options?: { method: string | nil }) -> ok, result: { changepoints: number[] }
Structural-break detection on a univariate series (augurs).ctx.ml.detectOutliers(series: number[][], options?: { method: string | nil, sensitivity: number | nil }) -> ok, result: { isOutlier: boolean[], outlyingSeries: number[] }
Outlier detection across a group of aligned series (augurs).ctx.ml.detectSeasonality(series: number[]) -> ok, result: { periods: number[] }
Periodogram seasonal-period detection on a univariate series (augurs).ctx.ml.dtwDistance(a: number[], b: number[], options?: { metric: string | nil, window: number | nil }) -> ok, result: { distance: number }
Dynamic-time-warping distance between two series (augurs).ctx.ml.dtwDistanceMatrix(series: number[][], options?: { metric: string | nil, window: number | nil }) -> ok, result: { matrix: number[][] }
Pairwise DTW distance matrix over a group of series (augurs).ctx.ml.get(name: string) -> MLModel
The model with this name.ctx.ml.interpolate(series: number[]) -> ok, result: { values: number[] }
Linear gap-fill of NaN holes in a series (augurs).ctx.ml.predict(modelName: string, featuresJSON: string) -> ok, result: { confidence: number | nil, predictedClass: string | nil, prediction: number | nil, warnings: string[] | nil }
Prediction against a model trained in your account.ctx.ml.systemPredict(modelName: string, featuresJSON: string) -> ok, result: { confidence: number | nil, predictedClass: string | nil, prediction: number | nil, warnings: string[] | nil }
Prediction against a system model role.
ctx.notify
ctx.notify.send(input: { body: string, bodyHtml: string | nil, group: string | nil, recipient: string | nil, subject: string } | string, options?: { body: string, bodyHtml: string | nil, subject: string }) -> ok, result: { recipientCount: number, status: string } | nil
Sends a notification to a group or recipient. Pass a single table { group?/recipient?, subject, body, bodyHtml? }. The legacy (targetId, options) two-arg form is deprecated.
ctx.protobuf
ctx.protobuf.decode(descriptor: string, bytes: string) -> ok, result: any
Decodes a protobuf payload (base64) against a descriptor: a registered one, or in an integration one its manifest declares.
ctx.script
ctx.script.load(name: string) -> any
Loads another stored Script by name and returns its exports. Raises a catchable error when the Script does not exist — wrap in pcall to fall back.
ctx.sql
ctx.sql.query(sql: string, bindings?: { [key: string]: any }) -> ok, result: { headers: string[], limit: number, nextOffset: number | nil, rowCount: number, rows: any[][], truncated: boolean }
Read-only SQL over your account's reporting tables. Maximum 1000 rows per query. Check truncated; use LIMIT and OFFSET with a stable unique ORDER BY to fetch subsequent pages using nextOffset, or aggregate in SQL.
ctx.store
ctx.store.delete(name: string, schemaName?: string) -> ok, result: nil
Deletes a stored record, if it exists.ctx.store.get(name: string, schemaName?: string) -> ok, result: { createdAt: string | nil, data: any, name: string, schemaName: string | nil, updatedAt: string | nil } | nil
Reads one stored record by name. In an integration, give the schema it belongs to.ctx.store.list(schemaName?: string, opts?: { limit: number | nil, offset: number | nil }) -> ok, result: { createdAt: string | nil, data: any, name: string, schemaName: string | nil, updatedAt: string | nil }[]
Lists stored records by name, up to opts.limit (default 100, at most 1000) from opts.offset.ctx.store.put(name: string, data: any, schemaName?: string) -> ok, result: { createdAt: string | nil, data: any, name: string, schemaName: string | nil, updatedAt: string | nil }
Creates or replaces a stored record. In an integration, give a schema the manifest declares.ctx.store.query(query: { schemaName: string | nil, taggableId: string | nil, taggableType: string | nil }) -> ok, result: { createdAt: string | nil, data: any, name: string, schemaName: string | nil, updatedAt: string | nil }[]
Finds stored records tagged with a job (taggableType = "job", taggableId), optionally in one schema.
ctx.template
ctx.template.get(name: string) -> Template
The template with this name. In an integration, the id of one of the resources its manifest binds.ctx.template.render(template: string, vars?: { [key: string]: any }) -> ok, result: string
Renders a stored template with the given variables: the one-call form ofctx.template.get(name):render(vars).
ctx.twin
ctx.twin.attributes() -> ok, result: { bands: { label: string, lowerInclusive: number | nil, upperExclusive: number | nil }[] | nil, description: string, displayName: string, key: string, kind: string, priority: number }[]Normal only
The behaviour attributes a hypothetical allocation may carry, highest priority first, with the bands a numeric attribute is grouped into. Needs the workCenterBehaviorProfile:read permission.ctx.twin.project(input: { applyPaceDrift: boolean | nil, bucketMinutes: number | nil, horizonHours: number | nil, hypotheticalAllocations: { attributes: { [key: string]: string | number } | nil, dependsOn: string[] | nil, dueAt: string | nil, jobLabel: string | nil, label: string, quantity: number | nil, runMinutes: number | nil, setupMinutes: number | nil, startAt: string, workCenterId: string }[] | nil, samples: number | nil, scheduleScenarioId: string | nil, seed: number | nil, workCenterId: string }) -> ok, result: { allocations: { attributeValues: { key: string, value: string }[], endP10At: string, endP50At: string, endP90At: string, evidenceDepth: number, label: string | nil, operationId: string | nil, plannedEndAt: string, plannedStartAt: string, probabilityLaterThanPlanned: number, truncatedAtHorizonProbability: number, workCenterId: string }[], bucketMinutes: number, calendarScheme: string, horizonEndAt: string, horizonStartAt: string, machineStatus: string | nil, samples: number, scheduleScenarioId: string | nil, seed: number, slices: { availableMinutes: number, blockIndex: number | nil, dayKind: string | nil, endAt: string, expectedBusyMinutes: number, expectedLostMinutes: number, expectedStops: number, kind: string | nil, lostMinutesP10: number, lostMinutesP90: number, shiftDefinitionId: string | nil, shiftName: string | nil, startAt: string, stopProbability: number }[], strip: { availableShare: number, downProbability: number, endAt: string, expectedBusyShare: number, startAt: string }[], summary: { boundedAllocations: number, expectedLostMinutes: number, expectedStops: number, expectedUtilization: number, truncatedAllocations: number }, timeZone: string | nil, timeZoneUnset: boolean, uncalibrated: boolean, workCenterId: string }Normal only
Projects one work centre over the next N hours (default 24, at most 336) from its behaviour profile and its published plan: per shift or time-bucket occurrence the expected busy and lost minutes with a P10–P90 band on the loss, the probability of a stop and the expected number of stops; a strip of down probability per bucket (5, 15, 30 or 60 minutes); and P10/P50/P90 ends per allocation. Hypothetical allocations must be on this work centre and start inside the window. The same input and result as theprojectWorkCenterTwinGraphQL query, withattributeswritten as a plain table; timestamps are ISO8601 UTC instants and slice keys carry the tenant-local shift identity. Persists nothing. Needs the scenarioSimulationRun:execute permission.ctx.twin.shadow(workCenterId: string) -> ok, result: { catchUpConfidence: number | nil, evaluatedAt: string, operations: { attributeValues: { key: string, value: string }[], catchUpConfidence: number | nil, elapsedMinutes: number, evidenceDepth: number, expectedEndP10At: string | nil, expectedEndP50At: string | nil, expectedEndP90At: string | nil, jobId: string | nil, observedPaceUnitsPerMinute: number | nil, operationId: string, phase: string, phaseStartedAt: string, plannedEndAt: string | nil, projectedEndAt: string | nil, scenarioId: string | nil, since: string | nil, state: string }[], pace: { driftRatio: number | nil, since: string, state: string } | nil, state: string, workCenterId: string }Normal only
The live shadow of a work centre, computed now: what is running on it, the profile's expected finish, the observed pace, each operation's state (ON_TRACK, DRIFTING, STALLED, PAUSED, DOWN, DOWN_OVERDUE, UNCALIBRATED; IDLE with nothing running) and the catch-up confidence over the machine's own queue. A work centre may run several operations at once; the work centre'sstateis the most severe of them.paceis the pace track's current state (STEADY or SLOWING with the drift ratio and since when), or nil when the machine has no pace judgement. The same shape as theworkCenterTwinShadowGraphQL query; timestamps are ISO8601 strings. Needs the workCenterBehaviorProfile:read permission.ctx.twin.simulate(input: { applyPaceDrift: boolean | nil, baseScheduleScenarioId: string | nil, hypotheticalAllocations: { attributes: { [key: string]: string | number } | nil, dependsOn: string[] | nil, dueAt: string | nil, jobLabel: string | nil, label: string, quantity: number | nil, runMinutes: number | nil, setupMinutes: number | nil, startAt: string, workCenterId: string }[], samples: number | nil, seed: number | nil }) -> ok, result: { allocations: { attributeValues: { key: string, value: string }[], endP10At: string, endP50At: string, endP90At: string, evidenceDepth: number, label: string | nil, operationId: string | nil, plannedEndAt: string, plannedStartAt: string, probabilityLaterThanPlanned: number, truncatedAtHorizonProbability: number, workCenterId: string }[], jobs: { completionP50At: string, completionP90At: string, dueAt: string | nil, jobId: string | nil, jobLabel: string | nil, onTimeProbability: number | nil }[], summary: { expectedLateJobs: number, makespanP50At: string, makespanP90At: string, samples: number, truncatedAllocations: number, uncalibratedWorkCenterIds: string[] }, workCenters: { expectedUnplannedDowntimeMinutes: number, expectedUtilization: number, latenessContributionMinutes: number, riskRank: number, workCenterId: string }[] }Normal only
Replays hypothetical work against the work-centre twin and returns on-time probabilities per job, P10/P50/P90 finishes per allocation and a risk ranking per work centre. The same input and result as thesimulateWorkloadGraphQL field, withattributeswritten as a plain table; timestamps are ISO8601 strings. Needs the scenarioSimulationRun:execute permission.
Objects
Device
A device, reached through its connection. Returned by ctx.device.get.
device:http(request: { auth: { basic: { password: string, username: string } | nil, bearer: string | nil } | nil, body: string | nil, headers: { [key: string]: string } | nil, method: string | nil, path: string | nil, query: { [key: string]: any } | nil, timeoutMs: number | nil, url: string | nil }) -> ok, result: { body: string | nil, headers: { [key: string]: string }, status: number }
Sends an HTTP request through the device's connection;pathis relative to its base URL.device:id() -> ok, result: string
The device's id.device:jmf(message: string, path?: string) -> ok, result: { body: any, headers: { [key: string]: string }, status: number }
Posts a JMF message (built withctx.jmf.build) to the device;pathdefaults to/.device:sql(request: { bindings: any[] | nil, query: string }) -> ok, result: { columns: string[], executionTimeMs: number | nil, rows: any[][], rowsAffected: number | nil }
Runs a SQL query through the device's database connection; cells come back as plain values, SQL NULL as nil. Edge envelopes, including SQL results, are limited to 16 MiB (16,777,216 bytes, including protocol overhead); select needed columns and page large result sets.
MLModel
A machine-learning model trained in your account. Returned by ctx.ml.get.
model:forecast(horizon: number, level?: number) -> ok, result: { level: number | nil, lower: number[] | nil, point: number[], upper: number[] | nil }
Forecasts the nexthorizonperiods of a time-series model, with an optional confidence level for the interval.model:info() -> ok, result: { backend: string, concept: string, modelType: string, name: string, status: string }
The model's name, type, backend, concept and status.model:predict(features: { [key: string]: any } | string) -> ok, result: { confidence: number | nil, predictedClass: string | nil, prediction: number | nil, warnings: string[] | nil }
Predicts from one set of features.
Template
A stored template. Returned by ctx.template.get.
template:id() -> ok, result: string
The template's id.template:name() -> string
The name the template was looked up by.template:render(vars?: { [key: string]: any }) -> ok, result: string
Renders the template with these variables.
WorkCenterDevice
The device assigned to a work center. Returned by ctx.device.forWorkcenter.
It has the same methods as Device.
Published platform manual · revision 12955adf1f15