yaml-flow 8.4.12 → 8.4.13

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-05-22T21:54:20.113Z",
2
+ "generatedAt": "2026-05-22T22:17:23.607Z",
3
3
  "algorithm": "sha256",
4
4
  "files": {
5
5
  "browser/board-livecards-localstorage.js": {
@@ -7,8 +7,8 @@
7
7
  "bytes": 100818
8
8
  },
9
9
  "browser/live-cards.schema.json": {
10
- "sha256": "sha256-9CUv3YSTpgq3k0Dsi8bs7bNUlGoBA1SGWMCBSZcbzys=",
11
- "bytes": 17134
10
+ "sha256": "sha256-F5nfqDzZ5L3p0lLTMxGt4YtMa2sVzdNPh8sbQ8OiXHE=",
11
+ "bytes": 17305
12
12
  }
13
13
  }
14
14
  }
@@ -554,6 +554,10 @@
554
554
  "uploaded_at": {
555
555
  "type": "string",
556
556
  "format": "date-time"
557
+ },
558
+ "chat": {
559
+ "type": "boolean",
560
+ "description": "Whether this file entry is associated with a chat interaction"
557
561
  }
558
562
  },
559
563
  "additionalProperties": false
@@ -25,5 +25,5 @@ ${new Date().toISOString()}
25
25
  `).filter(Boolean).map(a=>JSON.parse(a)):[]}return{append(r){let a={id:Qe(),payload:r};return M.mkdirSync(Z.dirname(e),{recursive:!0}),M.appendFileSync(e,JSON.stringify(a)+`
