From e3ddfef1ddd3d67bed985038051323966cfebb16 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 13 Aug 2026 12:10:03 +0100 Subject: [PATCH 1/5] changeset --- .changeset/fuzzy-icons-design.md | 6 ++++ packages/lexicon/lightning.d.ts | 8 +++++ .../src/util/convert-lightning-plan.ts | 5 ++- .../test/util/convert-lightning-plan.test.ts | 35 +++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 .changeset/fuzzy-icons-design.md diff --git a/.changeset/fuzzy-icons-design.md b/.changeset/fuzzy-icons-design.md new file mode 100644 index 000000000..d1cdd0ba6 --- /dev/null +++ b/.changeset/fuzzy-icons-design.md @@ -0,0 +1,6 @@ +--- +'@openfn/ws-worker': patch +'@openfn/lexicon': patch +--- + +Support metadata on the run object diff --git a/packages/lexicon/lightning.d.ts b/packages/lexicon/lightning.d.ts index 8554c0fb6..46b4f03c5 100644 --- a/packages/lexicon/lightning.d.ts +++ b/packages/lexicon/lightning.d.ts @@ -44,6 +44,14 @@ export type LightningPlan = { options?: LightningPlanOptions; globals?: string; + + meta?: LightningPlanMeta; +}; + +export type LightningPlanMeta = { + work_order_id?: string; + workflow_id?: string; + project_id?: string; }; /** diff --git a/packages/ws-worker/src/util/convert-lightning-plan.ts b/packages/ws-worker/src/util/convert-lightning-plan.ts index 2b00a2473..9e12fb5a0 100644 --- a/packages/ws-worker/src/util/convert-lightning-plan.ts +++ b/packages/ws-worker/src/util/convert-lightning-plan.ts @@ -133,11 +133,14 @@ export default ( // But some need to get passed down into the engine's options const engineOpts: WorkerRunOptions = {}; - + console.log(JSON.stringify(run, null, 2)); engineOpts.globals = { meta: { runId: run.id, startTime: Date.now(), + workOrderId: run.meta?.work_order_id, + workflowId: run.meta?.workflow_id, + projectId: run.meta?.project_id, }, }; diff --git a/packages/ws-worker/test/util/convert-lightning-plan.test.ts b/packages/ws-worker/test/util/convert-lightning-plan.test.ts index 2989480ab..1fe0d0164 100644 --- a/packages/ws-worker/test/util/convert-lightning-plan.test.ts +++ b/packages/ws-worker/test/util/convert-lightning-plan.test.ts @@ -773,3 +773,38 @@ test('sets runId and startTime on the engine options globals meta', (t) => { t.true(options.globals!.meta.startTime >= before); t.true(options.globals!.meta.startTime <= after); }); + +test('maps run.meta workorder/workflow/project ids onto globals meta', (t) => { + const run: Partial = { + id: 'some-run-id', + jobs: [createNode()], + triggers: [], + edges: [], + meta: { + workorder_id: 'some-workorder-id', + workflow_id: 'some-workflow-id', + project_id: 'some-project-id', + }, + }; + + const { options } = convertPlan(run as LightningPlan); + + t.is(options.globals!.meta.workorderId, 'some-workorder-id'); + t.is(options.globals!.meta.workflowId, 'some-workflow-id'); + t.is(options.globals!.meta.projectId, 'some-project-id'); +}); + +test('leaves globals meta ids undefined when run.meta is missing', (t) => { + const run: Partial = { + id: 'some-run-id', + jobs: [createNode()], + triggers: [], + edges: [], + }; + + const { options } = convertPlan(run as LightningPlan); + + t.is(options.globals!.meta.workorderId, undefined); + t.is(options.globals!.meta.workflowId, undefined); + t.is(options.globals!.meta.projectId, undefined); +}); From 0d34d2590387638f473367d24d00b4f542f5dd0d Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 13 Aug 2026 12:10:18 +0100 Subject: [PATCH 2/5] version --- .changeset/fuzzy-icons-design.md | 6 ------ packages/cli/CHANGELOG.md | 7 +++++++ packages/cli/package.json | 2 +- packages/lexicon/CHANGELOG.md | 6 ++++++ packages/lexicon/package.json | 2 +- packages/ws-worker/CHANGELOG.md | 8 ++++++++ packages/ws-worker/package.json | 2 +- 7 files changed, 24 insertions(+), 9 deletions(-) delete mode 100644 .changeset/fuzzy-icons-design.md diff --git a/.changeset/fuzzy-icons-design.md b/.changeset/fuzzy-icons-design.md deleted file mode 100644 index d1cdd0ba6..000000000 --- a/.changeset/fuzzy-icons-design.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@openfn/ws-worker': patch -'@openfn/lexicon': patch ---- - -Support metadata on the run object diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index eba8b1986..f585b61f7 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,12 @@ # @openfn/cli +## 1.39.4 + +### Patch Changes + +- Updated dependencies [e3ddfef] + - @openfn/lexicon@2.4.1 + ## 1.39.3 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 4b9952642..d816436ed 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/cli", - "version": "1.39.3", + "version": "1.39.4", "description": "CLI devtools for the OpenFn toolchain", "engines": { "node": ">=18", diff --git a/packages/lexicon/CHANGELOG.md b/packages/lexicon/CHANGELOG.md index 491b610ce..22437b683 100644 --- a/packages/lexicon/CHANGELOG.md +++ b/packages/lexicon/CHANGELOG.md @@ -1,5 +1,11 @@ # lexicon +## 2.4.1 + +### Patch Changes + +- e3ddfef: Support metadata on the run object + ## 2.4.0 ### Minor Changes diff --git a/packages/lexicon/package.json b/packages/lexicon/package.json index 51a8e9fc6..04c1de44d 100644 --- a/packages/lexicon/package.json +++ b/packages/lexicon/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/lexicon", - "version": "2.4.0", + "version": "2.4.1", "description": "Central repo of names and type definitions", "author": "Open Function Group ", "license": "ISC", diff --git a/packages/ws-worker/CHANGELOG.md b/packages/ws-worker/CHANGELOG.md index 93d82c24d..6f8f92f2d 100644 --- a/packages/ws-worker/CHANGELOG.md +++ b/packages/ws-worker/CHANGELOG.md @@ -1,5 +1,13 @@ # ws-worker +## 1.29.1 + +### Patch Changes + +- e3ddfef: Support metadata on the run object +- Updated dependencies [e3ddfef] + - @openfn/lexicon@2.4.1 + ## 1.29.0 ### Minor Changes diff --git a/packages/ws-worker/package.json b/packages/ws-worker/package.json index e27e30243..2bd5a6534 100644 --- a/packages/ws-worker/package.json +++ b/packages/ws-worker/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/ws-worker", - "version": "1.29.0", + "version": "1.29.1", "description": "A Websocket Worker to connect Lightning to a Runtime Engine", "main": "dist/index.js", "type": "module", From 6608fe477ec379f48b4da80f1f2c16cb961ef59b Mon Sep 17 00:00:00 2001 From: "Elias W. BA" Date: Fri, 14 Aug 2026 12:52:56 +0000 Subject: [PATCH 3/5] Don't log the whole run plan when converting it A leftover debug statement dumped every run plan - job code, credential ids, dataclip id - to the worker's stdout on every claim. --- .../src/util/convert-lightning-plan.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/ws-worker/src/util/convert-lightning-plan.ts b/packages/ws-worker/src/util/convert-lightning-plan.ts index 9e12fb5a0..df595a94b 100644 --- a/packages/ws-worker/src/util/convert-lightning-plan.ts +++ b/packages/ws-worker/src/util/convert-lightning-plan.ts @@ -133,14 +133,23 @@ export default ( // But some need to get passed down into the engine's options const engineOpts: WorkerRunOptions = {}; - console.log(JSON.stringify(run, null, 2)); + + // Lightning only sends run.meta from 2.18.0. Older versions get a meta global + // with just the run id, rather than a set of undefined keys. project_id is on + // the plan itself, so it's available whatever version we're talking to. + const ids = { + workOrderId: run.meta?.work_order_id, + workflowId: run.meta?.workflow_id, + projectId: run.meta?.project_id ?? run.project_id, + }; + engineOpts.globals = { meta: { runId: run.id, startTime: Date.now(), - workOrderId: run.meta?.work_order_id, - workflowId: run.meta?.workflow_id, - projectId: run.meta?.project_id, + ...Object.fromEntries( + Object.entries(ids).filter(([_key, value]) => value !== undefined) + ), }, }; From ead8e3df7d65e1fa32fe289eb8ab019835b65157 Mon Sep 17 00:00:00 2001 From: "Elias W. BA" Date: Fri, 14 Aug 2026 12:52:56 +0000 Subject: [PATCH 4/5] Fix the meta id test, and read project_id from the plan The test asserted workorderId against a run.meta.workorder_id that nothing sets, so it failed and broke the type check. project_id is already on the plan, so meta.projectId can work against any Lightning version, and the ids are left off entirely when Lightning doesn't send them. --- .../test/util/convert-lightning-plan.test.ts | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/ws-worker/test/util/convert-lightning-plan.test.ts b/packages/ws-worker/test/util/convert-lightning-plan.test.ts index 1fe0d0164..d125be1cb 100644 --- a/packages/ws-worker/test/util/convert-lightning-plan.test.ts +++ b/packages/ws-worker/test/util/convert-lightning-plan.test.ts @@ -774,14 +774,14 @@ test('sets runId and startTime on the engine options globals meta', (t) => { t.true(options.globals!.meta.startTime <= after); }); -test('maps run.meta workorder/workflow/project ids onto globals meta', (t) => { +test('maps run.meta work order/workflow/project ids onto globals meta', (t) => { const run: Partial = { id: 'some-run-id', jobs: [createNode()], triggers: [], edges: [], meta: { - workorder_id: 'some-workorder-id', + work_order_id: 'some-work-order-id', workflow_id: 'some-workflow-id', project_id: 'some-project-id', }, @@ -789,14 +789,15 @@ test('maps run.meta workorder/workflow/project ids onto globals meta', (t) => { const { options } = convertPlan(run as LightningPlan); - t.is(options.globals!.meta.workorderId, 'some-workorder-id'); + t.is(options.globals!.meta.workOrderId, 'some-work-order-id'); t.is(options.globals!.meta.workflowId, 'some-workflow-id'); t.is(options.globals!.meta.projectId, 'some-project-id'); }); -test('leaves globals meta ids undefined when run.meta is missing', (t) => { +test('takes projectId from the plan when run.meta is missing', (t) => { const run: Partial = { id: 'some-run-id', + project_id: 'some-project-id', jobs: [createNode()], triggers: [], edges: [], @@ -804,7 +805,21 @@ test('leaves globals meta ids undefined when run.meta is missing', (t) => { const { options } = convertPlan(run as LightningPlan); - t.is(options.globals!.meta.workorderId, undefined); - t.is(options.globals!.meta.workflowId, undefined); - t.is(options.globals!.meta.projectId, undefined); + t.is(options.globals!.meta.projectId, 'some-project-id'); +}); + +test('omits globals meta ids when run.meta is missing', (t) => { + const run: Partial = { + id: 'some-run-id', + jobs: [createNode()], + triggers: [], + edges: [], + }; + + const { options } = convertPlan(run as LightningPlan); + + t.deepEqual(Object.keys(options.globals!.meta).sort(), [ + 'runId', + 'startTime', + ]); }); From 03f132c16372ce569087467eed8fd6581d424dc2 Mon Sep 17 00:00:00 2001 From: "Elias W. BA" Date: Fri, 14 Aug 2026 14:45:29 +0000 Subject: [PATCH 5/5] Retrigger CI