yaml-flow 8.1.1 → 8.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/asset-integrity.json +3 -3
- package/browser/board-livecards-client.js +1 -1
- package/browser/board-livecards-localstorage.js +4 -6
- package/cli/{board-live-cards-lib-tjYsPt5U.d.ts → board-live-cards-lib-Iq_XAC09.d.ts} +1 -1
- package/cli/browser-api/board-live-cards-browser-adapter.d.ts +4 -3
- package/cli/browser-api/board-live-cards-browser-adapter.js +2 -2
- package/cli/browser-api/card-store-browser-api.d.ts +1 -1
- package/cli/node/artifacts-store-cli.js +8 -8
- package/cli/node/board-live-cards-cli.js +8 -8
- package/cli/node/card-store-cli.js +4 -4
- package/cli/node/fs-board-adapter.d.ts +6 -33
- package/cli/node/fs-board-adapter.js +10 -8
- package/cli/node/step-machine-cli.js +3 -3
- package/cli/{types-D2XnLbBj.d.ts → types--rXGWbSR.d.ts} +77 -5
- package/examples/board/.board-ws/cards/store/_index.json +17 -0
- package/examples/board/.board-ws/cards/store/card-market-prices.json +80 -0
- package/examples/board/.board-ws/cards/store/card-portfolio-value.json +90 -0
- package/examples/board/.board-ws/cards/store/card-portfolio.json +78 -0
- package/examples/board/cards/cardT-market-prices.json +6 -4
- package/examples/board/cards/cardT-portfolio-value.json +10 -38
- package/examples/board/cards/cardT-portfolio.json +9 -4
- package/examples/board/demo-shell-with-server.html +3 -3
- package/examples/board/server/board-server.js +593 -0
- package/examples/board/server/board-worker/source-def-flows/mock-handler/mock-db.js +13 -0
- package/examples/board/server/board-worker/source-def-flows/sqlite-handler/.retain/compliance.db +0 -0
- package/examples/board/server/board-worker/source-def-flows/sqlite-handler/.retain/optimus.db +0 -0
- package/examples/board/server/board-worker/source-def-flows/sqlite-handler/query.cjs +51 -0
- package/examples/board/server/board-worker/source-def-flows/sqlite-handler/seed-cpm.cjs +197 -0
- package/examples/board/server/board-worker/source-def-flows/sqlite-handler/seed-cpmV2.cjs +128 -0
- package/examples/board/server/board-worker/source-def-flows/sqlite-handler/seed-optimus.cjs +352 -0
- package/examples/board/server/board-worker/source-def-flows/sqlite-handler/sqlite-config.json +3 -0
- package/examples/board/server/board-worker/source-def-flows/sqlite-handler/sqlite-handler.js +84 -0
- package/examples/board/{source-def-flows/url.flow.json → server/board-worker/source-def-flows/sqlite.flow.json} +7 -7
- package/examples/board/{source-def-handlers → server/board-worker/source-def-flows/url-handler}/http-source-handler.js +29 -21
- package/examples/board/server/board-worker/source-def-flows/url.flow.json +73 -0
- package/examples/board/{source_def_flows.json → server/board-worker/source_def_flows.json} +61 -115
- package/examples/board/server/board-worker/task-executor.js +475 -0
- package/examples/board/server/chat-flow/chat-clear-processing.js +41 -0
- package/examples/board/server/chat-flow/chat-open-turn.js +144 -0
- package/examples/board/server/chat-flow/chat-write-assistant.js +44 -0
- package/examples/board/server/chat-flow/copilot-chat/assistant.js +253 -0
- package/examples/board/server/chat-flow/echo-probe/assistant.js +28 -0
- package/examples/board/server/chat-flow/flow-steps.json +167 -0
- package/examples/board/server-config.json +22 -0
- package/examples/board/test/server-http-test.js +707 -0
- package/examples/board/test/{portfolio-tracker-sse-worker.js → sse-worker.js} +9 -8
- package/examples/board-local/demo-shell-localstorage.html +3 -3
- package/lib/{artifacts-store-lib-public-DBICnGL6.d.cts → artifacts-store-lib-public-C5UL5tyG.d.cts} +3 -31
- package/lib/{artifacts-store-lib-public-BWC3YuLa.d.ts → artifacts-store-lib-public-GD4H-fFp.d.ts} +3 -31
- package/lib/artifacts-store-public.d.cts +3 -3
- package/lib/artifacts-store-public.d.ts +3 -3
- package/lib/board-live-cards-node.cjs +10 -8
- package/lib/board-live-cards-node.d.cts +9 -8
- package/lib/board-live-cards-node.d.ts +9 -8
- package/lib/board-live-cards-node.js +10 -8
- package/lib/{board-live-cards-public-BF9FP0mL.d.cts → board-live-cards-public-BLXbcBNk.d.cts} +2 -2
- package/lib/{board-live-cards-public-dJAl5IL-.d.ts → board-live-cards-public-BZaNb2mi.d.ts} +2 -2
- package/lib/board-live-cards-public.cjs +2 -2
- package/lib/board-live-cards-public.d.cts +2 -2
- package/lib/board-live-cards-public.d.ts +2 -2
- package/lib/board-live-cards-public.js +2 -2
- package/lib/board-live-cards-server-runtime.cjs +4 -6
- package/lib/board-live-cards-server-runtime.d.cts +3 -3
- package/lib/board-live-cards-server-runtime.d.ts +3 -3
- package/lib/board-live-cards-server-runtime.js +4 -6
- package/lib/board-livegraph-runtime/index.cjs +2 -2
- package/lib/board-livegraph-runtime/index.js +2 -2
- package/lib/card-store-public.d.cts +2 -2
- package/lib/card-store-public.d.ts +2 -2
- package/lib/execution-refs.cjs +1 -1
- package/lib/execution-refs.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/server-runtime/index.cjs +4 -6
- package/lib/server-runtime/index.d.cts +4 -4
- package/lib/server-runtime/index.d.ts +4 -4
- package/lib/server-runtime/index.js +4 -6
- package/lib/step-machine-public/index.cjs +3 -3
- package/lib/step-machine-public/index.d.cts +27 -10
- package/lib/step-machine-public/index.d.ts +27 -10
- package/lib/step-machine-public/index.js +3 -3
- package/lib/{storage-interface-BhAON-gW.d.ts → storage-interface-B6ecOulj.d.cts} +25 -3
- package/lib/{storage-interface-BhAON-gW.d.cts → storage-interface-B6ecOulj.d.ts} +25 -3
- package/lib/stores/index.d.cts +1 -1
- package/lib/stores/index.d.ts +1 -1
- package/lib/stores/kv.d.cts +1 -1
- package/lib/stores/kv.d.ts +1 -1
- package/lib/{types-CXBzvC0s.d.cts → types-Bztd1KoK.d.cts} +75 -3
- package/lib/{types-D48hpnTR.d.ts → types-D-xVWPdY.d.ts} +75 -3
- package/package.json +1 -1
- package/examples/board/demo-chat-handler.js +0 -169
- package/examples/board/demo-server-config.json +0 -10
- package/examples/board/demo-server.js +0 -580
- package/examples/board/demo-task-executor.js +0 -721
- package/examples/board/gandalf-cards/card-source-kinds.json +0 -36
- package/examples/board/gandalf-cards/cards/_index.json +0 -7
- package/examples/board/gandalf-cards/cards/card-source-kinds.json +0 -64
- package/examples/board/scripts/copilot_wrapper.bat +0 -157
- package/examples/board/scripts/copilot_wrapper_helper.ps1 +0 -190
- package/examples/board/scripts/workiq_wrapper.mjs +0 -66
- package/examples/board/source-def-flows/copilot.flow.json +0 -33
- package/examples/board/source-def-flows/url-list.flow.json +0 -33
- package/examples/board/source-def-flows/workiq.flow.json +0 -34
- package/examples/board/source-def-handlers/copilot-source-handler.js +0 -141
- package/examples/board/test/demo-http-test.js +0 -317
- /package/examples/board/{source-def-flows → server/board-worker/source-def-flows}/mock.flow.json +0 -0
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {createRequire}from'module';import'ajv-formats';var Qt="b64:";function pn(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 gn(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 kt(t){return `${Qt}${pn(JSON.stringify(t))}`}function be(t){if(!t.startsWith(Qt))throw new Error(`Invalid ref format (expected ${Qt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(gn(t.slice(Qt.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 Ce(t,e,n){let r=t.tryAcquire();if(!r)return false;try{await e();}finally{r();}return n?.(),true}var vt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function dt(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function xt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function Re(t){return t.tasks??{}}function de(t){return t?t.status===vt.FAILED||t.status===vt.INACTIVATED:false}function we(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function ve(t){return t.maxExecutions}function xe(t,e){let n=new Set;for(let[r,o]of Object.entries(e))if(o.status===vt.COMPLETED){let s=t.tasks[r];s&&dt(s).forEach(c=>n.add(c));}return Array.from(n)}function Ae(t,e){let n={};return t.forEach(r=>{let o=e[r];if(!o)return;dt(o).forEach(u=>{n[u]||(n[u]=[]),n[u].push(r);});}),n}function _e(t,e,n){let r=t.tasks[e]??Zt(),o={};if(n){let u=n.tasks[e],c=xt(u);for(let f of c)for(let[C,$]of Object.entries(n.tasks))if(dt($).includes(f)){let v=t.tasks[C];v?.lastDataHash&&(o[f]=v.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 Ee(t,e,n,r,o,s){let u=t.tasks[n]??Zt(),c=e.tasks[n];if(!c)throw new Error(`Task "${n}" not found in graph`);let f;r&&c.on&&c.on[r]?f=c.on[r]:f=dt(c);let C=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let F=c.requires??[];for(let k of F)for(let[g,y]of Object.entries(e.tasks))if(dt(y).includes(k)){let R=t.tasks[g];R?.lastDataHash&&(C[k]=R.lastDataHash);break}}let $={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:C,error:void 0},v=[...new Set([...t.availableOutputs,...f])];return {...t,tasks:{...t.tasks,[n]:$},availableOutputs:v,lastUpdated:new Date().toISOString()}}function Te(t,e,n,r){let o=t.tasks[n]??Zt(),s=e.tasks[n];if(s?.retry){let f=o.retryCount+1;if(f<=s.retry.max_attempts){let C={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:r};return {...t,tasks:{...t.tasks,[n]:C},lastUpdated:new Date().toISOString()}}}let u={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:r,executionCount:o.executionCount+1},c=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(c=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&u.executionCount>=s.circuit_breaker.max_executions){let f=s.circuit_breaker.on_break;c=[...new Set([...c,...f])];}return {...t,tasks:{...t.tasks,[n]:u},availableOutputs:c,lastUpdated:new Date().toISOString()}}function Ie(t,e,n,r){let o=t.tasks[e]??Zt(),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 Oe(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 Zt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function te(t,e){let n=`live-${Date.now()}`,r={};for(let s of Object.keys(t.tasks))r[s]=Ne();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 mn(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:_e(r,e.taskName,n)};case "task-completed":return {config:n,state:Ee(r,n,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:n,state:Te(r,n,e.taskName,e.error)};case "task-progress":return {config:n,state:Ie(r,e.taskName,e.message,e.progress)};case "task-restart":return {config:n,state:Oe(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:Rn(r,e.action)};case "task-upsert":return hn(t,e.taskName,e.taskConfig);case "task-removal":return yn(t,e.taskName);case "node-requires-add":return kn(t,e.nodeName,e.tokens);case "node-requires-remove":return Sn(t,e.nodeName,e.tokens);case "node-provides-add":return bn(t,e.nodeName,e.tokens);case "node-provides-remove":return Cn(t,e.nodeName,e.tokens);default:return t}}function je(t,e){return e.reduce((n,r)=>mn(n,r),t)}function hn(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]:Ne()},lastUpdated:new Date().toISOString()}}}function yn(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 kn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=xt(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:[...o,...s]}}},state:t.state}}function Sn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=xt(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:s}}},state:t.state}}function bn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=dt(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:[...o,...s]}}},state:t.state}}function Cn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=dt(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:s}}},state:t.state}}function qt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function ee(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 Ne(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Rn(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 Gt(t){let{config:e,state:n}=t,r=Re(e);if(Object.keys(r).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=wn(r),u=xe(e,n.tasks),c=new Set([...u,...n.availableOutputs]),f=[],C=[],$=[],v=[];for(let[k,g]of Object.entries(r)){let y=n.tasks[k],R=we(g,e.settings),A=R!=="once";if(y?.status===vt.RUNNING||de(y))continue;let h=ve(g);if(h!==void 0&&y&&y.executionCount>=h||g.circuit_breaker&&y&&y.executionCount>=g.circuit_breaker.max_executions||!A&&y?.status===vt.COMPLETED)continue;if(A&&y?.status===vt.COMPLETED){let _=xt(g),B=false;switch(R){case "data-changed":{_.length>0&&_.some(M=>{for(let[Y,Q]of Object.entries(r))if(dt(Q).includes(M)){let nt=n.tasks[Y];if(!nt)continue;let _t=y.lastConsumedHashes?.[M];return nt.lastDataHash==null?nt.executionCount>y.lastEpoch:nt.lastDataHash!==_t}return false})||(B=true);break}case "epoch-changed":{_.length>0&&_.some(M=>{for(let[Y,Q]of Object.entries(r))if(dt(Q).includes(M)){let nt=n.tasks[Y];if(nt&&nt.executionCount>y.lastEpoch)return true}return false})||(B=true);break}case "time-based":{let J=g.refreshInterval??0;if(J<=0){B=true;break}let M=y.completedAt;if(!M){B=true;break}(Date.now()-Date.parse(M))/1e3<J&&(B=true);break}case "manual":B=true;break}if(B)continue}let w=xt(g);if(w.length===0){f.push(k);continue}let O=[],G=[],V=[];for(let _ of w){if(c.has(_))continue;let B=s[_]||[];B.length===0?O.push(_):B.every(M=>de(n.tasks[M]))?V.push({token:_,failedProducer:B[0]}):G.push(_);}O.length>0?$.push({taskName:k,missingTokens:O}):V.length>0?v.push({taskName:k,failedTokens:V.map(_=>_.token),failedProducers:[...new Set(V.map(_=>_.failedProducer))]}):G.length>0?C.push({taskName:k,waitingOn:G}):f.push(k);}let F={};if(f.length>1){let k=Ae(f,r);for(let[g,y]of Object.entries(k))y.length>1&&(F[g]=y);}return {eligible:f,pending:C,unresolved:$,blocked:v,conflicts:F}}function wn(t){let e={};for(let[n,r]of Object.entries(t)){for(let o of dt(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 Vt=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function le(t){let e=fe(t);return vn(e)}function fe(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(fe).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+fe(e[r])).join(",")+"}"}function vn(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 xn(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 An(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 $e(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return xn(e)}function _n(t){try{let e=JSON.parse(An(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Fe(t,e,n){let{handlers:r,onDrain:o}=e,s=new Vt,u="state"in t&&"config"in t?t:te(t),c=false,f=new Set,C=new Map(Object.entries(r)),$=new Vt,v=false,F=false;function k(){if(!c){if(v){F=true;return}v=true;try{do F=!1,g();while(F)}finally{v=false;}}}function g(){let h=$.drain(),w=s.drain(),O=[...h,...w];O.length>0&&(u=je(u,O));let G=Gt(u);O.length>0&&o?.(O,u,G);for(let V of G.eligible)A(V);for(let V of O)if(V.type==="task-progress"){let{taskName:_,update:B}=V;if(!u.config.tasks[_])continue;let M=u.state.tasks[_];if(!M||M.status!=="running")continue;let Y=$e(_),Q=R(_,Y,B).catch(nt=>{c||($.append({type:"task-failed",taskName:_,error:nt.message??String(nt),timestamp:new Date().toISOString()}),k());}).finally(()=>{f.delete(Q);});f.add(Q);}}function y(h){let O=u.config.tasks[h].requires??[],G=new Map;for(let[_,B]of Object.entries(u.config.tasks))for(let J of B.provides??[])G.set(J,_);let V={};for(let _ of O){let B=G.get(_);B?V[_]=u.state.tasks[B]?.data:V[_]=void 0;}return V}async function R(h,w,O){let G=u.config.tasks[h],V=G.taskHandlers??[],_=y(h);for(let B of V){let J=C.get(B);if(!J)throw new Error(`Handler '${B}' not found in registry (task '${h}')`);let M={nodeId:h,state:_,taskState:u.state.tasks[h],config:G,callbackToken:w,update:O};if(await J(M)==="task-initiate-failure")throw new Error(`Handler '${B}' returned task-initiate-failure (task '${h}')`)}}function A(h){let O=u.config.tasks[h]?.taskHandlers;if(!O||O.length===0)return;$.append({type:"task-started",taskName:h,timestamp:new Date().toISOString()}),k();let G=$e(h),V=R(h,G).catch(_=>{c||($.append({type:"task-failed",taskName:h,error:_.message??String(_),timestamp:new Date().toISOString()}),k());}).finally(()=>{f.delete(V);});f.add(V);}return {push(h){c||(h.type==="task-completed"&&h.data&&!h.dataHash&&(h={...h,dataHash:le(h.data)}),s.append(h),k());},pushAll(h){if(!c){for(let w of h)w.type==="task-completed"&&w.data&&!w.dataHash?s.append({...w,dataHash:le(w.data)}):s.append(w);k();}},resolveCallback(h,w,O){if(c)return;let G=_n(h);if(!G)return;let{taskName:V}=G;if(u.config.tasks[V]){if(O&&O.length>0)s.append({type:"task-failed",taskName:V,error:O.join("; "),timestamp:new Date().toISOString()});else {let _=w&&Object.keys(w).length>0?le(w):void 0;s.append({type:"task-completed",taskName:V,data:w,dataHash:_,timestamp:new Date().toISOString()});}k();}},addNode(h,w){c||(s.append({type:"task-upsert",taskName:h,taskConfig:w,timestamp:new Date().toISOString()}),k());},removeNode(h){c||(s.append({type:"task-removal",taskName:h,timestamp:new Date().toISOString()}),k());},addRequires(h,w){c||(s.append({type:"node-requires-add",nodeName:h,tokens:w,timestamp:new Date().toISOString()}),k());},removeRequires(h,w){c||(s.append({type:"node-requires-remove",nodeName:h,tokens:w,timestamp:new Date().toISOString()}),k());},addProvides(h,w){c||(s.append({type:"node-provides-add",nodeName:h,tokens:w,timestamp:new Date().toISOString()}),k());},removeProvides(h,w){c||(s.append({type:"node-provides-remove",nodeName:h,tokens:w,timestamp:new Date().toISOString()}),k());},registerHandler(h,w){C.set(h,w);},unregisterHandler(h){C.delete(h);},retrigger(h){c||u.config.tasks[h]&&(s.append({type:"task-restart",taskName:h,timestamp:new Date().toISOString()}),k());},retriggerAll(h){if(!c){for(let w of h)u.config.tasks[w]&&s.append({type:"task-restart",taskName:w,timestamp:new Date().toISOString()});k();}},snapshot(){return qt(u)},getState(){return u},getSchedule(){return Gt(u)},async waitForHandlers(){f.size>0&&await Promise.allSettled([...f]);},async dispose(h){h?.wait&&f.size>0&&await Promise.allSettled([...f]),c=true;}}}var Tn=createRequire(import.meta.url);Tn("./jsonata-sync.cjs");var On=createRequire(import.meta.url),ne=On("./jsonata-sync.cjs"),Pe=ne;function De(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 Le(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 jn(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 ne(o.expr).evaluate(r);Le(t.computed_values,o.bindTo,s),r.computed_values=t.computed_values;}catch{}return t}function Nn(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 u=Pe(s.expr).evaluate(r);Le(t.computed_values,s.bindTo,u),r.computed_values=t.computed_values;}catch(u){let c=u instanceof Error?u.message:String(u);o.push({bindTo:s.bindTo,error:c});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function $n(t,e,n){let r={...n??{},card_data:e.card_data??{},requires:e.requires??{},fetched_sources:e._sourcesData??{},computed_values:e.computed_values??{}};return ne(t).evaluate(r)}function Fn(t,e){return e.startsWith("fetched_sources.")?De(t._sourcesData??{},e.slice(16)):De(t,e)}var Be=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Dn=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Bn(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))Dn.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,u)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${u}]: must be an object`);else {let c=s;typeof c.bindTo!="string"||!c.bindTo?e.push(`source_defs[${u}]: missing required "bindTo" property`):(r.has(c.bindTo)&&e.push(`source_defs[${u}]: bindTo "${c.bindTo}" is not unique across source_defs`),r.add(c.bindTo)),typeof c.outputFile!="string"||!c.outputFile?e.push(`source_defs[${u}]: missing required "outputFile" property`):(o.has(c.outputFile)&&e.push(`source_defs[${u}]: outputFile "${c.outputFile}" is not unique across source_defs`),o.add(c.outputFile)),c.optionalForCompletionGating!=null&&typeof c.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${u}]: 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`):Be.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...Be].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 Pn(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,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=await ne(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function Ln(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,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=Pe(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}})}var Mt={run:jn,runSync:Nn,eval:$n,resolve:Fn,validate:Bn,enrichSources:Pn,enrichSourcesSync:Ln};function pe(t){return JSON.stringify(t)}function ge(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}function re(t,e){function n(){return t.readIndex()??{}}function r(o,s,u){let c=String(s||"").split(".").filter(Boolean);if(c.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let f={...o},C=f;for(let $=0;$<c.length-1;$++){let v=c[$],F=C[v],k=F&&typeof F=="object"&&!Array.isArray(F)?{...F}:{};C[v]=k,C=k;}return C[c[c.length-1]]=u,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,u]of Object.entries(n())){if(!t.cardExists(u.key))continue;let c=t.readCard(u.key);c?o.push(c):e?.(`[card-store] could not read card "${s}" at key "${u.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,u]of Object.entries(n()))o[s]=u.checksum;return o},changedSince(o){let s=n(),u=[];for(let[c,f]of Object.entries(s))o[c]!==f.checksum&&u.push(c);for(let c of Object.keys(o))s[c]||u.push(c);return u},validateUpsert(o,s){let u=n(),c=u[o],f=Object.entries(u).find(([,C])=>C.key===s);return c&&c.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${c.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,u){let c=n(),f=u??c[o]?.key??t.defaultCardKey(o),C=t.writeCard(f,s);c[o]={key:f,checksum:C,updatedAt:new Date().toISOString()},t.writeIndex(c);},patchCard(o,s,u){let c=n(),f=c[o];if(!f||!t.cardExists(f.key))throw new Error(`card "${o}" not found`);let C=t.readCard(f.key);if(!C||typeof C!="object"||Array.isArray(C))throw new Error(`card "${o}" is not patchable`);let $=r(C,s,u),v=t.writeCard(f.key,$);c[o]={key:f.key,checksum:v,updatedAt:new Date().toISOString()},t.writeIndex(c);},removeCard(o){let s=n();s[o]&&(delete s[o],t.writeIndex(s));},readIndex(){return n()}}}function me(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 u=e(o);t.write(`${n}/.staged/${s}/${r}`,u);},commitSourceData(n,r,o){let s=`${n}/.staged/${o}/${r}`,u=t.read(s);return u==null?false:(t.write(`${n}/${r}`,u),t.remove(s),true)},hasSource(n,r){return t.exists(`${n}/${r}`)}}}function Ve(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 Me(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(u){let c=u instanceof Error?u.message:String(u);try{e(s,c);}catch{}}t.delete(n);}}}}var oe="v1",Nt="board/graph",Ue="board/lastJournalProcessedId";function qe(t){return `cards/${t}/runtime`}function Ke(t){return {readRuntime(e){return t.read(qe(e))??{_sources:{}}},writeRuntime(e,n){t.write(qe(e),n);}}}function qn(t,e){let n={...t};for(let r of e.deleteKeys)delete n[r];return {...n,...e.shallowMerge}}function He(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,n){if(n.schemaVersion!==oe)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=qn(r.values,n);return {ok:true,newVersion:t.writeValues(e,o,n.deleteKeys)}}}}function Je(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 ge(n.trim())},writeTaskExecutorRef(n){t.write("task-executor",pe(n));},readChatHandlerRef(){let n=e("chat-handler");if(n?.trim())return ge(n.trim())},writeChatHandlerRef(n){t.write("chat-handler",pe(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 ze(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 Gn(t){return t?.lastRequestedAt?!t.lastFetchedAt||t.lastFetchedAt<t.lastRequestedAt:false}function Vn(t,e){return t?.lastRequestedAt?Gn(t)?"in-flight":!t.lastFetchedAt||t.lastFetchedAt<e?"dispatch":"idle":"dispatch"}function Mn(t,e){let n={...t,lastFetchedAt:e};return delete n.lastError,n}function Ge(t,e){let n={...t,lastError:e};return delete n.lastFetchedAt,n}function se(t,e){let n=e.state.tasks,r=e.config.tasks,o=Object.keys(n),s=Gt(e),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},c=new Map;for(let g of s.pending)c.set(g.taskName,g.waitingOn);for(let g of s.unresolved)c.set(g.taskName,g.missingTokens);for(let g of s.blocked)c.set(g.taskName,g.failedTokens);let f=new Map;for(let[g,y]of Object.entries(r))for(let R of y.requires??[]){let A=f.get(R)??[];A.push(g),f.set(R,A);}let C=o.sort().map(g=>{let y=n[g],R=r[g]??{requires:[],provides:[]};y.status==="completed"?u.completed+=1:y.status==="failed"?u.failed+=1:y.status==="in-progress"&&(u.in_progress+=1);let A=R.requires??[],h=R.provides??[],w=Object.keys(y.data??{}).sort(),O=A.filter(M=>e.state.availableOutputs.includes(M)),G=A.filter(M=>!e.state.availableOutputs.includes(M)),V=c.get(g)??G,_=new Set;for(let M of h)for(let Y of f.get(M)??[])Y!==g&&_.add(Y);let B=y.failedAt,J=y.error?{message:y.error,code:"TASK_FAILED",at:B,source:"task-runtime"}:void 0;return {name:g,status:y.status,error:J,requires:A,requires_satisfied:O,requires_missing:G,provides_declared:h,provides_runtime:w,blocked_by:V,unblocks:Array.from(_).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}}});u.pending=s.pending.length,u.blocked=s.blocked.length,u.unresolved=s.unresolved.length;let $=C.map(g=>({name:g.name,fanOut:g.unblocks.length})).sort((g,y)=>y.fanOut-g.fanOut||g.name.localeCompare(y.name)),v=$.length>0?$[0]:{name:null,fanOut:0},F=new Set;for(let g of Object.values(r))for(let y of g.requires??[])F.add(y);let k=0;for(let[g,y]of Object.entries(r)){let R=(y.requires??[]).length===0,h=(y.provides??[]).some(w=>(f.get(w)??[]).some(O=>O!==g));R&&!h&&(k+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:u.completed,eligible:s.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:k,topology:{edge_count:Array.from(F).length,max_fan_out_card:v.name,max_fan_out:v.fanOut}},cards:C}}function Un(){return new Date().toISOString()}function Ye(t,e,n,r,o,s,u){return async c=>{let f=[],C=n.cardStore.readCard(c.nodeId);if(!C)return "task-initiate-failure";let $=C.id,v=C.card_data??{},F=C.source_defs??[],k=F.filter(P=>P.optionalForCompletionGating!==true),g=n.cardRuntimeStore.readRuntime($),y=false,R=()=>{y&&(n.cardRuntimeStore.writeRuntime($,g),y=false);},A=P=>({...g._sources[P]??{}}),h=(P,L)=>{g._sources[P]=L,y=true;},w=c.taskState?.executionCount??0,O=g._lastExecutionCount;if(typeof O=="number"&&O!==w&&(g._sources={},y=true),O!==w&&(g._lastExecutionCount=w,y=true),c.update){let P=c.update,L=P.outputFile;if(L){let S=A(L);if(P.failure)h(L,Ge(S,P.reason??"unknown"));else {let l=P.rqt;if(!S.lastFetchedAt||l>S.lastFetchedAt){let x=typeof P.deliveryToken=="string"?P.deliveryToken:void 0,N=false;x&&(N=n.fetchedSourcesStore.commitSourceData($,L,x)),N?h(L,Mn(S,l)):h(L,Ge(S,`source delivery commit failed for ${L} token=${String(x)}`));}}R();}}let G={};for(let P of F)if(P.outputFile){let L=n.fetchedSourcesStore.readSourceData($,P.outputFile);L!==null&&(G[P.bindTo]=L);}let V={};for(let[P,L]of Object.entries(c.state??{}))if(L!==null&&typeof L=="object"&&!Array.isArray(L)){let S=L[P];V[P]=S!==void 0?S:L;}else V[P]=L;let _={id:$,card_data:{...v},requires:V,source_defs:F,compute:C.compute};_._sourcesData=G,C.compute&&Mt.runSync(_,{sourcesData:G}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))($,_.computed_values??{});let B={...C},J=Mt.enrichSourcesSync(Array.isArray(C.source_defs)?C.source_defs:void 0,{card_data:C.card_data,requires:V}),M=t.value;B.source_defs=Array.isArray(J)?J.map(P=>({...P,boardDir:typeof P.boardDir=="string"&&P.boardDir?P.boardDir:M})):J;let Y=Un(),Q=c.update?void 0:Y,nt=k.filter(P=>{let L=P.outputFile;if(typeof L!="string"||!L)return true;let S=A(L);Q&&(S={...S,queueRequestedAt:Q},h(L,S));let l=S.queueRequestedAt??S.lastRequestedAt??Y,x=Vn(S,l);return x==="in-flight"?false:x==="dispatch"});if(R(),nt.length>0){let P=false,L=Y;for(let S of nt){let l=S.outputFile;if(typeof l!="string"||!l)continue;let x=A(l),N=x.queueRequestedAt??Y;h(l,{...x,lastRequestedAt:N}),L=N,P=true;}return P&&R(),P&&(f.push({taskKind:"source-fetch",payload:{boardRef:kt(t),enrichedCard:B,callbackToken:c.callbackToken,rqt:L}}),n.executionRequestStore.appendEntries(e,f)),"task-initiated"}let _t=C.provides??[],Et={};for(let{bindTo:P,ref:L}of _t)Et[P]=Mt.resolve(_,L);return (u??n.outputStore.writeDataObjects.bind(n.outputStore))(Et),F.filter(P=>{if(P.optionalForCompletionGating!==true)return false;let L=A(P.outputFile);return !L.lastRequestedAt||!L.lastFetchedAt?true:L.lastFetchedAt<=L.lastRequestedAt}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:kt(t),enrichedCard:B,callbackToken:c.callbackToken,rqt:Y}}),r(c.nodeId,Et),f.length>0&&n.executionRequestStore.appendEntries(e,f),"task-initiated"}}var he={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Xe(t){return {[Nt]:t.graph,[Ue]:t.lastDrainedJournalId}}function We(t){let e=t[Nt],n=t[Ue];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${Nt}`);return {graph:e,lastDrainedJournalId:typeof n=="string"?n:""}}function Qe(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 rt(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function tt(t){return {status:"fail",error:t}}function ot(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function Kn(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 tn(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 ae(t){try{let e=JSON.parse(tn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Hn(t){return Kn(JSON.stringify(t))}function Ze(t){try{let e=JSON.parse(tn(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function lt(){return new Date().toISOString()}function en(t,e){let n=e.onWarn??(()=>{}),r=kt(t);function o(S){if(S.length!==0)try{let l=e.publishBoardChangeNotifications?.(S);l&&typeof l.catch=="function"&&l.catch(x=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${x instanceof Error?x.message:String(x)}`));}catch(l){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${l instanceof Error?l.message:String(l)}`);}}function s(){let S=c().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(x){l.write("_index",x);},readCard(x){return l.read(x)},writeCard(x,N){return l.write(x,N),e.hashFn(N)},cardExists(x){return l.read(x)!==null},defaultCardKey(x){return x}}}let u={readValues(S){let l=e.kvStorage("state-snapshot"),x=l.listKeys().sort();if(x.length===0)return {version:null,values:{}};let N={};for(let z of x)N[z]=l.read(z);return {version:e.hashFn(N),values:N}},writeValues(S,l,x){let N=e.kvStorage("state-snapshot");for(let z of x)N.delete(z);for(let[z,Z]of Object.entries(l))N.write(z,Z);return e.hashFn(l)}},c=()=>Je(e.kvStorage("config")),f=()=>He(u),C=()=>Ve(e.journalAdapter()),$=()=>re(s(),n),v=()=>{let S=c().readOutputsStoreRef();if(!S)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return ze(e.kvStorageForRef(S))};function F(){return !!f().readSnapshot(t.value).values[Nt]}function k(){let S=f().readSnapshot(t.value);if(!S.values[Nt])throw new Error(`Board not initialized at ${t.value}`);return We(S.values)}function g(S,l){let x=f().commitSnapshot(t.value,{schemaVersion:oe,expectedVersion:l,commitId:e.genId(),committedAt:lt(),deleteKeys:[],shallowMerge:Xe(S)});if(!x.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${l??"null"} current=${x.currentVersion??"null"}`)}function y(S){C().appendEvent(S);}async function R(){let S=(E,D)=>{let X=E.payload,gt=(X?.enrichedCard??{}).id??X?.cardId??"unknown";y({type:"task-failed",taskName:gt,error:D,timestamp:lt()});},l=Me(e.kvStorage("execution-requests"),S),x=Ke(e.kvStorage("card-runtime")),N=me(e.blobStorage("sources"),E=>e.resolveBlob(E)),z=new Map,Z={readRuntime(E){return z.get(E)??x.readRuntime(E)},writeRuntime(E,D){z.set(E,D);}},pt=[],st=new Map,ct={readSourceData(E,D){let X=`${E}/${D}`;return st.has(X)?st.get(X):N.readSourceData(E,D)},ingestSourceDataStaged(E,D,X,wt){N.ingestSourceDataStaged(E,D,X,wt);},commitSourceData(E,D,X){let wt=`${E}/.staged/${X}/${D}`,a=e.blobStorage("sources").read(wt);if(a==null)return false;let i=`${E}/${D}`,d=a.trim();try{st.set(i,JSON.parse(d));}catch{st.set(i,d);}return pt.push({cardId:E,outputFile:D,deliveryToken:X}),true},hasSource(E,D){let X=`${E}/${D}`;return st.has(X)?true:N.hasSource(E,D)}},at={cardStore:$(),cardRuntimeStore:Z,fetchedSourcesStore:ct,outputStore:v(),executionRequestStore:l},ht=k(),yt=ee(ht.graph),{events:St,newCursor:bt}=C().readEntriesAfterCursor(ht.lastDrainedJournalId),K=[],Ct=[],Dt=[],Bt=new Map,Ht=(E,D)=>{K.push({type:"task-completed",taskName:E,data:D,timestamp:lt()});},Pt=(E,D)=>y({type:"task-failed",taskName:E,error:D,timestamp:lt()}),Tt=Fe(yt,{handlers:{"card-handler":Ye(t,bt,at,Ht,Pt,(E,D)=>{Ct.push({cardId:E,values:D});},E=>{Dt.push(E);})}});for(K=St;K.length>0;){let E=K;K=[];for(let D of E)if(D.type==="task-restart"){let X=at.cardStore.readCard(D.taskName);X&&Bt.set(D.taskName,X);}Tt.pushAll(E),await Tt.waitForHandlers();}let Lt=Tt.getState();await Tt.dispose({wait:true});let Yt=f().readSnapshot(t.value).version;g({lastDrainedJournalId:bt,graph:qt(Lt)},Yt);for(let{cardId:E,values:D}of Ct)at.outputStore.writeComputedValues(E,D);for(let E of Dt)at.outputStore.writeDataObjects(E);for(let[E,D]of z)x.writeRuntime(E,D);for(let{cardId:E,outputFile:D,deliveryToken:X}of pt)N.commitSourceData(E,D,X);let Rt;try{Rt=se(r,Lt),at.outputStore.writeStatusSnapshot(Rt);}catch(E){n(`[board-live-cards-public] status publish failed: ${E instanceof Error?E.message:String(E)}`);}let It=[];for(let{cardId:E,values:D}of Ct)It.push({kind:"computed_values",cardId:E,values:D});for(let E of Dt)for(let[D,X]of Object.entries(E))D&&It.push({kind:"data_object",key:D,payload:X});for(let[E,D]of Bt)It.push({kind:"card_refreshed",cardId:E,card:D});Rt!==void 0&&It.push({kind:"status",status:Rt}),o(It);let ue=c().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:kt({kind:"built-in",value:"source-cli-task-executor"})};l.dispatchEntriesForJournalId(bt,E=>{if(E.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${E.taskKind}" \u2014 skipping`);return}let D=E.payload,X=D.enrichedCard?.id??"unknown",wt=D.enrichedCard?.source_defs??[];for(let gt of wt){if(!gt.outputFile){n(`[dispatch] source "${gt.bindTo}" has no outputFile \u2014 skipping`);continue}let a=Hn({cbk:D.callbackToken,rg:t.value,br:kt(t),cid:X,b:gt.bindTo,d:gt.outputFile,cs:void 0,rqt:D.rqt});e.dispatchExecution(ue,{source_def:gt,base_ref:kt(t),callback:{token:a,via:e.selfRef}}).catch(i=>Pt(X,i instanceof Error?i.message:String(i)));}});}async function A(){try{let S=()=>{let x=k(),{events:N}=C().readEntriesAfterCursor(x.lastDrainedJournalId);N.length<=0||(A(),e.requestProcessAccumulated?.());},l=await Ce(e.lock,R,S);return rt({ran:l!==!1})}catch(S){return ot(S)}}function h(S){try{let l=S.params?.cardStoreRef;if(!l)return tt("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!F()){let Z=te(he);g({lastDrainedJournalId:"",graph:qt(Z)},null);}let x=S.params?.outputsStoreRef;if(!x)return tt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let N=c();N.writeCardStoreRef(l),N.writeOutputsStoreRef(x);let z=S.body??{};z["task-executor-ref"]&&N.writeTaskExecutorRef(z["task-executor-ref"]),z["chat-handler-ref"]&&N.writeChatHandlerRef(z["chat-handler-ref"]);try{v().writeStatusSnapshot(se(r,ee(k().graph)));}catch{}return rt()}catch(l){return ot(l)}}function w(S){try{let l=v().readStatusSnapshot();if(!l){l=se(r,ee(k().graph));try{v().writeStatusSnapshot(l);}catch{}}return rt(l)}catch(l){return ot(l)}}function O(S){try{let l=S.params?.id;return l?(y({type:"task-removal",taskName:l,timestamp:lt()}),A(),rt()):tt("removeCard requires params.id")}catch(l){return ot(l)}}function G(S){try{let l=S.params?.id;return l?(y({type:"task-restart",taskName:l,timestamp:lt()}),A(),rt()):tt("retrigger requires params.id")}catch(l){return ot(l)}}async function V(S){return A()}function _(S){try{let l=S.params?.cardId,x=S.params?.all,N=!!S.params?.restart;if(!l&&!x)return tt("upsertCard requires --card-id <id> or --all");let z=x?$().readAllCards().map(Z=>Z.id):[l];for(let Z of z)if(!$().readCard(Z))return tt(`Card "${Z}" not found in board at ${t.value}`);for(let Z of z){let pt=$().readCard(Z),st=Qe(pt),ct=e.hashFn(st),at=e.kvStorage("card-upsert"),ht=at.read(Z),yt=ht?.taskConfigHash!==ct;if(!(!yt&&!N)){if(yt){let St=ht?.blobRef??$().readCardKey(Z)??Z;y({type:"task-upsert",taskName:Z,taskConfig:st,timestamp:lt()}),at.write(Z,{blobRef:St,taskConfigHash:ct,updatedAt:lt()});}N&&y({type:"task-restart",taskName:Z,timestamp:lt()});}}return A(),rt()}catch(l){return ot(l)}}function B(S){try{let l=S.params?.token;if(!l)return tt("taskFailed requires params.token");let x=S.params?.error??"unknown error",N=ae(l);return N?(y({type:"task-failed",taskName:N.taskName,error:x,timestamp:lt()}),A(),rt()):tt("Invalid callback token")}catch(l){return ot(l)}}function J(S){try{let l=S.params?.token;if(!l)return tt("taskProgress requires params.token");let N=(S.body??{}).update??{},z=ae(l);return z?(y({type:"task-progress",taskName:z.taskName,update:N,timestamp:lt()}),A(),rt()):tt("Invalid callback token")}catch(l){return ot(l)}}function M(S){try{let l=S.params?.token,x=S.params?.ref;if(!l)return tt("sourceDataFetched requires params.token");if(!x)return tt("sourceDataFetched requires params.ref");let N=Ze(l);if(!N)return tt("Invalid source token");let{cbk:z,cid:Z,b:pt,d:st,cs:ct,rqt:at}=N,ht=me(e.blobStorage("sources"),K=>e.resolveBlob(K)),yt=e.genId();ht.ingestSourceDataStaged(Z,st,be(x),yt);let St=ae(z);if(!St)return tt("Invalid callback token embedded in source token");let bt=lt();return y({type:"task-progress",taskName:St.taskName,update:{bindTo:pt,outputFile:st,fetchedAt:bt,deliveryToken:yt,sourceChecksum:ct,rqt:at},timestamp:bt}),A(),rt()}catch(l){return ot(l)}}function Y(S){try{let l=S.params?.token,x=S.params?.reason??"unknown";if(!l)return tt("sourceDataFetchFailure requires params.token");let N=Ze(l);if(!N)return tt("Invalid source token");let{cbk:z,b:Z,d:pt,cs:st}=N,ct=ae(z);return ct?(y({type:"task-progress",taskName:ct.taskName,update:{bindTo:Z,outputFile:pt,failure:!0,reason:x,sourceChecksum:st},timestamp:lt()}),A(),rt()):tt("Invalid callback token embedded in source token")}catch(l){return ot(l)}}function Q(S){try{let l=c().readCardStoreRef();return l?rt({storeRef:l}):tt(`Board at ${t.value} has no card store configured`)}catch(l){return ot(l)}}function nt(S){try{let l=c().readOutputsStoreRef();return l?rt({storeRef:l}):tt(`Board at ${t.value} has no outputs store configured`)}catch(l){return ot(l)}}function _t(S){try{let l=S.params?.key;if(!l)return tt("getConfig requires params.key");let x=c(),N;switch(l){case "task-executor":N=x.readTaskExecutorRef()??null;break;case "chat-handler":N=x.readChatHandlerRef()??null;break;case "card-store-ref":N=x.readCardStoreRef();break;case "outputs-store-ref":N=x.readOutputsStoreRef();break;default:return tt(`getConfig: unknown key "${l}"`)}return rt({value:N})}catch(l){return ot(l)}}function Et(S){try{let l=S.params?.key;if(!l)return tt("getOutputsDataObject requires params.key");let x=v().readDataObject(l);return rt(x)}catch(l){return ot(l)}}function Kt(S){try{return rt(v().readAllDataObjects())}catch(l){return ot(l)}}function P(S){try{let l=S.params?.key;if(!l)return tt("getOutputsComputedValues requires params.key");let x=v().readComputedValues(l);return rt(x)}catch(l){return ot(l)}}function L(S){try{return rt(v().readAllComputedValues())}catch(l){return ot(l)}}return {init:h,status:w,getCardStoreRef:Q,getOutputsStoreRef:nt,getConfig:_t,getOutputsDataObject:Et,getAllOutputsDataObjects:Kt,getOutputsComputedValues:P,getAllOutputsComputedValues:L,removeCard:O,retrigger:G,processAccumulatedEvents:V,upsertCard:_,taskFailed:B,taskProgress:J,sourceDataFetched:M,sourceDataFetchFailure:Y}}function nn(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 u=t.readCard(s);return u?e({cards:[u]}):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 u=Array.isArray(s)?s:[s];for(let c of u){if(typeof c.id!="string")return n("each card must have a string `id` field");t.writeCard(c.id,c);}return e({count:u.length})}catch(s){return r(s)}},del(o){try{let s=o.body?.ids??[],u=o.params?.id,c=u?[...s,u]:s;if(c.length===0)return n("del requires body.ids (string[]) or params.id");for(let f of c)t.removeCard(f);return e({count:c.length})}catch(s){return r(s)}},patch(o){try{let s=o.params?.id,u=o.params?.path;if(!s)return n("patch requires params.id");if(!u)return n("patch requires params.path");let c=o.body,f=c&&Object.prototype.hasOwnProperty.call(c,"value")?c.value:o.body;return t.patchCard(s,u,f),e({count:1})}catch(s){return r(s)}}}}var ie=".artifacts-index.json";function rn(){return new Date().toISOString()}function on(t){return new TextEncoder().encode(t).byteLength}function Ut(t){let e=t.read(ie);if(!e)return {entries:{}};try{let n=JSON.parse(e);if(n&&n.entries&&typeof n.entries=="object")return n}catch{}return {entries:{}}}function ye(t,e){t.write(ie,JSON.stringify(e,null,2));}function Jn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function sn(t,e,n){t.entries[e]={key:e,size:n.size,updatedAt:n.updatedAt,contentType:n.contentType};}function ke(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function zn(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 Yn(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Xn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Wn(t){let e=zn(t),n=e.lastIndexOf(".");return n<=0||n===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,n),ext:e.slice(n)}}function Qn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function Se(t){function e(n){let r=t.stat?Jn(t.stat(n)):null;if(r)return r;let s=Ut(t).entries[n];if(s)return {...s};if(!t.exists(n))return null;let u=t.read(n);return u===null?{key:n}:{key:n,size:on(u)}}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??rn(),s.size=s.size??on(r);let u=Ut(t);return sn(u,n,s),ye(t,u),s},putBytes(n,r,o="application/octet-stream"){if(t.writeBytes)t.writeBytes(n,r);else {let c=JSON.stringify({__kind:"bytes-array",data:[...r]});t.write(n,c);}let s=e(n)??{key:n};s.contentType=o,s.updatedAt=s.updatedAt??rn(),s.size=s.size??r.byteLength;let u=Ut(t);return sn(u,n,s),ye(t,u),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===ie)continue;let u=e(s)??{key:s};r.set(s,u);}let o=Ut(t);for(let[s,u]of Object.entries(o.entries))s===ie||n&&!s.startsWith(n)||r.has(s)||r.set(s,{...u});return [...r.values()].sort((s,u)=>s.key.localeCompare(u.key))},remove(n){t.remove(n);let r=Ut(t);delete r.entries[n],ye(t,r);}}}function an(t,e){let n=e?.indexFileName;function r(v){return `${v}/${n}`}function o(v){let F=t.getText(r(v));if(!F)return [];try{let k=JSON.parse(F);return Array.isArray(k)?k.filter(g=>g&&typeof g.stored_name=="string").map(g=>({serial:Number(g.serial||ke(String(g.stored_name))||0),role:String(g.role||"system").toLowerCase(),stored_name:String(g.stored_name),path:typeof g.path=="string"?g.path:`${v}/chats/${String(g.stored_name)}`,updated_at:typeof g.updated_at=="string"?g.updated_at:null})):[]}catch{return []}}function s(v,F){t.putText(r(v),JSON.stringify(F,null,2),"application/json; charset=utf-8");}function u(v){let F=o(v),k=0;for(let g of F){let y=Number(g.serial||0);Number.isFinite(y)&&y>k&&(k=y);}return k+1}function c(v,F){let k=o(v);k.push(F),s(v,k);}function f(v){let F=o(v),k=[];for(let g of F){let y=`${v}/${g.stored_name}`,R=t.getText(y);R!==null&&k.push({serial:Number(g.serial||ke(g.stored_name)||0),role:String(g.role||"system").toLowerCase(),text:R,path:typeof g.path=="string"?g.path:`${v}/chats/${g.stored_name}`,stored_name:g.stored_name,updated_at:g.updated_at||null});}return k.sort((g,y)=>g.serial-y.serial||g.stored_name.localeCompare(y.stored_name)),k}function C(v){let F=`${v}/`;for(let k of t.list(F))t.remove(k.key);}function $(v){let F=`${v}/`,k=t.list(F),g=0,y=0,R=false;for(let A of k){let h=A.key.slice(F.length);if(h===".processing"){R=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(h))continue;g+=1;let w=A.updatedAt?Number(new Date(A.updatedAt).getTime()||0):0;w>y&&(y=w);}return {count:g,latest_mtime_ms:y,processing:R}}return {indexKey:r,loadIndex:o,saveIndex:s,nextSerial:u,appendIndexRecord:c,readRecords:f,clear:C,readSignal:$}}function un(t){function e(o,s){let u=0,c=[];Array.isArray(s)&&c.push(...s);for(let f of t.list(`${o}/`))c.push(Qn(f.key));for(let f of c){let C=ke(f);Number.isFinite(C)&&C>u&&(u=C);}return u+1}function n(o,s,u){let c=Number(u?.maxLen||32),{stem:f,ext:C}=Wn(o),$=Xn(C),v=Yn(f),F=`${String(s).padStart(3,"0")}-`,k=$,g=c-F.length-k.length;g<1&&(k="",g=c-F.length);let y=v.slice(0,Math.max(1,g)),R=`${F}${y}${k}`;return R.length>c&&(R=R.slice(0,c).replace(/\.$/,"")),R}function r(o,s,u){let c=e(o,u?.seedNames),f=n(s,c,{maxLen:u?.maxLen});for(;t.exists(`${o}/${f}`);)c+=1,f=n(s,c,{maxLen:u?.maxLen});return f}return {nextSerial:e,buildStoredName:n,allocateStoredName:r}}function cn(){function t(o,s){if(!Array.isArray(o))return [];let u=[];for(let c of o){if(!c||typeof c!="object")continue;let f=c;typeof f.stored_name=="string"&&u.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 u}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function n(o,s){let u=e(o);if(s.length===0)return o.files=u,u;let c=new Set(u.map(f=>f.stored_name));for(let f of s)c.has(f.stored_name)||(u.push(f),c.add(f.stored_name));return o.files=u,u}function r(o,s,u){let c=e(o);if(!Number.isInteger(s)||s<0||s>=c.length)return {ok:false,reason:"index_out_of_range"};let f=c[s];return !f||!f.stored_name?{ok:false,reason:"missing_stored_name"}:u&&u!==f.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:f}}return {read:e,normalizeIncoming:t,merge:n,resolve:r}}var dn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Zn=32;function tr(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function ln(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 fn(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)fn(t,r);return}n.kind==="status"&&ln(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 Wr(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),n={...dn,...t.corsHeaders||{}},r=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,u=t.notificationTransport||null,c=t.serverUrl||null,f=t.executionExtra||{},C=new Map,$=new Map,v=null;function F(a){let i=en(a.baseRef,a.boardAdapter),d=a.boardAdapter.kvStorageForRef(a.cardStoreRef),m=nn(re({readIndex:()=>d.read("_index"),writeIndex:I=>d.write("_index",I),readCard:I=>d.read(I),writeCard:(I,H)=>(d.write(I,H),I),cardExists:I=>d.read(I)!==null,defaultCardKey:I=>I},o.warn)),b=a.artifactsAdapter||a.boardAdapter,j=null,T=null;return {label:a.label,board:i,cardStore:m,get filesArtifacts(){return j??=Se(b.blobStorage("files"))},get chatsArtifacts(){return T??=Se(b.blobStorage("chats"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,inferenceAdapterRef:a.inferenceAdapterRef,notification:tr(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let k=t.boards.map(F),g=new Map;function y(a){return g.get(a)??0}function R(a){let i=k[y(a)];return {files:i?i.filesArtifacts:null,chats:i?i.chatsArtifacts:null}}function A(a){let i=R(a);return i.chats?an(i.chats,{indexFileName:".index.json"}):null}function h(a){let i=R(a);return i.files?un(i.files):null}function w(){return cn()}function O(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function G(a){if(!a||a.notificationTeardown||!u||!a.notifyRef)return;let i=await u.subscribe(a.notifyRef,d=>{fn(a.notification,d);let p=d.kind==="notification-batch"?d.notifications:[d];X(p);});a.notificationTeardown=i;}async function V(a){if(!a||a.initialized)return;let i={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 p=a.board.init({params:i,body:d});if(p.status!=="success")throw Object.assign(new Error(p.error||`init failed for ${a.label}`),{statusCode:500});if(await G(a),a.chatHandlerRef&&s.describe)try{let m=await s.describe(a.chatHandlerRef);m&&m.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${m.kind}", expected "chat-handler" for ${a.label}`):m&&o.info(`[init] chat-handler validated: ${m.name} (protocol ${m.protocolVersion}) for ${a.label}`);}catch(m){o.warn(`[init] chat-handler describe failed for ${a.label}: ${m?.message||String(m)}`);}a.initialized=true;}function _(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let i=[],d=a.board.status({});d.status==="success"&&d.data!=null&&ln(d.data)&&i.push({kind:"status",status:d.data});let p=a.board.getAllOutputsDataObjects({});if(p.status==="success"&&p.data!=null)for(let[b,j]of Object.entries(p.data))b&&i.push({kind:"data_object",key:b,payload:j});let m=a.board.getAllOutputsComputedValues({});if(m.status==="success"&&m.data!=null)for(let[b,j]of Object.entries(m.data))b&&i.push({kind:"computed_values",cardId:b,values:j});i.length>0&&a.boardAdapter.publishBoardChangeNotifications(i);}function B(a,i){if(!a||a.cardsBootstrapped)return;let d=a.cardStore.get({}),p=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let m of p)typeof m.id=="string"&&(g.set(m.id,i),a.board.upsertCard({params:{cardId:m.id}}));a.cardsBootstrapped=true;}async function J(){for(let a of k)await V(a);}async function M(){await J();for(let a=0;a<k.length;a++)_(k[a]),B(k[a],a);}function Y(a){return k[y(a)]??null}function Q(a){let i=Y(a);if(!i)return null;let d=i.cardStore.get({params:{id:a}});if(d.status!=="success")return null;let p=Array.isArray(d.data?.cards)?d.data.cards:[];return p.length>0?p[0]:null}function nt(){let a=d=>{if(!d||!d.cardStore)return [];let p=d.cardStore.get({});return p.status!=="success"||!Array.isArray(p.data?.cards)?[]:p.data.cards},i=[];for(let d of k)i.push(...a(d));return i}function _t(){let a=k.map(b=>{try{let T=b.boardAdapter.kvStorageForRef(b.outputsStoreRef).read("status");if(T!=null)return T}catch{}return b.notification.status}).filter(Boolean);if(a.length===0)return null;if(a.length===1)return a[0];let i=[],d=["completed","eligible","pending","blocked","unresolved","failed","in_progress","orphan_cards"],p={};for(let b of d)p[b]=0;for(let b of a){let j=b,T=Array.isArray(j.cards)?j.cards:[];i.push(...T);for(let I of d)p[I]+=Number(j?.summary?.[I]||0);}let m=a[0];return {...m,cards:i,summary:{...m.summary||{},card_count:i.length,...p}}}function Et(){let a={},i=d=>{for(let[p,m]of Object.entries(d.notification.computedValues)){let b=d.notification.cards[p];a[p]={schema_version:"v1",card_id:p,card_data:b?.card_data??{},computed_values:m??{}};}};for(let d of k)i(d);return a}function Kt(){let a={};for(let i of k)Object.assign(a,i.notification.dataObjects||{});return a}function P(a){let i=O(a),d=A(a);return d?d.readSignal(i):{count:0,latest_mtime_ms:0,processing:false}}function L(){let a=nt(),i=Et(),d=Kt(),p={};for(let b of a){if(!b?.id)continue;let j=b.id,T=i[j]||{},I={...T.card_data&&typeof T.card_data=="object"?T.card_data:b.card_data&&typeof b.card_data=="object"?b.card_data:{}};p[j]={schema_version:T.schema_version||"v1",card_id:T.card_id||j,card_data:I,computed_values:T.computed_values&&typeof T.computed_values=="object"?T.computed_values:{}};}let m={};for(let b of a){if(!b?.id)continue;let j=b.id;try{let T=P(j),I=at(j);(I.length>0||T.processing)&&(m[j]={messages:I.map(H=>({role:String(H.role||"system"),text:String(H.text||""),files:Array.isArray(H.files)?H.files:[]})),receiving:!1,processing:!!T.processing});}catch{}}return {boardId:r,cardDefinitions:a,statusSnapshot:_t(),dataObjectsByToken:d,cardRuntimeById:p,cardChatsByCardId:m}}function S(a,i,d){let p=d?.syncBoard!==false,m=Y(a);if(!m)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let b=Q(a);if(!b)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let j=i(b)||b,T=m.cardStore.set({body:j});if(T.status!=="success")throw Object.assign(new Error(T.error||`Failed to persist card: ${a}`),{statusCode:500});if(p){let I=m.board.upsertCard({params:{cardId:a,restart:true}});if(I.status!=="success")throw Object.assign(new Error(I.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function l(a,i){S(a,i,{syncBoard:true});}function x(a,i){S(a,i,{syncBoard:false});}function N(a,i){l(a,d=>{if(!i||typeof i!="object"||Object.keys(i).length===0)return d;function p(m,b,j){let T=String(b||"").split(".").filter(Boolean);if(!T.length)return;let I=m;for(let H=0;H<T.length-1;H++){let W=T[H];(!I[W]||typeof I[W]!="object")&&(I[W]={}),I=I[W];}I[T[T.length-1]]=j;}if(i.fieldValues!==void 0&&i.fieldValues!==null){let m=null,b=d.view;if(b&&Array.isArray(b.elements)){for(let j of b.elements)if(j?.data&&j.data.writeTo){m=j.data.writeTo;break}}m?p(d,m,i.fieldValues):typeof i.fieldValues=="object"&&!Array.isArray(i.fieldValues)&&(d.card_data={...d.card_data||{},...i.fieldValues});}else {if(Array.isArray(i._stagedFiles)&&i._stagedFiles.length>0)return d;for(let[m,b]of Object.entries(i))m!=="_stagedFiles"&&(b!==null&&typeof b=="object"&&!Array.isArray(b)&&d[m]!==null&&typeof d[m]=="object"&&!Array.isArray(d[m])?d[m]={...d[m],...b}:d[m]=b);}return d});}function z(a){let i=String(a||"").match(/^(\d+)[-_]/);return i?parseInt(i[1],10):0}function Z(a){let i=String(a||"").trim();if(!i)return "upload.bin";let d=Math.max(i.lastIndexOf("/"),i.lastIndexOf("\\"));return (d>=0?i.slice(d+1):i)||"upload.bin"}function pt(a){let i=O(a),d=A(a);d&&d.clear(i);}function st(a,i){let d=O(a),p=A(a),m=p?p.nextSerial(d):1,b=String(i||"system").toLowerCase().replace(/[^a-z0-9_-]/g,"_")||"system";return `${String(m).padStart(3,"0")}_${b}.txt`}function ct(a,i,d,p){let m=new Date().toISOString(),b=O(a),j=R(a),T=st(a,i||"system"),I=`${b}/${T}`,H=[],W=typeof d=="string"?d.trim():"";W&&H.push(W);let it=Array.isArray(p)?p:[];if(it.length){H.length&&H.push(""),H.push("files:");for(let q of it){if(!q||typeof q!="object")continue;let et=typeof q.name=="string"?q.name:"file",ut=typeof q.stored_name=="string"?q.stored_name:"";H.push(ut?`- ${et} -> ${ut}`:`- ${et}`);}}j.chats&&j.chats.putText(I,`${H.join(`
|
|
2
|
-
|
|
3
|
-
`);let mt=z(T),U=A(a);return U&&U.appendIndexRecord(b,{serial:mt,role:i||"system",stored_name:T,path:`${a}/chats/${T}`,updated_at:m}),{at:m,role:i||"system",text:W,files:it,path:`${a}/chats/${T}`}}function at(a){let i=O(a),d=A(a);return d?d.readRecords(i).map(p=>({...p,path:`${a}/chats/${p.stored_name}`})):[]}function ht(a){let i=[];try{let d=Q(a);if(!d)return i;let p=w().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let m of p)i.push(m.stored_name);}catch{}return i}function yt(a,i,d,p){let m=O(a),b=R(a),j=Z(i),T=h(a),I=T?T.allocateStoredName(m,j,{seedNames:ht(a),maxLen:Zn}):`${String(Date.now())}-${j}`;return b.files&&b.files.putBytes(`${m}/${I}`,new Uint8Array(p),d||"application/octet-stream"),{name:j,stored_name:I,size:p.length,mime_type:d||"application/octet-stream",path:`${a}/files/${I}`,uploaded_at:new Date().toISOString()}}function St(a,i,d){let p=Y(a);if(!p)return;let m=p.board.getConfig({params:{key:"chat-handler"}});if(m.status!=="success")return;let b=m.data?.value;if(!b||typeof b!="object")return;let j=O(a),T=R(a),I=`${j}/.processing`;try{T.chats?.putText(I,"","text/plain; charset=utf-8");}catch{}let H={boardId:r,cardId:String(a),chatsKeyPrefix:i,chatProcessingMarkerKey:I,lastChatFile:d,...f,...c?{serverUrl:c}:{}};s.invoke(b,H).then(W=>{if(W.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${r}")`);else {try{T.chats?.remove(I);}catch{}o.warn(`[chat-handler] dispatch failed for card "${a}": ${W.error||"unknown"}`);}},W=>{try{T.chats?.remove(I);}catch{}o.warn(`[chat-handler] invoke failed for card "${a}": ${W?.message||String(W)}`);});}function bt(a,i,d){let p=i==="chat-send"?x:l,m;p(a,b=>{let j=new Date().toISOString(),T=b.card_data&&typeof b.card_data=="object"?b.card_data:{};if(b.card_data=T,i==="chat-send"){let I=d&&typeof d.text=="string"?d.text.trim():"",H=[];if(Array.isArray(d?.files)){for(let W of d.files)if(W){if(typeof W=="string"){H.push({name:W});continue}if(typeof W=="object"){let it=W;typeof it.name=="string"&&H.push({name:it.name,size:it.size,mime_type:it.mime_type,path:it.path,uploaded_at:it.uploaded_at,stored_name:it.stored_name});}}}if(I||H.length>0){let W=O(a),mt=ct(a,"user",I,H).path,U=mt.includes("/")?mt.slice(mt.lastIndexOf("/")+1):mt;m={chatsKeyPrefix:`${W}/chats`,lastChatFile:U};for(let q of H){if(!q||typeof q!="object")continue;let et=typeof q.name=="string"?q.name:"file",ut=typeof q.stored_name=="string"?q.stored_name:null;ut&&ct(a,"system",`File ${et} uploaded as ${ut}.`,[]);}try{let q=at(a),et=P(a);X([{kind:"card_chats",cardId:a,messages:q.map(ut=>({role:String(ut.role||"system"),text:String(ut.text||""),files:Array.isArray(ut.files)?ut.files:[]})),receiving:!0,processing:!!et.processing}]);}catch{}}return b}if(i==="file-upload"){let I=w().normalizeIncoming(d?.files,j);return I.length>0&&w().merge(T,I),b}if(i==="action"){let I=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!I)return b;T.lastAction={buttonId:I,at:j},T.lastActionText=`${I} @ ${j}`;}return b}),m&&St(a,m.chatsKeyPrefix,m.lastChatFile);}function K(a,i,d){let p=JSON.stringify(d),m=typeof Buffer<"u"?Buffer.byteLength(p):new TextEncoder().encode(p).length;a.writeHead(i,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":m}),a.end(p);}async function Ct(a){let i=[];for await(let p of a)i.push(p);let d=typeof Buffer<"u"?Buffer.concat(i).toString("utf-8").trim():new TextDecoder().decode(Bt(i)).trim();return d?JSON.parse(d):{}}async function Dt(a){let i=[];for await(let d of a)i.push(d);return typeof Buffer<"u"?Buffer.concat(i):Bt(i)}function Bt(a){let i=a.reduce((m,b)=>m+b.length,0),d=new Uint8Array(i),p=0;for(let m of a)d.set(m,p),p+=m.length;return d}let Ht=0;function Pt(a){let i=JSON.stringify(a);return Ht++,`id: ${Ht}
|
|
4
|
-
data: ${i}
|
|
1
|
+
import {createRequire}from'module';import'ajv-formats';var Yt="b64:";function an(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 un(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 bt(t){return `${Yt}${an(JSON.stringify(t))}`}function fe(t){if(!t.startsWith(Yt))throw new Error(`Invalid ref format (expected ${Yt}<base64url(json)>): ${t}`);let e;try{e=JSON.parse(un(t.slice(Yt.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 pe(t,e,n){let r=t.tryAcquire();if(!r)return false;try{await e();}finally{r();}return n?.(),true}var wt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function ct(t){return t?Array.isArray(t.provides)?t.provides:[]:[]}function vt(t){return t?Array.isArray(t.requires)?t.requires:[]:[]}function ge(t){return t.tasks??{}}function ae(t){return t?t.status===wt.FAILED||t.status===wt.INACTIVATED:false}function me(t,e){return t.refreshStrategy??e?.refreshStrategy??"data-changed"}function he(t){return t.maxExecutions}function ye(t,e){let n=new Set;for(let[r,o]of Object.entries(e))if(o.status===wt.COMPLETED){let s=t.tasks[r];s&&ct(s).forEach(i=>n.add(i));}return Array.from(n)}function ke(t,e){let n={};return t.forEach(r=>{let o=e[r];if(!o)return;ct(o).forEach(u=>{n[u]||(n[u]=[]),n[u].push(r);});}),n}function Se(t,e,n){let r=t.tasks[e]??Xt(),o={};if(n){let u=n.tasks[e],i=vt(u);for(let f of i)for(let[w,B]of Object.entries(n.tasks))if(ct(B).includes(f)){let _=t.tasks[w];_?.lastDataHash&&(o[f]=_.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 be(t,e,n,r,o,s){let u=t.tasks[n]??Xt(),i=e.tasks[n];if(!i)throw new Error(`Task "${n}" not found in graph`);let f;r&&i.on&&i.on[r]?f=i.on[r]:f=ct(i);let w=u.startConsumedHashes?{...u.startConsumedHashes}:{...u.lastConsumedHashes};if(!u.startConsumedHashes){let q=i.requires??[];for(let E of q)for(let[b,S]of Object.entries(e.tasks))if(ct(S).includes(E)){let k=t.tasks[b];k?.lastDataHash&&(w[E]=k.lastDataHash);break}}let B={...u,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:u.executionCount+1,lastEpoch:u.executionCount+1,lastDataHash:o,data:s,lastConsumedHashes:w,error:void 0},_=[...new Set([...t.availableOutputs,...f])];return {...t,tasks:{...t.tasks,[n]:B},availableOutputs:_,lastUpdated:new Date().toISOString()}}function Ce(t,e,n,r){let o=t.tasks[n]??Xt(),s=e.tasks[n];if(s?.retry){let f=o.retryCount+1;if(f<=s.retry.max_attempts){let w={...o,status:"not-started",retryCount:f,lastUpdated:new Date().toISOString(),error:r};return {...t,tasks:{...t.tasks,[n]:w},lastUpdated:new Date().toISOString()}}}let u={...o,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:r,executionCount:o.executionCount+1},i=t.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(i=[...new Set([...t.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&u.executionCount>=s.circuit_breaker.max_executions){let f=s.circuit_breaker.on_break;i=[...new Set([...i,...f])];}return {...t,tasks:{...t.tasks,[n]:u},availableOutputs:i,lastUpdated:new Date().toISOString()}}function Re(t,e,n,r){let o=t.tasks[e]??Xt(),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 we(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 Xt(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Wt(t,e){let n=`live-${Date.now()}`,r={};for(let s of Object.keys(t.tasks))r[s]=xe();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 cn(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:Se(r,e.taskName,n)};case "task-completed":return {config:n,state:be(r,n,e.taskName,e.result,e.dataHash,e.data)};case "task-failed":return {config:n,state:Ce(r,n,e.taskName,e.error)};case "task-progress":return {config:n,state:Re(r,e.taskName,e.message,e.progress)};case "task-restart":return {config:n,state:we(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:hn(r,e.action)};case "task-upsert":return dn(t,e.taskName,e.taskConfig);case "task-removal":return ln(t,e.taskName);case "node-requires-add":return fn(t,e.nodeName,e.tokens);case "node-requires-remove":return pn(t,e.nodeName,e.tokens);case "node-provides-add":return gn(t,e.nodeName,e.tokens);case "node-provides-remove":return mn(t,e.nodeName,e.tokens);default:return t}}function ve(t,e){return e.reduce((n,r)=>cn(n,r),t)}function dn(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]:xe()},lastUpdated:new Date().toISOString()}}}function ln(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 fn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=vt(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:[...o,...s]}}},state:t.state}}function pn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=vt(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,requires:s}}},state:t.state}}function gn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ct(r),s=n.filter(u=>!o.includes(u));return s.length===0?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:[...o,...s]}}},state:t.state}}function mn(t,e,n){let r=t.config.tasks[e];if(!r)return t;let o=ct(r),s=o.filter(u=>!n.includes(u));return s.length===o.length?t:{config:{...t.config,tasks:{...t.config.tasks,[e]:{...r,provides:s}}},state:t.state}}function Gt(t){return {version:1,config:t.config,state:t.state,snapshotAt:new Date().toISOString()}}function Zt(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 xe(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function hn(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 Vt(t){let{config:e,state:n}=t,r=ge(e);if(Object.keys(r).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let s=yn(r),u=ye(e,n.tasks),i=new Set([...u,...n.availableOutputs]),f=[],w=[],B=[],_=[];for(let[E,b]of Object.entries(r)){let S=n.tasks[E],k=me(b,e.settings),T=k!=="once";if(S?.status===wt.RUNNING||ae(S))continue;let g=he(b);if(g!==void 0&&S&&S.executionCount>=g||b.circuit_breaker&&S&&S.executionCount>=b.circuit_breaker.max_executions||!T&&S?.status===wt.COMPLETED)continue;if(T&&S?.status===wt.COMPLETED){let A=vt(b),D=false;switch(k){case "data-changed":{A.length>0&&A.some(U=>{for(let[Y,K]of Object.entries(r))if(ct(K).includes(U)){let Z=n.tasks[Y];if(!Z)continue;let pt=S.lastConsumedHashes?.[U];return Z.lastDataHash==null?Z.executionCount>S.lastEpoch:Z.lastDataHash!==pt}return false})||(D=true);break}case "epoch-changed":{A.length>0&&A.some(U=>{for(let[Y,K]of Object.entries(r))if(ct(K).includes(U)){let Z=n.tasks[Y];if(Z&&Z.executionCount>S.lastEpoch)return true}return false})||(D=true);break}case "time-based":{let z=b.refreshInterval??0;if(z<=0){D=true;break}let U=S.completedAt;if(!U){D=true;break}(Date.now()-Date.parse(U))/1e3<z&&(D=true);break}case "manual":D=true;break}if(D)continue}let R=vt(b);if(R.length===0){f.push(E);continue}let F=[],$=[],L=[];for(let A of R){if(i.has(A))continue;let D=s[A]||[];D.length===0?F.push(A):D.every(U=>ae(n.tasks[U]))?L.push({token:A,failedProducer:D[0]}):$.push(A);}F.length>0?B.push({taskName:E,missingTokens:F}):L.length>0?_.push({taskName:E,failedTokens:L.map(A=>A.token),failedProducers:[...new Set(L.map(A=>A.failedProducer))]}):$.length>0?w.push({taskName:E,waitingOn:$}):f.push(E);}let q={};if(f.length>1){let E=ke(f,r);for(let[b,S]of Object.entries(E))S.length>1&&(q[b]=S);}return {eligible:f,pending:w,unresolved:B,blocked:_,conflicts:q}}function yn(t){let e={};for(let[n,r]of Object.entries(t)){for(let o of ct(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 Mt=class{buffer=[];append(e){this.buffer.push(e);}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function ie(t){let e=ue(t);return kn(e)}function ue(t){if(t==null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t))return "["+t.map(ue).join(",")+"]";let e=t;return "{"+Object.keys(e).sort().map(r=>JSON.stringify(r)+":"+ue(e[r])).join(",")+"}"}function kn(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 Sn(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 bn(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 Ae(t){let e=JSON.stringify({t,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return Sn(e)}function Cn(t){try{let e=JSON.parse(bn(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ee(t,e,n){let{handlers:r,onDrain:o}=e,s=new Mt,u="state"in t&&"config"in t?t:Wt(t),i=false,f=new Set,w=new Map(Object.entries(r)),B=new Mt,_=false,q=false;function E(){if(!i){if(_){q=true;return}_=true;try{do q=!1,b();while(q)}finally{_=false;}}}function b(){let g=B.drain(),R=s.drain(),F=[...g,...R];F.length>0&&(u=ve(u,F));let $=Vt(u);F.length>0&&o?.(F,u,$);for(let L of $.eligible)T(L);for(let L of F)if(L.type==="task-progress"){let{taskName:A,update:D}=L;if(!u.config.tasks[A])continue;let U=u.state.tasks[A];if(!U||U.status!=="running")continue;let Y=Ae(A),K=k(A,Y,D).catch(Z=>{i||(B.append({type:"task-failed",taskName:A,error:Z.message??String(Z),timestamp:new Date().toISOString()}),E());}).finally(()=>{f.delete(K);});f.add(K);}}function S(g){let F=u.config.tasks[g].requires??[],$=new Map;for(let[A,D]of Object.entries(u.config.tasks))for(let z of D.provides??[])$.set(z,A);let L={};for(let A of F){let D=$.get(A);D?L[A]=u.state.tasks[D]?.data:L[A]=void 0;}return L}async function k(g,R,F){let $=u.config.tasks[g],L=$.taskHandlers??[],A=S(g);for(let D of L){let z=w.get(D);if(!z)throw new Error(`Handler '${D}' not found in registry (task '${g}')`);let U={nodeId:g,state:A,taskState:u.state.tasks[g],config:$,callbackToken:R,update:F};if(await z(U)==="task-initiate-failure")throw new Error(`Handler '${D}' returned task-initiate-failure (task '${g}')`)}}function T(g){let F=u.config.tasks[g]?.taskHandlers;if(!F||F.length===0)return;B.append({type:"task-started",taskName:g,timestamp:new Date().toISOString()}),E();let $=Ae(g),L=k(g,$).catch(A=>{i||(B.append({type:"task-failed",taskName:g,error:A.message??String(A),timestamp:new Date().toISOString()}),E());}).finally(()=>{f.delete(L);});f.add(L);}return {push(g){i||(g.type==="task-completed"&&g.data&&!g.dataHash&&(g={...g,dataHash:ie(g.data)}),s.append(g),E());},pushAll(g){if(!i){for(let R of g)R.type==="task-completed"&&R.data&&!R.dataHash?s.append({...R,dataHash:ie(R.data)}):s.append(R);E();}},resolveCallback(g,R,F){if(i)return;let $=Cn(g);if(!$)return;let{taskName:L}=$;if(u.config.tasks[L]){if(F&&F.length>0)s.append({type:"task-failed",taskName:L,error:F.join("; "),timestamp:new Date().toISOString()});else {let A=R&&Object.keys(R).length>0?ie(R):void 0;s.append({type:"task-completed",taskName:L,data:R,dataHash:A,timestamp:new Date().toISOString()});}E();}},addNode(g,R){i||(s.append({type:"task-upsert",taskName:g,taskConfig:R,timestamp:new Date().toISOString()}),E());},removeNode(g){i||(s.append({type:"task-removal",taskName:g,timestamp:new Date().toISOString()}),E());},addRequires(g,R){i||(s.append({type:"node-requires-add",nodeName:g,tokens:R,timestamp:new Date().toISOString()}),E());},removeRequires(g,R){i||(s.append({type:"node-requires-remove",nodeName:g,tokens:R,timestamp:new Date().toISOString()}),E());},addProvides(g,R){i||(s.append({type:"node-provides-add",nodeName:g,tokens:R,timestamp:new Date().toISOString()}),E());},removeProvides(g,R){i||(s.append({type:"node-provides-remove",nodeName:g,tokens:R,timestamp:new Date().toISOString()}),E());},registerHandler(g,R){w.set(g,R);},unregisterHandler(g){w.delete(g);},retrigger(g){i||u.config.tasks[g]&&(s.append({type:"task-restart",taskName:g,timestamp:new Date().toISOString()}),E());},retriggerAll(g){if(!i){for(let R of g)u.config.tasks[R]&&s.append({type:"task-restart",taskName:R,timestamp:new Date().toISOString()});E();}},snapshot(){return Gt(u)},getState(){return u},getSchedule(){return Vt(u)},async waitForHandlers(){f.size>0&&await Promise.allSettled([...f]);},async dispose(g){g?.wait&&f.size>0&&await Promise.allSettled([...f]),i=true;}}}var wn=createRequire(import.meta.url);wn("./jsonata-sync.cjs");var xn=createRequire(import.meta.url),Qt=xn("./jsonata-sync.cjs"),Ie=Qt;function _e(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 Oe(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 An(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);Oe(t.computed_values,o.bindTo,s),r.computed_values=t.computed_values;}catch{}return t}function En(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 u=Ie(s.expr).evaluate(r);Oe(t.computed_values,s.bindTo,u),r.computed_values=t.computed_values;}catch(u){let i=u instanceof Error?u.message:String(u);o.push({bindTo:s.bindTo,error:i});}return o.length>0?{ok:true,node:t,errors:o}:{ok:true,node:t}}async function _n(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 Tn(t,e){return e.startsWith("fetched_sources.")?_e(t._sourcesData??{},e.slice(16)):_e(t,e)}var Te=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),In=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function On(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))In.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,u)=>{if(!s||typeof s!="object"||Array.isArray(s))e.push(`source_defs[${u}]: must be an object`);else {let i=s;typeof i.bindTo!="string"||!i.bindTo?e.push(`source_defs[${u}]: missing required "bindTo" property`):(r.has(i.bindTo)&&e.push(`source_defs[${u}]: bindTo "${i.bindTo}" is not unique across source_defs`),r.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?e.push(`source_defs[${u}]: missing required "outputFile" property`):(o.has(i.outputFile)&&e.push(`source_defs[${u}]: outputFile "${i.outputFile}" is not unique across source_defs`),o.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&e.push(`source_defs[${u}]: 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`):Te.has(o.kind)||e.push(`view.elements[${s}].kind: unknown kind "${o.kind}". Valid: ${[...Te].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 jn(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,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=await Qt(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}}))}function Nn(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,u]of Object.entries(r.projections))if(typeof u=="string"&&u.trim().length>0)try{o[s]=Ie(u).evaluate(n);}catch{o[s]=void 0;}}return {...r,_projections:o}})}var Ut={run:An,runSync:En,eval:_n,resolve:Tn,validate:On,enrichSources:jn,enrichSourcesSync:Nn};function je(t){return JSON.stringify(t)}function Ne(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}function te(t,e){function n(){return t.readIndex()??{}}function r(o,s,u){let i=String(s||"").split(".").filter(Boolean);if(i.length===0)return u&&typeof u=="object"&&!Array.isArray(u)?u:{value:u};let f={...o},w=f;for(let B=0;B<i.length-1;B++){let _=i[B],q=w[_],E=q&&typeof q=="object"&&!Array.isArray(q)?{...q}:{};w[_]=E,w=E;}return w[i[i.length-1]]=u,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,u]of Object.entries(n())){if(!t.cardExists(u.key))continue;let i=t.readCard(u.key);i?o.push(i):e?.(`[card-store] could not read card "${s}" at key "${u.key}"`);}return o},readChecksumIndex(){let o={};for(let[s,u]of Object.entries(n()))o[s]=u.checksum;return o},changedSince(o){let s=n(),u=[];for(let[i,f]of Object.entries(s))o[i]!==f.checksum&&u.push(i);for(let i of Object.keys(o))s[i]||u.push(i);return u},validateUpsert(o,s){let u=n(),i=u[o],f=Object.entries(u).find(([,w])=>w.key===s);return i&&i.key!==s?{ok:false,error:`Card id "${o}" is already mapped to key "${i.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,u){let i=n(),f=u??i[o]?.key??t.defaultCardKey(o),w=t.writeCard(f,s);i[o]={key:f,checksum:w,updatedAt:new Date().toISOString()},t.writeIndex(i);},patchCard(o,s,u){let i=n(),f=i[o];if(!f||!t.cardExists(f.key))throw new Error(`card "${o}" not found`);let w=t.readCard(f.key);if(!w||typeof w!="object"||Array.isArray(w))throw new Error(`card "${o}" is not patchable`);let B=r(w,s,u),_=t.writeCard(f.key,B);i[o]={key:f.key,checksum:_,updatedAt:new Date().toISOString()},t.writeIndex(i);},removeCard(o){let s=n();s[o]&&(delete s[o],t.writeIndex(s));},readIndex(){return n()}}}function ce(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 u=e(o);t.write(`${n}/.staged/${s}/${r}`,u);},commitSourceData(n,r,o){let s=`${n}/.staged/${o}/${r}`,u=t.read(s);return u==null?false:(t.write(`${n}/${r}`,u),t.remove(s),true)},hasSource(n,r){return t.exists(`${n}/${r}`)}}}function De(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 Be(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(u){let i=u instanceof Error?u.message:String(u);try{e(s,i);}catch{}}t.delete(n);}}}}var ee="v1",It="board/graph",Pe="board/lastJournalProcessedId";function Fe(t){return `cards/${t}/runtime`}function qe(t){return {readRuntime(e){return t.read(Fe(e))??{_sources:{}}},writeRuntime(e,n){t.write(Fe(e),n);}}}function Fn(t,e){let n={...t};for(let r of e.deleteKeys)delete n[r];return {...n,...e.shallowMerge}}function Le(t){return {readSnapshot(e){return t.readValues(e)},commitSnapshot(e,n){if(n.schemaVersion!==ee)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=Fn(r.values,n);return {ok:true,newVersion:t.writeValues(e,o,n.deleteKeys)}}}}function Ge(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 Ne(n.trim())},writeTaskExecutorRef(n){t.write("task-executor",je(n));},readChatHandlerFlow(){return t.read("chat-handler-flow")},writeChatHandlerFlow(n){t.write("chat-handler-flow",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);}}}function Ve(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 Dn(t,e){return t?.lastRequestedAt?$n(t)?"in-flight":!t.lastFetchedAt||t.lastFetchedAt<e?"dispatch":"idle":"dispatch"}function Bn(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 ne(t,e){let n=e.state.tasks,r=e.config.tasks,o=Object.keys(n),s=Vt(e),u={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let b of s.pending)i.set(b.taskName,b.waitingOn);for(let b of s.unresolved)i.set(b.taskName,b.missingTokens);for(let b of s.blocked)i.set(b.taskName,b.failedTokens);let f=new Map;for(let[b,S]of Object.entries(r))for(let k of S.requires??[]){let T=f.get(k)??[];T.push(b),f.set(k,T);}let w=o.sort().map(b=>{let S=n[b],k=r[b]??{requires:[],provides:[]};S.status==="completed"?u.completed+=1:S.status==="failed"?u.failed+=1:S.status==="in-progress"&&(u.in_progress+=1);let T=k.requires??[],g=k.provides??[],R=Object.keys(S.data??{}).sort(),F=T.filter(U=>e.state.availableOutputs.includes(U)),$=T.filter(U=>!e.state.availableOutputs.includes(U)),L=i.get(b)??$,A=new Set;for(let U of g)for(let Y of f.get(U)??[])Y!==b&&A.add(Y);let D=S.failedAt,z=S.error?{message:S.error,code:"TASK_FAILED",at:D,source:"task-runtime"}:void 0;return {name:b,status:S.status,error:z,requires:T,requires_satisfied:F,requires_missing:$,provides_declared:g,provides_runtime:R,blocked_by:L,unblocks:Array.from(A).sort(),runtime:{attempt_count:S.executionCount??0,restart_count:S.retryCount??0,in_progress_since:S.status==="in-progress"?S.startedAt??null:null,last_transition_at:S.lastUpdated??null,last_completed_at:S.completedAt??null,last_restarted_at:S.startedAt??null,status_age_ms:S.lastUpdated?0:null}}});u.pending=s.pending.length,u.blocked=s.blocked.length,u.unresolved=s.unresolved.length;let B=w.map(b=>({name:b.name,fanOut:b.unblocks.length})).sort((b,S)=>S.fanOut-b.fanOut||b.name.localeCompare(S.name)),_=B.length>0?B[0]:{name:null,fanOut:0},q=new Set;for(let b of Object.values(r))for(let S of b.requires??[])q.add(S);let E=0;for(let[b,S]of Object.entries(r)){let k=(S.requires??[]).length===0,g=(S.provides??[]).some(R=>(f.get(R)??[]).some(F=>F!==b));k&&!g&&(E+=1);}return {schema_version:"v1",meta:{board:{path:t}},summary:{card_count:o.length,completed:u.completed,eligible:s.eligible.length,pending:u.pending,blocked:u.blocked,unresolved:u.unresolved,failed:u.failed,in_progress:u.in_progress,orphan_cards:E,topology:{edge_count:Array.from(q).length,max_fan_out_card:_.name,max_fan_out:_.fanOut}},cards:w}}function Pn(){return new Date().toISOString()}function Me(t,e,n,r,o,s,u){return async i=>{let f=[],w=n.cardStore.readCard(i.nodeId);if(!w)return "task-initiate-failure";let B=w.id,_=w.card_data??{},q=w.source_defs??[],E=q.filter(P=>P.optionalForCompletionGating!==true),b=n.cardRuntimeStore.readRuntime(B),S=false,k=()=>{S&&(n.cardRuntimeStore.writeRuntime(B,b),S=false);},T=P=>({...b._sources[P]??{}}),g=(P,G)=>{b._sources[P]=G,S=true;},R=i.taskState?.executionCount??0,F=b._lastExecutionCount;if(typeof F=="number"&&F!==R&&(b._sources={},S=true),F!==R&&(b._lastExecutionCount=R,S=true),i.update){let P=i.update,G=P.outputFile;if(G){let m=T(G);if(P.failure)g(G,$e(m,P.reason??"unknown"));else {let l=P.rqt;if(!m.lastFetchedAt||l>m.lastFetchedAt){let C=typeof P.deliveryToken=="string"?P.deliveryToken:void 0,I=false;C&&(I=n.fetchedSourcesStore.commitSourceData(B,G,C)),I?g(G,Bn(m,l)):g(G,$e(m,`source delivery commit failed for ${G} token=${String(C)}`));}}k();}}let $={};for(let P of q)if(P.outputFile){let G=n.fetchedSourcesStore.readSourceData(B,P.outputFile);G!==null&&($[P.bindTo]=G);}let L={};for(let[P,G]of Object.entries(i.state??{}))if(G!==null&&typeof G=="object"&&!Array.isArray(G)){let m=G[P];L[P]=m!==void 0?m:G;}else L[P]=G;let A={id:B,card_data:{..._},requires:L,source_defs:q,compute:w.compute};A._sourcesData=$,w.compute&&Ut.runSync(A,{sourcesData:$}),(s??n.outputStore.writeComputedValues.bind(n.outputStore))(B,A.computed_values??{});let D={...w},z=Ut.enrichSourcesSync(Array.isArray(w.source_defs)?w.source_defs:void 0,{card_data:w.card_data,requires:L}),U=t.value;D.source_defs=Array.isArray(z)?z.map(P=>({...P,boardDir:typeof P.boardDir=="string"&&P.boardDir?P.boardDir:U})):z;let Y=Pn(),K=i.update?void 0:Y,Z=E.filter(P=>{let G=P.outputFile;if(typeof G!="string"||!G)return true;let m=T(G);K&&(m={...m,queueRequestedAt:K},g(G,m));let l=m.queueRequestedAt??m.lastRequestedAt??Y,C=Dn(m,l);return C==="in-flight"?false:C==="dispatch"});if(k(),Z.length>0){let P=false,G=Y;for(let m of Z){let l=m.outputFile;if(typeof l!="string"||!l)continue;let C=T(l),I=C.queueRequestedAt??Y;g(l,{...C,lastRequestedAt:I}),G=I,P=true;}return P&&k(),P&&(f.push({taskKind:"source-fetch",payload:{boardRef:bt(t),enrichedCard:D,callbackToken:i.callbackToken,rqt:G}}),n.executionRequestStore.appendEntries(e,f)),"task-initiated"}let pt=w.provides??[],At={};for(let{bindTo:P,ref:G}of pt)At[P]=Ut.resolve(A,G);return (u??n.outputStore.writeDataObjects.bind(n.outputStore))(At),q.filter(P=>{if(P.optionalForCompletionGating!==true)return false;let G=T(P.outputFile);return !G.lastRequestedAt||!G.lastFetchedAt?true:G.lastFetchedAt<=G.lastRequestedAt}).length>0&&f.push({taskKind:"source-fetch",payload:{boardRef:bt(t),enrichedCard:D,callbackToken:i.callbackToken,rqt:Y}}),r(i.nodeId,At),f.length>0&&n.executionRequestStore.appendEntries(e,f),"task-initiated"}}var de={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Ue(t){return {[It]:t.graph,[Pe]:t.lastDrainedJournalId}}function He(t){let e=t[It],n=t[Pe];if(!e||typeof e!="object")throw new Error(`State snapshot is missing required key: ${It}`);return {graph:e,lastDrainedJournalId:typeof n=="string"?n:""}}function Ke(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 ot(t){return t!==void 0?{status:"success",data:t}:{status:"success"}}function tt(t){return {status:"fail",error:t}}function st(t){return {status:"error",error:t instanceof Error?t.message:String(t)}}function qn(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 ze(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 re(t){try{let e=JSON.parse(ze(t));return typeof e?.t=="string"?{taskName:e.t}:null}catch{return null}}function Ln(t){return qn(JSON.stringify(t))}function Je(t){try{let e=JSON.parse(ze(t));return typeof e?.cbk=="string"&&typeof e?.cid=="string"&&typeof e?.b=="string"&&typeof e?.d=="string"?e:null}catch{return null}}function dt(){return new Date().toISOString()}function Ye(t,e){let n=e.onWarn??(()=>{}),r=bt(t);function o(m){if(m.length!==0)try{let l=e.publishBoardChangeNotifications?.(m);l&&typeof l.catch=="function"&&l.catch(C=>n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${C instanceof Error?C.message:String(C)}`));}catch(l){n(`[board-live-cards-public] publishBoardChangeNotifications failed: ${l instanceof Error?l.message:String(l)}`);}}function s(){let m=i().readCardStoreRef();if(!m)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(m);return {readIndex(){return l.read("_index")},writeIndex(C){l.write("_index",C);},readCard(C){return l.read(C)},writeCard(C,I){return l.write(C,I),e.hashFn(I)},cardExists(C){return l.read(C)!==null},defaultCardKey(C){return C}}}let u={readValues(m){let l=e.kvStorage("state-snapshot"),C=l.listKeys().sort();if(C.length===0)return {version:null,values:{}};let I={};for(let J of C)I[J]=l.read(J);return {version:e.hashFn(I),values:I}},writeValues(m,l,C){let I=e.kvStorage("state-snapshot");for(let J of C)I.delete(J);for(let[J,X]of Object.entries(l))I.write(J,X);return e.hashFn(l)}},i=()=>Ge(e.kvStorage("config")),f=()=>Le(u),w=()=>De(e.journalAdapter()),B=()=>te(s(),n),_=()=>{let m=i().readOutputsStoreRef();if(!m)throw new Error(`Board at ${t.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Ve(e.kvStorageForRef(m))};function q(){return !!f().readSnapshot(t.value).values[It]}function E(){let m=f().readSnapshot(t.value);if(!m.values[It])throw new Error(`Board not initialized at ${t.value}`);return He(m.values)}function b(m,l){let C=f().commitSnapshot(t.value,{schemaVersion:ee,expectedVersion:l,commitId:e.genId(),committedAt:dt(),deleteKeys:[],shallowMerge:Ue(m)});if(!C.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${l??"null"} current=${C.currentVersion??"null"}`)}function S(m){w().appendEvent(m);}async function k(){let m=(v,N)=>{let W=v.payload,a=(W?.enrichedCard??{}).id??W?.cardId??"unknown";S({type:"task-failed",taskName:a,error:N,timestamp:dt()});},l=Be(e.kvStorage("execution-requests"),m),C=qe(e.kvStorage("card-runtime")),I=ce(e.blobStorage("sources"),v=>e.resolveBlob(v)),J=new Map,X={readRuntime(v){return J.get(v)??C.readRuntime(v)},writeRuntime(v,N){J.set(v,N);}},gt=[],nt=new Map,it={readSourceData(v,N){let W=`${v}/${N}`;return nt.has(W)?nt.get(W):I.readSourceData(v,N)},ingestSourceDataStaged(v,N,W,Rt){I.ingestSourceDataStaged(v,N,W,Rt);},commitSourceData(v,N,W){let Rt=`${v}/.staged/${W}/${N}`,c=e.blobStorage("sources").read(Rt);if(c==null)return false;let d=`${v}/${N}`,p=c.trim();try{nt.set(d,JSON.parse(p));}catch{nt.set(d,p);}return gt.push({cardId:v,outputFile:N,deliveryToken:W}),true},hasSource(v,N){let W=`${v}/${N}`;return nt.has(W)?true:I.hasSource(v,N)}},lt={cardStore:B(),cardRuntimeStore:X,fetchedSourcesStore:it,outputStore:_(),executionRequestStore:l},ht=E(),yt=Zt(ht.graph),{events:Ct,newCursor:H}=w().readEntriesAfterCursor(ht.lastDrainedJournalId),ut=[],Pt=[],Ot=[],qt=new Map,Kt=(v,N)=>{ut.push({type:"task-completed",taskName:v,data:N,timestamp:dt()});},jt=(v,N)=>S({type:"task-failed",taskName:v,error:N,timestamp:dt()}),Et=Ee(yt,{handlers:{"card-handler":Me(t,H,lt,Kt,jt,(v,N)=>{Pt.push({cardId:v,values:N});},v=>{Ot.push(v);})}});for(ut=Ct;ut.length>0;){let v=ut;ut=[];for(let N of v)if(N.type==="task-restart"){let W=lt.cardStore.readCard(N.taskName);W&&qt.set(N.taskName,W);}Et.pushAll(v),await Et.waitForHandlers();}let Nt=Et.getState();await Et.dispose({wait:true});let Lt=f().readSnapshot(t.value).version;b({lastDrainedJournalId:H,graph:Gt(Nt)},Lt);for(let{cardId:v,values:N}of Pt)lt.outputStore.writeComputedValues(v,N);for(let v of Ot)lt.outputStore.writeDataObjects(v);for(let[v,N]of J)C.writeRuntime(v,N);for(let{cardId:v,outputFile:N,deliveryToken:W}of gt)I.commitSourceData(v,N,W);let Ft;try{Ft=ne(r,Nt),lt.outputStore.writeStatusSnapshot(Ft);}catch(v){n(`[board-live-cards-public] status publish failed: ${v instanceof Error?v.message:String(v)}`);}let _t=[];for(let{cardId:v,values:N}of Pt)_t.push({kind:"computed_values",cardId:v,values:N});for(let v of Ot)for(let[N,W]of Object.entries(v))N&&_t.push({kind:"data_object",key:N,payload:W});for(let[v,N]of qt)_t.push({kind:"card_refreshed",cardId:v,card:N});Ft!==void 0&&_t.push({kind:"status",status:Ft}),o(_t);let oe=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:bt({kind:"built-in",value:"source-cli-task-executor"})};l.dispatchEntriesForJournalId(H,v=>{if(v.taskKind!=="source-fetch"){n(`[process-accumulated-events] unknown taskKind "${v.taskKind}" \u2014 skipping`);return}let N=v.payload,W=N.enrichedCard?.id??"unknown",Rt=N.enrichedCard?.source_defs??[];for(let a of Rt){if(!a.outputFile){n(`[dispatch] source "${a.bindTo}" has no outputFile \u2014 skipping`);continue}let c=Ln({cbk:N.callbackToken,rg:t.value,br:bt(t),cid:W,b:a.bindTo,d:a.outputFile,cs:void 0,rqt:N.rqt});e.dispatchExecution(oe,{source_def:a,base_ref:bt(t),callback:{token:c,via:e.selfRef}}).catch(d=>jt(W,d instanceof Error?d.message:String(d)));}});}async function T(){try{let m=()=>{let C=E(),{events:I}=w().readEntriesAfterCursor(C.lastDrainedJournalId);I.length<=0||(T(),e.requestProcessAccumulated?.());},l=await pe(e.lock,k,m);return ot({ran:l!==!1})}catch(m){return st(m)}}function g(m){try{let l=m.params?.cardStoreRef;if(!l)return tt("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!q()){let X=Wt(de);b({lastDrainedJournalId:"",graph:Gt(X)},null);}let C=m.params?.outputsStoreRef;if(!C)return tt("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let I=i();I.writeCardStoreRef(l),I.writeOutputsStoreRef(C);let J=m.body??{};J["task-executor-ref"]&&I.writeTaskExecutorRef(J["task-executor-ref"]),Object.prototype.hasOwnProperty.call(J,"chat-handler-flow")&&I.writeChatHandlerFlow(J["chat-handler-flow"]);try{_().writeStatusSnapshot(ne(r,Zt(E().graph)));}catch{}return ot()}catch(l){return st(l)}}function R(m){try{let l=_().readStatusSnapshot();if(!l){l=ne(r,Zt(E().graph));try{_().writeStatusSnapshot(l);}catch{}}return ot(l)}catch(l){return st(l)}}function F(m){try{let l=m.params?.id;return l?(S({type:"task-removal",taskName:l,timestamp:dt()}),T(),ot()):tt("removeCard requires params.id")}catch(l){return st(l)}}function $(m){try{let l=m.params?.id;return l?(S({type:"task-restart",taskName:l,timestamp:dt()}),T(),ot()):tt("retrigger requires params.id")}catch(l){return st(l)}}async function L(m){return T()}function A(m){try{let l=m.params?.cardId,C=m.params?.all,I=!!m.params?.restart;if(!l&&!C)return tt("upsertCard requires --card-id <id> or --all");let J=C?B().readAllCards().map(X=>X.id):[l];for(let X of J)if(!B().readCard(X))return tt(`Card "${X}" not found in board at ${t.value}`);for(let X of J){let gt=B().readCard(X),nt=Ke(gt),it=e.hashFn(nt),lt=e.kvStorage("card-upsert"),ht=lt.read(X),yt=ht?.taskConfigHash!==it;if(!(!yt&&!I)){if(yt){let Ct=ht?.blobRef??B().readCardKey(X)??X;S({type:"task-upsert",taskName:X,taskConfig:nt,timestamp:dt()}),lt.write(X,{blobRef:Ct,taskConfigHash:it,updatedAt:dt()});}I&&S({type:"task-restart",taskName:X,timestamp:dt()});}}return T(),ot()}catch(l){return st(l)}}function D(m){try{let l=m.params?.token;if(!l)return tt("taskFailed requires params.token");let C=m.params?.error??"unknown error",I=re(l);return I?(S({type:"task-failed",taskName:I.taskName,error:C,timestamp:dt()}),T(),ot()):tt("Invalid callback token")}catch(l){return st(l)}}function z(m){try{let l=m.params?.token;if(!l)return tt("taskProgress requires params.token");let I=(m.body??{}).update??{},J=re(l);return J?(S({type:"task-progress",taskName:J.taskName,update:I,timestamp:dt()}),T(),ot()):tt("Invalid callback token")}catch(l){return st(l)}}function U(m){try{let l=m.params?.token,C=m.params?.ref;if(!l)return tt("sourceDataFetched requires params.token");if(!C)return tt("sourceDataFetched requires params.ref");let I=Je(l);if(!I)return tt("Invalid source token");let{cbk:J,cid:X,b:gt,d:nt,cs:it,rqt:lt}=I,ht=ce(e.blobStorage("sources"),ut=>e.resolveBlob(ut)),yt=e.genId();ht.ingestSourceDataStaged(X,nt,fe(C),yt);let Ct=re(J);if(!Ct)return tt("Invalid callback token embedded in source token");let H=dt();return S({type:"task-progress",taskName:Ct.taskName,update:{bindTo:gt,outputFile:nt,fetchedAt:H,deliveryToken:yt,sourceChecksum:it,rqt:lt},timestamp:H}),T(),ot()}catch(l){return st(l)}}function Y(m){try{let l=m.params?.token,C=m.params?.reason??"unknown";if(!l)return tt("sourceDataFetchFailure requires params.token");let I=Je(l);if(!I)return tt("Invalid source token");let{cbk:J,b:X,d:gt,cs:nt}=I,it=re(J);return it?(S({type:"task-progress",taskName:it.taskName,update:{bindTo:X,outputFile:gt,failure:!0,reason:C,sourceChecksum:nt},timestamp:dt()}),T(),ot()):tt("Invalid callback token embedded in source token")}catch(l){return st(l)}}function K(m){try{let l=i().readCardStoreRef();return l?ot({storeRef:l}):tt(`Board at ${t.value} has no card store configured`)}catch(l){return st(l)}}function Z(m){try{let l=i().readOutputsStoreRef();return l?ot({storeRef:l}):tt(`Board at ${t.value} has no outputs store configured`)}catch(l){return st(l)}}function pt(m){try{let l=m.params?.key;if(!l)return tt("getConfig requires params.key");let C=i(),I;switch(l){case "task-executor":I=C.readTaskExecutorRef()??null;break;case "chat-handler-flow":I=C.readChatHandlerFlow()??null;break;case "card-store-ref":I=C.readCardStoreRef();break;case "outputs-store-ref":I=C.readOutputsStoreRef();break;default:return tt(`getConfig: unknown key "${l}"`)}return ot({value:I})}catch(l){return st(l)}}function At(m){try{let l=m.params?.key;if(!l)return tt("getOutputsDataObject requires params.key");let C=_().readDataObject(l);return ot(C)}catch(l){return st(l)}}function Ht(m){try{return ot(_().readAllDataObjects())}catch(l){return st(l)}}function P(m){try{let l=m.params?.key;if(!l)return tt("getOutputsComputedValues requires params.key");let C=_().readComputedValues(l);return ot(C)}catch(l){return st(l)}}function G(m){try{return ot(_().readAllComputedValues())}catch(l){return st(l)}}return {init:g,status:R,getCardStoreRef:K,getOutputsStoreRef:Z,getConfig:pt,getOutputsDataObject:At,getAllOutputsDataObjects:Ht,getOutputsComputedValues:P,getAllOutputsComputedValues:G,removeCard:F,retrigger:$,processAccumulatedEvents:L,upsertCard:A,taskFailed:D,taskProgress:z,sourceDataFetched:U,sourceDataFetchFailure:Y}}function Xe(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 u=t.readCard(s);return u?e({cards:[u]}):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 u=Array.isArray(s)?s:[s];for(let i of u){if(typeof i.id!="string")return n("each card must have a string `id` field");t.writeCard(i.id,i);}return e({count:u.length})}catch(s){return r(s)}},del(o){try{let s=o.body?.ids??[],u=o.params?.id,i=u?[...s,u]:s;if(i.length===0)return n("del requires body.ids (string[]) or params.id");for(let f of i)t.removeCard(f);return e({count:i.length})}catch(s){return r(s)}},patch(o){try{let s=o.params?.id,u=o.params?.path;if(!s)return n("patch requires params.id");if(!u)return n("patch requires params.path");let i=o.body,f=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:o.body;return t.patchCard(s,u,f),e({count:1})}catch(s){return r(s)}}}}function We(){return new Date().toISOString()}function Ze(t){return new TextEncoder().encode(t).byteLength}function Gn(t){return t?{key:t.key,size:t.size,updatedAt:t.updatedAt,contentType:t.contentType}:null}function Vn(t){let e=String(t||"").match(/^(\d+)[-_]/);return e?parseInt(e[1],10):0}function Mn(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 Un(t){return String(t||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Hn(t){if(!t||t===".")return "";let e=String(t).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return e?`.${e}`:""}function Kn(t){let e=Mn(t),n=e.lastIndexOf(".");return n<=0||n===e.length-1?{stem:e,ext:""}:{stem:e.slice(0,n),ext:e.slice(n)}}function Jn(t){let e=t.lastIndexOf("/");return e>=0?t.slice(e+1):t}function Qe(t){function e(n){let r=t.stat?Gn(t.stat(n)):null;if(r)return r;if(!t.exists(n))return null;let o=t.read(n);return o===null?{key:n}:{key:n,size:Ze(o)}}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};return s.contentType=o,s.updatedAt=s.updatedAt??We(),s.size=s.size??Ze(r),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};return s.contentType=o,s.updatedAt=s.updatedAt??We(),s.size=s.size??r.byteLength,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=""){return t.listKeys(n).map(r=>e(r)??{key:r}).sort((r,o)=>r.key.localeCompare(o.key))},remove(n){t.remove(n);}}}function tn(t){function e(o,s){let u=0,i=[];Array.isArray(s)&&i.push(...s);for(let f of t.list(`${o}/`))i.push(Jn(f.key));for(let f of i){let w=Vn(f);Number.isFinite(w)&&w>u&&(u=w);}return u+1}function n(o,s,u){let i=Number(u?.maxLen||32),{stem:f,ext:w}=Kn(o),B=Hn(w),_=Un(f),q=`${String(s).padStart(3,"0")}-`,E=B,b=i-q.length-E.length;b<1&&(E="",b=i-q.length);let S=_.slice(0,Math.max(1,b)),k=`${q}${S}${E}`;return k.length>i&&(k=k.slice(0,i).replace(/\.$/,"")),k}function r(o,s,u){let i=e(o,u?.seedNames),f=n(s,i,{maxLen:u?.maxLen});for(;t.exists(`${o}/${f}`);)i+=1,f=n(s,i,{maxLen:u?.maxLen});return f}return {nextSerial:e,buildStoredName:n,allocateStoredName:r}}function en(){function t(o,s){if(!Array.isArray(o))return [];let u=[];for(let i of o){if(!i||typeof i!="object")continue;let f=i;typeof f.stored_name=="string"&&u.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 u}function e(o){return !o||typeof o!="object"?[]:t(o.files,void 0)}function n(o,s){let u=e(o);if(s.length===0)return o.files=u,u;let i=new Set(u.map(f=>f.stored_name));for(let f of s)i.has(f.stored_name)||(u.push(f),i.add(f.stored_name));return o.files=u,u}function r(o,s,u){let i=e(o);if(!Number.isInteger(s)||s<0||s>=i.length)return {ok:false,reason:"index_out_of_range"};let f=i[s];return !f||!f.stored_name?{ok:false,reason:"missing_stored_name"}:u&&u!==f.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:f}}return {read:e,normalizeIncoming:t,merge:n,resolve:r}}function zn(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?String(t.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function nn(){let t=new Map,e=new Map;function n(r){return t.has(r)||t.set(r,[]),t.get(r)}return {append(r,o,s,u=[]){let i={id:zn(),role:o,text:s,files:u,updated_at:new Date().toISOString()};return n(r).push(i),i.id},readAll(r){return n(r).slice()},readAfter(r,o){let s=n(r);if(!o)return {records:s.slice(),cursor:s.length>0?s[s.length-1].id:null};let u=s.findIndex(f=>f.id===o),i=u===-1?s.slice():s.slice(u+1);return {records:i,cursor:i.length>0?i[i.length-1].id:o}},clear(r){t.set(r,[]);},setProcessing(r,o){o?e.set(`p:${r}`,true):e.delete(`p:${r}`);},isProcessing(r){return e.get(`p:${r}`)===true},getConfig(r){return e.get(`c:${r}`)??{}},setConfig(r,o){let s=e.get(`c:${r}`)??{};e.set(`c:${r}`,{...s,...o});}}}var rn={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"content-type,x-file-name","Access-Control-Allow-Methods":"GET,POST,PATCH,OPTIONS"},Yn=32;function Xn(){return {status:null,computedValues:{},dataObjects:{},cards:{}}}function on(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 sn(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)sn(t,r);return}n.kind==="status"&&on(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 Yr(t){let e=String(t.apiBasePath||"/api/board").replace(/\/$/,""),n={...rn,...t.corsHeaders||{}},r=t.boardId||"",o=t.logger||{info:console.log,warn:console.warn,error:console.error},s=t.invocationAdapter,u=t.chatFlowRunner||null,i=t.chatStorage??nn(),f=t.notificationTransport||null,w=t.serverUrl||null,B=t.executionExtra||{},_=new Map,q=new Map,E=new Map,b=null;function S(a){let c=Ye(a.baseRef,a.boardAdapter),d=a.boardAdapter.kvStorageForRef(a.cardStoreRef),h=Xe(te({readIndex:()=>d.read("_index"),writeIndex:x=>d.write("_index",x),readCard:x=>d.read(x),writeCard:(x,j)=>(d.write(x,j),x),cardExists:x=>d.read(x)!==null,defaultCardKey:x=>x},o.warn)),y=a.artifactsAdapter||a.boardAdapter,O=null;return {label:a.label,board:c,cardStore:h,get filesArtifacts(){return O??=Qe(y.blobStorage("files"))},boardAdapter:a.boardAdapter,cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef,notifyRef:a.notifyRef,taskExecutorRef:a.taskExecutorRef,chatHandlerRef:a.chatHandlerRef,chatHandlerFlow:a.chatHandlerFlow,inferenceAdapterRef:a.inferenceAdapterRef,notification:Xn(),notificationTeardown:null,initialized:false,cardsBootstrapped:false}}let k=t.boards.map(S),T=new Map;function g(a){return T.get(a)??0}function R(a){let c=k[g(a)];return {files:c?c.filesArtifacts:null}}function F(a){let c=R(a);return c.files?tn(c.files):null}function $(){return en()}function L(a){return String(a||"").replace(/[^a-zA-Z0-9_-]/g,"_")||"unknown-card"}async function A(a){if(!a||a.notificationTeardown||!f||!a.notifyRef)return;let c=await f.subscribe(a.notifyRef,d=>{sn(a.notification,d);let p=d.kind==="notification-batch"?d.notifications:[d];N(p);});a.notificationTeardown=c;}async function D(a){if(!a||a.initialized)return;let c={cardStoreRef:a.cardStoreRef,outputsStoreRef:a.outputsStoreRef},d={};a.taskExecutorRef&&(d["task-executor-ref"]=a.taskExecutorRef),a.chatHandlerFlow!==void 0&&(d["chat-handler-flow"]=a.chatHandlerFlow),a.inferenceAdapterRef&&(d["inference-adapter-ref"]=a.inferenceAdapterRef);let p=a.board.init({params:c,body:d});if(p.status!=="success")throw Object.assign(new Error(p.error||`init failed for ${a.label}`),{statusCode:500});if(await A(a),!a.chatHandlerFlow&&a.chatHandlerRef&&s.describe)try{let h=await s.describe(a.chatHandlerRef);h&&h.kind!=="chat-handler"?o.warn(`[init] chat-handler describe returned kind="${h.kind}", expected "chat-handler" for ${a.label}`):h&&o.info(`[init] chat-handler validated: ${h.name} (protocol ${h.protocolVersion}) for ${a.label}`);}catch(h){o.warn(`[init] chat-handler describe failed for ${a.label}: ${h?.message||String(h)}`);}a.initialized=true;}function z(a){if(!a.boardAdapter.publishBoardChangeNotifications)return;let c=[],d=a.board.status({});d.status==="success"&&d.data!=null&&on(d.data)&&c.push({kind:"status",status:d.data});let p=a.board.getAllOutputsDataObjects({});if(p.status==="success"&&p.data!=null)for(let[y,O]of Object.entries(p.data))y&&c.push({kind:"data_object",key:y,payload:O});let h=a.board.getAllOutputsComputedValues({});if(h.status==="success"&&h.data!=null)for(let[y,O]of Object.entries(h.data))y&&c.push({kind:"computed_values",cardId:y,values:O});c.length>0&&a.boardAdapter.publishBoardChangeNotifications(c);}function U(a,c){if(!a||a.cardsBootstrapped)return;let d=a.cardStore.get({}),p=d.status==="success"&&Array.isArray(d.data?.cards)?d.data.cards:[];for(let h of p)typeof h.id=="string"&&(T.set(h.id,c),a.board.upsertCard({params:{cardId:h.id}}));a.cardsBootstrapped=true;}async function Y(){for(let a of k)await D(a);}async function K(){await Y();for(let a=0;a<k.length;a++)z(k[a]),U(k[a],a);}function Z(a){return k[g(a)]??null}function pt(a){let c=Z(a);if(!c)return null;let d=c.cardStore.get({params:{id:a}});if(d.status!=="success")return null;let p=Array.isArray(d.data?.cards)?d.data.cards:[];return p.length>0?p[0]:null}function At(){let a=d=>{if(!d||!d.cardStore)return [];let p=d.cardStore.get({});return p.status!=="success"||!Array.isArray(p.data?.cards)?[]:p.data.cards},c=[];for(let d of k)c.push(...a(d));return c}function Ht(){let a=k.map(y=>{try{let x=y.boardAdapter.kvStorageForRef(y.outputsStoreRef).read("status");if(x!=null)return x}catch{}return y.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"],p={};for(let y of d)p[y]=0;for(let y of a){let O=y,x=Array.isArray(O.cards)?O.cards:[];c.push(...x);for(let j of d)p[j]+=Number(O?.summary?.[j]||0);}let h=a[0];return {...h,cards:c,summary:{...h.summary||{},card_count:c.length,...p}}}function P(){let a={},c=d=>{for(let[p,h]of Object.entries(d.notification.computedValues)){let y=d.notification.cards[p];a[p]={schema_version:"v1",card_id:p,card_data:y?.card_data??{},computed_values:h??{}};}};for(let d of k)c(d);return a}function G(){let a={};for(let c of k)Object.assign(a,c.notification.dataObjects||{});return a}function m(){let a=At(),c=P(),d=G(),p={};for(let y of a){if(!y?.id)continue;let O=y.id,x=c[O]||{},j={...x.card_data&&typeof x.card_data=="object"?x.card_data:y.card_data&&typeof y.card_data=="object"?y.card_data:{}};p[O]={schema_version:x.schema_version||"v1",card_id:x.card_id||O,card_data:j,computed_values:x.computed_values&&typeof x.computed_values=="object"?x.computed_values:{}};}let h={};for(let y of a){if(!y?.id)continue;let O=y.id;try{let x=it(O),j=i.isProcessing(O);(x.length>0||j)&&(h[O]={messages:x.map(Q=>({role:String(Q.role||"system"),text:String(Q.text||""),files:Array.isArray(Q.files)?Q.files:[]})),receiving:!1,processing:j});}catch{}}return {boardId:r,cardDefinitions:a,statusSnapshot:Ht(),dataObjectsByToken:d,cardRuntimeById:p,cardChatsByCardId:h}}function l(a,c,d){let p=d?.syncBoard!==false,h=Z(a);if(!h)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let y=pt(a);if(!y)throw Object.assign(new Error(`Card not found: ${a}`),{statusCode:404});let O=c(y)||y,x=h.cardStore.set({body:O});if(x.status!=="success")throw Object.assign(new Error(x.error||`Failed to persist card: ${a}`),{statusCode:500});if(p){let j=h.board.upsertCard({params:{cardId:a,restart:true}});if(j.status!=="success")throw Object.assign(new Error(j.error||`Failed to upsert card: ${a}`),{statusCode:500})}}function C(a,c){l(a,c,{syncBoard:true});}function I(a,c){l(a,c,{syncBoard:false});}function J(a,c){C(a,d=>{if(!c||typeof c!="object"||Object.keys(c).length===0)return d;function p(h,y,O){let x=String(y||"").split(".").filter(Boolean);if(!x.length)return;let j=h;for(let Q=0;Q<x.length-1;Q++){let at=x[Q];(!j[at]||typeof j[at]!="object")&&(j[at]={}),j=j[at];}j[x[x.length-1]]=O;}if(c.fieldValues!==void 0&&c.fieldValues!==null){let h=null,y=d.view;if(y&&Array.isArray(y.elements)){for(let O of y.elements)if(O?.data&&O.data.writeTo){h=O.data.writeTo;break}}h?p(d,h,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[h,y]of Object.entries(c))h!=="_stagedFiles"&&(y!==null&&typeof y=="object"&&!Array.isArray(y)&&d[h]!==null&&typeof d[h]=="object"&&!Array.isArray(d[h])?d[h]={...d[h],...y}:d[h]=y);}return d});}function X(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 gt(a){i.clear(a),i.setProcessing(a,false);}function nt(a,c,d,p){let h=typeof d=="string"?d.trim():"";return i.append(a,c||"system",h,p)}function it(a){return i.readAll(a)}function lt(a){let c=[];try{let d=pt(a);if(!d)return c;let p=$().read(d.card_data&&typeof d.card_data=="object"?d.card_data:null);for(let h of p)c.push(h.stored_name);}catch{}return c}function ht(a,c,d,p){let h=L(a),y=R(a),O=X(c),x=F(a),j=x?x.allocateStoredName(h,O,{seedNames:lt(a),maxLen:Yn}):`${String(Date.now())}-${O}`;return y.files&&y.files.putBytes(`${h}/${j}`,new Uint8Array(p),d||"application/octet-stream"),{name:O,stored_name:j,size:p.length,mime_type:d||"application/octet-stream",path:`${a}/files/${j}`,uploaded_at:new Date().toISOString()}}function yt(a,c){let d=Z(a);if(!d)return;let p=d.board.getConfig({params:{key:"chat-handler-flow"}});if(p.status!=="success")return;let h=p.data?.value,y=d.chatHandlerRef;if(h==null&&(!y||typeof y!="object"))return;try{i.setProcessing(a,!0);}catch{}let O={boardId:r,cardId:String(a),lastChatEntryId:c,...B,...w?{serverUrl:w}:{}};if(!u&&h!=null){try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] configured for card "${a}" but no chatFlowRunner was provided`);return}if(h!=null){let j=u;if(!j)return;j.run(h,O,{boardId:r,cardId:String(a),label:d.label,logger:o,serverUrl:w,executionExtra:B}).then(Q=>{if(Q.dispatched)o.info(`[chat-handler-flow] invoked for card "${a}" (boardId: "${r}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] dispatch failed for card "${a}": ${Q.error||"unknown"}`);}},Q=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler-flow] invoke failed for card "${a}": ${Q?.message||String(Q)}`);});return}let x=y;x&&s.invoke(x,O).then(j=>{if(j.dispatched)o.info(`[chat-handler] invoked for card "${a}" (boardId: "${r}")`);else {try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] dispatch failed for card "${a}": ${j.error||"unknown"}`);}},j=>{try{i.setProcessing(a,!1);}catch{}o.warn(`[chat-handler] invoke failed for card "${a}": ${j?.message||String(j)}`);});}function Ct(a,c,d){let p=c==="chat-send"?I:C,h;p(a,y=>{let O=new Date().toISOString(),x=y.card_data&&typeof y.card_data=="object"?y.card_data:{};if(y.card_data=x,c==="chat-send"){let j=d&&typeof d.text=="string"?d.text.trim():"",Q=[];if(Array.isArray(d?.files)){for(let at of d.files)if(at){if(typeof at=="string"){Q.push({name:at});continue}if(typeof at=="object"){let et=at;typeof et.name=="string"&&Q.push({name:et.name,size:et.size,mime_type:et.mime_type,path:et.path,uploaded_at:et.uploaded_at,stored_name:et.stored_name});}}}if(j||Q.length>0){let at=nt(a,"user",j,Q);h={cardId:a,lastEntryId:at};for(let et of Q){if(!et||typeof et!="object")continue;let mt=typeof et.name=="string"?et.name:"file",V=typeof et.stored_name=="string"?et.stored_name:null;V&&nt(a,"system",`File ${mt} uploaded as ${V}.`,[]);}try{let et=it(a);N([{kind:"card_chats",cardId:a,messages:et.map(mt=>({role:String(mt.role||"system"),text:String(mt.text||""),files:Array.isArray(mt.files)?mt.files:[]})),receiving:!0,processing:i.isProcessing(a)}]);}catch{}}return y}if(c==="file-upload"){let j=$().normalizeIncoming(d?.files,O);return j.length>0&&$().merge(x,j),y}if(c==="action"){let j=d&&typeof d.buttonId=="string"?d.buttonId:"";if(!j)return y;x.lastAction={buttonId:j,at:O},x.lastActionText=`${j} @ ${O}`;}return y}),h&&yt(h.cardId,h.lastEntryId);}function H(a,c,d){let p=JSON.stringify(d),h=typeof Buffer<"u"?Buffer.byteLength(p):new TextEncoder().encode(p).length;a.writeHead(c,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":h}),a.end(p);}async function ut(a){let c=[];for await(let p of a)c.push(p);let d=typeof Buffer<"u"?Buffer.concat(c).toString("utf-8").trim():new TextDecoder().decode(Ot(c)).trim();return d?JSON.parse(d):{}}async function Pt(a){let c=[];for await(let d of a)c.push(d);return typeof Buffer<"u"?Buffer.concat(c):Ot(c)}function Ot(a){let c=a.reduce((h,y)=>h+y.length,0),d=new Uint8Array(c),p=0;for(let h of a)d.set(h,p),p+=h.length;return d}let qt=0;function Kt(a){let c=JSON.stringify(a);return qt++,`id: ${qt}
|
|
2
|
+
data: ${c}
|
|
5
3
|
|
|
6
|
-
`}function
|
|
4
|
+
`}function jt(a,c){let d=_.get(a);if(!d)return;let p=Kt(c);try{d.res.write(p);}catch{_.delete(a);}}function Jt(){let a=new Set;for(let c of _.values())for(let d of c.subscribedChatCardIds)a.add(d);return Array.from(a)}function le(a){let c=q.has(a)?q.get(a):null,{cursor:d}=i.readAfter(a,c),p=i.isProcessing(a),h=p!==(E.get(a)??false),y=d!==c;return y&&q.set(a,d),E.set(a,p),y||h}function Et(a,c=true){let d=it(a);return {kind:"card_chats",cardId:a,messages:d.map(p=>({role:String(p.role||"system"),text:String(p.text||""),files:Array.isArray(p.files)?p.files:[]})),receiving:c,processing:i.isProcessing(a)}}function Nt(a,c=true){let d={kind:"notification-batch",notifications:[Et(a,c)]};for(let[p,h]of _.entries())h.subscribedChatCardIds.has(a)&&jt(p,d);}function Lt(){Jt().length>0||(b&&(clearInterval(b),b=null),q.clear(),E.clear());}function Ft(){b||(b=setInterval(()=>{let a=Jt();if(a.length===0){Lt();return}let c=new Set(a);for(let d of Array.from(q.keys()))c.has(d)||q.delete(d);for(let d of Array.from(E.keys()))c.has(d)||E.delete(d);for(let d of a)le(d)&&Nt(d,true);},1e3));}function _t(a,c){let d=_.get(a);if(!d)return false;d.subscribedChatCardIds.add(c);let{cursor:p}=i.readAfter(c,null);return q.set(c,p),E.set(c,i.isProcessing(c)),Ft(),jt(a,{kind:"notification-batch",notifications:[Et(c,true)]}),true}function oe(a,c){let d=_.get(a);return d?(d.subscribedChatCardIds.delete(c),Jt().includes(c)||(q.delete(c),E.delete(c)),Lt(),true):false}function v(a){if(!a||typeof a!="object")return false;let c=a.kind;return c==="card_chats"||c==="chat_messages"}function N(a){if(!a||a.length===0)return;let c=[],d=new Set;for(let p of a)v(p)&&typeof p.cardId=="string"?d.add(String(p.cardId)):c.push(p);if(c.length>0){let p={kind:"notification-batch",notifications:c};for(let h of _.keys())jt(h,p);}for(let p of d)Nt(p,true);}function W(a,c,d){let p=_.get(d),h=p?new Set(p.subscribedChatCardIds):new Set;if(p)try{p.res.end();}catch{}c.writeHead(200,{...n,"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),_.set(d,{res:c,subscribedChatCardIds:h});let y=m(),O=Kt(y);c.write(O);let x=setInterval(()=>{try{c.write(`: keepalive
|
|
7
5
|
|
|
8
|
-
`);}catch{}},15e3);a.on("close",()=>{clearInterval(
|
|
6
|
+
`);}catch{}},15e3);a.on("close",()=>{clearInterval(x),_.delete(d),Lt(),c.end();});}async function Rt(a,c,d){let p=a.method||"GET",h=d,y=h.pathname;try{if(p==="GET"&&y===`${e}/init-board`)return await Y(),H(c,200,m()),!0;if(p==="GET"&&y===`${e}/sse`){await Y();let V=String(h.searchParams.get("clientId")||"").trim();if(!V)return H(c,400,{error:"clientId query param is required for SSE"}),!0;W(a,c,V);for(let M=0;M<k.length;M++)z(k[M]),U(k[M],M);return !0}if(p==="GET"&&y===`${e}/board-status`)return H(c,200,m()),!0;let O=y.match(new RegExp(`^${xt(e)}/cards/([^/]+)$`));if(p==="GET"&&O){await K();let V=decodeURIComponent(O[1]),M=pt(V);return M?(H(c,200,M),!0):(H(c,404,{error:`card not found: ${V}`}),!0)}if(p==="PATCH"&&O){await K();let V=decodeURIComponent(O[1]),M=await ut(a);return J(V,M),H(c,200,{ok:!0}),!0}let x=y.match(new RegExp(`^${xt(e)}/cards/([^/]+)/actions$`));if(p==="POST"&&x){await K();let V=decodeURIComponent(x[1]),M=await ut(a);return Ct(V,M?.actionType,M?.payload),H(c,200,{ok:!0}),!0}let j=y.match(new RegExp(`^${xt(e)}/cards/([^/]+)/chats$`));if(p==="GET"&&j){await K();let V=decodeURIComponent(j[1]);return H(c,200,{ok:!0,messages:it(V)}),!0}if(p==="POST"&&j){await K();let V=decodeURIComponent(j[1]),M=await ut(a),rt=typeof M?.role=="string"?M.role:"assistant",$t=typeof M?.text=="string"?M.text:"",kt=Array.isArray(M?.files)?M.files:[],St=M?.done===!0,Dt=i.append(V,rt,$t,kt);return St&&i.setProcessing(V,!1),Nt(V,!St),H(c,200,{ok:!0,id:Dt}),!0}let Q=y.match(new RegExp(`^${xt(e)}/cards/([^/]+)/chats/subscribe-sse$`));if(p==="POST"&&Q){await K();let V=decodeURIComponent(Q[1]),M=await ut(a),rt=typeof M?.clientId=="string"?M.clientId.trim():"";return rt?_t(rt,V)?(H(c,200,{ok:!0,clientId:rt,cardId:V,subscribed:!0}),!0):(H(c,404,{error:`SSE client not connected: ${rt}`}),!0):(H(c,400,{error:"clientId is required"}),!0)}let at=y.match(new RegExp(`^${xt(e)}/cards/([^/]+)/chats/unsubscribe-sse$`));if(p==="POST"&&at){await K();let V=decodeURIComponent(at[1]),M=await ut(a),rt=typeof M?.clientId=="string"?M.clientId.trim():"";return rt?oe(rt,V)?(H(c,200,{ok:!0,clientId:rt,cardId:V,subscribed:!1}),!0):(H(c,404,{error:`SSE client not connected: ${rt}`}),!0):(H(c,400,{error:"clientId is required"}),!0)}let et=y.match(new RegExp(`^${xt(e)}/cards/([^/]+)/files$`));if(p==="POST"&&et){await K();let V=decodeURIComponent(et[1]),M=String(h.searchParams.get("inChat")||"").toLowerCase()==="true",rt=a.headers["x-file-name"],$t=String(a.headers["content-type"]||"application/octet-stream"),kt=Array.isArray(rt)?rt[0]:rt,St=kt?decodeURIComponent(String(kt)):"upload.bin",Dt=await Pt(a);if(!Dt.length)return H(c,400,{error:"Empty upload body"}),!0;let ft=ht(V,St,$t,Dt);return I(V,Tt=>{let Bt=new Date().toISOString(),zt=Tt.card_data&&typeof Tt.card_data=="object"?Tt.card_data:{};Tt.card_data=zt;let se=$().normalizeIncoming([{name:ft.name,stored_name:ft.stored_name,size:ft.size,mime_type:ft.mime_type,path:ft.path,uploaded_at:ft.uploaded_at||Bt}],Bt);return $().merge(zt,se),Tt}),M&&nt(V,"system",`file uploaded: ${ft.name} as ${ft.stored_name}`,[]),H(c,200,{ok:!0,file:ft}),!0}let mt=y.match(new RegExp(`^${xt(e)}/cards/([^/]+)/files/(\\d+)$`));if(p==="GET"&&mt){let V=decodeURIComponent(mt[1]),M=parseInt(mt[2],10),rt=h.searchParams.get("sn"),$t=pt(V);if(!$t)return H(c,404,{error:"Card not found"}),!0;let kt=$().resolve($t.card_data,M,rt);if(!kt.ok&&kt.reason==="stale_reference")return H(c,409,{error:"File reference is stale. Refresh and try again."}),!0;if(!kt.ok)return H(c,404,{error:"File not found"}),!0;let St=kt.file,Dt=L(V),ft=R(V),Tt=`${Dt}/${St.stored_name}`,Bt=ft.files?ft.files.getBytes(Tt):null;if(!Bt)return H(c,404,{error:"File not found"}),!0;let zt=St.name||St.stored_name,se=St.mime_type||"application/octet-stream";return c.writeHead(200,{"Content-Type":se,"Content-Disposition":`attachment; filename="${zt}"`,"Content-Length":Bt.length}),c.end(Bt),!0}return !1}catch(O){let x=O?.statusCode||500;return H(c,x,{error:String(O?.message||O)}),true}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleRuntimeApi:Rt,buildPublishedRuntimePayload:m,clearChatRecords:gt,reportSourceFetched(a,c){let d=k[0];return d?d.board.sourceDataFetched({params:{token:a,ref:c}}):{status:"fail",error:"no board context"}},reportSourceFetchFailure(a,c){let d=k[0];return d?d.board.sourceDataFetchFailure({params:{token:a,reason:c}}):{status:"fail",error:"no board context"}},get cardStore(){return k[0]?.cardStore??{set(){return {status:"fail",error:"no board context"}}}}}}function Xr(t){let e=String(t.apiBasePath||"/api/boards").replace(/\/$/,""),n={...rn,...t.corsHeaders||{}},r=t.serverMetaStore,o=t.boardRuntimeFactory,s=new Map,u="boards-config.json";function i(){let k=r.getText(u);if(!k)return {boards:[{id:"default",label:"Default Board"}]};try{return JSON.parse(k)}catch{return {boards:[{id:"default",label:"Default Board"}]}}}function f(k){r.putText(u,JSON.stringify(k,null,2));}function w(k){let T=String(k||"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/^_+|_+$/g,"");return T.length>0&&T.length<=64?T:null}function B(k){if(s.has(k))return s.get(k);let g=i().boards.find(F=>F.id===k)||{},R=o(k,g);return s.set(k,R),R}function _(k,T,g){let R=JSON.stringify(g),F=typeof Buffer<"u"?Buffer.byteLength(R):new TextEncoder().encode(R).length;k.writeHead(T,{...n,"Content-Type":"application/json; charset=utf-8","Content-Length":F}),k.end(R);}async function q(k,T,g){let R=k.method||"GET",F=g.pathname;if(R==="GET"&&F===e)return _(T,200,{ok:true,boards:i().boards}),true;if(R==="POST"&&F===e){let $=[];for await(let K of k)$.push(K);let L=typeof Buffer<"u"?Buffer.concat($).toString("utf-8").trim():new TextDecoder().decode(Wn($)).trim(),A={};try{A=L?JSON.parse(L):{};}catch{A={};}let D=w(A.id);if(!D)return _(T,400,{error:"board id must be 1-64 alphanumeric/dash/underscore characters"}),true;let z=i();if(z.boards.some(K=>K.id===D))return _(T,409,{error:`Board "${D}" is already registered`}),true;let U=typeof A.label=="string"&&A.label.trim()?A.label.trim():D,Y={id:D,label:U};for(let[K,Z]of Object.entries(A))K==="id"||K==="label"||Z!=null&&(Y[K]=Z);return z.boards.push(Y),f(z),_(T,200,{ok:true,board:Y}),true}return false}async function E(k,T,g){let F=g.pathname.match(new RegExp(`^${xt(e)}/([^/]+)(/|$)`));if(!F)return false;let $=w(decodeURIComponent(F[1]));return $?i().boards.some(D=>D.id===$)?!!await B($).handleRuntimeApi(k,T,g):(_(T,404,{error:`Board "${$}" not registered. POST ${e} with {id} to register it first.`}),true):(_(T,400,{error:"Invalid board id"}),true)}async function b(k,T,g){return !!(await q(k,T,g)||await E(k,T,g))}function S(k){if(!i().boards.some(g=>g.id===k))throw Object.assign(new Error(`Board "${k}" not registered`),{statusCode:404});return {service:B(k)}}return {get apiBasePath(){return e},get corsHeaders(){return n},handleApi:b,requireBoardService:S}}function xt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Wn(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}export{Xr as createMultiBoardServerRuntime,Yr as createSingleBoardServerRuntime};//# sourceMappingURL=index.js.map
|
|
9
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
'use strict';require('ajv-formats');var module$1=require('module'),url=require('url'),path=require('path'),fs=require('fs');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function R(r,t,e,n){let s=r.steps[e];if(!s)throw new Error(`Step "${e}" not found in flow configuration`);if(n.result==="failure"&&s.retry){let a=t.retryCounts[e]??0;if(a<s.retry.max_attempts)return {newState:{...t,retryCounts:{...t.retryCounts,[e]:a+1},updatedAt:Date.now()},nextStep:e,isTerminal:false,isCircuitBroken:false,shouldRetry:true}}let o=s.failure_transitions?.[n.result]??s.transitions[n.result];if(!o)throw new Error(`No transition defined for result "${n.result}" in step "${e}"`);let i=!!r.terminal_states[o];return {newState:{...t,currentStep:o,stepHistory:[...t.stepHistory,e],retryCounts:{...t.retryCounts,[e]:0},updatedAt:Date.now()},nextStep:o,isTerminal:i,isCircuitBroken:false,shouldRetry:false}}function b(r,t,e){let n=r.steps[e];if(!n?.circuit_breaker)return {broken:false,newState:{...t,iterationCounts:{...t.iterationCounts,[e]:(t.iterationCounts[e]??0)+1},updatedAt:Date.now()}};let s=t.iterationCounts[e]??0;return s>=n.circuit_breaker.max_iterations?{broken:true,redirectStep:n.circuit_breaker.on_open,newState:{...t,currentStep:n.circuit_breaker.on_open,updatedAt:Date.now()}}:{broken:false,newState:{...t,iterationCounts:{...t.iterationCounts,[e]:s+1},updatedAt:Date.now()}}}function j(r,t,e){let n=r.steps[t];if(!n)throw new Error(`Step "${t}" not found`);if(n.expects_data){let s={};for(let o of n.expects_data)s[o]=e[o];return s}return {...e}}function E(r,t){if(r===false||r===void 0)return {};if(typeof r=="string")return {[r]:t[r]};if(Array.isArray(r)){let e={};for(let n of r)e[n]=t[n];return e}return {}}function $(r,t){let e=Date.now();return {runId:t,flowId:r.id??"unnamed",currentStep:r.settings.start_step,status:"running",stepHistory:[],iterationCounts:{},retryCounts:{},startedAt:e,updatedAt:e}}var S=class{runs=new Map;data=new Map;async saveRunState(t,e){this.runs.set(t,{...e});}async loadRunState(t){let e=this.runs.get(t);return e?{...e}:null}async deleteRunState(t){this.runs.delete(t),this.data.delete(t);}async setData(t,e,n){this.data.has(t)||this.data.set(t,{});let s=this.data.get(t);s[e]=n;}async getData(t,e){return this.data.get(t)?.[e]}async getAllData(t){return {...this.data.get(t)??{}}}async clearData(t){this.data.delete(t);}async listRuns(){return Array.from(this.runs.keys())}clear(){this.runs.clear(),this.data.clear();}};function tt(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let t=Math.random()*16|0;return (r==="x"?t:t&3|8).toString(16)})}var x=class{flow;handlers;store;components;options;listeners=new Map;aborted=false;constructor(t,e,n={}){this.flow=t,this.handlers=new Map(Object.entries(e)),this.store=n.store??new S,this.components=n.components??{},this.options=n,n.signal&&n.signal.addEventListener("abort",()=>{this.aborted=true;}),this.validateFlow();}validateFlow(){let{settings:t,steps:e,terminal_states:n}=this.flow;if(!t?.start_step)throw new Error("Flow must have settings.start_step defined");if(!e||Object.keys(e).length===0)throw new Error("Flow must have at least one step defined");if(!n||Object.keys(n).length===0)throw new Error("Flow must have at least one terminal_state defined");if(!e[t.start_step]&&!n[t.start_step])throw new Error(`Start step "${t.start_step}" not found`);for(let[s,o]of Object.entries(e)){for(let[i,a]of Object.entries(o.transitions))if(!e[a]&&!n[a])throw new Error(`Step "${s}" transition "${i}" points to unknown step "${a}"`);if(o.failure_transitions){for(let[i,a]of Object.entries(o.failure_transitions))if(!e[a]&&!n[a])throw new Error(`Step "${s}" failure_transition "${i}" points to unknown step "${a}"`)}}}on(t,e){this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e);}off(t,e){this.listeners.get(t)?.delete(e);}emit(t){let e=this.listeners.get(t.type);if(e)for(let n of e)try{n(t);}catch{}}sleep(t){return new Promise(e=>setTimeout(e,t))}async run(t){let e=tt(),n=$(this.flow,e);if(await this.store.saveRunState(e,n),t)for(let[s,o]of Object.entries(t))await this.store.setData(e,s,o);this.emit({type:"flow:start",runId:e,timestamp:n.startedAt,data:{initialData:t??{}}});try{return await this.executeLoop(e,n)}catch(s){let o=s instanceof Error?s:new Error(String(s));return this.emit({type:"flow:error",runId:e,timestamp:Date.now(),data:{error:o.message}}),this.options.onError?.(o),n={...n,status:"failed",updatedAt:Date.now()},await this.store.saveRunState(e,n),{runId:e,status:"failed",data:await this.store.getAllData(e),finalStep:n.currentStep,stepHistory:n.stepHistory,durationMs:Date.now()-n.startedAt,error:o}}}async resume(t){let e=await this.store.loadRunState(t);if(!e)throw new Error(`No run found with ID: ${t}`);if(e.status==="completed"||e.status==="failed")throw new Error(`Cannot resume a ${e.status} run`);let n={...e,status:"running",pausedAt:void 0,updatedAt:Date.now()};return await this.store.saveRunState(t,n),this.emit({type:"flow:resumed",runId:t,timestamp:Date.now(),data:{currentStep:n.currentStep}}),this.executeLoop(t,n)}async pause(t){let e=await this.store.loadRunState(t);if(!e)throw new Error(`No run found with ID: ${t}`);let n={...e,status:"paused",pausedAt:Date.now(),updatedAt:Date.now()};await this.store.saveRunState(t,n),this.emit({type:"flow:paused",runId:t,timestamp:Date.now(),data:{currentStep:n.currentStep}});}async executeLoop(t,e){let n=this.flow.settings.max_total_steps??100,s=this.flow.settings.timeout_ms,o=e,i=0;for(;i<n;){if(this.aborted)return o={...o,status:"cancelled",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"cancelled",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};if(s&&Date.now()-o.startedAt>s)return o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"timeout",intent:"timeout",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};let a=o.currentStep,c=this.flow.terminal_states[a];if(c){o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o);let p=await this.store.getAllData(t),u={runId:t,status:"completed",intent:c.return_intent,data:E(c.return_artifacts,p),finalStep:a,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};return this.emit({type:"flow:complete",runId:t,timestamp:Date.now(),data:{...u}}),this.options.onComplete?.(u),u}let d=b(this.flow,o,a);if(d.broken){o=d.newState,await this.store.saveRunState(t,o),i++;continue}o=d.newState;let f=await this.store.getAllData(t),l=j(this.flow,a,f),m={runId:t,stepName:a,components:this.components,store:this.store,signal:this.options.signal,emit:(p,u)=>{this.emit({type:"step:complete",runId:t,timestamp:Date.now(),data:{event:p,payload:u}});}};this.emit({type:"step:start",runId:t,timestamp:Date.now(),data:{step:a,input:l}});let g;try{let p=this.handlers.get(a);if(!p)throw new Error(`No handler registered for step "${a}"`);g=await p(l,m);}catch(p){let u=p instanceof Error?p:new Error(String(p));this.emit({type:"step:error",runId:t,timestamp:Date.now(),data:{step:a,error:u.message}}),g={result:"failure",data:{error:u.message}};}if(g.data)for(let[p,u]of Object.entries(g.data))await this.store.setData(t,p,u);this.emit({type:"step:complete",runId:t,timestamp:Date.now(),data:{step:a,result:g.result}}),this.options.onStep?.(a,g);let w=R(this.flow,o,a,g);if(o=w.newState,w.shouldRetry){await this.store.saveRunState(t,o);let p=this.flow.steps[a];if(p.retry?.delay_ms){let u=o.retryCounts[a]??0,h=p.retry.backoff_multiplier?p.retry.delay_ms*Math.pow(p.retry.backoff_multiplier,u-1):p.retry.delay_ms;await this.sleep(h);}i++;continue}await this.store.saveRunState(t,o),this.emit({type:"transition",runId:t,timestamp:Date.now(),data:{from:a,to:o.currentStep,result:g.result}}),this.options.onTransition?.(a,o.currentStep),i++;}return o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"max_iterations",intent:"max_iterations",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt}}};function H(r,t,e){return new x(r,t,e)}async function C(r){return (await import('yaml')).parse(r)}async function et(r){let t=await fetch(r);if(!t.ok)throw new Error(`Failed to load flow from ${r}: ${t.statusText}`);let e=t.headers.get("content-type")??"",n=await t.text();return e.includes("json")||r.endsWith(".json")?JSON.parse(n):C(n)}async function rt(r){let e=await(await import('fs/promises')).readFile(r,"utf-8");return r.endsWith(".json")?JSON.parse(e):C(e)}function M(r){let t=[];if(!r||typeof r!="object")return ["Flow must be an object"];let e=r;if(!e.settings||typeof e.settings!="object"?t.push('Flow must have a "settings" object'):typeof e.settings.start_step!="string"&&t.push("settings.start_step must be a string"),!e.steps||typeof e.steps!="object")t.push('Flow must have a "steps" object');else {let n=e.steps;for(let[s,o]of Object.entries(n)){if(!o||typeof o!="object"){t.push(`Step "${s}" must be an object`);continue}let i=o;(!i.transitions||typeof i.transitions!="object")&&t.push(`Step "${s}" must have a "transitions" object`),i.failure_transitions!==void 0&&typeof i.failure_transitions!="object"&&t.push(`Step "${s}" failure_transitions must be an object when provided`);}}if(!e.terminal_states||typeof e.terminal_states!="object")t.push('Flow must have a "terminal_states" object');else {let n=e.terminal_states;for(let[s,o]of Object.entries(n)){if(!o||typeof o!="object"){t.push(`Terminal state "${s}" must be an object`);continue}typeof o.return_intent!="string"&&t.push(`Terminal state "${s}" must have a "return_intent" string`);}}return t}async function D(r){let t;typeof r=="string"?r.startsWith("http://")||r.startsWith("https://")?t=await et(r):r.includes("{")?t=JSON.parse(r):t=await rt(r):t=r;let e=M(t);if(e.length>0)throw new Error(`Invalid step flow configuration:
|
|
1
|
+
'use strict';require('ajv-formats');var module$1=require('module'),url=require('url'),path=require('path'),fs=require('fs');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function b(r,t,e,n){let s=r.steps[e];if(!s)throw new Error(`Step "${e}" not found in flow configuration`);if(n.result==="failure"&&s.retry){let a=t.retryCounts[e]??0;if(a<s.retry.max_attempts)return {newState:{...t,retryCounts:{...t.retryCounts,[e]:a+1},updatedAt:Date.now()},nextStep:e,isTerminal:false,isCircuitBroken:false,shouldRetry:true}}let o=s.failure_transitions?.[n.result]??s.transitions[n.result];if(!o)throw new Error(`No transition defined for result "${n.result}" in step "${e}"`);let i=!!r.terminal_states[o];return {newState:{...t,currentStep:o,stepHistory:[...t.stepHistory,e],retryCounts:{...t.retryCounts,[e]:0},updatedAt:Date.now()},nextStep:o,isTerminal:i,isCircuitBroken:false,shouldRetry:false}}function j(r,t,e){let n=r.steps[e];if(!n?.circuit_breaker)return {broken:false,newState:{...t,iterationCounts:{...t.iterationCounts,[e]:(t.iterationCounts[e]??0)+1},updatedAt:Date.now()}};let s=t.iterationCounts[e]??0;return s>=n.circuit_breaker.max_iterations?{broken:true,redirectStep:n.circuit_breaker.on_open,newState:{...t,currentStep:n.circuit_breaker.on_open,updatedAt:Date.now()}}:{broken:false,newState:{...t,iterationCounts:{...t.iterationCounts,[e]:s+1},updatedAt:Date.now()}}}function F(r,t,e){let n=r.steps[t];if(!n)throw new Error(`Step "${t}" not found`);if(n.expects_data){let s={};for(let o of n.expects_data)s[o]=e[o];return s}return {...e}}function C(r,t){if(r===false||r===void 0)return {};if(typeof r=="string")return {[r]:t[r]};if(Array.isArray(r)){let e={};for(let n of r)e[n]=t[n];return e}return {}}function E(r,t){let e=Date.now();return {runId:t,flowId:r.id??"unnamed",currentStep:r.settings.start_step,status:"running",stepHistory:[],iterationCounts:{},retryCounts:{},startedAt:e,updatedAt:e}}var h=class{runs=new Map;data=new Map;async saveRunState(t,e){this.runs.set(t,{...e});}async loadRunState(t){let e=this.runs.get(t);return e?{...e}:null}async deleteRunState(t){this.runs.delete(t),this.data.delete(t);}async setData(t,e,n){this.data.has(t)||this.data.set(t,{});let s=this.data.get(t);s[e]=n;}async getData(t,e){return this.data.get(t)?.[e]}async getAllData(t){return {...this.data.get(t)??{}}}async clearData(t){this.data.delete(t);}async listRuns(){return Array.from(this.runs.keys())}clear(){this.runs.clear(),this.data.clear();}};function et(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let t=Math.random()*16|0;return (r==="x"?t:t&3|8).toString(16)})}var k=class{flow;handlers;store;components;options;listeners=new Map;aborted=false;constructor(t,e,n={}){this.flow=t,this.handlers=new Map(Object.entries(e)),this.store=n.store??new h,this.components=n.components??{},this.options=n,n.signal&&n.signal.addEventListener("abort",()=>{this.aborted=true;}),this.validateFlow();}validateFlow(){let{settings:t,steps:e,terminal_states:n}=this.flow;if(!t?.start_step)throw new Error("Flow must have settings.start_step defined");if(!e||Object.keys(e).length===0)throw new Error("Flow must have at least one step defined");if(!n||Object.keys(n).length===0)throw new Error("Flow must have at least one terminal_state defined");if(!e[t.start_step]&&!n[t.start_step])throw new Error(`Start step "${t.start_step}" not found`);for(let[s,o]of Object.entries(e)){for(let[i,a]of Object.entries(o.transitions))if(!e[a]&&!n[a])throw new Error(`Step "${s}" transition "${i}" points to unknown step "${a}"`);if(o.failure_transitions){for(let[i,a]of Object.entries(o.failure_transitions))if(!e[a]&&!n[a])throw new Error(`Step "${s}" failure_transition "${i}" points to unknown step "${a}"`)}}}on(t,e){this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e);}off(t,e){this.listeners.get(t)?.delete(e);}emit(t){let e=this.listeners.get(t.type);if(e)for(let n of e)try{n(t);}catch{}}sleep(t){return new Promise(e=>setTimeout(e,t))}async run(t){let e=et(),n=E(this.flow,e);if(await this.store.saveRunState(e,n),t)for(let[s,o]of Object.entries(t))await this.store.setData(e,s,o);this.emit({type:"flow:start",runId:e,timestamp:n.startedAt,data:{initialData:t??{}}});try{return await this.executeLoop(e,n)}catch(s){let o=s instanceof Error?s:new Error(String(s));return this.emit({type:"flow:error",runId:e,timestamp:Date.now(),data:{error:o.message}}),this.options.onError?.(o),n={...n,status:"failed",updatedAt:Date.now()},await this.store.saveRunState(e,n),{runId:e,status:"failed",data:await this.store.getAllData(e),finalStep:n.currentStep,stepHistory:n.stepHistory,durationMs:Date.now()-n.startedAt,error:o}}}async resume(t){let e=await this.store.loadRunState(t);if(!e)throw new Error(`No run found with ID: ${t}`);if(e.status==="completed"||e.status==="failed")throw new Error(`Cannot resume a ${e.status} run`);let n={...e,status:"running",pausedAt:void 0,updatedAt:Date.now()};return await this.store.saveRunState(t,n),this.emit({type:"flow:resumed",runId:t,timestamp:Date.now(),data:{currentStep:n.currentStep}}),this.executeLoop(t,n)}async pause(t){let e=await this.store.loadRunState(t);if(!e)throw new Error(`No run found with ID: ${t}`);let n={...e,status:"paused",pausedAt:Date.now(),updatedAt:Date.now()};await this.store.saveRunState(t,n),this.emit({type:"flow:paused",runId:t,timestamp:Date.now(),data:{currentStep:n.currentStep}});}async executeLoop(t,e){let n=this.flow.settings.max_total_steps??100,s=this.flow.settings.timeout_ms,o=e,i=0;for(;i<n;){if(this.aborted)return o={...o,status:"cancelled",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"cancelled",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};if(s&&Date.now()-o.startedAt>s)return o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"timeout",intent:"timeout",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};let a=o.currentStep,c=this.flow.terminal_states[a];if(c){o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o);let p=await this.store.getAllData(t),l={runId:t,status:"completed",intent:c.return_intent,data:C(c.return_artifacts,p),finalStep:a,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt};return this.emit({type:"flow:complete",runId:t,timestamp:Date.now(),data:{...l}}),this.options.onComplete?.(l),l}let d=j(this.flow,o,a);if(d.broken){o=d.newState,await this.store.saveRunState(t,o),i++;continue}o=d.newState;let f=await this.store.getAllData(t),u=F(this.flow,a,f),m={runId:t,stepName:a,components:this.components,store:this.store,signal:this.options.signal,emit:(p,l)=>{this.emit({type:"step:complete",runId:t,timestamp:Date.now(),data:{event:p,payload:l}});}};this.emit({type:"step:start",runId:t,timestamp:Date.now(),data:{step:a,input:u}});let g;try{let p=this.handlers.get(a);if(!p)throw new Error(`No handler registered for step "${a}"`);g=await p(u,m);}catch(p){let l=p instanceof Error?p:new Error(String(p));this.emit({type:"step:error",runId:t,timestamp:Date.now(),data:{step:a,error:l.message}}),g={result:"failure",data:{error:l.message}};}if(g.data)for(let[p,l]of Object.entries(g.data))await this.store.setData(t,p,l);this.emit({type:"step:complete",runId:t,timestamp:Date.now(),data:{step:a,result:g.result}}),this.options.onStep?.(a,g);let w=b(this.flow,o,a,g);if(o=w.newState,w.shouldRetry){await this.store.saveRunState(t,o);let p=this.flow.steps[a];if(p.retry?.delay_ms){let l=o.retryCounts[a]??0,S=p.retry.backoff_multiplier?p.retry.delay_ms*Math.pow(p.retry.backoff_multiplier,l-1):p.retry.delay_ms;await this.sleep(S);}i++;continue}await this.store.saveRunState(t,o),this.emit({type:"transition",runId:t,timestamp:Date.now(),data:{from:a,to:o.currentStep,result:g.result}}),this.options.onTransition?.(a,o.currentStep),i++;}return o={...o,status:"completed",updatedAt:Date.now()},await this.store.saveRunState(t,o),{runId:t,status:"max_iterations",intent:"max_iterations",data:await this.store.getAllData(t),finalStep:o.currentStep,stepHistory:o.stepHistory,durationMs:Date.now()-o.startedAt}}};function v(r,t,e){return new k(r,t,e)}async function $(r){return (await import('yaml')).parse(r)}async function rt(r){let t=await fetch(r);if(!t.ok)throw new Error(`Failed to load flow from ${r}: ${t.statusText}`);let e=t.headers.get("content-type")??"",n=await t.text();return e.includes("json")||r.endsWith(".json")?JSON.parse(n):$(n)}async function nt(r){let e=await(await import('fs/promises')).readFile(r,"utf-8");return r.endsWith(".json")?JSON.parse(e):$(e)}function D(r){let t=[];if(!r||typeof r!="object")return ["Flow must be an object"];let e=r;if(!e.settings||typeof e.settings!="object"?t.push('Flow must have a "settings" object'):typeof e.settings.start_step!="string"&&t.push("settings.start_step must be a string"),!e.steps||typeof e.steps!="object")t.push('Flow must have a "steps" object');else {let n=e.steps;for(let[s,o]of Object.entries(n)){if(!o||typeof o!="object"){t.push(`Step "${s}" must be an object`);continue}let i=o;(!i.transitions||typeof i.transitions!="object")&&t.push(`Step "${s}" must have a "transitions" object`),i.failure_transitions!==void 0&&typeof i.failure_transitions!="object"&&t.push(`Step "${s}" failure_transitions must be an object when provided`);}}if(!e.terminal_states||typeof e.terminal_states!="object")t.push('Flow must have a "terminal_states" object');else {let n=e.terminal_states;for(let[s,o]of Object.entries(n)){if(!o||typeof o!="object"){t.push(`Terminal state "${s}" must be an object`);continue}typeof o.return_intent!="string"&&t.push(`Terminal state "${s}" must have a "return_intent" string`);}}return t}async function P(r){let t;typeof r=="string"?r.startsWith("http://")||r.startsWith("https://")?t=await rt(r):r.includes("{")?t=JSON.parse(r):t=await nt(r):t=r;let e=D(t);if(e.length>0)throw new Error(`Invalid step flow configuration:
|
|
2
2
|
- ${e.join(`
|
|
3
|
-
- `)}`);return t}function
|
|
4
|
-
exports.KVStorageStore=
|
|
3
|
+
- `)}`);return t}function M(r){return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function O(r){return atob(r.replace(/-/g,"+").replace(/_/g,"/"))}var A=class{constructor(t){this.kv=t;}kv;stateKey(t){return `state_${M(t)}`}dataPrefix(t){return `data_${M(t)}_`}dataKey(t,e){return `${this.dataPrefix(t)}${M(e)}`}async saveRunState(t,e){this.kv.write(this.stateKey(t),e);}async loadRunState(t){let e=this.kv.read(this.stateKey(t));return e!=null&&typeof e=="object"?e:null}async deleteRunState(t){this.kv.delete(this.stateKey(t));for(let e of this.kv.listKeys(this.dataPrefix(t)))this.kv.delete(e);}async setData(t,e,n){this.kv.write(this.dataKey(t,e),n);}async getData(t,e){return this.kv.read(this.dataKey(t,e))}async getAllData(t){let e=this.dataPrefix(t),n={};for(let s of this.kv.listKeys(e))n[O(s.slice(e.length))]=this.kv.read(s);return n}async clearData(t){for(let e of this.kv.listKeys(this.dataPrefix(t)))this.kv.delete(e);}async listRuns(){return this.kv.listKeys("state_").map(t=>O(t.slice(6)))}};var K=path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),pt=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)));function ut(){let r=path.resolve(K,"./jsonata-sync.cjs");return fs.existsSync(r)?r:path.resolve(K,"../card-compute/jsonata-sync.cjs")}var R=pt(ut());function B(r,t){if(!r||typeof r!="object")throw new Error(`[step-machine-public] Step "${t}" returned a non-object result.`);let e=r,n=e.result??e.status;if(typeof n=="string"&&n.trim().length>0){let s=e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?{...e.data}:{},o=typeof e.error=="string"?e.error:void 0;return o&&!("error"in s)&&(s.error=o),{result:n,data:s,...o?{error:o}:{}}}return {result:"success",data:{...e}}}function z(r,t){if(!t||t.length===0)return r;let e={};for(let n of t)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n]);return e}function _(r,t){return async(e,n)=>{let s=await r(e,n),o=B(s,n?.stepName??"unknown");return {result:o.result,data:z(o.data,t),...o.error?{error:o.error}:{}}}}function V(r,t,e){if(!t||t.length===0)return null;for(let n of t)try{if(!R(n).evaluate(r))return {result:"failure",data:{error:`[${e}] input validation failed: ${n}`}}}catch(s){let o=s instanceof Error?s.message:String(s);return {result:"failure",data:{error:`[${e}] input validation error on "${n}": ${o}`}}}return null}function T(r,t,e){return !t||t.length===0?r:async(n,s)=>{let o=V(n,t,e);return o||r(n,s)}}var N=path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),gt=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)));function mt(){let r=path.resolve(N,"./jsonata-sync.cjs");return fs.existsSync(r)?r:path.resolve(N,"../../card-compute/jsonata-sync.cjs")}var x=gt(mt());function U(r,t,e){if(!r||typeof r!="object")return t;let n={output:t},s=t.result,o=t.data,i=t.error;if(typeof r.resultExpr=="string")try{let a=x(r.resultExpr).evaluate(n);if(typeof a!="string"||!a.trim())throw new Error(`resultExpr did not produce a non-empty string (got ${JSON.stringify(a)})`);s=a;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.resultExpr failed: ${c}`)}if(typeof r.dataTemplate=="string")try{let a=x(r.dataTemplate).evaluate(n);if(!a||typeof a!="object"||Array.isArray(a))throw new Error(`dataTemplate did not produce an object (got ${JSON.stringify(a)})`);o=a;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.dataTemplate failed: ${c}`)}if(typeof r.errorExpr=="string")try{let a=x(r.errorExpr).evaluate(n);i=a!=null?String(a):void 0;}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`[${e}] outputTransforms.errorExpr failed: ${c}`)}return i!==void 0?{result:s,data:o,error:i}:{result:s,data:o}}var ht="b64:";function wt(r){let t=new TextEncoder().encode(r),e=globalThis.Buffer,n;if(e)n=e.from(t).toString("base64");else if(typeof btoa=="function"){let s="";for(let o of t)s+=String.fromCharCode(o);n=btoa(s);}else throw new Error("No base64 encoder available in this runtime");return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function W(r){return `${ht}${wt(JSON.stringify(r))}`}function q(r){return !!r&&typeof r=="object"&&r.type==="compute-jsonata"&&Array.isArray(r.expr)&&r.expr.length>0}function I(r){if(!r||typeof r!="object")return false;let t=r;if(t.type!=="ref"||typeof t.howToRun!="string")return false;if(typeof t.whatToRun=="string")return true;if(t.whatToRun&&typeof t.whatToRun=="object"){let e=t.whatToRun;return typeof e.kind=="string"&&typeof e.value=="string"}return false}function St(r){if(typeof r=="string"){let t=r.indexOf("=");if(t<1)throw new Error(`[step-machine-public] Invalid compute expression (missing "="): "${r}"`);return {bindTo:r.slice(0,t).trim(),expr:r.slice(t+1).trim()}}if(r&&typeof r=="object"&&typeof r.bindTo=="string"&&typeof r.expr=="string")return r;throw new Error(`[step-machine-public] Invalid compute step: ${JSON.stringify(r)}`)}function yt(r,t,e){let n=t.split("."),s=r;for(let o=0;o<n.length-1;o++){let i=n[o];(s[i]==null||typeof s[i]!="object")&&(s[i]={}),s=s[i];}s[n[n.length-1]]=e;}function Y(r,t,e){let n=r.expr.map(St);return async s=>{let o=s&&typeof s=="object"&&!Array.isArray(s)?{...s}:{},i={},a={expects_data:o,data:i,...e?{config:e}:{}},c,d;for(let f of n)try{let u=R(f.expr).evaluate(a);if(f.bindTo==="result")c=u!=null?String(u):"success";else if(f.bindTo==="error")d=u!=null?String(u):void 0;else if(f.bindTo.startsWith("data."))yt(i,f.bindTo.slice(5),u);else return {result:"failure",data:{},error:`[${t}] invalid bindTo "${f.bindTo}": must be "result", "error", or start with "data."`}}catch(u){let m=u instanceof Error?u.message:String(u);return {result:"failure",data:{},error:`[${t}] compute "${f.bindTo}" failed: ${m}`}}return c===void 0?{result:"failure",data:{},error:`[${t}] compute-jsonata: no "result" binding declared \u2014 add '- result = "success"' to expr`}:d?{result:c,data:i,error:d}:{result:c,data:i}}}function X(r,t,e,n){let{type:s,...o}=r,i={...o,whatToRun:typeof o.whatToRun=="object"?W(o.whatToRun):o.whatToRun};return async a=>{let c=a&&typeof a=="object"&&!Array.isArray(a)?{...a}:{};n&&(c.config=n);try{let d=await e(i,c);if(!r.outputTransforms)return d;try{return U(r.outputTransforms,d,t)}catch(f){let u=f instanceof Error?f.message:String(f);return {result:"failure",data:{},error:u}}}catch(d){let f=d instanceof Error?d.message:String(d);return {result:"failure",data:{error:`[step-machine-public] step "${t}" invoke threw: ${f}`}}}}}function G(){return async r=>({result:"success",data:r&&typeof r=="object"&&!Array.isArray(r)?r:{}})}function Rt(r,t,e){return async(n,s)=>{let o=n?.[t.items];if(!Array.isArray(o))return {result:"failure",data:{},error:`[${e}] forEach: "${t.items}" is not an array (got ${typeof o})`};let i=o,a=t.collectAs??`${t.items}_results`;if(i.length===0)return {result:"success",data:{[a]:[]}};let{[t.items]:c,...d}=n,f=Math.max(1,t.concurrency??1),u=new Array(i.length),m=0,g=0,w=0;return await new Promise(p=>{function l(){for(;m<f&&g<i.length;){let S=g++;m++;let Z={...d,[t.as]:i[S]};r(Z,s).then(y=>{u[S]=y;}).catch(y=>{let tt=y instanceof Error?y.message:String(y);u[S]={result:"failure",data:{},error:tt};}).finally(()=>{m--,u[S]?.result==="failure"&&w++,g>=i.length&&m===0?p():l();});}m===0&&g>=i.length&&p();}l();}),w>0?{result:"failure",data:{errors:u.filter(l=>l.result==="failure").map(l=>l.error)},error:`[${e}] forEach: ${w}/${i.length} items failed`}:{result:"success",data:{[a]:u.map(p=>p.data)}}}}function Q(r,t,e){let n=Array.isArray(t?.produces_data)?t?.produces_data:void 0,s=Array.isArray(t?.input_validations)?t?.input_validations:void 0,o=t?.config??void 0,i=t?.handler,a;return q(i)?a=Y(i,r,o):I(i)?a=X(i,r,e.invoke,o):a=G(),t?.forEach&&(a=Rt(a,t.forEach,r)),T(_(a,n),s,r)}function H(r,t){let e={};for(let[n,s]of Object.entries(r.steps??{}))e[n]=Q(n,s,t);return e}function kt(r){let t=r.storeFactory||(()=>new h);return {async run(e,n){try{let s=H(e,{invoke:r.invokeRef}),i=await v(e,s,{store:t()}).run(n);return i.status!=="completed"?{dispatched:!1,error:i.error?.message||i.status}:{dispatched:!0}}catch(s){return {dispatched:false,error:s instanceof Error?s.message:String(s)}}}}}
|
|
4
|
+
exports.KVStorageStore=A;exports.MemoryStore=h;exports.buildStepHandlersForFlow=H;exports.createComputeJsonataHandler=Y;exports.createPassthroughHandler=G;exports.createRefStepHandler=X;exports.createStepMachine=v;exports.createStepMachineChatFlowRunner=kt;exports.filterProducedData=z;exports.isComputeJsonataSpec=q;exports.isRefSpec=I;exports.jsonata=R;exports.loadStepFlow=P;exports.normalizeHandlerResult=B;exports.resolveStepHandler=Q;exports.runInputValidations=V;exports.wrapWithInputValidations=T;exports.wrapWithOutputFiltering=_;//# sourceMappingURL=index.cjs.map
|
|
5
5
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
export { c as createStepMachine, l as loadStepFlow } from '../loader-CuuLjxVA.cjs';
|
|
2
|
-
|
|
2
|
+
import { l as StepMachineStore } from '../types-DQ1bKuB1.cjs';
|
|
3
3
|
export { MemoryStore } from '../stores/memory.cjs';
|
|
4
4
|
export { KVStorageStore } from '../stores/kv.cjs';
|
|
5
5
|
import { ExecutionRef } from '../execution-refs.cjs';
|
|
6
|
-
import '../storage-interface-
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* step-machine-public — types
|
|
10
|
-
*
|
|
11
|
-
* Platform-free types for the declarative handler model.
|
|
12
|
-
* No Node imports. Safe for any runtime (Node, browser, Python via codegen, etc.).
|
|
13
|
-
*/
|
|
6
|
+
import '../storage-interface-B6ecOulj.cjs';
|
|
14
7
|
|
|
15
8
|
/**
|
|
16
9
|
* The single normalized shape the engine consumes.
|
|
@@ -74,6 +67,17 @@ type HandlerSpec = ComputeJsonataSpec | RefSpec;
|
|
|
74
67
|
* The framework awaits regardless.
|
|
75
68
|
*/
|
|
76
69
|
type InvokeRefFn = (ref: ExecutionRef, args: Record<string, unknown>) => NormalizedHandlerResult | Promise<NormalizedHandlerResult>;
|
|
70
|
+
interface CreateStepMachineChatFlowRunnerOptions$1 {
|
|
71
|
+
invokeRef: InvokeRefFn;
|
|
72
|
+
storeFactory?: () => StepMachineStore;
|
|
73
|
+
}
|
|
74
|
+
interface StepMachineChatFlowRunnerResult$1 {
|
|
75
|
+
dispatched: boolean;
|
|
76
|
+
error?: string;
|
|
77
|
+
}
|
|
78
|
+
interface StepMachineChatFlowRunner$1 {
|
|
79
|
+
run(flow: unknown, args: Record<string, unknown>): Promise<StepMachineChatFlowRunnerResult$1>;
|
|
80
|
+
}
|
|
77
81
|
/**
|
|
78
82
|
* Handler signature consumed by the existing pure step machine.
|
|
79
83
|
*
|
|
@@ -176,4 +180,17 @@ type JsonataExpression = {
|
|
|
176
180
|
};
|
|
177
181
|
declare const jsonata: (expr: string) => JsonataExpression;
|
|
178
182
|
|
|
179
|
-
|
|
183
|
+
interface CreateStepMachineChatFlowRunnerOptions {
|
|
184
|
+
invokeRef: InvokeRefFn;
|
|
185
|
+
storeFactory?: () => StepMachineStore;
|
|
186
|
+
}
|
|
187
|
+
interface StepMachineChatFlowRunnerResult {
|
|
188
|
+
dispatched: boolean;
|
|
189
|
+
error?: string;
|
|
190
|
+
}
|
|
191
|
+
interface StepMachineChatFlowRunner {
|
|
192
|
+
run(flow: unknown, args: Record<string, unknown>): Promise<StepMachineChatFlowRunnerResult>;
|
|
193
|
+
}
|
|
194
|
+
declare function createStepMachineChatFlowRunner(options: CreateStepMachineChatFlowRunnerOptions): StepMachineChatFlowRunner;
|
|
195
|
+
|
|
196
|
+
export { type BuildStepHandlersOptions, type ComputeJsonataSpec, type CreateStepMachineChatFlowRunnerOptions$1 as CreateStepMachineChatFlowRunnerOptions, type HandlerSpec, type InvokeRefFn, type JsonataExpression, type NormalizedHandlerResult, type RefSpec, type ResolveStepHandlerOptions, type StepConfigForFactory, type StepHandler, type StepMachineChatFlowRunner$1 as StepMachineChatFlowRunner, type StepMachineChatFlowRunnerResult$1 as StepMachineChatFlowRunnerResult, StepMachineStore, buildStepHandlersForFlow, createComputeJsonataHandler, createPassthroughHandler, createRefStepHandler, createStepMachineChatFlowRunner, filterProducedData, isComputeJsonataSpec, isRefSpec, jsonata, normalizeHandlerResult, resolveStepHandler, runInputValidations, wrapWithInputValidations, wrapWithOutputFiltering };
|