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.
Files changed (162) hide show
  1. package/board-live-cards-cli.js +4 -4
  2. package/browser/asset-integrity.json +3 -3
  3. package/browser/board-livecards-client.js +2 -0
  4. package/browser/board-livecards-client.js.map +1 -0
  5. package/browser/board-livecards-localstorage.js +10 -0
  6. package/browser/board-livecards-localstorage.js.map +1 -0
  7. package/browser/board-livegraph-engine.js +2 -2
  8. package/browser/board-livegraph-engine.js.map +1 -1
  9. package/browser/card-compute.js +28 -28
  10. package/browser/compute-jsonata.js +5 -0
  11. package/browser/compute-jsonata.js.map +1 -0
  12. package/browser/live-cards.js +261 -150
  13. package/card-store.js +4 -4
  14. package/dist/{board-live-cards-public-CltXYgaY.d.cts → board-live-cards-public-CW5074xr.d.cts} +9 -5
  15. package/dist/{board-live-cards-public-f-E-FAyp.d.ts → board-live-cards-public-hnZo0mAf.d.ts} +9 -5
  16. package/dist/board-livegraph-runtime/index.cjs +2 -2
  17. package/dist/board-livegraph-runtime/index.cjs.map +1 -1
  18. package/dist/board-livegraph-runtime/index.d.cts +11 -9
  19. package/dist/board-livegraph-runtime/index.d.ts +11 -9
  20. package/dist/board-livegraph-runtime/index.js +2 -2
  21. package/dist/board-livegraph-runtime/index.js.map +1 -1
  22. package/dist/board-livegraph-runtime/jsonata-sync.cjs +37 -1
  23. package/dist/card-compute/index.cjs +4 -4
  24. package/dist/card-compute/index.cjs.map +1 -1
  25. package/dist/card-compute/index.d.cts +5 -1
  26. package/dist/card-compute/index.d.ts +5 -1
  27. package/dist/card-compute/index.js +4 -4
  28. package/dist/card-compute/index.js.map +1 -1
  29. package/dist/card-compute/jsonata-sync.cjs +37 -1
  30. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +2 -1
  31. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +1 -1
  32. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +27 -14
  33. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.ts +27 -14
  34. package/dist/cli/browser-api/board-live-cards-browser-adapter.js +2 -1
  35. package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +1 -1
  36. package/dist/cli/browser-api/card-store-browser-api.cjs +1 -1
  37. package/dist/cli/browser-api/card-store-browser-api.cjs.map +1 -1
  38. package/dist/cli/browser-api/card-store-browser-api.js +1 -1
  39. package/dist/cli/browser-api/card-store-browser-api.js.map +1 -1
  40. package/dist/cli/browser-api/jsonata-sync.cjs +37 -1
  41. package/dist/cli/node/artifacts-store-cli.cjs +8 -8
  42. package/dist/cli/node/artifacts-store-cli.cjs.map +1 -1
  43. package/dist/cli/node/artifacts-store-cli.js +8 -8
  44. package/dist/cli/node/artifacts-store-cli.js.map +1 -1
  45. package/dist/cli/node/board-live-cards-cli.cjs +7 -7
  46. package/dist/cli/node/board-live-cards-cli.cjs.map +1 -1
  47. package/dist/cli/node/board-live-cards-cli.js +7 -7
  48. package/dist/cli/node/board-live-cards-cli.js.map +1 -1
  49. package/dist/cli/node/card-store-cli.cjs +5 -5
  50. package/dist/cli/node/card-store-cli.cjs.map +1 -1
  51. package/dist/cli/node/card-store-cli.js +5 -5
  52. package/dist/cli/node/card-store-cli.js.map +1 -1
  53. package/dist/cli/node/execution-adapter.cjs +3 -0
  54. package/dist/cli/node/execution-adapter.cjs.map +1 -0
  55. package/dist/cli/node/execution-adapter.d.cts +174 -0
  56. package/dist/cli/node/execution-adapter.d.ts +174 -0
  57. package/dist/cli/node/execution-adapter.js +3 -0
  58. package/dist/cli/node/execution-adapter.js.map +1 -0
  59. package/dist/cli/node/fs-board-adapter.cjs +7 -7
  60. package/dist/cli/node/fs-board-adapter.cjs.map +1 -1
  61. package/dist/cli/node/fs-board-adapter.d.cts +2 -2
  62. package/dist/cli/node/fs-board-adapter.d.ts +2 -2
  63. package/dist/cli/node/fs-board-adapter.js +7 -7
  64. package/dist/cli/node/fs-board-adapter.js.map +1 -1
  65. package/dist/cli/node/jsonata-sync.cjs +37 -1
  66. package/dist/cli/node/source-cli-task-executor.cjs +4 -4
  67. package/dist/cli/node/source-cli-task-executor.cjs.map +1 -1
  68. package/dist/cli/node/source-cli-task-executor.js +4 -4
  69. package/dist/cli/node/source-cli-task-executor.js.map +1 -1
  70. package/dist/continuous-event-graph/index.cjs +2 -2
  71. package/dist/continuous-event-graph/index.cjs.map +1 -1
  72. package/dist/continuous-event-graph/index.js +2 -2
  73. package/dist/continuous-event-graph/index.js.map +1 -1
  74. package/dist/continuous-event-graph/jsonata-sync.cjs +37 -1
  75. package/dist/execution-refs.cjs +2 -1
  76. package/dist/execution-refs.cjs.map +1 -1
  77. package/dist/execution-refs.d.cts +49 -11
  78. package/dist/execution-refs.d.ts +49 -11
  79. package/dist/execution-refs.js +2 -1
  80. package/dist/execution-refs.js.map +1 -1
  81. package/dist/index.cjs +10 -10
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.js +10 -10
  84. package/dist/index.js.map +1 -1
  85. package/dist/jsonata-sync.cjs +37 -1
  86. package/dist/server-runtime/index.cjs +9 -0
  87. package/dist/server-runtime/index.cjs.map +1 -0
  88. package/dist/server-runtime/index.d.cts +31 -0
  89. package/dist/server-runtime/index.d.ts +31 -0
  90. package/dist/server-runtime/index.js +9 -0
  91. package/dist/server-runtime/index.js.map +1 -0
  92. package/dist/server-runtime/jsonata-sync.cjs +7623 -0
  93. package/dist/step-machine-public/index.cjs +2 -0
  94. package/dist/step-machine-public/index.cjs.map +1 -0
  95. package/dist/step-machine-public/index.d.cts +159 -0
  96. package/dist/step-machine-public/index.d.ts +159 -0
  97. package/dist/step-machine-public/index.js +2 -0
  98. package/dist/step-machine-public/index.js.map +1 -0
  99. package/dist/step-machine-public/jsonata-sync.cjs +7623 -0
  100. package/dist/storage-refs.cjs +2 -2
  101. package/dist/storage-refs.cjs.map +1 -1
  102. package/dist/storage-refs.d.cts +7 -6
  103. package/dist/storage-refs.d.ts +7 -6
  104. package/dist/storage-refs.js +2 -2
  105. package/dist/storage-refs.js.map +1 -1
  106. package/dist/types-B1ZRa4aI.d.ts +147 -0
  107. package/dist/types-BxEFcVK9.d.cts +147 -0
  108. package/examples/browser/boards/portfolio-tracker/portfolio-t4.js +9 -10
  109. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +357 -0
  110. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-public.js +9 -10
  111. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +300 -0
  112. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +617 -0
  113. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-sse-worker.js +48 -0
  114. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +11 -10
  115. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +19 -4
  116. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +4 -8
  117. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +6 -10
  118. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +8 -16
  119. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +2 -6
  120. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +4 -8
  121. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +3 -7
  122. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +4 -8
  123. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +7 -16
  124. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +2 -6
  125. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +13 -3
  126. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +2 -1
  127. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +2 -1
  128. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +2 -1
  129. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +20 -24
  130. package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -3
  131. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +8 -13
  132. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +33 -9
  133. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +3 -1
  134. package/examples/cli/step-machine-demo/step2-double-cli.js +6 -12
  135. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +66 -4
  136. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +13 -5
  137. package/examples/example-board/cards/_index.json +47 -0
  138. package/examples/example-board/cards/card-market-prices.json +33 -9
  139. package/examples/example-board/cards/card-my-identity.json +30 -6
  140. package/examples/example-board/cards/card-portfolio-action.json +24 -6
  141. package/examples/example-board/cards/card-portfolio-intelligence.json +97 -0
  142. package/examples/example-board/cards/card-portfolio-risks.json +24 -6
  143. package/examples/example-board/cards/card-portfolio-value.json +38 -10
  144. package/examples/example-board/cards/card-portfolio.json +57 -13
  145. package/examples/example-board/cards/card-rebalance-impact.json +22 -6
  146. package/examples/example-board/cards/card-rebalance-sim.json +66 -15
  147. package/examples/example-board/demo-server.js +360 -69
  148. package/examples/example-board/demo-shell-localstorage.html +774 -0
  149. package/examples/example-board/demo-shell-with-server.html +18 -36
  150. package/examples/example-board/demo-shell.html +5 -4
  151. package/examples/example-board/demo-task-executor.js +217 -265
  152. package/package.json +15 -13
  153. package/step-machine-cli.js +43 -310
  154. package/board-livecards-server-runtime.js +0 -1513
  155. package/browser/board-livecards-runtime-client.js +0 -263
  156. package/dist/pycli/quickjs-board-runtime.global.js +0 -9
  157. package/dist/pycli/quickjs-board-runtime.global.js.map +0 -1
  158. package/dist/pycli/quickjs-step-machine-runtime.global.js +0 -5
  159. package/dist/pycli/quickjs-step-machine-runtime.global.js.map +0 -1
  160. package/examples/cli/step-machine-demo/two-step-math-handlers.js +0 -32
  161. package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +0 -24
  162. package/examples/example-board/demo-shell-browser.html +0 -675
