yaml-flow 6.0.0 → 7.1.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 (166) 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 +264 -151
  13. package/card-store.js +4 -4
  14. package/dist/{board-live-cards-public-CltXYgaY.d.cts → board-live-cards-public-5n1-syA3.d.cts} +8 -5
  15. package/dist/{board-live-cards-public-f-E-FAyp.d.ts → board-live-cards-public-CK_J8uv0.d.ts} +8 -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 +55 -12
  78. package/dist/execution-refs.d.ts +55 -12
  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 +3 -0
  94. package/dist/step-machine-public/index.cjs.map +1 -0
  95. package/dist/step-machine-public/index.d.cts +166 -0
  96. package/dist/step-machine-public/index.d.ts +166 -0
  97. package/dist/step-machine-public/index.js +3 -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 +6 -6
  103. package/dist/storage-refs.d.ts +6 -6
  104. package/dist/storage-refs.js +2 -2
  105. package/dist/storage-refs.js.map +1 -1
  106. package/dist/types-CU3DjTKL.d.cts +147 -0
  107. package/dist/types-HGDTWIun.d.ts +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 +370 -0
  110. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.py +398 -0
  111. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-public.js +9 -10
  112. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +300 -0
  113. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +617 -0
  114. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-sse-worker.js +48 -0
  115. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +11 -10
  116. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +19 -4
  117. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +4 -8
  118. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +6 -10
  119. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +8 -16
  120. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +2 -6
  121. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +4 -8
  122. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +3 -7
  123. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +4 -8
  124. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +7 -16
  125. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +2 -6
  126. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +13 -3
  127. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +2 -1
  128. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +2 -1
  129. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +2 -1
  130. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +20 -24
  131. package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -3
  132. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +8 -13
  133. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +33 -9
  134. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +3 -1
  135. package/examples/cli/step-machine-demo/step2-double-cli.js +6 -12
  136. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +66 -4
  137. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +13 -5
  138. package/examples/example-board/agent-instructions.md +1 -1
  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-rebalance-impact.json +22 -6
  144. package/examples/example-board/cards/card-rebalance-sim.json +66 -15
  145. package/examples/example-board/cards/cardT-market-prices.json +80 -0
  146. package/examples/example-board/cards/{card-portfolio-value.json → cardT-portfolio-value.json} +38 -10
  147. package/examples/example-board/cards/cardT-portfolio.json +78 -0
  148. package/examples/example-board/demo-server-config.json +1 -1
  149. package/examples/example-board/demo-server.js +383 -69
  150. package/examples/example-board/demo-shell-localstorage.html +774 -0
  151. package/examples/example-board/demo-shell-with-server.html +18 -36
  152. package/examples/example-board/demo-shell.html +5 -4
  153. package/examples/example-board/demo-task-executor.js +213 -265
  154. package/package.json +15 -13
  155. package/step-machine-cli.js +43 -310
  156. package/board-livecards-server-runtime.js +0 -1513
  157. package/browser/board-livecards-runtime-client.js +0 -263
  158. package/dist/pycli/quickjs-board-runtime.global.js +0 -9
  159. package/dist/pycli/quickjs-board-runtime.global.js.map +0 -1
  160. package/dist/pycli/quickjs-step-machine-runtime.global.js +0 -5
  161. package/dist/pycli/quickjs-step-machine-runtime.global.js.map +0 -1
  162. package/examples/cli/step-machine-demo/two-step-math-handlers.js +0 -32
  163. package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +0 -24
  164. package/examples/example-board/cards/card-market-prices.json +0 -56
  165. package/examples/example-board/cards/card-portfolio.json +0 -44
  166. package/examples/example-board/demo-shell-browser.html +0 -675