26
26
  `,"utf-8"),a},readAll(){return t()},readAfter(r){let a=t();if(!r)return{entries:a,newCursor:a.length>0?a[a.length-1].id:null};let n=a.findIndex(o=>o.id===r),s=n===-1?a:a.slice(n+1);return{entries:s,newCursor:s.length>0?s[s.length-1].id:r}},clear(){M.existsSync(e)&&M.truncateSync(e,0)}}}function Lo(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(Lo).join(",")}]`;let t=e;return`{${Object.keys(t).sort().map(r=>`${JSON.stringify(r)}:${Lo(t[r])}`).join(",")}}`}function j0(e){return Gl("sha256").update(Lo(e)).digest("hex")}function O0(e){let t=Z.join(e,"board-journal.jsonl");return{readAllEntries(){if(!M.existsSync(t))return[];let r=M.readFileSync(t,"utf-8").trim();return r?r.split(`
27
27
  `).filter(Boolean).map(a=>JSON.parse(a)):[]},appendEntry(r){M.appendFileSync(t,JSON.stringify(r)+`
28
- `,"utf-8")},generateId(){return Qe()}}}function N0(e){return{tryAcquire(){try{if(!M.existsSync(e)){M.mkdirSync(Z.dirname(e),{recursive:!0});try{M.writeFileSync(e,"{}",{flag:"wx"})}catch{}}return(0,Bl.lockSync)(e,{retries:0})}catch{return null}}}}var T0={$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:!0,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:!1,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:!0,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:!0,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:!0,description:"file-upload: allow multiple files"},fileAttach:{type:"boolean",default:!1,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:!1},notes:{type:"boolean",default:!1},refresh:{type:"boolean",default:!0}}}}}},title:"LiveCard",description:"A unified card node. Behavior depends on which sections are present (source_defs, compute, view, etc.)",type:"object",required:["id"],additionalProperties:!1,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:!1}}},additionalProperties:!0},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"}}}},x0=rv(Wv()),I0=kn(import.meta.url),C0=I0("./jsonata-sync.cjs"),mn=null,Tl=/\b(card_data|requires|fetched_sources|computed_values|source_defs)\b/g,R0=/^\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\.|$)/;function q0(e){let t=new Set,r;for(Tl.lastIndex=0;(r=Tl.exec(e))!==null;)t.add(r[1]);return t}function cd(e){let t=R0.exec(e);return t?t[1]:null}function xl(e,t,r,a){try{C0(e)}catch(s){let o=s instanceof Error?s.message:String(s);a.push(`${t}: invalid JSONata expression (${o})`);return}let n=q0(e);for(let s of n)r.has(s)||a.push(`${t}: disallowed namespace "${s}" in expression`)}function Ko(e,t,r){if(Array.isArray(e)){e.forEach((n,s)=>{Ko(n,`${t}/${s}`,r)});return}if(typeof e=="string"){let n=cd(e);if(!n)return;new Set(["card_data","requires","computed_values"]).has(n)||r.push(`${t}: disallowed namespace "${n}" in view reference`);return}if(!e||typeof e!="object")return;let a=e;for(let[n,s]of Object.entries(a))Ko(s,`${t}/${n}`,r)}function A0(){if(mn)return mn;let e=new x0.default({allErrors:!0});return(0,Jl.default)(e),mn=e.compile(T0),mn}function D0(e){let t=A0(),r=t(e),a=(t.errors??[]).map(n=>`${n.instancePath||"/"}: ${n.message??"unknown error"}`);if(e&&typeof e=="object"&&!Array.isArray(e)){let n=e.source_defs;if(Array.isArray(n)){let s=new Set,o=new Set;n.forEach((u,i)=>{if(!u||typeof u!="object"||Array.isArray(u))return;let c=u;typeof c.bindTo=="string"&&c.bindTo&&(s.has(c.bindTo)&&a.push(`/source_defs/${i}/bindTo: bindTo "${c.bindTo}" must be unique across all source_defs`),s.add(c.bindTo)),typeof c.outputFile=="string"&&c.outputFile&&(o.has(c.outputFile)&&a.push(`/source_defs/${i}/outputFile: outputFile "${c.outputFile}" must be unique across all source_defs`),o.add(c.outputFile))})}}return!r||a.length>0?{ok:!1,errors:a}:{ok:!0,errors:[]}}function M0(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!0,errors:[]};let r=e,a=r.compute;Array.isArray(a)&&a.forEach((c,l)=>{if(!c||typeof c!="object"||Array.isArray(c))return;let d=c.expr;typeof d!="string"||d.trim().length===0||xl(d,`/compute/${l}/expr`,new Set(["card_data","requires","fetched_sources","computed_values"]),t)});let n=new Set(["card_data","requires","fetched_sources","computed_values"]),s=r.provides;Array.isArray(s)&&s.forEach((c,l)=>{if(!c||typeof c!="object"||Array.isArray(c))return;let d=c.ref;if(typeof d!="string"||d.trim().length===0)return;let b=cd(d);b===null?t.push(`/provides/${l}/ref: path "${d}" must start with a valid namespace (${[...n].join(", ")})`):n.has(b)||t.push(`/provides/${l}/ref: disallowed namespace "${b}" in path "${d}" (valid: ${[...n].join(", ")})`)});let o=r.view;o&&typeof o=="object"&&!Array.isArray(o)&&Ko(o,"/view",t);let u=new Set(["card_data","requires"]),i=r.source_defs;return Array.isArray(i)&&i.forEach((c,l)=>{if(!c||typeof c!="object"||Array.isArray(c))return;let d=c.projections;if(!(!d||typeof d!="object"||Array.isArray(d)))for(let[b,w]of Object.entries(d))typeof w!="string"||w.trim().length===0||xl(w,`/source_defs/${l}/projections/${b}`,u,t)}),{ok:t.length===0,errors:t}}function F0(e){let t=D0(e);if(!t.ok)return t;let r=M0(e);return r.ok?{ok:!0,errors:[]}:{ok:!1,errors:r.errors}}var Ir={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function wt(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function ma(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function V0(e){return e.tasks??{}}function Il(e){return e?e.status===Ir.FAILED||e.status===Ir.INACTIVATED:!1}function z0(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function U0(e){return e.maxExecutions}function H0(e,t){let r=new Set;for(let[a,n]of Object.entries(t))if(n.status===Ir.COMPLETED){let s=e.tasks[a];s&&wt(s).forEach(o=>r.add(o))}return Array.from(r)}function L0(e,t){let r={};return e.forEach(a=>{let n=t[a];n&&wt(n).forEach(s=>{r[s]||(r[s]=[]),r[s].push(a)})}),r}function K0(e,t,r){let a=e.tasks[t]??Nn(),n={};if(r){let o=r.tasks[t],u=ma(o);for(let i of u)for(let[c,l]of Object.entries(r.tasks))if(wt(l).includes(i)){let d=e.tasks[c];d?.lastDataHash&&(n[i]=d.lastDataHash);break}}let s={...a,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:n};return{...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function G0(e,t,r,a,n,s){let o=e.tasks[r]??Nn(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let i;a&&u.on&&u.on[a]?i=u.on[a]:i=wt(u);let c=o.startConsumedHashes?{...o.startConsumedHashes}:{...o.lastConsumedHashes};if(!o.startConsumedHashes){let b=u.requires??[];for(let w of b)for(let[m,v]of Object.entries(t.tasks))if(wt(v).includes(w)){let h=e.tasks[m];h?.lastDataHash&&(c[w]=h.lastDataHash);break}}let l={...o,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:o.executionCount+1,lastEpoch:o.executionCount+1,lastDataHash:n,data:s,lastConsumedHashes:c,error:void 0},d=[...new Set([...e.availableOutputs,...i])];return{...e,tasks:{...e.tasks,[r]:l},availableOutputs:d,lastUpdated:new Date().toISOString()}}function B0(e,t,r,a){let n=e.tasks[r]??Nn(),s=t.tasks[r];if(s?.retry){let i=n.retryCount+1;if(i<=s.retry.max_attempts){let c={...n,status:"not-started",retryCount:i,lastUpdated:new Date().toISOString(),error:a};return{...e,tasks:{...e.tasks,[r]:c},lastUpdated:new Date().toISOString()}}}let o={...n,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:a,executionCount:n.executionCount+1},u=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&o.executionCount>=s.circuit_breaker.max_executions){let i=s.circuit_breaker.on_break;u=[...new Set([...u,...i])]}return{...e,tasks:{...e.tasks,[r]:o},availableOutputs:u,lastUpdated:new Date().toISOString()}}function J0(e,t,r,a){let n=e.tasks[t]??Nn(),s={...n,progress:typeof a=="number"?a:n.progress,messages:[...n.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:n.status}]:[]],lastUpdated:new Date().toISOString()};return{...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function W0(e,t){let r=e.tasks[t];if(!r)return e;let a={...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]:a},lastUpdated:new Date().toISOString()}}function Nn(){return{status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function ld(e,t){let r=`live-${Date.now()}`,a={};for(let s of Object.keys(e.tasks))a[s]=dd();let n={status:"running",tasks:a,availableOutputs:[],stuckDetection:{is_stuck:!1,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:n}}function Y0(e,t){let{config:r,state:a}=e;if("executionId"in t&&t.executionId&&t.executionId!==a.executionId)return e;switch(t.type){case"task-started":return{config:r,state:K0(a,t.taskName,r)};case"task-completed":return{config:r,state:G0(a,r,t.taskName,t.result,t.dataHash,t.data)};case"task-failed":return{config:r,state:B0(a,r,t.taskName,t.error)};case"task-progress":return{config:r,state:J0(a,t.taskName,t.message,t.progress)};case"task-restart":return{config:r,state:W0(a,t.taskName)};case"inject-tokens":return{config:r,state:{...a,availableOutputs:[...new Set([...a.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case"agent-action":return{config:r,state:n_(a,t.action)};case"task-upsert":return Q0(e,t.taskName,t.taskConfig);case"task-removal":return X0(e,t.taskName);case"node-requires-add":return e_(e,t.nodeName,t.tokens);case"node-requires-remove":return t_(e,t.nodeName,t.tokens);case"node-provides-add":return r_(e,t.nodeName,t.tokens);case"node-provides-remove":return a_(e,t.nodeName,t.tokens);default:return e}}function Z0(e,t){return t.reduce((r,a)=>Y0(r,a),e)}function Q0(e,t,r){let a=!!e.config.tasks[t];return{config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:a?e.state.tasks[t]:dd()},lastUpdated:new Date().toISOString()}}}function X0(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...a}=e.config.tasks,{[t]:n,...s}=e.state.tasks;return{config:{...e.config,tasks:a},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function e_(e,t,r){let a=e.config.tasks[t];if(!a)return e;let n=ma(a),s=r.filter(o=>!n.includes(o));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...a,requires:[...n,...s]}}},state:e.state}}function t_(e,t,r){let a=e.config.tasks[t];if(!a)return e;let n=ma(a),s=n.filter(o=>!r.includes(o));return s.length===n.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...a,requires:s}}},state:e.state}}function r_(e,t,r){let a=e.config.tasks[t];if(!a)return e;let n=wt(a),s=r.filter(o=>!n.includes(o));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...a,provides:[...n,...s]}}},state:e.state}}function a_(e,t,r){let a=e.config.tasks[t];if(!a)return e;let n=wt(a),s=n.filter(o=>!r.includes(o));return s.length===n.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...a,provides:s}}},state:e.state}}function Go(e){return{version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Vo(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,a=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(!a.tasks||typeof a.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(a.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return{config:r,state:a}}function dd(){return{status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function n_(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 Bo(e){let{config:t,state:r}=e,a=V0(t);if(Object.keys(a).length===0)return{eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let n=s_(a),s=H0(t,r.tasks),o=new Set([...s,...r.availableOutputs]),u=[],i=[],c=[],l=[];for(let[b,w]of Object.entries(a)){let m=r.tasks[b],v=z0(w,t.settings),h=v!=="once";if(m?.status===Ir.RUNNING||Il(m))continue;let f=U0(w);if(f!==void 0&&m&&m.executionCount>=f||w.circuit_breaker&&m&&m.executionCount>=w.circuit_breaker.max_executions||!h&&m?.status===Ir.COMPLETED)continue;if(h&&m?.status===Ir.COMPLETED){let y=ma(w),p=!1;switch(v){case"data-changed":{y.length>0&&y.some(P=>{for(let[j,x]of Object.entries(a))if(wt(x).includes(P)){let I=r.tasks[j];if(!I)continue;let q=m.lastConsumedHashes?.[P];return I.lastDataHash==null?I.executionCount>m.lastEpoch:I.lastDataHash!==q}return!1})||(p=!0);break}case"epoch-changed":{y.length>0&&y.some(P=>{for(let[j,x]of Object.entries(a))if(wt(x).includes(P)){let I=r.tasks[j];if(I&&I.executionCount>m.lastEpoch)return!0}return!1})||(p=!0);break}case"time-based":{let P=w.refreshInterval??0;if(P<=0){p=!0;break}let j=m.completedAt;if(!j){p=!0;break}(Date.now()-Date.parse(j))/1e3<P&&(p=!0);break}case"manual":p=!0;break}if(p)continue}let _=ma(w);if(_.length===0){u.push(b);continue}let g=[],E=[],$=[];for(let y of _){if(o.has(y))continue;let p=n[y]||[];p.length===0?g.push(y):p.every(P=>Il(r.tasks[P]))?$.push({token:y,failedProducer:p[0]}):E.push(y)}g.length>0?c.push({taskName:b,missingTokens:g}):$.length>0?l.push({taskName:b,failedTokens:$.map(y=>y.token),failedProducers:[...new Set($.map(y=>y.failedProducer))]}):E.length>0?i.push({taskName:b,waitingOn:E}):u.push(b)}let d={};if(u.length>1){let b=L0(u,a);for(let[w,m]of Object.entries(b))m.length>1&&(d[w]=m)}return{eligible:u,pending:i,unresolved:c,blocked:l,conflicts:d}}function s_(e){let t={};for(let[r,a]of Object.entries(e)){for(let n of wt(a))t[n]||(t[n]=[]),t[n].push(r);if(a.on)for(let n of Object.values(a.on))for(let s of n)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(a.on_failure)for(let n of a.on_failure)t[n]||(t[n]=[]),t[n].includes(r)||t[n].push(r)}return t}var Cl=class{buffer=[];append(e){this.buffer.push(e)}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function zo(e){let t=Jo(e);return o_(t)}function Jo(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return"["+e.map(Jo).join(",")+"]";let t=e;return"{"+Object.keys(t).sort().map(r=>JSON.stringify(r)+":"+Jo(t[r])).join(",")+"}"}function o_(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,a=0xffffffffffffffffn;for(let n=0;n<e.length;n++)t^=BigInt(e.charCodeAt(n)),t=t*r&a;return t.toString(16).padStart(16,"0")}function i_(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 a of t)r+=String.fromCharCode(a);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function u_(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),a=atob(r),n=new Uint8Array(a.length);for(let s=0;s<a.length;s++)n[s]=a.charCodeAt(s);return new TextDecoder().decode(n)}throw new Error("No base64 decoder available in this runtime")}function Rl(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return i_(t)}function c_(e){try{let t=JSON.parse(u_(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function l_(e,t,r){let{handlers:a,onDrain:n}=t,s=new Cl,o="state"in e&&"config"in e?e:ld(e),u=!1,i=new Set,c=new Map(Object.entries(a)),l=new Cl,d=!1,b=!1;function w(){if(!u){if(d){b=!0;return}d=!0;try{do b=!1,m();while(b)}finally{d=!1}}}function m(){let _=l.drain(),g=s.drain(),E=[..._,...g];E.length>0&&(o=Z0(o,E));let $=Bo(o);E.length>0&&n?.(E,o,$);for(let y of $.eligible)f(y);for(let y of E)if(y.type==="task-progress"){let{taskName:p,update:P}=y;if(!o.config.tasks[p])continue;let j=o.state.tasks[p];if(!j||j.status!=="running")continue;let x=Rl(p),I=h(p,x,P).catch(q=>{u||(l.append({type:"task-failed",taskName:p,error:q.message??String(q),timestamp:new Date().toISOString()}),w())}).finally(()=>{i.delete(I)});i.add(I)}}function v(_){let g=o.config.tasks[_].requires??[],E=new Map;for(let[y,p]of Object.entries(o.config.tasks))for(let P of p.provides??[])E.set(P,y);let $={};for(let y of g){let p=E.get(y);p?$[y]=o.state.tasks[p]?.data:$[y]=void 0}return $}async function h(_,g,E){let $=o.config.tasks[_],y=$.taskHandlers??[],p=v(_);for(let P of y){let j=c.get(P);if(!j)throw new Error(`Handler '${P}' not found in registry (task '${_}')`);let x={nodeId:_,state:p,taskState:o.state.tasks[_],config:$,callbackToken:g,update:E};if(await j(x)==="task-initiate-failure")throw new Error(`Handler '${P}' returned task-initiate-failure (task '${_}')`)}}function f(_){let g=o.config.tasks[_]?.taskHandlers;if(!g||g.length===0)return;l.append({type:"task-started",taskName:_,timestamp:new Date().toISOString()}),w();let E=Rl(_),$=h(_,E).catch(y=>{u||(l.append({type:"task-failed",taskName:_,error:y.message??String(y),timestamp:new Date().toISOString()}),w())}).finally(()=>{i.delete($)});i.add($)}return{push(_){u||(_.type==="task-completed"&&_.data&&!_.dataHash&&(_={..._,dataHash:zo(_.data)}),s.append(_),w())},pushAll(_){if(!u){for(let g of _)g.type==="task-completed"&&g.data&&!g.dataHash?s.append({...g,dataHash:zo(g.data)}):s.append(g);w()}},resolveCallback(_,g,E){if(u)return;let $=c_(_);if(!$)return;let{taskName:y}=$;if(o.config.tasks[y]){if(E&&E.length>0)s.append({type:"task-failed",taskName:y,error:E.join("; "),timestamp:new Date().toISOString()});else{let p=g&&Object.keys(g).length>0?zo(g):void 0;s.append({type:"task-completed",taskName:y,data:g,dataHash:p,timestamp:new Date().toISOString()})}w()}},addNode(_,g){u||(s.append({type:"task-upsert",taskName:_,taskConfig:g,timestamp:new Date().toISOString()}),w())},removeNode(_){u||(s.append({type:"task-removal",taskName:_,timestamp:new Date().toISOString()}),w())},addRequires(_,g){u||(s.append({type:"node-requires-add",nodeName:_,tokens:g,timestamp:new Date().toISOString()}),w())},removeRequires(_,g){u||(s.append({type:"node-requires-remove",nodeName:_,tokens:g,timestamp:new Date().toISOString()}),w())},addProvides(_,g){u||(s.append({type:"node-provides-add",nodeName:_,tokens:g,timestamp:new Date().toISOString()}),w())},removeProvides(_,g){u||(s.append({type:"node-provides-remove",nodeName:_,tokens:g,timestamp:new Date().toISOString()}),w())},registerHandler(_,g){c.set(_,g)},unregisterHandler(_){c.delete(_)},retrigger(_){u||o.config.tasks[_]&&(s.append({type:"task-restart",taskName:_,timestamp:new Date().toISOString()}),w())},retriggerAll(_){if(!u){for(let g of _)o.config.tasks[g]&&s.append({type:"task-restart",taskName:g,timestamp:new Date().toISOString()});w()}},snapshot(){return Go(o)},getState(){return o},getSchedule(){return Bo(o)},async waitForHandlers(){i.size>0&&await Promise.allSettled([...i])},async dispose(_){_?.wait&&i.size>0&&await Promise.allSettled([...i]),u=!0}}}var d_=kn(import.meta.url),Tn=d_("./jsonata-sync.cjs"),fd=Tn;function ql(e,t){if(!t||!e)return;let r=t.split("."),a=e;for(let n=0;n<r.length;n++){if(a==null)return;a=a[r[n]]}return a}function pd(e,t,r){let a=t.split("."),n=e;for(let s=0;s<a.length-1;s++)(n[a[s]]==null||typeof n[a[s]]!="object")&&(n[a[s]]={}),n=n[a[s]];n[a[a.length-1]]=r}async function f_(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??{},a={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 n of e.compute)try{let s=await Tn(n.expr).evaluate(a);pd(e.computed_values,n.bindTo,s),a.computed_values=e.computed_values}catch{}return e}function p_(e,t){if(!e?.compute?.length)return{ok:!0,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},a={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},n=[];for(let s of e.compute)try{let o=fd(s.expr).evaluate(a);pd(e.computed_values,s.bindTo,o),a.computed_values=e.computed_values}catch(o){let u=o instanceof Error?o.message:String(o);n.push({bindTo:s.bindTo,error:u})}return n.length>0?{ok:!0,node:e,errors:n}:{ok:!0,node:e}}async function h_(e,t,r){let a={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Tn(e).evaluate(a)}function m_(e,t){return t.startsWith("fetched_sources.")?ql(e._sourcesData??{},t.slice(16)):ql(e,t)}var Al=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),y_=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function g_(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,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 a of Object.keys(r))y_.has(a)||t.push(`Unknown top-level key: "${a}"`);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 a=r.meta;a.title!=null&&typeof a.title!="string"&&t.push("meta.title: must be a string"),a.tags!=null&&!Array.isArray(a.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((a,n)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`provides[${n}]: must be an object with bindTo and ref`);else{let s=a;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${n}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${n}]: 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((a,n)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`compute[${n}]: must be a compute step object`);else{let s=a;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${n}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${n}]: 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 a=new Set,n=new Set;r.source_defs.forEach((s,o)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${o}]: must be an object`);else{let u=s;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${o}]: missing required "bindTo" property`):(a.has(u.bindTo)&&t.push(`source_defs[${o}]: bindTo "${u.bindTo}" is not unique across source_defs`),a.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${o}]: missing required "outputFile" property`):(n.has(u.outputFile)&&t.push(`source_defs[${o}]: outputFile "${u.outputFile}" is not unique across source_defs`),n.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${o}]: 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 a=r.view;!Array.isArray(a.elements)||a.elements.length===0?t.push("view.elements: required, must be a non-empty array"):a.elements.forEach((n,s)=>{if(!n||typeof n!="object"){t.push(`view.elements[${s}]: must be an object`);return}!n.kind||typeof n.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):Al.has(n.kind)||t.push(`view.elements[${s}].kind: unknown kind "${n.kind}". Valid: ${[...Al].join(", ")}`),n.data!=null&&(typeof n.data!="object"||Array.isArray(n.data))&&t.push(`view.elements[${s}].data: must be an object`)}),a.layout!=null&&(typeof a.layout!="object"||Array.isArray(a.layout))&&t.push("view.layout: must be an object"),a.features!=null&&(typeof a.features!="object"||Array.isArray(a.features))&&t.push("view.features: must be an object")}return{ok:t.length===0,errors:t}}async function v_(e,t){if(!e||e.length===0)return[];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async a=>{let n={};if(a.projections&&typeof a.projections=="object"&&!Array.isArray(a.projections)){for(let[s,o]of Object.entries(a.projections))if(typeof o=="string"&&o.trim().length>0)try{n[s]=await Tn(o).evaluate(r)}catch{n[s]=void 0}}return{...a,_projections:n}}))}function __(e,t){if(!e||e.length===0)return[];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(a=>{let n={};if(a.projections&&typeof a.projections=="object"&&!Array.isArray(a.projections)){for(let[s,o]of Object.entries(a.projections))if(typeof o=="string"&&o.trim().length>0)try{n[s]=fd(o).evaluate(r)}catch{n[s]=void 0}}return{...a,_projections:n}})}var Cr={run:f_,runSync:p_,eval:h_,resolve:m_,validate:g_,enrichSources:v_,enrichSourcesSync:__};function $_(e){return JSON.stringify(e)}function w_(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 hd(e,t){function r(){return e.readIndex()??{}}function a(n,s,o){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return o&&typeof o=="object"&&!Array.isArray(o)?o:{value:o};let i={...n},c=i;for(let l=0;l<u.length-1;l++){let d=u[l],b=c[d],w=b&&typeof b=="object"&&!Array.isArray(b)?{...b}:{};c[d]=w,c=w}return c[u[u.length-1]]=o,i}return{readCard(n){let s=r()[n];return!s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(n){return r()[n]?.key??null},readAllCards(){let n=[];for(let[s,o]of Object.entries(r())){if(!e.cardExists(o.key))continue;let u=e.readCard(o.key);u?n.push(u):t?.(`[card-store] could not read card "${s}" at key "${o.key}"`)}return n},readChecksumIndex(){let n={};for(let[s,o]of Object.entries(r()))n[s]=o.checksum;return n},changedSince(n){let s=r(),o=[];for(let[u,i]of Object.entries(s))n[u]!==i.checksum&&o.push(u);for(let u of Object.keys(n))s[u]||o.push(u);return o},validateUpsert(n,s){let o=r(),u=o[n],i=Object.entries(o).find(([,c])=>c.key===s);return u&&u.key!==s?{ok:!1,error:`Card id "${n}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:i&&i[0]!==n?{ok:!1,error:`Key "${s}" is already mapped to card id "${i[0]}", cannot remap to "${n}"`}:{ok:!0}},writeCard(n,s,o){let u=r(),i=o??u[n]?.key??e.defaultCardKey(n),c=e.writeCard(i,s);u[n]={key:i,checksum:c,updatedAt:new Date().toISOString()},e.writeIndex(u)},patchCard(n,s,o){let u=r(),i=u[n];if(!i||!e.cardExists(i.key))throw new Error(`card "${n}" not found`);let c=e.readCard(i.key);if(!c||typeof c!="object"||Array.isArray(c))throw new Error(`card "${n}" is not patchable`);let l=a(c,s,o),d=e.writeCard(i.key,l);u[n]={key:i.key,checksum:d,updatedAt:new Date().toISOString()},e.writeIndex(u)},removeCard(n){let s=r(),o=s[n];o&&(e.removeCard(o.key),delete s[n],e.writeIndex(s))},readIndex(){return r()}}}function Dl(e,t){return{readSourceData(r,a){let n=e.read(`${r}/${a}`);if(n==null)return null;let s=n.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,a,n,s){let o=t(n);e.write(`${r}/.staged/${s}/${a}`,o)},commitSourceData(r,a,n){let s=`${r}/.staged/${n}/${a}`,o=e.read(s);return o==null?!1:(e.write(`${r}/${a}`,o),e.remove(s),!0)},hasSource(r,a){return e.exists(`${r}/${a}`)}}}function b_(e){function t(r){let a=e.readAllEntries();if(!r)return a;let n=a.findIndex(s=>s.id===r);return n===-1?a:a.slice(n+1)}return{readEntriesAfterCursor(r){let a=t(r);return a.length===0?{events:[],newCursor:r}:{events:a.map(n=>n.event),newCursor:a[a.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r})}}}function S_(e,t){return{appendEntries(r,a){if(!r||a.length===0)return;let n=e.read(r)??[];e.write(r,[...n,...a])},dispatchEntriesForJournalId(r,a){if(!r)return;let n=e.read(r);if(!(!n||n.length===0)){for(let s of n)try{a(s)}catch(o){let u=o instanceof Error?o.message:String(o);try{t(s,u)}catch{}}e.delete(r)}}}}var md="v1",ya="board/graph",yd="board/lastJournalProcessedId";function Ml(e){return`cards/${e}/runtime`}function k_(e){return{readRuntime(t){return e.read(Ml(t))??{_sources:{}}},writeRuntime(t,r){e.write(Ml(t),r)}}}function E_(e,t){let r={...e};for(let a of t.deleteKeys)delete r[a];return{...r,...t.shallowMerge}}function P_(e){return{readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==md)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let a=e.readValues(t);if(a.version!==r.expectedVersion)return{ok:!1,reason:"version-mismatch",currentVersion:a.version};let n=E_(a.values,r);return{ok:!0,newVersion:e.writeValues(t,n,r.deleteKeys)}}}}function gd(e){function t(r){let a=e.read(r);return a==null?null:typeof a=="string"?a:JSON.stringify(a)}return{readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return w_(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",$_(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 j_(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 a=r.match(/^cards\/([^/]+)\/computed_values$/);a&&(t[a[1]]=e.read(r))}return t},writeDataObjects(t){for(let[r,a]of Object.entries(t))r&&e.write(`data-objects/${r}`,a)},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 Fl(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function O_(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:!1}function Vl(e,t){return e?.lastRequestedToken?O_(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function N_(e,t){return{...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function zl(e,t){return{...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function Uo(e,t){let r=t.state.tasks,a=t.config.tasks,n=Object.keys(r),s=Bo(t),o={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let m of s.pending)u.set(m.taskName,m.waitingOn);for(let m of s.unresolved)u.set(m.taskName,m.missingTokens);for(let m of s.blocked)u.set(m.taskName,m.failedTokens);let i=new Map;for(let[m,v]of Object.entries(a))for(let h of v.requires??[]){let f=i.get(h)??[];f.push(m),i.set(h,f)}let c=n.sort().map(m=>{let v=r[m],h=a[m]??{requires:[],provides:[]};v.status==="completed"?o.completed+=1:v.status==="failed"?o.failed+=1:v.status==="in-progress"&&(o.in_progress+=1);let f=h.requires??[],_=h.provides??[],g=Object.keys(v.data??{}).sort(),E=f.filter(x=>t.state.availableOutputs.includes(x)),$=f.filter(x=>!t.state.availableOutputs.includes(x)),y=u.get(m)??$,p=new Set;for(let x of _)for(let I of i.get(x)??[])I!==m&&p.add(I);let P=v.failedAt,j=v.error?{message:v.error,code:"TASK_FAILED",at:P,source:"task-runtime"}:void 0;return{name:m,status:v.status,error:j,requires:f,requires_satisfied:E,requires_missing:$,provides_declared:_,provides_runtime:g,blocked_by:y,unblocks:Array.from(p).sort(),runtime:{attempt_count:v.executionCount??0,restart_count:v.retryCount??0,in_progress_since:v.status==="in-progress"?v.startedAt??null:null,last_transition_at:v.lastUpdated??null,last_completed_at:v.completedAt??null,last_restarted_at:v.startedAt??null,status_age_ms:v.lastUpdated?0:null}}});o.pending=s.pending.length,o.blocked=s.blocked.length,o.unresolved=s.unresolved.length;let l=c.map(m=>({name:m.name,fanOut:m.unblocks.length})).sort((m,v)=>v.fanOut-m.fanOut||m.name.localeCompare(v.name)),d=l.length>0?l[0]:{name:null,fanOut:0},b=new Set;for(let m of Object.values(a))for(let v of m.requires??[])b.add(v);let w=0;for(let[m,v]of Object.entries(a)){let h=(v.requires??[]).length===0,f=(v.provides??[]).some(_=>(i.get(_)??[]).some(g=>g!==m));h&&!f&&(w+=1)}return{schema_version:"v1",meta:{board:{path:e}},summary:{card_count:n.length,completed:o.completed,eligible:s.eligible.length,pending:o.pending,blocked:o.blocked,unresolved:o.unresolved,failed:o.failed,in_progress:o.in_progress,orphan_cards:w,topology:{edge_count:Array.from(b).length,max_fan_out_card:d.name,max_fan_out:d.fanOut}},cards:c}}function T_(){return new Date().toISOString()}function x_(e,t,r,a,n,s,o){return async u=>{let i=[],c=r.cardStore.readCard(u.nodeId);if(!c)return"task-initiate-failure";let l=c.id,d=c.card_data??{},b=c.source_defs??[],w=b.filter(F=>F.optionalForCompletionGating!==!0),m=r.cardRuntimeStore.readRuntime(l),v=!1,h=()=>{v&&(r.cardRuntimeStore.writeRuntime(l,m),v=!1)},f=F=>Fl(m._sources[F]),_=(F,U)=>{m._sources[F]=Fl(U),v=!0},g=u.taskState?.executionCount??0;if(m._lastExecutionCount!==g&&(m._sources={},m._lastExecutionCount=g,v=!0),u.update){let F=u.update,U=F.outputFile;if(U){let G=f(U);if(F.failure){let re=F.rqt??G.lastRequestedToken??G.queueRequestedToken;re&&_(U,zl(G,re))}else{let re=F.rqt;if(!G.lastCompletedToken||re>G.lastCompletedToken){let B=typeof F.deliveryToken=="string"?F.deliveryToken:void 0,T=!1;B&&(T=r.fetchedSourcesStore.commitSourceData(l,U,B)),T?_(U,N_(G,re)):_(U,zl(G,re))}}h()}}let E={};for(let F of b)if(F.outputFile){let U=r.fetchedSourcesStore.readSourceData(l,F.outputFile);U!==null&&(E[F.bindTo]=U)}let $={};for(let[F,U]of Object.entries(u.state??{}))if(U!==null&&typeof U=="object"&&!Array.isArray(U)){let G=U[F];$[F]=G!==void 0?G:U}else $[F]=U;let y={id:l,card_data:{...d},requires:$,source_defs:b,compute:c.compute};y._sourcesData=E,c.compute&&Cr.runSync(y,{sourcesData:E}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(l,y.computed_values??{});let p={...c},P=Cr.enrichSourcesSync(Array.isArray(c.source_defs)?c.source_defs:void 0,{card_data:c.card_data,requires:$}),j=e.value;p.source_defs=Array.isArray(P)?P.map(F=>({...F,boardDir:typeof F.boardDir=="string"&&F.boardDir?F.boardDir:j})):P;let x=T_(),I=u.update?void 0:x,q=w.filter(F=>{let U=F.outputFile;if(typeof U!="string"||!U)return!0;let G=f(U);I&&(G={...G,queueRequestedToken:I},_(U,G));let re=G.queueRequestedToken??G.lastRequestedToken??x,B=Vl(G,re);return B==="in-flight"?!1:B==="dispatch"});if(h(),q.length>0){let F=!1,U=x;for(let G of q){let re=G.outputFile;if(typeof re!="string"||!re)continue;let B=f(re),T=B.queueRequestedToken??x;_(re,{...B,lastRequestedToken:T}),U=T,F=!0}return F&&h(),F&&(i.push({taskKind:"source-fetch",payload:{boardRef:He(e),enrichedCard:p,callbackToken:u.callbackToken,rqt:U}}),r.executionRequestStore.appendEntries(t,i)),"task-initiated"}if(w.some(F=>{let U=F.outputFile;if(typeof U!="string"||!U)return!1;let G=f(U),re=G.queueRequestedToken??G.lastRequestedToken??x;return Vl(G,re)==="in-flight"}))return"task-initiated";let V=c.provides??[],H={};for(let{bindTo:F,ref:U}of V)H[F]=Cr.resolve(y,U);return(o??r.outputStore.writeDataObjects.bind(r.outputStore))(H),b.filter(F=>{if(F.optionalForCompletionGating!==!0)return!1;let U=f(F.outputFile);return!U.lastRequestedToken||!U.lastCompletedToken?!0:U.lastCompletedToken<=U.lastRequestedToken}).length>0&&i.push({taskKind:"source-fetch",payload:{boardRef:He(e),enrichedCard:p,callbackToken:u.callbackToken,rqt:x}}),a(u.nodeId,H),i.length>0&&r.executionRequestStore.appendEntries(t,i),"task-initiated"}}var I_={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function C_(e){return{[ya]:e.graph,[yd]:e.lastDrainedJournalId}}function R_(e){let t=e[ya],r=e[yd];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ya}`);return{graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function q_(e){let t=e.requires,r=e.provides?.map(a=>a.bindTo)??[];return{requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function ve(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ae(e){return{status:"fail",error:e}}function _e(e){return{status:"error",error:e instanceof Error?e.message:String(e)}}function A_(e){let t=new TextEncoder().encode(e),r=Array.from(t,a=>String.fromCharCode(a)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function vd(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),a=atob(r),n=Uint8Array.from(a,s=>s.charCodeAt(0));return new TextDecoder().decode(n)}function yn(e){try{let t=JSON.parse(vd(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function D_(e){return A_(JSON.stringify(e))}function Ul(e){try{let t=JSON.parse(vd(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Ue(){return new Date().toISOString()}function Ho(e,t){let r=t.onWarn??(()=>{}),a=He(e);function n(S){if(S.length!==0)try{let k=t.publishBoardChangeNotifications?.(S);k&&typeof k.catch=="function"&&k.catch(N=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${N instanceof Error?N.message:String(N)}`))}catch(k){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${k instanceof Error?k.message:String(k)}`)}}function s(){let S=u().readCardStoreRef();if(!S)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let k=t.kvStorageForRef(S);return{readIndex(){return k.read("_index")},writeIndex(N){k.write("_index",N)},readCard(N){return k.read(N)},writeCard(N,A){return k.write(N,A),t.hashFn(A)},removeCard(N){k.delete(N)},cardExists(N){return k.read(N)!==null},defaultCardKey(N){return N}}}let o={readValues(S){let k=t.kvStorage("state-snapshot"),N=k.listKeys().sort();if(N.length===0)return{version:null,values:{}};let A={};for(let K of N)A[K]=k.read(K);return{version:t.hashFn(A),values:A}},writeValues(S,k,N){let A=t.kvStorage("state-snapshot");for(let K of N)A.delete(K);for(let[K,W]of Object.entries(k))A.write(K,W);return t.hashFn(k)}},u=()=>gd(t.kvStorage("config")),i=()=>P_(o),c=()=>b_(t.journalAdapter()),l=()=>hd(s(),r),d=()=>{let S=u().readOutputsStoreRef();if(!S)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return j_(t.kvStorageForRef(S))},b=()=>{let S=u().readArchiveStoreRef();return S?t.archiveFactoryForRef(S):t.archiveFactory()};function w(){return!!i().readSnapshot(e.value).values[ya]}function m(){let S=i().readSnapshot(e.value);if(!S.values[ya])throw new Error(`Board not initialized at ${e.value}`);return R_(S.values)}function v(S,k){let N=i().commitSnapshot(e.value,{schemaVersion:md,expectedVersion:k,commitId:t.genId(),committedAt:Ue(),deleteKeys:[],shallowMerge:C_(S)});if(!N.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${k??"null"} current=${N.currentVersion??"null"}`)}function h(S){c().appendEvent(S)}async function f(){let S=(X,se)=>{let je=X.payload,Gt=(je?.enrichedCard??{}).id??je?.cardId??"unknown";h({type:"task-failed",taskName:Gt,error:se,timestamp:Ue()})},k=S_(t.kvStorage("execution-requests"),S),N=k_(t.kvStorage("card-runtime")),A=Dl(t.blobStorage("sources"),X=>t.resolveBlob(X)),K=new Map,W={readRuntime(X){return K.get(X)??N.readRuntime(X)},writeRuntime(X,se){K.set(X,se)}},Y=[],fe=new Map,xe={readSourceData(X,se){let je=`${X}/${se}`;return fe.has(je)?fe.get(je):A.readSourceData(X,se)},ingestSourceDataStaged(X,se,je,Gt){A.ingestSourceDataStaged(X,se,je,Gt)},commitSourceData(X,se,je){let Gt=`${X}/.staged/${je}/${se}`,xt=t.blobStorage("sources").read(Gt);if(xt==null)return!1;let va=`${X}/${se}`,cr=xt.trim();try{fe.set(va,JSON.parse(cr))}catch{fe.set(va,cr)}return Y.push({cardId:X,outputFile:se,deliveryToken:je}),!0},hasSource(X,se){let je=`${X}/${se}`;return fe.has(je)?!0:A.hasSource(X,se)}},O={cardStore:l(),cardRuntimeStore:W,fetchedSourcesStore:xe,outputStore:d(),executionRequestStore:k},C=m(),D=Vo(C.graph),{events:Q,newCursor:te}=c().readEntriesAfterCursor(C.lastDrainedJournalId),ne=[],Te=[],Ce=[],Ze=new Map,Me=(X,se)=>{ne.push({type:"task-completed",taskName:X,data:se,timestamp:Ue()});try{b().stream("exec-history").append({taskName:X,status:"completed",completedAt:Ue()})}catch{}},Ne=(X,se)=>{h({type:"task-failed",taskName:X,error:se,timestamp:Ue()});try{b().stream("exec-history").append({taskName:X,status:"failed",error:se,completedAt:Ue()})}catch{}},st=l_(D,{handlers:{"card-handler":x_(e,te,O,Me,Ne,(X,se)=>{Te.push({cardId:X,values:se})},X=>{Ce.push(X)})}});for(ne=Q;ne.length>0;){let X=ne;ne=[];for(let se of X)if(se.type==="task-restart"){let je=O.cardStore.readCard(se.taskName);je&&Ze.set(se.taskName,je)}st.pushAll(X),await st.waitForHandlers()}let Le=st.getState();await st.dispose({wait:!0});let Rr=i().readSnapshot(e.value).version;v({lastDrainedJournalId:te,graph:Go(Le)},Rr);for(let{cardId:X,values:se}of Te)O.outputStore.writeComputedValues(X,se);for(let X of Ce)O.outputStore.writeDataObjects(X);for(let[X,se]of K)N.writeRuntime(X,se);for(let{cardId:X,outputFile:se,deliveryToken:je}of Y)A.commitSourceData(X,se,je);let ft;try{ft=Uo(a,Le),O.outputStore.writeStatusSnapshot(ft)}catch(X){r(`[board-live-cards-public] status publish failed: ${X instanceof Error?X.message:String(X)}`)}let bt=[];for(let{cardId:X,values:se}of Te)bt.push({kind:"computed_values",cardId:X,values:se});for(let X of Ce)for(let[se,je]of Object.entries(X))se&&bt.push({kind:"data_object",key:se,payload:je});for(let[X,se]of Ze)bt.push({kind:"card_refreshed",cardId:X,card:se});ft!==void 0&&bt.push({kind:"status",status:ft}),n(bt);let ga=u().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:He({kind:"built-in",value:"source-cli-task-executor"})};k.dispatchEntriesForJournalId(te,X=>{if(X.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${X.taskKind}" \u2014 skipping`);return}let se=X.payload,je=se.enrichedCard?.id??"unknown",Gt=se.enrichedCard?.source_defs??[];for(let xt of Gt){if(!xt.outputFile){r(`[dispatch] source "${xt.bindTo}" has no outputFile \u2014 skipping`);continue}let va=D_({cbk:se.callbackToken,rg:e.value,br:He(e),cid:je,b:xt.bindTo,d:xt.outputFile,cs:void 0,rqt:se.rqt});t.dispatchExecution(ga,{source_def:xt,base_ref:He(e),callback:{token:va,via:t.selfRef}}).catch(cr=>Ne(je,cr instanceof Error?cr.message:String(cr)))}})}async function _(){try{let S=()=>{let N=m(),{events:A}=c().readEntriesAfterCursor(N.lastDrainedJournalId);A.length<=0||(_(),t.requestProcessAccumulated?.())},k=await Qv(t.lock,f,S);return ve({ran:k!==!1})}catch(S){return _e(S)}}function g(){_(),t.requestProcessAccumulated?.()}function E(S){try{let k=S.params?.cardStoreRef;if(!k)return ae("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!w()){let fe=ld(I_);v({lastDrainedJournalId:"",graph:Go(fe)},null)}let N=S.params?.outputsStoreRef;if(!N)return ae("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let A=S.params?.scratchStoreRef,K=S.params?.archiveStoreRef,W=u();W.writeCardStoreRef(k),W.writeOutputsStoreRef(N),A&&W.writeScratchStoreRef(A),K&&W.writeArchiveStoreRef(K);let Y=S.body??{};Y["task-executor-ref"]&&W.writeTaskExecutorRef(Y["task-executor-ref"]),Object.prototype.hasOwnProperty.call(Y,"chat-handler-flow")&&W.writeChatHandlerFlow(Y["chat-handler-flow"]);try{d().writeStatusSnapshot(Uo(a,Vo(m().graph)))}catch{}return ve()}catch(k){return _e(k)}}function $(S){try{let k=d().readStatusSnapshot();if(!k){k=Uo(a,Vo(m().graph));try{d().writeStatusSnapshot(k)}catch{}}return ve(k)}catch(k){return _e(k)}}function y(S){try{let k=S.params?.id;return k?(h({type:"task-removal",taskName:k,timestamp:Ue()}),g(),ve()):ae("removeCard requires params.id")}catch(k){return _e(k)}}function p(S){try{let k=S.params?.id;return k?(h({type:"task-restart",taskName:k,timestamp:Ue()}),g(),ve()):ae("retrigger requires params.id")}catch(k){return _e(k)}}async function P(S){return _()}function j(S){try{let k=S.params?.cardId,N=S.params?.all,A=!!S.params?.restart;if(!k&&!N)return ae("upsertCard requires --card-id <id> or --all");let K=N?l().readAllCards().map(W=>W.id):[k];for(let W of K)if(!l().readCard(W))return ae(`Card "${W}" not found in board at ${e.value}`);for(let W of K){let Y=l().readCard(W),fe=q_(Y),xe=t.hashFn(fe),O=t.kvStorage("card-upsert"),C=O.read(W),D=C?.taskConfigHash!==xe;if(!(!D&&!A)){if(D){let Q=C?.blobRef??l().readCardKey(W)??W;h({type:"task-upsert",taskName:W,taskConfig:fe,timestamp:Ue()}),O.write(W,{blobRef:Q,taskConfigHash:xe,updatedAt:Ue()})}A&&h({type:"task-restart",taskName:W,timestamp:Ue()})}}return g(),ve()}catch(k){return _e(k)}}function x(S){try{let k=S.params?.token;if(!k)return ae("taskFailed requires params.token");let N=S.params?.error??"unknown error",A=yn(k);if(!A)return ae("Invalid callback token");h({type:"task-failed",taskName:A.taskName,error:N,timestamp:Ue()});try{b().stream("exec-history").append({taskName:A.taskName,status:"failed",error:N,completedAt:Ue()})}catch{}return g(),ve()}catch(k){return _e(k)}}function I(S){try{let k=S.params?.token;if(!k)return ae("taskProgress requires params.token");let N=(S.body??{}).update??{},A=yn(k);return A?(h({type:"task-progress",taskName:A.taskName,update:N,timestamp:Ue()}),g(),ve()):ae("Invalid callback token")}catch(k){return _e(k)}}function q(S){try{let k=S.params?.token,N=S.params?.ref;if(!k)return ae("sourceDataFetched requires params.token");if(!N)return ae("sourceDataFetched requires params.ref");let A=Ul(k);if(!A)return ae("Invalid source token");let{cbk:K,cid:W,b:Y,d:fe,cs:xe,rqt:O}=A,C=Dl(t.blobStorage("sources"),ne=>t.resolveBlob(ne)),D=t.genId();C.ingestSourceDataStaged(W,fe,$t(N),D);let Q=yn(K);if(!Q)return ae("Invalid callback token embedded in source token");let te=Ue();return h({type:"task-progress",taskName:Q.taskName,update:{bindTo:Y,outputFile:fe,fetchedAt:te,deliveryToken:D,sourceChecksum:xe,rqt:O},timestamp:te}),g(),ve()}catch(k){return _e(k)}}function V(S){try{let k=S.params?.token,N=S.params?.reason??"unknown";if(!k)return ae("sourceDataFetchFailure requires params.token");let A=Ul(k);if(!A)return ae("Invalid source token");let{cbk:K,b:W,d:Y,cs:fe,rqt:xe}=A,O=yn(K);return O?(h({type:"task-progress",taskName:O.taskName,update:{bindTo:W,outputFile:Y,failure:!0,reason:N,sourceChecksum:fe,rqt:xe},timestamp:Ue()}),g(),ve()):ae("Invalid callback token embedded in source token")}catch(k){return _e(k)}}function H(S){try{let k=u().readCardStoreRef();return k?ve({storeRef:k}):ae(`Board at ${e.value} has no card store configured`)}catch(k){return _e(k)}}function F(S){try{let k=u().readOutputsStoreRef();return k?ve({storeRef:k}):ae(`Board at ${e.value} has no outputs store configured`)}catch(k){return _e(k)}}function U(S){try{let k=u().readScratchStoreRef();return ve({storeRef:k})}catch(k){return _e(k)}}function G(S){try{let k=u().readArchiveStoreRef();return ve({storeRef:k})}catch(k){return _e(k)}}function re(S){try{let k=S.params?.key;if(!k)return ae("getConfig requires params.key");let N=u(),A;switch(k){case"task-executor":A=N.readTaskExecutorRef()??null;break;case"chat-handler-flow":A=N.readChatHandlerFlow()??null;break;case"card-store-ref":A=N.readCardStoreRef();break;case"outputs-store-ref":A=N.readOutputsStoreRef();break;case"scratch-store-ref":A=N.readScratchStoreRef();break;case"archive-store-ref":A=N.readArchiveStoreRef();break;default:return ae(`getConfig: unknown key "${k}"`)}return ve({value:A})}catch(k){return _e(k)}}function B(S){try{let k=S.params?.key;if(!k)return ae("getOutputsDataObject requires params.key");let N=d().readDataObject(k);return ve(N)}catch(k){return _e(k)}}function T(S){try{return ve(d().readAllDataObjects())}catch(k){return _e(k)}}function R(S){try{let k=S.params?.key;if(!k)return ae("getOutputsComputedValues requires params.key");let N=d().readComputedValues(k);return ve(N)}catch(k){return _e(k)}}function z(S){try{return ve(d().readAllComputedValues())}catch(k){return _e(k)}}return{init:E,status:$,getCardStoreRef:H,getOutputsStoreRef:F,getScratchStoreRef:U,getArchiveStoreRef:G,getConfig:re,getOutputsDataObject:B,getAllOutputsDataObjects:T,getOutputsComputedValues:R,getAllOutputsComputedValues:z,removeCard:y,retrigger:p,processAccumulatedEvents:P,upsertCard:j,taskFailed:x,taskProgress:I,sourceDataFetched:q,sourceDataFetchFailure:V}}function ir(e,t){let r=()=>gd(t.kvStorage("config"));function a(){let $=r().readCardStoreRef();if(!$)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let y=t.kvStorageForRef($);return{readIndex(){return y.read("_index")},writeIndex(p){y.write("_index",p)},readCard(p){return y.read(p)},writeCard(p,P){return y.write(p,P),t.hashFn(P)},removeCard(p){y.delete(p)},cardExists(p){return y.read(p)!==null},defaultCardKey(p){return p}}}let n=()=>hd(a(),t.onWarn??(()=>{})),s=()=>{let $=r().readScratchStoreRef();return $?t.scratchStorageForRef($):t.scratchStorage()};function o($,y){let p=t.validateSchema(y),P=[],j=r().readTaskExecutorRef();if(j&&Array.isArray(y.source_defs))for(let I of y.source_defs){let q=typeof I.bindTo=="string"?I.bindTo:"(unknown)";try{let V;try{V=t.invokeExecutorSync(j,"validate-source-def",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(I)})}catch(F){let U=F;if(V=typeof U?.stdout=="string"?U.stdout:"",!V.trim()){P.push(`source "${q}": executor validate-source-def failed \u2014 ${F instanceof Error?F.message:String(F)}`);continue}}let H=JSON.parse(V.trim());if(!H.ok&&Array.isArray(H.errors))for(let F of H.errors)P.push(`source "${q}": ${F}`)}catch(V){P.push(`source "${q}": executor validate-source-def failed \u2014 ${V instanceof Error?V.message:String(V)}`)}}let x=[...p.errors,...P];return ve({cardId:$,isValid:x.length===0,issues:x})}function u($,y){let p=r().readTaskExecutorRef();if(!p)throw new Error("No task-executor registered for this board");let P=typeof $.bindTo=="string"?$.bindTo:"source",j=s(),x={...$,boardDir:e.value,_projections:y},I=j.create(JSON.stringify(x,null,2),`probe-in-${P}`,".json"),q=j.getUniqueKey(`probe-out-${P}`,".json"),V=j.getUniqueKey(`probe-err-${P}`,".txt"),H=He(j.keyRef(I)),F=He(j.keyRef(q)),U=He(j.keyRef(V)),G=null;try{if(t.invokeExecutorSync(p,"run-source-fetch",["--in-ref",H,"--out-ref",F,"--err-ref",U],{timeout:$.timeout??t.executorTimeouts?.probeMs??6e4}),G=j.read(q),G===null)throw new Error("Executor produced no output file")}catch(re){let B=j.read(V)?.trim()??(re instanceof Error?re.message:String(re));throw new Error(`Probe failed: ${B}`)}finally{try{j.remove(I)}catch{}try{j.remove(V)}catch{}}return{bindTo:P,result:G}}function i($,y,p){let P;try{P=u($,y)}catch(j){return ae(j instanceof Error?j.message:String(j))}if(p){let j=$t(p);t.absoluteBlob.write(j.value,P.result)}return ve({bindTo:P.bindTo,resultSizeBytes:P.result.length})}function c($,y){let p=$.params?.sourceIdx,P=$.params?.outRef;if(p===void 0)return ae(`${y} requires params.sourceIdx`);if(!$.body||typeof $.body!="object"||Array.isArray($.body))return ae(`${y} requires card JSON object in body`);let j=$.body,x=j["card-content"]??j,I=j["mock-projections"]??{},q=x.source_defs??[];if(p<0||p>=q.length)return ae(`sourceIdx ${p} out of range (card has ${q.length} source(s))`);let V=q[p],H=typeof V.bindTo=="string"?V.bindTo:"source";return{src:V,bindTo:H,outRef:P,mockProjections:I}}function l($){try{let y=$.params?.cardId,p=$.params?.all;if(!y&&!p)return ae("validateCard requires --card-id <id> or --all");let P=p?n().readAllCards().map(x=>x.id):[y],j=[];for(let x of P){let I=n().readCard(x);if(!I){j.push({cardId:x,isValid:!1,issues:[`Card "${x}" not found`]});continue}let q=o(x,I);if(q.status!=="success")return q;j.push(q.data)}return ve(j)}catch(y){return _e(y)}}function d($){try{if(!$.body||typeof $.body!="object"||Array.isArray($.body))return ae("validateCardPreflight requires card JSON object in body");let y=$.body,p=y["card-content"]??y,P=typeof p.id=="string"?p.id:"(unknown)",j=o(P,p),x=r().readTaskExecutorRef();if(x)try{let I=t.invokeExecutorSync(x,"validate-card-preflight",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(p)}),q=JSON.parse(I.trim());if(!q.ok&&Array.isArray(q.errors)&&q.errors.length>0){let V=[...j.status==="success"?j.data.issues:[],...q.errors];return ve({cardId:P,isValid:!1,issues:V})}}catch{}return j}catch(y){return _e(y)}}function b($){try{let y=$.params?.cardId,p=$.params?.sourceIdx,P=$.params?.outRef;if(!y)return ae("probeSource requires params.cardId");if(p===void 0)return ae("probeSource requires params.sourceIdx");let j=($.body??{})["mock-projections"]??{},x=n().readCard(y);if(!x)return ae(`Card "${y}" not found`);let I=x.source_defs??[];return p<0||p>=I.length?ae(`sourceIdx ${p} out of range (card has ${I.length} source(s))`):i(I[p],j,P)}catch(y){return _e(y)}}function w($){try{let y=$.params?.outRef,p=$.body;if(!p)return ae('probeTmpSource requires body with "source-def" and "mock-projections"');let P=p["source-def"],j=p["mock-projections"]??{};return P?i(P,j,y):ae('probeTmpSource body requires "source-def"')}catch(y){return _e(y)}}function m($){try{let y=c($,"probeSourcePreflight");if("status"in y)return y;let p=r().readTaskExecutorRef();if(!p)return ae("No task-executor registered for this board");try{let P={...y.src,_projections:y.mockProjections},j=t.invokeExecutorSync(p,"probe-source-preflight",[],{timeout:y.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(P)}),x=JSON.parse(j.trim());return x.ok?ve({bindTo:y.bindTo,reachable:x.reachable,latencyMs:x.latencyMs,note:x.note}):ae(x.error??"Preflight probe failed")}catch{return ae("Executor does not support probe-source-preflight")}}catch(y){return _e(y)}}function v($){try{let y=c($,"runSourcePreflight");if("status"in y)return y;let p=r().readTaskExecutorRef();if(p)try{let I={...y.src,_projections:y.mockProjections},q=t.invokeExecutorSync(p,"run-source-preflight",[],{timeout:y.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(I)}),V=JSON.parse(q.trim());return V.ok?ve({bindTo:V.bindTo??y.bindTo,reachable:V.reachable,latencyMs:V.latencyMs,kind:V.kind,resultValue:V.resultValue,note:V.note}):ae(V.error??"Source preflight failed")}catch{}let P=Date.now(),j=u(y.src,y.mockProjections);if(y.outRef){let I=$t(y.outRef);t.absoluteBlob.write(I.value,j.result)}let x=j.result;try{x=JSON.parse(j.result)}catch{}return ve({bindTo:j.bindTo,reachable:!0,latencyMs:Date.now()-P,resultValue:x,note:"Actual fetch preflight passed"})}catch(y){return _e(y)}}function h($){try{let y=r().readTaskExecutorRef();if(!y)return ae("No task-executor registered for this board");let p=t.invokeExecutorSync(y,"describe-capabilities",[],{timeout:t.executorTimeouts?.describeMs??1e4});return ve(JSON.parse(p.trim()))}catch(y){return _e(y)}}function f($){try{let y=$.body;if(!y||!Array.isArray(y.ops))return ae("updatesInCardStore requires body.ops array");let p=y.ops,P=n();for(let j of p){let x=j.op,I=j.id;if(!I)return ae('op is missing "id"');if(x==="update"){let q=j["card-content"];if(!q)return ae(`update op for "${I}" is missing "card-content"`);P.writeCard(I,q)}else return ae(`Unknown op type: "${x??"(none)"}"`)}return ve()}catch(y){return _e(y)}}function _($){try{let y=$.body;if(!y||!Array.isArray(y.ids))return ae("readFromCardStore requires body.ids array");let p=y.ids,P=n(),j=p.map(x=>({id:x,"card-content":P.readCard(x)}));return ve({cards:j})}catch(y){return _e(y)}}function g($){try{if(!$.body||typeof $.body!="object"||Array.isArray($.body))return ae("evalCardCompute requires a JSON object in body");let y=$.body,p=y["card-content"]??y,P=typeof p.id=="string"?p.id:"(unknown)",j=y["mock-fetched-sources"]??{},x=y["mock-requires"]??{},I=p.compute;if(!I||!Array.isArray(I)||I.length===0)return ve({cardId:P,ok:!0,computed_values:{},errors:[]});let q={id:P,card_data:p.card_data??{},requires:x,source_defs:p.source_defs,compute:I},V=Cr.runSync(q,{sourcesData:j}),H=V.node.computed_values??{},F=V.errors??[];return ve({cardId:P,ok:F.length===0,computed_values:H,errors:F})}catch(y){return _e(y)}}function E($){try{if(!$.body||typeof $.body!="object"||Array.isArray($.body))return ae("simulateCardCycle requires a JSON object in body");let y=$.body,p=y["card-content"]??y,P=typeof p.id=="string"?p.id:"(unknown)",j=y["mock-fetched-sources"]??{},x=y["mock-requires"]??{},I=o(P,p),q=I.status==="success"?{isValid:I.data.isValid,issues:I.data.issues}:{isValid:!1,issues:[I.status==="fail"?I.error:"internal error"]},V=p.source_defs??[],H=p.card_data??{},F=[],U=[];if(V.length>0){F=Cr.enrichSourcesSync(V,{card_data:H,requires:x});for(let k of F){let N=k.projections,A=k._projections;if(N&&A){for(let K of Object.keys(N))if(A[K]===void 0){let W=typeof k.bindTo=="string"?k.bindTo:"(unknown)";U.push({bindTo:W,key:K,error:`Projection "${K}" resolved to undefined`})}}}}let G=[],re=y["task-executor-ref"],B=(re?.howToRun&&re?.whatToRun?re:void 0)??r().readTaskExecutorRef();for(let k=0;k<F.length;k++){let N=F[k],A=typeof N.bindTo=="string"?N.bindTo:`source_${k}`;if(!B){G.push({bindTo:A,skipped:!0,error:"No task executor configured"});continue}try{let K={...N},W=t.invokeExecutorSync(B,"run-source-preflight",[],{timeout:N.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(K)}),Y=JSON.parse(W.trim());G.push({bindTo:A,reachable:Y.reachable,latencyMs:Y.latencyMs,error:Y.ok?void 0:Y.error})}catch{G.push({bindTo:A,skipped:!0,error:"Executor does not support run-source-preflight"})}}let T=p.compute,R={},z=[];if(T&&Array.isArray(T)&&T.length>0){let k={id:P,card_data:H,requires:x,source_defs:p.source_defs,compute:T},N=Cr.runSync(k,{sourcesData:j});R=N.node.computed_values??{},z=N.errors??[]}let S=q.isValid&&U.length===0&&z.length===0&&G.every(k=>k.reachable!==!1);return ve({cardId:P,ok:S,validation:q,source_probes:G,projection_errors:U,computed_values:R,compute_errors:z})}catch(y){return _e(y)}}return{validateCard:l,validateCardPreflight:d,probeSource:b,probeTmpSource:w,probeSourcePreflight:m,runSourcePreflight:v,evalCardCompute:g,simulateCardCycle:E,describeTaskExecutorCapabilities:h,updatesInCardStore:f,readFromCardStore:_}}var M_=".board.lock";function F_(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function V_(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function _d(e){if(e)return e;let t=ad(import.meta.url),r=[t,Nt(t,"..","cli","node"),Nt(t,"..","..","cli","node")];for(let a of r)try{return od(a),a}catch{}throw new Error(`createFsBoardPlatformAdapter: could not resolve a public CLI directory from module dir ${t}`)}function $n(e,t,r){let{cliDir:a,opts:n}=F_(t,r),s=_d(a),o=e.value,u={meta:"board-live-cards",howToRun:"local-node",whatToRun:!n?.suppressSpawn&&od(s)?He({kind:"yaml-flow-cli",value:"board-live-cards-cli.js"}):"",...n?.notifyChannel?{extra:{notifyChannel:n.notifyChannel}}:{}};return{kvStorage:i=>Nl(Nt(o,`.${i}`)),blobStorage:i=>_n(i?Nt(o,i):o),scratchStorage:()=>Mo(Nt(o,".tmp")),scratchStorageForRef:i=>Mo($t(i).value),archiveFactory:()=>Fo(Nt(o,"archive")),archiveFactoryForRef:i=>Fo($t(i).value),journalAdapter:()=>O0(o),lock:N0(Nt(o,M_)),selfRef:u,async dispatchExecution(i,c){if(n?.suppressSpawn)return{dispatched:!1};try{let l=c.source_def?.bindTo??kl().slice(0,8),d=Mo(Nt(o,".tmp")),b=d.create(JSON.stringify(c,null,2),`exec-in-${l}`,".json"),w=d.getUniqueKey(`exec-out-${l}`,".json"),m=d.getUniqueKey(`exec-err-${l}`,".txt"),v=He(d.keyRef(b)),h=He(d.keyRef(w)),f=He(d.keyRef(m));return _0(i,{subcommand:"run-source-fetch",inRef:v,outRef:h,errRef:f},s),{dispatched:!0}}catch(l){let d=l instanceof Error?l.message:String(l);try{let b=Fo(Nt(o,"archive")),w=new Date().toISOString().replace(/[:.]/g,"-"),m=c.source_def?.bindTo??"unknown";b.blob("exec-failures").write(`${w}-${m}.json`,JSON.stringify({error:d,args:c,ref:i,at:new Date().toISOString()},null,2))}catch{}return{dispatched:!1,error:d}}},resolveBlob(i){let c=Xv(i.value)?ud().read(i.value):_n(o).read(i.value);if(c===null)throw new Error(`resolveBlob: blob not found: ::${i.kind}::${i.value}`);return c},hashFn:j0,genId:()=>e0(`${Date.now()}-${Math.random()}`).slice(0,32),kvStorageForRef:i=>Nl($t(i).value),requestProcessAccumulated(){n?.suppressSpawn||n0(s,e,n?.notifyChannel)},publishBoardChangeNotifications(i){if(!n?.notifyChannel||i.length===0)return;let c=i.map(l=>({id:kl(),ts:new Date().toISOString(),boardRef:He(e),notification:l}));o0(n.notifyChannel,c,n.onWarn)},onWarn:n?.onWarn}}function ur(e,t,r){let{cliDir:a,opts:n}=V_(t,r),s=_d(a),o=$n(e,s,n),u=i0();return{...o,invokeExecutorSync(i,c,l,d){let{command:b,baseArgs:w}=g0(i,s),m=i.extra?["--extra",Buffer.from(JSON.stringify(i.extra)).toString("base64")]:[];return u.executeSync(b,[...w,c,...l,...m],{timeout:d?.timeout??3e4,encoding:"utf-8",input:d?.input})},validateSchema(i){let c=F0(i);return{ok:c.errors.length===0,errors:c.errors}},absoluteBlob:ud()}}function Hl(e){try{let t=JSON.parse(Buffer.from(e,"base64url").toString());return typeof t.br=="string"?t.br:null}catch{return null}}var _t=ad(import.meta.url);function De(e,t,r){let a=e.indexOf(t),n=a!==-1?e[a+1]:void 0;if(!n)throw new Error(`Missing ${t}
28
+ `,"utf-8")},generateId(){return Qe()}}}function N0(e){return{tryAcquire(){try{if(!M.existsSync(e)){M.mkdirSync(Z.dirname(e),{recursive:!0});try{M.writeFileSync(e,"{}",{flag:"wx"})}catch{}}return(0,Bl.lockSync)(e,{retries:0})}catch{return null}}}}var T0={$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:!0,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:!1,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:!0,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:!0,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:!0,description:"file-upload: allow multiple files"},fileAttach:{type:"boolean",default:!1,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:!1},notes:{type:"boolean",default:!1},refresh:{type:"boolean",default:!0}}}}}},title:"LiveCard",description:"A unified card node. Behavior depends on which sections are present (source_defs, compute, view, etc.)",type:"object",required:["id"],additionalProperties:!1,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"},chat:{type:"boolean",description:"Whether this file entry is associated with a chat interaction"}},additionalProperties:!1}}},additionalProperties:!0},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"}}}},x0=rv(Wv()),I0=kn(import.meta.url),C0=I0("./jsonata-sync.cjs"),mn=null,Tl=/\b(card_data|requires|fetched_sources|computed_values|source_defs)\b/g,R0=/^\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\.|$)/;function q0(e){let t=new Set,r;for(Tl.lastIndex=0;(r=Tl.exec(e))!==null;)t.add(r[1]);return t}function cd(e){let t=R0.exec(e);return t?t[1]:null}function xl(e,t,r,a){try{C0(e)}catch(s){let o=s instanceof Error?s.message:String(s);a.push(`${t}: invalid JSONata expression (${o})`);return}let n=q0(e);for(let s of n)r.has(s)||a.push(`${t}: disallowed namespace "${s}" in expression`)}function Ko(e,t,r){if(Array.isArray(e)){e.forEach((n,s)=>{Ko(n,`${t}/${s}`,r)});return}if(typeof e=="string"){let n=cd(e);if(!n)return;new Set(["card_data","requires","computed_values"]).has(n)||r.push(`${t}: disallowed namespace "${n}" in view reference`);return}if(!e||typeof e!="object")return;let a=e;for(let[n,s]of Object.entries(a))Ko(s,`${t}/${n}`,r)}function A0(){if(mn)return mn;let e=new x0.default({allErrors:!0});return(0,Jl.default)(e),mn=e.compile(T0),mn}function D0(e){let t=A0(),r=t(e),a=(t.errors??[]).map(n=>`${n.instancePath||"/"}: ${n.message??"unknown error"}`);if(e&&typeof e=="object"&&!Array.isArray(e)){let n=e.source_defs;if(Array.isArray(n)){let s=new Set,o=new Set;n.forEach((u,i)=>{if(!u||typeof u!="object"||Array.isArray(u))return;let c=u;typeof c.bindTo=="string"&&c.bindTo&&(s.has(c.bindTo)&&a.push(`/source_defs/${i}/bindTo: bindTo "${c.bindTo}" must be unique across all source_defs`),s.add(c.bindTo)),typeof c.outputFile=="string"&&c.outputFile&&(o.has(c.outputFile)&&a.push(`/source_defs/${i}/outputFile: outputFile "${c.outputFile}" must be unique across all source_defs`),o.add(c.outputFile))})}}return!r||a.length>0?{ok:!1,errors:a}:{ok:!0,errors:[]}}function M0(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!0,errors:[]};let r=e,a=r.compute;Array.isArray(a)&&a.forEach((c,l)=>{if(!c||typeof c!="object"||Array.isArray(c))return;let d=c.expr;typeof d!="string"||d.trim().length===0||xl(d,`/compute/${l}/expr`,new Set(["card_data","requires","fetched_sources","computed_values"]),t)});let n=new Set(["card_data","requires","fetched_sources","computed_values"]),s=r.provides;Array.isArray(s)&&s.forEach((c,l)=>{if(!c||typeof c!="object"||Array.isArray(c))return;let d=c.ref;if(typeof d!="string"||d.trim().length===0)return;let b=cd(d);b===null?t.push(`/provides/${l}/ref: path "${d}" must start with a valid namespace (${[...n].join(", ")})`):n.has(b)||t.push(`/provides/${l}/ref: disallowed namespace "${b}" in path "${d}" (valid: ${[...n].join(", ")})`)});let o=r.view;o&&typeof o=="object"&&!Array.isArray(o)&&Ko(o,"/view",t);let u=new Set(["card_data","requires"]),i=r.source_defs;return Array.isArray(i)&&i.forEach((c,l)=>{if(!c||typeof c!="object"||Array.isArray(c))return;let d=c.projections;if(!(!d||typeof d!="object"||Array.isArray(d)))for(let[b,w]of Object.entries(d))typeof w!="string"||w.trim().length===0||xl(w,`/source_defs/${l}/projections/${b}`,u,t)}),{ok:t.length===0,errors:t}}function F0(e){let t=D0(e);if(!t.ok)return t;let r=M0(e);return r.ok?{ok:!0,errors:[]}:{ok:!1,errors:r.errors}}var Ir={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function wt(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function ma(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function V0(e){return e.tasks??{}}function Il(e){return e?e.status===Ir.FAILED||e.status===Ir.INACTIVATED:!1}function z0(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function U0(e){return e.maxExecutions}function H0(e,t){let r=new Set;for(let[a,n]of Object.entries(t))if(n.status===Ir.COMPLETED){let s=e.tasks[a];s&&wt(s).forEach(o=>r.add(o))}return Array.from(r)}function L0(e,t){let r={};return e.forEach(a=>{let n=t[a];n&&wt(n).forEach(s=>{r[s]||(r[s]=[]),r[s].push(a)})}),r}function K0(e,t,r){let a=e.tasks[t]??Nn(),n={};if(r){let o=r.tasks[t],u=ma(o);for(let i of u)for(let[c,l]of Object.entries(r.tasks))if(wt(l).includes(i)){let d=e.tasks[c];d?.lastDataHash&&(n[i]=d.lastDataHash);break}}let s={...a,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:n};return{...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function G0(e,t,r,a,n,s){let o=e.tasks[r]??Nn(),u=t.tasks[r];if(!u)throw new Error(`Task "${r}" not found in graph`);let i;a&&u.on&&u.on[a]?i=u.on[a]:i=wt(u);let c=o.startConsumedHashes?{...o.startConsumedHashes}:{...o.lastConsumedHashes};if(!o.startConsumedHashes){let b=u.requires??[];for(let w of b)for(let[m,v]of Object.entries(t.tasks))if(wt(v).includes(w)){let h=e.tasks[m];h?.lastDataHash&&(c[w]=h.lastDataHash);break}}let l={...o,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:o.executionCount+1,lastEpoch:o.executionCount+1,lastDataHash:n,data:s,lastConsumedHashes:c,error:void 0},d=[...new Set([...e.availableOutputs,...i])];return{...e,tasks:{...e.tasks,[r]:l},availableOutputs:d,lastUpdated:new Date().toISOString()}}function B0(e,t,r,a){let n=e.tasks[r]??Nn(),s=t.tasks[r];if(s?.retry){let i=n.retryCount+1;if(i<=s.retry.max_attempts){let c={...n,status:"not-started",retryCount:i,lastUpdated:new Date().toISOString(),error:a};return{...e,tasks:{...e.tasks,[r]:c},lastUpdated:new Date().toISOString()}}}let o={...n,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:a,executionCount:n.executionCount+1},u=e.availableOutputs;if(s?.on_failure&&s.on_failure.length>0&&(u=[...new Set([...e.availableOutputs,...s.on_failure])]),s?.circuit_breaker&&o.executionCount>=s.circuit_breaker.max_executions){let i=s.circuit_breaker.on_break;u=[...new Set([...u,...i])]}return{...e,tasks:{...e.tasks,[r]:o},availableOutputs:u,lastUpdated:new Date().toISOString()}}function J0(e,t,r,a){let n=e.tasks[t]??Nn(),s={...n,progress:typeof a=="number"?a:n.progress,messages:[...n.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:n.status}]:[]],lastUpdated:new Date().toISOString()};return{...e,tasks:{...e.tasks,[t]:s},lastUpdated:new Date().toISOString()}}function W0(e,t){let r=e.tasks[t];if(!r)return e;let a={...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]:a},lastUpdated:new Date().toISOString()}}function Nn(){return{status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function ld(e,t){let r=`live-${Date.now()}`,a={};for(let s of Object.keys(e.tasks))a[s]=dd();let n={status:"running",tasks:a,availableOutputs:[],stuckDetection:{is_stuck:!1,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:n}}function Y0(e,t){let{config:r,state:a}=e;if("executionId"in t&&t.executionId&&t.executionId!==a.executionId)return e;switch(t.type){case"task-started":return{config:r,state:K0(a,t.taskName,r)};case"task-completed":return{config:r,state:G0(a,r,t.taskName,t.result,t.dataHash,t.data)};case"task-failed":return{config:r,state:B0(a,r,t.taskName,t.error)};case"task-progress":return{config:r,state:J0(a,t.taskName,t.message,t.progress)};case"task-restart":return{config:r,state:W0(a,t.taskName)};case"inject-tokens":return{config:r,state:{...a,availableOutputs:[...new Set([...a.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case"agent-action":return{config:r,state:n_(a,t.action)};case"task-upsert":return Q0(e,t.taskName,t.taskConfig);case"task-removal":return X0(e,t.taskName);case"node-requires-add":return e_(e,t.nodeName,t.tokens);case"node-requires-remove":return t_(e,t.nodeName,t.tokens);case"node-provides-add":return r_(e,t.nodeName,t.tokens);case"node-provides-remove":return a_(e,t.nodeName,t.tokens);default:return e}}function Z0(e,t){return t.reduce((r,a)=>Y0(r,a),e)}function Q0(e,t,r){let a=!!e.config.tasks[t];return{config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:a?e.state.tasks[t]:dd()},lastUpdated:new Date().toISOString()}}}function X0(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...a}=e.config.tasks,{[t]:n,...s}=e.state.tasks;return{config:{...e.config,tasks:a},state:{...e.state,tasks:s,lastUpdated:new Date().toISOString()}}}function e_(e,t,r){let a=e.config.tasks[t];if(!a)return e;let n=ma(a),s=r.filter(o=>!n.includes(o));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...a,requires:[...n,...s]}}},state:e.state}}function t_(e,t,r){let a=e.config.tasks[t];if(!a)return e;let n=ma(a),s=n.filter(o=>!r.includes(o));return s.length===n.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...a,requires:s}}},state:e.state}}function r_(e,t,r){let a=e.config.tasks[t];if(!a)return e;let n=wt(a),s=r.filter(o=>!n.includes(o));return s.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...a,provides:[...n,...s]}}},state:e.state}}function a_(e,t,r){let a=e.config.tasks[t];if(!a)return e;let n=wt(a),s=n.filter(o=>!r.includes(o));return s.length===n.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...a,provides:s}}},state:e.state}}function Go(e){return{version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Vo(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,a=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(!a.tasks||typeof a.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(a.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return{config:r,state:a}}function dd(){return{status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function n_(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 Bo(e){let{config:t,state:r}=e,a=V0(t);if(Object.keys(a).length===0)return{eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let n=s_(a),s=H0(t,r.tasks),o=new Set([...s,...r.availableOutputs]),u=[],i=[],c=[],l=[];for(let[b,w]of Object.entries(a)){let m=r.tasks[b],v=z0(w,t.settings),h=v!=="once";if(m?.status===Ir.RUNNING||Il(m))continue;let f=U0(w);if(f!==void 0&&m&&m.executionCount>=f||w.circuit_breaker&&m&&m.executionCount>=w.circuit_breaker.max_executions||!h&&m?.status===Ir.COMPLETED)continue;if(h&&m?.status===Ir.COMPLETED){let y=ma(w),p=!1;switch(v){case"data-changed":{y.length>0&&y.some(P=>{for(let[j,x]of Object.entries(a))if(wt(x).includes(P)){let I=r.tasks[j];if(!I)continue;let q=m.lastConsumedHashes?.[P];return I.lastDataHash==null?I.executionCount>m.lastEpoch:I.lastDataHash!==q}return!1})||(p=!0);break}case"epoch-changed":{y.length>0&&y.some(P=>{for(let[j,x]of Object.entries(a))if(wt(x).includes(P)){let I=r.tasks[j];if(I&&I.executionCount>m.lastEpoch)return!0}return!1})||(p=!0);break}case"time-based":{let P=w.refreshInterval??0;if(P<=0){p=!0;break}let j=m.completedAt;if(!j){p=!0;break}(Date.now()-Date.parse(j))/1e3<P&&(p=!0);break}case"manual":p=!0;break}if(p)continue}let _=ma(w);if(_.length===0){u.push(b);continue}let g=[],E=[],$=[];for(let y of _){if(o.has(y))continue;let p=n[y]||[];p.length===0?g.push(y):p.every(P=>Il(r.tasks[P]))?$.push({token:y,failedProducer:p[0]}):E.push(y)}g.length>0?c.push({taskName:b,missingTokens:g}):$.length>0?l.push({taskName:b,failedTokens:$.map(y=>y.token),failedProducers:[...new Set($.map(y=>y.failedProducer))]}):E.length>0?i.push({taskName:b,waitingOn:E}):u.push(b)}let d={};if(u.length>1){let b=L0(u,a);for(let[w,m]of Object.entries(b))m.length>1&&(d[w]=m)}return{eligible:u,pending:i,unresolved:c,blocked:l,conflicts:d}}function s_(e){let t={};for(let[r,a]of Object.entries(e)){for(let n of wt(a))t[n]||(t[n]=[]),t[n].push(r);if(a.on)for(let n of Object.values(a.on))for(let s of n)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);if(a.on_failure)for(let n of a.on_failure)t[n]||(t[n]=[]),t[n].includes(r)||t[n].push(r)}return t}var Cl=class{buffer=[];append(e){this.buffer.push(e)}drain(){let e=this.buffer;return this.buffer=[],e}get size(){return this.buffer.length}};function zo(e){let t=Jo(e);return o_(t)}function Jo(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return"["+e.map(Jo).join(",")+"]";let t=e;return"{"+Object.keys(t).sort().map(r=>JSON.stringify(r)+":"+Jo(t[r])).join(",")+"}"}function o_(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,a=0xffffffffffffffffn;for(let n=0;n<e.length;n++)t^=BigInt(e.charCodeAt(n)),t=t*r&a;return t.toString(16).padStart(16,"0")}function i_(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 a of t)r+=String.fromCharCode(a);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function u_(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),a=atob(r),n=new Uint8Array(a.length);for(let s=0;s<a.length;s++)n[s]=a.charCodeAt(s);return new TextDecoder().decode(n)}throw new Error("No base64 decoder available in this runtime")}function Rl(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return i_(t)}function c_(e){try{let t=JSON.parse(u_(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function l_(e,t,r){let{handlers:a,onDrain:n}=t,s=new Cl,o="state"in e&&"config"in e?e:ld(e),u=!1,i=new Set,c=new Map(Object.entries(a)),l=new Cl,d=!1,b=!1;function w(){if(!u){if(d){b=!0;return}d=!0;try{do b=!1,m();while(b)}finally{d=!1}}}function m(){let _=l.drain(),g=s.drain(),E=[..._,...g];E.length>0&&(o=Z0(o,E));let $=Bo(o);E.length>0&&n?.(E,o,$);for(let y of $.eligible)f(y);for(let y of E)if(y.type==="task-progress"){let{taskName:p,update:P}=y;if(!o.config.tasks[p])continue;let j=o.state.tasks[p];if(!j||j.status!=="running")continue;let x=Rl(p),I=h(p,x,P).catch(q=>{u||(l.append({type:"task-failed",taskName:p,error:q.message??String(q),timestamp:new Date().toISOString()}),w())}).finally(()=>{i.delete(I)});i.add(I)}}function v(_){let g=o.config.tasks[_].requires??[],E=new Map;for(let[y,p]of Object.entries(o.config.tasks))for(let P of p.provides??[])E.set(P,y);let $={};for(let y of g){let p=E.get(y);p?$[y]=o.state.tasks[p]?.data:$[y]=void 0}return $}async function h(_,g,E){let $=o.config.tasks[_],y=$.taskHandlers??[],p=v(_);for(let P of y){let j=c.get(P);if(!j)throw new Error(`Handler '${P}' not found in registry (task '${_}')`);let x={nodeId:_,state:p,taskState:o.state.tasks[_],config:$,callbackToken:g,update:E};if(await j(x)==="task-initiate-failure")throw new Error(`Handler '${P}' returned task-initiate-failure (task '${_}')`)}}function f(_){let g=o.config.tasks[_]?.taskHandlers;if(!g||g.length===0)return;l.append({type:"task-started",taskName:_,timestamp:new Date().toISOString()}),w();let E=Rl(_),$=h(_,E).catch(y=>{u||(l.append({type:"task-failed",taskName:_,error:y.message??String(y),timestamp:new Date().toISOString()}),w())}).finally(()=>{i.delete($)});i.add($)}return{push(_){u||(_.type==="task-completed"&&_.data&&!_.dataHash&&(_={..._,dataHash:zo(_.data)}),s.append(_),w())},pushAll(_){if(!u){for(let g of _)g.type==="task-completed"&&g.data&&!g.dataHash?s.append({...g,dataHash:zo(g.data)}):s.append(g);w()}},resolveCallback(_,g,E){if(u)return;let $=c_(_);if(!$)return;let{taskName:y}=$;if(o.config.tasks[y]){if(E&&E.length>0)s.append({type:"task-failed",taskName:y,error:E.join("; "),timestamp:new Date().toISOString()});else{let p=g&&Object.keys(g).length>0?zo(g):void 0;s.append({type:"task-completed",taskName:y,data:g,dataHash:p,timestamp:new Date().toISOString()})}w()}},addNode(_,g){u||(s.append({type:"task-upsert",taskName:_,taskConfig:g,timestamp:new Date().toISOString()}),w())},removeNode(_){u||(s.append({type:"task-removal",taskName:_,timestamp:new Date().toISOString()}),w())},addRequires(_,g){u||(s.append({type:"node-requires-add",nodeName:_,tokens:g,timestamp:new Date().toISOString()}),w())},removeRequires(_,g){u||(s.append({type:"node-requires-remove",nodeName:_,tokens:g,timestamp:new Date().toISOString()}),w())},addProvides(_,g){u||(s.append({type:"node-provides-add",nodeName:_,tokens:g,timestamp:new Date().toISOString()}),w())},removeProvides(_,g){u||(s.append({type:"node-provides-remove",nodeName:_,tokens:g,timestamp:new Date().toISOString()}),w())},registerHandler(_,g){c.set(_,g)},unregisterHandler(_){c.delete(_)},retrigger(_){u||o.config.tasks[_]&&(s.append({type:"task-restart",taskName:_,timestamp:new Date().toISOString()}),w())},retriggerAll(_){if(!u){for(let g of _)o.config.tasks[g]&&s.append({type:"task-restart",taskName:g,timestamp:new Date().toISOString()});w()}},snapshot(){return Go(o)},getState(){return o},getSchedule(){return Bo(o)},async waitForHandlers(){i.size>0&&await Promise.allSettled([...i])},async dispose(_){_?.wait&&i.size>0&&await Promise.allSettled([...i]),u=!0}}}var d_=kn(import.meta.url),Tn=d_("./jsonata-sync.cjs"),fd=Tn;function ql(e,t){if(!t||!e)return;let r=t.split("."),a=e;for(let n=0;n<r.length;n++){if(a==null)return;a=a[r[n]]}return a}function pd(e,t,r){let a=t.split("."),n=e;for(let s=0;s<a.length-1;s++)(n[a[s]]==null||typeof n[a[s]]!="object")&&(n[a[s]]={}),n=n[a[s]];n[a[a.length-1]]=r}async function f_(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??{},a={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 n of e.compute)try{let s=await Tn(n.expr).evaluate(a);pd(e.computed_values,n.bindTo,s),a.computed_values=e.computed_values}catch{}return e}function p_(e,t){if(!e?.compute?.length)return{ok:!0,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},a={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},n=[];for(let s of e.compute)try{let o=fd(s.expr).evaluate(a);pd(e.computed_values,s.bindTo,o),a.computed_values=e.computed_values}catch(o){let u=o instanceof Error?o.message:String(o);n.push({bindTo:s.bindTo,error:u})}return n.length>0?{ok:!0,node:e,errors:n}:{ok:!0,node:e}}async function h_(e,t,r){let a={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return Tn(e).evaluate(a)}function m_(e,t){return t.startsWith("fetched_sources.")?ql(e._sourcesData??{},t.slice(16)):ql(e,t)}var Al=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),y_=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function g_(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,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 a of Object.keys(r))y_.has(a)||t.push(`Unknown top-level key: "${a}"`);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 a=r.meta;a.title!=null&&typeof a.title!="string"&&t.push("meta.title: must be a string"),a.tags!=null&&!Array.isArray(a.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((a,n)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`provides[${n}]: must be an object with bindTo and ref`);else{let s=a;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`provides[${n}]: missing required "bindTo" string`),(typeof s.ref!="string"||!s.ref)&&t.push(`provides[${n}]: 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((a,n)=>{if(!a||typeof a!="object"||Array.isArray(a))t.push(`compute[${n}]: must be a compute step object`);else{let s=a;(typeof s.bindTo!="string"||!s.bindTo)&&t.push(`compute[${n}]: missing required "bindTo" property`),(typeof s.expr!="string"||!s.expr)&&t.push(`compute[${n}]: 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 a=new Set,n=new Set;r.source_defs.forEach((s,o)=>{if(!s||typeof s!="object"||Array.isArray(s))t.push(`source_defs[${o}]: must be an object`);else{let u=s;typeof u.bindTo!="string"||!u.bindTo?t.push(`source_defs[${o}]: missing required "bindTo" property`):(a.has(u.bindTo)&&t.push(`source_defs[${o}]: bindTo "${u.bindTo}" is not unique across source_defs`),a.add(u.bindTo)),typeof u.outputFile!="string"||!u.outputFile?t.push(`source_defs[${o}]: missing required "outputFile" property`):(n.has(u.outputFile)&&t.push(`source_defs[${o}]: outputFile "${u.outputFile}" is not unique across source_defs`),n.add(u.outputFile)),u.optionalForCompletionGating!=null&&typeof u.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${o}]: 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 a=r.view;!Array.isArray(a.elements)||a.elements.length===0?t.push("view.elements: required, must be a non-empty array"):a.elements.forEach((n,s)=>{if(!n||typeof n!="object"){t.push(`view.elements[${s}]: must be an object`);return}!n.kind||typeof n.kind!="string"?t.push(`view.elements[${s}].kind: required, must be a string`):Al.has(n.kind)||t.push(`view.elements[${s}].kind: unknown kind "${n.kind}". Valid: ${[...Al].join(", ")}`),n.data!=null&&(typeof n.data!="object"||Array.isArray(n.data))&&t.push(`view.elements[${s}].data: must be an object`)}),a.layout!=null&&(typeof a.layout!="object"||Array.isArray(a.layout))&&t.push("view.layout: must be an object"),a.features!=null&&(typeof a.features!="object"||Array.isArray(a.features))&&t.push("view.features: must be an object")}return{ok:t.length===0,errors:t}}async function v_(e,t){if(!e||e.length===0)return[];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async a=>{let n={};if(a.projections&&typeof a.projections=="object"&&!Array.isArray(a.projections)){for(let[s,o]of Object.entries(a.projections))if(typeof o=="string"&&o.trim().length>0)try{n[s]=await Tn(o).evaluate(r)}catch{n[s]=void 0}}return{...a,_projections:n}}))}function __(e,t){if(!e||e.length===0)return[];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(a=>{let n={};if(a.projections&&typeof a.projections=="object"&&!Array.isArray(a.projections)){for(let[s,o]of Object.entries(a.projections))if(typeof o=="string"&&o.trim().length>0)try{n[s]=fd(o).evaluate(r)}catch{n[s]=void 0}}return{...a,_projections:n}})}var Cr={run:f_,runSync:p_,eval:h_,resolve:m_,validate:g_,enrichSources:v_,enrichSourcesSync:__};function $_(e){return JSON.stringify(e)}function w_(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 hd(e,t){function r(){return e.readIndex()??{}}function a(n,s,o){let u=String(s||"").split(".").filter(Boolean);if(u.length===0)return o&&typeof o=="object"&&!Array.isArray(o)?o:{value:o};let i={...n},c=i;for(let l=0;l<u.length-1;l++){let d=u[l],b=c[d],w=b&&typeof b=="object"&&!Array.isArray(b)?{...b}:{};c[d]=w,c=w}return c[u[u.length-1]]=o,i}return{readCard(n){let s=r()[n];return!s||!e.cardExists(s.key)?null:e.readCard(s.key)},readCardKey(n){return r()[n]?.key??null},readAllCards(){let n=[];for(let[s,o]of Object.entries(r())){if(!e.cardExists(o.key))continue;let u=e.readCard(o.key);u?n.push(u):t?.(`[card-store] could not read card "${s}" at key "${o.key}"`)}return n},readChecksumIndex(){let n={};for(let[s,o]of Object.entries(r()))n[s]=o.checksum;return n},changedSince(n){let s=r(),o=[];for(let[u,i]of Object.entries(s))n[u]!==i.checksum&&o.push(u);for(let u of Object.keys(n))s[u]||o.push(u);return o},validateUpsert(n,s){let o=r(),u=o[n],i=Object.entries(o).find(([,c])=>c.key===s);return u&&u.key!==s?{ok:!1,error:`Card id "${n}" is already mapped to key "${u.key}", cannot remap to "${s}"`}:i&&i[0]!==n?{ok:!1,error:`Key "${s}" is already mapped to card id "${i[0]}", cannot remap to "${n}"`}:{ok:!0}},writeCard(n,s,o){let u=r(),i=o??u[n]?.key??e.defaultCardKey(n),c=e.writeCard(i,s);u[n]={key:i,checksum:c,updatedAt:new Date().toISOString()},e.writeIndex(u)},patchCard(n,s,o){let u=r(),i=u[n];if(!i||!e.cardExists(i.key))throw new Error(`card "${n}" not found`);let c=e.readCard(i.key);if(!c||typeof c!="object"||Array.isArray(c))throw new Error(`card "${n}" is not patchable`);let l=a(c,s,o),d=e.writeCard(i.key,l);u[n]={key:i.key,checksum:d,updatedAt:new Date().toISOString()},e.writeIndex(u)},removeCard(n){let s=r(),o=s[n];o&&(e.removeCard(o.key),delete s[n],e.writeIndex(s))},readIndex(){return r()}}}function Dl(e,t){return{readSourceData(r,a){let n=e.read(`${r}/${a}`);if(n==null)return null;let s=n.trim();if(!s)return null;try{return JSON.parse(s)}catch{return s}},ingestSourceDataStaged(r,a,n,s){let o=t(n);e.write(`${r}/.staged/${s}/${a}`,o)},commitSourceData(r,a,n){let s=`${r}/.staged/${n}/${a}`,o=e.read(s);return o==null?!1:(e.write(`${r}/${a}`,o),e.remove(s),!0)},hasSource(r,a){return e.exists(`${r}/${a}`)}}}function b_(e){function t(r){let a=e.readAllEntries();if(!r)return a;let n=a.findIndex(s=>s.id===r);return n===-1?a:a.slice(n+1)}return{readEntriesAfterCursor(r){let a=t(r);return a.length===0?{events:[],newCursor:r}:{events:a.map(n=>n.event),newCursor:a[a.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r})}}}function S_(e,t){return{appendEntries(r,a){if(!r||a.length===0)return;let n=e.read(r)??[];e.write(r,[...n,...a])},dispatchEntriesForJournalId(r,a){if(!r)return;let n=e.read(r);if(!(!n||n.length===0)){for(let s of n)try{a(s)}catch(o){let u=o instanceof Error?o.message:String(o);try{t(s,u)}catch{}}e.delete(r)}}}}var md="v1",ya="board/graph",yd="board/lastJournalProcessedId";function Ml(e){return`cards/${e}/runtime`}function k_(e){return{readRuntime(t){return e.read(Ml(t))??{_sources:{}}},writeRuntime(t,r){e.write(Ml(t),r)}}}function E_(e,t){let r={...e};for(let a of t.deleteKeys)delete r[a];return{...r,...t.shallowMerge}}function P_(e){return{readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==md)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let a=e.readValues(t);if(a.version!==r.expectedVersion)return{ok:!1,reason:"version-mismatch",currentVersion:a.version};let n=E_(a.values,r);return{ok:!0,newVersion:e.writeValues(t,n,r.deleteKeys)}}}}function gd(e){function t(r){let a=e.read(r);return a==null?null:typeof a=="string"?a:JSON.stringify(a)}return{readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return w_(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",$_(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 j_(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 a=r.match(/^cards\/([^/]+)\/computed_values$/);a&&(t[a[1]]=e.read(r))}return t},writeDataObjects(t){for(let[r,a]of Object.entries(t))r&&e.write(`data-objects/${r}`,a)},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 Fl(e){return e?{lastRequestedToken:e.lastRequestedToken,lastCompletedToken:e.lastCompletedToken,lastCompletionStatus:e.lastCompletionStatus??(e.lastCompletedToken?"success":"not-started"),queueRequestedToken:e.queueRequestedToken}:{lastCompletionStatus:"not-started"}}function O_(e){return e?.lastRequestedToken?e.lastCompletedToken!==e.lastRequestedToken:!1}function Vl(e,t){return e?.lastRequestedToken?O_(e)?"in-flight":!e.lastCompletedToken||e.lastCompletedToken<t?"dispatch":"idle":"dispatch"}function N_(e,t){return{...e,lastCompletedToken:t,lastCompletionStatus:"success"}}function zl(e,t){return{...e,lastCompletedToken:t,lastCompletionStatus:"failure"}}function Uo(e,t){let r=t.state.tasks,a=t.config.tasks,n=Object.keys(r),s=Bo(t),o={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},u=new Map;for(let m of s.pending)u.set(m.taskName,m.waitingOn);for(let m of s.unresolved)u.set(m.taskName,m.missingTokens);for(let m of s.blocked)u.set(m.taskName,m.failedTokens);let i=new Map;for(let[m,v]of Object.entries(a))for(let h of v.requires??[]){let f=i.get(h)??[];f.push(m),i.set(h,f)}let c=n.sort().map(m=>{let v=r[m],h=a[m]??{requires:[],provides:[]};v.status==="completed"?o.completed+=1:v.status==="failed"?o.failed+=1:v.status==="in-progress"&&(o.in_progress+=1);let f=h.requires??[],_=h.provides??[],g=Object.keys(v.data??{}).sort(),E=f.filter(x=>t.state.availableOutputs.includes(x)),$=f.filter(x=>!t.state.availableOutputs.includes(x)),y=u.get(m)??$,p=new Set;for(let x of _)for(let I of i.get(x)??[])I!==m&&p.add(I);let P=v.failedAt,j=v.error?{message:v.error,code:"TASK_FAILED",at:P,source:"task-runtime"}:void 0;return{name:m,status:v.status,error:j,requires:f,requires_satisfied:E,requires_missing:$,provides_declared:_,provides_runtime:g,blocked_by:y,unblocks:Array.from(p).sort(),runtime:{attempt_count:v.executionCount??0,restart_count:v.retryCount??0,in_progress_since:v.status==="in-progress"?v.startedAt??null:null,last_transition_at:v.lastUpdated??null,last_completed_at:v.completedAt??null,last_restarted_at:v.startedAt??null,status_age_ms:v.lastUpdated?0:null}}});o.pending=s.pending.length,o.blocked=s.blocked.length,o.unresolved=s.unresolved.length;let l=c.map(m=>({name:m.name,fanOut:m.unblocks.length})).sort((m,v)=>v.fanOut-m.fanOut||m.name.localeCompare(v.name)),d=l.length>0?l[0]:{name:null,fanOut:0},b=new Set;for(let m of Object.values(a))for(let v of m.requires??[])b.add(v);let w=0;for(let[m,v]of Object.entries(a)){let h=(v.requires??[]).length===0,f=(v.provides??[]).some(_=>(i.get(_)??[]).some(g=>g!==m));h&&!f&&(w+=1)}return{schema_version:"v1",meta:{board:{path:e}},summary:{card_count:n.length,completed:o.completed,eligible:s.eligible.length,pending:o.pending,blocked:o.blocked,unresolved:o.unresolved,failed:o.failed,in_progress:o.in_progress,orphan_cards:w,topology:{edge_count:Array.from(b).length,max_fan_out_card:d.name,max_fan_out:d.fanOut}},cards:c}}function T_(){return new Date().toISOString()}function x_(e,t,r,a,n,s,o){return async u=>{let i=[],c=r.cardStore.readCard(u.nodeId);if(!c)return"task-initiate-failure";let l=c.id,d=c.card_data??{},b=c.source_defs??[],w=b.filter(F=>F.optionalForCompletionGating!==!0),m=r.cardRuntimeStore.readRuntime(l),v=!1,h=()=>{v&&(r.cardRuntimeStore.writeRuntime(l,m),v=!1)},f=F=>Fl(m._sources[F]),_=(F,U)=>{m._sources[F]=Fl(U),v=!0},g=u.taskState?.executionCount??0;if(m._lastExecutionCount!==g&&(m._sources={},m._lastExecutionCount=g,v=!0),u.update){let F=u.update,U=F.outputFile;if(U){let G=f(U);if(F.failure){let re=F.rqt??G.lastRequestedToken??G.queueRequestedToken;re&&_(U,zl(G,re))}else{let re=F.rqt;if(!G.lastCompletedToken||re>G.lastCompletedToken){let B=typeof F.deliveryToken=="string"?F.deliveryToken:void 0,T=!1;B&&(T=r.fetchedSourcesStore.commitSourceData(l,U,B)),T?_(U,N_(G,re)):_(U,zl(G,re))}}h()}}let E={};for(let F of b)if(F.outputFile){let U=r.fetchedSourcesStore.readSourceData(l,F.outputFile);U!==null&&(E[F.bindTo]=U)}let $={};for(let[F,U]of Object.entries(u.state??{}))if(U!==null&&typeof U=="object"&&!Array.isArray(U)){let G=U[F];$[F]=G!==void 0?G:U}else $[F]=U;let y={id:l,card_data:{...d},requires:$,source_defs:b,compute:c.compute};y._sourcesData=E,c.compute&&Cr.runSync(y,{sourcesData:E}),(s??r.outputStore.writeComputedValues.bind(r.outputStore))(l,y.computed_values??{});let p={...c},P=Cr.enrichSourcesSync(Array.isArray(c.source_defs)?c.source_defs:void 0,{card_data:c.card_data,requires:$}),j=e.value;p.source_defs=Array.isArray(P)?P.map(F=>({...F,boardDir:typeof F.boardDir=="string"&&F.boardDir?F.boardDir:j})):P;let x=T_(),I=u.update?void 0:x,q=w.filter(F=>{let U=F.outputFile;if(typeof U!="string"||!U)return!0;let G=f(U);I&&(G={...G,queueRequestedToken:I},_(U,G));let re=G.queueRequestedToken??G.lastRequestedToken??x,B=Vl(G,re);return B==="in-flight"?!1:B==="dispatch"});if(h(),q.length>0){let F=!1,U=x;for(let G of q){let re=G.outputFile;if(typeof re!="string"||!re)continue;let B=f(re),T=B.queueRequestedToken??x;_(re,{...B,lastRequestedToken:T}),U=T,F=!0}return F&&h(),F&&(i.push({taskKind:"source-fetch",payload:{boardRef:He(e),enrichedCard:p,callbackToken:u.callbackToken,rqt:U}}),r.executionRequestStore.appendEntries(t,i)),"task-initiated"}if(w.some(F=>{let U=F.outputFile;if(typeof U!="string"||!U)return!1;let G=f(U),re=G.queueRequestedToken??G.lastRequestedToken??x;return Vl(G,re)==="in-flight"}))return"task-initiated";let V=c.provides??[],H={};for(let{bindTo:F,ref:U}of V)H[F]=Cr.resolve(y,U);return(o??r.outputStore.writeDataObjects.bind(r.outputStore))(H),b.filter(F=>{if(F.optionalForCompletionGating!==!0)return!1;let U=f(F.outputFile);return!U.lastRequestedToken||!U.lastCompletedToken?!0:U.lastCompletedToken<=U.lastRequestedToken}).length>0&&i.push({taskKind:"source-fetch",payload:{boardRef:He(e),enrichedCard:p,callbackToken:u.callbackToken,rqt:x}}),a(u.nodeId,H),i.length>0&&r.executionRequestStore.appendEntries(t,i),"task-initiated"}}var I_={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function C_(e){return{[ya]:e.graph,[yd]:e.lastDrainedJournalId}}function R_(e){let t=e[ya],r=e[yd];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ya}`);return{graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function q_(e){let t=e.requires,r=e.provides?.map(a=>a.bindTo)??[];return{requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function ve(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function ae(e){return{status:"fail",error:e}}function _e(e){return{status:"error",error:e instanceof Error?e.message:String(e)}}function A_(e){let t=new TextEncoder().encode(e),r=Array.from(t,a=>String.fromCharCode(a)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function vd(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),a=atob(r),n=Uint8Array.from(a,s=>s.charCodeAt(0));return new TextDecoder().decode(n)}function yn(e){try{let t=JSON.parse(vd(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function D_(e){return A_(JSON.stringify(e))}function Ul(e){try{let t=JSON.parse(vd(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Ue(){return new Date().toISOString()}function Ho(e,t){let r=t.onWarn??(()=>{}),a=He(e);function n(S){if(S.length!==0)try{let k=t.publishBoardChangeNotifications?.(S);k&&typeof k.catch=="function"&&k.catch(N=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${N instanceof Error?N.message:String(N)}`))}catch(k){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${k instanceof Error?k.message:String(k)}`)}}function s(){let S=u().readCardStoreRef();if(!S)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let k=t.kvStorageForRef(S);return{readIndex(){return k.read("_index")},writeIndex(N){k.write("_index",N)},readCard(N){return k.read(N)},writeCard(N,A){return k.write(N,A),t.hashFn(A)},removeCard(N){k.delete(N)},cardExists(N){return k.read(N)!==null},defaultCardKey(N){return N}}}let o={readValues(S){let k=t.kvStorage("state-snapshot"),N=k.listKeys().sort();if(N.length===0)return{version:null,values:{}};let A={};for(let K of N)A[K]=k.read(K);return{version:t.hashFn(A),values:A}},writeValues(S,k,N){let A=t.kvStorage("state-snapshot");for(let K of N)A.delete(K);for(let[K,W]of Object.entries(k))A.write(K,W);return t.hashFn(k)}},u=()=>gd(t.kvStorage("config")),i=()=>P_(o),c=()=>b_(t.journalAdapter()),l=()=>hd(s(),r),d=()=>{let S=u().readOutputsStoreRef();if(!S)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return j_(t.kvStorageForRef(S))},b=()=>{let S=u().readArchiveStoreRef();return S?t.archiveFactoryForRef(S):t.archiveFactory()};function w(){return!!i().readSnapshot(e.value).values[ya]}function m(){let S=i().readSnapshot(e.value);if(!S.values[ya])throw new Error(`Board not initialized at ${e.value}`);return R_(S.values)}function v(S,k){let N=i().commitSnapshot(e.value,{schemaVersion:md,expectedVersion:k,commitId:t.genId(),committedAt:Ue(),deleteKeys:[],shallowMerge:C_(S)});if(!N.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${k??"null"} current=${N.currentVersion??"null"}`)}function h(S){c().appendEvent(S)}async function f(){let S=(X,se)=>{let je=X.payload,Gt=(je?.enrichedCard??{}).id??je?.cardId??"unknown";h({type:"task-failed",taskName:Gt,error:se,timestamp:Ue()})},k=S_(t.kvStorage("execution-requests"),S),N=k_(t.kvStorage("card-runtime")),A=Dl(t.blobStorage("sources"),X=>t.resolveBlob(X)),K=new Map,W={readRuntime(X){return K.get(X)??N.readRuntime(X)},writeRuntime(X,se){K.set(X,se)}},Y=[],fe=new Map,xe={readSourceData(X,se){let je=`${X}/${se}`;return fe.has(je)?fe.get(je):A.readSourceData(X,se)},ingestSourceDataStaged(X,se,je,Gt){A.ingestSourceDataStaged(X,se,je,Gt)},commitSourceData(X,se,je){let Gt=`${X}/.staged/${je}/${se}`,xt=t.blobStorage("sources").read(Gt);if(xt==null)return!1;let va=`${X}/${se}`,cr=xt.trim();try{fe.set(va,JSON.parse(cr))}catch{fe.set(va,cr)}return Y.push({cardId:X,outputFile:se,deliveryToken:je}),!0},hasSource(X,se){let je=`${X}/${se}`;return fe.has(je)?!0:A.hasSource(X,se)}},O={cardStore:l(),cardRuntimeStore:W,fetchedSourcesStore:xe,outputStore:d(),executionRequestStore:k},C=m(),D=Vo(C.graph),{events:Q,newCursor:te}=c().readEntriesAfterCursor(C.lastDrainedJournalId),ne=[],Te=[],Ce=[],Ze=new Map,Me=(X,se)=>{ne.push({type:"task-completed",taskName:X,data:se,timestamp:Ue()});try{b().stream("exec-history").append({taskName:X,status:"completed",completedAt:Ue()})}catch{}},Ne=(X,se)=>{h({type:"task-failed",taskName:X,error:se,timestamp:Ue()});try{b().stream("exec-history").append({taskName:X,status:"failed",error:se,completedAt:Ue()})}catch{}},st=l_(D,{handlers:{"card-handler":x_(e,te,O,Me,Ne,(X,se)=>{Te.push({cardId:X,values:se})},X=>{Ce.push(X)})}});for(ne=Q;ne.length>0;){let X=ne;ne=[];for(let se of X)if(se.type==="task-restart"){let je=O.cardStore.readCard(se.taskName);je&&Ze.set(se.taskName,je)}st.pushAll(X),await st.waitForHandlers()}let Le=st.getState();await st.dispose({wait:!0});let Rr=i().readSnapshot(e.value).version;v({lastDrainedJournalId:te,graph:Go(Le)},Rr);for(let{cardId:X,values:se}of Te)O.outputStore.writeComputedValues(X,se);for(let X of Ce)O.outputStore.writeDataObjects(X);for(let[X,se]of K)N.writeRuntime(X,se);for(let{cardId:X,outputFile:se,deliveryToken:je}of Y)A.commitSourceData(X,se,je);let ft;try{ft=Uo(a,Le),O.outputStore.writeStatusSnapshot(ft)}catch(X){r(`[board-live-cards-public] status publish failed: ${X instanceof Error?X.message:String(X)}`)}let bt=[];for(let{cardId:X,values:se}of Te)bt.push({kind:"computed_values",cardId:X,values:se});for(let X of Ce)for(let[se,je]of Object.entries(X))se&&bt.push({kind:"data_object",key:se,payload:je});for(let[X,se]of Ze)bt.push({kind:"card_refreshed",cardId:X,card:se});ft!==void 0&&bt.push({kind:"status",status:ft}),n(bt);let ga=u().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:He({kind:"built-in",value:"source-cli-task-executor"})};k.dispatchEntriesForJournalId(te,X=>{if(X.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${X.taskKind}" \u2014 skipping`);return}let se=X.payload,je=se.enrichedCard?.id??"unknown",Gt=se.enrichedCard?.source_defs??[];for(let xt of Gt){if(!xt.outputFile){r(`[dispatch] source "${xt.bindTo}" has no outputFile \u2014 skipping`);continue}let va=D_({cbk:se.callbackToken,rg:e.value,br:He(e),cid:je,b:xt.bindTo,d:xt.outputFile,cs:void 0,rqt:se.rqt});t.dispatchExecution(ga,{source_def:xt,base_ref:He(e),callback:{token:va,via:t.selfRef}}).catch(cr=>Ne(je,cr instanceof Error?cr.message:String(cr)))}})}async function _(){try{let S=()=>{let N=m(),{events:A}=c().readEntriesAfterCursor(N.lastDrainedJournalId);A.length<=0||(_(),t.requestProcessAccumulated?.())},k=await Qv(t.lock,f,S);return ve({ran:k!==!1})}catch(S){return _e(S)}}function g(){_(),t.requestProcessAccumulated?.()}function E(S){try{let k=S.params?.cardStoreRef;if(!k)return ae("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!w()){let fe=ld(I_);v({lastDrainedJournalId:"",graph:Go(fe)},null)}let N=S.params?.outputsStoreRef;if(!N)return ae("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let A=S.params?.scratchStoreRef,K=S.params?.archiveStoreRef,W=u();W.writeCardStoreRef(k),W.writeOutputsStoreRef(N),A&&W.writeScratchStoreRef(A),K&&W.writeArchiveStoreRef(K);let Y=S.body??{};Y["task-executor-ref"]&&W.writeTaskExecutorRef(Y["task-executor-ref"]),Object.prototype.hasOwnProperty.call(Y,"chat-handler-flow")&&W.writeChatHandlerFlow(Y["chat-handler-flow"]);try{d().writeStatusSnapshot(Uo(a,Vo(m().graph)))}catch{}return ve()}catch(k){return _e(k)}}function $(S){try{let k=d().readStatusSnapshot();if(!k){k=Uo(a,Vo(m().graph));try{d().writeStatusSnapshot(k)}catch{}}return ve(k)}catch(k){return _e(k)}}function y(S){try{let k=S.params?.id;return k?(h({type:"task-removal",taskName:k,timestamp:Ue()}),g(),ve()):ae("removeCard requires params.id")}catch(k){return _e(k)}}function p(S){try{let k=S.params?.id;return k?(h({type:"task-restart",taskName:k,timestamp:Ue()}),g(),ve()):ae("retrigger requires params.id")}catch(k){return _e(k)}}async function P(S){return _()}function j(S){try{let k=S.params?.cardId,N=S.params?.all,A=!!S.params?.restart;if(!k&&!N)return ae("upsertCard requires --card-id <id> or --all");let K=N?l().readAllCards().map(W=>W.id):[k];for(let W of K)if(!l().readCard(W))return ae(`Card "${W}" not found in board at ${e.value}`);for(let W of K){let Y=l().readCard(W),fe=q_(Y),xe=t.hashFn(fe),O=t.kvStorage("card-upsert"),C=O.read(W),D=C?.taskConfigHash!==xe;if(!(!D&&!A)){if(D){let Q=C?.blobRef??l().readCardKey(W)??W;h({type:"task-upsert",taskName:W,taskConfig:fe,timestamp:Ue()}),O.write(W,{blobRef:Q,taskConfigHash:xe,updatedAt:Ue()})}A&&h({type:"task-restart",taskName:W,timestamp:Ue()})}}return g(),ve()}catch(k){return _e(k)}}function x(S){try{let k=S.params?.token;if(!k)return ae("taskFailed requires params.token");let N=S.params?.error??"unknown error",A=yn(k);if(!A)return ae("Invalid callback token");h({type:"task-failed",taskName:A.taskName,error:N,timestamp:Ue()});try{b().stream("exec-history").append({taskName:A.taskName,status:"failed",error:N,completedAt:Ue()})}catch{}return g(),ve()}catch(k){return _e(k)}}function I(S){try{let k=S.params?.token;if(!k)return ae("taskProgress requires params.token");let N=(S.body??{}).update??{},A=yn(k);return A?(h({type:"task-progress",taskName:A.taskName,update:N,timestamp:Ue()}),g(),ve()):ae("Invalid callback token")}catch(k){return _e(k)}}function q(S){try{let k=S.params?.token,N=S.params?.ref;if(!k)return ae("sourceDataFetched requires params.token");if(!N)return ae("sourceDataFetched requires params.ref");let A=Ul(k);if(!A)return ae("Invalid source token");let{cbk:K,cid:W,b:Y,d:fe,cs:xe,rqt:O}=A,C=Dl(t.blobStorage("sources"),ne=>t.resolveBlob(ne)),D=t.genId();C.ingestSourceDataStaged(W,fe,$t(N),D);let Q=yn(K);if(!Q)return ae("Invalid callback token embedded in source token");let te=Ue();return h({type:"task-progress",taskName:Q.taskName,update:{bindTo:Y,outputFile:fe,fetchedAt:te,deliveryToken:D,sourceChecksum:xe,rqt:O},timestamp:te}),g(),ve()}catch(k){return _e(k)}}function V(S){try{let k=S.params?.token,N=S.params?.reason??"unknown";if(!k)return ae("sourceDataFetchFailure requires params.token");let A=Ul(k);if(!A)return ae("Invalid source token");let{cbk:K,b:W,d:Y,cs:fe,rqt:xe}=A,O=yn(K);return O?(h({type:"task-progress",taskName:O.taskName,update:{bindTo:W,outputFile:Y,failure:!0,reason:N,sourceChecksum:fe,rqt:xe},timestamp:Ue()}),g(),ve()):ae("Invalid callback token embedded in source token")}catch(k){return _e(k)}}function H(S){try{let k=u().readCardStoreRef();return k?ve({storeRef:k}):ae(`Board at ${e.value} has no card store configured`)}catch(k){return _e(k)}}function F(S){try{let k=u().readOutputsStoreRef();return k?ve({storeRef:k}):ae(`Board at ${e.value} has no outputs store configured`)}catch(k){return _e(k)}}function U(S){try{let k=u().readScratchStoreRef();return ve({storeRef:k})}catch(k){return _e(k)}}function G(S){try{let k=u().readArchiveStoreRef();return ve({storeRef:k})}catch(k){return _e(k)}}function re(S){try{let k=S.params?.key;if(!k)return ae("getConfig requires params.key");let N=u(),A;switch(k){case"task-executor":A=N.readTaskExecutorRef()??null;break;case"chat-handler-flow":A=N.readChatHandlerFlow()??null;break;case"card-store-ref":A=N.readCardStoreRef();break;case"outputs-store-ref":A=N.readOutputsStoreRef();break;case"scratch-store-ref":A=N.readScratchStoreRef();break;case"archive-store-ref":A=N.readArchiveStoreRef();break;default:return ae(`getConfig: unknown key "${k}"`)}return ve({value:A})}catch(k){return _e(k)}}function B(S){try{let k=S.params?.key;if(!k)return ae("getOutputsDataObject requires params.key");let N=d().readDataObject(k);return ve(N)}catch(k){return _e(k)}}function T(S){try{return ve(d().readAllDataObjects())}catch(k){return _e(k)}}function R(S){try{let k=S.params?.key;if(!k)return ae("getOutputsComputedValues requires params.key");let N=d().readComputedValues(k);return ve(N)}catch(k){return _e(k)}}function z(S){try{return ve(d().readAllComputedValues())}catch(k){return _e(k)}}return{init:E,status:$,getCardStoreRef:H,getOutputsStoreRef:F,getScratchStoreRef:U,getArchiveStoreRef:G,getConfig:re,getOutputsDataObject:B,getAllOutputsDataObjects:T,getOutputsComputedValues:R,getAllOutputsComputedValues:z,removeCard:y,retrigger:p,processAccumulatedEvents:P,upsertCard:j,taskFailed:x,taskProgress:I,sourceDataFetched:q,sourceDataFetchFailure:V}}function ir(e,t){let r=()=>gd(t.kvStorage("config"));function a(){let $=r().readCardStoreRef();if(!$)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let y=t.kvStorageForRef($);return{readIndex(){return y.read("_index")},writeIndex(p){y.write("_index",p)},readCard(p){return y.read(p)},writeCard(p,P){return y.write(p,P),t.hashFn(P)},removeCard(p){y.delete(p)},cardExists(p){return y.read(p)!==null},defaultCardKey(p){return p}}}let n=()=>hd(a(),t.onWarn??(()=>{})),s=()=>{let $=r().readScratchStoreRef();return $?t.scratchStorageForRef($):t.scratchStorage()};function o($,y){let p=t.validateSchema(y),P=[],j=r().readTaskExecutorRef();if(j&&Array.isArray(y.source_defs))for(let I of y.source_defs){let q=typeof I.bindTo=="string"?I.bindTo:"(unknown)";try{let V;try{V=t.invokeExecutorSync(j,"validate-source-def",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(I)})}catch(F){let U=F;if(V=typeof U?.stdout=="string"?U.stdout:"",!V.trim()){P.push(`source "${q}": executor validate-source-def failed \u2014 ${F instanceof Error?F.message:String(F)}`);continue}}let H=JSON.parse(V.trim());if(!H.ok&&Array.isArray(H.errors))for(let F of H.errors)P.push(`source "${q}": ${F}`)}catch(V){P.push(`source "${q}": executor validate-source-def failed \u2014 ${V instanceof Error?V.message:String(V)}`)}}let x=[...p.errors,...P];return ve({cardId:$,isValid:x.length===0,issues:x})}function u($,y){let p=r().readTaskExecutorRef();if(!p)throw new Error("No task-executor registered for this board");let P=typeof $.bindTo=="string"?$.bindTo:"source",j=s(),x={...$,boardDir:e.value,_projections:y},I=j.create(JSON.stringify(x,null,2),`probe-in-${P}`,".json"),q=j.getUniqueKey(`probe-out-${P}`,".json"),V=j.getUniqueKey(`probe-err-${P}`,".txt"),H=He(j.keyRef(I)),F=He(j.keyRef(q)),U=He(j.keyRef(V)),G=null;try{if(t.invokeExecutorSync(p,"run-source-fetch",["--in-ref",H,"--out-ref",F,"--err-ref",U],{timeout:$.timeout??t.executorTimeouts?.probeMs??6e4}),G=j.read(q),G===null)throw new Error("Executor produced no output file")}catch(re){let B=j.read(V)?.trim()??(re instanceof Error?re.message:String(re));throw new Error(`Probe failed: ${B}`)}finally{try{j.remove(I)}catch{}try{j.remove(V)}catch{}}return{bindTo:P,result:G}}function i($,y,p){let P;try{P=u($,y)}catch(j){return ae(j instanceof Error?j.message:String(j))}if(p){let j=$t(p);t.absoluteBlob.write(j.value,P.result)}return ve({bindTo:P.bindTo,resultSizeBytes:P.result.length})}function c($,y){let p=$.params?.sourceIdx,P=$.params?.outRef;if(p===void 0)return ae(`${y} requires params.sourceIdx`);if(!$.body||typeof $.body!="object"||Array.isArray($.body))return ae(`${y} requires card JSON object in body`);let j=$.body,x=j["card-content"]??j,I=j["mock-projections"]??{},q=x.source_defs??[];if(p<0||p>=q.length)return ae(`sourceIdx ${p} out of range (card has ${q.length} source(s))`);let V=q[p],H=typeof V.bindTo=="string"?V.bindTo:"source";return{src:V,bindTo:H,outRef:P,mockProjections:I}}function l($){try{let y=$.params?.cardId,p=$.params?.all;if(!y&&!p)return ae("validateCard requires --card-id <id> or --all");let P=p?n().readAllCards().map(x=>x.id):[y],j=[];for(let x of P){let I=n().readCard(x);if(!I){j.push({cardId:x,isValid:!1,issues:[`Card "${x}" not found`]});continue}let q=o(x,I);if(q.status!=="success")return q;j.push(q.data)}return ve(j)}catch(y){return _e(y)}}function d($){try{if(!$.body||typeof $.body!="object"||Array.isArray($.body))return ae("validateCardPreflight requires card JSON object in body");let y=$.body,p=y["card-content"]??y,P=typeof p.id=="string"?p.id:"(unknown)",j=o(P,p),x=r().readTaskExecutorRef();if(x)try{let I=t.invokeExecutorSync(x,"validate-card-preflight",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(p)}),q=JSON.parse(I.trim());if(!q.ok&&Array.isArray(q.errors)&&q.errors.length>0){let V=[...j.status==="success"?j.data.issues:[],...q.errors];return ve({cardId:P,isValid:!1,issues:V})}}catch{}return j}catch(y){return _e(y)}}function b($){try{let y=$.params?.cardId,p=$.params?.sourceIdx,P=$.params?.outRef;if(!y)return ae("probeSource requires params.cardId");if(p===void 0)return ae("probeSource requires params.sourceIdx");let j=($.body??{})["mock-projections"]??{},x=n().readCard(y);if(!x)return ae(`Card "${y}" not found`);let I=x.source_defs??[];return p<0||p>=I.length?ae(`sourceIdx ${p} out of range (card has ${I.length} source(s))`):i(I[p],j,P)}catch(y){return _e(y)}}function w($){try{let y=$.params?.outRef,p=$.body;if(!p)return ae('probeTmpSource requires body with "source-def" and "mock-projections"');let P=p["source-def"],j=p["mock-projections"]??{};return P?i(P,j,y):ae('probeTmpSource body requires "source-def"')}catch(y){return _e(y)}}function m($){try{let y=c($,"probeSourcePreflight");if("status"in y)return y;let p=r().readTaskExecutorRef();if(!p)return ae("No task-executor registered for this board");try{let P={...y.src,_projections:y.mockProjections},j=t.invokeExecutorSync(p,"probe-source-preflight",[],{timeout:y.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(P)}),x=JSON.parse(j.trim());return x.ok?ve({bindTo:y.bindTo,reachable:x.reachable,latencyMs:x.latencyMs,note:x.note}):ae(x.error??"Preflight probe failed")}catch{return ae("Executor does not support probe-source-preflight")}}catch(y){return _e(y)}}function v($){try{let y=c($,"runSourcePreflight");if("status"in y)return y;let p=r().readTaskExecutorRef();if(p)try{let I={...y.src,_projections:y.mockProjections},q=t.invokeExecutorSync(p,"run-source-preflight",[],{timeout:y.src.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(I)}),V=JSON.parse(q.trim());return V.ok?ve({bindTo:V.bindTo??y.bindTo,reachable:V.reachable,latencyMs:V.latencyMs,kind:V.kind,resultValue:V.resultValue,note:V.note}):ae(V.error??"Source preflight failed")}catch{}let P=Date.now(),j=u(y.src,y.mockProjections);if(y.outRef){let I=$t(y.outRef);t.absoluteBlob.write(I.value,j.result)}let x=j.result;try{x=JSON.parse(j.result)}catch{}return ve({bindTo:j.bindTo,reachable:!0,latencyMs:Date.now()-P,resultValue:x,note:"Actual fetch preflight passed"})}catch(y){return _e(y)}}function h($){try{let y=r().readTaskExecutorRef();if(!y)return ae("No task-executor registered for this board");let p=t.invokeExecutorSync(y,"describe-capabilities",[],{timeout:t.executorTimeouts?.describeMs??1e4});return ve(JSON.parse(p.trim()))}catch(y){return _e(y)}}function f($){try{let y=$.body;if(!y||!Array.isArray(y.ops))return ae("updatesInCardStore requires body.ops array");let p=y.ops,P=n();for(let j of p){let x=j.op,I=j.id;if(!I)return ae('op is missing "id"');if(x==="update"){let q=j["card-content"];if(!q)return ae(`update op for "${I}" is missing "card-content"`);P.writeCard(I,q)}else return ae(`Unknown op type: "${x??"(none)"}"`)}return ve()}catch(y){return _e(y)}}function _($){try{let y=$.body;if(!y||!Array.isArray(y.ids))return ae("readFromCardStore requires body.ids array");let p=y.ids,P=n(),j=p.map(x=>({id:x,"card-content":P.readCard(x)}));return ve({cards:j})}catch(y){return _e(y)}}function g($){try{if(!$.body||typeof $.body!="object"||Array.isArray($.body))return ae("evalCardCompute requires a JSON object in body");let y=$.body,p=y["card-content"]??y,P=typeof p.id=="string"?p.id:"(unknown)",j=y["mock-fetched-sources"]??{},x=y["mock-requires"]??{},I=p.compute;if(!I||!Array.isArray(I)||I.length===0)return ve({cardId:P,ok:!0,computed_values:{},errors:[]});let q={id:P,card_data:p.card_data??{},requires:x,source_defs:p.source_defs,compute:I},V=Cr.runSync(q,{sourcesData:j}),H=V.node.computed_values??{},F=V.errors??[];return ve({cardId:P,ok:F.length===0,computed_values:H,errors:F})}catch(y){return _e(y)}}function E($){try{if(!$.body||typeof $.body!="object"||Array.isArray($.body))return ae("simulateCardCycle requires a JSON object in body");let y=$.body,p=y["card-content"]??y,P=typeof p.id=="string"?p.id:"(unknown)",j=y["mock-fetched-sources"]??{},x=y["mock-requires"]??{},I=o(P,p),q=I.status==="success"?{isValid:I.data.isValid,issues:I.data.issues}:{isValid:!1,issues:[I.status==="fail"?I.error:"internal error"]},V=p.source_defs??[],H=p.card_data??{},F=[],U=[];if(V.length>0){F=Cr.enrichSourcesSync(V,{card_data:H,requires:x});for(let k of F){let N=k.projections,A=k._projections;if(N&&A){for(let K of Object.keys(N))if(A[K]===void 0){let W=typeof k.bindTo=="string"?k.bindTo:"(unknown)";U.push({bindTo:W,key:K,error:`Projection "${K}" resolved to undefined`})}}}}let G=[],re=y["task-executor-ref"],B=(re?.howToRun&&re?.whatToRun?re:void 0)??r().readTaskExecutorRef();for(let k=0;k<F.length;k++){let N=F[k],A=typeof N.bindTo=="string"?N.bindTo:`source_${k}`;if(!B){G.push({bindTo:A,skipped:!0,error:"No task executor configured"});continue}try{let K={...N},W=t.invokeExecutorSync(B,"run-source-preflight",[],{timeout:N.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(K)}),Y=JSON.parse(W.trim());G.push({bindTo:A,reachable:Y.reachable,latencyMs:Y.latencyMs,error:Y.ok?void 0:Y.error})}catch{G.push({bindTo:A,skipped:!0,error:"Executor does not support run-source-preflight"})}}let T=p.compute,R={},z=[];if(T&&Array.isArray(T)&&T.length>0){let k={id:P,card_data:H,requires:x,source_defs:p.source_defs,compute:T},N=Cr.runSync(k,{sourcesData:j});R=N.node.computed_values??{},z=N.errors??[]}let S=q.isValid&&U.length===0&&z.length===0&&G.every(k=>k.reachable!==!1);return ve({cardId:P,ok:S,validation:q,source_probes:G,projection_errors:U,computed_values:R,compute_errors:z})}catch(y){return _e(y)}}return{validateCard:l,validateCardPreflight:d,probeSource:b,probeTmpSource:w,probeSourcePreflight:m,runSourcePreflight:v,evalCardCompute:g,simulateCardCycle:E,describeTaskExecutorCapabilities:h,updatesInCardStore:f,readFromCardStore:_}}var M_=".board.lock";function F_(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function V_(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function _d(e){if(e)return e;let t=ad(import.meta.url),r=[t,Nt(t,"..","cli","node"),Nt(t,"..","..","cli","node")];for(let a of r)try{return od(a),a}catch{}throw new Error(`createFsBoardPlatformAdapter: could not resolve a public CLI directory from module dir ${t}`)}function $n(e,t,r){let{cliDir:a,opts:n}=F_(t,r),s=_d(a),o=e.value,u={meta:"board-live-cards",howToRun:"local-node",whatToRun:!n?.suppressSpawn&&od(s)?He({kind:"yaml-flow-cli",value:"board-live-cards-cli.js"}):"",...n?.notifyChannel?{extra:{notifyChannel:n.notifyChannel}}:{}};return{kvStorage:i=>Nl(Nt(o,`.${i}`)),blobStorage:i=>_n(i?Nt(o,i):o),scratchStorage:()=>Mo(Nt(o,".tmp")),scratchStorageForRef:i=>Mo($t(i).value),archiveFactory:()=>Fo(Nt(o,"archive")),archiveFactoryForRef:i=>Fo($t(i).value),journalAdapter:()=>O0(o),lock:N0(Nt(o,M_)),selfRef:u,async dispatchExecution(i,c){if(n?.suppressSpawn)return{dispatched:!1};try{let l=c.source_def?.bindTo??kl().slice(0,8),d=Mo(Nt(o,".tmp")),b=d.create(JSON.stringify(c,null,2),`exec-in-${l}`,".json"),w=d.getUniqueKey(`exec-out-${l}`,".json"),m=d.getUniqueKey(`exec-err-${l}`,".txt"),v=He(d.keyRef(b)),h=He(d.keyRef(w)),f=He(d.keyRef(m));return _0(i,{subcommand:"run-source-fetch",inRef:v,outRef:h,errRef:f},s),{dispatched:!0}}catch(l){let d=l instanceof Error?l.message:String(l);try{let b=Fo(Nt(o,"archive")),w=new Date().toISOString().replace(/[:.]/g,"-"),m=c.source_def?.bindTo??"unknown";b.blob("exec-failures").write(`${w}-${m}.json`,JSON.stringify({error:d,args:c,ref:i,at:new Date().toISOString()},null,2))}catch{}return{dispatched:!1,error:d}}},resolveBlob(i){let c=Xv(i.value)?ud().read(i.value):_n(o).read(i.value);if(c===null)throw new Error(`resolveBlob: blob not found: ::${i.kind}::${i.value}`);return c},hashFn:j0,genId:()=>e0(`${Date.now()}-${Math.random()}`).slice(0,32),kvStorageForRef:i=>Nl($t(i).value),requestProcessAccumulated(){n?.suppressSpawn||n0(s,e,n?.notifyChannel)},publishBoardChangeNotifications(i){if(!n?.notifyChannel||i.length===0)return;let c=i.map(l=>({id:kl(),ts:new Date().toISOString(),boardRef:He(e),notification:l}));o0(n.notifyChannel,c,n.onWarn)},onWarn:n?.onWarn}}function ur(e,t,r){let{cliDir:a,opts:n}=V_(t,r),s=_d(a),o=$n(e,s,n),u=i0();return{...o,invokeExecutorSync(i,c,l,d){let{command:b,baseArgs:w}=g0(i,s),m=i.extra?["--extra",Buffer.from(JSON.stringify(i.extra)).toString("base64")]:[];return u.executeSync(b,[...w,c,...l,...m],{timeout:d?.timeout??3e4,encoding:"utf-8",input:d?.input})},validateSchema(i){let c=F0(i);return{ok:c.errors.length===0,errors:c.errors}},absoluteBlob:ud()}}function Hl(e){try{let t=JSON.parse(Buffer.from(e,"base64url").toString());return typeof t.br=="string"?t.br:null}catch{return null}}var _t=ad(import.meta.url);function De(e,t,r){let a=e.indexOf(t),n=a!==-1?e[a+1]:void 0;if(!n)throw new Error(`Missing ${t}
29
29
  Usage: ${r}`);return n}function nt(e,t){let r=e.indexOf(t);return r!==-1?e[r+1]:void 0}function be(e){console.log(JSON.stringify(e,null,2))}async function Ht(){if(process.stdin.isTTY)return;let e=[];for await(let r of process.stdin)e.push(Buffer.isBuffer(r)?r:Buffer.from(r));let t=Buffer.concat(e).toString("utf-8").trim();if(t)return JSON.parse(t)}async function z_(e){let t=e[0],r=e.slice(1);if(t==="help"||t==="--help"||t==="-h"){console.log("board-live-cards \u2014 see board-live-cards-cli-PARAMS.md for command reference");return}let a=nt(r,"--base-ref"),n=nt(r,"--notify-channel"),s=a?$t(a):void 0;if(t==="source-data-fetched"){let i=De(r,"--token","source-data-fetched --token <token> --ref <sourcefile>"),c=De(r,"--ref","source-data-fetched --token <token> --ref <sourcefile>"),l=Hl(i);if(!l)throw new Error("source-data-fetched: could not decode board ref from token \u2014 is this a valid source token?");let d=$t(l),b=Ho(d,$n(d,_t,{onWarn:console.warn,notifyChannel:n}));be(b.sourceDataFetched({params:{token:i,ref:c}}));return}if(t==="source-data-fetch-failure"){let i=De(r,"--token","source-data-fetch-failure --token <token> [--reason <message>]"),c=Hl(i);if(!c)throw new Error("source-data-fetch-failure: could not decode board ref from token \u2014 is this a valid source token?");let l=$t(c),d=Ho(l,$n(l,_t,{onWarn:console.warn,notifyChannel:n})),b={token:i},w=nt(r,"--reason");w&&(b.reason=w),be(d.sourceDataFetchFailure({params:b}));return}if(t==="validate-card-preflight"){let i=s??{kind:"fs-path",value:Lt(".")},c=ir(i,ur(i,_t,{onWarn:console.warn})),l=await Ht();be(c.validateCardPreflight({body:l}));return}if(t==="probe-source-preflight"){let i=De(r,"--source-idx","probe-source-preflight --source-idx <n>"),c=nt(r,"--out-ref"),l=s??{kind:"fs-path",value:Lt(".")},d=ir(l,ur(l,_t,{onWarn:console.warn})),b=await Ht(),w={sourceIdx:parseInt(i,10)};c&&(w.outRef=c),be(d.probeSourcePreflight({params:w,body:b}));return}if(t==="run-source-preflight"){let i=De(r,"--source-idx","run-source-preflight --source-idx <n>"),c=nt(r,"--out-ref"),l=s??{kind:"fs-path",value:Lt(".")},d=ir(l,ur(l,_t,{onWarn:console.warn})),b=await Ht(),w={sourceIdx:parseInt(i,10)};c&&(w.outRef=c),be(d.runSourcePreflight({params:w,body:b}));return}if(t==="eval-card-compute"){let i=s??{kind:"fs-path",value:Lt(".")},c=ir(i,ur(i,_t,{onWarn:console.warn})),l=await Ht();be(c.evalCardCompute({body:l}));return}if(t==="simulate-card-cycle"){let i=s??{kind:"fs-path",value:Lt(".")},c=ir(i,ur(i,_t,{onWarn:console.warn})),l=await Ht();be(c.simulateCardCycle({body:l}));return}if(t==="probe-tmp-source"){let i=De(r,"--out-ref","probe-tmp-source --out-ref <ref>"),c=s??{kind:"fs-path",value:Lt(".")},l=ir(c,ur(c,_t,{onWarn:console.warn})),d=await Ht();be(l.probeTmpSource({params:{outRef:i},body:d}));return}if(!s)throw new Error(`--base-ref is required for command "${t??"(none)"}"`);let o=()=>Ho(s,$n(s,_t,{onWarn:console.warn,notifyChannel:n})),u=()=>ir(s,ur(s,_t,{onWarn:console.warn}));switch(t){case"init":{let i=De(r,"--card-store-ref","init --base-ref <ref> --card-store-ref <b64-ref> --outputs-store-ref <b64-ref>"),c=De(r,"--outputs-store-ref","init --base-ref <ref> --card-store-ref <b64-ref> --outputs-store-ref <b64-ref>"),l=nt(r,"--scratch-store-ref"),d=nt(r,"--archive-store-ref"),b=await Ht();be(o().init({params:{cardStoreRef:i,outputsStoreRef:c,...l?{scratchStoreRef:l}:{},...d?{archiveStoreRef:d}:{}},body:b}));return}case"status":{be(o().status({}));return}case"get-card-store-ref":{be(o().getCardStoreRef({}));return}case"get-outputs-store-ref":{be(o().getOutputsStoreRef({}));return}case"get-scratch-store-ref":{be(o().getScratchStoreRef({}));return}case"get-archive-store-ref":{be(o().getArchiveStoreRef({}));return}case"get-outputs":{let i=De(r,"--type","get-outputs --base-ref <ref> --type <data-object|computed-values> [--key <key>] [--all]"),c=r.includes("--all");if(i==="data-object")if(c)be(o().getAllOutputsDataObjects({}));else{let l=De(r,"--key","get-outputs --type data-object --base-ref <ref> --key <datakey>");be(o().getOutputsDataObject({params:{key:l}}))}else if(i==="computed-values")if(c)be(o().getAllOutputsComputedValues({}));else{let l=De(r,"--key","get-outputs --type computed-values --base-ref <ref> --key <card-id>");be(o().getOutputsComputedValues({params:{key:l}}))}else throw new Error(`get-outputs: unknown --type "${i}", expected data-object | computed-values`);return}case"remove-card":{let i=De(r,"--id","remove-card --base-ref <ref> --id <card-id>");be(o().removeCard({params:{id:i}}));return}case"retrigger":{let i=De(r,"--id","retrigger --base-ref <ref> --id <card-id>");be(o().retrigger({params:{id:i}}));return}case"process-accumulated-events":{be(await o().processAccumulatedEvents({}));return}case"upsert-card":{let i=nt(r,"--card-id"),c=r.includes("--all"),l=r.includes("--restart");if(!i&&!c)throw new Error("upsert-card requires --card-id <id> or --all");let d={};i&&(d.cardId=i),c&&(d.all=!0),l&&(d.restart=!0),be(o().upsertCard({params:d}));return}case"task-failed":{let i={token:De(r,"--token","task-failed --base-ref <ref> --token <token> [--error <message>]")},c=nt(r,"--error");c&&(i.error=c),be(o().taskFailed({params:i}));return}case"task-progress":{let i=De(r,"--token","task-progress --base-ref <ref> --token <token> [--update <json>]"),c=nt(r,"--update"),l=c?JSON.parse(c):{};be(o().taskProgress({params:{token:i},body:{update:l}}));return}case"validate-card":{let i=nt(r,"--card-id"),c=r.includes("--all");if(!i&&!c)throw new Error("validate-card requires --card-id <id> or --all");let l={};i&&(l.cardId=i),c&&(l.all=!0),be(u().validateCard({params:l}));return}case"probe-source":{let i=De(r,"--card-id","probe-source --base-ref <ref> --card-id <id> --source-idx <n> --out-ref <ref>"),c=De(r,"--source-idx","probe-source --base-ref <ref> --card-id <id> --source-idx <n> --out-ref <ref>"),l=nt(r,"--out-ref"),d=await Ht(),b={cardId:i,sourceIdx:parseInt(c,10)};l&&(b.outRef=l),be(u().probeSource({params:b,body:d}));return}case"describe-task-executor-capabilities":{be(u().describeTaskExecutorCapabilities({}));return}default:throw new Error(`Unknown command: ${t??"(none)"}`)}}var U_=process.argv[1]&&Lt(process.argv[1])===Lt(new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"));U_&&z_(process.argv.slice(2)).catch(e=>{let t=e instanceof Error?e.message:String(e);console.error(t),process.exit(1)});export{z_ as cli};
@@ -19,8 +19,8 @@
19
19
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
20
20
  <script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
21
21
  <script src="https://cdn.jsdelivr.net/npm/leader-line/leader-line.min.js"></script>
22
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.12/browser/live-cards.js"></script>
23
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.12/browser/board-livecards-client.js"></script>
22
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.13/browser/live-cards.js"></script>
23
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.13/browser/board-livecards-client.js"></script>
24
24
  </head>
25
25
  <body class="bg-light">
26
26
  <div class="container-fluid py-3">
@@ -37,8 +37,8 @@
37
37
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
38
38
  <script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
39
39
  <script src="https://cdn.jsdelivr.net/npm/leader-line/leader-line.min.js"></script>
40
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.12/browser/live-cards.js"></script>
41
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.12/browser/board-livecards-client.js"></script>
40
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.13/browser/live-cards.js"></script>
41
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.13/browser/board-livecards-client.js"></script>
42
42
  </head>
43
43
  <body class="bg-light">
44
44
  <div class="container-fluid py-3">
@@ -6,13 +6,13 @@
6
6
  <title>Example Board Demo (LocalStorage Runtime)</title>
7
7
  <link rel="icon" type="image/svg+xml" href="../../browser/favicon.svg" />
8
8
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" />
9
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.12/browser/compute-jsonata.js"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.13/browser/compute-jsonata.js"></script>
10
10
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
11
11
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
12
12
  <script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
13
13
  <script src="https://cdn.jsdelivr.net/npm/leader-line/leader-line.min.js"></script>
14
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.12/browser/live-cards.js"></script>
15
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.12/browser/board-livecards-localstorage.js"></script>
14
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.13/browser/live-cards.js"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.13/browser/board-livecards-localstorage.js"></script>
16
16
  </head>
17
17
  <body class="bg-light">
18
18
  <div class="container-fluid py-3">