@@ -32,7 +32,6 @@ interface LiveCardRuntimeModel {
32
32
  id: string;
33
33
  card: LiveCard;
34
34
  card_data: Record<string, unknown>;
35
- fetched_sources: Record<string, unknown>;
36
35
  requires: Record<string, unknown>;
37
36
  computed_values: Record<string, unknown>;
38
37
  runtime_state: Record<string, unknown>;
@@ -101,8 +100,6 @@ interface CardRuntimeArtifact {
101
100
  card_id?: string;
102
101
  card_data?: Record<string, unknown>;
103
102
  computed_values?: Record<string, unknown>;
104
- fetched_sources?: Record<string, unknown>;
105
- requires?: Record<string, unknown>;
106
103
  }
107
104
  interface BoardRuntimeArtifactsPayload {
108
105
  cardDefinitions: LiveCard[];
@@ -124,10 +121,15 @@ interface BoardRuntimeArtifactsPayload {
124
121
  };
125
122
  }
126
123
  /**
127
- * Converts a server bootstrap payload (cardDefinitions + cardRuntimeById + statusSnapshot)
128
- * into an array of LiveCardRuntimeModel ready for rendering.
124
+ * Selects a single per-card render model from a runtime state payload.
125
+ * Pure: same input same output. Used by reactive Board to recompute
126
+ * only the slice for one card.
129
127
  */
130
- declare function buildLiveCardModelsFromArtifacts(payload: BoardRuntimeArtifactsPayload): LiveCardRuntimeModel[];
128
+ declare function selectLiveCardModel(payload: BoardRuntimeArtifactsPayload, cardId: string): LiveCardRuntimeModel;
129
+ /**
130
+ * Build per-card render models for every card in the payload.
131
+ */
132
+ declare function selectAllLiveCardModels(payload: BoardRuntimeArtifactsPayload): LiveCardRuntimeModel[];
131
133
  interface BuildBrowserArtifactsOptions {
132
134
  boardPath?: string;
133
135
  cardDefinitions: LiveCard[];
@@ -136,9 +138,9 @@ interface BuildBrowserArtifactsOptions {
136
138
  }
137
139
  /**
138
140
  * Converts browser-runtime state (LiveCardRuntimeModel[] + LiveGraph) back into
139
- * the server-payload format expected by buildLiveCardModelsFromArtifacts.
140
- * Used by the browser-only shell to keep the same rendering path as the server shell.
141
+ * the runtime payload shape consumed by selectLiveCardModel / selectAllLiveCardModels.
142
+ * Used by the browser-only shell to keep the same selector path as the server shell.
141
143
  */
142
144
  declare function buildBrowserArtifactsFromRuntime({ boardPath, cardDefinitions, runtimeModels, graphState, }: BuildBrowserArtifactsOptions): BoardRuntimeArtifactsPayload;
143
145
 
144
- export { type BoardLiveGraphRuntime, type BoardLiveGraphRuntimeOptions, type BoardLiveGraphRuntimeUpdate, type BoardRuntimeArtifactsPayload, type BoardRuntimeView, type BoardTaskExecutor, type BoardTaskExecutorContext, type BrowserSourceAdapter, type BrowserSourceAdapterContext, type BuildBrowserArtifactsOptions, type CardRuntimeArtifact, type LiveCardRuntimeModel, LocalStorageService, buildBrowserArtifactsFromRuntime, buildLiveCardModelsFromArtifacts, createBoardLiveGraphRuntime };
146
+ export { type BoardLiveGraphRuntime, type BoardLiveGraphRuntimeOptions, type BoardLiveGraphRuntimeUpdate, type BoardRuntimeArtifactsPayload, type BoardRuntimeView, type BoardTaskExecutor, type BoardTaskExecutorContext, type BrowserSourceAdapter, type BrowserSourceAdapterContext, type BuildBrowserArtifactsOptions, type CardRuntimeArtifact, type LiveCardRuntimeModel, LocalStorageService, buildBrowserArtifactsFromRuntime, createBoardLiveGraphRuntime, selectAllLiveCardModels, selectLiveCardModel };
@@ -32,7 +32,6 @@ interface LiveCardRuntimeModel {
32
32
  id: string;
33
33
  card: LiveCard;
34
34
  card_data: Record<string, unknown>;
35
- fetched_sources: Record<string, unknown>;
36
35
  requires: Record<string, unknown>;
37
36
  computed_values: Record<string, unknown>;
38
37
  runtime_state: Record<string, unknown>;
@@ -101,8 +100,6 @@ interface CardRuntimeArtifact {
101
100
  card_id?: string;
102
101
  card_data?: Record<string, unknown>;
103
102
  computed_values?: Record<string, unknown>;
104
- fetched_sources?: Record<string, unknown>;
105
- requires?: Record<string, unknown>;
106
103
  }
107
104
  interface BoardRuntimeArtifactsPayload {
108
105
  cardDefinitions: LiveCard[];
@@ -124,10 +121,15 @@ interface BoardRuntimeArtifactsPayload {
124
121
  };
125
122
  }
126
123
  /**
127
- * Converts a server bootstrap payload (cardDefinitions + cardRuntimeById + statusSnapshot)
128
- * into an array of LiveCardRuntimeModel ready for rendering.
124
+ * Selects a single per-card render model from a runtime state payload.
125
+ * Pure: same input same output. Used by reactive Board to recompute
126
+ * only the slice for one card.
129
127
  */
130
- declare function buildLiveCardModelsFromArtifacts(payload: BoardRuntimeArtifactsPayload): LiveCardRuntimeModel[];
128
+ declare function selectLiveCardModel(payload: BoardRuntimeArtifactsPayload, cardId: string): LiveCardRuntimeModel;
129
+ /**
130
+ * Build per-card render models for every card in the payload.
131
+ */
132
+ declare function selectAllLiveCardModels(payload: BoardRuntimeArtifactsPayload): LiveCardRuntimeModel[];
131
133
  interface BuildBrowserArtifactsOptions {
132
134
  boardPath?: string;
133
135
  cardDefinitions: LiveCard[];
@@ -136,9 +138,9 @@ interface BuildBrowserArtifactsOptions {
136
138
  }
137
139
  /**
138
140
  * Converts browser-runtime state (LiveCardRuntimeModel[] + LiveGraph) back into
139
- * the server-payload format expected by buildLiveCardModelsFromArtifacts.
140
- * Used by the browser-only shell to keep the same rendering path as the server shell.
141
+ * the runtime payload shape consumed by selectLiveCardModel / selectAllLiveCardModels.
142
+ * Used by the browser-only shell to keep the same selector path as the server shell.
141
143
  */
142
144
  declare function buildBrowserArtifactsFromRuntime({ boardPath, cardDefinitions, runtimeModels, graphState, }: BuildBrowserArtifactsOptions): BoardRuntimeArtifactsPayload;
143
145
 
144
- export { type BoardLiveGraphRuntime, type BoardLiveGraphRuntimeOptions, type BoardLiveGraphRuntimeUpdate, type BoardRuntimeArtifactsPayload, type BoardRuntimeView, type BoardTaskExecutor, type BoardTaskExecutorContext, type BrowserSourceAdapter, type BrowserSourceAdapterContext, type BuildBrowserArtifactsOptions, type CardRuntimeArtifact, type LiveCardRuntimeModel, LocalStorageService, buildBrowserArtifactsFromRuntime, buildLiveCardModelsFromArtifacts, createBoardLiveGraphRuntime };
146
+ export { type BoardLiveGraphRuntime, type BoardLiveGraphRuntimeOptions, type BoardLiveGraphRuntimeUpdate, type BoardRuntimeArtifactsPayload, type BoardRuntimeView, type BoardTaskExecutor, type BoardTaskExecutorContext, type BrowserSourceAdapter, type BrowserSourceAdapterContext, type BuildBrowserArtifactsOptions, type CardRuntimeArtifact, type LiveCardRuntimeModel, LocalStorageService, buildBrowserArtifactsFromRuntime, createBoardLiveGraphRuntime, selectAllLiveCardModels, selectLiveCardModel };
@@ -1,3 +1,3 @@
1
- import j from'jsonata';import {createRequire}from'module';import'ajv-formats';import'child_process';var be=createRequire(import.meta.url),ne=be("./jsonata-sync.cjs")??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 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(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(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(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
- export{ur as LocalStorageService,lr as buildBrowserArtifactsFromRuntime,fr as buildLiveCardModelsFromArtifacts,pr as createBoardLiveGraphRuntime};//# sourceMappingURL=index.js.map
1
+ import {createRequire}from'module';import'ajv-formats';import'child_process';var be=createRequire(import.meta.url);be("./jsonata-sync.cjs");var Te=createRequire(import.meta.url),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
+ export{fr as LocalStorageService,mr as buildBrowserArtifactsFromRuntime,lr as createBoardLiveGraphRuntime,gr as selectAllLiveCardModels,Ke as selectLiveCardModel};//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map