@@ -1,4 +1,4 @@
1
- (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jsonata = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
1
+ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jsonataSync = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2
2
  /**
3
3
  * © Copyright IBM Corp. 2018 All Rights Reserved
4
4
  * Project name: JSONata
@@ -2839,6 +2839,10 @@ const functions = (() => {
2839
2839
  }
2840
2840
 
2841
2841
  var result = createSequence();
2842
+ // PATCH: $map must always return an array (never collapse to scalar),
2843
+ // even when the input has exactly 1 item. keepSingleton prevents the
2844
+ // length===1 → result[0] collapse in evaluate().
2845
+ result.keepSingleton = true;
2842
2846
  // do the map - iterate over the arrays, and invoke func
2843
2847
  for (var i = 0; i < arr.length; i++) {
2844
2848
  var func_args = hofFuncArgs(func, arr[i], i, arr);
@@ -2865,6 +2869,8 @@ const functions = (() => {
2865
2869
  }
2866
2870
 
2867
2871
  var result = createSequence();
2872
+ // PATCH: $filter must always return an array (never scalar)
2873
+ result.keepSingleton = true;
2868
2874
 
2869
2875
  for (var i = 0; i < arr.length; i++) {
2870
2876
  var entry = arr[i];
@@ -3022,6 +3028,8 @@ const functions = (() => {
3022
3028
  } else if (arg !== null && typeof arg === 'object' && !isFunction(arg)) {
3023
3029
  Object.keys(arg).forEach(key => result.push(key));
3024
3030
  }
3031
+ // PATCH: $keys must always return an array (never scalar)
3032
+ result.keepSingleton = true;
3025
3033
  return result;
3026
3034
  }
3027
3035
 
@@ -3096,6 +3104,8 @@ const functions = (() => {
3096
3104
  */
3097
3105
  function spread(arg) {
3098
3106
  var result = createSequence();
3107
+ // PATCH: $spread must always return an array (never scalar)
3108
+ result.keepSingleton = true;
3099
3109
 
3100
3110
  if (Array.isArray(arg)) {
3101
3111
  // spread all of the items in the array
@@ -3168,6 +3178,8 @@ const functions = (() => {
3168
3178
  */
3169
3179
  function each(obj, func) {
3170
3180
  var result = createSequence();
3181
+ // PATCH: $each must always return an array (never scalar)
3182
+ result.keepSingleton = true;
3171
3183
 
3172
3184
  for (var key in obj) {
3173
3185
  var func_args = hofFuncArgs(func, obj[key], key, obj);
@@ -3600,6 +3612,7 @@ var jsonata = (function() {
3600
3612
  var resultSequence;
3601
3613
  var isTupleStream = false;
3602
3614
  var tupleBindings = undefined;
3615
+ var traversedArray = false; // PATCH: track if any step iterated over an array
3603
3616
 
3604
3617
  // evaluate each step in turn
3605
3618
  for(var ii = 0; ii < expr.steps.length; ii++) {
@@ -3624,6 +3637,11 @@ var jsonata = (function() {
3624
3637
  break;
3625
3638
  }
3626
3639
 
3640
+ // PATCH: detect array traversal from the step result
3641
+ if (!isTupleStream && Array.isArray(resultSequence) && resultSequence._fromArrayField) {
3642
+ traversedArray = true;
3643
+ }
3644
+
3627
3645
  if(typeof step.focus === 'undefined') {
3628
3646
  inputSequence = resultSequence;
3629
3647
  }
@@ -3650,6 +3668,12 @@ var jsonata = (function() {
3650
3668
  resultSequence.keepSingleton = true;
3651
3669
  }
3652
3670
 
3671
+ // PATCH: Always preserve array results from path expressions that traversed
3672
+ // through an array. Ensures predictable array output regardless of input cardinality.
3673
+ if (traversedArray && Array.isArray(resultSequence) && resultSequence.sequence) {
3674
+ Object.defineProperty(resultSequence, 'keepSingleton', { value: true, enumerable: false, configurable: true });
3675
+ }
3676
+
3653
3677
  if (expr.hasOwnProperty('group')) {
3654
3678
  resultSequence = evaluateGroupExpression(expr.group, isTupleStream ? tupleBindings : resultSequence, environment)
3655
3679
  }
@@ -3698,8 +3722,10 @@ var jsonata = (function() {
3698
3722
  }
3699
3723
 
3700
3724
  var resultSequence = createSequence();
3725
+ var _flattenedArray = false; // PATCH: track if we flattened a real array
3701
3726
  if(lastStep && result.length === 1 && Array.isArray(result[0]) && !isSequence(result[0])) {
3702
3727
  resultSequence = result[0];
3728
+ _flattenedArray = true;
3703
3729
  } else {
3704
3730
  // flatten the sequence
3705
3731
  result.forEach(function(res) {
@@ -3709,10 +3735,20 @@ var jsonata = (function() {
3709
3735
  } else {
3710
3736
  // res is a sequence - flatten it into the parent sequence
3711
3737
  res.forEach(val => resultSequence.push(val));
3738
+ // PATCH: only mark as flattened array if res is a genuine data array,
3739
+ // not an intermediate sequence (from filter results, etc.)
3740
+ if (!isSequence(res)) {
3741
+ _flattenedArray = true;
3742
+ }
3712
3743
  }
3713
3744
  });
3714
3745
  }
3715
3746
 
3747
+ // PATCH: Mark sequences that came from flattening array fields
3748
+ if (_flattenedArray && Array.isArray(resultSequence)) {
3749
+ Object.defineProperty(resultSequence, '_fromArrayField', { value: true, enumerable: false, configurable: true });
3750
+ }
3751
+
3716
3752
  return resultSequence;
3717
3753
  }
3718
3754
 
@@ -0,0 +1,9 @@
1
+ 'use strict';var module$1=require('module');require('ajv-formats');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Bt="b64:";function Qe(t){let e=new TextEncoder().encode(t),n=globalThis.Buffer,r;if(n)r=n.from(e).toString("base64");else if(typeof btoa=="function"){let o="";for(let s of e)o+=String.fromCharCode(s);r=btoa(o);}else throw new Error("No base64 encoder available in this runtime");return r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Ze(t){let e=t.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-t.length%4)%4),n=globalThis.Buffer;if(n)return n.from(e,"base64").toString("utf8");if(typeof atob=="function"){let r=atob(e),o=new Uint8Array(r.length);for(let s=0;s<r.length;s+=1)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function ht(t){return `${Bt}${Qe(JSON.stringify(t))}`}function ae(t){if(!t.startsWith(Bt))throw new Error(`Invalid ref format (expected ${Bt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(Ze(t.slice(Bt.length)));}catch{throw new Error(`Invalid ref format (malformed base64url/json): ${t}`)}if(!e||typeof e!="object")throw new Error(`Invalid ref format (expected object payload): ${t}`);let n=e;if(typeof n.kind!="string"||typeof n.value!="string")throw new Error(`Invalid ref format (payload must contain string kind/value): ${t}`);return {kind:n.kind,value:n.value}}async function ie(t,e,n){let r=t.tryAcquire();if(!r)return false;try{await e();}finally{r();}return n?.(),true}var yt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ot(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function kt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ue(t){return t.tasks??{}}function Yt(t){return t?t.status===yt.FAILED||t.status===yt.INACTIVATED:false}function ce(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function de(t){return t.maxExecutions}function le(t,e){let n=new Set;for(let[r,o]of Object.entries(e))if(o.status===yt.COMPLETED){let s=t.tasks[r];s&&ot(s).forEach(u=>n.add(u));}return Array.from(n)}function fe(t,e){let n={};return t.forEach(r=>{let o=e[r];if(!o)return;ot(o).forEach(i=>{n[i]||(n[i]=[]),n[i].push(r);});}),n}function pe(t,e,n){let r=t.tasks[e]??Dt(),o={};if(n){let i=n.tasks[e],u=kt(i);for(let f of u)for(let[x,F]of Object.entries(n.tasks))if(ot(F).includes(f)){let R=t.tasks[x];R?.lastDataHash&&(o[f]=R.lastDataHash);break}}let s={...r,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:o};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function ge(t,e,n,r,o,s){let i=t.tasks[n]??Dt(),u=e.tasks[n];if(!u)throw new Error(`Task "${n}" not found in graph`);let f;r&&u.on&&u.on[r]?f=u.on[r]:f=ot(u);let x=i.startConsumedHashes?{...i.startConsumedHashes}:{...i.lastConsumedHashes};if(!i.startConsumedHashes){let j=u.requires??[];for(let w of j)for(let[g,y]of Object.entries(e.tasks))if(ot(y).includes(w)){let v=t.tasks[g];v?.lastDataHash&&(x[w]=v.lastDataHash);break}}let F={...i,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:i.executionCount+1,lastEpoch:i.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:x,error:void 0},R=[...new Set([...t.availableOutputs,...f])];return {...t,tasks:{...t.tasks,[n]:F},availableOutputs:R,lastUpdated:new Date().toISOString()}}function me(t,e,n,r){let o=t.tasks[n]??Dt(),s=e.tasks[n];if(s?.retry){let f=o.retryCount+1;if(f<=s.retry.max_attempts){let x={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:r};return {...t,tasks:{...t.tasks,[n]:x},lastUpdated:new Date().toISOString()}}}let i={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:r,executionCount:o.executionCount+1},u=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(u=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&i.executionCount>=s.circuit_breaker.max_executions){let f=s.circuit_breaker.on_break;u=[...new Set([...u,...f])];}return {...t,tasks:{...t.tasks,[n]:i},availableOutputs:u,lastUpdated:new Date().toISOString()}}function he(t,e,n,r){let o=t.tasks[e]??Dt(),s={...o,progress:typeof r=="number"?r:o.progress,messages:[...o.messages??[],...n?[{message:n,timestamp:new Date().toISOString(),status:o.status}]:[]],lastUpdated:new Date().toISOString()};return {...t,tasks:{...t.tasks,[e]:s},lastUpdated:new Date().toISOString()}}function ye(t,e){let n=t.tasks[e];if(!n)return t;let r={...n,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 {...t,tasks:{...t.tasks,[e]:r},lastUpdated:new Date().toISOString()}}function Dt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Lt(t,e){let n=`live-${Date.now()}`,r={};for(let s of Object.keys(t.tasks))r[s]=Se();let o={status:"running",tasks:r,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:n,executionConfig:{executionMode:t.settings.execution_mode??"eligibility-mode",conflictStrategy:t.settings.conflict_strategy??"alphabetical",completionStrategy:t.settings.completion}};return {config:t,state:o}}function tn(t,e){let{config:n,state:r}=t;if("executionId"in e&&e.executionId&&e.executionId!==r.executionId)return t;switch(e.type){case "task-started":return {config:n,state:pe(r,e.taskName,n)};case "task-completed":return {config:n,state:ge(r,n,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:n,state:me(r,n,e.taskName,e.error)};case "task-progress":return {config:n,state:he(r,e.taskName,e.message,e.progress)};case "task-restart":return {config:n,state:ye(r,e.taskName)};case "inject-tokens":return {config:n,state:{...r,availableOutputs:[...new Set([...r.availableOutputs,...e.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:n,state:un(r,e.action)};case "task-upsert":return en(t,e.taskName,e.taskConfig);case "task-removal":return nn(t,e.taskName);case "node-requires-add":return rn(t,e.nodeName,e.tokens);case "node-requires-remove":return on(t,e.nodeName,e.tokens);case "node-provides-add":return sn(t,e.nodeName,e.tokens);case "node-provides-remove":return an(t,e.nodeName,e.tokens);default:return t}}function ke(t,e){return e.reduce((n,r)=>tn(n,r),t)}function en(t,e,n){let r=!!t.config.tasks[e];return {config:{...t.config,tasks:{...t.config.tasks,[e]:n}},state:{...t.state,tasks:{...t.state.tasks,[e]:r?t.state.tasks[e]:Se()},lastUpdated:new Date().toISOString()}}}function nn(t,e){if(!t.config.tasks[e])return t;let{[e]:n,...r}=t.config.tasks,{[e]:o,...s}=t.state.tasks;return {config:{...t.config,tasks:r},state:{...t.state,tasks:s,lastUpdated:new Date().toISOString()}}}function rn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=kt(r),s=n.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:[...o,...s]}}},state:t.state}}function on(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=kt(r),s=o.filter(i=>!n.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:s}}},state:t.state}}function sn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ot(r),s=n.filter(i=>!o.includes(i));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:[...o,...s]}}},state:t.state}}function an(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ot(r),s=o.filter(i=>!n.includes(i));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:s}}},state:t.state}}function Tt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function Pt(t){if(!t||typeof t!="object")throw new Error("Invalid snapshot: expected an object");let e=t;if(!e.config||typeof e.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!e.state||typeof e.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let n=e.config,r=e.state;if(!n.settings||typeof n.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(r.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:n,state:r}}function Se(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function un(t,e){let n=new Date().toISOString();switch(e){case "stop":return {...t,status:"stopped",lastUpdated:n};case "pause":return {...t,status:"paused",lastUpdated:n};case "resume":return {...t,status:"running",lastUpdated:n};default:return t}}function It(t){let{config:e,state:n}=t,r=ue(e);if(Object.keys(r).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=cn(r),i=le(e,n.tasks),u=new Set([...i,...n.availableOutputs]),f=[],x=[],F=[],R=[];for(let[w,g]of Object.entries(r)){let y=n.tasks[w],v=ce(g,e.settings),E=v!=="once";if(y?.status===yt.RUNNING||Yt(y))continue;let m=de(g);if(m!==void 0&&y&&y.executionCount>=m||g.circuit_breaker&&y&&y.executionCount>=g.circuit_breaker.max_executions||!E&&y?.status===yt.COMPLETED)continue;if(E&&y?.status===yt.COMPLETED){let T=kt(g),$=false;switch(v){case "data-changed":{T.length>0&&T.some(U=>{for(let[K,Y]of Object.entries(r))if(ot(Y).includes(U)){let X=n.tasks[K];if(!X)continue;let St=y.lastConsumedHashes?.[U];return X.lastDataHash==null?X.executionCount>y.lastEpoch:X.lastDataHash!==St}return false})||($=true);break}case "epoch-changed":{T.length>0&&T.some(U=>{for(let[K,Y]of Object.entries(r))if(ot(Y).includes(U)){let X=n.tasks[K];if(X&&X.executionCount>y.lastEpoch)return true}return false})||($=true);break}case "time-based":{let M=g.refreshInterval??0;if(M<=0){$=true;break}let U=y.completedAt;if(!U){$=true;break}(Date.now()-Date.parse(U))/1e3<M&&($=true);break}case "manual":$=true;break}if($)continue}let A=kt(g);if(A.length===0){f.push(w);continue}let B=[],q=[],G=[];for(let T of A){if(u.has(T))continue;let $=s[T]||[];$.length===0?B.push(T):$.every(U=>Yt(n.tasks[U]))?G.push({token:T,failedProducer:$[0]}):q.push(T);}B.length>0?F.push({taskName:w,missingTokens:B}):G.length>0?R.push({taskName:w,failedTokens:G.map(T=>T.token),failedProducers:[...new Set(G.map(T=>T.failedProducer))]}):q.length>0?x.push({taskName:w,waitingOn:q}):f.push(w);}let j={};if(f.length>1){let w=fe(f,r);for(let[g,y]of Object.entries(w))y.length>1&&(j[g]=y);}return {eligible:f,pending:x,unresolved:F,blocked:R,conflicts:j}}function cn(t){let e={};for(let[n,r]of Object.entries(t)){for(let o of ot(r))e[o]||(e[o]=[]),e[o].push(n);if(r.on)for(let o of Object.values(r.on))for(let s of o)e[s]||(e[s]=[]),e[s].includes(n)||e[s].push(n);if(r.on_failure)for(let o of r.on_failure)e[o]||(e[o]=[]),e[o].includes(n)||e[o].push(n);}return e}var Ot=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function Xt(t){let e=Wt(t);return dn(e)}function Wt(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(Wt).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+Wt(e[r])).join(",")+"}"}function dn(t){let e=0xcbf29ce484222325n,n=0x100000001b3n,r=0xffffffffffffffffn;for(let o=0;o<t.length;o++)e^=BigInt(t.charCodeAt(o)),e=e*n&r;return e.toString(16).padStart(16,"0")}function ln(t){if(typeof Buffer<"u")return Buffer.from(t,"utf8").toString("base64url");if(typeof btoa=="function"){let e=new TextEncoder().encode(t),n="";for(let r of e)n+=String.fromCharCode(r);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function fn(t){if(typeof Buffer<"u")return Buffer.from(t,"base64url").toString("utf8");if(typeof atob=="function"){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=new Uint8Array(r.length);for(let s=0;s<r.length;s++)o[s]=r.charCodeAt(s);return new TextDecoder().decode(o)}throw new Error("No base64 decoder available in this runtime")}function Ce(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return ln(e)}function pn(t){try{let e=JSON.parse(fn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Re(t,e,n){let{handlers:r,onDrain:o}=e,s=new Ot,i="state"in t&&"config"in t?t:Lt(t),u=false,f=new Set,x=new Map(Object.entries(r)),F=new Ot,R=false,j=false;function w(){if(!u){if(R){j=true;return}R=true;try{do j=!1,g();while(j)}finally{R=false;}}}function g(){let m=F.drain(),A=s.drain(),B=[...m,...A];B.length>0&&(i=ke(i,B));let q=It(i);B.length>0&&o?.(B,i,q);for(let G of q.eligible)E(G);for(let G of B)if(G.type==="task-progress"){let{taskName:T,update:$}=G;if(!i.config.tasks[T])continue;let U=i.state.tasks[T];if(!U||U.status!=="running")continue;let K=Ce(T),Y=v(T,K,$).catch(X=>{u||(F.append({type:"task-failed",taskName:T,error:X.message??String(X),timestamp:new Date().toISOString()}),w());}).finally(()=>{f.delete(Y);});f.add(Y);}}function y(m){let B=i.config.tasks[m].requires??[],q=new Map;for(let[T,$]of Object.entries(i.config.tasks))for(let M of $.provides??[])q.set(M,T);let G={};for(let T of B){let $=q.get(T);$?G[T]=i.state.tasks[$]?.data:G[T]=void 0;}return G}async function v(m,A,B){let q=i.config.tasks[m],G=q.taskHandlers??[],T=y(m);for(let $ of G){let M=x.get($);if(!M)throw new Error(`Handler '${$}' not found in registry (task '${m}')`);let U={nodeId:m,state:T,taskState:i.state.tasks[m],config:q,callbackToken:A,update:B};if(await M(U)==="task-initiate-failure")throw new Error(`Handler '${$}' returned task-initiate-failure (task '${m}')`)}}function E(m){let B=i.config.tasks[m]?.taskHandlers;if(!B||B.length===0)return;F.append({type:"task-started",taskName:m,timestamp:new Date().toISOString()}),w();let q=Ce(m),G=v(m,q).catch(T=>{u||(F.append({type:"task-failed",taskName:m,error:T.message??String(T),timestamp:new Date().toISOString()}),w());}).finally(()=>{f.delete(G);});f.add(G);}return {push(m){u||(m.type==="task-completed"&&m.data&&!m.dataHash&&(m={...m,dataHash:Xt(m.data)}),s.append(m),w());},pushAll(m){if(!u){for(let A of m)A.type==="task-completed"&&A.data&&!A.dataHash?s.append({...A,dataHash:Xt(A.data)}):s.append(A);w();}},resolveCallback(m,A,B){if(u)return;let q=pn(m);if(!q)return;let{taskName:G}=q;if(i.config.tasks[G]){if(B&&B.length>0)s.append({type:"task-failed",taskName:G,error:B.join("; "),timestamp:new Date().toISOString()});else {let T=A&&Object.keys(A).length>0?Xt(A):void 0;s.append({type:"task-completed",taskName:G,data:A,dataHash:T,timestamp:new Date().toISOString()});}w();}},addNode(m,A){u||(s.append({type:"task-upsert",taskName:m,taskConfig:A,timestamp:new Date().toISOString()}),w());},removeNode(m){u||(s.append({type:"task-removal",taskName:m,timestamp:new Date().toISOString()}),w());},addRequires(m,A){u||(s.append({type:"node-requires-add",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),w());},removeRequires(m,A){u||(s.append({type:"node-requires-remove",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),w());},addProvides(m,A){u||(s.append({type:"node-provides-add",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),w());},removeProvides(m,A){u||(s.append({type:"node-provides-remove",nodeName:m,tokens:A,timestamp:new Date().toISOString()}),w());},registerHandler(m,A){x.set(m,A);},unregisterHandler(m){x.delete(m);},retrigger(m){u||i.config.tasks[m]&&(s.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()}),w());},retriggerAll(m){if(!u){for(let A of m)i.config.tasks[A]&&s.append({type:"task-restart",taskName:A,timestamp:new Date().toISOString()});w();}},snapshot(){return Tt(i)},getState(){return i},getSchedule(){return It(i)},async waitForHandlers(){f.size>0&&await Promise.allSettled([...f]);},async dispose(m){m?.wait&&f.size>0&&await Promise.allSettled([...f]),u=true;}}}function Qt(t){return JSON.stringify(t)}function Zt(t){let e;try{e=JSON.parse(t);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${t}`)}if(typeof e!="object"||e===null||typeof e.howToRun!="string"||typeof e.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${t}`);return e}var mn=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)));mn("./jsonata-sync.cjs");var yn=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))),qt=yn("./jsonata-sync.cjs"),ve=qt;function be(t,e){if(!e||!t)return;let n=e.split("."),r=t;for(let o=0;o<n.length;o++){if(r==null)return;r=r[n[o]];}return r}function xe(t,e,n){let r=e.split("."),o=t;for(let s=0;s<r.length-1;s++)(o[r[s]]==null||typeof o[r[s]]!="object")&&(o[r[s]]={}),o=o[r[s]];o[r[r.length-1]]=n;}async function kn(t,e){if(!t?.compute?.length)return t;t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values};for(let o of t.compute)try{let s=await qt(o.expr).evaluate(r);xe(t.computed_values,o.bindTo,s),r.computed_values=t.computed_values;}catch(s){console.error(`CardCompute.run error on "${t.id??"?"}.${o.bindTo}":`,s);}return t}function Sn(t,e){if(!t?.compute?.length)return {ok:true,node:t};t.card_data||(t.card_data={}),t.computed_values={},t._sourcesData=e?.sourcesData??{};let n=t.requires??{},r={card_data:t.card_data,requires:n,expects_data:n,fetched_sources:t._sourcesData,data:t.computed_values,computed_values:t.computed_values},o=[];for(let s of t.compute)try{let i=ve(s.expr).evaluate(r);xe(t.computed_values,s.bindTo,i),r.computed_values=t.computed_values;}catch(i){let u=i instanceof Error?i.message:String(i);o.push({bindTo:s.bindTo,error:u}),console.error(`CardCompute.runSync error on "${t.id??"?"}.${s.bindTo}":`,i);}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function Cn(t,e,n){let r={...n??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return qt(t).evaluate(r)}function Rn(t,e){return e.startsWith("fetched_sources.")?be(t._sourcesData??{},e.slice(16)):be(t,e)}var we=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),bn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function wn(t){let e=[];if(!t||typeof t!="object"||Array.isArray(t))return {ok:false,errors:["Node must be a non-null object"]};let n=t;(typeof n.id!="string"||!n.id)&&e.push("id: required, must be a non-empty string");for(let r of Object.keys(n))bn.has(r)||e.push(`Unknown top-level key: "${r}"`);if((n.card_data==null||typeof n.card_data!="object"||Array.isArray(n.card_data))&&e.push("card_data: required, must be an object"),n.meta!=null)if(typeof n.meta!="object"||Array.isArray(n.meta))e.push("meta: must be an object");else {let r=n.meta;r.title!=null&&typeof r.title!="string"&&e.push("meta.title: must be a string"),r.tags!=null&&!Array.isArray(r.tags)&&e.push("meta.tags: must be an array");}if(n.requires!=null&&!Array.isArray(n.requires)&&e.push("requires: must be an array of strings"),n.provides!=null&&(Array.isArray(n.provides)?n.provides.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`provides[${o}]: must be an object with bindTo and ref`);else {let s=r;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`provides[${o}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&e.push(`provides[${o}]: missing required "ref" string`);}}):e.push("provides: must be an array of { bindTo, ref } bindings")),n.compute!=null&&(Array.isArray(n.compute)?n.compute.forEach((r,o)=>{if(!r||typeof r!="object"||Array.isArray(r))e.push(`compute[${o}]: must be a compute step object`);else {let s=r;(typeof s.bindTo!="string"||!s.bindTo)&&e.push(`compute[${o}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&e.push(`compute[${o}]: missing required "expr" string (JSONata expression)`);}}):e.push("compute: must be an array of compute steps")),n.source_defs!=null)if(!Array.isArray(n.source_defs))e.push("source_defs: must be an array");else {let r=new Set,o=new Set;n.source_defs.forEach((s,i)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${i}]: must be an object`);else {let u=s;typeof u.bindTo!="string"||!u.bindTo?e.push(`source_defs[${i}]: missing required "bindTo" property`):(r.has(u.bindTo)&&e.push(`source_defs[${i}]: bindTo "${u.bindTo}" is not unique across source_defs`),r.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?e.push(`source_defs[${i}]: missing required "outputFile" property`):(o.has(u.outputFile)&&e.push(`source_defs[${i}]: outputFile "${u.outputFile}" is not unique across source_defs`),o.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);}});}if(n.view!=null)if(typeof n.view!="object"||Array.isArray(n.view))e.push("view: must be an object");else {let r=n.view;!Array.isArray(r.elements)||r.elements.length===0?e.push("view.elements: required, must be a non-empty array"):r.elements.forEach((o,s)=>{if(!o||typeof o!="object"){e.push(`view.elements[${s}]: must be an object`);return}!o.kind||typeof o.kind!="string"?e.push(`view.elements[${s}].kind: required, must be a string`):we.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...we].join(", ")}`),o.data!=null&&(typeof o.data!="object"||Array.isArray(o.data))&&e.push(`view.elements[${s}].data: must be an object`);}),r.layout!=null&&(typeof r.layout!="object"||Array.isArray(r.layout))&&e.push("view.layout: must be an object"),r.features!=null&&(typeof r.features!="object"||Array.isArray(r.features))&&e.push("view.features: must be an object");}return {ok:e.length===0,errors:e}}async function vn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return Promise.all(t.map(async r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,i]of Object.entries(r.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=await qt(i).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function xn(t,e){if(!t||t.length===0)return [];let n={card_data:e.card_data??{},requires:e.requires??{}};return t.map(r=>{let o={};if(r.projections&&typeof r.projections=="object"&&!Array.isArray(r.projections)){for(let[s,i]of Object.entries(r.projections))if(typeof i=="string"&&i.trim().length>0)try{o[s]=ve(i).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}})}var Gt={run:kn,runSync:Sn,eval:Cn,resolve:Rn,validate:wn,enrichSources:vn,enrichSourcesSync:xn};function Vt(t,e){function n(){return t.readIndex()??{}}function r(o,s,i){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return i&&typeof i=="object"&&!Array.isArray(i)?i:{value:i};let f={...o},x=f;for(let F=0;F<u.length-1;F++){let R=u[F],j=x[R],w=j&&typeof j=="object"&&!Array.isArray(j)?{...j}:{};x[R]=w,x=w;}return x[u[u.length-1]]=i,f}return {readCard(o){let s=n()[o];return !s||!t.cardExists(s.key)?null:t.readCard(s.key)},readCardKey(o){return n()[o]?.key??null},readAllCards(){let o=[];for(let[s,i]of Object.entries(n())){if(!t.cardExists(i.key))continue;let u=t.readCard(i.key);u?o.push(u):e?.(`[card-store] could not read card "${s}" at key "${i.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,i]of Object.entries(n()))o[s]=i.checksum;return o},changedSince(o){let s=n(),i=[];for(let[u,f]of Object.entries(s))o[u]!==f.checksum&&i.push(u);for(let u of Object.keys(o))s[u]||i.push(u);return i},validateUpsert(o,s){let i=n(),u=i[o],f=Object.entries(i).find(([,x])=>x.key===s);return u&&u.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:f&&f[0]!==o?{ok:false,error:`Key "${s}" is already mapped to card id "${f[0]}", cannot remap to "${o}"`}:{ok:true}},writeCard(o,s,i){let u=n(),f=i??u[o]?.key??t.defaultCardKey(o),x=t.writeCard(f,s);u[o]={key:f,checksum:x,updatedAt:new Date().toISOString()},t.writeIndex(u);},patchCard(o,s,i){let u=n(),f=u[o];if(!f||!t.cardExists(f.key))throw new Error(`card "${o}" not found`);let x=t.readCard(f.key);if(!x||typeof x!="object"||Array.isArray(x))throw new Error(`card "${o}" is not patchable`);let F=r(x,s,i),R=t.writeCard(f.key,F);u[o]={key:f.key,checksum:R,updatedAt:new Date().toISOString()},t.writeIndex(u);},removeCard(o){let s=n();s[o]&&(delete s[o],t.writeIndex(s));},readIndex(){return n()}}}function te(t,e){return {readSourceData(n,r){let o=t.read(`${n}/${r}`);if(o==null)return null;let s=o.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(n,r,o,s){let i=e(o);t.write(`${n}/.staged/${s}/${r}`,i);},commitSourceData(n,r,o){let s=`${n}/.staged/${o}/${r}`,i=t.read(s);return i==null?false:(t.write(`${n}/${r}`,i),t.remove(s),true)},hasSource(n,r){return t.exists(`${n}/${r}`)}}}function Ee(t){function e(n){let r=t.readAllEntries();if(!n)return r;let o=r.findIndex(s=>s.id===n);return o===-1?r:r.slice(o+1)}return {readEntriesAfterCursor(n){let r=e(n);return r.length===0?{events:[],newCursor:n}:{events:r.map(o=>o.event),newCursor:r[r.length-1].id}},pendingCount(n){return e(n).length},appendEvent(n){t.appendEntry({id:t.generateId(),event:n});}}}function Te(t,e){return {appendEntries(n,r){if(!n||r.length===0)return;let o=t.read(n)??[];t.write(n,[...o,...r]);},dispatchEntriesForJournalId(n,r){if(!n)return;let o=t.read(n);if(!(!o||o.length===0)){for(let s of o)try{r(s);}catch(i){let u=i instanceof Error?i.message:String(i);try{e(s,u);}catch{}}t.delete(n);}}}}var Ut="v1",wt="board/graph",Ie="board/lastJournalProcessedId";function Ae(t){return `cards/${t}/runtime`}function Oe(t){return {readRuntime(e){return t.read(Ae(e))??{_sources:{}}},writeRuntime(e,n){t.write(Ae(e),n);}}}function An(t,e){let n={...t};for(let r of e.deleteKeys)delete n[r];return {...n,...e.shallowMerge}}function je(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,n){if(n.schemaVersion!==Ut)throw new Error(`Unsupported snapshot schema version: ${n.schemaVersion}`);let r=t.readValues(e);if(r.version!==n.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:r.version};let o=An(r.values,n);return {ok:true,newVersion:t.writeValues(e,o,n.deleteKeys)}}}}function Ne(t){function e(n){let r=t.read(n);return r==null?null:typeof r=="string"?r:JSON.stringify(r)}return {readTaskExecutorRef(){let n=e("task-executor");if(n?.trim())return Zt(n.trim())},writeTaskExecutorRef(n){t.write("task-executor",Qt(n));},readChatHandlerRef(){let n=e("chat-handler");if(n?.trim())return Zt(n.trim())},writeChatHandlerRef(n){t.write("chat-handler",Qt(n));},readCardStoreRef(){return e("card-store-ref")},writeCardStoreRef(n){t.write("card-store-ref",n);},readOutputsStoreRef(){return e("outputs-store-ref")},writeOutputsStoreRef(n){t.write("outputs-store-ref",n);},readChatHandler(){return e("chat-handler")?.trim()||void 0},writeChatHandler(n){t.write("chat-handler",n);}}}function $e(t){return {writeComputedValues(e,n){t.write(`cards/${e}/computed_values`,n);},readComputedValues(e){return t.read(`cards/${e}/computed_values`)},readAllComputedValues(){let e={};for(let n of t.listKeys("cards/")){let r=n.match(/^cards\/([^/]+)\/computed_values$/);r&&(e[r[1]]=t.read(n));}return e},writeDataObjects(e){for(let[n,r]of Object.entries(e))n&&t.write(`data-objects/${n}`,r);},readDataObject(e){return t.read(`data-objects/${e}`)},readAllDataObjects(){let e={};for(let n of t.listKeys("data-objects/"))e[n.slice(13)]=t.read(n);return e},writeStatusSnapshot(e){t.write("status",e);},readStatusSnapshot(){return t.read("status")}}}function _n(t){return t?.lastRequestedAt?!t.lastFetchedAt||t.lastFetchedAt<t.lastRequestedAt:false}function En(t,e){return t?.lastRequestedAt?_n(t)?"in-flight":!t.lastFetchedAt||t.lastFetchedAt<e?"dispatch":"idle":"dispatch"}function Tn(t,e){let n={...t,lastFetchedAt:e};return delete n.lastError,n}function _e(t,e){let n={...t,lastError:e};return delete n.lastFetchedAt,n}function Mt(t,e){let n=e.state.tasks,r=e.config.tasks,o=Object.keys(n),s=It(e),i={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let g of s.pending)u.set(g.taskName,g.waitingOn);for(let g of s.unresolved)u.set(g.taskName,g.missingTokens);for(let g of s.blocked)u.set(g.taskName,g.failedTokens);let f=new Map;for(let[g,y]of Object.entries(r))for(let v of y.requires??[]){let E=f.get(v)??[];E.push(g),f.set(v,E);}let x=o.sort().map(g=>{let y=n[g],v=r[g]??{requires:[],provides:[]};y.status==="completed"?i.completed+=1:y.status==="failed"?i.failed+=1:y.status==="in-progress"&&(i.in_progress+=1);let E=v.requires??[],m=v.provides??[],A=Object.keys(y.data??{}).sort(),B=E.filter(U=>e.state.availableOutputs.includes(U)),q=E.filter(U=>!e.state.availableOutputs.includes(U)),G=u.get(g)??q,T=new Set;for(let U of m)for(let K of f.get(U)??[])K!==g&&T.add(K);let $=y.failedAt,M=y.error?{message:y.error,code:"TASK_FAILED",at:$,source:"task-runtime"}:void 0;return {name:g,status:y.status,error:M,requires:E,requires_satisfied:B,requires_missing:q,provides_declared:m,provides_runtime:A,blocked_by:G,unblocks:Array.from(T).sort(),runtime:{attempt_count:y.executionCount??0,restart_count:y.retryCount??0,in_progress_since:y.status==="in-progress"?y.startedAt??null:null,last_transition_at:y.lastUpdated??null,last_completed_at:y.completedAt??null,last_restarted_at:y.startedAt??null,status_age_ms:y.lastUpdated?0:null}}});i.pending=s.pending.length,i.blocked=s.blocked.length,i.unresolved=s.unresolved.length;let F=x.map(g=>({name:g.name,fanOut:g.unblocks.length})).sort((g,y)=>y.fanOut-g.fanOut||g.name.localeCompare(y.name)),R=F.length>0?F[0]:{name:null,fanOut:0},j=new Set;for(let g of Object.values(r))for(let y of g.requires??[])j.add(y);let w=0;for(let[g,y]of Object.entries(r)){let v=(y.requires??[]).length===0,m=(y.provides??[]).some(A=>(f.get(A)??[]).some(B=>B!==g));v&&!m&&(w+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:i.completed,eligible:s.eligible.length,pending:i.pending,blocked:i.blocked,unresolved:i.unresolved,failed:i.failed,in_progress:i.in_progress,orphan_cards:w,topology:{edge_count:Array.from(j).length,max_fan_out_card:R.name,max_fan_out:R.fanOut}},cards:x}}function In(){return new Date().toISOString()}function Fe(t,e,n,r,o,s,i){return async u=>{let f=[],x=n.cardStore.readCard(u.nodeId);if(!x)return "task-initiate-failure";let F=x.id,R=x.card_data??{},j=x.source_defs??[],w=j.filter(D=>D.optionalForCompletionGating!==true),g=n.cardRuntimeStore.readRuntime(F),y=false,v=()=>{y&&(n.cardRuntimeStore.writeRuntime(F,g),y=false);},E=D=>({...g._sources[D]??{}}),m=(D,P)=>{g._sources[D]=P,y=true;},A=u.taskState?.executionCount??0,B=g._lastExecutionCount;if(typeof B=="number"&&B!==A&&(g._sources={},y=true),B!==A&&(g._lastExecutionCount=A,y=true),u.update){let D=u.update,P=D.outputFile;if(P){let S=E(P);if(D.failure)m(P,_e(S,D.reason??"unknown"));else {let l=D.rqt;if(!S.lastFetchedAt||l>S.lastFetchedAt){let _=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,I=false;_&&(I=n.fetchedSourcesStore.commitSourceData(F,P,_)),I?m(P,Tn(S,l)):m(P,_e(S,`source delivery commit failed for ${P} token=${String(_)}`));}}v();}}let q={};for(let D of j)if(D.outputFile){let P=n.fetchedSourcesStore.readSourceData(F,D.outputFile);P!==null&&(q[D.bindTo]=P);}let G={};for(let[D,P]of Object.entries(u.state??{}))if(P!==null&&typeof P=="object"&&!Array.isArray(P)){let S=P[D];G[D]=S!==void 0?S:P;}else G[D]=P;let T={id:F,card_data:{...R},requires:G,source_defs:j,compute:x.compute};T._sourcesData=q,x.compute&&Gt.runSync(T,{sourcesData:q}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))(F,T.computed_values??{});let $={...x},M=Gt.enrichSourcesSync(Array.isArray(x.source_defs)?x.source_defs:void 0,{card_data:x.card_data,requires:G}),U=t.value;$.source_defs=Array.isArray(M)?M.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:U})):M;let K=In(),Y=u.update?void 0:K,X=w.filter(D=>{let P=D.outputFile;if(typeof P!="string"||!P)return true;let S=E(P);Y&&(S={...S,queueRequestedAt:Y},m(P,S));let l=S.queueRequestedAt??S.lastRequestedAt??K,_=En(S,l);return _==="in-flight"?false:_==="dispatch"});if(v(),X.length>0){let D=false,P=K;for(let S of X){let l=S.outputFile;if(typeof l!="string"||!l)continue;let _=E(l),I=_.queueRequestedAt??K;m(l,{..._,lastRequestedAt:I}),P=I,D=true;}return D&&v(),D&&(f.push({taskKind:"source-fetch",payload:{boardRef:ht(t),enrichedCard:$,callbackToken:u.callbackToken,rqt:P}}),n.executionRequestStore.appendEntries(e,f)),"task-initiated"}let St=x.provides??[],Ct={};for(let{bindTo:D,ref:P}of St)Ct[D]=Gt.resolve(T,P);return (i??n.outputStore.writeDataObjects.bind(n.outputStore))(Ct),j.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let P=E(D.outputFile);return !P.lastRequestedAt||!P.lastFetchedAt?true:P.lastFetchedAt<=P.lastRequestedAt}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:ht(t),enrichedCard:$,callbackToken:u.callbackToken,rqt:K}}),r(u.nodeId,Ct),f.length>0&&n.executionRequestStore.appendEntries(e,f),"task-initiated"}}var ee={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Be(t){return {[wt]:t.graph,[Ie]:t.lastDrainedJournalId}}function De(t){let e=t[wt],n=t[Ie];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${wt}`);return {graph:e,lastDrainedJournalId:typeof n=="string"?n:""}}function Le(t){let e=t.requires,n=t.provides?.map(r=>r.bindTo)??[];return {requires:e&&e.length>0?e:void 0,provides:n,taskHandlers:["card-handler"],description:t.meta?.title??t.id}}function et(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function z(t){return {status:"fail",error:t}}function nt(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function On(t){let e=new TextEncoder().encode(t),n=Array.from(e,r=>String.fromCharCode(r)).join("");return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function qe(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4),r=atob(n),o=Uint8Array.from(r,s=>s.charCodeAt(0));return new TextDecoder().decode(o)}function Ht(t){try{let e=JSON.parse(qe(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function jn(t){return On(JSON.stringify(t))}function Pe(t){try{let e=JSON.parse(qe(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function st(){return new Date().toISOString()}function Ge(t,e){let n=e.onWarn??(()=>{}),r=ht(t);function o(S){if(S.length!==0)try{let l=e.publishBoardChangeNotifications?.(S);l&&typeof l.catch=="function"&&l.catch(_=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${_ instanceof Error?_.message:String(_)}`));}catch(l){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${l instanceof Error?l.message:String(l)}`);}}function s(){let S=u().readCardStoreRef();if(!S)throw new Error(`Board at ${t.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let l=e.kvStorageForRef(S);return {readIndex(){return l.read("_index")},writeIndex(_){l.write("_index",_);},readCard(_){return l.read(_)},writeCard(_,I){return l.write(_,I),e.hashFn(I)},cardExists(_){return l.read(_)!==null},defaultCardKey(_){return _}}}let i={readValues(S){let l=e.kvStorage("state-snapshot"),_=l.listKeys().sort();if(_.length===0)return {version:null,values:{}};let I={};for(let H of _)I[H]=l.read(H);return {version:e.hashFn(I),values:I}},writeValues(S,l,_){let I=e.kvStorage("state-snapshot");for(let H of _)I.delete(H);for(let[H,J]of Object.entries(l))I.write(H,J);return e.hashFn(l)}},u=()=>Ne(e.kvStorage("config")),f=()=>je(i),x=()=>Ee(e.journalAdapter()),F=()=>Vt(s(),n),R=()=>{let S=u().readOutputsStoreRef();if(!S)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return $e(e.kvStorageForRef(S))};function j(){return !!f().readSnapshot(t.value).values[wt]}function w(){let S=f().readSnapshot(t.value);if(!S.values[wt])throw new Error(`Board not initialized at ${t.value}`);return De(S.values)}function g(S,l){let _=f().commitSnapshot(t.value,{schemaVersion:Ut,expectedVersion:l,commitId:e.genId(),committedAt:st(),deleteKeys:[],shallowMerge:Be(S)});if(!_.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${l??"null"} current=${_.currentVersion??"null"}`)}function y(S){x().appendEvent(S);}async function v(){let S=(p,h)=>{let N=p.payload,L=(N?.enrichedCard??{}).id??N?.cardId??"unknown";y({type:"task-failed",taskName:L,error:h,timestamp:st()});},l=Te(e.kvStorage("execution-requests"),S),_=Oe(e.kvStorage("card-runtime")),I=te(e.blobStorage("sources"),p=>e.resolveBlob(p)),H=new Map,J={readRuntime(p){return H.get(p)??_.readRuntime(p)},writeRuntime(p,h){H.set(p,h);}},at=[],rt=new Map,lt={readSourceData(p,h){let N=`${p}/${h}`;return rt.has(N)?rt.get(N):I.readSourceData(p,h)},ingestSourceDataStaged(p,h,N,V){I.ingestSourceDataStaged(p,h,N,V);},commitSourceData(p,h,N){let V=`${p}/.staged/${N}/${h}`,Q=e.blobStorage("sources").read(V);if(Q==null)return false;let tt=`${p}/${h}`,W=Q.trim();try{rt.set(tt,JSON.parse(W));}catch{rt.set(tt,W);}return at.push({cardId:p,outputFile:h,deliveryToken:N}),true},hasSource(p,h){let N=`${p}/${h}`;return rt.has(N)?true:I.hasSource(p,h)}},it={cardStore:F(),cardRuntimeStore:J,fetchedSourcesStore:lt,outputStore:R(),executionRequestStore:l},ft=w(),pt=Pt(ft.graph),{events:Z,newCursor:gt}=x().readEntriesAfterCursor(ft.lastDrainedJournalId),mt=[],vt=[],xt=[],Et=new Map,Jt=(p,h)=>{mt.push({type:"task-completed",taskName:p,data:h,timestamp:st()});},Nt=(p,h)=>y({type:"task-failed",taskName:p,error:h,timestamp:st()}),c=Re(pt,{handlers:{"card-handler":Fe(t,gt,it,Jt,Nt,(p,h)=>{vt.push({cardId:p,values:h});},p=>{xt.push(p);})}});for(mt=Z;mt.length>0;){let p=mt;mt=[];for(let h of p)if(h.type==="task-restart"){let N=it.cardStore.readCard(h.taskName);N&&Et.set(h.taskName,N);}c.pushAll(p),await c.waitForHandlers();}let d=c.getState();await c.dispose({wait:true});let b=f().readSnapshot(t.value).version;g({lastDrainedJournalId:gt,graph:Tt(d)},b);for(let{cardId:p,values:h}of vt)it.outputStore.writeComputedValues(p,h);for(let p of xt)it.outputStore.writeDataObjects(p);for(let[p,h]of H)_.writeRuntime(p,h);for(let{cardId:p,outputFile:h,deliveryToken:N}of at)I.commitSourceData(p,h,N);let k;try{k=Mt(r,d),it.outputStore.writeStatusSnapshot(k);}catch(p){n(`[board-live-cards-public] status publish failed: ${p instanceof Error?p.message:String(p)}`);}let C=[];for(let{cardId:p,values:h}of vt)C.push({kind:"computed_values",cardId:p,values:h});for(let p of xt)for(let[h,N]of Object.entries(p))h&&C.push({kind:"data_object",key:h,payload:N});for(let[p,h]of Et)C.push({kind:"card_refreshed",cardId:p,card:h});k!==void 0&&C.push({kind:"status",status:k}),o(C);let O=u().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:ht({kind:"built-in",value:"source-cli-task-executor"})};l.dispatchEntriesForJournalId(gt,p=>{if(p.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${p.taskKind}" \u2014 skipping`);return}let h=p.payload,N=h.enrichedCard?.id??"unknown",V=h.enrichedCard?.source_defs??[];for(let L of V){if(!L.outputFile){n(`[dispatch] source "${L.bindTo}" has no outputFile \u2014 skipping`);continue}let Q=jn({cbk:h.callbackToken,rg:t.value,br:ht(t),cid:N,b:L.bindTo,d:L.outputFile,cs:void 0,rqt:h.rqt});e.dispatchExecution(O,{source_def:L,base_ref:ht(t),callback:{token:Q,via:e.selfRef}}).catch(tt=>Nt(N,tt instanceof Error?tt.message:String(tt)));}});}async function E(){try{let S=()=>{let _=w(),{events:I}=x().readEntriesAfterCursor(_.lastDrainedJournalId);I.length<=0||(E(),e.requestProcessAccumulated?.());},l=await ie(e.lock,v,S);return et({ran:l!==!1})}catch(S){return nt(S)}}function m(S){try{let l=S.params?.cardStoreRef;if(!l)return z("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!j()){let J=Lt(ee);g({lastDrainedJournalId:"",graph:Tt(J)},null);}let _=S.params?.outputsStoreRef;if(!_)return z("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let I=u();I.writeCardStoreRef(l),I.writeOutputsStoreRef(_);let H=S.body??{};H["task-executor-ref"]&&I.writeTaskExecutorRef(H["task-executor-ref"]),H["chat-handler-ref"]&&I.writeChatHandlerRef(H["chat-handler-ref"]);try{R().writeStatusSnapshot(Mt(r,Pt(w().graph)));}catch{}return et()}catch(l){return nt(l)}}function A(S){try{let l=R().readStatusSnapshot();if(!l){l=Mt(r,Pt(w().graph));try{R().writeStatusSnapshot(l);}catch{}}return et(l)}catch(l){return nt(l)}}function B(S){try{let l=S.params?.id;return l?(y({type:"task-removal",taskName:l,timestamp:st()}),E(),et()):z("removeCard requires params.id")}catch(l){return nt(l)}}function q(S){try{let l=S.params?.id;return l?(y({type:"task-restart",taskName:l,timestamp:st()}),E(),et()):z("retrigger requires params.id")}catch(l){return nt(l)}}async function G(S){return E()}function T(S){try{let l=S.params?.cardId,_=S.params?.all,I=!!S.params?.restart;if(!l&&!_)return z("upsertCard requires --card-id <id> or --all");let H=_?F().readAllCards().map(J=>J.id):[l];for(let J of H)if(!F().readCard(J))return z(`Card "${J}" not found in board at ${t.value}`);for(let J of H){let at=F().readCard(J),rt=Le(at),lt=e.hashFn(rt),it=e.kvStorage("card-upsert"),ft=it.read(J),pt=ft?.taskConfigHash!==lt;if(!(!pt&&!I)){if(pt){let Z=ft?.blobRef??F().readCardKey(J)??J;y({type:"task-upsert",taskName:J,taskConfig:rt,timestamp:st()}),it.write(J,{blobRef:Z,taskConfigHash:lt,updatedAt:st()});}I&&y({type:"task-restart",taskName:J,timestamp:st()});}}return E(),et()}catch(l){return nt(l)}}function $(S){try{let l=S.params?.token;if(!l)return z("taskFailed requires params.token");let _=S.params?.error??"unknown error",I=Ht(l);return I?(y({type:"task-failed",taskName:I.taskName,error:_,timestamp:st()}),E(),et()):z("Invalid callback token")}catch(l){return nt(l)}}function M(S){try{let l=S.params?.token;if(!l)return z("taskProgress requires params.token");let I=(S.body??{}).update??{},H=Ht(l);return H?(y({type:"task-progress",taskName:H.taskName,update:I,timestamp:st()}),E(),et()):z("Invalid callback token")}catch(l){return nt(l)}}function U(S){try{let l=S.params?.token,_=S.params?.ref;if(!l)return z("sourceDataFetched requires params.token");if(!_)return z("sourceDataFetched requires params.ref");let I=Pe(l);if(!I)return z("Invalid source token");let{cbk:H,cid:J,b:at,d:rt,cs:lt,rqt:it}=I,ft=te(e.blobStorage("sources"),mt=>e.resolveBlob(mt)),pt=e.genId();ft.ingestSourceDataStaged(J,rt,ae(_),pt);let Z=Ht(H);if(!Z)return z("Invalid callback token embedded in source token");let gt=st();return y({type:"task-progress",taskName:Z.taskName,update:{bindTo:at,outputFile:rt,fetchedAt:gt,deliveryToken:pt,sourceChecksum:lt,rqt:it},timestamp:gt}),E(),et()}catch(l){return nt(l)}}function K(S){try{let l=S.params?.token,_=S.params?.reason??"unknown";if(!l)return z("sourceDataFetchFailure requires params.token");let I=Pe(l);if(!I)return z("Invalid source token");let{cbk:H,b:J,d:at,cs:rt}=I,lt=Ht(H);return lt?(y({type:"task-progress",taskName:lt.taskName,update:{bindTo:J,outputFile:at,failure:!0,reason:_,sourceChecksum:rt},timestamp:st()}),E(),et()):z("Invalid callback token embedded in source token")}catch(l){return nt(l)}}function Y(S){try{let l=u().readCardStoreRef();return l?et({storeRef:l}):z(`Board at ${t.value} has no card store configured`)}catch(l){return nt(l)}}function X(S){try{let l=u().readOutputsStoreRef();return l?et({storeRef:l}):z(`Board at ${t.value} has no outputs store configured`)}catch(l){return nt(l)}}function St(S){try{let l=S.params?.key;if(!l)return z("getConfig requires params.key");let _=u(),I;switch(l){case "task-executor":I=_.readTaskExecutorRef()??null;break;case "chat-handler":I=_.readChatHandlerRef()??null;break;case "card-store-ref":I=_.readCardStoreRef();break;case "outputs-store-ref":I=_.readOutputsStoreRef();break;default:return z(`getConfig: unknown key "${l}"`)}return et({value:I})}catch(l){return nt(l)}}function Ct(S){try{let l=S.params?.key;if(!l)return z("getOutputsDataObject requires params.key");let _=R().readDataObject(l);return et(_)}catch(l){return nt(l)}}function Rt(S){try{return et(R().readAllDataObjects())}catch(l){return nt(l)}}function D(S){try{let l=S.params?.key;if(!l)return z("getOutputsComputedValues requires params.key");let _=R().readComputedValues(l);return et(_)}catch(l){return nt(l)}}function P(S){try{return et(R().readAllComputedValues())}catch(l){return nt(l)}}return {init:m,status:A,getCardStoreRef:Y,getOutputsStoreRef:X,getConfig:St,getOutputsDataObject:Ct,getAllOutputsDataObjects:Rt,getOutputsComputedValues:D,getAllOutputsComputedValues:P,removeCard:B,retrigger:q,processAccumulatedEvents:G,upsertCard:T,taskFailed:$,taskProgress:M,sourceDataFetched:U,sourceDataFetchFailure:K}}function Ve(t){function e(o){return {status:"success",data:o}}function n(o){return {status:"fail",error:o}}function r(o){return {status:"error",error:o instanceof Error?o.message:String(o)}}return {get(o){try{let s=o.params?.id;if(s){let i=t.readCard(s);return i?e({cards:[i]}):n(`card "${s}" not found`)}return e({cards:t.readAllCards()})}catch(s){return r(s)}},set(o){try{let s=o.body;if(s==null)return n("set requires a body (card object or array of cards)");let i=Array.isArray(s)?s:[s];for(let u of i){if(typeof u.id!="string")return n("each card must have a string `id` field");t.writeCard(u.id,u);}return e({count:i.length})}catch(s){return r(s)}},del(o){try{let s=o.body?.ids??[],i=o.params?.id,u=i?[...s,i]:s;if(u.length===0)return n("del requires body.ids (string[]) or params.id");for(let f of u)t.removeCard(f);return e({count:u.length})}catch(s){return r(s)}},patch(o){try{let s=o.params?.id,i=o.params?.path;if(!s)return n("patch requires params.id");if(!i)return n("patch requires params.path");let u=o.body,f=u&&Object.prototype.hasOwnProperty.call(u,"value")?u.value:o.body;return t.patchCard(s,i,f),e({count:1})}catch(s){return r(s)}}}}var Kt=".artifacts-index.json";function Ue(){return new Date().toISOString()}function Me(t){return new TextEncoder().encode(t).byteLength}function jt(t){let e=t.read(Kt);if(!e)return {entries:{}};try{let n=JSON.parse(e);if(n&&n.entries&&typeof n.entries=="object")return n}catch{}return {entries:{}}}function ne(t,e){t.write(Kt,JSON.stringify(e,null,2));}function Nn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function He(t,e,n){t.entries[e]={key:e,size:n.size,updatedAt:n.updatedAt,contentType:n.contentType};}function re(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function $n(t){let e=String(t||"").trim();if(!e)return "upload.bin";let n=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return (n>=0?e.slice(n+1):e)||"upload.bin"}function Fn(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Bn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Dn(t){let e=$n(t),n=e.lastIndexOf(".");return n<=0||n===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,n),ext:e.slice(n)}}function Ln(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function oe(t){function e(n){let r=t.stat?Nn(t.stat(n)):null;if(r)return r;let s=jt(t).entries[n];if(s)return {...s};if(!t.exists(n))return null;let i=t.read(n);return i===null?{key:n}:{key:n,size:Me(i)}}return {exists(n){return t.exists(n)},putText(n,r,o="text/plain; charset=utf-8"){t.write(n,r);let s=e(n)??{key:n};s.contentType=o,s.updatedAt=s.updatedAt??Ue(),s.size=s.size??Me(r);let i=jt(t);return He(i,n,s),ne(t,i),s},putBytes(n,r,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(n,r);else {let u=JSON.stringify({__kind:"bytes-array",data:[...r]});t.write(n,u);}let s=e(n)??{key:n};s.contentType=o,s.updatedAt=s.updatedAt??Ue(),s.size=s.size??r.byteLength;let i=jt(t);return He(i,n,s),ne(t,i),s},getText(n){let r=t.read(n);if(r===null){if(!t.readBytes)return null;let o=t.readBytes(n);return o===null?null:Buffer.from(o).toString("utf-8")}try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new TextDecoder("utf-8").decode(new Uint8Array(o.data))}catch{}return r},getBytes(n){if(t.readBytes){let o=t.readBytes(n);if(o!==null)return o}let r=t.read(n);if(r===null)return null;try{let o=JSON.parse(r);if(o&&o.__kind==="bytes-array"&&Array.isArray(o.data))return new Uint8Array(o.data)}catch{}return new TextEncoder().encode(r)},head:e,list(n=""){let r=new Map;if(t.listKeys)for(let s of t.listKeys(n)){if(s===Kt)continue;let i=e(s)??{key:s};r.set(s,i);}let o=jt(t);for(let[s,i]of Object.entries(o.entries))s===Kt||n&&!s.startsWith(n)||r.has(s)||r.set(s,{...i});return [...r.values()].sort((s,i)=>s.key.localeCompare(i.key))},remove(n){t.remove(n);let r=jt(t);delete r.entries[n],ne(t,r);}}}function Ke(t,e){let n=e?.indexFileName;function r(R){return `${R}/${n}`}function o(R){let j=t.getText(r(R));if(!j)return [];try{let w=JSON.parse(j);return Array.isArray(w)?w.filter(g=>g&&typeof g.stored_name=="string").map(g=>({serial:Number(g.serial||re(String(g.stored_name))||0),role:String(g.role||"system").toLowerCase(),stored_name:String(g.stored_name),path:typeof g.path=="string"?g.path:`${R}/chats/${String(g.stored_name)}`,updated_at:typeof g.updated_at=="string"?g.updated_at:null})):[]}catch{return []}}function s(R,j){t.putText(r(R),JSON.stringify(j,null,2),"application/json; charset=utf-8");}function i(R){let j=o(R),w=0;for(let g of j){let y=Number(g.serial||0);Number.isFinite(y)&&y>w&&(w=y);}return w+1}function u(R,j){let w=o(R);w.push(j),s(R,w);}function f(R){let j=o(R),w=[];for(let g of j){let y=`${R}/${g.stored_name}`,v=t.getText(y);v!==null&&w.push({serial:Number(g.serial||re(g.stored_name)||0),role:String(g.role||"system").toLowerCase(),text:v,path:typeof g.path=="string"?g.path:`${R}/chats/${g.stored_name}`,stored_name:g.stored_name,updated_at:g.updated_at||null});}return w.sort((g,y)=>g.serial-y.serial||g.stored_name.localeCompare(y.stored_name)),w}function x(R){let j=`${R}/`;for(let w of t.list(j))t.remove(w.key);}function F(R){let j=`${R}/`,w=t.list(j),g=0,y=0,v=false;for(let E of w){let m=E.key.slice(j.length);if(m===".processing"){v=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(m))continue;g+=1;let A=E.updatedAt?Number(new Date(E.updatedAt).getTime()||0):0;A>y&&(y=A);}return {count:g,latest_mtime_ms:y,processing:v}}return {indexKey:r,loadIndex:o,saveIndex:s,nextSerial:i,appendIndexRecord:u,readRecords:f,clear:x,readSignal:F}}function Je(t){function e(o,s){let i=0,u=[];Array.isArray(s)&&u.push(...s);for(let f of t.list(`${o}/`))u.push(Ln(f.key));for(let f of u){let x=re(f);Number.isFinite(x)&&x>i&&(i=x);}return i+1}function n(o,s,i){let u=Number(i?.maxLen||32),{stem:f,ext:x}=Dn(o),F=Bn(x),R=Fn(f),j=`${String(s).padStart(3,"0")}-`,w=F,g=u-j.length-w.length;g<1&&(w="",g=u-j.length);let y=R.slice(0,Math.max(1,g)),v=`${j}${y}${w}`;return v.length>u&&(v=v.slice(0,u).replace(/\.$/,"")),v}function r(o,s,i){let u=e(o,i?.seedNames),f=n(s,u,{maxLen:i?.maxLen});for(;t.exists(`${o}/${f}`);)u+=1,f=n(s,u,{maxLen:i?.maxLen});return f}return {nextSerial:e,buildStoredName:n,allocateStoredName:r}}function ze(){function t(o,s){if(!Array.isArray(o))return [];let i=[];for(let u of o){if(!u||typeof u!="object")continue;let f=u;typeof f.stored_name=="string"&&i.push({name:typeof f.name=="string"?f.name:f.stored_name,stored_name:f.stored_name,size:typeof f.size=="number"&&Number.isFinite(f.size)?f.size:null,mime_type:typeof f.mime_type=="string"?f.mime_type:null,path:typeof f.path=="string"?f.path:null,uploaded_at:typeof f.uploaded_at=="string"?f.uploaded_at:s||null});}return i}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function n(o,s){let i=e(o);if(s.length===0)return o.files=i,i;let u=new Set(i.map(f=>f.stored_name));for(let f of s)u.has(f.stored_name)||(i.push(f),u.add(f.stored_name));return o.files=i,i}function r(o,s,i){let u=e(o);if(!Number.isInteger(s)||s<0||s>=u.length)return {ok:false,reason:"index_out_of_range"};let f=u[s];return !f||!f.stored_name?{ok:false,reason:"missing_stored_name"}:i&&i!==f.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:f}}return {read:e,normalizeIncoming:t,merge:n,resolve:r}}var Ye={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Pn=32;function qn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function Xe(t){if(!t||typeof t!="object")return false;let e=t.summary;return !e||typeof e!="object"?false:Number(e.card_count||0)>0}function We(t,e){if(!e||typeof e!="object")return;let n=e;if(n.kind==="notification-batch"&&Array.isArray(n.notifications)){for(let r of n.notifications)We(t,r);return}n.kind==="status"&&Xe(n.status)&&(t.status=n.status),n.kind==="computed_values"&&n.cardId&&(t.computedValues[n.cardId]=n.values),n.kind==="data_object"&&n.key&&(t.dataObjects[n.key]=n.payload),n.kind==="card_refreshed"&&n.cardId&&(t.cards[n.cardId]=n.card);}function Br(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),n={...Ye,...t.corsHeaders||{}},r=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,i=t.notificationTransport||null,u=t.serverUrl||null,f=t.executionExtra||{},x=new Set;function F(a){let c=Ge(a.baseRef,a.boardAdapter),d=a.boardAdapter.kvStorageForRef(a.cardStoreRef),k=Ve(Vt({readIndex:()=>d.read("_index"),writeIndex:h=>d.write("_index",h),readCard:h=>d.read(h),writeCard:(h,N)=>(d.write(h,N),h),cardExists:h=>d.read(h)!==null,defaultCardKey:h=>h},o.warn)),C=a.artifactsAdapter||a.boardAdapter,O=null,p=null;return {label:a.label,board:c,cardStore:k,get filesArtifacts(){return O??=oe(C.blobStorage("files"))},get chatsArtifacts(){return p??=oe(C.blobStorage("chats"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,inferenceAdapterRef:a.inferenceAdapterRef,notification:qn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let R=t.boards.map(F),j=new Map;function w(a){return j.get(a)??0}function g(a){let c=R[w(a)];return {files:c?c.filesArtifacts:null,chats:c?c.chatsArtifacts:null}}function y(a){let c=g(a);return c.chats?Ke(c.chats,{indexFileName:".index.json"}):null}function v(a){let c=g(a);return c.files?Je(c.files):null}function E(){return ze()}function m(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function A(a){if(!a||a.notificationTeardown||!i||!a.notifyRef)return;let c=await i.subscribe(a.notifyRef,d=>{We(a.notification,d);let b=d.kind==="notification-batch"?d.notifications:[d];Jt(b);});a.notificationTeardown=c;}async function B(a){if(!a||a.initialized)return;let c={cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef},d={};a.taskExecutorRef&&(d["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerRef&&(d["chat-handler-ref"]=a.chatHandlerRef),a.inferenceAdapterRef&&(d["inference-adapter-ref"]=a.inferenceAdapterRef);let b=a.board.init({params:c,body:d});if(b.status!=="success")throw Object.assign(new Error(b.error||`init failed for ${a.label}`),{statusCode:500});if(await A(a),a.chatHandlerRef&&s.describe)try{let k=await s.describe(a.chatHandlerRef);k&&k.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${k.kind}", expected "chat-handler" for ${a.label}`):k&&o.info(`[init] chat-handler validated: ${k.name} (protocol ${k.protocolVersion}) for ${a.label}`);}catch(k){o.warn(`[init] chat-handler describe failed for ${a.label}: ${k?.message||String(k)}`);}a.initialized=true;}function q(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let c=[],d=a.board.status({});d.status==="success"&&d.data!=null&&Xe(d.data)&&c.push({kind:"status",status:d.data});let b=a.board.getAllOutputsDataObjects({});if(b.status==="success"&&b.data!=null)for(let[C,O]of Object.entries(b.data))C&&c.push({kind:"data_object",key:C,payload:O});let k=a.board.getAllOutputsComputedValues({});if(k.status==="success"&&k.data!=null)for(let[C,O]of Object.entries(k.data))C&&c.push({kind:"computed_values",cardId:C,values:O});c.length>0&&a.boardAdapter.publishBoardChangeNotifications(c);}function G(a,c){if(!a||a.cardsBootstrapped)return;let d=a.cardStore.get({}),b=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let k of b)typeof k.id=="string"&&(j.set(k.id,c),a.board.upsertCard({params:{cardId:k.id}}));a.cardsBootstrapped=true;}async function T(){for(let a of R)await B(a);}async function $(){await T();for(let a=0;a<R.length;a++)q(R[a]),G(R[a],a);}function M(a){return R[w(a)]??null}function U(a){let c=M(a);if(!c)return null;let d=c.cardStore.get({params:{id:a}});if(d.status!=="success")return null;let b=Array.isArray(d.data?.cards)?d.data.cards:[];return b.length>0?b[0]:null}function K(){let a=d=>{if(!d||!d.cardStore)return [];let b=d.cardStore.get({});return b.status!=="success"||!Array.isArray(b.data?.cards)?[]:b.data.cards},c=[];for(let d of R)c.push(...a(d));return c}function Y(){let a=R.map(C=>{try{let p=C.boardAdapter.kvStorageForRef(C.outputsStoreRef).read("status");if(p!=null)return p}catch{}return C.notification.status}).filter(Boolean);if(a.length===0)return null;if(a.length===1)return a[0];let c=[],d=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],b={};for(let C of d)b[C]=0;for(let C of a){let O=C,p=Array.isArray(O.cards)?O.cards:[];c.push(...p);for(let h of d)b[h]+=Number(O?.summary?.[h]||0);}let k=a[0];return {...k,cards:c,summary:{...k.summary||{},card_count:c.length,...b}}}function X(){let a={},c=d=>{for(let[b,k]of Object.entries(d.notification.computedValues)){let C=d.notification.cards[b];a[b]={schema_version:"v1",card_id:b,card_data:C?.card_data??{},computed_values:k??{}};}};for(let d of R)c(d);return a}function St(){let a={};for(let c of R)Object.assign(a,c.notification.dataObjects||{});return a}function Ct(a){let c=m(a),d=y(a);return d?d.readSignal(c):{count:0,latest_mtime_ms:0,processing:false}}function Rt(){let a=K(),c=X(),d=St(),b={};for(let k of a){if(!k?.id)continue;let C=k.id,O=c[C]||{},p=Ct(C),h={...O.card_data&&typeof O.card_data=="object"?O.card_data:k.card_data&&typeof k.card_data=="object"?k.card_data:{},__chat_signal:p};b[C]={schema_version:O.schema_version||"v1",card_id:O.card_id||C,card_data:h,computed_values:O.computed_values&&typeof O.computed_values=="object"?O.computed_values:{}};}return {boardId:r,cardDefinitions:a,statusSnapshot:Y(),dataObjectsByToken:d,cardRuntimeById:b}}function D(a,c,d){let b=d?.syncBoard!==false,k=M(a);if(!k)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let C=U(a);if(!C)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let O=c(C)||C,p=k.cardStore.set({body:O});if(p.status!=="success")throw Object.assign(new Error(p.error||`Failed to persist card: ${a}`),{statusCode:500});if(b){let h=k.board.upsertCard({params:{cardId:a,restart:true}});if(h.status!=="success")throw Object.assign(new Error(h.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function P(a,c){D(a,c,{syncBoard:true});}function S(a,c){D(a,c,{syncBoard:false});}function l(a,c){P(a,d=>{if(!c||typeof c!="object"||Object.keys(c).length===0)return d;function b(k,C,O){let p=String(C||"").split(".").filter(Boolean);if(!p.length)return;let h=k;for(let N=0;N<p.length-1;N++){let V=p[N];(!h[V]||typeof h[V]!="object")&&(h[V]={}),h=h[V];}h[p[p.length-1]]=O;}if(c.fieldValues!==void 0&&c.fieldValues!==null){let k=null,C=d.view;if(C&&Array.isArray(C.elements)){for(let O of C.elements)if(O?.data&&O.data.writeTo){k=O.data.writeTo;break}}k?b(d,k,c.fieldValues):typeof c.fieldValues=="object"&&!Array.isArray(c.fieldValues)&&(d.card_data={...d.card_data||{},...c.fieldValues});}else {if(Array.isArray(c._stagedFiles)&&c._stagedFiles.length>0)return d;for(let[k,C]of Object.entries(c))k!=="_stagedFiles"&&(C!==null&&typeof C=="object"&&!Array.isArray(C)&&d[k]!==null&&typeof d[k]=="object"&&!Array.isArray(d[k])?d[k]={...d[k],...C}:d[k]=C);}return d});}function _(a){let c=String(a||"").match(/^(\d+)[-_]/);return c?parseInt(c[1],10):0}function I(a){let c=String(a||"").trim();if(!c)return "upload.bin";let d=Math.max(c.lastIndexOf("/"),c.lastIndexOf("\\"));return (d>=0?c.slice(d+1):c)||"upload.bin"}function H(a){let c=m(a),d=y(a);d&&d.clear(c);}function J(a,c){let d=m(a),b=y(a),k=b?b.nextSerial(d):1,C=String(c||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(k).padStart(3,"0")}_${C}.txt`}function at(a,c,d,b){let k=new Date().toISOString(),C=m(a),O=g(a),p=J(a,c||"system"),h=`${C}/${p}`,N=[],V=typeof d=="string"?d.trim():"";V&&N.push(V);let L=Array.isArray(b)?b:[];if(L.length){N.length&&N.push(""),N.push("files:");for(let W of L){if(!W||typeof W!="object")continue;let ut=typeof W.name=="string"?W.name:"file",ct=typeof W.stored_name=="string"?W.stored_name:"";N.push(ct?`- ${ut} -> ${ct}`:`- ${ut}`);}}O.chats&&O.chats.putText(h,`${N.join(`
2
+ `)}
3
+ `);let Q=_(p),tt=y(a);return tt&&tt.appendIndexRecord(C,{serial:Q,role:c||"system",stored_name:p,path:`${a}/chats/${p}`,updated_at:k}),{at:k,role:c||"system",text:V,files:L,path:`${a}/chats/${p}`}}function rt(a){let c=m(a),d=y(a);return d?d.readRecords(c).map(b=>({...b,path:`${a}/chats/${b.stored_name}`})):[]}function lt(a){let c=[];try{let d=U(a);if(!d)return c;let b=E().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let k of b)c.push(k.stored_name);}catch{}return c}function it(a,c,d,b){let k=m(a),C=g(a),O=I(c),p=v(a),h=p?p.allocateStoredName(k,O,{seedNames:lt(a),maxLen:Pn}):`${String(Date.now())}-${O}`;return C.files&&C.files.putBytes(`${k}/${h}`,new Uint8Array(b),d||"application/octet-stream"),{name:O,stored_name:h,size:b.length,mime_type:d||"application/octet-stream",path:`${a}/files/${h}`,uploaded_at:new Date().toISOString()}}function ft(a,c,d){let b=M(a);if(!b)return;let k=b.board.getConfig({params:{key:"chat-handler"}});if(k.status!=="success")return;let C=k.data?.value;if(!C||typeof C!="object")return;let O=m(a),p=g(a),h=`${O}/.processing`;try{p.chats?.putText(h,"","text/plain; charset=utf-8");}catch{}let N={boardId:r,cardId:String(a),chatsKeyPrefix:c,chatProcessingMarkerKey:h,lastChatFile:d,...f,...u?{serverUrl:u}:{}};s.invoke(C,N).then(V=>{if(V.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${r}")`);else {try{p.chats?.remove(h);}catch{}o.warn(`[chat-handler] dispatch failed for card "${a}": ${V.error||"unknown"}`);}},V=>{try{p.chats?.remove(h);}catch{}o.warn(`[chat-handler] invoke failed for card "${a}": ${V?.message||String(V)}`);});}function pt(a,c,d){let b=c==="chat-send"?S:P,k;b(a,C=>{let O=new Date().toISOString(),p=C.card_data&&typeof C.card_data=="object"?C.card_data:{};if(C.card_data=p,c==="chat-send"){let h=d&&typeof d.text=="string"?d.text.trim():"",N=[];if(Array.isArray(d?.files)){for(let V of d.files)if(V){if(typeof V=="string"){N.push({name:V});continue}if(typeof V=="object"){let L=V;typeof L.name=="string"&&N.push({name:L.name,size:L.size,mime_type:L.mime_type,path:L.path,uploaded_at:L.uploaded_at,stored_name:L.stored_name});}}}if(h||N.length>0){let V=m(a),Q=at(a,"user",h,N).path,tt=Q.includes("/")?Q.slice(Q.lastIndexOf("/")+1):Q;k={chatsKeyPrefix:`${V}/chats`,lastChatFile:tt};for(let W of N){if(!W||typeof W!="object")continue;let ut=typeof W.name=="string"?W.name:"file",ct=typeof W.stored_name=="string"?W.stored_name:null;ct&&at(a,"system",`File ${ut} uploaded as ${ct}.`,[]);}}return C}if(c==="file-upload"){let h=E().normalizeIncoming(d?.files,O);return h.length>0&&E().merge(p,h),C}if(c==="action"){let h=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!h)return C;p.lastAction={buttonId:h,at:O},p.lastActionText=`${h} @ ${O}`;}return C}),k&&ft(a,k.chatsKeyPrefix,k.lastChatFile);}function Z(a,c,d){let b=JSON.stringify(d),k=typeof Buffer<"u"?Buffer.byteLength(b):new TextEncoder().encode(b).length;a.writeHead(c,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":k}),a.end(b);}async function gt(a){let c=[];for await(let b of a)c.push(b);let d=typeof Buffer<"u"?Buffer.concat(c).toString("utf-8").trim():new TextDecoder().decode(vt(c)).trim();return d?JSON.parse(d):{}}async function mt(a){let c=[];for await(let d of a)c.push(d);return typeof Buffer<"u"?Buffer.concat(c):vt(c)}function vt(a){let c=a.reduce((k,C)=>k+C.length,0),d=new Uint8Array(c),b=0;for(let k of a)d.set(k,b),b+=k.length;return d}let xt=0;function Et(a){let c=JSON.stringify(a);return xt++,`id: ${xt}
4
+ data: ${c}
5
+
6
+ `}function Jt(a){if(!a||a.length===0)return;let c=Et({kind:"notification-batch",notifications:a});for(let d of x)try{d.write(c);}catch{x.delete(d);}}function Nt(a,c){c.writeHead(200,{...n,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),x.add(c);let d=Rt(),b=Et(d);c.write(b);let k=setInterval(()=>{try{c.write(`: keepalive
7
+
8
+ `);}catch{}},15e3);a.on("close",()=>{clearInterval(k),x.delete(c),c.end();});}async function se(a,c,d){let b=a.method||"GET",k=d,C=k.pathname;try{if(b==="GET"&&C===`${e}/init-board`)return await T(),Z(c,200,Rt()),!0;if(b==="GET"&&C===`${e}/sse`){await T(),Nt(a,c);for(let L=0;L<R.length;L++)q(R[L]),G(R[L],L);return !0}if(b==="GET"&&C===`${e}/board-status`)return Z(c,200,Rt()),!0;let O=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)$`));if(b==="PATCH"&&O){await $();let L=decodeURIComponent(O[1]),Q=await gt(a);return l(L,Q),Z(c,200,{ok:!0}),!0}let p=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/actions$`));if(b==="POST"&&p){await $();let L=decodeURIComponent(p[1]),Q=await gt(a);return pt(L,Q?.actionType,Q?.payload),Z(c,200,{ok:!0}),!0}let h=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/chats$`));if(b==="GET"&&h){await $();let L=decodeURIComponent(h[1]);return Z(c,200,{ok:!0,messages:rt(L)}),!0}let N=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/files$`));if(b==="POST"&&N){await $();let L=decodeURIComponent(N[1]),Q=String(k.searchParams.get("inChat")||"").toLowerCase()==="true",tt=a.headers["x-file-name"],W=String(a.headers["content-type"]||"application/octet-stream"),ut=Array.isArray(tt)?tt[0]:tt,ct=ut?decodeURIComponent(String(ut)):"upload.bin",$t=await mt(a);if(!$t.length)return Z(c,400,{error:"Empty upload body"}),!0;let dt=it(L,ct,W,$t);return Q&&(S(L,bt=>{let At=new Date().toISOString(),Ft=bt.card_data&&typeof bt.card_data=="object"?bt.card_data:{};bt.card_data=Ft;let zt=E().normalizeIncoming([{name:dt.name,stored_name:dt.stored_name,size:dt.size,mime_type:dt.mime_type,path:dt.path,uploaded_at:dt.uploaded_at||At}],At);return E().merge(Ft,zt),bt}),at(L,"system",`file uploaded: ${dt.name} as ${dt.stored_name}`,[])),Z(c,200,{ok:!0,file:dt}),!0}let V=C.match(new RegExp(`^${_t(e)}/cards/([^/]+)/files/(\\d+)$`));if(b==="GET"&&V){let L=decodeURIComponent(V[1]),Q=parseInt(V[2],10),tt=k.searchParams.get("sn"),W=U(L);if(!W)return Z(c,404,{error:"Card not found"}),!0;let ut=E().resolve(W.card_data,Q,tt);if(!ut.ok&&ut.reason==="stale_reference")return Z(c,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!ut.ok)return Z(c,404,{error:"File not found"}),!0;let ct=ut.file,$t=m(L),dt=g(L),bt=`${$t}/${ct.stored_name}`,At=dt.files?dt.files.getBytes(bt):null;if(!At)return Z(c,404,{error:"File not found"}),!0;let Ft=ct.name||ct.stored_name,zt=ct.mime_type||"application/octet-stream";return c.writeHead(200,{"Content-Type":zt,"Content-Disposition":`attachment; filename="${Ft}"`,"Content-Length":At.length}),c.end(At),!0}return !1}catch(O){let p=O?.statusCode||500;return Z(c,p,{error:String(O?.message||O)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleRuntimeApi:se,buildPublishedRuntimePayload:Rt,clearChatRecords:H,reportSourceFetched(a,c){let d=R[0];return d?d.board.sourceDataFetched({params:{token:a,ref:c}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,c){let d=R[0];return d?d.board.sourceDataFetchFailure({params:{token:a,reason:c}}):{status:"fail",error:"no board context"}},get cardStore(){return R[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Dr(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),n={...Ye,...t.corsHeaders||{}},r=t.serverMetaStore,o=t.boardRuntimeFactory,s=new Map,i="boards-config.json";function u(){let v=r.getText(i);if(!v)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(v)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function f(v){r.putText(i,JSON.stringify(v,null,2));}function x(v){let E=String(v||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return E.length>0&&E.length<=64?E:null}function F(v){if(s.has(v))return s.get(v);let m=u().boards.find(B=>B.id===v)||{},A=o(v,m);return s.set(v,A),A}function R(v,E,m){let A=JSON.stringify(m),B=typeof Buffer<"u"?Buffer.byteLength(A):new TextEncoder().encode(A).length;v.writeHead(E,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":B}),v.end(A);}async function j(v,E,m){let A=v.method||"GET",B=m.pathname;if(A==="GET"&&B===e)return R(E,200,{ok:true,boards:u().boards}),true;if(A==="POST"&&B===e){let q=[];for await(let Y of v)q.push(Y);let G=typeof Buffer<"u"?Buffer.concat(q).toString("utf-8").trim():new TextDecoder().decode(Gn(q)).trim(),T={};try{T=G?JSON.parse(G):{};}catch{T={};}let $=x(T.id);if(!$)return R(E,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let M=u();if(M.boards.some(Y=>Y.id===$))return R(E,409,{error:`Board "${$}" is already registered`}),true;let U=typeof T.label=="string"&&T.label.trim()?T.label.trim():$,K={id:$,label:U};for(let[Y,X]of Object.entries(T))Y==="id"||Y==="label"||X!=null&&(K[Y]=X);return M.boards.push(K),f(M),R(E,200,{ok:true,board:K}),true}return false}async function w(v,E,m){let B=m.pathname.match(new RegExp(`^${_t(e)}/([^/]+)(/|$)`));if(!B)return false;let q=x(decodeURIComponent(B[1]));return q?u().boards.some($=>$.id===q)?!!await F(q).handleRuntimeApi(v,E,m):(R(E,404,{error:`Board "${q}" not registered. POST ${e} with {id} to register it first.`}),true):(R(E,400,{error:"Invalid board id"}),true)}async function g(v,E,m){return !!(await j(v,E,m)||await w(v,E,m))}function y(v){if(!u().boards.some(m=>m.id===v))throw Object.assign(new Error(`Board "${v}" not registered`),{statusCode:404});return {service:F(v)}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleApi:g,requireBoardService:y}}function _t(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Gn(t){let e=t.reduce((o,s)=>o+s.length,0),n=new Uint8Array(e),r=0;for(let o of t)n.set(o,r),r+=o.length;return n}exports.createMultiBoardServerRuntime=Dr;exports.createSingleBoardServerRuntime=Br;//# sourceMappingURL=index.cjs.map
9
+ //# sourceMappingURL=index.cjs.map