yaml-flow 8.4.5 → 8.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/browser/asset-integrity.json +3 -3
  2. package/browser/board-livecards-localstorage.js +6 -6
  3. package/browser/live-cards.js +7 -7
  4. package/cli/node/fs-board-adapter.d.ts +1 -1
  5. package/cli/node/fs-board-adapter.js +1 -1
  6. package/cli/node/step-machine-cli.d.ts +57 -1
  7. package/cli/node/step-machine-cli.js +3 -3
  8. package/examples/board/demo-shell-with-server.html +2 -2
  9. package/examples/board/doc.html +2 -2
  10. package/examples/board-local/demo-shell-localstorage.html +3 -3
  11. package/lib/{artifacts-store-lib-454TAuov.d.ts → artifacts-store-lib-CXgRA5J7.d.ts} +1 -1
  12. package/lib/{artifacts-store-lib-zsGFbBV8.d.cts → artifacts-store-lib-WdoKNAF0.d.cts} +1 -1
  13. package/lib/artifacts-store-public.d.cts +1 -1
  14. package/lib/artifacts-store-public.d.ts +1 -1
  15. package/lib/board-live-cards-node.cjs +1 -1
  16. package/lib/board-live-cards-node.d.cts +4 -4
  17. package/lib/board-live-cards-node.d.ts +4 -4
  18. package/lib/board-live-cards-node.js +1 -1
  19. package/lib/board-live-cards-server-runtime.cjs +3 -3
  20. package/lib/board-live-cards-server-runtime.d.cts +2 -2
  21. package/lib/board-live-cards-server-runtime.d.ts +2 -2
  22. package/lib/board-live-cards-server-runtime.js +3 -3
  23. package/lib/{constants-DXxsRN9y.d.cts → constants-C-iQV9ZB.d.cts} +1 -1
  24. package/lib/{constants-BPVLb3Es.d.ts → constants-dmPZTieN.d.ts} +1 -1
  25. package/lib/event-graph/index.d.cts +2 -2
  26. package/lib/event-graph/index.d.ts +2 -2
  27. package/lib/index.cjs +2 -2
  28. package/lib/index.d.cts +3 -3
  29. package/lib/index.d.ts +3 -3
  30. package/lib/index.js +2 -2
  31. package/lib/{loader-CuuLjxVA.d.cts → loader-Bw7KRzCK.d.cts} +1 -1
  32. package/lib/{loader-Zborm2pq.d.ts → loader-D6xGRDWX.d.ts} +1 -1
  33. package/lib/server-runtime/index.cjs +3 -3
  34. package/lib/server-runtime/index.d.cts +3 -3
  35. package/lib/server-runtime/index.d.ts +3 -3
  36. package/lib/server-runtime/index.js +3 -3
  37. package/lib/step-machine/index.cjs +2 -2
  38. package/lib/step-machine/index.d.cts +3 -3
  39. package/lib/step-machine/index.d.ts +3 -3
  40. package/lib/step-machine/index.js +2 -2
  41. package/lib/step-machine-public/index.cjs +1 -1
  42. package/lib/step-machine-public/index.d.cts +2 -2
  43. package/lib/step-machine-public/index.d.ts +2 -2
  44. package/lib/step-machine-public/index.js +1 -1
  45. package/lib/stores/index.d.cts +1 -1
  46. package/lib/stores/index.d.ts +1 -1
  47. package/lib/stores/kv.d.cts +1 -1
  48. package/lib/stores/kv.d.ts +1 -1
  49. package/lib/stores/memory.d.cts +1 -1
  50. package/lib/stores/memory.d.ts +1 -1
  51. package/lib/{types-DX8wXuZ0.d.cts → types-Dc70aHzf.d.cts} +1 -1
  52. package/lib/{types-DQ1bKuB1.d.ts → types-DjlwALZC.d.cts} +1 -0
  53. package/lib/{types-DQ1bKuB1.d.cts → types-DjlwALZC.d.ts} +1 -0
  54. package/lib/{types-BC8ZnA6i.d.ts → types-YXF9Oai2.d.ts} +1 -1
  55. package/package.json +1 -1
  56. package/schema/flow.schema.json +6 -1
@@ -15,6 +15,6 @@ ${new Date().toISOString()}
15
15
  `).filter(Boolean).map(n=>JSON.parse(n)):[]}return {append(r){let n={id:randomUUID(),payload:r};return b.mkdirSync(J.dirname(e),{recursive:true}),b.appendFileSync(e,JSON.stringify(n)+`
16
16
  `,"utf-8"),n},readAll(){return t()},readAfter(r){let n=t();if(!r)return {entries:n,newCursor:n.length>0?n[n.length-1].id:null};let s=n.findIndex(a=>a.id===r),o=s===-1?n:n.slice(s+1);return {entries:o,newCursor:o.length>0?o[o.length-1].id:r}},clear(){b.existsSync(e)&&b.truncateSync(e,0);}}}function Hn(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(Hn).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Hn(t[n])}`).join(",")}}`}function wa(e){return createHash("sha256").update(Hn(e)).digest("hex")}function ba(e){let t=J.join(e,"board-journal.jsonl");return {readAllEntries(){if(!b.existsSync(t))return [];let r=b.readFileSync(t,"utf-8").trim();return r?r.split(`
17
17
  `).filter(Boolean).map(n=>JSON.parse(n)):[]},appendEntry(r){b.appendFileSync(t,JSON.stringify(r)+`
