yaml-flow 6.0.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/board-live-cards-cli.js +4 -4
- package/browser/asset-integrity.json +3 -3
- package/browser/board-livecards-client.js +2 -0
- package/browser/board-livecards-client.js.map +1 -0
- package/browser/board-livecards-localstorage.js +10 -0
- package/browser/board-livecards-localstorage.js.map +1 -0
- package/browser/board-livegraph-engine.js +2 -2
- package/browser/board-livegraph-engine.js.map +1 -1
- package/browser/card-compute.js +28 -28
- package/browser/compute-jsonata.js +5 -0
- package/browser/compute-jsonata.js.map +1 -0
- package/browser/live-cards.js +261 -150
- package/card-store.js +4 -4
- package/dist/{board-live-cards-public-CltXYgaY.d.cts → board-live-cards-public-CW5074xr.d.cts} +9 -5
- package/dist/{board-live-cards-public-f-E-FAyp.d.ts → board-live-cards-public-hnZo0mAf.d.ts} +9 -5
- package/dist/board-livegraph-runtime/index.cjs +2 -2
- package/dist/board-livegraph-runtime/index.cjs.map +1 -1
- package/dist/board-livegraph-runtime/index.d.cts +11 -9
- package/dist/board-livegraph-runtime/index.d.ts +11 -9
- package/dist/board-livegraph-runtime/index.js +2 -2
- package/dist/board-livegraph-runtime/index.js.map +1 -1
- package/dist/board-livegraph-runtime/jsonata-sync.cjs +37 -1
- package/dist/card-compute/index.cjs +4 -4
- package/dist/card-compute/index.cjs.map +1 -1
- package/dist/card-compute/index.d.cts +5 -1
- package/dist/card-compute/index.d.ts +5 -1
- package/dist/card-compute/index.js +4 -4
- package/dist/card-compute/index.js.map +1 -1
- package/dist/card-compute/jsonata-sync.cjs +37 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +2 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +1 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +27 -14
- package/dist/cli/browser-api/board-live-cards-browser-adapter.d.ts +27 -14
- package/dist/cli/browser-api/board-live-cards-browser-adapter.js +2 -1
- package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +1 -1
- package/dist/cli/browser-api/card-store-browser-api.cjs +1 -1
- package/dist/cli/browser-api/card-store-browser-api.cjs.map +1 -1
- package/dist/cli/browser-api/card-store-browser-api.js +1 -1
- package/dist/cli/browser-api/card-store-browser-api.js.map +1 -1
- package/dist/cli/browser-api/jsonata-sync.cjs +37 -1
- package/dist/cli/node/artifacts-store-cli.cjs +8 -8
- package/dist/cli/node/artifacts-store-cli.cjs.map +1 -1
- package/dist/cli/node/artifacts-store-cli.js +8 -8
- package/dist/cli/node/artifacts-store-cli.js.map +1 -1
- package/dist/cli/node/board-live-cards-cli.cjs +7 -7
- package/dist/cli/node/board-live-cards-cli.cjs.map +1 -1
- package/dist/cli/node/board-live-cards-cli.js +7 -7
- package/dist/cli/node/board-live-cards-cli.js.map +1 -1
- package/dist/cli/node/card-store-cli.cjs +5 -5
- package/dist/cli/node/card-store-cli.cjs.map +1 -1
- package/dist/cli/node/card-store-cli.js +5 -5
- package/dist/cli/node/card-store-cli.js.map +1 -1
- package/dist/cli/node/execution-adapter.cjs +3 -0
- package/dist/cli/node/execution-adapter.cjs.map +1 -0
- package/dist/cli/node/execution-adapter.d.cts +174 -0
- package/dist/cli/node/execution-adapter.d.ts +174 -0
- package/dist/cli/node/execution-adapter.js +3 -0
- package/dist/cli/node/execution-adapter.js.map +1 -0
- package/dist/cli/node/fs-board-adapter.cjs +7 -7
- package/dist/cli/node/fs-board-adapter.cjs.map +1 -1
- package/dist/cli/node/fs-board-adapter.d.cts +2 -2
- package/dist/cli/node/fs-board-adapter.d.ts +2 -2
- package/dist/cli/node/fs-board-adapter.js +7 -7
- package/dist/cli/node/fs-board-adapter.js.map +1 -1
- package/dist/cli/node/jsonata-sync.cjs +37 -1
- package/dist/cli/node/source-cli-task-executor.cjs +4 -4
- package/dist/cli/node/source-cli-task-executor.cjs.map +1 -1
- package/dist/cli/node/source-cli-task-executor.js +4 -4
- package/dist/cli/node/source-cli-task-executor.js.map +1 -1
- package/dist/continuous-event-graph/index.cjs +2 -2
- package/dist/continuous-event-graph/index.cjs.map +1 -1
- package/dist/continuous-event-graph/index.js +2 -2
- package/dist/continuous-event-graph/index.js.map +1 -1
- package/dist/continuous-event-graph/jsonata-sync.cjs +37 -1
- package/dist/execution-refs.cjs +2 -1
- package/dist/execution-refs.cjs.map +1 -1
- package/dist/execution-refs.d.cts +49 -11
- package/dist/execution-refs.d.ts +49 -11
- package/dist/execution-refs.js +2 -1
- package/dist/execution-refs.js.map +1 -1
- package/dist/index.cjs +10 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/jsonata-sync.cjs +37 -1
- package/dist/server-runtime/index.cjs +9 -0
- package/dist/server-runtime/index.cjs.map +1 -0
- package/dist/server-runtime/index.d.cts +31 -0
- package/dist/server-runtime/index.d.ts +31 -0
- package/dist/server-runtime/index.js +9 -0
- package/dist/server-runtime/index.js.map +1 -0
- package/dist/server-runtime/jsonata-sync.cjs +7623 -0
- package/dist/step-machine-public/index.cjs +2 -0
- package/dist/step-machine-public/index.cjs.map +1 -0
- package/dist/step-machine-public/index.d.cts +159 -0
- package/dist/step-machine-public/index.d.ts +159 -0
- package/dist/step-machine-public/index.js +2 -0
- package/dist/step-machine-public/index.js.map +1 -0
- package/dist/step-machine-public/jsonata-sync.cjs +7623 -0
- package/dist/storage-refs.cjs +2 -2
- package/dist/storage-refs.cjs.map +1 -1
- package/dist/storage-refs.d.cts +7 -6
- package/dist/storage-refs.d.ts +7 -6
- package/dist/storage-refs.js +2 -2
- package/dist/storage-refs.js.map +1 -1
- package/dist/types-B1ZRa4aI.d.ts +147 -0
- package/dist/types-BxEFcVK9.d.cts +147 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-t4.js +9 -10
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +357 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-public.js +9 -10
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +300 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +617 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-sse-worker.js +48 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +11 -10
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +19 -4
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +4 -8
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +6 -10
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +8 -16
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +2 -6
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +4 -8
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +3 -7
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +4 -8
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +7 -16
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +2 -6
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +13 -3
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +2 -1
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +2 -1
- package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +2 -1
- package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +20 -24
- package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -3
- package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +8 -13
- package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +33 -9
- package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +3 -1
- package/examples/cli/step-machine-demo/step2-double-cli.js +6 -12
- package/examples/cli/step-machine-demo/two-step-math.flow.yaml +66 -4
- package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +13 -5
- package/examples/example-board/cards/_index.json +47 -0
- package/examples/example-board/cards/card-market-prices.json +33 -9
- package/examples/example-board/cards/card-my-identity.json +30 -6
- package/examples/example-board/cards/card-portfolio-action.json +24 -6
- package/examples/example-board/cards/card-portfolio-intelligence.json +97 -0
- package/examples/example-board/cards/card-portfolio-risks.json +24 -6
- package/examples/example-board/cards/card-portfolio-value.json +38 -10
- package/examples/example-board/cards/card-portfolio.json +57 -13
- package/examples/example-board/cards/card-rebalance-impact.json +22 -6
- package/examples/example-board/cards/card-rebalance-sim.json +66 -15
- package/examples/example-board/demo-server.js +360 -69
- package/examples/example-board/demo-shell-localstorage.html +774 -0
- package/examples/example-board/demo-shell-with-server.html +18 -36
- package/examples/example-board/demo-shell.html +5 -4
- package/examples/example-board/demo-task-executor.js +217 -265
- package/package.json +15 -13
- package/step-machine-cli.js +43 -310
- package/board-livecards-server-runtime.js +0 -1513
- package/browser/board-livecards-runtime-client.js +0 -263
- package/dist/pycli/quickjs-board-runtime.global.js +0 -9
- package/dist/pycli/quickjs-board-runtime.global.js.map +0 -1
- package/dist/pycli/quickjs-step-machine-runtime.global.js +0 -5
- package/dist/pycli/quickjs-step-machine-runtime.global.js.map +0 -1
- package/examples/cli/step-machine-demo/two-step-math-handlers.js +0 -32
- package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +0 -24
- package/examples/example-board/demo-shell-browser.html +0 -675
package/dist/{board-live-cards-public-CltXYgaY.d.cts → board-live-cards-public-CW5074xr.d.cts}
RENAMED
|
@@ -58,9 +58,10 @@ interface KindValueRef {
|
|
|
58
58
|
readonly kind: string;
|
|
59
59
|
readonly value: string;
|
|
60
60
|
}
|
|
61
|
-
/** Serialize a KindValueRef to the wire format:
|
|
61
|
+
/** Serialize a KindValueRef to the wire format: b64:<base64url(json)> */
|
|
62
62
|
declare function serializeRef(ref: KindValueRef): string;
|
|
63
|
-
/** Parse a wire-format ref string (
|
|
63
|
+
/** Parse a wire-format ref string (b64:<base64url(json)>) into a KindValueRef.
|
|
64
|
+
* Also accepts the legacy ::fs-path::<path> format for backward compatibility. */
|
|
64
65
|
declare function parseRef(s: string): KindValueRef;
|
|
65
66
|
interface KVStorage {
|
|
66
67
|
/** Returns the stored value, or null if the key does not exist. */
|
|
@@ -176,8 +177,8 @@ interface BoardPlatformAdapter {
|
|
|
176
177
|
/**
|
|
177
178
|
* Self-identity ExecutionRef — how to invoke THIS board instance.
|
|
178
179
|
* Embedded in source callback tokens so executors know where to report back.
|
|
179
|
-
|
|
180
|
-
|
|
180
|
+
* Node/FS: { howToRun: 'local-node', whatToRun: 'b64:<base64url({"kind":"fs-path","value":"/path/to/cli.js"})>' }
|
|
181
|
+
* Azure Fn: { howToRun: 'http:post', whatToRun: 'b64:<base64url({"kind":"http-url","value":"https://…/api/board"})>' }
|
|
181
182
|
*/
|
|
182
183
|
selfRef: ExecutionRef;
|
|
183
184
|
/**
|
|
@@ -237,6 +238,9 @@ interface BoardLiveCardsPublic {
|
|
|
237
238
|
getOutputsStoreRef(input: CommandInput): CommandResult<{
|
|
238
239
|
storeRef: string;
|
|
239
240
|
}>;
|
|
241
|
+
getConfig(input: CommandInput): CommandResult<{
|
|
242
|
+
value: unknown;
|
|
243
|
+
}>;
|
|
240
244
|
getOutputsDataObject(input: CommandInput): CommandResult;
|
|
241
245
|
getAllOutputsDataObjects(input: CommandInput): CommandResult<Record<string, unknown>>;
|
|
242
246
|
getOutputsComputedValues(input: CommandInput): CommandResult;
|
|
@@ -311,4 +315,4 @@ interface BoardLiveCardsNonCorePublic {
|
|
|
311
315
|
}
|
|
312
316
|
declare function createBoardLiveCardsNonCorePublic(baseRef: KindValueRef, adapter: BoardNonCorePlatformAdapter): BoardLiveCardsNonCorePublic;
|
|
313
317
|
|
|
314
|
-
export { type BoardPlatformAdapter as B, type CommandInput as C, type
|
|
318
|
+
export { type BoardPlatformAdapter as B, type CommandInput as C, type KVStorage as K, type BlobStorage as a, type BoardChangeNotification as b, type BoardLiveCardsPublic as c, type CommandResult as d, type KindValueRef as e, type BoardNonCorePlatformAdapter as f, type BoardLiveCardsNonCorePublic as g, createBoardLiveCardsNonCorePublic as h, createBoardLiveCardsPublic as i, parseRef as p, serializeRef as s };
|
package/dist/{board-live-cards-public-f-E-FAyp.d.ts → board-live-cards-public-hnZo0mAf.d.ts}
RENAMED
|
@@ -58,9 +58,10 @@ interface KindValueRef {
|
|
|
58
58
|
readonly kind: string;
|
|
59
59
|
readonly value: string;
|
|
60
60
|
}
|
|
61
|
-
/** Serialize a KindValueRef to the wire format:
|
|
61
|
+
/** Serialize a KindValueRef to the wire format: b64:<base64url(json)> */
|
|
62
62
|
declare function serializeRef(ref: KindValueRef): string;
|
|
63
|
-
/** Parse a wire-format ref string (
|
|
63
|
+
/** Parse a wire-format ref string (b64:<base64url(json)>) into a KindValueRef.
|
|
64
|
+
* Also accepts the legacy ::fs-path::<path> format for backward compatibility. */
|
|
64
65
|
declare function parseRef(s: string): KindValueRef;
|
|
65
66
|
interface KVStorage {
|
|
66
67
|
/** Returns the stored value, or null if the key does not exist. */
|
|
@@ -176,8 +177,8 @@ interface BoardPlatformAdapter {
|
|
|
176
177
|
/**
|
|
177
178
|
* Self-identity ExecutionRef — how to invoke THIS board instance.
|
|
178
179
|
* Embedded in source callback tokens so executors know where to report back.
|
|
179
|
-
|
|
180
|
-
|
|
180
|
+
* Node/FS: { howToRun: 'local-node', whatToRun: 'b64:<base64url({"kind":"fs-path","value":"/path/to/cli.js"})>' }
|
|
181
|
+
* Azure Fn: { howToRun: 'http:post', whatToRun: 'b64:<base64url({"kind":"http-url","value":"https://…/api/board"})>' }
|
|
181
182
|
*/
|
|
182
183
|
selfRef: ExecutionRef;
|
|
183
184
|
/**
|
|
@@ -237,6 +238,9 @@ interface BoardLiveCardsPublic {
|
|
|
237
238
|
getOutputsStoreRef(input: CommandInput): CommandResult<{
|
|
238
239
|
storeRef: string;
|
|
239
240
|
}>;
|
|
241
|
+
getConfig(input: CommandInput): CommandResult<{
|
|
242
|
+
value: unknown;
|
|
243
|
+
}>;
|
|
240
244
|
getOutputsDataObject(input: CommandInput): CommandResult;
|
|
241
245
|
getAllOutputsDataObjects(input: CommandInput): CommandResult<Record<string, unknown>>;
|
|
242
246
|
getOutputsComputedValues(input: CommandInput): CommandResult;
|
|
@@ -311,4 +315,4 @@ interface BoardLiveCardsNonCorePublic {
|
|
|
311
315
|
}
|
|
312
316
|
declare function createBoardLiveCardsNonCorePublic(baseRef: KindValueRef, adapter: BoardNonCorePlatformAdapter): BoardLiveCardsNonCorePublic;
|
|
313
317
|
|
|
314
|
-
export { type BoardPlatformAdapter as B, type CommandInput as C, type
|
|
318
|
+
export { type BoardPlatformAdapter as B, type CommandInput as C, type KVStorage as K, type BlobStorage as a, type BoardChangeNotification as b, type BoardLiveCardsPublic as c, type CommandResult as d, type KindValueRef as e, type BoardNonCorePlatformAdapter as f, type BoardLiveCardsNonCorePublic as g, createBoardLiveCardsNonCorePublic as h, createBoardLiveCardsPublic as i, parseRef as p, serializeRef as s };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';var j=require('jsonata'),module$1=require('module');require('ajv-formats'),require('child_process');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var j__default=/*#__PURE__*/_interopDefault(j);var be=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),ne=be("./jsonata-sync.cjs")??j__default.default;function te(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function se(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Re(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r={card_data:e.card_data,requires:e.requires??{},fetched_sources:e._sourcesData,computed_values:e.computed_values};for(let n of e.compute)try{let s=await j__default.default(n.expr).evaluate(r);se(e.computed_values,n.bindTo,s),r.computed_values=e.computed_values;}catch(s){console.error(`CardCompute.run error on "${e.id??"?"}.${n.bindTo}":`,s);}return e}function Se(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r={card_data:e.card_data,requires:e.requires??{},fetched_sources:e._sourcesData,computed_values:e.computed_values};for(let n of e.compute)try{let s=ne(n.expr).evaluate(r);se(e.computed_values,n.bindTo,s),r.computed_values=e.computed_values;}catch(s){console.error(`CardCompute.runSync error on "${e.id??"?"}.${n.bindTo}":`,s);}return {ok:true,node:e}}async function Te(e,t){let r={card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return j__default.default(e).evaluate(r)}function we(e,t){return t.startsWith("fetched_sources.")?te(e._sourcesData??{},t.slice(16)):te(e,t)}var re=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Ce=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function _e(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Ce.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,i)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${i}]: must be an object`);else {let d=o;typeof d.bindTo!="string"||!d.bindTo?t.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(d.bindTo)&&t.push(`source_defs[${i}]: bindTo "${d.bindTo}" is not unique across source_defs`),n.add(d.bindTo)),typeof d.outputFile!="string"||!d.outputFile?t.push(`source_defs[${i}]: missing required "outputFile" property`):(s.has(d.outputFile)&&t.push(`source_defs[${i}]: outputFile "${d.outputFile}" is not unique across source_defs`),s.add(d.outputFile)),d.optionalForCompletionGating!=null&&typeof d.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):re.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...re].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function xe(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[o]=await j__default.default(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Ae(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[o]=ne(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var D={run:Re,runSync:Se,eval:Te,resolve:we,validate:_e,enrichSources:xe,enrichSourcesSync:Ae};var G={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function O(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function N(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function H(e){return e.tasks??{}}function P(e){return e?e.status===G.FAILED||e.status===G.INACTIVATED:false}function oe(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function ae(e){return e.maxExecutions}function ie(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===G.COMPLETED){let o=e.tasks[n];o&&O(o).forEach(d=>r.add(d));}return Array.from(r)}function ce(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;O(s).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function de(e,t,r){let n=e.tasks[t]??q(),s={};if(r){let i=r.tasks[t],d=N(i);for(let m of d)for(let[T,y]of Object.entries(r.tasks))if(O(y).includes(m)){let R=e.tasks[T];R?.lastDataHash&&(s[m]=R.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function ue(e,t,r,n,s,o){let i=e.tasks[r]??q(),d=t.tasks[r];if(!d)throw new Error(`Task "${r}" not found in graph`);let m;n&&d.on&&d.on[n]?m=d.on[n]:m=O(d);let T=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let g=d.requires??[];for(let p of g)for(let[h,S]of Object.entries(t.tasks))if(O(S).includes(p)){let v=e.tasks[h];v?.lastDataHash&&(T[p]=v.lastDataHash);break}}let y={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:T,error:void 0},R=[...new Set([...e.availableOutputs,...m])];return {...e,tasks:{...e.tasks,[r]:y},availableOutputs:R,lastUpdated:new Date().toISOString()}}function pe(e,t,r,n){let s=e.tasks[r]??q(),o=t.tasks[r];if(o?.retry){let m=s.retryCount+1;if(m<=o.retry.max_attempts){let T={...s,status:"not-started",retryCount:m,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:T},lastUpdated:new Date().toISOString()}}}let i={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},d=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(d=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&i.executionCount>=o.circuit_breaker.max_executions){let m=o.circuit_breaker.on_break;d=[...new Set([...d,...m])];}return {...e,tasks:{...e.tasks,[r]:i},availableOutputs:d,lastUpdated:new Date().toISOString()}}function fe(e,t,r,n){let s=e.tasks[t]??q(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function le(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function q(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function B(e,t){let r=t??`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=me();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function ge(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:de(n,t.taskName,r)};case "task-completed":return {config:r,state:ue(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:pe(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:fe(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:le(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Ee(n,t.action)};case "task-upsert":return K(e,t.taskName,t.taskConfig);case "task-removal":return V(e,t.taskName);case "node-requires-add":return W(e,t.nodeName,t.tokens);case "node-requires-remove":return J(e,t.nodeName,t.tokens);case "node-provides-add":return X(e,t.nodeName,t.tokens);case "node-provides-remove":return Y(e,t.nodeName,t.tokens);default:return e}}function M(e,t){return t.reduce((r,n)=>ge(r,n),e)}function K(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:me()},lastUpdated:new Date().toISOString()}}}function V(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function W(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=N(n),o=r.filter(i=>!s.includes(i));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function J(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=N(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function X(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=O(n),o=r.filter(i=>!s.includes(i));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function Y(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=O(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function z(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function me(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ee(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function F(e){let{config:t,state:r}=e,n=H(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=Oe(n),i=ie(t,r.tasks),d=new Set([...i,...r.availableOutputs]),m=[],T=[],y=[],R=[];for(let[p,h]of Object.entries(n)){let S=r.tasks[p],v=oe(h,t.settings),E=v!=="once";if(S?.status===G.RUNNING||P(S))continue;let c=ae(h);if(c!==void 0&&S&&S.executionCount>=c||h.circuit_breaker&&S&&S.executionCount>=h.circuit_breaker.max_executions||!E&&S?.status===G.COMPLETED)continue;if(E&&S?.status===G.COMPLETED){let u=N(h),l=false;switch(v){case "data-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(O(x).includes(C)){let w=r.tasks[_];if(!w)continue;let ve=S.lastConsumedHashes?.[C];return w.lastDataHash==null?w.executionCount>S.lastEpoch:w.lastDataHash!==ve}return false})||(l=true);break}case "epoch-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(O(x).includes(C)){let w=r.tasks[_];if(w&&w.executionCount>S.lastEpoch)return true}return false})||(l=true);break}case "time-based":{let A=h.refreshInterval??0;if(A<=0){l=true;break}let C=S.completedAt;if(!C){l=true;break}(Date.now()-Date.parse(C))/1e3<A&&(l=true);break}case "manual":l=true;break}if(l)continue}let a=N(h);if(a.length===0){m.push(p);continue}let k=[],f=[],b=[];for(let u of a){if(d.has(u))continue;let l=o[u]||[];l.length===0?k.push(u):l.every(C=>P(r.tasks[C]))?b.push({token:u,failedProducer:l[0]}):f.push(u);}k.length>0?y.push({taskName:p,missingTokens:k}):b.length>0?R.push({taskName:p,failedTokens:b.map(u=>u.token),failedProducers:[...new Set(b.map(u=>u.failedProducer))]}):f.length>0?T.push({taskName:p,waitingOn:f}):m.push(p);}let g={};if(m.length>1){let p=ce(m,n);for(let[h,S]of Object.entries(p))S.length>1&&(g[h]=S);}return {eligible:m,pending:T,unresolved:y,blocked:R,conflicts:g}}function Oe(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of O(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var L=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function U(e){let t=Q(e);return Ge(t)}function Q(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Q).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Q(t[n])).join(",")+"}"}function Ge(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Ne(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Ie(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function ke(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Ne(t)}function Le(e){try{let t=JSON.parse(Ie(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function $(e,t,r){let{handlers:n,onDrain:s}=t,o=new L,i="state"in e&&"config"in e?e:B(e,r),d=false,m=new Set,T=new Map(Object.entries(n)),y=new L,R=false,g=false;function p(){if(!d){if(R){g=true;return}R=true;try{do g=!1,h();while(g)}finally{R=false;}}}function h(){let c=y.drain(),a=o.drain(),k=[...c,...a];k.length>0&&(i=M(i,k));let f=F(i);k.length>0&&s?.(k,i,f);for(let b of f.eligible)E(b);for(let b of k)if(b.type==="task-progress"){let{taskName:u,update:l}=b;if(!i.config.tasks[u])continue;let C=i.state.tasks[u];if(!C||C.status!=="running")continue;let _=ke(u),x=v(u,_,l).catch(w=>{d||(y.append({type:"task-failed",taskName:u,error:w.message??String(w),timestamp:new Date().toISOString()}),p());}).finally(()=>{m.delete(x);});m.add(x);}}function S(c){let k=i.config.tasks[c].requires??[],f=new Map;for(let[u,l]of Object.entries(i.config.tasks))for(let A of l.provides??[])f.set(A,u);let b={};for(let u of k){let l=f.get(u);l?b[u]=i.state.tasks[l]?.data:b[u]=void 0;}return b}async function v(c,a,k){let f=i.config.tasks[c],b=f.taskHandlers??[],u=S(c);for(let l of b){let A=T.get(l);if(!A)throw new Error(`Handler '${l}' not found in registry (task '${c}')`);let C={nodeId:c,state:u,taskState:i.state.tasks[c],config:f,callbackToken:a,update:k};if(await A(C)==="task-initiate-failure")throw new Error(`Handler '${l}' returned task-initiate-failure (task '${c}')`)}}function E(c){let k=i.config.tasks[c]?.taskHandlers;if(!k||k.length===0)return;y.append({type:"task-started",taskName:c,timestamp:new Date().toISOString()}),p();let f=ke(c),b=v(c,f).catch(u=>{d||(y.append({type:"task-failed",taskName:c,error:u.message??String(u),timestamp:new Date().toISOString()}),p());}).finally(()=>{m.delete(b);});m.add(b);}return {push(c){d||(c.type==="task-completed"&&c.data&&!c.dataHash&&(c={...c,dataHash:U(c.data)}),o.append(c),p());},pushAll(c){if(!d){for(let a of c)a.type==="task-completed"&&a.data&&!a.dataHash?o.append({...a,dataHash:U(a.data)}):o.append(a);p();}},resolveCallback(c,a,k){if(d)return;let f=Le(c);if(!f)return;let{taskName:b}=f;if(i.config.tasks[b]){if(k&&k.length>0)o.append({type:"task-failed",taskName:b,error:k.join("; "),timestamp:new Date().toISOString()});else {let u=a&&Object.keys(a).length>0?U(a):void 0;o.append({type:"task-completed",taskName:b,data:a,dataHash:u,timestamp:new Date().toISOString()});}p();}},addNode(c,a){d||(o.append({type:"task-upsert",taskName:c,taskConfig:a,timestamp:new Date().toISOString()}),p());},removeNode(c){d||(o.append({type:"task-removal",taskName:c,timestamp:new Date().toISOString()}),p());},addRequires(c,a){d||(o.append({type:"node-requires-add",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),p());},removeRequires(c,a){d||(o.append({type:"node-requires-remove",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),p());},addProvides(c,a){d||(o.append({type:"node-provides-add",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),p());},removeProvides(c,a){d||(o.append({type:"node-provides-remove",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),p());},registerHandler(c,a){T.set(c,a);},unregisterHandler(c){T.delete(c);},retrigger(c){d||i.config.tasks[c]&&(o.append({type:"task-restart",taskName:c,timestamp:new Date().toISOString()}),p());},retriggerAll(c){if(!d){for(let a of c)i.config.tasks[a]&&o.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()});p();}},snapshot(){return z(i)},getState(){return i},getSchedule(){return F(i)},async waitForHandlers(){m.size>0&&await Promise.allSettled([...m]);},async dispose(c){c?.wait&&m.size>0&&await Promise.allSettled([...m]),d=true;}}}function I(e){return JSON.parse(JSON.stringify(e))}function Z(e){let t=e.provides&&e.provides.length>0?e.provides.map(r=>r.bindTo):[e.id];return {requires:e.requires&&e.requires.length>0?[...e.requires]:void 0,provides:t,taskHandlers:[e.id],description:e.meta?.title??e.id}}function Me(e){let t=new Map;for(let[r,n]of e.entries()){let s=n.provides&&n.provides.length>0?n.provides:[{bindTo:r,ref:"card_data"}];for(let o of s)t.set(o.bindTo,r);}return t}function ee(e,t){let r=Me(e),n=e.get(t);if(n){for(let s of n.requires??[])if(!r.has(s))throw new Error(`Card "${t}" requires token "${s}" but no card provides it`)}}var ur={CARD_PREFIX:"yf:cards:",RUNTIME_OUT_PREFIX:"yf:runtime-out:cards:",STATUS_KEY:"yf:runtime-out:status",writeCard(e,t){try{localStorage.setItem(this.CARD_PREFIX+e,JSON.stringify(t));}catch(r){console.warn(`Failed to write card ${e} to localStorage:`,r);}},readCard(e){try{let t=localStorage.getItem(this.CARD_PREFIX+e);return t?JSON.parse(t):null}catch(t){return console.warn(`Failed to read card ${e} from localStorage:`,t),null}},readAllCards(e){let t={};for(let r of e){let n=this.readCard(r);n&&(t[r]=n);}return t},writeComputedArtifact(e){if(!(!e||!e.card_id))try{localStorage.setItem(this.RUNTIME_OUT_PREFIX+String(e.card_id),JSON.stringify(e));}catch(t){console.warn(`Failed to write computed artifact ${e.card_id}:`,t);}},readComputedArtifact(e){try{let t=localStorage.getItem(this.RUNTIME_OUT_PREFIX+e);return t?JSON.parse(t):null}catch(t){return console.warn(`Failed to read computed artifact ${e}:`,t),null}},readAllComputedArtifacts(e){let t={};for(let r of e){let n=this.readComputedArtifact(r);n&&(t[r]=n);}return t},writeStatusSnapshot(e){try{localStorage.setItem(this.STATUS_KEY,JSON.stringify(e));}catch(t){console.warn("Failed to write status snapshot to localStorage:",t);}},readStatusSnapshot(){try{let e=localStorage.getItem(this.STATUS_KEY);return e?JSON.parse(e):null}catch(e){return console.warn("Failed to read status snapshot from localStorage:",e),null}},clear(){let e=[];for(let t=0;t<localStorage.length;t++){let r=localStorage.key(t);r&&(r.startsWith(this.CARD_PREFIX)||r.startsWith(this.RUNTIME_OUT_PREFIX)||r===this.STATUS_KEY)&&e.push(r);}for(let t of e)localStorage.removeItem(t);}};function pr(e,t={}){let r=Array.isArray(e)?{}:{id:e.id,title:e.title,mode:e.mode,positions:e.positions,settings:e.settings},n=Array.isArray(e)?e:e.nodes,s=new Map;for(let a of n){if(s.has(a.id))throw new Error(`Duplicate card ID: "${a.id}"`);s.set(a.id,I(a));}let o=new Set,i=t.taskExecutor,d=t.sourceAdapters??{},m=t.defaultSourceAdapter,T=null,y=(a,k)=>{let f={events:a,graph:k,nodes:E()};for(let b of o)b(f);},R=a=>async k=>{let f=s.get(a);if(!f)return "task-initiate-failure";let b={};for(let _ of f.requires??[]){let x=k.state[_];if(!x||typeof x!="object")continue;let w=x.provides_data;!w||typeof w!="object"||Object.prototype.hasOwnProperty.call(w,_)&&(b[_]=w[_]);}let u={};if(f.source_defs&&f.source_defs.length>0){let _=d[a]??m,x=i?await i({card:f,input:k}):_?await _({card:f,input:k}):void 0;if(x&&typeof x=="object")for(let w of f.source_defs)Object.prototype.hasOwnProperty.call(x,w.bindTo)?u[w.bindTo]=x[w.bindTo]:f.source_defs.length===1&&(u[w.bindTo]=x);}let l={id:f.id,card_data:I(f.card_data??{}),requires:b,source_defs:f.source_defs,compute:f.compute};l._sourcesData=u,l.compute&&l.compute.length>0&&await D.run(l,{sourcesData:u});let A={};if(f.provides&&f.provides.length>0)for(let{bindTo:_,ref:x}of f.provides)A[_]=D.resolve(l,x);else A[f.id]={...l.card_data??{},...l.computed_values??{},...l._sourcesData??{}};let C={provides_data:A,card_data:l.card_data??{},computed_values:l.computed_values??{},fetched_sources:u,requires:b};return T?.resolveCallback(k.callbackToken,C),"task-initiated"},g={},p={};for(let[a,k]of s.entries())ee(s,a),g[a]=Z(k),p[a]=R(a);let h={id:r.id??`browser-board-${Date.now()}`,settings:{completion:"manual",execution_mode:"eligibility-mode",...r.settings??{},...t.graphSettings??{}},tasks:g},S=t.reactiveOptions?.onDrain,v=$(h,{...t.reactiveOptions??{},handlers:p,onDrain:(a,k,f)=>{S?.(a,k,f),y(a,k);}},t.executionId);T=v;function E(){let a=v.getState(),k=[];for(let[f,b]of s.entries()){let u=a.state.tasks[f]?.data,l=a.state.tasks[f],A={...b.card_data??{},...u&&typeof u.card_data=="object"?u.card_data:{}},C=l?.status==="running"?"loading":l?.status,_={...A,...C?{status:C}:{},...l?.lastUpdated?{lastRun:l.lastUpdated}:{},...l?.status==="failed"&&l.error?{error:l.error}:{}};k.push({id:f,card:I(b),card_data:_,fetched_sources:u&&typeof u.fetched_sources=="object"?I(u.fetched_sources):{},requires:u&&typeof u.requires=="object"?I(u.requires):{},computed_values:u&&typeof u.computed_values=="object"?I(u.computed_values):{},runtime_state:l?I(l):{}});}return k}return {getGraph:()=>v,getState:()=>v.getState(),getSchedule:()=>v.getSchedule(),getNodes:()=>E(),getBoard:()=>({...r,nodes:E()}),subscribe(a){return o.add(a),a({events:[],graph:v.getState(),nodes:E()}),()=>o.delete(a)},addCard(a){if(s.has(a.id))throw new Error(`Card "${a.id}" already exists`);s.set(a.id,I(a)),ee(s,a.id),v.registerHandler(a.id,R(a.id)),v.addNode(a.id,Z(a));},upsertCard(a){s.set(a.id,I(a)),ee(s,a.id),v.registerHandler(a.id,R(a.id)),v.addNode(a.id,Z(a));},removeCard(a){s.delete(a),v.unregisterHandler(a),v.removeNode(a);},patchCardState(a,k){let f=s.get(a);if(!f)throw new Error(`Card "${a}" not found`);f.card_data={...f.card_data??{},...k},v.retrigger(a);},retrigger(a){v.retrigger(a);},retriggerAll(){v.retriggerAll(Array.from(s.keys()));},push(a){v.push(a);},pushAll(a){v.pushAll(a);},dispose(){o.clear(),v.dispose();}}}function he(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function Fe(e){return e==="loading"?"in-progress":e==="error"?"failed":e==="stale"?"pending":e==="fresh"?"completed":"pending"}function Ue(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{},fetched_sources:r.fetched_sources&&typeof r.fetched_sources=="object"&&!Array.isArray(r.fetched_sources)?structuredClone(r.fetched_sources):{},requires:r.requires&&typeof r.requires=="object"&&!Array.isArray(r.requires)?structuredClone(r.requires):{}}}function fr(e){if(!e||typeof e!="object")throw new Error("payload must be an object");let t=Array.isArray(e.cardDefinitions)?e.cardDefinitions:[],r=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},n=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},s=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},o=Array.isArray(r.cards)?r.cards:[],i=new Map(o.map(d=>[d.name,d]));return t.map(d=>{let m=structuredClone(d),T=m.id;if(!T)throw new Error("cardDefinitions entry missing id");let y=i.get(T),R=Ue(T,n[T]),p={...m.card_data&&typeof m.card_data=="object"&&!Array.isArray(m.card_data)?m.card_data:{},...R.card_data||{},status:he(y?.status),lastRun:y?.runtime?.last_transition_at??null};y?.error?.message&&(p.error=y.error.message);let h=y?{task_status:y.status??null,card_status:he(y.status),runtime:structuredClone(y.runtime??{}),error:y.error?structuredClone(y.error):null,blocked_by:Array.isArray(y.blocked_by)?structuredClone(y.blocked_by):[],requires_missing:Array.isArray(y.requires_missing)?structuredClone(y.requires_missing):[]}:{task_status:null,card_status:p.status??"fresh",runtime:{last_transition_at:p.lastRun??null},error:p.error?{message:p.error}:null,blocked_by:[],requires_missing:[]},S=Array.isArray(m.requires)?m.requires:[],v={};for(let E of S)Object.prototype.hasOwnProperty.call(s,E)&&(v[E]=structuredClone(s[E]));return {id:T,card:m,card_data:p,fetched_sources:R.fetched_sources,requires:v,computed_values:R.computed_values,runtime_state:h}})}function lr({boardPath:e,cardDefinitions:t,runtimeModels:r,graphState:n}){let s=Array.isArray(t)?t:[],o=Array.isArray(r)?r:[],i=new Map(o.map(g=>[g.id,g])),m=n.state?.tasks??{},T={};for(let g of o)g?.id&&(T[g.id]={schema_version:"v1",card_id:g.id,card_data:structuredClone(g.card_data??{}),computed_values:structuredClone(g.computed_values??{}),fetched_sources:structuredClone(g.fetched_sources??{}),requires:structuredClone(g.requires??{})});let y={};for(let g of Object.keys(m)){let p=m[g]?.data?.provides_data;if(p&&typeof p=="object")for(let h of Object.keys(p))y[h]=structuredClone(p[h]);}let R=s.map(g=>{let p=i.get(g.id)??{},h=m[g.id],S=typeof h?.status=="string"?h.status:Fe(p.card_data?.status),v=typeof h?.error=="string"?h.error:typeof p.card_data?.error=="string"?p.card_data.error:null;return {name:g.id,status:S,...v?{error:{message:v,code:"TASK_FAILED",at:h?.failedAt??null,source:"browser-runtime"}}:{},requires:Array.isArray(g.requires)?g.requires:[],requires_satisfied:[],requires_missing:[],provides_declared:Array.isArray(g.provides)?g.provides.map(E=>E.bindTo):[g.id],provides_runtime:Object.keys(h?.data?.provides_data??{}).sort(),blocked_by:[],unblocks:[],runtime:{attempt_count:h?.executionCount??0,restart_count:h?.retryCount??0,in_progress_since:S==="in-progress"?h?.startedAt??null:null,last_transition_at:h?.lastUpdated??p.card_data?.lastRun??null,last_completed_at:h?.completedAt??null,last_restarted_at:h?.startedAt??null,status_age_ms:null}}});return {cardDefinitions:structuredClone(s),cardRuntimeById:T,dataObjectsByToken:y,statusSnapshot:{schema_version:"v1",meta:{board:{path:e??"browser-runtime"}},summary:{card_count:R.length,completed:R.filter(g=>g.status==="completed").length,eligible:0,pending:R.filter(g=>g.status==="pending").length,blocked:0,unresolved:0,failed:R.filter(g=>g.status==="failed").length,in_progress:R.filter(g=>g.status==="in-progress").length,orphan_cards:0,topology:{edge_count:0,max_fan_out_card:null,max_fan_out:0}},cards:R}}}
|
|
2
|
-
exports.LocalStorageService=
|
|
1
|
+
'use strict';var module$1=require('module');require('ajv-formats'),require('child_process');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var be=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));be("./jsonata-sync.cjs");var Te=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),j=Te("./jsonata-sync.cjs"),ne=j;function te(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function se(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Se(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await j(s.expr).evaluate(n);se(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch(o){console.error(`CardCompute.run error on "${e.id??"?"}.${s.bindTo}":`,o);}return e}function we(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let i=ne(o.expr).evaluate(n);se(e.computed_values,o.bindTo,i),n.computed_values=e.computed_values;}catch(i){let d=i instanceof Error?i.message:String(i);s.push({bindTo:o.bindTo,error:d}),console.error(`CardCompute.runSync error on "${e.id??"?"}.${o.bindTo}":`,i);}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Ce(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return j(e).evaluate(n)}function _e(e,t){return t.startsWith("fetched_sources.")?te(e._sourcesData??{},t.slice(16)):te(e,t)}var re=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),xe=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Ae(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))xe.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,i)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${i}]: must be an object`);else {let d=o;typeof d.bindTo!="string"||!d.bindTo?t.push(`source_defs[${i}]: missing required "bindTo" property`):(n.has(d.bindTo)&&t.push(`source_defs[${i}]: bindTo "${d.bindTo}" is not unique across source_defs`),n.add(d.bindTo)),typeof d.outputFile!="string"||!d.outputFile?t.push(`source_defs[${i}]: missing required "outputFile" property`):(s.has(d.outputFile)&&t.push(`source_defs[${i}]: outputFile "${d.outputFile}" is not unique across source_defs`),s.add(d.outputFile)),d.optionalForCompletionGating!=null&&typeof d.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):re.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...re].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Ee(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[o]=await j(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Oe(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,i]of Object.entries(n.projections))if(typeof i=="string"&&i.trim().length>0)try{s[o]=ne(i).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var D={run:Se,runSync:we,eval:Ce,resolve:_e,validate:Ae,enrichSources:Ee,enrichSourcesSync:Oe};var G={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function E(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function N(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function H(e){return e.tasks??{}}function P(e){return e?e.status===G.FAILED||e.status===G.INACTIVATED:false}function oe(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function ae(e){return e.maxExecutions}function ie(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===G.COMPLETED){let o=e.tasks[n];o&&E(o).forEach(d=>r.add(d));}return Array.from(r)}function ce(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;E(s).forEach(i=>{r[i]||(r[i]=[]),r[i].push(n);});}),r}function de(e,t,r){let n=e.tasks[t]??q(),s={};if(r){let i=r.tasks[t],d=N(i);for(let p of d)for(let[R,w]of Object.entries(r.tasks))if(E(w).includes(p)){let T=e.tasks[R];T?.lastDataHash&&(s[p]=T.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function ue(e,t,r,n,s,o){let i=e.tasks[r]??q(),d=t.tasks[r];if(!d)throw new Error(`Task "${r}" not found in graph`);let p;n&&d.on&&d.on[n]?p=d.on[n]:p=E(d);let R=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let f=d.requires??[];for(let m of f)for(let[v,b]of Object.entries(t.tasks))if(E(b).includes(m)){let k=e.tasks[v];k?.lastDataHash&&(R[m]=k.lastDataHash);break}}let w={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:R,error:void 0},T=[...new Set([...e.availableOutputs,...p])];return {...e,tasks:{...e.tasks,[r]:w},availableOutputs:T,lastUpdated:new Date().toISOString()}}function pe(e,t,r,n){let s=e.tasks[r]??q(),o=t.tasks[r];if(o?.retry){let p=s.retryCount+1;if(p<=o.retry.max_attempts){let R={...s,status:"not-started",retryCount:p,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:R},lastUpdated:new Date().toISOString()}}}let i={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},d=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(d=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&i.executionCount>=o.circuit_breaker.max_executions){let p=o.circuit_breaker.on_break;d=[...new Set([...d,...p])];}return {...e,tasks:{...e.tasks,[r]:i},availableOutputs:d,lastUpdated:new Date().toISOString()}}function fe(e,t,r,n){let s=e.tasks[t]??q(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function le(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function q(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function B(e,t){let r=t??`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=me();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function ge(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:de(n,t.taskName,r)};case "task-completed":return {config:r,state:ue(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:pe(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:fe(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:le(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Ge(n,t.action)};case "task-upsert":return K(e,t.taskName,t.taskConfig);case "task-removal":return V(e,t.taskName);case "node-requires-add":return W(e,t.nodeName,t.tokens);case "node-requires-remove":return J(e,t.nodeName,t.tokens);case "node-provides-add":return X(e,t.nodeName,t.tokens);case "node-provides-remove":return Y(e,t.nodeName,t.tokens);default:return e}}function M(e,t){return t.reduce((r,n)=>ge(r,n),e)}function K(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:me()},lastUpdated:new Date().toISOString()}}}function V(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function W(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=N(n),o=r.filter(i=>!s.includes(i));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function J(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=N(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function X(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=E(n),o=r.filter(i=>!s.includes(i));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function Y(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=E(n),o=s.filter(i=>!r.includes(i));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function z(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function me(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ge(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function F(e){let{config:t,state:r}=e,n=H(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=Ne(n),i=ie(t,r.tasks),d=new Set([...i,...r.availableOutputs]),p=[],R=[],w=[],T=[];for(let[m,v]of Object.entries(n)){let b=r.tasks[m],k=oe(v,t.settings),O=k!=="once";if(b?.status===G.RUNNING||P(b))continue;let c=ae(v);if(c!==void 0&&b&&b.executionCount>=c||v.circuit_breaker&&b&&b.executionCount>=v.circuit_breaker.max_executions||!O&&b?.status===G.COMPLETED)continue;if(O&&b?.status===G.COMPLETED){let u=N(v),g=false;switch(k){case "data-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(E(x).includes(C)){let S=r.tasks[_];if(!S)continue;let ve=b.lastConsumedHashes?.[C];return S.lastDataHash==null?S.executionCount>b.lastEpoch:S.lastDataHash!==ve}return false})||(g=true);break}case "epoch-changed":{u.length>0&&u.some(C=>{for(let[_,x]of Object.entries(n))if(E(x).includes(C)){let S=r.tasks[_];if(S&&S.executionCount>b.lastEpoch)return true}return false})||(g=true);break}case "time-based":{let A=v.refreshInterval??0;if(A<=0){g=true;break}let C=b.completedAt;if(!C){g=true;break}(Date.now()-Date.parse(C))/1e3<A&&(g=true);break}case "manual":g=true;break}if(g)continue}let a=N(v);if(a.length===0){p.push(m);continue}let h=[],l=[],y=[];for(let u of a){if(d.has(u))continue;let g=o[u]||[];g.length===0?h.push(u):g.every(C=>P(r.tasks[C]))?y.push({token:u,failedProducer:g[0]}):l.push(u);}h.length>0?w.push({taskName:m,missingTokens:h}):y.length>0?T.push({taskName:m,failedTokens:y.map(u=>u.token),failedProducers:[...new Set(y.map(u=>u.failedProducer))]}):l.length>0?R.push({taskName:m,waitingOn:l}):p.push(m);}let f={};if(p.length>1){let m=ce(p,n);for(let[v,b]of Object.entries(m))b.length>1&&(f[v]=b);}return {eligible:p,pending:R,unresolved:w,blocked:T,conflicts:f}}function Ne(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of E(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var I=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function U(e){let t=Q(e);return Le(t)}function Q(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Q).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Q(t[n])).join(",")+"}"}function Le(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function Ie(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function je(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function ke(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Ie(t)}function De(e){try{let t=JSON.parse(je(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function $(e,t,r){let{handlers:n,onDrain:s}=t,o=new I,i="state"in e&&"config"in e?e:B(e,r),d=false,p=new Set,R=new Map(Object.entries(n)),w=new I,T=false,f=false;function m(){if(!d){if(T){f=true;return}T=true;try{do f=!1,v();while(f)}finally{T=false;}}}function v(){let c=w.drain(),a=o.drain(),h=[...c,...a];h.length>0&&(i=M(i,h));let l=F(i);h.length>0&&s?.(h,i,l);for(let y of l.eligible)O(y);for(let y of h)if(y.type==="task-progress"){let{taskName:u,update:g}=y;if(!i.config.tasks[u])continue;let C=i.state.tasks[u];if(!C||C.status!=="running")continue;let _=ke(u),x=k(u,_,g).catch(S=>{d||(w.append({type:"task-failed",taskName:u,error:S.message??String(S),timestamp:new Date().toISOString()}),m());}).finally(()=>{p.delete(x);});p.add(x);}}function b(c){let h=i.config.tasks[c].requires??[],l=new Map;for(let[u,g]of Object.entries(i.config.tasks))for(let A of g.provides??[])l.set(A,u);let y={};for(let u of h){let g=l.get(u);g?y[u]=i.state.tasks[g]?.data:y[u]=void 0;}return y}async function k(c,a,h){let l=i.config.tasks[c],y=l.taskHandlers??[],u=b(c);for(let g of y){let A=R.get(g);if(!A)throw new Error(`Handler '${g}' not found in registry (task '${c}')`);let C={nodeId:c,state:u,taskState:i.state.tasks[c],config:l,callbackToken:a,update:h};if(await A(C)==="task-initiate-failure")throw new Error(`Handler '${g}' returned task-initiate-failure (task '${c}')`)}}function O(c){let h=i.config.tasks[c]?.taskHandlers;if(!h||h.length===0)return;w.append({type:"task-started",taskName:c,timestamp:new Date().toISOString()}),m();let l=ke(c),y=k(c,l).catch(u=>{d||(w.append({type:"task-failed",taskName:c,error:u.message??String(u),timestamp:new Date().toISOString()}),m());}).finally(()=>{p.delete(y);});p.add(y);}return {push(c){d||(c.type==="task-completed"&&c.data&&!c.dataHash&&(c={...c,dataHash:U(c.data)}),o.append(c),m());},pushAll(c){if(!d){for(let a of c)a.type==="task-completed"&&a.data&&!a.dataHash?o.append({...a,dataHash:U(a.data)}):o.append(a);m();}},resolveCallback(c,a,h){if(d)return;let l=De(c);if(!l)return;let{taskName:y}=l;if(i.config.tasks[y]){if(h&&h.length>0)o.append({type:"task-failed",taskName:y,error:h.join("; "),timestamp:new Date().toISOString()});else {let u=a&&Object.keys(a).length>0?U(a):void 0;o.append({type:"task-completed",taskName:y,data:a,dataHash:u,timestamp:new Date().toISOString()});}m();}},addNode(c,a){d||(o.append({type:"task-upsert",taskName:c,taskConfig:a,timestamp:new Date().toISOString()}),m());},removeNode(c){d||(o.append({type:"task-removal",taskName:c,timestamp:new Date().toISOString()}),m());},addRequires(c,a){d||(o.append({type:"node-requires-add",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),m());},removeRequires(c,a){d||(o.append({type:"node-requires-remove",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),m());},addProvides(c,a){d||(o.append({type:"node-provides-add",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),m());},removeProvides(c,a){d||(o.append({type:"node-provides-remove",nodeName:c,tokens:a,timestamp:new Date().toISOString()}),m());},registerHandler(c,a){R.set(c,a);},unregisterHandler(c){R.delete(c);},retrigger(c){d||i.config.tasks[c]&&(o.append({type:"task-restart",taskName:c,timestamp:new Date().toISOString()}),m());},retriggerAll(c){if(!d){for(let a of c)i.config.tasks[a]&&o.append({type:"task-restart",taskName:a,timestamp:new Date().toISOString()});m();}},snapshot(){return z(i)},getState(){return i},getSchedule(){return F(i)},async waitForHandlers(){p.size>0&&await Promise.allSettled([...p]);},async dispose(c){c?.wait&&p.size>0&&await Promise.allSettled([...p]),d=true;}}}function L(e){return JSON.parse(JSON.stringify(e))}function Z(e){let t=e.provides&&e.provides.length>0?e.provides.map(r=>r.bindTo):[e.id];return {requires:e.requires&&e.requires.length>0?[...e.requires]:void 0,provides:t,taskHandlers:[e.id],description:e.meta?.title??e.id}}function Ue(e){let t=new Map;for(let[r,n]of e.entries()){let s=n.provides&&n.provides.length>0?n.provides:[{bindTo:r,ref:"card_data"}];for(let o of s)t.set(o.bindTo,r);}return t}function ee(e,t){let r=Ue(e),n=e.get(t);if(n){for(let s of n.requires??[])if(!r.has(s))throw new Error(`Card "${t}" requires token "${s}" but no card provides it`)}}var fr={CARD_PREFIX:"yf:cards:",RUNTIME_OUT_PREFIX:"yf:runtime-out:cards:",STATUS_KEY:"yf:runtime-out:status",writeCard(e,t){try{localStorage.setItem(this.CARD_PREFIX+e,JSON.stringify(t));}catch(r){console.warn(`Failed to write card ${e} to localStorage:`,r);}},readCard(e){try{let t=localStorage.getItem(this.CARD_PREFIX+e);return t?JSON.parse(t):null}catch(t){return console.warn(`Failed to read card ${e} from localStorage:`,t),null}},readAllCards(e){let t={};for(let r of e){let n=this.readCard(r);n&&(t[r]=n);}return t},writeComputedArtifact(e){if(!(!e||!e.card_id))try{localStorage.setItem(this.RUNTIME_OUT_PREFIX+String(e.card_id),JSON.stringify(e));}catch(t){console.warn(`Failed to write computed artifact ${e.card_id}:`,t);}},readComputedArtifact(e){try{let t=localStorage.getItem(this.RUNTIME_OUT_PREFIX+e);return t?JSON.parse(t):null}catch(t){return console.warn(`Failed to read computed artifact ${e}:`,t),null}},readAllComputedArtifacts(e){let t={};for(let r of e){let n=this.readComputedArtifact(r);n&&(t[r]=n);}return t},writeStatusSnapshot(e){try{localStorage.setItem(this.STATUS_KEY,JSON.stringify(e));}catch(t){console.warn("Failed to write status snapshot to localStorage:",t);}},readStatusSnapshot(){try{let e=localStorage.getItem(this.STATUS_KEY);return e?JSON.parse(e):null}catch(e){return console.warn("Failed to read status snapshot from localStorage:",e),null}},clear(){let e=[];for(let t=0;t<localStorage.length;t++){let r=localStorage.key(t);r&&(r.startsWith(this.CARD_PREFIX)||r.startsWith(this.RUNTIME_OUT_PREFIX)||r===this.STATUS_KEY)&&e.push(r);}for(let t of e)localStorage.removeItem(t);}};function lr(e,t={}){let r=Array.isArray(e)?{}:{id:e.id,title:e.title,mode:e.mode,positions:e.positions,settings:e.settings},n=Array.isArray(e)?e:e.nodes,s=new Map;for(let a of n){if(s.has(a.id))throw new Error(`Duplicate card ID: "${a.id}"`);s.set(a.id,L(a));}let o=new Set,i=t.taskExecutor,d=t.sourceAdapters??{},p=t.defaultSourceAdapter,R=null,w=(a,h)=>{let l={events:a,graph:h,nodes:O()};for(let y of o)y(l);},T=a=>async h=>{let l=s.get(a);if(!l)return "task-initiate-failure";let y={};for(let _ of l.requires??[]){let x=h.state[_];if(!x||typeof x!="object")continue;let S=x.provides_data;!S||typeof S!="object"||Object.prototype.hasOwnProperty.call(S,_)&&(y[_]=S[_]);}let u={};if(l.source_defs&&l.source_defs.length>0){let _=d[a]??p,x=i?await i({card:l,input:h}):_?await _({card:l,input:h}):void 0;if(x&&typeof x=="object")for(let S of l.source_defs)Object.prototype.hasOwnProperty.call(x,S.bindTo)?u[S.bindTo]=x[S.bindTo]:l.source_defs.length===1&&(u[S.bindTo]=x);}let g={id:l.id,card_data:L(l.card_data??{}),requires:y,source_defs:l.source_defs,compute:l.compute};g._sourcesData=u,g.compute&&g.compute.length>0&&await D.run(g,{sourcesData:u});let A={};if(l.provides&&l.provides.length>0)for(let{bindTo:_,ref:x}of l.provides)A[_]=D.resolve(g,x);else A[l.id]={...g.card_data??{},...g.computed_values??{},...g._sourcesData??{}};let C={provides_data:A,card_data:g.card_data??{},computed_values:g.computed_values??{},fetched_sources:u,requires:y};return R?.resolveCallback(h.callbackToken,C),"task-initiated"},f={},m={};for(let[a,h]of s.entries())ee(s,a),f[a]=Z(h),m[a]=T(a);let v={id:r.id??`browser-board-${Date.now()}`,settings:{completion:"manual",execution_mode:"eligibility-mode",...r.settings??{},...t.graphSettings??{}},tasks:f},b=t.reactiveOptions?.onDrain,k=$(v,{...t.reactiveOptions??{},handlers:m,onDrain:(a,h,l)=>{b?.(a,h,l),w(a,h);}},t.executionId);R=k;function O(){let a=k.getState(),h=[];for(let[l,y]of s.entries()){let u=a.state.tasks[l]?.data,g=a.state.tasks[l],A={...y.card_data??{},...u&&typeof u.card_data=="object"?u.card_data:{}},C=g?.status==="running"?"loading":g?.status,_={...A,...C?{status:C}:{},...g?.lastUpdated?{lastRun:g.lastUpdated}:{},...g?.status==="failed"&&g.error?{error:g.error}:{}};h.push({id:l,card:L(y),card_data:_,requires:u&&typeof u.requires=="object"?L(u.requires):{},computed_values:u&&typeof u.computed_values=="object"?L(u.computed_values):{},runtime_state:g?L(g):{}});}return h}return {getGraph:()=>k,getState:()=>k.getState(),getSchedule:()=>k.getSchedule(),getNodes:()=>O(),getBoard:()=>({...r,nodes:O()}),subscribe(a){return o.add(a),a({events:[],graph:k.getState(),nodes:O()}),()=>o.delete(a)},addCard(a){if(s.has(a.id))throw new Error(`Card "${a.id}" already exists`);s.set(a.id,L(a)),ee(s,a.id),k.registerHandler(a.id,T(a.id)),k.addNode(a.id,Z(a));},upsertCard(a){s.set(a.id,L(a)),ee(s,a.id),k.registerHandler(a.id,T(a.id)),k.addNode(a.id,Z(a));},removeCard(a){s.delete(a),k.unregisterHandler(a),k.removeNode(a);},patchCardState(a,h){let l=s.get(a);if(!l)throw new Error(`Card "${a}" not found`);l.card_data={...l.card_data??{},...h},k.retrigger(a);},retrigger(a){k.retrigger(a);},retriggerAll(){k.retriggerAll(Array.from(s.keys()));},push(a){k.push(a);},pushAll(a){k.pushAll(a);},dispose(){o.clear(),k.dispose();}}}function he(e){return e==="running"||e==="in-progress"?"loading":e==="failed"?"error":"fresh"}function $e(e){return e==="loading"?"in-progress":e==="error"?"failed":e==="stale"?"pending":e==="fresh"?"completed":"pending"}function Be(e,t){let r=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return {schema_version:r.schema_version||"v1",card_id:typeof r.card_id=="string"?r.card_id:e,card_data:r.card_data&&typeof r.card_data=="object"&&!Array.isArray(r.card_data)?structuredClone(r.card_data):{},computed_values:r.computed_values&&typeof r.computed_values=="object"&&!Array.isArray(r.computed_values)?structuredClone(r.computed_values):{}}}function Ke(e,t){if(!e||typeof e!="object")throw new Error("payload must be an object");if(!t)throw new Error("cardId is required");let n=(Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).find(k=>k.id===t);if(!n)throw new Error(`cardDefinitions has no entry with id ${t}`);let s=e.statusSnapshot&&typeof e.statusSnapshot=="object"?e.statusSnapshot:{},o=e.cardRuntimeById&&typeof e.cardRuntimeById=="object"?e.cardRuntimeById:{},i=e.dataObjectsByToken&&typeof e.dataObjectsByToken=="object"?e.dataObjectsByToken:{},p=(Array.isArray(s.cards)?s.cards:[]).find(k=>k.name===t),R=structuredClone(n),w=Be(t,o[t]),f={...R.card_data&&typeof R.card_data=="object"&&!Array.isArray(R.card_data)?R.card_data:{},...w.card_data||{},status:he(p?.status),lastRun:p?.runtime?.last_transition_at??null};p?.error?.message&&(f.error=p.error.message);let m=p?{task_status:p.status??null,card_status:he(p.status),runtime:structuredClone(p.runtime??{}),error:p.error?structuredClone(p.error):null,blocked_by:Array.isArray(p.blocked_by)?structuredClone(p.blocked_by):[],requires_missing:Array.isArray(p.requires_missing)?structuredClone(p.requires_missing):[]}:{task_status:null,card_status:f.status??"fresh",runtime:{last_transition_at:f.lastRun??null},error:f.error?{message:f.error}:null,blocked_by:[],requires_missing:[]},v=Array.isArray(R.requires)?R.requires:[],b={};for(let[k,O]of Object.entries(i))b[k]=structuredClone(O);for(let k of v)Object.prototype.hasOwnProperty.call(b,k)||(b[k]=null);return {id:t,card:R,card_data:f,requires:b,computed_values:w.computed_values,runtime_state:m}}function gr(e){if(!e||typeof e!="object")throw new Error("payload must be an object");return (Array.isArray(e.cardDefinitions)?e.cardDefinitions:[]).map(r=>Ke(e,r.id))}function mr({boardPath:e,cardDefinitions:t,runtimeModels:r,graphState:n}){let s=Array.isArray(t)?t:[],o=Array.isArray(r)?r:[],i=new Map(o.map(f=>[f.id,f])),p=n.state?.tasks??{},R={};for(let f of o)f?.id&&(R[f.id]={schema_version:"v1",card_id:f.id,card_data:structuredClone(f.card_data??{}),computed_values:structuredClone(f.computed_values??{})});let w={};for(let f of Object.keys(p)){let m=p[f]?.data?.provides_data;if(m&&typeof m=="object")for(let v of Object.keys(m))w[v]=structuredClone(m[v]);}let T=s.map(f=>{let m=i.get(f.id)??{},v=p[f.id],b=typeof v?.status=="string"?v.status:$e(m.card_data?.status),k=typeof v?.error=="string"?v.error:typeof m.card_data?.error=="string"?m.card_data.error:null;return {name:f.id,status:b,...k?{error:{message:k,code:"TASK_FAILED",at:v?.failedAt??null,source:"browser-runtime"}}:{},requires:Array.isArray(f.requires)?f.requires:[],requires_satisfied:[],requires_missing:[],provides_declared:Array.isArray(f.provides)?f.provides.map(O=>O.bindTo):[f.id],provides_runtime:Object.keys(v?.data?.provides_data??{}).sort(),blocked_by:[],unblocks:[],runtime:{attempt_count:v?.executionCount??0,restart_count:v?.retryCount??0,in_progress_since:b==="in-progress"?v?.startedAt??null:null,last_transition_at:v?.lastUpdated??m.card_data?.lastRun??null,last_completed_at:v?.completedAt??null,last_restarted_at:v?.startedAt??null,status_age_ms:null}}});return {cardDefinitions:structuredClone(s),cardRuntimeById:R,dataObjectsByToken:w,statusSnapshot:{schema_version:"v1",meta:{board:{path:e??"browser-runtime"}},summary:{card_count:T.length,completed:T.filter(f=>f.status==="completed").length,eligible:0,pending:T.filter(f=>f.status==="pending").length,blocked:0,unresolved:0,failed:T.filter(f=>f.status==="failed").length,in_progress:T.filter(f=>f.status==="in-progress").length,orphan_cards:0,topology:{edge_count:0,max_fan_out_card:null,max_fan_out:0}},cards:T}}}
|
|
2
|
+
exports.LocalStorageService=fr;exports.buildBrowserArtifactsFromRuntime=mr;exports.createBoardLiveGraphRuntime=lr;exports.selectAllLiveCardModels=gr;exports.selectLiveCardModel=Ke;//# sourceMappingURL=index.cjs.map
|
|
3
3
|
//# sourceMappingURL=index.cjs.map
|