18
- `,"utf-8");},generateId(){return randomUUID()}}}function _a(e){return {tryAcquire(){try{if(!b.existsSync(e)){b.mkdirSync(J.dirname(e),{recursive:!0});try{b.writeFileSync(e,"{}",{flag:"wx"});}catch{}}return lockSync(e,{retries:0})}catch{return null}}}}var Ra={$schema:"http://json-schema.org/draft-07/schema#",$id:"https://nsreehari.github.io/boards/live-cards.schema.json",definitions:{bind_ref:{description:"A card data path reference, e.g. 'card_data.raw_quotes' or 'requires.upstream'",type:"string",pattern:"^(card_data|requires|fetched_sources|computed_values)(\\.|$)"},bind_or_literal:{description:"A literal value or a bind reference object",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref"}},required:["bind"]}]},compute_expr:{description:"A declarative JSON compute expression",type:"object",required:["fn"],properties:{fn:{type:"string",description:"Function name from the built-in vocabulary",enum:["sum","avg","min","max","count","first","last","add","sub","mul","div","round","abs","mod","gt","gte","lt","lte","eq","neq","if","and","or","not","concat","upper","lower","template","filter","pluck","map","sort","slice","flat","unique","group","get","default","now","diff_days","format_date"]},input:{description:"card_data.path, literal, array of inputs, or nested compute_expr",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{$ref:"#/definitions/compute_expr"}]},field:{type:"string",description:"For pluck/sum/group \u2014 the object key to extract"},where:{$ref:"#/definitions/compute_expr",description:"For filter \u2014 predicate expression ($ = current item)"},cond:{$ref:"#/definitions/compute_expr",description:"For if \u2014 condition expression"},then:{description:"For if \u2014 value when cond is truthy"},else:{description:"For if \u2014 value when cond is falsy"},format:{type:"string",description:"For format_date \u2014 date format string"}}},meta:{type:"object",properties:{title:{type:"string"},tags:{type:"array",items:{type:"string"}}}},requires:{type:"array",items:{type:"string"},description:"IDs of upstream nodes this node depends on"},provides:{type:"array",items:{type:"object",required:["bindTo","ref"],properties:{bindTo:{type:"string",description:"Token name published downstream"},ref:{type:"string",description:"Path to read value from (card_data.*, requires.*, fetched_sources.*, computed_values.*)"}}},description:"Explicit bindings exposing computed or card_data values downstream as named tokens"},compute_step:{description:"A single ordered compute step: reads card_data.*/requires.*/computed_values.*, writes to computed_values[bindTo]",type:"object",required:["bindTo","expr"],properties:{bindTo:{type:"string",description:"Key in computed_values to write result"},expr:{type:"string",description:"JSONata expression evaluated against { card_data, requires, fetched_sources, computed_values }"}}},source_def:{description:"One source entry. The engine requires 'bindTo' (compute namespace key) and 'outputFile' (delivery signal path). bindTo and outputFile must be unique across all source_defs in a card. Every other property is yours \u2014 add whatever your task-executor needs: kind, url, headers, mailbox, channel, model, query, etc. The full object is passed verbatim as the --in JSON to the executor.",type:"object",required:["bindTo","outputFile"],additionalProperties:true,properties:{bindTo:{type:"string",description:"Key under fetched_sources.* available in compute expressions"},outputFile:{type:"string",description:"Board-relative path the executor writes its JSON result to. Presence of this file signals delivery."},projections:{type:"object",description:"Named data projections from card_data or requires, evaluated before the executor is called. Each key is a ref name; each value is a JSONata expression rooted at card_data or requires. The resolved values are passed to the executor as _projections. fetched_sources, computed_values, and source_defs are not accessible here \u2014 sources run before those exist.",additionalProperties:{type:"string"}},optionalForCompletionGating:{type:"boolean",default:false,description:"When true this source does not gate card completion. Default false when absent, so source_defs are completion-gating by default."},timeout:{type:"integer",minimum:0,default:12e4,description:"Executor/script timeout in ms. Default: 120 000 (2 min)."},script:{type:"string",description:"Legacy direct-run: shell command executed when no .task-executor is registered. stdout is captured as the result."}}},render_element:{type:"object",required:["kind"],properties:{id:{type:"string",description:"Optional element ID for targeted updates"},kind:{enum:["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]},label:{type:"string",description:"Heading above this element"},className:{type:"string",description:"Bootstrap grid class, e.g. 'col-12 col-md-6'"},visible:{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 element shown only if truthy"},data:{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref",description:"card_data/requires/fetched_sources/computed_values path to read data from"},writeTo:{$ref:"#/definitions/bind_ref",description:"card_data path for user input (form, filter, todo, notes)"},columns:{type:"array",items:{type:"string"},description:"table: visible columns"},maxRows:{type:"integer",description:"table/list: max rows to display"},sortable:{type:"boolean",default:true,description:"table: enable click-to-sort"},placeholder:{type:"string",description:"Empty-state message"},chartType:{enum:["bar","line","pie","doughnut"]},chartOptions:{type:"object",description:"Chart.js options passthrough"},fields:{type:"object",description:"JSON Schema for form/filter fields"},thresholds:{type:"object",properties:{green:{type:"string"},amber:{type:"string"}}},colorMap:{type:"object",description:"badge: value \u2192 Bootstrap color"},style:{enum:["heading","muted","default"],description:"text: display style"},upload:{type:"boolean",default:true,description:"file-upload: show drop zone (false = read-only file list)"},accept:{type:"array",items:{type:"string"},description:"file-upload: allowed extensions"},multiple:{type:"boolean",default:true,description:"file-upload: allow multiple files"},fileAttach:{type:"boolean",default:false,description:"chat: enable inline file attachments"},fileAccept:{type:"array",items:{type:"string"},description:"chat: allowed attachment extensions"},buttons:{type:"array",description:"actions: button definitions",items:{type:"object",required:["id","label"],properties:{id:{type:"string"},label:{type:"string"},style:{type:"string",description:"Bootstrap button variant, e.g. 'success', 'outline-danger'"},size:{type:"string",default:"sm"},disabled:{oneOf:[{type:"boolean"},{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 truthy = disabled"}]}}}}}}}},view:{type:"object",required:["elements"],properties:{elements:{type:"array",minItems:1,items:{$ref:"#/definitions/render_element"}},layout:{type:"object",properties:{board:{type:"object",properties:{col:{type:"integer",minimum:1,maximum:12},order:{type:"integer"}}},canvas:{type:"object",properties:{x:{type:"number"},y:{type:"number"},w:{type:"number"},h:{type:"number"}}}}},features:{type:"object",properties:{chat:{type:"boolean",default:false},notes:{type:"boolean",default:false},refresh:{type:"boolean",default:true}}}}}},title:"LiveCard",description:"A unified card node. Behavior depends on which sections are present (source_defs, compute, view, etc.)",type:"object",required:["id"],additionalProperties:false,properties:{id:{type:"string"},requires:{$ref:"#/definitions/requires"},provides:{$ref:"#/definitions/provides"},meta:{$ref:"#/definitions/meta"},view:{$ref:"#/definitions/view"},card_data:{type:"object",description:"Authored card data and runtime metadata. Includes uploaded-file metadata maintained by host handlers and inference evaluation results.",properties:{files:{type:"array",description:"Optional uploaded-file metadata maintained by host handlers. Stored name is normalized and serial-prefixed (for example 001-my_file.pdf).",items:{type:"object",required:["name","stored_name"],properties:{name:{type:"string",minLength:1},stored_name:{type:"string",minLength:5,maxLength:32,pattern:"^[0-9]{3,}-[a-z0-9._-]+$"},size:{oneOf:[{type:"integer",minimum:0},{type:"null"}]},mime_type:{type:"string"},path:{type:"string",pattern:"^[^\\s]+/files/[0-9]{3,}-[a-z0-9._-]+$"},uploaded_at:{type:"string",format:"date-time"}},additionalProperties:false}}},additionalProperties:true},source_defs:{type:"array",description:"Source entries. Each entry is passed verbatim to the board's .task-executor (registered via init --task-executor) as the --in JSON file. The executor fetches/generates the data and writes JSON to --out. If no executor is registered, the built-in executor runs the entry's 'cli' command directly. Sources gate completion by default. Set optionalForCompletionGating: true for enrichment-only source_defs that should not block task-completed.",items:{$ref:"#/definitions/source_def"}},compute:{type:"array",description:"Ordered array of compute steps. Each reads card_data.*/requires.*/fetched_sources.*/computed_values.* and writes to ephemeral computed_values[bindTo].",items:{$ref:"#/definitions/compute_step"}}}};var ec=Zc(Xu());var lh=createRequire(import.meta.url),fh=lh("./jsonata-sync.cjs"),En=null;var Qu=/\b(card_data|requires|fetched_sources|computed_values|source_defs)\b/g,ph=/^\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\.|$)/;function mh(e){let t=new Set,r;for(Qu.lastIndex=0;(r=Qu.exec(e))!==null;)t.add(r[1]);return t}function tc(e){let t=ph.exec(e);return t?t[1]:null}function Zu(e,t,r,n){try{fh(e);}catch(o){let a=o instanceof Error?o.message:String(o);n.push(`${t}: invalid JSONata expression (${a})`);return}let s=mh(e);for(let o of s)r.has(o)||n.push(`${t}: disallowed namespace "${o}" in expression`);}function qo(e,t,r){if(Array.isArray(e)){e.forEach((s,o)=>{qo(s,`${t}/${o}`,r);});return}if(typeof e=="string"){let s=tc(e);if(!s)return;new Set(["card_data","requires","computed_values"]).has(s)||r.push(`${t}: disallowed namespace "${s}" in view reference`);return}if(!e||typeof e!="object")return;let n=e;for(let[s,o]of Object.entries(n))qo(o,`${t}/${s}`,r);}function gh(){if(En)return En;let e=new ec.default({allErrors:true});return ch(e),En=e.compile(Ra),En}function rc(e){let t=gh(),r=t(e),n=(t.errors??[]).map(s=>`${s.instancePath||"/"}: ${s.message??"unknown error"}`);if(e&&typeof e=="object"&&!Array.isArray(e)){let s=e.source_defs;if(Array.isArray(s)){let o=new Set,a=new Set;s.forEach((i,c)=>{if(!i||typeof i!="object"||Array.isArray(i))return;let u=i;typeof u.bindTo=="string"&&u.bindTo&&(o.has(u.bindTo)&&n.push(`/source_defs/${c}/bindTo: bindTo "${u.bindTo}" must be unique across all source_defs`),o.add(u.bindTo)),typeof u.outputFile=="string"&&u.outputFile&&(a.has(u.outputFile)&&n.push(`/source_defs/${c}/outputFile: outputFile "${u.outputFile}" must be unique across all source_defs`),a.add(u.outputFile));});}}return !r||n.length>0?{ok:false,errors:n}:{ok:true,errors:[]}}function nc(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:true,errors:[]};let r=e,n=r.compute;Array.isArray(n)&&n.forEach((u,d)=>{if(!u||typeof u!="object"||Array.isArray(u))return;let l=u.expr;typeof l!="string"||l.trim().length===0||Zu(l,`/compute/${d}/expr`,new Set(["card_data","requires","fetched_sources","computed_values"]),t);});let s=new Set(["card_data","requires","fetched_sources","computed_values"]),o=r.provides;Array.isArray(o)&&o.forEach((u,d)=>{if(!u||typeof u!="object"||Array.isArray(u))return;let l=u.ref;if(typeof l!="string"||l.trim().length===0)return;let h=tc(l);h===null?t.push(`/provides/${d}/ref: path "${l}" must start with a valid namespace (${[...s].join(", ")})`):s.has(h)||t.push(`/provides/${d}/ref: disallowed namespace "${h}" in path "${l}" (valid: ${[...s].join(", ")})`);});let a=r.view;a&&typeof a=="object"&&!Array.isArray(a)&&qo(a,"/view",t);let i=new Set(["card_data","requires"]),c=r.source_defs;return Array.isArray(c)&&c.forEach((u,d)=>{if(!u||typeof u!="object"||Array.isArray(u))return;let l=u.projections;if(!(!l||typeof l!="object"||Array.isArray(l)))for(let[h,y]of Object.entries(l))typeof y!="string"||y.trim().length===0||Zu(y,`/source_defs/${d}/projections/${h}`,i,t);}),{ok:t.length===0,errors:t}}function Fo(e){let t=rc(e);if(!t.ok)return t;let r=nc(e);return r.ok?{ok:true,errors:[]}:{ok:false,errors:r.errors}}function sc(e){return String(e).replace(/[^a-zA-Z0-9_-]/g,"_")}function oc(e){let t=e.payload??{};return {id:e.id,role:typeof t.role=="string"?t.role:"system",text:typeof t.text=="string"?t.text:"",files:Array.isArray(t.files)?t.files:[],updated_at:typeof t.updated_at=="string"?t.updated_at:""}}function Do(e,t){let r=s=>`chats/${sc(s)}/processing`,n=s=>`chats/${sc(s)}/config`;return {append(s,o,a,i=[]){return e(s).append({role:o,text:a,files:i,updated_at:new Date().toISOString()}).id},readAll(s){return e(s).readAll().map(oc)},readAfter(s,o){let a=e(s).readAfter(o);return {records:a.entries.map(oc),cursor:a.newCursor}},clear(s){e(s).clear?.();},setProcessing(s,o){o?t.write(r(s),true):t.delete(r(s));},isProcessing(s){return t.read(r(s))===true},getConfig(s){return t.read(n(s))??{}},setConfig(s,o){let a=t.read(n(s))??{};t.write(n(s),{...a,...o});}}}function hh(){let e=globalThis.crypto;return typeof e?.randomUUID=="function"?String(e.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function yh(){let e=new Map,t=new Map;function r(n){return e.has(n)||e.set(n,[]),e.get(n)}return {append(n,s,o,a=[]){let i={id:hh(),role:s,text:o,files:a,updated_at:new Date().toISOString()};return r(n).push(i),i.id},readAll(n){return r(n).slice()},readAfter(n,s){let o=r(n);if(!s)return {records:o.slice(),cursor:o.length>0?o[o.length-1].id:null};let a=o.findIndex(c=>c.id===s),i=a===-1?o.slice():o.slice(a+1);return {records:i,cursor:i.length>0?i[i.length-1].id:s}},clear(n){e.set(n,[]);},setProcessing(n,s){s?t.set(`p:${n}`,true):t.delete(`p:${n}`);},isProcessing(n){return t.get(`p:${n}`)===true},getConfig(n){return t.get(`c:${n}`)??{}},setConfig(n,s){let o=t.get(`c:${n}`)??{};t.set(`c:${n}`,{...o,...s});}}}var mt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ie(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function gt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function ac(e){return e.tasks??{}}function Mo(e){return e?e.status===mt.FAILED||e.status===mt.INACTIVATED:false}function ic(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function uc(e){return e.maxExecutions}function cc(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===mt.COMPLETED){let o=e.tasks[n];o&&Ie(o).forEach(i=>r.add(i));}return Array.from(r)}function dc(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;Ie(s).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function lc(e,t,r){let n=e.tasks[t]??xn(),s={};if(r){let a=r.tasks[t],i=gt(a);for(let c of i)for(let[u,d]of Object.entries(r.tasks))if(Ie(d).includes(c)){let l=e.tasks[u];l?.lastDataHash&&(s[c]=l.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function fc(e,t,r,n,s,o){let a=e.tasks[r]??xn(),i=t.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let c;n&&i.on&&i.on[n]?c=i.on[n]:c=Ie(i);let u=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let h=i.requires??[];for(let y of h)for(let[f,p]of Object.entries(t.tasks))if(Ie(p).includes(y)){let v=e.tasks[f];v?.lastDataHash&&(u[y]=v.lastDataHash);break}}let d={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:u,error:void 0},l=[...new Set([...e.availableOutputs,...c])];return {...e,tasks:{...e.tasks,[r]:d},availableOutputs:l,lastUpdated:new Date().toISOString()}}function pc(e,t,r,n){let s=e.tasks[r]??xn(),o=t.tasks[r];if(o?.retry){let c=s.retryCount+1;if(c<=o.retry.max_attempts){let u={...s,status:"not-started",retryCount:c,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:u},lastUpdated:new Date().toISOString()}}}let a={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},i=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(i=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&a.executionCount>=o.circuit_breaker.max_executions){let c=o.circuit_breaker.on_break;i=[...new Set([...i,...c])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:i,lastUpdated:new Date().toISOString()}}function mc(e,t,r,n){let s=e.tasks[t]??xn(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function gc(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function xn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Tn(e,t){let r=`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=yc();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function vh(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:lc(n,t.taskName,r)};case "task-completed":return {config:r,state:fc(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:pc(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:mc(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:gc(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Ch(n,t.action)};case "task-upsert":return Sh(e,t.taskName,t.taskConfig);case "task-removal":return kh(e,t.taskName);case "node-requires-add":return wh(e,t.nodeName,t.tokens);case "node-requires-remove":return bh(e,t.nodeName,t.tokens);case "node-provides-add":return _h(e,t.nodeName,t.tokens);case "node-provides-remove":return Rh(e,t.nodeName,t.tokens);default:return e}}function hc(e,t){return t.reduce((r,n)=>vh(r,n),e)}function Sh(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:yc()},lastUpdated:new Date().toISOString()}}}function kh(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function wh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=gt(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function bh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=gt(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function _h(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Ie(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function Rh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Ie(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function Tr(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function An(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function yc(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ch(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function Ar(e){let{config:t,state:r}=e,n=ac(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=$h(n),a=cc(t,r.tasks),i=new Set([...a,...r.availableOutputs]),c=[],u=[],d=[],l=[];for(let[y,f]of Object.entries(n)){let p=r.tasks[y],v=ic(f,t.settings),_=v!=="once";if(p?.status===mt.RUNNING||Mo(p))continue;let g=uc(f);if(g!==void 0&&p&&p.executionCount>=g||f.circuit_breaker&&p&&p.executionCount>=f.circuit_breaker.max_executions||!_&&p?.status===mt.COMPLETED)continue;if(_&&p?.status===mt.COMPLETED){let R=gt(f),E=false;switch(v){case "data-changed":{R.length>0&&R.some(O=>{for(let[B,W]of Object.entries(n))if(Ie(W).includes(O)){let Z=r.tasks[B];if(!Z)continue;let fe=p.lastConsumedHashes?.[O];return Z.lastDataHash==null?Z.executionCount>p.lastEpoch:Z.lastDataHash!==fe}return false})||(E=true);break}case "epoch-changed":{R.length>0&&R.some(O=>{for(let[B,W]of Object.entries(n))if(Ie(W).includes(O)){let Z=r.tasks[B];if(Z&&Z.executionCount>p.lastEpoch)return true}return false})||(E=true);break}case "time-based":{let I=f.refreshInterval??0;if(I<=0){E=true;break}let O=p.completedAt;if(!O){E=true;break}(Date.now()-Date.parse(O))/1e3<I&&(E=true);break}case "manual":E=true;break}if(E)continue}let m=gt(f);if(m.length===0){c.push(y);continue}let k=[],w=[],$=[];for(let R of m){if(i.has(R))continue;let E=o[R]||[];E.length===0?k.push(R):E.every(O=>Mo(r.tasks[O]))?$.push({token:R,failedProducer:E[0]}):w.push(R);}k.length>0?d.push({taskName:y,missingTokens:k}):$.length>0?l.push({taskName:y,failedTokens:$.map(R=>R.token),failedProducers:[...new Set($.map(R=>R.failedProducer))]}):w.length>0?u.push({taskName:y,waitingOn:w}):c.push(y);}let h={};if(c.length>1){let y=dc(c,n);for(let[f,p]of Object.entries(y))p.length>1&&(h[f]=p);}return {eligible:c,pending:u,unresolved:d,blocked:l,conflicts:h}}function $h(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of Ie(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var Ir=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Lo(e){let t=Vo(e);return Eh(t)}function Vo(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Vo).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Vo(t[n])).join(",")+"}"}function Eh(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function xh(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Th(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function vc(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return xh(t)}function Ah(e){try{let t=JSON.parse(Th(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Sc(e,t,r){let{handlers:n,onDrain:s}=t,o=new Ir,a="state"in e&&"config"in e?e:Tn(e),i=false,c=new Set,u=new Map(Object.entries(n)),d=new Ir,l=false,h=false;function y(){if(!i){if(l){h=true;return}l=true;try{do h=!1,f();while(h)}finally{l=false;}}}function f(){let g=d.drain(),m=o.drain(),k=[...g,...m];k.length>0&&(a=hc(a,k));let w=Ar(a);k.length>0&&s?.(k,a,w);for(let $ of w.eligible)_($);for(let $ of k)if($.type==="task-progress"){let{taskName:R,update:E}=$;if(!a.config.tasks[R])continue;let O=a.state.tasks[R];if(!O||O.status!=="running")continue;let B=vc(R),W=v(R,B,E).catch(Z=>{i||(d.append({type:"task-failed",taskName:R,error:Z.message??String(Z),timestamp:new Date().toISOString()}),y());}).finally(()=>{c.delete(W);});c.add(W);}}function p(g){let k=a.config.tasks[g].requires??[],w=new Map;for(let[R,E]of Object.entries(a.config.tasks))for(let I of E.provides??[])w.set(I,R);let $={};for(let R of k){let E=w.get(R);E?$[R]=a.state.tasks[E]?.data:$[R]=void 0;}return $}async function v(g,m,k){let w=a.config.tasks[g],$=w.taskHandlers??[],R=p(g);for(let E of $){let I=u.get(E);if(!I)throw new Error(`Handler '${E}' not found in registry (task '${g}')`);let O={nodeId:g,state:R,taskState:a.state.tasks[g],config:w,callbackToken:m,update:k};if(await I(O)==="task-initiate-failure")throw new Error(`Handler '${E}' returned task-initiate-failure (task '${g}')`)}}function _(g){let k=a.config.tasks[g]?.taskHandlers;if(!k||k.length===0)return;d.append({type:"task-started",taskName:g,timestamp:new Date().toISOString()}),y();let w=vc(g),$=v(g,w).catch(R=>{i||(d.append({type:"task-failed",taskName:g,error:R.message??String(R),timestamp:new Date().toISOString()}),y());}).finally(()=>{c.delete($);});c.add($);}return {push(g){i||(g.type==="task-completed"&&g.data&&!g.dataHash&&(g={...g,dataHash:Lo(g.data)}),o.append(g),y());},pushAll(g){if(!i){for(let m of g)m.type==="task-completed"&&m.data&&!m.dataHash?o.append({...m,dataHash:Lo(m.data)}):o.append(m);y();}},resolveCallback(g,m,k){if(i)return;let w=Ah(g);if(!w)return;let{taskName:$}=w;if(a.config.tasks[$]){if(k&&k.length>0)o.append({type:"task-failed",taskName:$,error:k.join("; "),timestamp:new Date().toISOString()});else {let R=m&&Object.keys(m).length>0?Lo(m):void 0;o.append({type:"task-completed",taskName:$,data:m,dataHash:R,timestamp:new Date().toISOString()});}y();}},addNode(g,m){i||(o.append({type:"task-upsert",taskName:g,taskConfig:m,timestamp:new Date().toISOString()}),y());},removeNode(g){i||(o.append({type:"task-removal",taskName:g,timestamp:new Date().toISOString()}),y());},addRequires(g,m){i||(o.append({type:"node-requires-add",nodeName:g,tokens:m,timestamp:new Date().toISOString()}),y());},removeRequires(g,m){i||(o.append({type:"node-requires-remove",nodeName:g,tokens:m,timestamp:new Date().toISOString()}),y());},addProvides(g,m){i||(o.append({type:"node-provides-add",nodeName:g,tokens:m,timestamp:new Date().toISOString()}),y());},removeProvides(g,m){i||(o.append({type:"node-provides-remove",nodeName:g,tokens:m,timestamp:new Date().toISOString()}),y());},registerHandler(g,m){u.set(g,m);},unregisterHandler(g){u.delete(g);},retrigger(g){i||a.config.tasks[g]&&(o.append({type:"task-restart",taskName:g,timestamp:new Date().toISOString()}),y());},retriggerAll(g){if(!i){for(let m of g)a.config.tasks[m]&&o.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()});y();}},snapshot(){return Tr(a)},getState(){return a},getSchedule(){return Ar(a)},async waitForHandlers(){c.size>0&&await Promise.allSettled([...c]);},async dispose(g){g?.wait&&c.size>0&&await Promise.allSettled([...c]),i=true;}}}var Ph=createRequire(import.meta.url),In=Ph("./jsonata-sync.cjs"),bc=In;function kc(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function _c(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Oh(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await In(s.expr).evaluate(n);_c(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function jh(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let a=bc(o.expr).evaluate(n);_c(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch(a){let i=a instanceof Error?a.message:String(a);s.push({bindTo:o.bindTo,error:i});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Nh(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return In(e).evaluate(n)}function qh(e,t){return t.startsWith("fetched_sources.")?kc(e._sourcesData??{},t.slice(16)):kc(e,t)}var wc=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Fh=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Dh(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Fh.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,a)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${a}]: must be an object`);else {let i=o;typeof i.bindTo!="string"||!i.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(s.has(i.outputFile)&&t.push(`source_defs[${a}]: outputFile "${i.outputFile}" is not unique across source_defs`),s.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):wc.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...wc].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Mh(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=await In(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Lh(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=bc(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var ht={run:Oh,runSync:jh,eval:Nh,resolve:qh,validate:Dh,enrichSources:Mh,enrichSourcesSync:Lh};function Vh(e,t){let r;return /\.m?js$/i.test(e)?r="local-node":/\.py$/i.test(e)?r="local-python":r="local-process",{meta:"task-executor",howToRun:r,whatToRun:oe({kind:"fs-path",value:e}),...t?{extra:t}:{}}}function Bo(e){return JSON.stringify(e)}function Go(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function Pn(e,t){function r(){return e.readIndex()??{}}function n(s,o,a){let i=String(o||"").split(".").filter(Boolean);if(i.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let c={...s},u=c;for(let d=0;d<i.length-1;d++){let l=i[d],h=u[l],y=h&&typeof h=="object"&&!Array.isArray(h)?{...h}:{};u[l]=y,u=y;}return u[i[i.length-1]]=a,c}return {readCard(s){let o=r()[s];return !o||!e.cardExists(o.key)?null:e.readCard(o.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[o,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let i=e.readCard(a.key);i?s.push(i):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,a]of Object.entries(r()))s[o]=a.checksum;return s},changedSince(s){let o=r(),a=[];for(let[i,c]of Object.entries(o))s[i]!==c.checksum&&a.push(i);for(let i of Object.keys(s))o[i]||a.push(i);return a},validateUpsert(s,o){let a=r(),i=a[s],c=Object.entries(a).find(([,u])=>u.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:c&&c[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${c[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,a){let i=r(),c=a??i[s]?.key??e.defaultCardKey(s),u=e.writeCard(c,o);i[s]={key:c,checksum:u,updatedAt:new Date().toISOString()},e.writeIndex(i);},patchCard(s,o,a){let i=r(),c=i[s];if(!c||!e.cardExists(c.key))throw new Error(`card "${s}" not found`);let u=e.readCard(c.key);if(!u||typeof u!="object"||Array.isArray(u))throw new Error(`card "${s}" is not patchable`);let d=n(u,o,a),l=e.writeCard(c.key,d);i[s]={key:c.key,checksum:l,updatedAt:new Date().toISOString()},e.writeIndex(i);},removeCard(s){let o=r(),a=o[s];a&&(e.removeCard(a.key),delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function Ko(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let o=s.trim();if(!o)return null;try{return JSON.parse(o)}catch{return o}},ingestSourceDataStaged(r,n,s,o){let a=t(s);e.write(`${r}/.staged/${o}/${n}`,a);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,a=e.read(o);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function xc(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(o=>o.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function Tc(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let o of s)try{n(o);}catch(a){let i=a instanceof Error?a.message:String(a);try{t(o,i);}catch{}}e.delete(r);}}}}var Pr="v1",yt="board/graph",Ac="board/lastJournalProcessedId";function Rc(e){return `cards/${e}/runtime`}function Ic(e){return {readRuntime(t){return e.read(Rc(t))??{_sources:{}}},writeRuntime(t,r){e.write(Rc(t),r);}}}function Bh(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Pc(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==Pr)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=Bh(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function Uo(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Go(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Bo(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){e.write("archive-store-ref",r);}}}function Oc(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Cc(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Gh(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function $c(e,t){return e?.lastRequestedToken?Gh(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Kh(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Ec(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function On(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=Ar(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let f of o.pending)i.set(f.taskName,f.waitingOn);for(let f of o.unresolved)i.set(f.taskName,f.missingTokens);for(let f of o.blocked)i.set(f.taskName,f.failedTokens);let c=new Map;for(let[f,p]of Object.entries(n))for(let v of p.requires??[]){let _=c.get(v)??[];_.push(f),c.set(v,_);}let u=s.sort().map(f=>{let p=r[f],v=n[f]??{requires:[],provides:[]};p.status==="completed"?a.completed+=1:p.status==="failed"?a.failed+=1:p.status==="in-progress"&&(a.in_progress+=1);let _=v.requires??[],g=v.provides??[],m=Object.keys(p.data??{}).sort(),k=_.filter(O=>t.state.availableOutputs.includes(O)),w=_.filter(O=>!t.state.availableOutputs.includes(O)),$=i.get(f)??w,R=new Set;for(let O of g)for(let B of c.get(O)??[])B!==f&&R.add(B);let E=p.failedAt,I=p.error?{message:p.error,code:"TASK_FAILED",at:E,source:"task-runtime"}:void 0;return {name:f,status:p.status,error:I,requires:_,requires_satisfied:k,requires_missing:w,provides_declared:g,provides_runtime:m,blocked_by:$,unblocks:Array.from(R).sort(),runtime:{attempt_count:p.executionCount??0,restart_count:p.retryCount??0,in_progress_since:p.status==="in-progress"?p.startedAt??null:null,last_transition_at:p.lastUpdated??null,last_completed_at:p.completedAt??null,last_restarted_at:p.startedAt??null,status_age_ms:p.lastUpdated?0:null}}});a.pending=o.pending.length,a.blocked=o.blocked.length,a.unresolved=o.unresolved.length;let d=u.map(f=>({name:f.name,fanOut:f.unblocks.length})).sort((f,p)=>p.fanOut-f.fanOut||f.name.localeCompare(p.name)),l=d.length>0?d[0]:{name:null,fanOut:0},h=new Set;for(let f of Object.values(n))for(let p of f.requires??[])h.add(p);let y=0;for(let[f,p]of Object.entries(n)){let v=(p.requires??[]).length===0,g=(p.provides??[]).some(m=>(c.get(m)??[]).some(k=>k!==f));v&&!g&&(y+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:a.completed,eligible:o.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:y,topology:{edge_count:Array.from(h).length,max_fan_out_card:l.name,max_fan_out:l.fanOut}},cards:u}}function Uh(){return new Date().toISOString()}function jc(e,t,r,n,s,o,a){return async i=>{let c=[],u=r.cardStore.readCard(i.nodeId);if(!u)return "task-initiate-failure";let d=u.id,l=u.card_data??{},h=u.source_defs??[],y=h.filter(D=>D.optionalForCompletionGating!==true),f=r.cardRuntimeStore.readRuntime(d),p=false,v=()=>{p&&(r.cardRuntimeStore.writeRuntime(d,f),p=false);},_=D=>Cc(f._sources[D]),g=(D,M)=>{f._sources[D]=Cc(M),p=true;},m=i.taskState?.executionCount??0;if(f._lastExecutionCount!==m&&(f._sources={},f._lastExecutionCount=m,p=true),i.update){let D=i.update,M=D.outputFile;if(M){let re=_(M);if(D.failure){let X=D.rqt??re.lastRequestedToken??re.queueRequestedToken;X&&g(M,Ec(re,X));}else {let X=D.rqt;if(!re.lastCompletedToken||X>re.lastCompletedToken){let de=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,C=false;de&&(C=r.fetchedSourcesStore.commitSourceData(d,M,de)),C?g(M,Kh(re,X)):g(M,Ec(re,X));}}v();}}let w={};for(let D of h)if(D.outputFile){let M=r.fetchedSourcesStore.readSourceData(d,D.outputFile);M!==null&&(w[D.bindTo]=M);}let $={};for(let[D,M]of Object.entries(i.state??{}))if(M!==null&&typeof M=="object"&&!Array.isArray(M)){let re=M[D];$[D]=re!==void 0?re:M;}else $[D]=M;let R={id:d,card_data:{...l},requires:$,source_defs:h,compute:u.compute};R._sourcesData=w,u.compute&&ht.runSync(R,{sourcesData:w}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(d,R.computed_values??{});let E={...u},I=ht.enrichSourcesSync(Array.isArray(u.source_defs)?u.source_defs:void 0,{card_data:u.card_data,requires:$}),O=e.value;E.source_defs=Array.isArray(I)?I.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:O})):I;let B=Uh(),W=i.update?void 0:B,Z=y.filter(D=>{let M=D.outputFile;if(typeof M!="string"||!M)return true;let re=_(M);W&&(re={...re,queueRequestedToken:W},g(M,re));let X=re.queueRequestedToken??re.lastRequestedToken??B,de=$c(re,X);return de==="in-flight"?false:de==="dispatch"});if(v(),Z.length>0){let D=false,M=B;for(let re of Z){let X=re.outputFile;if(typeof X!="string"||!X)continue;let de=_(X),C=de.queueRequestedToken??B;g(X,{...de,lastRequestedToken:C}),M=C,D=true;}return D&&v(),D&&(c.push({taskKind:"source-fetch",payload:{boardRef:oe(e),enrichedCard:E,callbackToken:i.callbackToken,rqt:M}}),r.executionRequestStore.appendEntries(t,c)),"task-initiated"}if(y.some(D=>{let M=D.outputFile;if(typeof M!="string"||!M)return false;let re=_(M),X=re.queueRequestedToken??re.lastRequestedToken??B;return $c(re,X)==="in-flight"}))return "task-initiated";let Pe=u.provides??[],_e={};for(let{bindTo:D,ref:M}of Pe)_e[D]=ht.resolve(R,M);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(_e),h.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let M=_(D.outputFile);return !M.lastRequestedToken||!M.lastCompletedToken?true:M.lastCompletedToken<=M.lastRequestedToken}).length>0&&c.push({taskKind:"source-fetch",payload:{boardRef:oe(e),enrichedCard:E,callbackToken:i.callbackToken,rqt:B}}),n(i.nodeId,_e),c.length>0&&r.executionRequestStore.appendEntries(t,c),"task-initiated"}}var jn={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Nc(e){return {[yt]:e.graph,[Ac]:e.lastDrainedJournalId}}function qc(e){let t=e[yt],r=e[Ac];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${yt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function Fc(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function Q(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function q(e){return {status:"fail",error:e}}function ee(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Jh(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Mc(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(s)}function Nn(e){try{let t=JSON.parse(Mc(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function zh(e){return Jh(JSON.stringify(e))}function Dc(e){try{let t=JSON.parse(Mc(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Se(){return new Date().toISOString()}function Hh(e,t){let r=t.onWarn??(()=>{}),n=oe(e);function s(C){if(C.length!==0)try{let S=t.publishBoardChangeNotifications?.(C);S&&typeof S.catch=="function"&&S.catch(T=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${T instanceof Error?T.message:String(T)}`));}catch(S){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${S instanceof Error?S.message:String(S)}`);}}function o(){let C=i().readCardStoreRef();if(!C)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let S=t.kvStorageForRef(C);return {readIndex(){return S.read("_index")},writeIndex(T){S.write("_index",T);},readCard(T){return S.read(T)},writeCard(T,j){return S.write(T,j),t.hashFn(j)},removeCard(T){S.delete(T);},cardExists(T){return S.read(T)!==null},defaultCardKey(T){return T}}}let a={readValues(C){let S=t.kvStorage("state-snapshot"),T=S.listKeys().sort();if(T.length===0)return {version:null,values:{}};let j={};for(let ue of T)j[ue]=S.read(ue);return {version:t.hashFn(j),values:j}},writeValues(C,S,T){let j=t.kvStorage("state-snapshot");for(let ue of T)j.delete(ue);for(let[ue,ne]of Object.entries(S))j.write(ue,ne);return t.hashFn(S)}},i=()=>Uo(t.kvStorage("config")),c=()=>Pc(a),u=()=>xc(t.journalAdapter()),d=()=>Pn(o(),r),l=()=>{let C=i().readOutputsStoreRef();if(!C)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Oc(t.kvStorageForRef(C))},h=()=>{let C=i().readArchiveStoreRef();return C?t.archiveFactoryForRef(C):t.archiveFactory()};function y(){return !!c().readSnapshot(e.value).values[yt]}function f(){let C=c().readSnapshot(e.value);if(!C.values[yt])throw new Error(`Board not initialized at ${e.value}`);return qc(C.values)}function p(C,S){let T=c().commitSnapshot(e.value,{schemaVersion:Pr,expectedVersion:S,commitId:t.genId(),committedAt:Se(),deleteKeys:[],shallowMerge:Nc(C)});if(!T.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${S??"null"} current=${T.currentVersion??"null"}`)}function v(C){u().appendEvent(C);}async function _(){let C=(P,F)=>{let ce=P.payload,st=(ce?.enrichedCard??{}).id??ce?.cardId??"unknown";v({type:"task-failed",taskName:st,error:F,timestamp:Se()});},S=Tc(t.kvStorage("execution-requests"),C),T=Ic(t.kvStorage("card-runtime")),j=Ko(t.blobStorage("sources"),P=>t.resolveBlob(P)),ue=new Map,ne={readRuntime(P){return ue.get(P)??T.readRuntime(P)},writeRuntime(P,F){ue.set(P,F);}},Te=[],ke=new Map,nt={readSourceData(P,F){let ce=`${P}/${F}`;return ke.has(ce)?ke.get(ce):j.readSourceData(P,F)},ingestSourceDataStaged(P,F,ce,jt){j.ingestSourceDataStaged(P,F,ce,jt);},commitSourceData(P,F,ce){let jt=`${P}/.staged/${ce}/${F}`,Nr=t.blobStorage("sources").read(jt);if(Nr==null)return false;let Nt=`${P}/${F}`,Yo=Nr.trim();try{ke.set(Nt,JSON.parse(Yo));}catch{ke.set(Nt,Yo);}return Te.push({cardId:P,outputFile:F,deliveryToken:ce}),true},hasSource(P,F){let ce=`${P}/${F}`;return ke.has(ce)?true:j.hasSource(P,F)}},Ae={cardStore:d(),cardRuntimeStore:ne,fetchedSourcesStore:nt,outputStore:l(),executionRequestStore:S},vt=f(),St=An(vt.graph),{events:Pt,newCursor:Ot}=u().readEntriesAfterCursor(vt.lastDrainedJournalId),kt=[],qn=[],Fn=[],zo=new Map,Kc=(P,F)=>{kt.push({type:"task-completed",taskName:P,data:F,timestamp:Se()});try{h().stream("exec-history").append({taskName:P,status:"completed",completedAt:Se()});}catch{}},Ho=(P,F)=>{v({type:"task-failed",taskName:P,error:F,timestamp:Se()});try{h().stream("exec-history").append({taskName:P,status:"failed",error:F,completedAt:Se()});}catch{}},Or=Sc(St,{handlers:{"card-handler":jc(e,Ot,Ae,Kc,Ho,(P,F)=>{qn.push({cardId:P,values:F});},P=>{Fn.push(P);})}});for(kt=Pt;kt.length>0;){let P=kt;kt=[];for(let F of P)if(F.type==="task-restart"){let ce=Ae.cardStore.readCard(F.taskName);ce&&zo.set(F.taskName,ce);}Or.pushAll(P),await Or.waitForHandlers();}let Wo=Or.getState();await Or.dispose({wait:true});let Uc=c().readSnapshot(e.value).version;p({lastDrainedJournalId:Ot,graph:Tr(Wo)},Uc);for(let{cardId:P,values:F}of qn)Ae.outputStore.writeComputedValues(P,F);for(let P of Fn)Ae.outputStore.writeDataObjects(P);for(let[P,F]of ue)T.writeRuntime(P,F);for(let{cardId:P,outputFile:F,deliveryToken:ce}of Te)j.commitSourceData(P,F,ce);let jr;try{jr=On(n,Wo),Ae.outputStore.writeStatusSnapshot(jr);}catch(P){r(`[board-live-cards-public] status publish failed: ${P instanceof Error?P.message:String(P)}`);}let Zt=[];for(let{cardId:P,values:F}of qn)Zt.push({kind:"computed_values",cardId:P,values:F});for(let P of Fn)for(let[F,ce]of Object.entries(P))F&&Zt.push({kind:"data_object",key:F,payload:ce});for(let[P,F]of zo)Zt.push({kind:"card_refreshed",cardId:P,card:F});jr!==void 0&&Zt.push({kind:"status",status:jr}),s(Zt);let Jc=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:oe({kind:"built-in",value:"source-cli-task-executor"})};S.dispatchEntriesForJournalId(Ot,P=>{if(P.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${P.taskKind}" \u2014 skipping`);return}let F=P.payload,ce=F.enrichedCard?.id??"unknown",jt=F.enrichedCard?.source_defs??[];for(let st of jt){if(!st.outputFile){r(`[dispatch] source "${st.bindTo}" has no outputFile \u2014 skipping`);continue}let Nr=zh({cbk:F.callbackToken,rg:e.value,br:oe(e),cid:ce,b:st.bindTo,d:st.outputFile,cs:void 0,rqt:F.rqt});t.dispatchExecution(Jc,{source_def:st,base_ref:oe(e),callback:{token:Nr,via:t.selfRef}}).catch(Nt=>Ho(ce,Nt instanceof Error?Nt.message:String(Nt)));}});}async function g(){try{let C=()=>{let T=f(),{events:j}=u().readEntriesAfterCursor(T.lastDrainedJournalId);j.length<=0||(g(),t.requestProcessAccumulated?.());},S=await Qo(t.lock,_,C);return Q({ran:S!==!1})}catch(C){return ee(C)}}function m(){g(),t.requestProcessAccumulated?.();}function k(C){try{let S=C.params?.cardStoreRef;if(!S)return q("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!y()){let ke=Tn(jn);p({lastDrainedJournalId:"",graph:Tr(ke)},null);}let T=C.params?.outputsStoreRef;if(!T)return q("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let j=C.params?.scratchStoreRef,ue=C.params?.archiveStoreRef,ne=i();ne.writeCardStoreRef(S),ne.writeOutputsStoreRef(T),j&&ne.writeScratchStoreRef(j),ue&&ne.writeArchiveStoreRef(ue);let Te=C.body??{};Te["task-executor-ref"]&&ne.writeTaskExecutorRef(Te["task-executor-ref"]),Object.prototype.hasOwnProperty.call(Te,"chat-handler-flow")&&ne.writeChatHandlerFlow(Te["chat-handler-flow"]);try{l().writeStatusSnapshot(On(n,An(f().graph)));}catch{}return Q()}catch(S){return ee(S)}}function w(C){try{let S=l().readStatusSnapshot();if(!S){S=On(n,An(f().graph));try{l().writeStatusSnapshot(S);}catch{}}return Q(S)}catch(S){return ee(S)}}function $(C){try{let S=C.params?.id;return S?(v({type:"task-removal",taskName:S,timestamp:Se()}),m(),Q()):q("removeCard requires params.id")}catch(S){return ee(S)}}function R(C){try{let S=C.params?.id;return S?(v({type:"task-restart",taskName:S,timestamp:Se()}),m(),Q()):q("retrigger requires params.id")}catch(S){return ee(S)}}async function E(C){return g()}function I(C){try{let S=C.params?.cardId,T=C.params?.all,j=!!C.params?.restart;if(!S&&!T)return q("upsertCard requires --card-id <id> or --all");let ue=T?d().readAllCards().map(ne=>ne.id):[S];for(let ne of ue)if(!d().readCard(ne))return q(`Card "${ne}" not found in board at ${e.value}`);for(let ne of ue){let Te=d().readCard(ne),ke=Fc(Te),nt=t.hashFn(ke),Ae=t.kvStorage("card-upsert"),vt=Ae.read(ne),St=vt?.taskConfigHash!==nt;if(!(!St&&!j)){if(St){let Pt=vt?.blobRef??d().readCardKey(ne)??ne;v({type:"task-upsert",taskName:ne,taskConfig:ke,timestamp:Se()}),Ae.write(ne,{blobRef:Pt,taskConfigHash:nt,updatedAt:Se()});}j&&v({type:"task-restart",taskName:ne,timestamp:Se()});}}return m(),Q()}catch(S){return ee(S)}}function O(C){try{let S=C.params?.token;if(!S)return q("taskFailed requires params.token");let T=C.params?.error??"unknown error",j=Nn(S);if(!j)return q("Invalid callback token");v({type:"task-failed",taskName:j.taskName,error:T,timestamp:Se()});try{h().stream("exec-history").append({taskName:j.taskName,status:"failed",error:T,completedAt:Se()});}catch{}return m(),Q()}catch(S){return ee(S)}}function B(C){try{let S=C.params?.token;if(!S)return q("taskProgress requires params.token");let j=(C.body??{}).update??{},ue=Nn(S);return ue?(v({type:"task-progress",taskName:ue.taskName,update:j,timestamp:Se()}),m(),Q()):q("Invalid callback token")}catch(S){return ee(S)}}function W(C){try{let S=C.params?.token,T=C.params?.ref;if(!S)return q("sourceDataFetched requires params.token");if(!T)return q("sourceDataFetched requires params.ref");let j=Dc(S);if(!j)return q("Invalid source token");let{cbk:ue,cid:ne,b:Te,d:ke,cs:nt,rqt:Ae}=j,vt=Ko(t.blobStorage("sources"),kt=>t.resolveBlob(kt)),St=t.genId();vt.ingestSourceDataStaged(ne,ke,Ue(T),St);let Pt=Nn(ue);if(!Pt)return q("Invalid callback token embedded in source token");let Ot=Se();return v({type:"task-progress",taskName:Pt.taskName,update:{bindTo:Te,outputFile:ke,fetchedAt:Ot,deliveryToken:St,sourceChecksum:nt,rqt:Ae},timestamp:Ot}),m(),Q()}catch(S){return ee(S)}}function Z(C){try{let S=C.params?.token,T=C.params?.reason??"unknown";if(!S)return q("sourceDataFetchFailure requires params.token");let j=Dc(S);if(!j)return q("Invalid source token");let{cbk:ue,b:ne,d:Te,cs:ke,rqt:nt}=j,Ae=Nn(ue);return Ae?(v({type:"task-progress",taskName:Ae.taskName,update:{bindTo:ne,outputFile:Te,failure:!0,reason:T,sourceChecksum:ke,rqt:nt},timestamp:Se()}),m(),Q()):q("Invalid callback token embedded in source token")}catch(S){return ee(S)}}function fe(C){try{let S=i().readCardStoreRef();return S?Q({storeRef:S}):q(`Board at ${e.value} has no card store configured`)}catch(S){return ee(S)}}function Pe(C){try{let S=i().readOutputsStoreRef();return S?Q({storeRef:S}):q(`Board at ${e.value} has no outputs store configured`)}catch(S){return ee(S)}}function _e(C){try{let S=i().readScratchStoreRef();return Q({storeRef:S})}catch(S){return ee(S)}}function Ye(C){try{let S=i().readArchiveStoreRef();return Q({storeRef:S})}catch(S){return ee(S)}}function D(C){try{let S=C.params?.key;if(!S)return q("getConfig requires params.key");let T=i(),j;switch(S){case "task-executor":j=T.readTaskExecutorRef()??null;break;case "chat-handler-flow":j=T.readChatHandlerFlow()??null;break;case "card-store-ref":j=T.readCardStoreRef();break;case "outputs-store-ref":j=T.readOutputsStoreRef();break;case "scratch-store-ref":j=T.readScratchStoreRef();break;case "archive-store-ref":j=T.readArchiveStoreRef();break;default:return q(`getConfig: unknown key "${S}"`)}return Q({value:j})}catch(S){return ee(S)}}function M(C){try{let S=C.params?.key;if(!S)return q("getOutputsDataObject requires params.key");let T=l().readDataObject(S);return Q(T)}catch(S){return ee(S)}}function re(C){try{return Q(l().readAllDataObjects())}catch(S){return ee(S)}}function X(C){try{let S=C.params?.key;if(!S)return q("getOutputsComputedValues requires params.key");let T=l().readComputedValues(S);return Q(T)}catch(S){return ee(S)}}function de(C){try{return Q(l().readAllComputedValues())}catch(S){return ee(S)}}return {init:k,status:w,getCardStoreRef:fe,getOutputsStoreRef:Pe,getScratchStoreRef:_e,getArchiveStoreRef:Ye,getConfig:D,getOutputsDataObject:M,getAllOutputsDataObjects:re,getOutputsComputedValues:X,getAllOutputsComputedValues:de,removeCard:$,retrigger:R,processAccumulatedEvents:E,upsertCard:I,taskFailed:O,taskProgress:B,sourceDataFetched:W,sourceDataFetchFailure:Z}}function Wh(e,t){let r=()=>Uo(t.kvStorage("config"));function n(){let g=r().readCardStoreRef();if(!g)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let m=t.kvStorageForRef(g);return {readIndex(){return m.read("_index")},writeIndex(k){m.write("_index",k);},readCard(k){return m.read(k)},writeCard(k,w){return m.write(k,w),t.hashFn(w)},removeCard(k){m.delete(k);},cardExists(k){return m.read(k)!==null},defaultCardKey(k){return k}}}let s=()=>Pn(n(),t.onWarn??(()=>{})),o=()=>{let g=r().readScratchStoreRef();return g?t.scratchStorageForRef(g):t.scratchStorage()};function a(g,m){let k=t.validateSchema(m),w=[],$=r().readTaskExecutorRef();if($&&Array.isArray(m.source_defs))for(let E of m.source_defs){let I=typeof E.bindTo=="string"?E.bindTo:"(unknown)";try{let O;try{O=t.invokeExecutorSync($,"validate-source-def",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(E)});}catch(W){let Z=W;if(O=typeof Z?.stdout=="string"?Z.stdout:"",!O.trim()){w.push(`source "${I}": executor validate-source-def failed \u2014 ${W instanceof Error?W.message:String(W)}`);continue}}let B=JSON.parse(O.trim());if(!B.ok&&Array.isArray(B.errors))for(let W of B.errors)w.push(`source "${I}": ${W}`);}catch(O){w.push(`source "${I}": executor validate-source-def failed \u2014 ${O instanceof Error?O.message:String(O)}`);}}let R=[...k.errors,...w];return Q({cardId:g,isValid:R.length===0,issues:R})}function i(g,m,k){let w=r().readTaskExecutorRef();if(!w)return q("No task-executor registered for this board");let $=typeof g.bindTo=="string"?g.bindTo:"source",R=o(),E={...g,boardDir:e.value,_projections:m},I=R.create(JSON.stringify(E,null,2),`probe-in-${$}`,".json"),O=R.getUniqueKey(`probe-out-${$}`,".json"),B=R.getUniqueKey(`probe-err-${$}`,".txt"),W=oe(R.keyRef(I)),Z=oe(R.keyRef(O)),fe=oe(R.keyRef(B)),Pe=null;try{if(t.invokeExecutorSync(w,"run-source-fetch",["--in-ref",W,"--out-ref",Z,"--err-ref",fe],{timeout:g.timeout??t.executorTimeouts?.probeMs??6e4}),Pe=R.read(O),Pe===null)return q("Executor produced no output file")}catch(_e){let Ye=R.read(B)?.trim()??(_e instanceof Error?_e.message:String(_e));return q(`Probe failed: ${Ye}`)}finally{try{R.remove(I);}catch{}try{R.remove(B);}catch{}}if(k){let _e=Ue(k);t.absoluteBlob.write(_e.value,Pe);}try{R.remove(O);}catch{}return Q({bindTo:$,resultSizeBytes:Pe.length})}function c(g){try{let m=g.params?.cardId,k=g.params?.all;if(!m&&!k)return q("validateCard requires --card-id <id> or --all");let w=k?s().readAllCards().map(R=>R.id):[m],$=[];for(let R of w){let E=s().readCard(R);if(!E){$.push({cardId:R,isValid:!1,issues:[`Card "${R}" not found`]});continue}let I=a(R,E);if(I.status!=="success")return I;$.push(I.data);}return Q($)}catch(m){return ee(m)}}function u(g){try{if(!g.body||typeof g.body!="object"||Array.isArray(g.body))return q("validateCardPreflight requires card JSON object in body");let m=g.body,k=m["card-content"]??m,w=typeof k.id=="string"?k.id:"(unknown)",$=a(w,k),R=r().readTaskExecutorRef();if(R)try{let E=t.invokeExecutorSync(R,"validate-card-preflight",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(k)}),I=JSON.parse(E.trim());if(!I.ok&&Array.isArray(I.errors)&&I.errors.length>0){let O=[...$.status==="success"?$.data.issues:[],...I.errors];return Q({cardId:w,isValid:!1,issues:O})}}catch{}return $}catch(m){return ee(m)}}function d(g){try{let m=g.params?.cardId,k=g.params?.sourceIdx,w=g.params?.outRef;if(!m)return q("probeSource requires params.cardId");if(k===void 0)return q("probeSource requires params.sourceIdx");let R=(g.body??{})["mock-projections"]??{},E=s().readCard(m);if(!E)return q(`Card "${m}" not found`);let I=E.source_defs??[];return k<0||k>=I.length?q(`sourceIdx ${k} out of range (card has ${I.length} source(s))`):i(I[k],R,w)}catch(m){return ee(m)}}function l(g){try{let m=g.params?.outRef,k=g.body;if(!k)return q('probeTmpSource requires body with "source-def" and "mock-projections"');let w=k["source-def"],$=k["mock-projections"]??{};return w?i(w,$,m):q('probeTmpSource body requires "source-def"')}catch(m){return ee(m)}}function h(g){try{let m=g.params?.sourceIdx,k=g.params?.outRef;if(m===void 0)return q("probeSourcePreflight requires params.sourceIdx");if(!g.body||typeof g.body!="object"||Array.isArray(g.body))return q("probeSourcePreflight requires card JSON object in body");let w=g.body,$=w["card-content"]??w,R=w["mock-projections"]??{},E=$.source_defs??[];if(m<0||m>=E.length)return q(`sourceIdx ${m} out of range (card has ${E.length} source(s))`);let I=E[m],O=r().readTaskExecutorRef();if(O){let B=typeof I.bindTo=="string"?I.bindTo:"source";try{let W={...I,_projections:R},Z=t.invokeExecutorSync(O,"probe-source-preflight",[],{timeout:I.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(W)}),fe=JSON.parse(Z.trim());return fe.ok?Q({bindTo:B,reachable:fe.reachable,latencyMs:fe.latencyMs,note:fe.note}):q(fe.error??"Preflight probe failed")}catch{}}return i(I,R,k)}catch(m){return ee(m)}}function y(g){try{let m=r().readTaskExecutorRef();if(!m)return q("No task-executor registered for this board");let k=t.invokeExecutorSync(m,"describe-capabilities",[],{timeout:t.executorTimeouts?.describeMs??1e4});return Q(JSON.parse(k.trim()))}catch(m){return ee(m)}}function f(g){try{let m=g.body;if(!m||!Array.isArray(m.ops))return q("updatesInCardStore requires body.ops array");let k=m.ops,w=s();for(let $ of k){let R=$.op,E=$.id;if(!E)return q('op is missing "id"');if(R==="update"){let I=$["card-content"];if(!I)return q(`update op for "${E}" is missing "card-content"`);w.writeCard(E,I);}else return q(`Unknown op type: "${R??"(none)"}"`)}return Q()}catch(m){return ee(m)}}function p(g){try{let m=g.body;if(!m||!Array.isArray(m.ids))return q("readFromCardStore requires body.ids array");let k=m.ids,w=s(),$=k.map(R=>({id:R,"card-content":w.readCard(R)}));return Q({cards:$})}catch(m){return ee(m)}}function v(g){try{if(!g.body||typeof g.body!="object"||Array.isArray(g.body))return q("evalCardCompute requires a JSON object in body");let m=g.body,k=m["card-content"]??m,w=typeof k.id=="string"?k.id:"(unknown)",$=m["mock-fetched-sources"]??{},R=m["mock-requires"]??{},E=k.compute;if(!E||!Array.isArray(E)||E.length===0)return Q({cardId:w,ok:!0,computed_values:{},errors:[]});let I={id:w,card_data:k.card_data??{},requires:R,source_defs:k.source_defs,compute:E},O=ht.runSync(I,{sourcesData:$}),B=O.node.computed_values??{},W=O.errors??[];return Q({cardId:w,ok:W.length===0,computed_values:B,errors:W})}catch(m){return ee(m)}}function _(g){try{if(!g.body||typeof g.body!="object"||Array.isArray(g.body))return q("simulateCardCycle requires a JSON object in body");let m=g.body,k=m["card-content"]??m,w=typeof k.id=="string"?k.id:"(unknown)",$=m["mock-fetched-sources"]??{},R=m["mock-requires"]??{},E=a(w,k),I=E.status==="success"?{isValid:E.data.isValid,issues:E.data.issues}:{isValid:!1,issues:[E.status==="fail"?E.error:"internal error"]},O=k.source_defs??[],B=k.card_data??{},W=[],Z=[];if(O.length>0){W=ht.enrichSourcesSync(O,{card_data:B,requires:R});for(let X of W){let de=X.projections,C=X._projections;if(de&&C){for(let S of Object.keys(de))if(C[S]===void 0){let T=typeof X.bindTo=="string"?X.bindTo:"(unknown)";Z.push({bindTo:T,key:S,error:`Projection "${S}" resolved to undefined`});}}}}let fe=[],Pe=m["task-executor-ref"],_e=(Pe?.howToRun&&Pe?.whatToRun?Pe:void 0)??r().readTaskExecutorRef();for(let X=0;X<W.length;X++){let de=W[X],C=typeof de.bindTo=="string"?de.bindTo:`source_${X}`;if(!_e){fe.push({bindTo:C,skipped:!0,error:"No task executor configured"});continue}try{let S={...de},T=t.invokeExecutorSync(_e,"probe-source-preflight",[],{timeout:de.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(S)}),j=JSON.parse(T.trim());fe.push({bindTo:C,reachable:j.reachable,latencyMs:j.latencyMs,error:j.ok?void 0:j.error});}catch{fe.push({bindTo:C,skipped:!0,error:"Executor does not support probe-source-preflight"});}}let Ye=k.compute,D={},M=[];if(Ye&&Array.isArray(Ye)&&Ye.length>0){let X={id:w,card_data:B,requires:R,source_defs:k.source_defs,compute:Ye},de=ht.runSync(X,{sourcesData:$});D=de.node.computed_values??{},M=de.errors??[];}let re=I.isValid&&Z.length===0&&M.length===0&&fe.every(X=>X.reachable!==!1);return Q({cardId:w,ok:re,validation:I,source_probes:fe,projection_errors:Z,computed_values:D,compute_errors:M})}catch(m){return ee(m)}}return {validateCard:c,validateCardPreflight:u,probeSource:d,probeTmpSource:l,probeSourcePreflight:h,evalCardCompute:v,simulateCardCycle:_,describeTaskExecutorCapabilities:y,updatesInCardStore:f,readFromCardStore:p}}function Yh(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {get(s){try{let o=s.params?.id;if(o){let a=e.readCard(o);return a?t({cards:[a]}):r(`card "${o}" not found`)}return t({cards:e.readAllCards()})}catch(o){return n(o)}},set(s){try{let o=s.body;if(o==null)return r("set requires a body (card object or array of cards)");let a=Array.isArray(o)?o:[o];for(let i of a){if(typeof i.id!="string")return r("each card must have a string `id` field");e.writeCard(i.id,i);}return t({count:a.length})}catch(o){return n(o)}},del(s){try{let o=s.body?.ids??[],a=s.params?.id,i=a?[...o,a]:o;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let c of i)e.removeCard(c);return t({count:i.length})}catch(o){return n(o)}},patch(s){try{let o=s.params?.id,a=s.params?.path;if(!o)return r("patch requires params.id");if(!a)return r("patch requires params.path");let i=s.body,c=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:s.body;return e.patchCard(o,a,c),t({count:1})}catch(o){return n(o)}}}}function Xh(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {list(s){try{let o=s.params?.prefix??"";return t({artifacts:e.list(o)})}catch(o){return n(o)}},head(s){try{let o=s.params?.key;return o?t({artifact:e.head(o)}):r("head requires params.key")}catch(o){return n(o)}},put(s){try{let o=s.params?.key,a=s.params?.contentType;if(!o)return r("put requires params.key");let i=s.body;if(typeof i=="string")return t({artifact:e.putText(o,i,a)});if(i&&typeof i=="object"&&typeof i.text=="string")return t({artifact:e.putText(o,i.text,a)});if(i&&typeof i=="object"&&Array.isArray(i.bytes)){let c=i.bytes,u=new Uint8Array(c.map(d=>Math.max(0,Math.min(255,Number(d)||0))));return t({artifact:e.putBytes(o,u,a)})}return r("put requires body as string, {text}, or {bytes:number[]}")}catch(o){return n(o)}},get(s){try{let o=s.params?.key,a=s.params?.as??"base64";if(!o)return r("get requires params.key");let i=e.head(o);if(!i)return r(`artifact "${o}" not found`);if(a==="text"){let u=e.getText(o);return u===null?r(`artifact "${o}" not found`):t({key:o,contentType:i.contentType,size:i.size,text:u})}let c=e.getBytes(o);return c===null?r(`artifact "${o}" not found`):t({key:o,contentType:i.contentType,size:i.size,bytes:[...c]})}catch(o){return n(o)}},del(s){try{let o=s.params?.key;return o?(e.remove(o),t({ok:!0})):r("del requires params.key")}catch(o){return n(o)}}}}function Lc(){return new Date().toISOString()}function Vc(e){return new TextEncoder().encode(e).byteLength}function Qh(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Zh(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function ey(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function ty(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function ry(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function ny(e){let t=ey(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function sy(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function Jo(e){function t(r){let n=e.stat?Qh(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let s=e.read(r);return s===null?{key:r}:{key:r,size:Vc(s)}}return {exists(r){return e.exists(r)},putText(r,n,s="text/plain; charset=utf-8"){e.write(r,n);let o=t(r)??{key:r};return o.contentType=s,o.updatedAt=o.updatedAt??Lc(),o.size=o.size??Vc(n),o},putBytes(r,n,s="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let a=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,a);}let o=t(r)??{key:r};return o.contentType=s,o.updatedAt=o.updatedAt??Lc(),o.size=o.size??n.byteLength,o},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let s=e.readBytes(r);return s===null?null:Buffer.from(s).toString("utf-8")}try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new TextDecoder("utf-8").decode(new Uint8Array(s.data))}catch{}return n},getBytes(r){if(e.readBytes){let s=e.readBytes(r);if(s!==null)return s}let n=e.read(r);if(n===null)return null;try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new Uint8Array(s.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,s)=>n.key.localeCompare(s.key))},remove(r){e.remove(r);}}}function oy(e){function t(s,o){let a=0,i=[];Array.isArray(o)&&i.push(...o);for(let c of e.list(`${s}/`))i.push(sy(c.key));for(let c of i){let u=Zh(c);Number.isFinite(u)&&u>a&&(a=u);}return a+1}function r(s,o,a){let i=Number(a?.maxLen||32),{stem:c,ext:u}=ny(s),d=ry(u),l=ty(c),h=`${String(o).padStart(3,"0")}-`,y=d,f=i-h.length-y.length;f<1&&(y="",f=i-h.length);let p=l.slice(0,Math.max(1,f)),v=`${h}${p}${y}`;return v.length>i&&(v=v.slice(0,i).replace(/\.$/,"")),v}function n(s,o,a){let i=t(s,a?.seedNames),c=r(o,i,{maxLen:a?.maxLen});for(;e.exists(`${s}/${c}`);)i+=1,c=r(o,i,{maxLen:a?.maxLen});return c}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function ay(){function e(s,o){if(!Array.isArray(s))return [];let a=[];for(let i of s){if(!i||typeof i!="object")continue;let c=i;typeof c.stored_name=="string"&&a.push({name:typeof c.name=="string"?c.name:c.stored_name,stored_name:c.stored_name,size:typeof c.size=="number"&&Number.isFinite(c.size)?c.size:null,mime_type:typeof c.mime_type=="string"?c.mime_type:null,path:typeof c.path=="string"?c.path:null,uploaded_at:typeof c.uploaded_at=="string"?c.uploaded_at:o||null});}return a}function t(s){return !s||typeof s!="object"?[]:e(s.files,void 0)}function r(s,o){let a=t(s);if(o.length===0)return s.files=a,a;let i=new Set(a.map(c=>c.stored_name));for(let c of o)i.has(c.stored_name)||(a.push(c),i.add(c.stored_name));return s.files=a,a}function n(s,o,a){let i=t(s);if(!Number.isInteger(o)||o<0||o>=i.length)return {ok:false,reason:"index_out_of_range"};let c=i[o];return !c||!c.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==c.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:c}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function ZS(){return {async invoke(e,t){if(e.howToRun!=="local-node")return {dispatched:false,error:`createNodeSpawnInvocationAdapter: unsupported howToRun "${e.howToRun}"`};let r="";try{let o=e.whatToRun;r=Le(o);}catch{r="";}if(!r)return {dispatched:false,error:"createNodeSpawnInvocationAdapter: could not resolve executable path from whatToRun"};let n={...t},s=Buffer.from(JSON.stringify(n)).toString("base64");try{return spawn(process.execPath,[r,"--boardId",String(t.boardId??""),"--cardId",String(t.cardId??""),"--extraEncJson",s],{stdio:"ignore",windowsHide:!0}).unref(),{dispatched:!0}}catch(o){return {dispatched:false,error:o instanceof Error?o.message:String(o)}}},async describe(e){if(e.howToRun!=="local-node")return null;let t="";try{let r=e.whatToRun;t=Le(r);}catch{t="";}if(!t)return null;try{let r=spawnSync(process.execPath,[t,"describe"],{timeout:5e3,encoding:"utf-8",windowsHide:!0});return r.status!==0?null:JSON.parse(String(r.stdout).trim())}catch{return null}}}}var cy=".board.lock";function Bc(e,t){if(!e||!t)return false;let r=String(e).replace(/[\\/]+$/,"").split(/[\\/]+/).filter(Boolean);return r.length>0&&r[r.length-1]===t}function dy(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function ly(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function Gc(e){if(e)return e;let t=sa(import.meta.url),r=[t,Re(t,"..","cli","node"),Re(t,"..","..","cli","node")];for(let n of r)try{return Bn(n),n}catch{}throw new Error(`createFsBoardPlatformAdapter: could not resolve a public CLI directory from module dir ${t}`)}function fy(e,t,r){let{cliDir:n,opts:s}=dy(t,r),o=Gc(n),a=e.value,c={meta:"board-live-cards",howToRun:"local-node",whatToRun:(s?.suppressSpawn?"":Bn(o))?oe({kind:"yaml-flow-cli",value:"board-live-cards-cli.js"}):"",...s?.notifyChannel?{extra:{notifyChannel:s.notifyChannel}}:{}};return {kvStorage:u=>Ur(Re(a,`.${u}`)),blobStorage:u=>u?Ft(Re(a,u)):Ft(a),scratchStorage:()=>Gr(Re(a,".tmp")),scratchStorageForRef:u=>Gr(Ue(u).value),archiveFactory:()=>Kr(Re(a,"archive")),archiveFactoryForRef:u=>Kr(Ue(u).value),journalAdapter:()=>ba(a),lock:_a(Re(a,cy)),selfRef:c,async dispatchExecution(u,d){if(s?.suppressSpawn)return {dispatched:false};try{let l=d.source_def?.bindTo??Mn().slice(0,8),h=Gr(Re(a,".tmp")),y=h.create(JSON.stringify(d,null,2),`exec-in-${l}`,".json"),f=h.getUniqueKey(`exec-out-${l}`,".json"),p=h.getUniqueKey(`exec-err-${l}`,".txt"),v=oe(h.keyRef(y)),_=oe(h.keyRef(f)),g=oe(h.keyRef(p));return va(u,{subcommand:"run-source-fetch",inRef:v,outRef:_,errRef:g},o),{dispatched:!0}}catch(l){let h=l instanceof Error?l.message:String(l);try{let y=Kr(Re(a,"archive")),f=new Date().toISOString().replace(/[:.]/g,"-"),p=d.source_def?.bindTo??"unknown";y.blob("exec-failures").write(`${f}-${p}.json`,JSON.stringify({error:h,args:d,ref:u,at:new Date().toISOString()},null,2));}catch{}return {dispatched:false,error:h}}},resolveBlob(u){let d=ra(u.value)?Wn().read(u.value):Ft(a).read(u.value);if(d===null)throw new Error(`resolveBlob: blob not found: ::${u.kind}::${u.value}`);return d},hashFn:wa,genId:()=>na(`${Date.now()}-${Math.random()}`).slice(0,32),kvStorageForRef:u=>Ur(Ue(u).value),requestProcessAccumulated(){s?.suppressSpawn||ia(o,e,s?.notifyChannel);},publishBoardChangeNotifications(u){if(!s?.notifyChannel||u.length===0)return;let d=u.map(l=>({id:Mn(),ts:new Date().toISOString(),boardRef:oe(e),notification:l}));ua(s.notifyChannel,d,s.onWarn);},onWarn:s?.onWarn}}function ek(e,t,r){let{cliDir:n,opts:s}=ly(t,r),o=Gc(n),a=fy(e,o,s),i=Mr();return {...a,invokeExecutorSync(c,u,d,l){let{command:h,baseArgs:y}=Lr(c,o),f=c.extra?["--extra",Buffer.from(JSON.stringify(c.extra)).toString("base64")]:[];return i.executeSync(h,[...y,u,...d,...f],{timeout:l?.timeout??3e4,encoding:"utf-8",input:l?.input})},validateSchema(c){let u=Fo(c);return {ok:u.errors.length===0,errors:u.errors}},absoluteBlob:Wn()}}function tk(e,t={}){let r=t.chatsSubdir??"chats",n=t.kvSubdir??".kv",s=n?[n,"chat"]:["chat"],o=r&&!Bc(e,r)?Re(e,r):e,a=Ur(Re(e,...s));return Do(i=>{let u=`${String(i).replace(/[^a-zA-Z0-9_-]/g,"_")}.jsonl`,d=Re(o,u);return Yn(d)},a)}function rk(e,t={}){let r=t.filesSubdir??"files",n=r&&!Bc(e,r)?Re(e,r):e;return Jo(Ft(n))}function nk(e){try{let t=JSON.parse(Buffer.from(e,"base64url").toString());return typeof t.br=="string"?t.br:null}catch{return null}}
18
+ `,"utf-8");},generateId(){return randomUUID()}}}function _a(e){return {tryAcquire(){try{if(!b.existsSync(e)){b.mkdirSync(J.dirname(e),{recursive:!0});try{b.writeFileSync(e,"{}",{flag:"wx"});}catch{}}return lockSync(e,{retries:0})}catch{return null}}}}var Ra={$schema:"http://json-schema.org/draft-07/schema#",$id:"https://nsreehari.github.io/boards/live-cards.schema.json",definitions:{bind_ref:{description:"A card data path reference, e.g. 'card_data.raw_quotes' or 'requires.upstream'",type:"string",pattern:"^(card_data|requires|fetched_sources|computed_values)(\\.|$)"},bind_or_literal:{description:"A literal value or a bind reference object",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref"}},required:["bind"]}]},compute_expr:{description:"A declarative JSON compute expression",type:"object",required:["fn"],properties:{fn:{type:"string",description:"Function name from the built-in vocabulary",enum:["sum","avg","min","max","count","first","last","add","sub","mul","div","round","abs","mod","gt","gte","lt","lte","eq","neq","if","and","or","not","concat","upper","lower","template","filter","pluck","map","sort","slice","flat","unique","group","get","default","now","diff_days","format_date"]},input:{description:"card_data.path, literal, array of inputs, or nested compute_expr",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{$ref:"#/definitions/compute_expr"}]},field:{type:"string",description:"For pluck/sum/group \u2014 the object key to extract"},where:{$ref:"#/definitions/compute_expr",description:"For filter \u2014 predicate expression ($ = current item)"},cond:{$ref:"#/definitions/compute_expr",description:"For if \u2014 condition expression"},then:{description:"For if \u2014 value when cond is truthy"},else:{description:"For if \u2014 value when cond is falsy"},format:{type:"string",description:"For format_date \u2014 date format string"}}},meta:{type:"object",properties:{title:{type:"string"},tags:{type:"array",items:{type:"string"}}}},requires:{type:"array",items:{type:"string"},description:"IDs of upstream nodes this node depends on"},provides:{type:"array",items:{type:"object",required:["bindTo","ref"],properties:{bindTo:{type:"string",description:"Token name published downstream"},ref:{type:"string",description:"Path to read value from (card_data.*, requires.*, fetched_sources.*, computed_values.*)"}}},description:"Explicit bindings exposing computed or card_data values downstream as named tokens"},compute_step:{description:"A single ordered compute step: reads card_data.*/requires.*/computed_values.*, writes to computed_values[bindTo]",type:"object",required:["bindTo","expr"],properties:{bindTo:{type:"string",description:"Key in computed_values to write result"},expr:{type:"string",description:"JSONata expression evaluated against { card_data, requires, fetched_sources, computed_values }"}}},source_def:{description:"One source entry. The engine requires 'bindTo' (compute namespace key) and 'outputFile' (delivery signal path). bindTo and outputFile must be unique across all source_defs in a card. Every other property is yours \u2014 add whatever your task-executor needs: kind, url, headers, mailbox, channel, model, query, etc. The full object is passed verbatim as the --in JSON to the executor.",type:"object",required:["bindTo","outputFile"],additionalProperties:true,properties:{bindTo:{type:"string",description:"Key under fetched_sources.* available in compute expressions"},outputFile:{type:"string",description:"Board-relative path the executor writes its JSON result to. Presence of this file signals delivery."},projections:{type:"object",description:"Named data projections from card_data or requires, evaluated before the executor is called. Each key is a ref name; each value is a JSONata expression rooted at card_data or requires. The resolved values are passed to the executor as _projections. fetched_sources, computed_values, and source_defs are not accessible here \u2014 sources run before those exist.",additionalProperties:{type:"string"}},optionalForCompletionGating:{type:"boolean",default:false,description:"When true this source does not gate card completion. Default false when absent, so source_defs are completion-gating by default."},timeout:{type:"integer",minimum:0,default:12e4,description:"Executor/script timeout in ms. Default: 120 000 (2 min)."},script:{type:"string",description:"Legacy direct-run: shell command executed when no .task-executor is registered. stdout is captured as the result."}}},render_element:{type:"object",required:["kind"],properties:{id:{type:"string",description:"Optional element ID for targeted updates"},kind:{enum:["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]},label:{type:"string",description:"Heading above this element"},className:{type:"string",description:"Bootstrap grid class, e.g. 'col-12 col-md-6'"},visible:{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 element shown only if truthy"},data:{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref",description:"card_data/requires/fetched_sources/computed_values path to read data from"},writeTo:{$ref:"#/definitions/bind_ref",description:"card_data path for user input (form, filter, todo, notes)"},columns:{type:"array",items:{type:"string"},description:"table: visible columns"},maxRows:{type:"integer",description:"table/list: max rows to display"},sortable:{type:"boolean",default:true,description:"table: enable click-to-sort"},placeholder:{type:"string",description:"Empty-state message"},chartType:{enum:["bar","line","pie","doughnut"]},chartOptions:{type:"object",description:"Chart.js options passthrough"},fields:{type:"object",description:"JSON Schema for form/filter fields"},thresholds:{type:"object",properties:{green:{type:"string"},amber:{type:"string"}}},colorMap:{type:"object",description:"badge: value \u2192 Bootstrap color"},style:{enum:["heading","muted","default"],description:"text: display style"},upload:{type:"boolean",default:true,description:"file-upload: show drop zone (false = read-only file list)"},accept:{type:"array",items:{type:"string"},description:"file-upload: allowed extensions"},multiple:{type:"boolean",default:true,description:"file-upload: allow multiple files"},fileAttach:{type:"boolean",default:false,description:"chat: enable inline file attachments"},fileAccept:{type:"array",items:{type:"string"},description:"chat: allowed attachment extensions"},buttons:{type:"array",description:"actions: button definitions",items:{type:"object",required:["id","label"],properties:{id:{type:"string"},label:{type:"string"},style:{type:"string",description:"Bootstrap button variant, e.g. 'success', 'outline-danger'"},size:{type:"string",default:"sm"},disabled:{oneOf:[{type:"boolean"},{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 truthy = disabled"}]}}}}}}}},view:{type:"object",required:["elements"],properties:{elements:{type:"array",minItems:1,items:{$ref:"#/definitions/render_element"}},layout:{type:"object",properties:{board:{type:"object",properties:{col:{type:"integer",minimum:1,maximum:12},order:{type:"integer"}}},canvas:{type:"object",properties:{x:{type:"number"},y:{type:"number"},w:{type:"number"},h:{type:"number"}}}}},features:{type:"object",properties:{chat:{type:"boolean",default:false},notes:{type:"boolean",default:false},refresh:{type:"boolean",default:true}}}}}},title:"LiveCard",description:"A unified card node. Behavior depends on which sections are present (source_defs, compute, view, etc.)",type:"object",required:["id"],additionalProperties:false,properties:{id:{type:"string"},requires:{$ref:"#/definitions/requires"},provides:{$ref:"#/definitions/provides"},meta:{$ref:"#/definitions/meta"},view:{$ref:"#/definitions/view"},card_data:{type:"object",description:"Authored card data and runtime metadata. Includes uploaded-file metadata maintained by host handlers and inference evaluation results.",properties:{files:{type:"array",description:"Optional uploaded-file metadata maintained by host handlers. Stored name is normalized and serial-prefixed (for example 001-my_file.pdf).",items:{type:"object",required:["name","stored_name"],properties:{name:{type:"string",minLength:1},stored_name:{type:"string",minLength:5,maxLength:32,pattern:"^[0-9]{3,}-[a-z0-9._-]+$"},size:{oneOf:[{type:"integer",minimum:0},{type:"null"}]},mime_type:{type:"string"},path:{type:"string",pattern:"^[^\\s]+/files/[0-9]{3,}-[a-z0-9._-]+$"},uploaded_at:{type:"string",format:"date-time"}},additionalProperties:false}}},additionalProperties:true},source_defs:{type:"array",description:"Source entries. Each entry is passed verbatim to the board's .task-executor (registered via init --task-executor) as the --in JSON file. The executor fetches/generates the data and writes JSON to --out. If no executor is registered, the built-in executor runs the entry's 'cli' command directly. Sources gate completion by default. Set optionalForCompletionGating: true for enrichment-only source_defs that should not block task-completed.",items:{$ref:"#/definitions/source_def"}},compute:{type:"array",description:"Ordered array of compute steps. Each reads card_data.*/requires.*/fetched_sources.*/computed_values.* and writes to ephemeral computed_values[bindTo].",items:{$ref:"#/definitions/compute_step"}}}};var ec=Zc(Xu());var lh=createRequire(import.meta.url),fh=lh("./jsonata-sync.cjs"),En=null;var Qu=/\b(card_data|requires|fetched_sources|computed_values|source_defs)\b/g,ph=/^\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\.|$)/;function mh(e){let t=new Set,r;for(Qu.lastIndex=0;(r=Qu.exec(e))!==null;)t.add(r[1]);return t}function tc(e){let t=ph.exec(e);return t?t[1]:null}function Zu(e,t,r,n){try{fh(e);}catch(o){let a=o instanceof Error?o.message:String(o);n.push(`${t}: invalid JSONata expression (${a})`);return}let s=mh(e);for(let o of s)r.has(o)||n.push(`${t}: disallowed namespace "${o}" in expression`);}function qo(e,t,r){if(Array.isArray(e)){e.forEach((s,o)=>{qo(s,`${t}/${o}`,r);});return}if(typeof e=="string"){let s=tc(e);if(!s)return;new Set(["card_data","requires","computed_values"]).has(s)||r.push(`${t}: disallowed namespace "${s}" in view reference`);return}if(!e||typeof e!="object")return;let n=e;for(let[s,o]of Object.entries(n))qo(o,`${t}/${s}`,r);}function gh(){if(En)return En;let e=new ec.default({allErrors:true});return ch(e),En=e.compile(Ra),En}function rc(e){let t=gh(),r=t(e),n=(t.errors??[]).map(s=>`${s.instancePath||"/"}: ${s.message??"unknown error"}`);if(e&&typeof e=="object"&&!Array.isArray(e)){let s=e.source_defs;if(Array.isArray(s)){let o=new Set,a=new Set;s.forEach((i,c)=>{if(!i||typeof i!="object"||Array.isArray(i))return;let u=i;typeof u.bindTo=="string"&&u.bindTo&&(o.has(u.bindTo)&&n.push(`/source_defs/${c}/bindTo: bindTo "${u.bindTo}" must be unique across all source_defs`),o.add(u.bindTo)),typeof u.outputFile=="string"&&u.outputFile&&(a.has(u.outputFile)&&n.push(`/source_defs/${c}/outputFile: outputFile "${u.outputFile}" must be unique across all source_defs`),a.add(u.outputFile));});}}return !r||n.length>0?{ok:false,errors:n}:{ok:true,errors:[]}}function nc(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:true,errors:[]};let r=e,n=r.compute;Array.isArray(n)&&n.forEach((u,d)=>{if(!u||typeof u!="object"||Array.isArray(u))return;let l=u.expr;typeof l!="string"||l.trim().length===0||Zu(l,`/compute/${d}/expr`,new Set(["card_data","requires","fetched_sources","computed_values"]),t);});let s=new Set(["card_data","requires","fetched_sources","computed_values"]),o=r.provides;Array.isArray(o)&&o.forEach((u,d)=>{if(!u||typeof u!="object"||Array.isArray(u))return;let l=u.ref;if(typeof l!="string"||l.trim().length===0)return;let h=tc(l);h===null?t.push(`/provides/${d}/ref: path "${l}" must start with a valid namespace (${[...s].join(", ")})`):s.has(h)||t.push(`/provides/${d}/ref: disallowed namespace "${h}" in path "${l}" (valid: ${[...s].join(", ")})`);});let a=r.view;a&&typeof a=="object"&&!Array.isArray(a)&&qo(a,"/view",t);let i=new Set(["card_data","requires"]),c=r.source_defs;return Array.isArray(c)&&c.forEach((u,d)=>{if(!u||typeof u!="object"||Array.isArray(u))return;let l=u.projections;if(!(!l||typeof l!="object"||Array.isArray(l)))for(let[h,y]of Object.entries(l))typeof y!="string"||y.trim().length===0||Zu(y,`/source_defs/${d}/projections/${h}`,i,t);}),{ok:t.length===0,errors:t}}function Fo(e){let t=rc(e);if(!t.ok)return t;let r=nc(e);return r.ok?{ok:true,errors:[]}:{ok:false,errors:r.errors}}function sc(e){return String(e).replace(/[^a-zA-Z0-9_-]/g,"_")}function oc(e){let t=e.payload??{};return {id:e.id,role:typeof t.role=="string"?t.role:"system",text:typeof t.text=="string"?t.text:"",files:Array.isArray(t.files)?t.files:[],updated_at:typeof t.updated_at=="string"?t.updated_at:""}}function Do(e,t){let r=s=>`chats/${sc(s)}/processing`,n=s=>`chats/${sc(s)}/config`;return {append(s,o,a,i=[]){return e(s).append({role:o,text:a,files:i,updated_at:new Date().toISOString()}).id},readAll(s){return e(s).readAll().map(oc)},readAfter(s,o){let a=e(s).readAfter(o);return {records:a.entries.map(oc),cursor:a.newCursor}},clear(s){e(s).clear?.();},setProcessing(s,o){o?t.write(r(s),true):t.delete(r(s));},isProcessing(s){return t.read(r(s))===true},getConfig(s){return t.read(n(s))??{}},setConfig(s,o){let a=t.read(n(s))??{};t.write(n(s),{...a,...o});}}}function hh(){let e=globalThis.crypto;return typeof e?.randomUUID=="function"?String(e.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function yh(){let e=new Map,t=new Map;function r(n){return e.has(n)||e.set(n,[]),e.get(n)}return {append(n,s,o,a=[]){let i={id:hh(),role:s,text:o,files:a,updated_at:new Date().toISOString()};return r(n).push(i),i.id},readAll(n){return r(n).slice()},readAfter(n,s){let o=r(n);if(!s)return {records:o.slice(),cursor:o.length>0?o[o.length-1].id:null};let a=o.findIndex(c=>c.id===s),i=a===-1?o.slice():o.slice(a+1);return {records:i,cursor:i.length>0?i[i.length-1].id:s}},clear(n){e.set(n,[]);},setProcessing(n,s){s?t.set(`p:${n}`,true):t.delete(`p:${n}`);},isProcessing(n){return t.get(`p:${n}`)===true},getConfig(n){return t.get(`c:${n}`)??{}},setConfig(n,s){let o=t.get(`c:${n}`)??{};t.set(`c:${n}`,{...o,...s});}}}var mt={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function Ie(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function gt(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function ac(e){return e.tasks??{}}function Mo(e){return e?e.status===mt.FAILED||e.status===mt.INACTIVATED:false}function ic(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function uc(e){return e.maxExecutions}function cc(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===mt.COMPLETED){let o=e.tasks[n];o&&Ie(o).forEach(i=>r.add(i));}return Array.from(r)}function dc(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;Ie(s).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function lc(e,t,r){let n=e.tasks[t]??xn(),s={};if(r){let a=r.tasks[t],i=gt(a);for(let c of i)for(let[u,d]of Object.entries(r.tasks))if(Ie(d).includes(c)){let l=e.tasks[u];l?.lastDataHash&&(s[c]=l.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function fc(e,t,r,n,s,o){let a=e.tasks[r]??xn(),i=t.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let c;n&&i.on&&i.on[n]?c=i.on[n]:c=Ie(i);let u=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let h=i.requires??[];for(let y of h)for(let[f,p]of Object.entries(t.tasks))if(Ie(p).includes(y)){let v=e.tasks[f];v?.lastDataHash&&(u[y]=v.lastDataHash);break}}let d={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:u,error:void 0},l=[...new Set([...e.availableOutputs,...c])];return {...e,tasks:{...e.tasks,[r]:d},availableOutputs:l,lastUpdated:new Date().toISOString()}}function pc(e,t,r,n){let s=e.tasks[r]??xn(),o=t.tasks[r];if(o?.retry){let c=s.retryCount+1;if(c<=o.retry.max_attempts){let u={...s,status:"not-started",retryCount:c,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:u},lastUpdated:new Date().toISOString()}}}let a={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},i=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(i=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&a.executionCount>=o.circuit_breaker.max_executions){let c=o.circuit_breaker.on_break;i=[...new Set([...i,...c])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:i,lastUpdated:new Date().toISOString()}}function mc(e,t,r,n){let s=e.tasks[t]??xn(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function gc(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function xn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Tn(e,t){let r=`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=yc();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function vh(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:lc(n,t.taskName,r)};case "task-completed":return {config:r,state:fc(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:pc(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:mc(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:gc(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:Ch(n,t.action)};case "task-upsert":return Sh(e,t.taskName,t.taskConfig);case "task-removal":return kh(e,t.taskName);case "node-requires-add":return wh(e,t.nodeName,t.tokens);case "node-requires-remove":return bh(e,t.nodeName,t.tokens);case "node-provides-add":return _h(e,t.nodeName,t.tokens);case "node-provides-remove":return Rh(e,t.nodeName,t.tokens);default:return e}}function hc(e,t){return t.reduce((r,n)=>vh(r,n),e)}function Sh(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:yc()},lastUpdated:new Date().toISOString()}}}function kh(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function wh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=gt(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function bh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=gt(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function _h(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Ie(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function Rh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=Ie(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function Tr(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function An(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function yc(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function Ch(e,t){let r=new Date().toISOString();switch(t){case "stop":return {...e,status:"stopped",lastUpdated:r};case "pause":return {...e,status:"paused",lastUpdated:r};case "resume":return {...e,status:"running",lastUpdated:r};default:return e}}function Ar(e){let{config:t,state:r}=e,n=ac(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=$h(n),a=cc(t,r.tasks),i=new Set([...a,...r.availableOutputs]),c=[],u=[],d=[],l=[];for(let[y,f]of Object.entries(n)){let p=r.tasks[y],v=ic(f,t.settings),_=v!=="once";if(p?.status===mt.RUNNING||Mo(p))continue;let g=uc(f);if(g!==void 0&&p&&p.executionCount>=g||f.circuit_breaker&&p&&p.executionCount>=f.circuit_breaker.max_executions||!_&&p?.status===mt.COMPLETED)continue;if(_&&p?.status===mt.COMPLETED){let R=gt(f),E=false;switch(v){case "data-changed":{R.length>0&&R.some(O=>{for(let[B,W]of Object.entries(n))if(Ie(W).includes(O)){let Z=r.tasks[B];if(!Z)continue;let fe=p.lastConsumedHashes?.[O];return Z.lastDataHash==null?Z.executionCount>p.lastEpoch:Z.lastDataHash!==fe}return false})||(E=true);break}case "epoch-changed":{R.length>0&&R.some(O=>{for(let[B,W]of Object.entries(n))if(Ie(W).includes(O)){let Z=r.tasks[B];if(Z&&Z.executionCount>p.lastEpoch)return true}return false})||(E=true);break}case "time-based":{let I=f.refreshInterval??0;if(I<=0){E=true;break}let O=p.completedAt;if(!O){E=true;break}(Date.now()-Date.parse(O))/1e3<I&&(E=true);break}case "manual":E=true;break}if(E)continue}let m=gt(f);if(m.length===0){c.push(y);continue}let k=[],w=[],$=[];for(let R of m){if(i.has(R))continue;let E=o[R]||[];E.length===0?k.push(R):E.every(O=>Mo(r.tasks[O]))?$.push({token:R,failedProducer:E[0]}):w.push(R);}k.length>0?d.push({taskName:y,missingTokens:k}):$.length>0?l.push({taskName:y,failedTokens:$.map(R=>R.token),failedProducers:[...new Set($.map(R=>R.failedProducer))]}):w.length>0?u.push({taskName:y,waitingOn:w}):c.push(y);}let h={};if(c.length>1){let y=dc(c,n);for(let[f,p]of Object.entries(y))p.length>1&&(h[f]=p);}return {eligible:c,pending:u,unresolved:d,blocked:l,conflicts:h}}function $h(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of Ie(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var Ir=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Lo(e){let t=Vo(e);return Eh(t)}function Vo(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return "["+e.map(Vo).join(",")+"]";let t=e;return "{"+Object.keys(t).sort().map(n=>JSON.stringify(n)+":"+Vo(t[n])).join(",")+"}"}function Eh(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function xh(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function Th(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function vc(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return xh(t)}function Ah(e){try{let t=JSON.parse(Th(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function Sc(e,t,r){let{handlers:n,onDrain:s}=t,o=new Ir,a="state"in e&&"config"in e?e:Tn(e),i=false,c=new Set,u=new Map(Object.entries(n)),d=new Ir,l=false,h=false;function y(){if(!i){if(l){h=true;return}l=true;try{do h=!1,f();while(h)}finally{l=false;}}}function f(){let g=d.drain(),m=o.drain(),k=[...g,...m];k.length>0&&(a=hc(a,k));let w=Ar(a);k.length>0&&s?.(k,a,w);for(let $ of w.eligible)_($);for(let $ of k)if($.type==="task-progress"){let{taskName:R,update:E}=$;if(!a.config.tasks[R])continue;let O=a.state.tasks[R];if(!O||O.status!=="running")continue;let B=vc(R),W=v(R,B,E).catch(Z=>{i||(d.append({type:"task-failed",taskName:R,error:Z.message??String(Z),timestamp:new Date().toISOString()}),y());}).finally(()=>{c.delete(W);});c.add(W);}}function p(g){let k=a.config.tasks[g].requires??[],w=new Map;for(let[R,E]of Object.entries(a.config.tasks))for(let I of E.provides??[])w.set(I,R);let $={};for(let R of k){let E=w.get(R);E?$[R]=a.state.tasks[E]?.data:$[R]=void 0;}return $}async function v(g,m,k){let w=a.config.tasks[g],$=w.taskHandlers??[],R=p(g);for(let E of $){let I=u.get(E);if(!I)throw new Error(`Handler '${E}' not found in registry (task '${g}')`);let O={nodeId:g,state:R,taskState:a.state.tasks[g],config:w,callbackToken:m,update:k};if(await I(O)==="task-initiate-failure")throw new Error(`Handler '${E}' returned task-initiate-failure (task '${g}')`)}}function _(g){let k=a.config.tasks[g]?.taskHandlers;if(!k||k.length===0)return;d.append({type:"task-started",taskName:g,timestamp:new Date().toISOString()}),y();let w=vc(g),$=v(g,w).catch(R=>{i||(d.append({type:"task-failed",taskName:g,error:R.message??String(R),timestamp:new Date().toISOString()}),y());}).finally(()=>{c.delete($);});c.add($);}return {push(g){i||(g.type==="task-completed"&&g.data&&!g.dataHash&&(g={...g,dataHash:Lo(g.data)}),o.append(g),y());},pushAll(g){if(!i){for(let m of g)m.type==="task-completed"&&m.data&&!m.dataHash?o.append({...m,dataHash:Lo(m.data)}):o.append(m);y();}},resolveCallback(g,m,k){if(i)return;let w=Ah(g);if(!w)return;let{taskName:$}=w;if(a.config.tasks[$]){if(k&&k.length>0)o.append({type:"task-failed",taskName:$,error:k.join("; "),timestamp:new Date().toISOString()});else {let R=m&&Object.keys(m).length>0?Lo(m):void 0;o.append({type:"task-completed",taskName:$,data:m,dataHash:R,timestamp:new Date().toISOString()});}y();}},addNode(g,m){i||(o.append({type:"task-upsert",taskName:g,taskConfig:m,timestamp:new Date().toISOString()}),y());},removeNode(g){i||(o.append({type:"task-removal",taskName:g,timestamp:new Date().toISOString()}),y());},addRequires(g,m){i||(o.append({type:"node-requires-add",nodeName:g,tokens:m,timestamp:new Date().toISOString()}),y());},removeRequires(g,m){i||(o.append({type:"node-requires-remove",nodeName:g,tokens:m,timestamp:new Date().toISOString()}),y());},addProvides(g,m){i||(o.append({type:"node-provides-add",nodeName:g,tokens:m,timestamp:new Date().toISOString()}),y());},removeProvides(g,m){i||(o.append({type:"node-provides-remove",nodeName:g,tokens:m,timestamp:new Date().toISOString()}),y());},registerHandler(g,m){u.set(g,m);},unregisterHandler(g){u.delete(g);},retrigger(g){i||a.config.tasks[g]&&(o.append({type:"task-restart",taskName:g,timestamp:new Date().toISOString()}),y());},retriggerAll(g){if(!i){for(let m of g)a.config.tasks[m]&&o.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()});y();}},snapshot(){return Tr(a)},getState(){return a},getSchedule(){return Ar(a)},async waitForHandlers(){c.size>0&&await Promise.allSettled([...c]);},async dispose(g){g?.wait&&c.size>0&&await Promise.allSettled([...c]),i=true;}}}var Ph=createRequire(import.meta.url),In=Ph("./jsonata-sync.cjs"),bc=In;function kc(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function _c(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function Oh(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await In(s.expr).evaluate(n);_c(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function jh(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let a=bc(o.expr).evaluate(n);_c(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch(a){let i=a instanceof Error?a.message:String(a);s.push({bindTo:o.bindTo,error:i});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function Nh(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return In(e).evaluate(n)}function qh(e,t){return t.startsWith("fetched_sources.")?kc(e._sourcesData??{},t.slice(16)):kc(e,t)}var wc=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),Fh=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function Dh(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))Fh.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,a)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${a}]: must be an object`);else {let i=o;typeof i.bindTo!="string"||!i.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(s.has(i.outputFile)&&t.push(`source_defs[${a}]: outputFile "${i.outputFile}" is not unique across source_defs`),s.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):wc.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...wc].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function Mh(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=await In(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function Lh(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=bc(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var ht={run:Oh,runSync:jh,eval:Nh,resolve:qh,validate:Dh,enrichSources:Mh,enrichSourcesSync:Lh};function Vh(e,t){let r;return /\.m?js$/i.test(e)?r="local-node":/\.py$/i.test(e)?r="local-python":r="local-process",{meta:"task-executor",howToRun:r,whatToRun:oe({kind:"fs-path",value:e}),...t?{extra:t}:{}}}function Bo(e){return JSON.stringify(e)}function Go(e){let t;try{t=JSON.parse(e);}catch{throw new Error(`parseExecutionRef: invalid JSON \u2014 ${e}`)}if(typeof t!="object"||t===null||typeof t.howToRun!="string"||typeof t.whatToRun!="string")throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun \u2014 ${e}`);return t}function Pn(e,t){function r(){return e.readIndex()??{}}function n(s,o,a){let i=String(o||"").split(".").filter(Boolean);if(i.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let c={...s},u=c;for(let d=0;d<i.length-1;d++){let l=i[d],h=u[l],y=h&&typeof h=="object"&&!Array.isArray(h)?{...h}:{};u[l]=y,u=y;}return u[i[i.length-1]]=a,c}return {readCard(s){let o=r()[s];return !o||!e.cardExists(o.key)?null:e.readCard(o.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[o,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let i=e.readCard(a.key);i?s.push(i):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,a]of Object.entries(r()))s[o]=a.checksum;return s},changedSince(s){let o=r(),a=[];for(let[i,c]of Object.entries(o))s[i]!==c.checksum&&a.push(i);for(let i of Object.keys(s))o[i]||a.push(i);return a},validateUpsert(s,o){let a=r(),i=a[s],c=Object.entries(a).find(([,u])=>u.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:c&&c[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${c[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,a){let i=r(),c=a??i[s]?.key??e.defaultCardKey(s),u=e.writeCard(c,o);i[s]={key:c,checksum:u,updatedAt:new Date().toISOString()},e.writeIndex(i);},patchCard(s,o,a){let i=r(),c=i[s];if(!c||!e.cardExists(c.key))throw new Error(`card "${s}" not found`);let u=e.readCard(c.key);if(!u||typeof u!="object"||Array.isArray(u))throw new Error(`card "${s}" is not patchable`);let d=n(u,o,a),l=e.writeCard(c.key,d);i[s]={key:c.key,checksum:l,updatedAt:new Date().toISOString()},e.writeIndex(i);},removeCard(s){let o=r(),a=o[s];a&&(e.removeCard(a.key),delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function Ko(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let o=s.trim();if(!o)return null;try{return JSON.parse(o)}catch{return o}},ingestSourceDataStaged(r,n,s,o){let a=t(s);e.write(`${r}/.staged/${o}/${n}`,a);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,a=e.read(o);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function xc(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(o=>o.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function Tc(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let o of s)try{n(o);}catch(a){let i=a instanceof Error?a.message:String(a);try{t(o,i);}catch{}}e.delete(r);}}}}var Pr="v1",yt="board/graph",Ac="board/lastJournalProcessedId";function Rc(e){return `cards/${e}/runtime`}function Ic(e){return {readRuntime(t){return e.read(Rc(t))??{_sources:{}}},writeRuntime(t,r){e.write(Rc(t),r);}}}function Bh(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function Pc(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==Pr)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=Bh(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function Uo(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Go(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",Bo(r));},readChatHandlerFlow(){return e.read("chat-handler-flow")},writeChatHandlerFlow(r){e.write("chat-handler-flow",r);},readCardStoreRef(){return t("card-store-ref")},writeCardStoreRef(r){e.write("card-store-ref",r);},readOutputsStoreRef(){return t("outputs-store-ref")},writeOutputsStoreRef(r){e.write("outputs-store-ref",r);},readScratchStoreRef(){return t("scratch-store-ref")},writeScratchStoreRef(r){e.write("scratch-store-ref",r);},readArchiveStoreRef(){return t("archive-store-ref")},writeArchiveStoreRef(r){e.write("archive-store-ref",r);}}}function Oc(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function Cc(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function Gh(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:false}function $c(e,t){return e?.lastRequestedToken?Gh(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function Kh(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function Ec(e,t){return {...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function On(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=Ar(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let f of o.pending)i.set(f.taskName,f.waitingOn);for(let f of o.unresolved)i.set(f.taskName,f.missingTokens);for(let f of o.blocked)i.set(f.taskName,f.failedTokens);let c=new Map;for(let[f,p]of Object.entries(n))for(let v of p.requires??[]){let _=c.get(v)??[];_.push(f),c.set(v,_);}let u=s.sort().map(f=>{let p=r[f],v=n[f]??{requires:[],provides:[]};p.status==="completed"?a.completed+=1:p.status==="failed"?a.failed+=1:p.status==="in-progress"&&(a.in_progress+=1);let _=v.requires??[],g=v.provides??[],m=Object.keys(p.data??{}).sort(),k=_.filter(O=>t.state.availableOutputs.includes(O)),w=_.filter(O=>!t.state.availableOutputs.includes(O)),$=i.get(f)??w,R=new Set;for(let O of g)for(let B of c.get(O)??[])B!==f&&R.add(B);let E=p.failedAt,I=p.error?{message:p.error,code:"TASK_FAILED",at:E,source:"task-runtime"}:void 0;return {name:f,status:p.status,error:I,requires:_,requires_satisfied:k,requires_missing:w,provides_declared:g,provides_runtime:m,blocked_by:$,unblocks:Array.from(R).sort(),runtime:{attempt_count:p.executionCount??0,restart_count:p.retryCount??0,in_progress_since:p.status==="in-progress"?p.startedAt??null:null,last_transition_at:p.lastUpdated??null,last_completed_at:p.completedAt??null,last_restarted_at:p.startedAt??null,status_age_ms:p.lastUpdated?0:null}}});a.pending=o.pending.length,a.blocked=o.blocked.length,a.unresolved=o.unresolved.length;let d=u.map(f=>({name:f.name,fanOut:f.unblocks.length})).sort((f,p)=>p.fanOut-f.fanOut||f.name.localeCompare(p.name)),l=d.length>0?d[0]:{name:null,fanOut:0},h=new Set;for(let f of Object.values(n))for(let p of f.requires??[])h.add(p);let y=0;for(let[f,p]of Object.entries(n)){let v=(p.requires??[]).length===0,g=(p.provides??[]).some(m=>(c.get(m)??[]).some(k=>k!==f));v&&!g&&(y+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:a.completed,eligible:o.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:y,topology:{edge_count:Array.from(h).length,max_fan_out_card:l.name,max_fan_out:l.fanOut}},cards:u}}function Uh(){return new Date().toISOString()}function jc(e,t,r,n,s,o,a){return async i=>{let c=[],u=r.cardStore.readCard(i.nodeId);if(!u)return "task-initiate-failure";let d=u.id,l=u.card_data??{},h=u.source_defs??[],y=h.filter(D=>D.optionalForCompletionGating!==true),f=r.cardRuntimeStore.readRuntime(d),p=false,v=()=>{p&&(r.cardRuntimeStore.writeRuntime(d,f),p=false);},_=D=>Cc(f._sources[D]),g=(D,M)=>{f._sources[D]=Cc(M),p=true;},m=i.taskState?.executionCount??0;if(f._lastExecutionCount!==m&&(f._sources={},f._lastExecutionCount=m,p=true),i.update){let D=i.update,M=D.outputFile;if(M){let re=_(M);if(D.failure){let X=D.rqt??re.lastRequestedToken??re.queueRequestedToken;X&&g(M,Ec(re,X));}else {let X=D.rqt;if(!re.lastCompletedToken||X>re.lastCompletedToken){let de=typeof D.deliveryToken=="string"?D.deliveryToken:void 0,C=false;de&&(C=r.fetchedSourcesStore.commitSourceData(d,M,de)),C?g(M,Kh(re,X)):g(M,Ec(re,X));}}v();}}let w={};for(let D of h)if(D.outputFile){let M=r.fetchedSourcesStore.readSourceData(d,D.outputFile);M!==null&&(w[D.bindTo]=M);}let $={};for(let[D,M]of Object.entries(i.state??{}))if(M!==null&&typeof M=="object"&&!Array.isArray(M)){let re=M[D];$[D]=re!==void 0?re:M;}else $[D]=M;let R={id:d,card_data:{...l},requires:$,source_defs:h,compute:u.compute};R._sourcesData=w,u.compute&&ht.runSync(R,{sourcesData:w}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(d,R.computed_values??{});let E={...u},I=ht.enrichSourcesSync(Array.isArray(u.source_defs)?u.source_defs:void 0,{card_data:u.card_data,requires:$}),O=e.value;E.source_defs=Array.isArray(I)?I.map(D=>({...D,boardDir:typeof D.boardDir=="string"&&D.boardDir?D.boardDir:O})):I;let B=Uh(),W=i.update?void 0:B,Z=y.filter(D=>{let M=D.outputFile;if(typeof M!="string"||!M)return true;let re=_(M);W&&(re={...re,queueRequestedToken:W},g(M,re));let X=re.queueRequestedToken??re.lastRequestedToken??B,de=$c(re,X);return de==="in-flight"?false:de==="dispatch"});if(v(),Z.length>0){let D=false,M=B;for(let re of Z){let X=re.outputFile;if(typeof X!="string"||!X)continue;let de=_(X),C=de.queueRequestedToken??B;g(X,{...de,lastRequestedToken:C}),M=C,D=true;}return D&&v(),D&&(c.push({taskKind:"source-fetch",payload:{boardRef:oe(e),enrichedCard:E,callbackToken:i.callbackToken,rqt:M}}),r.executionRequestStore.appendEntries(t,c)),"task-initiated"}if(y.some(D=>{let M=D.outputFile;if(typeof M!="string"||!M)return false;let re=_(M),X=re.queueRequestedToken??re.lastRequestedToken??B;return $c(re,X)==="in-flight"}))return "task-initiated";let Pe=u.provides??[],_e={};for(let{bindTo:D,ref:M}of Pe)_e[D]=ht.resolve(R,M);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(_e),h.filter(D=>{if(D.optionalForCompletionGating!==true)return false;let M=_(D.outputFile);return !M.lastRequestedToken||!M.lastCompletedToken?true:M.lastCompletedToken<=M.lastRequestedToken}).length>0&&c.push({taskKind:"source-fetch",payload:{boardRef:oe(e),enrichedCard:E,callbackToken:i.callbackToken,rqt:B}}),n(i.nodeId,_e),c.length>0&&r.executionRequestStore.appendEntries(t,c),"task-initiated"}}var jn={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function Nc(e){return {[yt]:e.graph,[Ac]:e.lastDrainedJournalId}}function qc(e){let t=e[yt],r=e[Ac];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${yt}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function Fc(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function Q(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function q(e){return {status:"fail",error:e}}function ee(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Jh(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Mc(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(s)}function Nn(e){try{let t=JSON.parse(Mc(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function zh(e){return Jh(JSON.stringify(e))}function Dc(e){try{let t=JSON.parse(Mc(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Se(){return new Date().toISOString()}function Hh(e,t){let r=t.onWarn??(()=>{}),n=oe(e);function s(C){if(C.length!==0)try{let S=t.publishBoardChangeNotifications?.(C);S&&typeof S.catch=="function"&&S.catch(T=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${T instanceof Error?T.message:String(T)}`));}catch(S){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${S instanceof Error?S.message:String(S)}`);}}function o(){let C=i().readCardStoreRef();if(!C)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let S=t.kvStorageForRef(C);return {readIndex(){return S.read("_index")},writeIndex(T){S.write("_index",T);},readCard(T){return S.read(T)},writeCard(T,j){return S.write(T,j),t.hashFn(j)},removeCard(T){S.delete(T);},cardExists(T){return S.read(T)!==null},defaultCardKey(T){return T}}}let a={readValues(C){let S=t.kvStorage("state-snapshot"),T=S.listKeys().sort();if(T.length===0)return {version:null,values:{}};let j={};for(let ue of T)j[ue]=S.read(ue);return {version:t.hashFn(j),values:j}},writeValues(C,S,T){let j=t.kvStorage("state-snapshot");for(let ue of T)j.delete(ue);for(let[ue,ne]of Object.entries(S))j.write(ue,ne);return t.hashFn(S)}},i=()=>Uo(t.kvStorage("config")),c=()=>Pc(a),u=()=>xc(t.journalAdapter()),d=()=>Pn(o(),r),l=()=>{let C=i().readOutputsStoreRef();if(!C)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return Oc(t.kvStorageForRef(C))},h=()=>{let C=i().readArchiveStoreRef();return C?t.archiveFactoryForRef(C):t.archiveFactory()};function y(){return !!c().readSnapshot(e.value).values[yt]}function f(){let C=c().readSnapshot(e.value);if(!C.values[yt])throw new Error(`Board not initialized at ${e.value}`);return qc(C.values)}function p(C,S){let T=c().commitSnapshot(e.value,{schemaVersion:Pr,expectedVersion:S,commitId:t.genId(),committedAt:Se(),deleteKeys:[],shallowMerge:Nc(C)});if(!T.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${S??"null"} current=${T.currentVersion??"null"}`)}function v(C){u().appendEvent(C);}async function _(){let C=(P,F)=>{let ce=P.payload,st=(ce?.enrichedCard??{}).id??ce?.cardId??"unknown";v({type:"task-failed",taskName:st,error:F,timestamp:Se()});},S=Tc(t.kvStorage("execution-requests"),C),T=Ic(t.kvStorage("card-runtime")),j=Ko(t.blobStorage("sources"),P=>t.resolveBlob(P)),ue=new Map,ne={readRuntime(P){return ue.get(P)??T.readRuntime(P)},writeRuntime(P,F){ue.set(P,F);}},Te=[],ke=new Map,nt={readSourceData(P,F){let ce=`${P}/${F}`;return ke.has(ce)?ke.get(ce):j.readSourceData(P,F)},ingestSourceDataStaged(P,F,ce,jt){j.ingestSourceDataStaged(P,F,ce,jt);},commitSourceData(P,F,ce){let jt=`${P}/.staged/${ce}/${F}`,Nr=t.blobStorage("sources").read(jt);if(Nr==null)return false;let Nt=`${P}/${F}`,Yo=Nr.trim();try{ke.set(Nt,JSON.parse(Yo));}catch{ke.set(Nt,Yo);}return Te.push({cardId:P,outputFile:F,deliveryToken:ce}),true},hasSource(P,F){let ce=`${P}/${F}`;return ke.has(ce)?true:j.hasSource(P,F)}},Ae={cardStore:d(),cardRuntimeStore:ne,fetchedSourcesStore:nt,outputStore:l(),executionRequestStore:S},vt=f(),St=An(vt.graph),{events:Pt,newCursor:Ot}=u().readEntriesAfterCursor(vt.lastDrainedJournalId),kt=[],qn=[],Fn=[],zo=new Map,Kc=(P,F)=>{kt.push({type:"task-completed",taskName:P,data:F,timestamp:Se()});try{h().stream("exec-history").append({taskName:P,status:"completed",completedAt:Se()});}catch{}},Ho=(P,F)=>{v({type:"task-failed",taskName:P,error:F,timestamp:Se()});try{h().stream("exec-history").append({taskName:P,status:"failed",error:F,completedAt:Se()});}catch{}},Or=Sc(St,{handlers:{"card-handler":jc(e,Ot,Ae,Kc,Ho,(P,F)=>{qn.push({cardId:P,values:F});},P=>{Fn.push(P);})}});for(kt=Pt;kt.length>0;){let P=kt;kt=[];for(let F of P)if(F.type==="task-restart"){let ce=Ae.cardStore.readCard(F.taskName);ce&&zo.set(F.taskName,ce);}Or.pushAll(P),await Or.waitForHandlers();}let Wo=Or.getState();await Or.dispose({wait:true});let Uc=c().readSnapshot(e.value).version;p({lastDrainedJournalId:Ot,graph:Tr(Wo)},Uc);for(let{cardId:P,values:F}of qn)Ae.outputStore.writeComputedValues(P,F);for(let P of Fn)Ae.outputStore.writeDataObjects(P);for(let[P,F]of ue)T.writeRuntime(P,F);for(let{cardId:P,outputFile:F,deliveryToken:ce}of Te)j.commitSourceData(P,F,ce);let jr;try{jr=On(n,Wo),Ae.outputStore.writeStatusSnapshot(jr);}catch(P){r(`[board-live-cards-public] status publish failed: ${P instanceof Error?P.message:String(P)}`);}let Zt=[];for(let{cardId:P,values:F}of qn)Zt.push({kind:"computed_values",cardId:P,values:F});for(let P of Fn)for(let[F,ce]of Object.entries(P))F&&Zt.push({kind:"data_object",key:F,payload:ce});for(let[P,F]of zo)Zt.push({kind:"card_refreshed",cardId:P,card:F});jr!==void 0&&Zt.push({kind:"status",status:jr}),s(Zt);let Jc=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:oe({kind:"built-in",value:"source-cli-task-executor"})};S.dispatchEntriesForJournalId(Ot,P=>{if(P.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${P.taskKind}" \u2014 skipping`);return}let F=P.payload,ce=F.enrichedCard?.id??"unknown",jt=F.enrichedCard?.source_defs??[];for(let st of jt){if(!st.outputFile){r(`[dispatch] source "${st.bindTo}" has no outputFile \u2014 skipping`);continue}let Nr=zh({cbk:F.callbackToken,rg:e.value,br:oe(e),cid:ce,b:st.bindTo,d:st.outputFile,cs:void 0,rqt:F.rqt});t.dispatchExecution(Jc,{source_def:st,base_ref:oe(e),callback:{token:Nr,via:t.selfRef}}).catch(Nt=>Ho(ce,Nt instanceof Error?Nt.message:String(Nt)));}});}async function g(){try{let C=()=>{let T=f(),{events:j}=u().readEntriesAfterCursor(T.lastDrainedJournalId);j.length<=0||(g(),t.requestProcessAccumulated?.());},S=await Qo(t.lock,_,C);return Q({ran:S!==!1})}catch(C){return ee(C)}}function m(){g(),t.requestProcessAccumulated?.();}function k(C){try{let S=C.params?.cardStoreRef;if(!S)return q("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!y()){let ke=Tn(jn);p({lastDrainedJournalId:"",graph:Tr(ke)},null);}let T=C.params?.outputsStoreRef;if(!T)return q("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let j=C.params?.scratchStoreRef,ue=C.params?.archiveStoreRef,ne=i();ne.writeCardStoreRef(S),ne.writeOutputsStoreRef(T),j&&ne.writeScratchStoreRef(j),ue&&ne.writeArchiveStoreRef(ue);let Te=C.body??{};Te["task-executor-ref"]&&ne.writeTaskExecutorRef(Te["task-executor-ref"]),Object.prototype.hasOwnProperty.call(Te,"chat-handler-flow")&&ne.writeChatHandlerFlow(Te["chat-handler-flow"]);try{l().writeStatusSnapshot(On(n,An(f().graph)));}catch{}return Q()}catch(S){return ee(S)}}function w(C){try{let S=l().readStatusSnapshot();if(!S){S=On(n,An(f().graph));try{l().writeStatusSnapshot(S);}catch{}}return Q(S)}catch(S){return ee(S)}}function $(C){try{let S=C.params?.id;return S?(v({type:"task-removal",taskName:S,timestamp:Se()}),m(),Q()):q("removeCard requires params.id")}catch(S){return ee(S)}}function R(C){try{let S=C.params?.id;return S?(v({type:"task-restart",taskName:S,timestamp:Se()}),m(),Q()):q("retrigger requires params.id")}catch(S){return ee(S)}}async function E(C){return g()}function I(C){try{let S=C.params?.cardId,T=C.params?.all,j=!!C.params?.restart;if(!S&&!T)return q("upsertCard requires --card-id <id> or --all");let ue=T?d().readAllCards().map(ne=>ne.id):[S];for(let ne of ue)if(!d().readCard(ne))return q(`Card "${ne}" not found in board at ${e.value}`);for(let ne of ue){let Te=d().readCard(ne),ke=Fc(Te),nt=t.hashFn(ke),Ae=t.kvStorage("card-upsert"),vt=Ae.read(ne),St=vt?.taskConfigHash!==nt;if(!(!St&&!j)){if(St){let Pt=vt?.blobRef??d().readCardKey(ne)??ne;v({type:"task-upsert",taskName:ne,taskConfig:ke,timestamp:Se()}),Ae.write(ne,{blobRef:Pt,taskConfigHash:nt,updatedAt:Se()});}j&&v({type:"task-restart",taskName:ne,timestamp:Se()});}}return m(),Q()}catch(S){return ee(S)}}function O(C){try{let S=C.params?.token;if(!S)return q("taskFailed requires params.token");let T=C.params?.error??"unknown error",j=Nn(S);if(!j)return q("Invalid callback token");v({type:"task-failed",taskName:j.taskName,error:T,timestamp:Se()});try{h().stream("exec-history").append({taskName:j.taskName,status:"failed",error:T,completedAt:Se()});}catch{}return m(),Q()}catch(S){return ee(S)}}function B(C){try{let S=C.params?.token;if(!S)return q("taskProgress requires params.token");let j=(C.body??{}).update??{},ue=Nn(S);return ue?(v({type:"task-progress",taskName:ue.taskName,update:j,timestamp:Se()}),m(),Q()):q("Invalid callback token")}catch(S){return ee(S)}}function W(C){try{let S=C.params?.token,T=C.params?.ref;if(!S)return q("sourceDataFetched requires params.token");if(!T)return q("sourceDataFetched requires params.ref");let j=Dc(S);if(!j)return q("Invalid source token");let{cbk:ue,cid:ne,b:Te,d:ke,cs:nt,rqt:Ae}=j,vt=Ko(t.blobStorage("sources"),kt=>t.resolveBlob(kt)),St=t.genId();vt.ingestSourceDataStaged(ne,ke,Ue(T),St);let Pt=Nn(ue);if(!Pt)return q("Invalid callback token embedded in source token");let Ot=Se();return v({type:"task-progress",taskName:Pt.taskName,update:{bindTo:Te,outputFile:ke,fetchedAt:Ot,deliveryToken:St,sourceChecksum:nt,rqt:Ae},timestamp:Ot}),m(),Q()}catch(S){return ee(S)}}function Z(C){try{let S=C.params?.token,T=C.params?.reason??"unknown";if(!S)return q("sourceDataFetchFailure requires params.token");let j=Dc(S);if(!j)return q("Invalid source token");let{cbk:ue,b:ne,d:Te,cs:ke,rqt:nt}=j,Ae=Nn(ue);return Ae?(v({type:"task-progress",taskName:Ae.taskName,update:{bindTo:ne,outputFile:Te,failure:!0,reason:T,sourceChecksum:ke,rqt:nt},timestamp:Se()}),m(),Q()):q("Invalid callback token embedded in source token")}catch(S){return ee(S)}}function fe(C){try{let S=i().readCardStoreRef();return S?Q({storeRef:S}):q(`Board at ${e.value} has no card store configured`)}catch(S){return ee(S)}}function Pe(C){try{let S=i().readOutputsStoreRef();return S?Q({storeRef:S}):q(`Board at ${e.value} has no outputs store configured`)}catch(S){return ee(S)}}function _e(C){try{let S=i().readScratchStoreRef();return Q({storeRef:S})}catch(S){return ee(S)}}function Ye(C){try{let S=i().readArchiveStoreRef();return Q({storeRef:S})}catch(S){return ee(S)}}function D(C){try{let S=C.params?.key;if(!S)return q("getConfig requires params.key");let T=i(),j;switch(S){case "task-executor":j=T.readTaskExecutorRef()??null;break;case "chat-handler-flow":j=T.readChatHandlerFlow()??null;break;case "card-store-ref":j=T.readCardStoreRef();break;case "outputs-store-ref":j=T.readOutputsStoreRef();break;case "scratch-store-ref":j=T.readScratchStoreRef();break;case "archive-store-ref":j=T.readArchiveStoreRef();break;default:return q(`getConfig: unknown key "${S}"`)}return Q({value:j})}catch(S){return ee(S)}}function M(C){try{let S=C.params?.key;if(!S)return q("getOutputsDataObject requires params.key");let T=l().readDataObject(S);return Q(T)}catch(S){return ee(S)}}function re(C){try{return Q(l().readAllDataObjects())}catch(S){return ee(S)}}function X(C){try{let S=C.params?.key;if(!S)return q("getOutputsComputedValues requires params.key");let T=l().readComputedValues(S);return Q(T)}catch(S){return ee(S)}}function de(C){try{return Q(l().readAllComputedValues())}catch(S){return ee(S)}}return {init:k,status:w,getCardStoreRef:fe,getOutputsStoreRef:Pe,getScratchStoreRef:_e,getArchiveStoreRef:Ye,getConfig:D,getOutputsDataObject:M,getAllOutputsDataObjects:re,getOutputsComputedValues:X,getAllOutputsComputedValues:de,removeCard:$,retrigger:R,processAccumulatedEvents:E,upsertCard:I,taskFailed:O,taskProgress:B,sourceDataFetched:W,sourceDataFetchFailure:Z}}function Wh(e,t){let r=()=>Uo(t.kvStorage("config"));function n(){let g=r().readCardStoreRef();if(!g)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let m=t.kvStorageForRef(g);return {readIndex(){return m.read("_index")},writeIndex(k){m.write("_index",k);},readCard(k){return m.read(k)},writeCard(k,w){return m.write(k,w),t.hashFn(w)},removeCard(k){m.delete(k);},cardExists(k){return m.read(k)!==null},defaultCardKey(k){return k}}}let s=()=>Pn(n(),t.onWarn??(()=>{})),o=()=>{let g=r().readScratchStoreRef();return g?t.scratchStorageForRef(g):t.scratchStorage()};function a(g,m){let k=t.validateSchema(m),w=[],$=r().readTaskExecutorRef();if($&&Array.isArray(m.source_defs))for(let E of m.source_defs){let I=typeof E.bindTo=="string"?E.bindTo:"(unknown)";try{let O;try{O=t.invokeExecutorSync($,"validate-source-def",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(E)});}catch(W){let Z=W;if(O=typeof Z?.stdout=="string"?Z.stdout:"",!O.trim()){w.push(`source "${I}": executor validate-source-def failed \u2014 ${W instanceof Error?W.message:String(W)}`);continue}}let B=JSON.parse(O.trim());if(!B.ok&&Array.isArray(B.errors))for(let W of B.errors)w.push(`source "${I}": ${W}`);}catch(O){w.push(`source "${I}": executor validate-source-def failed \u2014 ${O instanceof Error?O.message:String(O)}`);}}let R=[...k.errors,...w];return Q({cardId:g,isValid:R.length===0,issues:R})}function i(g,m,k){let w=r().readTaskExecutorRef();if(!w)return q("No task-executor registered for this board");let $=typeof g.bindTo=="string"?g.bindTo:"source",R=o(),E={...g,boardDir:e.value,_projections:m},I=R.create(JSON.stringify(E,null,2),`probe-in-${$}`,".json"),O=R.getUniqueKey(`probe-out-${$}`,".json"),B=R.getUniqueKey(`probe-err-${$}`,".txt"),W=oe(R.keyRef(I)),Z=oe(R.keyRef(O)),fe=oe(R.keyRef(B)),Pe=null;try{if(t.invokeExecutorSync(w,"run-source-fetch",["--in-ref",W,"--out-ref",Z,"--err-ref",fe],{timeout:g.timeout??t.executorTimeouts?.probeMs??6e4}),Pe=R.read(O),Pe===null)return q("Executor produced no output file")}catch(_e){let Ye=R.read(B)?.trim()??(_e instanceof Error?_e.message:String(_e));return q(`Probe failed: ${Ye}`)}finally{try{R.remove(I);}catch{}try{R.remove(B);}catch{}}if(k){let _e=Ue(k);t.absoluteBlob.write(_e.value,Pe);}try{R.remove(O);}catch{}return Q({bindTo:$,resultSizeBytes:Pe.length})}function c(g){try{let m=g.params?.cardId,k=g.params?.all;if(!m&&!k)return q("validateCard requires --card-id <id> or --all");let w=k?s().readAllCards().map(R=>R.id):[m],$=[];for(let R of w){let E=s().readCard(R);if(!E){$.push({cardId:R,isValid:!1,issues:[`Card "${R}" not found`]});continue}let I=a(R,E);if(I.status!=="success")return I;$.push(I.data);}return Q($)}catch(m){return ee(m)}}function u(g){try{if(!g.body||typeof g.body!="object"||Array.isArray(g.body))return q("validateCardPreflight requires card JSON object in body");let m=g.body,k=m["card-content"]??m,w=typeof k.id=="string"?k.id:"(unknown)",$=a(w,k),R=r().readTaskExecutorRef();if(R)try{let E=t.invokeExecutorSync(R,"validate-card-preflight",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(k)}),I=JSON.parse(E.trim());if(!I.ok&&Array.isArray(I.errors)&&I.errors.length>0){let O=[...$.status==="success"?$.data.issues:[],...I.errors];return Q({cardId:w,isValid:!1,issues:O})}}catch{}return $}catch(m){return ee(m)}}function d(g){try{let m=g.params?.cardId,k=g.params?.sourceIdx,w=g.params?.outRef;if(!m)return q("probeSource requires params.cardId");if(k===void 0)return q("probeSource requires params.sourceIdx");let R=(g.body??{})["mock-projections"]??{},E=s().readCard(m);if(!E)return q(`Card "${m}" not found`);let I=E.source_defs??[];return k<0||k>=I.length?q(`sourceIdx ${k} out of range (card has ${I.length} source(s))`):i(I[k],R,w)}catch(m){return ee(m)}}function l(g){try{let m=g.params?.outRef,k=g.body;if(!k)return q('probeTmpSource requires body with "source-def" and "mock-projections"');let w=k["source-def"],$=k["mock-projections"]??{};return w?i(w,$,m):q('probeTmpSource body requires "source-def"')}catch(m){return ee(m)}}function h(g){try{let m=g.params?.sourceIdx,k=g.params?.outRef;if(m===void 0)return q("probeSourcePreflight requires params.sourceIdx");if(!g.body||typeof g.body!="object"||Array.isArray(g.body))return q("probeSourcePreflight requires card JSON object in body");let w=g.body,$=w["card-content"]??w,R=w["mock-projections"]??{},E=$.source_defs??[];if(m<0||m>=E.length)return q(`sourceIdx ${m} out of range (card has ${E.length} source(s))`);let I=E[m],O=r().readTaskExecutorRef();if(O){let B=typeof I.bindTo=="string"?I.bindTo:"source";try{let W={...I,_projections:R},Z=t.invokeExecutorSync(O,"probe-source-preflight",[],{timeout:I.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(W)}),fe=JSON.parse(Z.trim());return fe.ok?Q({bindTo:B,reachable:fe.reachable,latencyMs:fe.latencyMs,note:fe.note}):q(fe.error??"Preflight probe failed")}catch{}}return i(I,R,k)}catch(m){return ee(m)}}function y(g){try{let m=r().readTaskExecutorRef();if(!m)return q("No task-executor registered for this board");let k=t.invokeExecutorSync(m,"describe-capabilities",[],{timeout:t.executorTimeouts?.describeMs??1e4});return Q(JSON.parse(k.trim()))}catch(m){return ee(m)}}function f(g){try{let m=g.body;if(!m||!Array.isArray(m.ops))return q("updatesInCardStore requires body.ops array");let k=m.ops,w=s();for(let $ of k){let R=$.op,E=$.id;if(!E)return q('op is missing "id"');if(R==="update"){let I=$["card-content"];if(!I)return q(`update op for "${E}" is missing "card-content"`);w.writeCard(E,I);}else return q(`Unknown op type: "${R??"(none)"}"`)}return Q()}catch(m){return ee(m)}}function p(g){try{let m=g.body;if(!m||!Array.isArray(m.ids))return q("readFromCardStore requires body.ids array");let k=m.ids,w=s(),$=k.map(R=>({id:R,"card-content":w.readCard(R)}));return Q({cards:$})}catch(m){return ee(m)}}function v(g){try{if(!g.body||typeof g.body!="object"||Array.isArray(g.body))return q("evalCardCompute requires a JSON object in body");let m=g.body,k=m["card-content"]??m,w=typeof k.id=="string"?k.id:"(unknown)",$=m["mock-fetched-sources"]??{},R=m["mock-requires"]??{},E=k.compute;if(!E||!Array.isArray(E)||E.length===0)return Q({cardId:w,ok:!0,computed_values:{},errors:[]});let I={id:w,card_data:k.card_data??{},requires:R,source_defs:k.source_defs,compute:E},O=ht.runSync(I,{sourcesData:$}),B=O.node.computed_values??{},W=O.errors??[];return Q({cardId:w,ok:W.length===0,computed_values:B,errors:W})}catch(m){return ee(m)}}function _(g){try{if(!g.body||typeof g.body!="object"||Array.isArray(g.body))return q("simulateCardCycle requires a JSON object in body");let m=g.body,k=m["card-content"]??m,w=typeof k.id=="string"?k.id:"(unknown)",$=m["mock-fetched-sources"]??{},R=m["mock-requires"]??{},E=a(w,k),I=E.status==="success"?{isValid:E.data.isValid,issues:E.data.issues}:{isValid:!1,issues:[E.status==="fail"?E.error:"internal error"]},O=k.source_defs??[],B=k.card_data??{},W=[],Z=[];if(O.length>0){W=ht.enrichSourcesSync(O,{card_data:B,requires:R});for(let X of W){let de=X.projections,C=X._projections;if(de&&C){for(let S of Object.keys(de))if(C[S]===void 0){let T=typeof X.bindTo=="string"?X.bindTo:"(unknown)";Z.push({bindTo:T,key:S,error:`Projection "${S}" resolved to undefined`});}}}}let fe=[],Pe=m["task-executor-ref"],_e=(Pe?.howToRun&&Pe?.whatToRun?Pe:void 0)??r().readTaskExecutorRef();for(let X=0;X<W.length;X++){let de=W[X],C=typeof de.bindTo=="string"?de.bindTo:`source_${X}`;if(!_e){fe.push({bindTo:C,skipped:!0,error:"No task executor configured"});continue}try{let S={...de},T=t.invokeExecutorSync(_e,"probe-source-preflight",[],{timeout:de.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(S)}),j=JSON.parse(T.trim());fe.push({bindTo:C,reachable:j.reachable,latencyMs:j.latencyMs,error:j.ok?void 0:j.error});}catch{fe.push({bindTo:C,skipped:!0,error:"Executor does not support probe-source-preflight"});}}let Ye=k.compute,D={},M=[];if(Ye&&Array.isArray(Ye)&&Ye.length>0){let X={id:w,card_data:B,requires:R,source_defs:k.source_defs,compute:Ye},de=ht.runSync(X,{sourcesData:$});D=de.node.computed_values??{},M=de.errors??[];}let re=I.isValid&&Z.length===0&&M.length===0&&fe.every(X=>X.reachable!==!1);return Q({cardId:w,ok:re,validation:I,source_probes:fe,projection_errors:Z,computed_values:D,compute_errors:M})}catch(m){return ee(m)}}return {validateCard:c,validateCardPreflight:u,probeSource:d,probeTmpSource:l,probeSourcePreflight:h,evalCardCompute:v,simulateCardCycle:_,describeTaskExecutorCapabilities:y,updatesInCardStore:f,readFromCardStore:p}}function Yh(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {get(s){try{let o=s.params?.id;if(o){let a=e.readCard(o);return a?t({cards:[a]}):r(`card "${o}" not found`)}return t({cards:e.readAllCards()})}catch(o){return n(o)}},set(s){try{let o=s.body;if(o==null)return r("set requires a body (card object or array of cards)");let a=Array.isArray(o)?o:[o];for(let i of a){if(typeof i.id!="string")return r("each card must have a string `id` field");e.writeCard(i.id,i);}return t({count:a.length})}catch(o){return n(o)}},del(s){try{let o=s.body?.ids??[],a=s.params?.id,i=a?[...o,a]:o;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let c of i)e.removeCard(c);return t({count:i.length})}catch(o){return n(o)}},patch(s){try{let o=s.params?.id,a=s.params?.path;if(!o)return r("patch requires params.id");if(!a)return r("patch requires params.path");let i=s.body,c=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:s.body;return e.patchCard(o,a,c),t({count:1})}catch(o){return n(o)}}}}function Xh(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {list(s){try{let o=s.params?.prefix??"";return t({artifacts:e.list(o)})}catch(o){return n(o)}},head(s){try{let o=s.params?.key;return o?t({artifact:e.head(o)}):r("head requires params.key")}catch(o){return n(o)}},put(s){try{let o=s.params?.key,a=s.params?.contentType;if(!o)return r("put requires params.key");let i=s.body;if(typeof i=="string")return t({artifact:e.putText(o,i,a)});if(i&&typeof i=="object"&&typeof i.text=="string")return t({artifact:e.putText(o,i.text,a)});if(i&&typeof i=="object"&&Array.isArray(i.bytes)){let c=i.bytes,u=new Uint8Array(c.map(d=>Math.max(0,Math.min(255,Number(d)||0))));return t({artifact:e.putBytes(o,u,a)})}return r("put requires body as string, {text}, or {bytes:number[]}")}catch(o){return n(o)}},get(s){try{let o=s.params?.key,a=s.params?.as??"base64";if(!o)return r("get requires params.key");let i=e.head(o);if(!i)return r(`artifact "${o}" not found`);if(a==="text"){let u=e.getText(o);return u===null?r(`artifact "${o}" not found`):t({key:o,contentType:i.contentType,size:i.size,text:u})}let c=e.getBytes(o);return c===null?r(`artifact "${o}" not found`):t({key:o,contentType:i.contentType,size:i.size,bytes:[...c]})}catch(o){return n(o)}},del(s){try{let o=s.params?.key;return o?(e.remove(o),t({ok:!0})):r("del requires params.key")}catch(o){return n(o)}}}}function Lc(){return new Date().toISOString()}function Vc(e){return new TextEncoder().encode(e).byteLength}function Qh(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Zh(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function ey(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function ty(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function ry(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function ny(e){let t=ey(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function sy(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function Jo(e){function t(r){let n=e.stat?Qh(e.stat(r)):null;if(n)return n;if(!e.exists(r))return null;let s=e.read(r);return s===null?{key:r}:{key:r,size:Vc(s)}}return {exists(r){return e.exists(r)},putText(r,n,s="text/plain; charset=utf-8"){e.write(r,n);let o=t(r)??{key:r};return o.contentType=s,o.updatedAt=o.updatedAt??Lc(),o.size=o.size??Vc(n),o},putBytes(r,n,s="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let a=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,a);}let o=t(r)??{key:r};return o.contentType=s,o.updatedAt=o.updatedAt??Lc(),o.size=o.size??n.byteLength,o},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let s=e.readBytes(r);return s===null?null:Buffer.from(s).toString("utf-8")}try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new TextDecoder("utf-8").decode(new Uint8Array(s.data))}catch{}return n},getBytes(r){if(e.readBytes){let s=e.readBytes(r);if(s!==null)return s}let n=e.read(r);if(n===null)return null;try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new Uint8Array(s.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){return e.listKeys(r).map(n=>t(n)??{key:n}).sort((n,s)=>n.key.localeCompare(s.key))},remove(r){e.remove(r);}}}function oy(e){function t(s,o){let a=0,i=[];Array.isArray(o)&&i.push(...o);for(let c of e.list(`${s}/`))i.push(sy(c.key));for(let c of i){let u=Zh(c);Number.isFinite(u)&&u>a&&(a=u);}return a+1}function r(s,o,a){let i=Number(a?.maxLen||32),{stem:c,ext:u}=ny(s),d=ry(u),l=ty(c),h=`${String(o).padStart(3,"0")}-`,y=d,f=i-h.length-y.length;f<1&&(y="",f=i-h.length);let p=l.slice(0,Math.max(1,f)),v=`${h}${p}${y}`;return v.length>i&&(v=v.slice(0,i).replace(/\.$/,"")),v}function n(s,o,a){let i=t(s,a?.seedNames),c=r(o,i,{maxLen:a?.maxLen});for(;e.exists(`${s}/${c}`);)i+=1,c=r(o,i,{maxLen:a?.maxLen});return c}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function ay(){function e(s,o){if(!Array.isArray(s))return [];let a=[];for(let i of s){if(!i||typeof i!="object")continue;let c=i;typeof c.stored_name=="string"&&a.push({name:typeof c.name=="string"?c.name:c.stored_name,stored_name:c.stored_name,size:typeof c.size=="number"&&Number.isFinite(c.size)?c.size:null,mime_type:typeof c.mime_type=="string"?c.mime_type:null,uploaded_at:typeof c.uploaded_at=="string"?c.uploaded_at:o||null,chat:c.chat===true});}return a}function t(s){return !s||typeof s!="object"?[]:e(s.files,void 0)}function r(s,o){let a=t(s);if(o.length===0)return s.files=a,a;let i=new Set(a.map(c=>c.stored_name));for(let c of o)i.has(c.stored_name)||(a.push(c),i.add(c.stored_name));return s.files=a,a}function n(s,o,a){let i=t(s);if(!Number.isInteger(o)||o<0||o>=i.length)return {ok:false,reason:"index_out_of_range"};let c=i[o];return !c||!c.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==c.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:c}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function ZS(){return {async invoke(e,t){if(e.howToRun!=="local-node")return {dispatched:false,error:`createNodeSpawnInvocationAdapter: unsupported howToRun "${e.howToRun}"`};let r="";try{let o=e.whatToRun;r=Le(o);}catch{r="";}if(!r)return {dispatched:false,error:"createNodeSpawnInvocationAdapter: could not resolve executable path from whatToRun"};let n={...t},s=Buffer.from(JSON.stringify(n)).toString("base64");try{return spawn(process.execPath,[r,"--boardId",String(t.boardId??""),"--cardId",String(t.cardId??""),"--extraEncJson",s],{stdio:"ignore",windowsHide:!0}).unref(),{dispatched:!0}}catch(o){return {dispatched:false,error:o instanceof Error?o.message:String(o)}}},async describe(e){if(e.howToRun!=="local-node")return null;let t="";try{let r=e.whatToRun;t=Le(r);}catch{t="";}if(!t)return null;try{let r=spawnSync(process.execPath,[t,"describe"],{timeout:5e3,encoding:"utf-8",windowsHide:!0});return r.status!==0?null:JSON.parse(String(r.stdout).trim())}catch{return null}}}}var cy=".board.lock";function Bc(e,t){if(!e||!t)return false;let r=String(e).replace(/[\\/]+$/,"").split(/[\\/]+/).filter(Boolean);return r.length>0&&r[r.length-1]===t}function dy(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function ly(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function Gc(e){if(e)return e;let t=sa(import.meta.url),r=[t,Re(t,"..","cli","node"),Re(t,"..","..","cli","node")];for(let n of r)try{return Bn(n),n}catch{}throw new Error(`createFsBoardPlatformAdapter: could not resolve a public CLI directory from module dir ${t}`)}function fy(e,t,r){let{cliDir:n,opts:s}=dy(t,r),o=Gc(n),a=e.value,c={meta:"board-live-cards",howToRun:"local-node",whatToRun:(s?.suppressSpawn?"":Bn(o))?oe({kind:"yaml-flow-cli",value:"board-live-cards-cli.js"}):"",...s?.notifyChannel?{extra:{notifyChannel:s.notifyChannel}}:{}};return {kvStorage:u=>Ur(Re(a,`.${u}`)),blobStorage:u=>u?Ft(Re(a,u)):Ft(a),scratchStorage:()=>Gr(Re(a,".tmp")),scratchStorageForRef:u=>Gr(Ue(u).value),archiveFactory:()=>Kr(Re(a,"archive")),archiveFactoryForRef:u=>Kr(Ue(u).value),journalAdapter:()=>ba(a),lock:_a(Re(a,cy)),selfRef:c,async dispatchExecution(u,d){if(s?.suppressSpawn)return {dispatched:false};try{let l=d.source_def?.bindTo??Mn().slice(0,8),h=Gr(Re(a,".tmp")),y=h.create(JSON.stringify(d,null,2),`exec-in-${l}`,".json"),f=h.getUniqueKey(`exec-out-${l}`,".json"),p=h.getUniqueKey(`exec-err-${l}`,".txt"),v=oe(h.keyRef(y)),_=oe(h.keyRef(f)),g=oe(h.keyRef(p));return va(u,{subcommand:"run-source-fetch",inRef:v,outRef:_,errRef:g},o),{dispatched:!0}}catch(l){let h=l instanceof Error?l.message:String(l);try{let y=Kr(Re(a,"archive")),f=new Date().toISOString().replace(/[:.]/g,"-"),p=d.source_def?.bindTo??"unknown";y.blob("exec-failures").write(`${f}-${p}.json`,JSON.stringify({error:h,args:d,ref:u,at:new Date().toISOString()},null,2));}catch{}return {dispatched:false,error:h}}},resolveBlob(u){let d=ra(u.value)?Wn().read(u.value):Ft(a).read(u.value);if(d===null)throw new Error(`resolveBlob: blob not found: ::${u.kind}::${u.value}`);return d},hashFn:wa,genId:()=>na(`${Date.now()}-${Math.random()}`).slice(0,32),kvStorageForRef:u=>Ur(Ue(u).value),requestProcessAccumulated(){s?.suppressSpawn||ia(o,e,s?.notifyChannel);},publishBoardChangeNotifications(u){if(!s?.notifyChannel||u.length===0)return;let d=u.map(l=>({id:Mn(),ts:new Date().toISOString(),boardRef:oe(e),notification:l}));ua(s.notifyChannel,d,s.onWarn);},onWarn:s?.onWarn}}function ek(e,t,r){let{cliDir:n,opts:s}=ly(t,r),o=Gc(n),a=fy(e,o,s),i=Mr();return {...a,invokeExecutorSync(c,u,d,l){let{command:h,baseArgs:y}=Lr(c,o),f=c.extra?["--extra",Buffer.from(JSON.stringify(c.extra)).toString("base64")]:[];return i.executeSync(h,[...y,u,...d,...f],{timeout:l?.timeout??3e4,encoding:"utf-8",input:l?.input})},validateSchema(c){let u=Fo(c);return {ok:u.errors.length===0,errors:u.errors}},absoluteBlob:Wn()}}function tk(e,t={}){let r=t.chatsSubdir??"chats",n=t.kvSubdir??".kv",s=n?[n,"chat"]:["chat"],o=r&&!Bc(e,r)?Re(e,r):e,a=Ur(Re(e,...s));return Do(i=>{let u=`${String(i).replace(/[^a-zA-Z0-9_-]/g,"_")}.jsonl`,d=Re(o,u);return Yn(d)},a)}function rk(e,t={}){let r=t.filesSubdir??"files",n=r&&!Bc(e,r)?Re(e,r):e;return Jo(Ft(n))}function nk(e){try{let t=JSON.parse(Buffer.from(e,"base64url").toString());return typeof t.br=="string"?t.br:null}catch{return null}}
19
19
  export{yt as BOARD_GRAPH_KEY,jn as EMPTY_CONFIG,Pr as SNAPSHOT_SCHEMA_VERSION_V1,Lr as buildLocalBaseSpec,Jo as createArtifactsStore,Xh as createArtifactsStorePublic,Wh as createBoardLiveCardsNonCorePublic,Hh as createBoardLiveCardsPublic,ay as createCardFileMetadataStore,Pn as createCardStore,Yh as createCardStorePublic,Do as createChatStorage,Rd as createExecutionRefInvoker,oy as createFileArtifactsStore,tk as createFsBoardChatStorage,rk as createFsBoardFileArtifactsStore,ek as createFsBoardNonCorePlatformAdapter,fy as createFsBoardPlatformAdapter,yh as createInMemoryChatStorage,ZS as createNodeSpawnInvocationAdapter,nk as decodeBoardRefFromToken,Kn as evaluateArgsMassaging,Vh as executionRefFromScriptPath,ya as invokeExecutionRef,Un as invokeExecutionRefSync,Cd as invokeRefSync,Go as parseExecutionRef,Ue as parseRef,Le as resolveWhatToRunValue,fa as resolveYamlFlowCliPath,Bo as serializeExecutionRef,oe as serializeRef};//# sourceMappingURL=fs-board-adapter.js.map
20
20
  //# sourceMappingURL=fs-board-adapter.js.map
@@ -1,7 +1,63 @@
1
+ /**
2
+ * Step Machine Types
3
+ *
4
+ * All type definitions for the step-machine workflow engine.
5
+ * The step machine is a stateful sequential executor:
6
+ * currentState + stepResult → newState (via transitions)
7
+ */
8
+ interface StepFlowConfig {
9
+ id?: string;
10
+ settings: StepFlowSettings;
11
+ steps: Record<string, StepConfig>;
12
+ terminal_states: Record<string, TerminalStateConfig>;
13
+ }
14
+ interface StepFlowSettings {
15
+ start_step: string;
16
+ max_total_steps?: number;
17
+ timeout_ms?: number;
18
+ invoke_timeout_ms?: number;
19
+ }
20
+ interface StepConfig {
21
+ description?: string;
22
+ expects_data?: string[];
23
+ produces_data?: string[];
24
+ transitions: Record<string, string>;
25
+ failure_transitions?: Record<string, string>;
26
+ retry?: RetryConfig;
27
+ circuit_breaker?: CircuitBreakerConfig;
28
+ forEach?: ForEachConfig;
29
+ }
30
+ interface RetryConfig {
31
+ max_attempts: number;
32
+ delay_ms?: number;
33
+ backoff_multiplier?: number;
34
+ }
35
+ interface CircuitBreakerConfig {
36
+ max_iterations: number;
37
+ on_open: string;
38
+ }
39
+ interface ForEachConfig {
40
+ /** Data key containing the array to iterate over */
41
+ items: string;
42
+ /** Variable name for the current item in each iteration */
43
+ as: string;
44
+ /** Max concurrent iterations. @default 1 */
45
+ concurrency?: number;
46
+ /** Data key to collect results into. Defaults to `<items>_results` */
47
+ collectAs?: string;
48
+ }
49
+ interface TerminalStateConfig {
50
+ description?: string;
51
+ return_intent: string;
52
+ return_artifacts?: string | string[] | false;
53
+ expects_data?: string[];
54
+ }
55
+
1
56
  declare class CliExitError extends Error {
2
57
  readonly code: number;
3
58
  constructor(code: number, message?: string);
4
59
  }
5
60
  declare function cli(args: string[]): Promise<void>;
61
+ declare function resolveStepInvokeTimeoutMs(flow: Pick<StepFlowConfig, 'settings'>): number;
6
62
 
7
- export { CliExitError, cli };
63
+ export { CliExitError, cli, resolveStepInvokeTimeoutMs };