yaml-flow 8.0.4 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,6 @@ import {spawnSync,spawn,execFile,execFileSync}from'child_process';import*as P fr
9
9
  `)+`
10
10
  `,s=Or.get(e);if(s&&!s.socket.destroyed){s.ready?s.socket.write(n):s.queue.push(n);return}let o=Yc(e),a=Ho.createConnection(o);s={socket:a,ready:false,queue:[n]},Or.set(e,s),a.on("connect",()=>{s.ready=true;for(let i of s.queue)a.write(i);s.queue.length=0;}),a.on("error",i=>{r?.(`[named-pipe publish] ${o}: ${i instanceof Error?i.message:String(i)}`),Or.delete(e);}),a.on("close",()=>{Or.delete(e);});}function Nr(){return {executeSync(e,t,r){return Qo({command:e,args:t,cwd:r?.cwd,timeoutMs:r?.timeout,env:r?.env},{encoding:r?.encoding,input:r?.input})},executeAsync(e,t,r){Wc({command:e,args:t},r);},resolveInvocation(e,t){let r=zc({command:e,args:t});return {cmd:r.command,args:r.args??[]}},splitCommand:Xo,spawnDetached(e,t){jr({command:e,args:t});}}}var ra=dirname(fileURLToPath(import.meta.url)),td=createRequire(import.meta.url);function rd(){let e=resolve(ra,"./jsonata-sync.cjs");return existsSync(e)?e:resolve(ra,"../../card-compute/jsonata-sync.cjs")}var mt=td(rd());function Dn(e,t,r){if(!e||typeof e!="object")return {};let n={};if(Array.isArray(e.cmdTemplate)){let s=[];for(let o of e.cmdTemplate)try{s.push(String(mt(o).evaluate(t)));}catch(a){let i=a instanceof Error?a.message:String(a);throw new Error(`[${r}] argsMassaging.cmdTemplate failed on "${o}": ${i}`)}n.cmdArgs=s;}if(typeof e.stdinTemplate=="string")try{n.stdin=mt(e.stdinTemplate).evaluate(t);}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`[${r}] argsMassaging.stdinTemplate failed: ${o}`)}if(typeof e.urlTemplate=="string")try{n.url=String(mt(e.urlTemplate).evaluate(t));}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`[${r}] argsMassaging.urlTemplate failed: ${o}`)}if(typeof e.headerTemplate=="string")try{let s=mt(e.headerTemplate).evaluate(t);if(typeof s!="object"||s===null)throw new Error(`headerTemplate must produce an object, got: ${JSON.stringify(s)}`);n.headers=s;}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`[${r}] argsMassaging.headerTemplate failed: ${o}`)}if(typeof e.bodyTemplate=="string")try{n.body=mt(e.bodyTemplate).evaluate(t);}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`[${r}] argsMassaging.bodyTemplate failed: ${o}`)}return n}function nd(e,t){let r=typeof e=="object"?e.value:Re(e).value;switch(r){case "source-cli-task-executor":{let n=ue.join(t,"source-cli-task-executor.js");if(P.existsSync(n))return {command:process.execPath,args:[n]};let s=ue.join(t,"source-cli-task-executor.ts"),o=ue.join(t,"..","..","node_modules","tsx","dist","cli.mjs"),a=ue.join(t,"..","..","node_modules",".bin","tsx"),i=P.existsSync(o)?o:a;return P.existsSync(s)&&P.existsSync(i)?{command:process.execPath,args:[i,s]}:{command:process.execPath,args:[n]}}case "board-live-cards":{let{cmd:n,args:s}=Nn(t,"_",[]);return {command:n,args:s}}default:throw new Error(`resolveBuiltIn: unknown built-in name "${r}". Supported: source-cli-task-executor, board-live-cards`)}}function sa(e,t){if(e.howToRun==="built-in"){let{command:n,args:s}=nd(e.whatToRun,t);return {command:n,baseArgs:s}}let r=typeof e.whatToRun=="object"?e.whatToRun.value:Re(e.whatToRun).value;switch(e.howToRun){case "local-node":return {command:process.execPath,baseArgs:[r]};case "local-python":return {command:process.platform==="win32"?"python":"python3",baseArgs:[r]};case "local-process":return {command:r,baseArgs:[]};default:throw new Error(`resolveBaseInvocation: howToRun "${e.howToRun}" is not a local transport`)}}function sd(e,t){let r=[e.subcommand];return e.inRef&&r.push("--in-ref",e.inRef),e.outRef&&r.push("--out-ref",e.outRef),e.errRef&&r.push("--err-ref",e.errRef),t&&r.push("--extra",Buffer.from(JSON.stringify(t)).toString("base64")),r}function od(e,t){return {subcommand:e.subcommand,...e.inRef?{inRef:e.inRef}:{},...e.outRef?{outRef:e.outRef}:{},...e.errRef?{errRef:e.errRef}:{},...t?{extra:t}:{}}}function Fn(e,t){return sa(e,t)}function oa(e){let t=e.trim();if(!t)throw new Error("empty stdout");try{return JSON.parse(t)}catch{let r=t.split(/\r?\n/).filter(Boolean),n=r[r.length-1];return JSON.parse(n)}}function aa(e){let t=e.whatToRun;return typeof t=="object"?t.value:Re(t).value}function ia(e,t){return {...t,whatToRun:aa(e),...e.extra?{extra:e.extra}:{}}}function Mn(e,t,r="invokeExecutionRef"){return Dn(e,t,r)}function ua(e){return e&&typeof e=="object"&&!Array.isArray(e)&&typeof e.result=="string"&&e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?e:{result:"success",data:e&&typeof e=="object"&&!Array.isArray(e)?e:{stdout:e}}}function Ye(e){return {result:"failure",data:{error:e}}}function We(e,t,r){let n=r?.label??"invokeExecutionRefSync",s=r?.cliDir??r?.cwd??process.cwd(),o;try{o=Mn(e.argsMassaging,ia(e,t),n);}catch(d){let y=d instanceof Error?d.message:String(d);return Ye(y)}let a;try{a=Fn(e,s);}catch(d){let y=d instanceof Error?d.message:String(d);return Ye(`[${n}] ref resolution failed: ${y}`)}let i=[...a.baseArgs,...o.cmdArgs??[]],u=JSON.stringify(o.stdin??t),c=Nr(),l;try{l=c.executeSync(a.command,i,{timeout:r?.timeoutMs??3e4,encoding:"utf-8",cwd:r?.cwd,input:u});}catch(d){let y=d,g=(y.stderr?String(y.stderr):"").trim(),f=typeof y.status=="number"?y.status:"unknown",p=g||y.message;return Ye(`[${n}] ref exited with status ${f}${p?`: ${p}`:""}`)}try{return ua(oa(l))}catch{return {result:"success",data:{stdout:l.trim()}}}}async function na(e,t,r){let n=r?.label??"invokeExecutionRef",s;try{s=Mn(e.argsMassaging,ia(e,t),n);}catch(c){let l=c instanceof Error?c.message:String(c);return Ye(l)}let o=aa(e),a=s.headers?{"Content-Type":"application/json",...s.headers}:{"Content-Type":"application/json"},i=s.url??o,u;if(e.howToRun==="http:get"){let c=s.body&&typeof s.body=="object"&&!Array.isArray(s.body)?s.body:t,l=new URLSearchParams(Object.entries(c).filter(([,d])=>d!=null).map(([d,y])=>[d,String(y)]));l.size>0&&(i=`${i}${i.includes("?")?"&":"?"}${l.toString()}`);}else u=JSON.stringify(s.body??t);try{let c=await fetch(i,{method:e.howToRun==="http:get"?"GET":"POST",headers:a,body:u});if(!c.ok){let d=await c.text().catch(()=>"");return Ye(`[${n}] HTTP ${c.status}${d?`: ${d}`:""}`)}let l=await c.text();if(!l.trim())return {result:"success",data:{}};try{return ua(oa(l))}catch{return {result:"success",data:{stdout:l.trim()}}}}catch(c){let l=c instanceof Error?c.message:String(c);return Ye(`[${n}] ${l}`)}}var ad={"local-node":async(e,t,r)=>We(e,t,r),"local-python":async(e,t,r)=>We(e,t,r),"local-process":async(e,t,r)=>We(e,t,r),"built-in":async(e,t,r)=>We(e,t,r),"http:post":na,"http:get":na},id={"local-node":We,"local-python":We,"local-process":We,"built-in":We};async function ca(e,t,r){let n=r?.transports?.[e.howToRun]??ad[e.howToRun];return n?n(e,t,r):Ye(`[${r?.label??"invokeExecutionRef"}] unsupported howToRun: ${e.howToRun}`)}function Ln(e,t,r){let n=r?.syncTransports?.[e.howToRun]??id[e.howToRun];return n?n(e,t,r):Ye(`[${r?.label??"invokeExecutionRefSync"}] unsupported sync howToRun: ${e.howToRun}`)}function ud(e){return {invoke(t,r){return ca(t,r,e)},invokeSync(t,r){return Ln(t,r,e)}}}function cd(e,t,r){return Ln(e,t,r)}async function dd(e,t){let r={...t,whatToRun:e.whatToRun},n=Dn(e.argsMassaging,r,"_invokeTaskExecutorHttp"),s=n.url??(typeof e.whatToRun=="object"?e.whatToRun.value:Re(e.whatToRun).value),o=n.body?n.body:od(t,e.extra),a={"Content-Type":"application/json"},i=n.headers?{...a,...n.headers}:a,u=await fetch(s,{method:e.howToRun==="http:get"?"GET":"POST",headers:i,body:JSON.stringify(o)});if(!u.ok){let l=await u.text().catch(()=>"");return {status:"error",error:`HTTP ${u.status}: ${l}`}}let c=await u.json().catch(()=>null);return c&&typeof c.status=="string"?c:{status:"success"}}function da(e,t,r){if(e.howToRun==="http:post"||e.howToRun==="http:get"){dd(e,t).catch(i=>{console.error(`[dispatchTaskExecutorDetached] HTTP dispatch failed: ${i.message}`);});return}let{command:s,baseArgs:o}=sa(e,r),a=sd(t,e.extra);jr({command:s,args:[...o,...a]});}function ld(){return {read(e){if(!P.existsSync(e))return null;try{return P.readFileSync(e,"utf-8")}catch{return null}},write(e,t){P.mkdirSync(ue.dirname(e),{recursive:true}),P.writeFileSync(e,t,"utf-8");}}}function la(e){return ld();}function Wt(e,t){if(process.platform!=="win32"){P.renameSync(e,t);return}let r=[10,20,40,80,160];for(let n=0;n<=r.length;n++)try{P.renameSync(e,t);return}catch(s){let o=s.code;if((o==="EPERM"||o==="EBUSY")&&n<r.length){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,r[n]);continue}throw s}}function qr(e){function t(s){return ue.join(e,...s.split("/"))}function r(s){return ue.relative(e,s).replace(/\\/g,"/")}function n(s,o){if(P.existsSync(s))for(let a of P.readdirSync(s,{withFileTypes:true})){let i=ue.join(s,a.name);if(a.isDirectory()){n(i,o);continue}a.isFile()&&o.push(r(i));}}return {read(s){let o=t(s);if(!P.existsSync(o))return null;try{return P.readFileSync(o,"utf-8")}catch{return null}},write(s,o){let a=t(s),i=`${a}.${process.pid}.${randomUUID()}.tmp`;P.mkdirSync(ue.dirname(a),{recursive:true}),P.writeFileSync(i,o,"utf-8"),Wt(i,a);},exists(s){return P.existsSync(t(s))},remove(s){let o=t(s);try{P.existsSync(o)&&P.unlinkSync(o);}catch{}},readBytes(s){let o=t(s);if(!P.existsSync(o))return null;try{return new Uint8Array(P.readFileSync(o))}catch{return null}},writeBytes(s,o){let a=t(s),i=`${a}.${process.pid}.${randomUUID()}.tmp`;P.mkdirSync(ue.dirname(a),{recursive:true}),P.writeFileSync(i,Buffer.from(o)),Wt(i,a);},listKeys(s){let o=[];n(e,o);let a=o.sort();return s?a.filter(i=>i.startsWith(s)):a},stat(s){let o=t(s);if(!P.existsSync(o))return null;try{let a=P.statSync(o);return {key:s,size:Number(a.size||0),updatedAt:new Date(a.mtimeMs).toISOString()}}catch{return null}}}}function Gn(){return {read(e){if(!P.existsSync(e))return null;try{return P.readFileSync(e,"utf-8")}catch{return null}},write(e,t){let r=`${e}.${process.pid}.${randomUUID()}.tmp`;P.mkdirSync(ue.dirname(e),{recursive:true}),P.writeFileSync(r,t,"utf-8"),Wt(r,e);},exists(e){return P.existsSync(e)},remove(e){try{P.existsSync(e)&&P.unlinkSync(e);}catch{}},readBytes(e){if(!P.existsSync(e))return null;try{return new Uint8Array(P.readFileSync(e))}catch{return null}},writeBytes(e,t){let r=`${e}.${process.pid}.${randomUUID()}.tmp`;P.mkdirSync(ue.dirname(e),{recursive:true}),P.writeFileSync(r,Buffer.from(t)),Wt(r,e);},stat(e){if(!P.existsSync(e))return null;try{let t=P.statSync(e);return {key:e,size:Number(t.size||0),updatedAt:new Date(t.mtimeMs).toISOString()}}catch{return null}}}}function Kn(e){function t(n){return ue.join(e,...n.split("/"))+".json"}function r(n,s,o,a){if(P.existsSync(n))for(let i of P.readdirSync(n,{withFileTypes:true})){let u=s?`${s}/${i.name}`:i.name;if(i.isDirectory()){r(ue.join(n,i.name),u,o,a);continue}if(!i.isFile()||!i.name.endsWith(".json"))continue;let c=u.replace(/\.json$/,"");(!o||c.startsWith(o))&&a.push(c);}}return {read(n){let s=t(n);if(!P.existsSync(s))return null;try{return JSON.parse(P.readFileSync(s,"utf-8"))}catch{return null}},write(n,s){let o=t(n),a=`${o}.${process.pid}.${randomUUID()}.tmp`;P.mkdirSync(ue.dirname(o),{recursive:true}),P.writeFileSync(a,JSON.stringify(s,null,2),"utf-8"),Wt(a,o);},delete(n){let s=t(n);try{P.existsSync(s)&&P.unlinkSync(s);}catch{}},listKeys(n){let s=[];return r(e,"",n,s),s.sort()}}}function Bn(e){if(e==null||typeof e!="object")return JSON.stringify(e);if(Array.isArray(e))return `[${e.map(Bn).join(",")}]`;let t=e;return `{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Bn(t[n])}`).join(",")}}`}function fa(e){return createHash("sha256").update(Bn(e)).digest("hex")}function pa(e){let t=ue.join(e,"board-journal.jsonl");return {readAllEntries(){if(!P.existsSync(t))return [];let r=P.readFileSync(t,"utf-8").trim();return r?r.split(`
11
11
  `).filter(Boolean).map(n=>JSON.parse(n)):[]},appendEntry(r){P.appendFileSync(t,JSON.stringify(r)+`
12
- `,"utf-8");},generateId(){return randomUUID()}}}function ma(e){return {tryAcquire(){try{if(!P.existsSync(e)){P.mkdirSync(ue.dirname(e),{recursive:!0});try{P.writeFileSync(e,"{}",{flag:"wx"});}catch{}}return lockSync(e,{retries:0})}catch{return null}}}}var ha={$schema:"http://json-schema.org/draft-07/schema#",$id:"https://nsreehari.github.io/boards/live-cards.schema.json",definitions:{bind_ref:{description:"A card data path reference, e.g. 'card_data.raw_quotes' or 'requires.upstream'",type:"string",pattern:"^(card_data|requires|fetched_sources|computed_values)(\\.|$)"},bind_or_literal:{description:"A literal value or a bind reference object",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref"}},required:["bind"]}]},compute_expr:{description:"A declarative JSON compute expression",type:"object",required:["fn"],properties:{fn:{type:"string",description:"Function name from the built-in vocabulary",enum:["sum","avg","min","max","count","first","last","add","sub","mul","div","round","abs","mod","gt","gte","lt","lte","eq","neq","if","and","or","not","concat","upper","lower","template","filter","pluck","map","sort","slice","flat","unique","group","get","default","now","diff_days","format_date"]},input:{description:"card_data.path, literal, array of inputs, or nested compute_expr",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{$ref:"#/definitions/compute_expr"}]},field:{type:"string",description:"For pluck/sum/group \u2014 the object key to extract"},where:{$ref:"#/definitions/compute_expr",description:"For filter \u2014 predicate expression ($ = current item)"},cond:{$ref:"#/definitions/compute_expr",description:"For if \u2014 condition expression"},then:{description:"For if \u2014 value when cond is truthy"},else:{description:"For if \u2014 value when cond is falsy"},format:{type:"string",description:"For format_date \u2014 date format string"}}},meta:{type:"object",properties:{title:{type:"string"},tags:{type:"array",items:{type:"string"}}}},requires:{type:"array",items:{type:"string"},description:"IDs of upstream nodes this node depends on"},provides:{type:"array",items:{type:"object",required:["bindTo","ref"],properties:{bindTo:{type:"string",description:"Token name published downstream"},ref:{type:"string",description:"Path to read value from (card_data.*, requires.*, fetched_sources.*, computed_values.*)"}}},description:"Explicit bindings exposing computed or card_data values downstream as named tokens"},compute_step:{description:"A single ordered compute step: reads card_data.*/requires.*/computed_values.*, writes to computed_values[bindTo]",type:"object",required:["bindTo","expr"],properties:{bindTo:{type:"string",description:"Key in computed_values to write result"},expr:{type:"string",description:"JSONata expression evaluated against { card_data, requires, fetched_sources, computed_values }"}}},source_def:{description:"One source entry. The engine requires 'bindTo' (compute namespace key) and 'outputFile' (delivery signal path). bindTo and outputFile must be unique across all source_defs in a card. Every other property is yours \u2014 add whatever your task-executor needs: kind, url, headers, mailbox, channel, model, query, etc. The full object is passed verbatim as the --in JSON to the executor.",type:"object",required:["bindTo","outputFile"],additionalProperties:true,properties:{bindTo:{type:"string",description:"Key under fetched_sources.* available in compute expressions"},outputFile:{type:"string",description:"Board-relative path the executor writes its JSON result to. Presence of this file signals delivery."},projections:{type:"object",description:"Named data projections from card_data or requires, evaluated before the executor is called. Each key is a ref name; each value is a JSONata expression rooted at card_data or requires. The resolved values are passed to the executor as _projections. fetched_sources, computed_values, and source_defs are not accessible here \u2014 sources run before those exist.",additionalProperties:{type:"string"}},optionalForCompletionGating:{type:"boolean",default:false,description:"When true this source does not gate card completion. Default false when absent, so source_defs are completion-gating by default."},timeout:{type:"integer",minimum:0,default:12e4,description:"Executor/script timeout in ms. Default: 120 000 (2 min)."},script:{type:"string",description:"Legacy direct-run: shell command executed when no .task-executor is registered. stdout is captured as the result."}}},render_element:{type:"object",required:["kind"],properties:{id:{type:"string",description:"Optional element ID for targeted updates"},kind:{enum:["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]},label:{type:"string",description:"Heading above this element"},className:{type:"string",description:"Bootstrap grid class, e.g. 'col-12 col-md-6'"},visible:{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 element shown only if truthy"},data:{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref",description:"card_data/requires/fetched_sources/computed_values path to read data from"},writeTo:{$ref:"#/definitions/bind_ref",description:"card_data path for user input (form, filter, todo, notes)"},columns:{type:"array",items:{type:"string"},description:"table: visible columns"},maxRows:{type:"integer",description:"table/list: max rows to display"},sortable:{type:"boolean",default:true,description:"table: enable click-to-sort"},placeholder:{type:"string",description:"Empty-state message"},chartType:{enum:["bar","line","pie","doughnut"]},chartOptions:{type:"object",description:"Chart.js options passthrough"},fields:{type:"object",description:"JSON Schema for form/filter fields"},thresholds:{type:"object",properties:{green:{type:"string"},amber:{type:"string"}}},colorMap:{type:"object",description:"badge: value \u2192 Bootstrap color"},style:{enum:["heading","muted","default"],description:"text: display style"},upload:{type:"boolean",default:true,description:"file-upload: show drop zone (false = read-only file list)"},accept:{type:"array",items:{type:"string"},description:"file-upload: allowed extensions"},multiple:{type:"boolean",default:true,description:"file-upload: allow multiple files"},fileAttach:{type:"boolean",default:false,description:"chat: enable inline file attachments"},fileAccept:{type:"array",items:{type:"string"},description:"chat: allowed attachment extensions"},buttons:{type:"array",description:"actions: button definitions",items:{type:"object",required:["id","label"],properties:{id:{type:"string"},label:{type:"string"},style:{type:"string",description:"Bootstrap button variant, e.g. 'success', 'outline-danger'"},size:{type:"string",default:"sm"},disabled:{oneOf:[{type:"boolean"},{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 truthy = disabled"}]}}}}}}}},view:{type:"object",required:["elements"],properties:{elements:{type:"array",minItems:1,items:{$ref:"#/definitions/render_element"}},layout:{type:"object",properties:{board:{type:"object",properties:{col:{type:"integer",minimum:1,maximum:12},order:{type:"integer"}}},canvas:{type:"object",properties:{x:{type:"number"},y:{type:"number"},w:{type:"number"},h:{type:"number"}}}}},features:{type:"object",properties:{chat:{type:"boolean",default:false},notes:{type:"boolean",default:false},refresh:{type:"boolean",default:true}}}}}},title:"LiveCard",description:"A unified card node. Behavior depends on which sections are present (source_defs, compute, view, etc.)",type:"object",required:["id"],additionalProperties:false,properties:{id:{type:"string"},requires:{$ref:"#/definitions/requires"},provides:{$ref:"#/definitions/provides"},meta:{$ref:"#/definitions/meta"},view:{$ref:"#/definitions/view"},card_data:{type:"object",description:"Authored card data and runtime metadata. Includes uploaded-file metadata maintained by host handlers and inference evaluation results.",properties:{files:{type:"array",description:"Optional uploaded-file metadata maintained by host handlers. Stored name is normalized and serial-prefixed (for example 001-my_file.pdf).",items:{type:"object",required:["name","stored_name"],properties:{name:{type:"string",minLength:1},stored_name:{type:"string",minLength:5,maxLength:32,pattern:"^[0-9]{3,}-[a-z0-9._-]+$"},size:{oneOf:[{type:"integer",minimum:0},{type:"null"}]},mime_type:{type:"string"},path:{type:"string",pattern:"^[^\\s]+/files/[0-9]{3,}-[a-z0-9._-]+$"},uploaded_at:{type:"string",format:"date-time"}},additionalProperties:false}}},additionalProperties:true},source_defs:{type:"array",description:"Source entries. Each entry is passed verbatim to the board's .task-executor (registered via init --task-executor) as the --in JSON file. The executor fetches/generates the data and writes JSON to --out. If no executor is registered, the built-in executor runs the entry's 'cli' command directly. Sources gate completion by default. Set optionalForCompletionGating: true for enrichment-only source_defs that should not block task-completed.",items:{$ref:"#/definitions/source_def"}},compute:{type:"array",description:"Ordered array of compute steps. Each reads card_data.*/requires.*/fetched_sources.*/computed_values.* and writes to ephemeral computed_values[bindTo].",items:{$ref:"#/definitions/compute_step"}}}};var Uu=Lc(Bu());var Kh=createRequire(import.meta.url),Uh=Kh("./jsonata-sync.cjs"),vn=null;var Gu=/\b(card_data|requires|fetched_sources|computed_values|source_defs)\b/g,Jh=/^\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\.|$)/;function Hh(e){let t=new Set,r;for(Gu.lastIndex=0;(r=Gu.exec(e))!==null;)t.add(r[1]);return t}function Ju(e){let t=Jh.exec(e);return t?t[1]:null}function Ku(e,t,r,n){try{Uh(e);}catch(o){let a=o instanceof Error?o.message:String(o);n.push(`${t}: invalid JSONata expression (${a})`);return}let s=Hh(e);for(let o of s)r.has(o)||n.push(`${t}: disallowed namespace "${o}" in expression`);}function Ao(e,t,r){if(Array.isArray(e)){e.forEach((s,o)=>{Ao(s,`${t}/${o}`,r);});return}if(typeof e=="string"){let s=Ju(e);if(!s)return;new Set(["card_data","requires","computed_values"]).has(s)||r.push(`${t}: disallowed namespace "${s}" in view reference`);return}if(!e||typeof e!="object")return;let n=e;for(let[s,o]of Object.entries(n))Ao(o,`${t}/${s}`,r);}function zh(){if(vn)return vn;let e=new Uu.default({allErrors:true});return Bh(e),vn=e.compile(ha),vn}function Hu(e){let t=zh(),r=t(e),n=(t.errors??[]).map(s=>`${s.instancePath||"/"}: ${s.message??"unknown error"}`);if(e&&typeof e=="object"&&!Array.isArray(e)){let s=e.source_defs;if(Array.isArray(s)){let o=new Set,a=new Set;s.forEach((i,u)=>{if(!i||typeof i!="object"||Array.isArray(i))return;let c=i;typeof c.bindTo=="string"&&c.bindTo&&(o.has(c.bindTo)&&n.push(`/source_defs/${u}/bindTo: bindTo "${c.bindTo}" must be unique across all source_defs`),o.add(c.bindTo)),typeof c.outputFile=="string"&&c.outputFile&&(a.has(c.outputFile)&&n.push(`/source_defs/${u}/outputFile: outputFile "${c.outputFile}" must be unique across all source_defs`),a.add(c.outputFile));});}}return !r||n.length>0?{ok:false,errors:n}:{ok:true,errors:[]}}function zu(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:true,errors:[]};let r=e,n=r.compute;Array.isArray(n)&&n.forEach((c,l)=>{if(!c||typeof c!="object"||Array.isArray(c))return;let d=c.expr;typeof d!="string"||d.trim().length===0||Ku(d,`/compute/${l}/expr`,new Set(["card_data","requires","fetched_sources","computed_values"]),t);});let s=new Set(["card_data","requires","fetched_sources","computed_values"]),o=r.provides;Array.isArray(o)&&o.forEach((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 y=Ju(d);y===null?t.push(`/provides/${l}/ref: path "${d}" must start with a valid namespace (${[...s].join(", ")})`):s.has(y)||t.push(`/provides/${l}/ref: disallowed namespace "${y}" in path "${d}" (valid: ${[...s].join(", ")})`);});let a=r.view;a&&typeof a=="object"&&!Array.isArray(a)&&Ao(a,"/view",t);let i=new Set(["card_data","requires"]),u=r.source_defs;return Array.isArray(u)&&u.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[y,g]of Object.entries(d))typeof g!="string"||g.trim().length===0||Ku(g,`/source_defs/${l}/projections/${y}`,i,t);}),{ok:t.length===0,errors:t}}function Io(e){let t=Hu(e);if(!t.ok)return t;let r=zu(e);return r.ok?{ok:true,errors:[]}:{ok:false,errors:r.errors}}var ot={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function $e(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function at(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Wu(e){return e.tasks??{}}function Po(e){return e?e.status===ot.FAILED||e.status===ot.INACTIVATED:false}function Yu(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Xu(e){return e.maxExecutions}function Qu(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===ot.COMPLETED){let o=e.tasks[n];o&&$e(o).forEach(i=>r.add(i));}return Array.from(r)}function Zu(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;$e(s).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function ec(e,t,r){let n=e.tasks[t]??bn(),s={};if(r){let a=r.tasks[t],i=at(a);for(let u of i)for(let[c,l]of Object.entries(r.tasks))if($e(l).includes(u)){let d=e.tasks[c];d?.lastDataHash&&(s[u]=d.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function tc(e,t,r,n,s,o){let a=e.tasks[r]??bn(),i=t.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let u;n&&i.on&&i.on[n]?u=i.on[n]:u=$e(i);let c=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let y=i.requires??[];for(let g of y)for(let[f,p]of Object.entries(t.tasks))if($e(p).includes(g)){let k=e.tasks[f];k?.lastDataHash&&(c[g]=k.lastDataHash);break}}let l={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:c,error:void 0},d=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:l},availableOutputs:d,lastUpdated:new Date().toISOString()}}function rc(e,t,r,n){let s=e.tasks[r]??bn(),o=t.tasks[r];if(o?.retry){let u=s.retryCount+1;if(u<=o.retry.max_attempts){let c={...s,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:c},lastUpdated:new Date().toISOString()}}}let a={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},i=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(i=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&a.executionCount>=o.circuit_breaker.max_executions){let u=o.circuit_breaker.on_break;i=[...new Set([...i,...u])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:i,lastUpdated:new Date().toISOString()}}function nc(e,t,r,n){let s=e.tasks[t]??bn(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function sc(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function bn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function kn(e,t){let r=`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=ac();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function Wh(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:ec(n,t.taskName,r)};case "task-completed":return {config:r,state:tc(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:rc(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:nc(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:sc(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:rg(n,t.action)};case "task-upsert":return Yh(e,t.taskName,t.taskConfig);case "task-removal":return Xh(e,t.taskName);case "node-requires-add":return Qh(e,t.nodeName,t.tokens);case "node-requires-remove":return Zh(e,t.nodeName,t.tokens);case "node-provides-add":return eg(e,t.nodeName,t.tokens);case "node-provides-remove":return tg(e,t.nodeName,t.tokens);default:return e}}function oc(e,t){return t.reduce((r,n)=>Wh(r,n),e)}function Yh(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:ac()},lastUpdated:new Date().toISOString()}}}function Xh(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function Qh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=at(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function Zh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=at(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function eg(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=$e(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function tg(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=$e(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function Rr(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Sn(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function ac(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function rg(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 $r(e){let{config:t,state:r}=e,n=Wu(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=ng(n),a=Qu(t,r.tasks),i=new Set([...a,...r.availableOutputs]),u=[],c=[],l=[],d=[];for(let[g,f]of Object.entries(n)){let p=r.tasks[g],k=Yu(f,t.settings),h=k!=="once";if(p?.status===ot.RUNNING||Po(p))continue;let m=Xu(f);if(m!==void 0&&p&&p.executionCount>=m||f.circuit_breaker&&p&&p.executionCount>=f.circuit_breaker.max_executions||!h&&p?.status===ot.COMPLETED)continue;if(h&&p?.status===ot.COMPLETED){let _=at(f),C=false;switch(k){case "data-changed":{_.length>0&&_.some(q=>{for(let[F,re]of Object.entries(n))if($e(re).includes(q)){let U=r.tasks[F];if(!U)continue;let ce=p.lastConsumedHashes?.[q];return U.lastDataHash==null?U.executionCount>p.lastEpoch:U.lastDataHash!==ce}return false})||(C=true);break}case "epoch-changed":{_.length>0&&_.some(q=>{for(let[F,re]of Object.entries(n))if($e(re).includes(q)){let U=r.tasks[F];if(U&&U.executionCount>p.lastEpoch)return true}return false})||(C=true);break}case "time-based":{let N=f.refreshInterval??0;if(N<=0){C=true;break}let q=p.completedAt;if(!q){C=true;break}(Date.now()-Date.parse(q))/1e3<N&&(C=true);break}case "manual":C=true;break}if(C)continue}let v=at(f);if(v.length===0){u.push(g);continue}let w=[],S=[],$=[];for(let _ of v){if(i.has(_))continue;let C=o[_]||[];C.length===0?w.push(_):C.every(q=>Po(r.tasks[q]))?$.push({token:_,failedProducer:C[0]}):S.push(_);}w.length>0?l.push({taskName:g,missingTokens:w}):$.length>0?d.push({taskName:g,failedTokens:$.map(_=>_.token),failedProducers:[...new Set($.map(_=>_.failedProducer))]}):S.length>0?c.push({taskName:g,waitingOn:S}):u.push(g);}let y={};if(u.length>1){let g=Zu(u,n);for(let[f,p]of Object.entries(g))p.length>1&&(y[f]=p);}return {eligible:u,pending:c,unresolved:l,blocked:d,conflicts:y}}function ng(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of $e(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var Cr=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Oo(e){let t=jo(e);return sg(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(n=>JSON.stringify(n)+":"+jo(t[n])).join(",")+"}"}function sg(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function og(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function ag(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function ic(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return og(t)}function ig(e){try{let t=JSON.parse(ag(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function uc(e,t,r){let{handlers:n,onDrain:s}=t,o=new Cr,a="state"in e&&"config"in e?e:kn(e),i=false,u=new Set,c=new Map(Object.entries(n)),l=new Cr,d=false,y=false;function g(){if(!i){if(d){y=true;return}d=true;try{do y=!1,f();while(y)}finally{d=false;}}}function f(){let m=l.drain(),v=o.drain(),w=[...m,...v];w.length>0&&(a=oc(a,w));let S=$r(a);w.length>0&&s?.(w,a,S);for(let $ of S.eligible)h($);for(let $ of w)if($.type==="task-progress"){let{taskName:_,update:C}=$;if(!a.config.tasks[_])continue;let q=a.state.tasks[_];if(!q||q.status!=="running")continue;let F=ic(_),re=k(_,F,C).catch(U=>{i||(l.append({type:"task-failed",taskName:_,error:U.message??String(U),timestamp:new Date().toISOString()}),g());}).finally(()=>{u.delete(re);});u.add(re);}}function p(m){let w=a.config.tasks[m].requires??[],S=new Map;for(let[_,C]of Object.entries(a.config.tasks))for(let N of C.provides??[])S.set(N,_);let $={};for(let _ of w){let C=S.get(_);C?$[_]=a.state.tasks[C]?.data:$[_]=void 0;}return $}async function k(m,v,w){let S=a.config.tasks[m],$=S.taskHandlers??[],_=p(m);for(let C of $){let N=c.get(C);if(!N)throw new Error(`Handler '${C}' not found in registry (task '${m}')`);let q={nodeId:m,state:_,taskState:a.state.tasks[m],config:S,callbackToken:v,update:w};if(await N(q)==="task-initiate-failure")throw new Error(`Handler '${C}' returned task-initiate-failure (task '${m}')`)}}function h(m){let w=a.config.tasks[m]?.taskHandlers;if(!w||w.length===0)return;l.append({type:"task-started",taskName:m,timestamp:new Date().toISOString()}),g();let S=ic(m),$=k(m,S).catch(_=>{i||(l.append({type:"task-failed",taskName:m,error:_.message??String(_),timestamp:new Date().toISOString()}),g());}).finally(()=>{u.delete($);});u.add($);}return {push(m){i||(m.type==="task-completed"&&m.data&&!m.dataHash&&(m={...m,dataHash:Oo(m.data)}),o.append(m),g());},pushAll(m){if(!i){for(let v of m)v.type==="task-completed"&&v.data&&!v.dataHash?o.append({...v,dataHash:Oo(v.data)}):o.append(v);g();}},resolveCallback(m,v,w){if(i)return;let S=ig(m);if(!S)return;let{taskName:$}=S;if(a.config.tasks[$]){if(w&&w.length>0)o.append({type:"task-failed",taskName:$,error:w.join("; "),timestamp:new Date().toISOString()});else {let _=v&&Object.keys(v).length>0?Oo(v):void 0;o.append({type:"task-completed",taskName:$,data:v,dataHash:_,timestamp:new Date().toISOString()});}g();}},addNode(m,v){i||(o.append({type:"task-upsert",taskName:m,taskConfig:v,timestamp:new Date().toISOString()}),g());},removeNode(m){i||(o.append({type:"task-removal",taskName:m,timestamp:new Date().toISOString()}),g());},addRequires(m,v){i||(o.append({type:"node-requires-add",nodeName:m,tokens:v,timestamp:new Date().toISOString()}),g());},removeRequires(m,v){i||(o.append({type:"node-requires-remove",nodeName:m,tokens:v,timestamp:new Date().toISOString()}),g());},addProvides(m,v){i||(o.append({type:"node-provides-add",nodeName:m,tokens:v,timestamp:new Date().toISOString()}),g());},removeProvides(m,v){i||(o.append({type:"node-provides-remove",nodeName:m,tokens:v,timestamp:new Date().toISOString()}),g());},registerHandler(m,v){c.set(m,v);},unregisterHandler(m){c.delete(m);},retrigger(m){i||a.config.tasks[m]&&(o.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()}),g());},retriggerAll(m){if(!i){for(let v of m)a.config.tasks[v]&&o.append({type:"task-restart",taskName:v,timestamp:new Date().toISOString()});g();}},snapshot(){return Rr(a)},getState(){return a},getSchedule(){return $r(a)},async waitForHandlers(){u.size>0&&await Promise.allSettled([...u]);},async dispose(m){m?.wait&&u.size>0&&await Promise.allSettled([...u]),i=true;}}}var cg=createRequire(import.meta.url),wn=cg("./jsonata-sync.cjs"),lc=wn;function cc(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function fc(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function dg(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await wn(s.expr).evaluate(n);fc(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function lg(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let a=lc(o.expr).evaluate(n);fc(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch(a){let i=a instanceof Error?a.message:String(a);s.push({bindTo:o.bindTo,error:i});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function fg(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return wn(e).evaluate(n)}function pg(e,t){return t.startsWith("fetched_sources.")?cc(e._sourcesData??{},t.slice(16)):cc(e,t)}var dc=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),mg=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function hg(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))mg.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,a)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${a}]: must be an object`);else {let i=o;typeof i.bindTo!="string"||!i.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(s.has(i.outputFile)&&t.push(`source_defs[${a}]: outputFile "${i.outputFile}" is not unique across source_defs`),s.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):dc.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...dc].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function gg(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=await wn(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function yg(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=lc(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var it={run:dg,runSync:lg,eval:fg,resolve:pg,validate:hg,enrichSources:gg,enrichSourcesSync:yg};function vg(e,t){let r;return /\.m?js$/i.test(e)?r="local-node":/\.py$/i.test(e)?r="local-python":r="local-process",{meta:"task-executor",howToRun:r,whatToRun:oe({kind:"fs-path",value:e}),...t?{extra:t}:{}}}function _n(e){return JSON.stringify(e)}function Rn(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 $n(e,t){function r(){return e.readIndex()??{}}function n(s,o,a){let i=String(o||"").split(".").filter(Boolean);if(i.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let u={...s},c=u;for(let l=0;l<i.length-1;l++){let d=i[l],y=c[d],g=y&&typeof y=="object"&&!Array.isArray(y)?{...y}:{};c[d]=g,c=g;}return c[i[i.length-1]]=a,u}return {readCard(s){let o=r()[s];return !o||!e.cardExists(o.key)?null:e.readCard(o.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[o,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let i=e.readCard(a.key);i?s.push(i):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,a]of Object.entries(r()))s[o]=a.checksum;return s},changedSince(s){let o=r(),a=[];for(let[i,u]of Object.entries(o))s[i]!==u.checksum&&a.push(i);for(let i of Object.keys(s))o[i]||a.push(i);return a},validateUpsert(s,o){let a=r(),i=a[s],u=Object.entries(a).find(([,c])=>c.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:u&&u[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,a){let i=r(),u=a??i[s]?.key??e.defaultCardKey(s),c=e.writeCard(u,o);i[s]={key:u,checksum:c,updatedAt:new Date().toISOString()},e.writeIndex(i);},patchCard(s,o,a){let i=r(),u=i[s];if(!u||!e.cardExists(u.key))throw new Error(`card "${s}" not found`);let c=e.readCard(u.key);if(!c||typeof c!="object"||Array.isArray(c))throw new Error(`card "${s}" is not patchable`);let l=n(c,o,a),d=e.writeCard(u.key,l);i[s]={key:u.key,checksum:d,updatedAt:new Date().toISOString()},e.writeIndex(i);},removeCard(s){let o=r();o[s]&&(delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function No(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let o=s.trim();if(!o)return null;try{return JSON.parse(o)}catch{return o}},ingestSourceDataStaged(r,n,s,o){let a=t(s);e.write(`${r}/.staged/${o}/${n}`,a);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,a=e.read(o);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function hc(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(o=>o.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function gc(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let o of s)try{n(o);}catch(a){let i=a instanceof Error?a.message:String(a);try{t(o,i);}catch{}}e.delete(r);}}}}var Er="v1",ut="board/graph",yc="board/lastJournalProcessedId";function pc(e){return `cards/${e}/runtime`}function vc(e){return {readRuntime(t){return e.read(pc(t))??{_sources:{}}},writeRuntime(t,r){e.write(pc(t),r);}}}function bg(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function bc(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==Er)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=bg(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function qo(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Rn(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",_n(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return Rn(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",_n(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);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function kc(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function kg(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function Sg(e,t){return e?.lastRequestedAt?kg(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function wg(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function mc(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function Cn(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=$r(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let f of o.pending)i.set(f.taskName,f.waitingOn);for(let f of o.unresolved)i.set(f.taskName,f.missingTokens);for(let f of o.blocked)i.set(f.taskName,f.failedTokens);let u=new Map;for(let[f,p]of Object.entries(n))for(let k of p.requires??[]){let h=u.get(k)??[];h.push(f),u.set(k,h);}let c=s.sort().map(f=>{let p=r[f],k=n[f]??{requires:[],provides:[]};p.status==="completed"?a.completed+=1:p.status==="failed"?a.failed+=1:p.status==="in-progress"&&(a.in_progress+=1);let h=k.requires??[],m=k.provides??[],v=Object.keys(p.data??{}).sort(),w=h.filter(q=>t.state.availableOutputs.includes(q)),S=h.filter(q=>!t.state.availableOutputs.includes(q)),$=i.get(f)??S,_=new Set;for(let q of m)for(let F of u.get(q)??[])F!==f&&_.add(F);let C=p.failedAt,N=p.error?{message:p.error,code:"TASK_FAILED",at:C,source:"task-runtime"}:void 0;return {name:f,status:p.status,error:N,requires:h,requires_satisfied:w,requires_missing:S,provides_declared:m,provides_runtime:v,blocked_by:$,unblocks:Array.from(_).sort(),runtime:{attempt_count:p.executionCount??0,restart_count:p.retryCount??0,in_progress_since:p.status==="in-progress"?p.startedAt??null:null,last_transition_at:p.lastUpdated??null,last_completed_at:p.completedAt??null,last_restarted_at:p.startedAt??null,status_age_ms:p.lastUpdated?0:null}}});a.pending=o.pending.length,a.blocked=o.blocked.length,a.unresolved=o.unresolved.length;let l=c.map(f=>({name:f.name,fanOut:f.unblocks.length})).sort((f,p)=>p.fanOut-f.fanOut||f.name.localeCompare(p.name)),d=l.length>0?l[0]:{name:null,fanOut:0},y=new Set;for(let f of Object.values(n))for(let p of f.requires??[])y.add(p);let g=0;for(let[f,p]of Object.entries(n)){let k=(p.requires??[]).length===0,m=(p.provides??[]).some(v=>(u.get(v)??[]).some(w=>w!==f));k&&!m&&(g+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:a.completed,eligible:o.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:g,topology:{edge_count:Array.from(y).length,max_fan_out_card:d.name,max_fan_out:d.fanOut}},cards:c}}function _g(){return new Date().toISOString()}function Sc(e,t,r,n,s,o,a){return async i=>{let u=[],c=r.cardStore.readCard(i.nodeId);if(!c)return "task-initiate-failure";let l=c.id,d=c.card_data??{},y=c.source_defs??[],g=y.filter(M=>M.optionalForCompletionGating!==true),f=r.cardRuntimeStore.readRuntime(l),p=false,k=()=>{p&&(r.cardRuntimeStore.writeRuntime(l,f),p=false);},h=M=>({...f._sources[M]??{}}),m=(M,V)=>{f._sources[M]=V,p=true;},v=i.taskState?.executionCount??0,w=f._lastExecutionCount;if(typeof w=="number"&&w!==v&&(f._sources={},p=true),w!==v&&(f._lastExecutionCount=v,p=true),i.update){let M=i.update,V=M.outputFile;if(V){let R=h(V);if(M.failure)m(V,mc(R,M.reason??"unknown"));else {let b=M.rqt;if(!R.lastFetchedAt||b>R.lastFetchedAt){let E=typeof M.deliveryToken=="string"?M.deliveryToken:void 0,A=false;E&&(A=r.fetchedSourcesStore.commitSourceData(l,V,E)),A?m(V,wg(R,b)):m(V,mc(R,`source delivery commit failed for ${V} token=${String(E)}`));}}k();}}let S={};for(let M of y)if(M.outputFile){let V=r.fetchedSourcesStore.readSourceData(l,M.outputFile);V!==null&&(S[M.bindTo]=V);}let $={};for(let[M,V]of Object.entries(i.state??{}))if(V!==null&&typeof V=="object"&&!Array.isArray(V)){let R=V[M];$[M]=R!==void 0?R:V;}else $[M]=V;let _={id:l,card_data:{...d},requires:$,source_defs:y,compute:c.compute};_._sourcesData=S,c.compute&&it.runSync(_,{sourcesData:S}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(l,_.computed_values??{});let C={...c},N=it.enrichSourcesSync(Array.isArray(c.source_defs)?c.source_defs:void 0,{card_data:c.card_data,requires:$}),q=e.value;C.source_defs=Array.isArray(N)?N.map(M=>({...M,boardDir:typeof M.boardDir=="string"&&M.boardDir?M.boardDir:q})):N;let F=_g(),re=i.update?void 0:F,U=g.filter(M=>{let V=M.outputFile;if(typeof V!="string"||!V)return true;let R=h(V);re&&(R={...R,queueRequestedAt:re},m(V,R));let b=R.queueRequestedAt??R.lastRequestedAt??F,E=Sg(R,b);return E==="in-flight"?false:E==="dispatch"});if(k(),U.length>0){let M=false,V=F;for(let R of U){let b=R.outputFile;if(typeof b!="string"||!b)continue;let E=h(b),A=E.queueRequestedAt??F;m(b,{...E,lastRequestedAt:A}),V=A,M=true;}return M&&k(),M&&(u.push({taskKind:"source-fetch",payload:{boardRef:oe(e),enrichedCard:C,callbackToken:i.callbackToken,rqt:V}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}let ce=c.provides??[],qe={};for(let{bindTo:M,ref:V}of ce)qe[M]=it.resolve(_,V);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(qe),y.filter(M=>{if(M.optionalForCompletionGating!==true)return false;let V=h(M.outputFile);return !V.lastRequestedAt||!V.lastFetchedAt?true:V.lastFetchedAt<=V.lastRequestedAt}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:oe(e),enrichedCard:C,callbackToken:i.callbackToken,rqt:F}}),n(i.nodeId,qe),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var En={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function wc(e){return {[ut]:e.graph,[yc]:e.lastDrainedJournalId}}function _c(e){let t=e[ut],r=e[yc];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ut}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function Rc(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function Q(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function j(e){return {status:"fail",error:e}}function ee(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Rg(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Cc(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(s)}function xn(e){try{let t=JSON.parse(Cc(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function $g(e){return Rg(JSON.stringify(e))}function $c(e){try{let t=JSON.parse(Cc(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Ce(){return new Date().toISOString()}function Cg(e,t){let r=t.onWarn??(()=>{}),n=oe(e);function s(R){if(R.length!==0)try{let b=t.publishBoardChangeNotifications?.(R);b&&typeof b.catch=="function"&&b.catch(E=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${E instanceof Error?E.message:String(E)}`));}catch(b){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${b instanceof Error?b.message:String(b)}`);}}function o(){let R=i().readCardStoreRef();if(!R)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let b=t.kvStorageForRef(R);return {readIndex(){return b.read("_index")},writeIndex(E){b.write("_index",E);},readCard(E){return b.read(E)},writeCard(E,A){return b.write(E,A),t.hashFn(A)},cardExists(E){return b.read(E)!==null},defaultCardKey(E){return E}}}let a={readValues(R){let b=t.kvStorage("state-snapshot"),E=b.listKeys().sort();if(E.length===0)return {version:null,values:{}};let A={};for(let Y of E)A[Y]=b.read(Y);return {version:t.hashFn(A),values:A}},writeValues(R,b,E){let A=t.kvStorage("state-snapshot");for(let Y of E)A.delete(Y);for(let[Y,te]of Object.entries(b))A.write(Y,te);return t.hashFn(b)}},i=()=>qo(t.kvStorage("config")),u=()=>bc(a),c=()=>hc(t.journalAdapter()),l=()=>$n(o(),r),d=()=>{let R=i().readOutputsStoreRef();if(!R)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return kc(t.kvStorageForRef(R))};function y(){return !!u().readSnapshot(e.value).values[ut]}function g(){let R=u().readSnapshot(e.value);if(!R.values[ut])throw new Error(`Board not initialized at ${e.value}`);return _c(R.values)}function f(R,b){let E=u().commitSnapshot(e.value,{schemaVersion:Er,expectedVersion:b,commitId:t.genId(),committedAt:Ce(),deleteKeys:[],shallowMerge:wc(R)});if(!E.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${b??"null"} current=${E.currentVersion??"null"}`)}function p(R){c().appendEvent(R);}async function k(){let R=(I,D)=>{let ae=I.payload,ze=(ae?.enrichedCard??{}).id??ae?.cardId??"unknown";p({type:"task-failed",taskName:ze,error:D,timestamp:Ce()});},b=gc(t.kvStorage("execution-requests"),R),E=vc(t.kvStorage("card-runtime")),A=No(t.blobStorage("sources"),I=>t.resolveBlob(I)),Y=new Map,te={readRuntime(I){return Y.get(I)??E.readRuntime(I)},writeRuntime(I,D){Y.set(I,D);}},we=[],_e=new Map,Be={readSourceData(I,D){let ae=`${I}/${D}`;return _e.has(ae)?_e.get(ae):A.readSourceData(I,D)},ingestSourceDataStaged(I,D,ae,Et){A.ingestSourceDataStaged(I,D,ae,Et);},commitSourceData(I,D,ae){let Et=`${I}/.staged/${ae}/${D}`,Ir=t.blobStorage("sources").read(Et);if(Ir==null)return false;let xt=`${I}/${D}`,Bo=Ir.trim();try{_e.set(xt,JSON.parse(Bo));}catch{_e.set(xt,Bo);}return we.push({cardId:I,outputFile:D,deliveryToken:ae}),true},hasSource(I,D){let ae=`${I}/${D}`;return _e.has(ae)?true:A.hasSource(I,D)}},De={cardStore:l(),cardRuntimeStore:te,fetchedSourcesStore:Be,outputStore:d(),executionRequestStore:b},dt=g(),lt=Sn(dt.graph),{events:$t,newCursor:Ct}=c().readEntriesAfterCursor(dt.lastDrainedJournalId),ft=[],An=[],In=[],Mo=new Map,Ic=(I,D)=>{ft.push({type:"task-completed",taskName:I,data:D,timestamp:Ce()});},Lo=(I,D)=>p({type:"task-failed",taskName:I,error:D,timestamp:Ce()}),Tr=uc(lt,{handlers:{"card-handler":Sc(e,Ct,De,Ic,Lo,(I,D)=>{An.push({cardId:I,values:D});},I=>{In.push(I);})}});for(ft=$t;ft.length>0;){let I=ft;ft=[];for(let D of I)if(D.type==="task-restart"){let ae=De.cardStore.readCard(D.taskName);ae&&Mo.set(D.taskName,ae);}Tr.pushAll(I),await Tr.waitForHandlers();}let Vo=Tr.getState();await Tr.dispose({wait:true});let Pc=u().readSnapshot(e.value).version;f({lastDrainedJournalId:Ct,graph:Rr(Vo)},Pc);for(let{cardId:I,values:D}of An)De.outputStore.writeComputedValues(I,D);for(let I of In)De.outputStore.writeDataObjects(I);for(let[I,D]of Y)E.writeRuntime(I,D);for(let{cardId:I,outputFile:D,deliveryToken:ae}of we)A.commitSourceData(I,D,ae);let Ar;try{Ar=Cn(n,Vo),De.outputStore.writeStatusSnapshot(Ar);}catch(I){r(`[board-live-cards-public] status publish failed: ${I instanceof Error?I.message:String(I)}`);}let Ut=[];for(let{cardId:I,values:D}of An)Ut.push({kind:"computed_values",cardId:I,values:D});for(let I of In)for(let[D,ae]of Object.entries(I))D&&Ut.push({kind:"data_object",key:D,payload:ae});for(let[I,D]of Mo)Ut.push({kind:"card_refreshed",cardId:I,card:D});Ar!==void 0&&Ut.push({kind:"status",status:Ar}),s(Ut);let Oc=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:oe({kind:"built-in",value:"source-cli-task-executor"})};b.dispatchEntriesForJournalId(Ct,I=>{if(I.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${I.taskKind}" \u2014 skipping`);return}let D=I.payload,ae=D.enrichedCard?.id??"unknown",Et=D.enrichedCard?.source_defs??[];for(let ze of Et){if(!ze.outputFile){r(`[dispatch] source "${ze.bindTo}" has no outputFile \u2014 skipping`);continue}let Ir=$g({cbk:D.callbackToken,rg:e.value,br:oe(e),cid:ae,b:ze.bindTo,d:ze.outputFile,cs:void 0,rqt:D.rqt});t.dispatchExecution(Oc,{source_def:ze,base_ref:oe(e),callback:{token:Ir,via:t.selfRef}}).catch(xt=>Lo(ae,xt instanceof Error?xt.message:String(xt)));}});}async function h(){try{let R=()=>{let E=g(),{events:A}=c().readEntriesAfterCursor(E.lastDrainedJournalId);A.length<=0||(h(),t.requestProcessAccumulated?.());},b=await Ko(t.lock,k,R);return Q({ran:b!==!1})}catch(R){return ee(R)}}function m(R){try{let b=R.params?.cardStoreRef;if(!b)return j("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!y()){let te=kn(En);f({lastDrainedJournalId:"",graph:Rr(te)},null);}let E=R.params?.outputsStoreRef;if(!E)return j("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let A=i();A.writeCardStoreRef(b),A.writeOutputsStoreRef(E);let Y=R.body??{};Y["task-executor-ref"]&&A.writeTaskExecutorRef(Y["task-executor-ref"]),Y["chat-handler-ref"]&&A.writeChatHandlerRef(Y["chat-handler-ref"]);try{d().writeStatusSnapshot(Cn(n,Sn(g().graph)));}catch{}return Q()}catch(b){return ee(b)}}function v(R){try{let b=d().readStatusSnapshot();if(!b){b=Cn(n,Sn(g().graph));try{d().writeStatusSnapshot(b);}catch{}}return Q(b)}catch(b){return ee(b)}}function w(R){try{let b=R.params?.id;return b?(p({type:"task-removal",taskName:b,timestamp:Ce()}),h(),Q()):j("removeCard requires params.id")}catch(b){return ee(b)}}function S(R){try{let b=R.params?.id;return b?(p({type:"task-restart",taskName:b,timestamp:Ce()}),h(),Q()):j("retrigger requires params.id")}catch(b){return ee(b)}}async function $(R){return h()}function _(R){try{let b=R.params?.cardId,E=R.params?.all,A=!!R.params?.restart;if(!b&&!E)return j("upsertCard requires --card-id <id> or --all");let Y=E?l().readAllCards().map(te=>te.id):[b];for(let te of Y)if(!l().readCard(te))return j(`Card "${te}" not found in board at ${e.value}`);for(let te of Y){let we=l().readCard(te),_e=Rc(we),Be=t.hashFn(_e),De=t.kvStorage("card-upsert"),dt=De.read(te),lt=dt?.taskConfigHash!==Be;if(!(!lt&&!A)){if(lt){let $t=dt?.blobRef??l().readCardKey(te)??te;p({type:"task-upsert",taskName:te,taskConfig:_e,timestamp:Ce()}),De.write(te,{blobRef:$t,taskConfigHash:Be,updatedAt:Ce()});}A&&p({type:"task-restart",taskName:te,timestamp:Ce()});}}return h(),Q()}catch(b){return ee(b)}}function C(R){try{let b=R.params?.token;if(!b)return j("taskFailed requires params.token");let E=R.params?.error??"unknown error",A=xn(b);return A?(p({type:"task-failed",taskName:A.taskName,error:E,timestamp:Ce()}),h(),Q()):j("Invalid callback token")}catch(b){return ee(b)}}function N(R){try{let b=R.params?.token;if(!b)return j("taskProgress requires params.token");let A=(R.body??{}).update??{},Y=xn(b);return Y?(p({type:"task-progress",taskName:Y.taskName,update:A,timestamp:Ce()}),h(),Q()):j("Invalid callback token")}catch(b){return ee(b)}}function q(R){try{let b=R.params?.token,E=R.params?.ref;if(!b)return j("sourceDataFetched requires params.token");if(!E)return j("sourceDataFetched requires params.ref");let A=$c(b);if(!A)return j("Invalid source token");let{cbk:Y,cid:te,b:we,d:_e,cs:Be,rqt:De}=A,dt=No(t.blobStorage("sources"),ft=>t.resolveBlob(ft)),lt=t.genId();dt.ingestSourceDataStaged(te,_e,Re(E),lt);let $t=xn(Y);if(!$t)return j("Invalid callback token embedded in source token");let Ct=Ce();return p({type:"task-progress",taskName:$t.taskName,update:{bindTo:we,outputFile:_e,fetchedAt:Ct,deliveryToken:lt,sourceChecksum:Be,rqt:De},timestamp:Ct}),h(),Q()}catch(b){return ee(b)}}function F(R){try{let b=R.params?.token,E=R.params?.reason??"unknown";if(!b)return j("sourceDataFetchFailure requires params.token");let A=$c(b);if(!A)return j("Invalid source token");let{cbk:Y,b:te,d:we,cs:_e}=A,Be=xn(Y);return Be?(p({type:"task-progress",taskName:Be.taskName,update:{bindTo:te,outputFile:we,failure:!0,reason:E,sourceChecksum:_e},timestamp:Ce()}),h(),Q()):j("Invalid callback token embedded in source token")}catch(b){return ee(b)}}function re(R){try{let b=i().readCardStoreRef();return b?Q({storeRef:b}):j(`Board at ${e.value} has no card store configured`)}catch(b){return ee(b)}}function U(R){try{let b=i().readOutputsStoreRef();return b?Q({storeRef:b}):j(`Board at ${e.value} has no outputs store configured`)}catch(b){return ee(b)}}function ce(R){try{let b=R.params?.key;if(!b)return j("getConfig requires params.key");let E=i(),A;switch(b){case "task-executor":A=E.readTaskExecutorRef()??null;break;case "chat-handler":A=E.readChatHandlerRef()??null;break;case "card-store-ref":A=E.readCardStoreRef();break;case "outputs-store-ref":A=E.readOutputsStoreRef();break;default:return j(`getConfig: unknown key "${b}"`)}return Q({value:A})}catch(b){return ee(b)}}function qe(R){try{let b=R.params?.key;if(!b)return j("getOutputsDataObject requires params.key");let E=d().readDataObject(b);return Q(E)}catch(b){return ee(b)}}function ct(R){try{return Q(d().readAllDataObjects())}catch(b){return ee(b)}}function M(R){try{let b=R.params?.key;if(!b)return j("getOutputsComputedValues requires params.key");let E=d().readComputedValues(b);return Q(E)}catch(b){return ee(b)}}function V(R){try{return Q(d().readAllComputedValues())}catch(b){return ee(b)}}return {init:m,status:v,getCardStoreRef:re,getOutputsStoreRef:U,getConfig:ce,getOutputsDataObject:qe,getAllOutputsDataObjects:ct,getOutputsComputedValues:M,getAllOutputsComputedValues:V,removeCard:w,retrigger:S,processAccumulatedEvents:$,upsertCard:_,taskFailed:C,taskProgress:N,sourceDataFetched:q,sourceDataFetchFailure:F}}function Eg(e,t){let r=()=>qo(t.kvStorage("config"));function n(){let h=r().readCardStoreRef();if(!h)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let m=t.kvStorageForRef(h);return {readIndex(){return m.read("_index")},writeIndex(v){m.write("_index",v);},readCard(v){return m.read(v)},writeCard(v,w){return m.write(v,w),t.hashFn(w)},cardExists(v){return m.read(v)!==null},defaultCardKey(v){return v}}}let s=()=>$n(n(),t.onWarn??(()=>{}));function o(h,m){let v=t.validateSchema(m),w=[],S=r().readTaskExecutorRef();if(S&&Array.isArray(m.source_defs))for(let _ of m.source_defs){let C=typeof _.bindTo=="string"?_.bindTo:"(unknown)";try{let N;try{N=t.invokeExecutorSync(S,"validate-source-def",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(_)});}catch(F){let re=F;if(N=typeof re?.stdout=="string"?re.stdout:"",!N.trim()){w.push(`source "${C}": executor validate-source-def failed \u2014 ${F instanceof Error?F.message:String(F)}`);continue}}let q=JSON.parse(N.trim());if(!q.ok&&Array.isArray(q.errors))for(let F of q.errors)w.push(`source "${C}": ${F}`);}catch(N){w.push(`source "${C}": executor validate-source-def failed \u2014 ${N instanceof Error?N.message:String(N)}`);}}let $=[...v.errors,...w];return Q({cardId:h,isValid:$.length===0,issues:$})}function a(h,m,v){let w=r().readTaskExecutorRef();if(!w)return j("No task-executor registered for this board");let S=typeof h.bindTo=="string"?h.bindTo:"source",$=t.makeTempFilePath(`probe-in-${S}`),_=t.makeTempFilePath(`probe-out-${S}`),C=t.makeTempFilePath(`probe-err-${S}`,".txt"),N={...h,boardDir:e.value,_projections:m},q=oe({kind:"fs-path",value:$}),F=oe({kind:"fs-path",value:_}),re=oe({kind:"fs-path",value:C});t.absoluteBlob.write($,JSON.stringify(N,null,2));let U=null;try{if(t.invokeExecutorSync(w,"run-source-fetch",["--in-ref",q,"--out-ref",F,"--err-ref",re],{timeout:h.timeout??t.executorTimeouts?.probeMs??6e4}),U=t.absoluteBlob.read(_),U===null)return j("Executor produced no output file")}catch(ce){let qe=t.absoluteBlob.read(C)?.trim()??(ce instanceof Error?ce.message:String(ce));return j(`Probe failed: ${qe}`)}finally{try{t.absoluteBlob.remove($);}catch{}try{t.absoluteBlob.remove(C);}catch{}}if(v){let ce=Re(v);t.absoluteBlob.write(ce.value,U);}else try{t.absoluteBlob.remove(_);}catch{}return Q({bindTo:S,resultSizeBytes:U.length})}function i(h){try{let m=h.params?.cardId,v=h.params?.all;if(!m&&!v)return j("validateCard requires --card-id <id> or --all");let w=v?s().readAllCards().map($=>$.id):[m],S=[];for(let $ of w){let _=s().readCard($);if(!_){S.push({cardId:$,isValid:!1,issues:[`Card "${$}" not found`]});continue}let C=o($,_);if(C.status!=="success")return C;S.push(C.data);}return Q(S)}catch(m){return ee(m)}}function u(h){try{if(!h.body||typeof h.body!="object"||Array.isArray(h.body))return j("validateCardPreflight requires card JSON object in body");let m=h.body,v=m["card-content"]??m,w=typeof v.id=="string"?v.id:"(unknown)",S=o(w,v),$=r().readTaskExecutorRef();if($)try{let _=t.invokeExecutorSync($,"validate-card-preflight",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(v)}),C=JSON.parse(_.trim());if(!C.ok&&Array.isArray(C.errors)&&C.errors.length>0){let N=[...S.status==="success"?S.data.issues:[],...C.errors];return Q({cardId:w,isValid:!1,issues:N})}}catch{}return S}catch(m){return ee(m)}}function c(h){try{let m=h.params?.cardId,v=h.params?.sourceIdx,w=h.params?.outRef;if(!m)return j("probeSource requires params.cardId");if(v===void 0)return j("probeSource requires params.sourceIdx");let $=(h.body??{})["mock-projections"]??{},_=s().readCard(m);if(!_)return j(`Card "${m}" not found`);let C=_.source_defs??[];return v<0||v>=C.length?j(`sourceIdx ${v} out of range (card has ${C.length} source(s))`):a(C[v],$,w)}catch(m){return ee(m)}}function l(h){try{let m=h.params?.outRef,v=h.body;if(!v)return j('probeTmpSource requires body with "source-def" and "mock-projections"');let w=v["source-def"],S=v["mock-projections"]??{};return w?a(w,S,m):j('probeTmpSource body requires "source-def"')}catch(m){return ee(m)}}function d(h){try{let m=h.params?.sourceIdx,v=h.params?.outRef;if(m===void 0)return j("probeSourcePreflight requires params.sourceIdx");if(!h.body||typeof h.body!="object"||Array.isArray(h.body))return j("probeSourcePreflight requires card JSON object in body");let w=h.body,S=w["card-content"]??w,$=w["mock-projections"]??{},_=S.source_defs??[];if(m<0||m>=_.length)return j(`sourceIdx ${m} out of range (card has ${_.length} source(s))`);let C=_[m],N=r().readTaskExecutorRef();if(N){let q=typeof C.bindTo=="string"?C.bindTo:"source";try{let F={...C,_projections:$},re=t.invokeExecutorSync(N,"probe-source-preflight",[],{timeout:C.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(F)}),U=JSON.parse(re.trim());return U.ok?Q({bindTo:q,reachable:U.reachable,latencyMs:U.latencyMs,note:U.note}):j(U.error??"Preflight probe failed")}catch{}}return a(C,$,v)}catch(m){return ee(m)}}function y(h){try{let m=r().readTaskExecutorRef();if(!m)return j("No task-executor registered for this board");let v=t.invokeExecutorSync(m,"describe-capabilities",[],{timeout:t.executorTimeouts?.describeMs??1e4});return Q(JSON.parse(v.trim()))}catch(m){return ee(m)}}function g(h){try{let m=h.body;if(!m||!Array.isArray(m.ops))return j("updatesInCardStore requires body.ops array");let v=m.ops,w=s();for(let S of v){let $=S.op,_=S.id;if(!_)return j('op is missing "id"');if($==="update"){let C=S["card-content"];if(!C)return j(`update op for "${_}" is missing "card-content"`);w.writeCard(_,C);}else return j(`Unknown op type: "${$??"(none)"}"`)}return Q()}catch(m){return ee(m)}}function f(h){try{let m=h.body;if(!m||!Array.isArray(m.ids))return j("readFromCardStore requires body.ids array");let v=m.ids,w=s(),S=v.map($=>({id:$,"card-content":w.readCard($)}));return Q({cards:S})}catch(m){return ee(m)}}function p(h){try{if(!h.body||typeof h.body!="object"||Array.isArray(h.body))return j("evalCardCompute requires a JSON object in body");let m=h.body,v=m["card-content"]??m,w=typeof v.id=="string"?v.id:"(unknown)",S=m["mock-fetched-sources"]??{},$=m["mock-requires"]??{},_=v.compute;if(!_||!Array.isArray(_)||_.length===0)return Q({cardId:w,ok:!0,computed_values:{},errors:[]});let C={id:w,card_data:v.card_data??{},requires:$,source_defs:v.source_defs,compute:_},N=it.runSync(C,{sourcesData:S}),q=N.node.computed_values??{},F=N.errors??[];return Q({cardId:w,ok:F.length===0,computed_values:q,errors:F})}catch(m){return ee(m)}}function k(h){try{if(!h.body||typeof h.body!="object"||Array.isArray(h.body))return j("simulateCardCycle requires a JSON object in body");let m=h.body,v=m["card-content"]??m,w=typeof v.id=="string"?v.id:"(unknown)",S=m["mock-fetched-sources"]??{},$=m["mock-requires"]??{},_=o(w,v),C=_.status==="success"?{isValid:_.data.isValid,issues:_.data.issues}:{isValid:!1,issues:[_.status==="fail"?_.error:"internal error"]},N=v.source_defs??[],q=v.card_data??{},F=[],re=[];if(N.length>0){F=it.enrichSourcesSync(N,{card_data:q,requires:$});for(let b of F){let E=b.projections,A=b._projections;if(E&&A){for(let Y of Object.keys(E))if(A[Y]===void 0){let te=typeof b.bindTo=="string"?b.bindTo:"(unknown)";re.push({bindTo:te,key:Y,error:`Projection "${Y}" resolved to undefined`});}}}}let U=[],ce=m["task-executor-ref"],qe=(ce?.howToRun&&ce?.whatToRun?ce:void 0)??r().readTaskExecutorRef();for(let b=0;b<F.length;b++){let E=F[b],A=typeof E.bindTo=="string"?E.bindTo:`source_${b}`;if(!qe){U.push({bindTo:A,skipped:!0,error:"No task executor configured"});continue}try{let Y={...E},te=t.invokeExecutorSync(qe,"probe-source-preflight",[],{timeout:E.timeout??1e4,input:JSON.stringify(Y)}),we=JSON.parse(te.trim());U.push({bindTo:A,reachable:we.reachable,latencyMs:we.latencyMs,error:we.ok?void 0:we.error});}catch{U.push({bindTo:A,skipped:!0,error:"Executor does not support probe-source-preflight"});}}let ct=v.compute,M={},V=[];if(ct&&Array.isArray(ct)&&ct.length>0){let b={id:w,card_data:q,requires:$,source_defs:v.source_defs,compute:ct},E=it.runSync(b,{sourcesData:S});M=E.node.computed_values??{},V=E.errors??[];}let R=C.isValid&&re.length===0&&V.length===0&&U.every(b=>b.reachable!==!1);return Q({cardId:w,ok:R,validation:C,source_probes:U,projection_errors:re,computed_values:M,compute_errors:V})}catch(m){return ee(m)}}return {validateCard:i,validateCardPreflight:u,probeSource:c,probeTmpSource:l,probeSourcePreflight:d,evalCardCompute:p,simulateCardCycle:k,describeTaskExecutorCapabilities:y,updatesInCardStore:g,readFromCardStore:f}}function xg(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {get(s){try{let o=s.params?.id;if(o){let a=e.readCard(o);return a?t({cards:[a]}):r(`card "${o}" not found`)}return t({cards:e.readAllCards()})}catch(o){return n(o)}},set(s){try{let o=s.body;if(o==null)return r("set requires a body (card object or array of cards)");let a=Array.isArray(o)?o:[o];for(let i of a){if(typeof i.id!="string")return r("each card must have a string `id` field");e.writeCard(i.id,i);}return t({count:a.length})}catch(o){return n(o)}},del(s){try{let o=s.body?.ids??[],a=s.params?.id,i=a?[...o,a]:o;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let u of i)e.removeCard(u);return t({count:i.length})}catch(o){return n(o)}},patch(s){try{let o=s.params?.id,a=s.params?.path;if(!o)return r("patch requires params.id");if(!a)return r("patch requires params.path");let i=s.body,u=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:s.body;return e.patchCard(o,a,u),t({count:1})}catch(o){return n(o)}}}}function Tg(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {list(s){try{let o=s.params?.prefix??"";return t({artifacts:e.list(o)})}catch(o){return n(o)}},head(s){try{let o=s.params?.key;return o?t({artifact:e.head(o)}):r("head requires params.key")}catch(o){return n(o)}},put(s){try{let o=s.params?.key,a=s.params?.contentType;if(!o)return r("put requires params.key");let i=s.body;if(typeof i=="string")return t({artifact:e.putText(o,i,a)});if(i&&typeof i=="object"&&typeof i.text=="string")return t({artifact:e.putText(o,i.text,a)});if(i&&typeof i=="object"&&Array.isArray(i.bytes)){let u=i.bytes,c=new Uint8Array(u.map(l=>Math.max(0,Math.min(255,Number(l)||0))));return t({artifact:e.putBytes(o,c,a)})}return r("put requires body as string, {text}, or {bytes:number[]}")}catch(o){return n(o)}},get(s){try{let o=s.params?.key,a=s.params?.as??"base64";if(!o)return r("get requires params.key");let i=e.head(o);if(!i)return r(`artifact "${o}" not found`);if(a==="text"){let c=e.getText(o);return c===null?r(`artifact "${o}" not found`):t({key:o,contentType:i.contentType,size:i.size,text:c})}let u=e.getBytes(o);return u===null?r(`artifact "${o}" not found`):t({key:o,contentType:i.contentType,size:i.size,bytes:[...u]})}catch(o){return n(o)}},del(s){try{let o=s.params?.key;return o?(e.remove(o),t({ok:!0})):r("del requires params.key")}catch(o){return n(o)}}}}var Tn=".artifacts-index.json";function Ec(){return new Date().toISOString()}function xc(e){return new TextEncoder().encode(e).byteLength}function xr(e){let t=e.read(Tn);if(!t)return {entries:{}};try{let r=JSON.parse(t);if(r&&r.entries&&typeof r.entries=="object")return r}catch{}return {entries:{}}}function Do(e,t){e.write(Tn,JSON.stringify(t,null,2));}function Ag(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Tc(e,t,r){e.entries[t]={key:t,size:r.size,updatedAt:r.updatedAt,contentType:r.contentType};}function Fo(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function Ig(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function Pg(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Og(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function jg(e){let t=Ig(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function Ng(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function qg(e){function t(r){let n=e.stat?Ag(e.stat(r)):null;if(n)return n;let o=xr(e).entries[r];if(o)return {...o};if(!e.exists(r))return null;let a=e.read(r);return a===null?{key:r}:{key:r,size:xc(a)}}return {exists(r){return e.exists(r)},putText(r,n,s="text/plain; charset=utf-8"){e.write(r,n);let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??Ec(),o.size=o.size??xc(n);let a=xr(e);return Tc(a,r,o),Do(e,a),o},putBytes(r,n,s="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,i);}let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??Ec(),o.size=o.size??n.byteLength;let a=xr(e);return Tc(a,r,o),Do(e,a),o},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let s=e.readBytes(r);return s===null?null:Buffer.from(s).toString("utf-8")}try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new TextDecoder("utf-8").decode(new Uint8Array(s.data))}catch{}return n},getBytes(r){if(e.readBytes){let s=e.readBytes(r);if(s!==null)return s}let n=e.read(r);if(n===null)return null;try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new Uint8Array(s.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){let n=new Map;if(e.listKeys)for(let o of e.listKeys(r)){if(o===Tn)continue;let a=t(o)??{key:o};n.set(o,a);}let s=xr(e);for(let[o,a]of Object.entries(s.entries))o===Tn||r&&!o.startsWith(r)||n.has(o)||n.set(o,{...a});return [...n.values()].sort((o,a)=>o.key.localeCompare(a.key))},remove(r){e.remove(r);let n=xr(e);delete n.entries[r],Do(e,n);}}}function Dg(e,t){let r=t?.indexFileName||".index.json";function n(d){return `${d}/${r}`}function s(d){let y=e.getText(n(d));if(!y)return [];try{let g=JSON.parse(y);return Array.isArray(g)?g.filter(f=>f&&typeof f.stored_name=="string").map(f=>({serial:Number(f.serial||Fo(String(f.stored_name))||0),role:String(f.role||"system").toLowerCase(),stored_name:String(f.stored_name),path:typeof f.path=="string"?f.path:`${d}/chats/${String(f.stored_name)}`,updated_at:typeof f.updated_at=="string"?f.updated_at:null})):[]}catch{return []}}function o(d,y){e.putText(n(d),JSON.stringify(y,null,2),"application/json; charset=utf-8");}function a(d){let y=s(d),g=0;for(let f of y){let p=Number(f.serial||0);Number.isFinite(p)&&p>g&&(g=p);}return g+1}function i(d,y){let g=s(d);g.push(y),o(d,g);}function u(d){let y=s(d),g=[];for(let f of y){let p=`${d}/${f.stored_name}`,k=e.getText(p);k!==null&&g.push({serial:Number(f.serial||Fo(f.stored_name)||0),role:String(f.role||"system").toLowerCase(),text:k,path:typeof f.path=="string"?f.path:`${d}/chats/${f.stored_name}`,stored_name:f.stored_name,updated_at:f.updated_at||null});}return g.sort((f,p)=>f.serial-p.serial||f.stored_name.localeCompare(p.stored_name)),g}function c(d){let y=`${d}/`;for(let g of e.list(y))e.remove(g.key);}function l(d){let y=`${d}/`,g=e.list(y),f=0,p=0,k=false;for(let h of g){let m=h.key.slice(y.length);if(m===".processing"){k=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(m))continue;f+=1;let v=h.updatedAt?Number(new Date(h.updatedAt).getTime()||0):0;v>p&&(p=v);}return {count:f,latest_mtime_ms:p,processing:k}}return {indexKey:n,loadIndex:s,saveIndex:o,nextSerial:a,appendIndexRecord:i,readRecords:u,clear:c,readSignal:l}}function Fg(e){function t(s,o){let a=0,i=[];Array.isArray(o)&&i.push(...o);for(let u of e.list(`${s}/`))i.push(Ng(u.key));for(let u of i){let c=Fo(u);Number.isFinite(c)&&c>a&&(a=c);}return a+1}function r(s,o,a){let i=Number(a?.maxLen||32),{stem:u,ext:c}=jg(s),l=Og(c),d=Pg(u),y=`${String(o).padStart(3,"0")}-`,g=l,f=i-y.length-g.length;f<1&&(g="",f=i-y.length);let p=d.slice(0,Math.max(1,f)),k=`${y}${p}${g}`;return k.length>i&&(k=k.slice(0,i).replace(/\.$/,"")),k}function n(s,o,a){let i=t(s,a?.seedNames),u=r(o,i,{maxLen:a?.maxLen});for(;e.exists(`${s}/${u}`);)i+=1,u=r(o,i,{maxLen:a?.maxLen});return u}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function Mg(){function e(s,o){if(!Array.isArray(s))return [];let a=[];for(let i of s){if(!i||typeof i!="object")continue;let u=i;typeof u.stored_name=="string"&&a.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,path:typeof u.path=="string"?u.path:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:o||null});}return a}function t(s){return !s||typeof s!="object"?[]:e(s.files,void 0)}function r(s,o){let a=t(s);if(o.length===0)return s.files=a,a;let i=new Set(a.map(u=>u.stored_name));for(let u of o)i.has(u.stored_name)||(a.push(u),i.add(u.stored_name));return s.files=a,a}function n(s,o,a){let i=t(s);if(!Number.isInteger(o)||o<0||o>=i.length)return {ok:false,reason:"index_out_of_range"};let u=i[o];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function Ib(){return {async invoke(e,t){if(e.howToRun!=="local-node")return {dispatched:false,error:`createNodeSpawnInvocationAdapter: unsupported howToRun "${e.howToRun}"`};let r="";try{let o=e.whatToRun,a=typeof o=="string"?Re(o):o;a.kind==="fs-path"&&(r=a.value);}catch{r="";}if(!r)return {dispatched:false,error:"createNodeSpawnInvocationAdapter: could not resolve fs-path from whatToRun"};let n={...t};if(n.chatsKeyPrefix&&n.chatsBlobBasePath){let o=String(n.chatsKeyPrefix).split("/")[0];n.chatDir=pt(String(n.chatsBlobBasePath),o);}delete n.chatsKeyPrefix,delete n.chatsBlobBasePath;let s=Buffer.from(JSON.stringify(n)).toString("base64");try{return spawn(process.execPath,[r,"--boardId",String(t.boardId??""),"--cardId",String(t.cardId??""),"--extraEncJson",s],{stdio:"ignore",windowsHide:!0}).unref(),{dispatched:!0}}catch(o){return {dispatched:false,error:o instanceof Error?o.message:String(o)}}},async describe(e){if(e.howToRun!=="local-node")return null;let t="";try{let r=e.whatToRun,n=typeof r=="string"?Re(r):r;n.kind==="fs-path"&&(t=n.value);}catch{t="";}if(!t)return null;try{let r=spawnSync(process.execPath,[t,"describe"],{timeout:5e3,encoding:"utf-8",windowsHide:!0});return r.status!==0?null:JSON.parse(String(r.stdout).trim())}catch{return null}}}}var Bg=".board.lock";function Gg(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function Kg(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function Ac(e){if(e)return e;let t=Yo(import.meta.url),r=[t,pt(t,"..","cli","node"),pt(t,"..","..","cli","node")];for(let n of r)try{return qn(n),n}catch{}throw new Error(`createFsBoardPlatformAdapter: could not resolve a public CLI directory from module dir ${t}`)}function Ug(e,t,r){let{cliDir:n,opts:s}=Gg(t,r),o=Ac(n),a=e.value,i=s?.suppressSpawn?"":qn(o),u={meta:"board-live-cards",howToRun:"local-node",whatToRun:i?oe({kind:"fs-path",value:i}):"",...s?.notifyChannel?{extra:{notifyChannel:s.notifyChannel}}:{}};return {kvStorage:c=>Kn(pt(a,`.${c}`)),blobStorage:c=>c?qr(pt(a,c)):qr(a),journalAdapter:()=>pa(a),lock:ma(pt(a,Bg)),selfRef:u,async dispatchExecution(c,l){if(s?.suppressSpawn)return {dispatched:false};try{let d=l.source_def?.bindTo??On().slice(0,8),y=Jt(a,`exec-in-${d}`),g=Jt(a,`exec-out-${d}`),f=Jt(a,`exec-err-${d}`,".txt"),p=oe({kind:"fs-path",value:y}),k=oe({kind:"fs-path",value:g}),h=oe({kind:"fs-path",value:f});return la({kind:"fs-path",value:y}).write(y,JSON.stringify(l,null,2)),da(c,{subcommand:"run-source-fetch",inRef:p,outRef:k,errRef:h},o),{dispatched:!0}}catch(d){return {dispatched:false,error:d instanceof Error?d.message:String(d)}}},resolveBlob(c){let l=zo(c.value)?Gn().read(c.value):qr(a).read(c.value);if(l===null)throw new Error(`resolveBlob: blob not found: ::${c.kind}::${c.value}`);return l},hashFn:fa,genId:()=>Wo(`${Date.now()}-${Math.random()}`).slice(0,32),kvStorageForRef:c=>Kn(Re(c).value),requestProcessAccumulated(){s?.suppressSpawn||Zo(o,e,s?.notifyChannel);},publishBoardChangeNotifications(c){if(!s?.notifyChannel||c.length===0)return;let l=c.map(d=>({id:On(),ts:new Date().toISOString(),boardRef:oe(e),notification:d}));ea(s.notifyChannel,l,s.onWarn);},onWarn:s?.onWarn}}function Pb(e,t,r){let{cliDir:n,opts:s}=Kg(t,r),o=Ac(n),a=Ug(e,o,s),i=Nr();return {...a,invokeExecutorSync(u,c,l,d){let{command:y,baseArgs:g}=Fn(u,o),f=u.extra?["--extra",Buffer.from(JSON.stringify(u.extra)).toString("base64")]:[];return i.executeSync(y,[...g,c,...l,...f],{timeout:d?.timeout??3e4,encoding:"utf-8",input:d?.input})},validateSchema(u){let c=Io(u);return {ok:c.errors.length===0,errors:c.errors}},makeTempFilePath(u,c){return Jt(e.value,u,c)},absoluteBlob:Gn()}}function Ob(e){try{let t=JSON.parse(Buffer.from(e,"base64url").toString());return typeof t.br=="string"?t.br:null}catch{return null}}
12
+ `,"utf-8");},generateId(){return randomUUID()}}}function ma(e){return {tryAcquire(){try{if(!P.existsSync(e)){P.mkdirSync(ue.dirname(e),{recursive:!0});try{P.writeFileSync(e,"{}",{flag:"wx"});}catch{}}return lockSync(e,{retries:0})}catch{return null}}}}var ha={$schema:"http://json-schema.org/draft-07/schema#",$id:"https://nsreehari.github.io/boards/live-cards.schema.json",definitions:{bind_ref:{description:"A card data path reference, e.g. 'card_data.raw_quotes' or 'requires.upstream'",type:"string",pattern:"^(card_data|requires|fetched_sources|computed_values)(\\.|$)"},bind_or_literal:{description:"A literal value or a bind reference object",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref"}},required:["bind"]}]},compute_expr:{description:"A declarative JSON compute expression",type:"object",required:["fn"],properties:{fn:{type:"string",description:"Function name from the built-in vocabulary",enum:["sum","avg","min","max","count","first","last","add","sub","mul","div","round","abs","mod","gt","gte","lt","lte","eq","neq","if","and","or","not","concat","upper","lower","template","filter","pluck","map","sort","slice","flat","unique","group","get","default","now","diff_days","format_date"]},input:{description:"card_data.path, literal, array of inputs, or nested compute_expr",oneOf:[{type:"string"},{type:"number"},{type:"boolean"},{type:"array"},{$ref:"#/definitions/compute_expr"}]},field:{type:"string",description:"For pluck/sum/group \u2014 the object key to extract"},where:{$ref:"#/definitions/compute_expr",description:"For filter \u2014 predicate expression ($ = current item)"},cond:{$ref:"#/definitions/compute_expr",description:"For if \u2014 condition expression"},then:{description:"For if \u2014 value when cond is truthy"},else:{description:"For if \u2014 value when cond is falsy"},format:{type:"string",description:"For format_date \u2014 date format string"}}},meta:{type:"object",properties:{title:{type:"string"},tags:{type:"array",items:{type:"string"}}}},requires:{type:"array",items:{type:"string"},description:"IDs of upstream nodes this node depends on"},provides:{type:"array",items:{type:"object",required:["bindTo","ref"],properties:{bindTo:{type:"string",description:"Token name published downstream"},ref:{type:"string",description:"Path to read value from (card_data.*, requires.*, fetched_sources.*, computed_values.*)"}}},description:"Explicit bindings exposing computed or card_data values downstream as named tokens"},compute_step:{description:"A single ordered compute step: reads card_data.*/requires.*/computed_values.*, writes to computed_values[bindTo]",type:"object",required:["bindTo","expr"],properties:{bindTo:{type:"string",description:"Key in computed_values to write result"},expr:{type:"string",description:"JSONata expression evaluated against { card_data, requires, fetched_sources, computed_values }"}}},source_def:{description:"One source entry. The engine requires 'bindTo' (compute namespace key) and 'outputFile' (delivery signal path). bindTo and outputFile must be unique across all source_defs in a card. Every other property is yours \u2014 add whatever your task-executor needs: kind, url, headers, mailbox, channel, model, query, etc. The full object is passed verbatim as the --in JSON to the executor.",type:"object",required:["bindTo","outputFile"],additionalProperties:true,properties:{bindTo:{type:"string",description:"Key under fetched_sources.* available in compute expressions"},outputFile:{type:"string",description:"Board-relative path the executor writes its JSON result to. Presence of this file signals delivery."},projections:{type:"object",description:"Named data projections from card_data or requires, evaluated before the executor is called. Each key is a ref name; each value is a JSONata expression rooted at card_data or requires. The resolved values are passed to the executor as _projections. fetched_sources, computed_values, and source_defs are not accessible here \u2014 sources run before those exist.",additionalProperties:{type:"string"}},optionalForCompletionGating:{type:"boolean",default:false,description:"When true this source does not gate card completion. Default false when absent, so source_defs are completion-gating by default."},timeout:{type:"integer",minimum:0,default:12e4,description:"Executor/script timeout in ms. Default: 120 000 (2 min)."},script:{type:"string",description:"Legacy direct-run: shell command executed when no .task-executor is registered. stdout is captured as the result."}}},render_element:{type:"object",required:["kind"],properties:{id:{type:"string",description:"Optional element ID for targeted updates"},kind:{enum:["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]},label:{type:"string",description:"Heading above this element"},className:{type:"string",description:"Bootstrap grid class, e.g. 'col-12 col-md-6'"},visible:{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 element shown only if truthy"},data:{type:"object",properties:{bind:{$ref:"#/definitions/bind_ref",description:"card_data/requires/fetched_sources/computed_values path to read data from"},writeTo:{$ref:"#/definitions/bind_ref",description:"card_data path for user input (form, filter, todo, notes)"},columns:{type:"array",items:{type:"string"},description:"table: visible columns"},maxRows:{type:"integer",description:"table/list: max rows to display"},sortable:{type:"boolean",default:true,description:"table: enable click-to-sort"},placeholder:{type:"string",description:"Empty-state message"},chartType:{enum:["bar","line","pie","doughnut"]},chartOptions:{type:"object",description:"Chart.js options passthrough"},fields:{type:"object",description:"JSON Schema for form/filter fields"},thresholds:{type:"object",properties:{green:{type:"string"},amber:{type:"string"}}},colorMap:{type:"object",description:"badge: value \u2192 Bootstrap color"},style:{enum:["heading","muted","default"],description:"text: display style"},upload:{type:"boolean",default:true,description:"file-upload: show drop zone (false = read-only file list)"},accept:{type:"array",items:{type:"string"},description:"file-upload: allowed extensions"},multiple:{type:"boolean",default:true,description:"file-upload: allow multiple files"},fileAttach:{type:"boolean",default:false,description:"chat: enable inline file attachments"},fileAccept:{type:"array",items:{type:"string"},description:"chat: allowed attachment extensions"},buttons:{type:"array",description:"actions: button definitions",items:{type:"object",required:["id","label"],properties:{id:{type:"string"},label:{type:"string"},style:{type:"string",description:"Bootstrap button variant, e.g. 'success', 'outline-danger'"},size:{type:"string",default:"sm"},disabled:{oneOf:[{type:"boolean"},{type:"string",description:"card_data/requires/fetched_sources/computed_values path \u2014 truthy = disabled"}]}}}}}}}},view:{type:"object",required:["elements"],properties:{elements:{type:"array",minItems:1,items:{$ref:"#/definitions/render_element"}},layout:{type:"object",properties:{board:{type:"object",properties:{col:{type:"integer",minimum:1,maximum:12},order:{type:"integer"}}},canvas:{type:"object",properties:{x:{type:"number"},y:{type:"number"},w:{type:"number"},h:{type:"number"}}}}},features:{type:"object",properties:{chat:{type:"boolean",default:false},notes:{type:"boolean",default:false},refresh:{type:"boolean",default:true}}}}}},title:"LiveCard",description:"A unified card node. Behavior depends on which sections are present (source_defs, compute, view, etc.)",type:"object",required:["id"],additionalProperties:false,properties:{id:{type:"string"},requires:{$ref:"#/definitions/requires"},provides:{$ref:"#/definitions/provides"},meta:{$ref:"#/definitions/meta"},view:{$ref:"#/definitions/view"},card_data:{type:"object",description:"Authored card data and runtime metadata. Includes uploaded-file metadata maintained by host handlers and inference evaluation results.",properties:{files:{type:"array",description:"Optional uploaded-file metadata maintained by host handlers. Stored name is normalized and serial-prefixed (for example 001-my_file.pdf).",items:{type:"object",required:["name","stored_name"],properties:{name:{type:"string",minLength:1},stored_name:{type:"string",minLength:5,maxLength:32,pattern:"^[0-9]{3,}-[a-z0-9._-]+$"},size:{oneOf:[{type:"integer",minimum:0},{type:"null"}]},mime_type:{type:"string"},path:{type:"string",pattern:"^[^\\s]+/files/[0-9]{3,}-[a-z0-9._-]+$"},uploaded_at:{type:"string",format:"date-time"}},additionalProperties:false}}},additionalProperties:true},source_defs:{type:"array",description:"Source entries. Each entry is passed verbatim to the board's .task-executor (registered via init --task-executor) as the --in JSON file. The executor fetches/generates the data and writes JSON to --out. If no executor is registered, the built-in executor runs the entry's 'cli' command directly. Sources gate completion by default. Set optionalForCompletionGating: true for enrichment-only source_defs that should not block task-completed.",items:{$ref:"#/definitions/source_def"}},compute:{type:"array",description:"Ordered array of compute steps. Each reads card_data.*/requires.*/fetched_sources.*/computed_values.* and writes to ephemeral computed_values[bindTo].",items:{$ref:"#/definitions/compute_step"}}}};var Uu=Lc(Bu());var Kh=createRequire(import.meta.url),Uh=Kh("./jsonata-sync.cjs"),vn=null;var Gu=/\b(card_data|requires|fetched_sources|computed_values|source_defs)\b/g,Jh=/^\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\.|$)/;function Hh(e){let t=new Set,r;for(Gu.lastIndex=0;(r=Gu.exec(e))!==null;)t.add(r[1]);return t}function Ju(e){let t=Jh.exec(e);return t?t[1]:null}function Ku(e,t,r,n){try{Uh(e);}catch(o){let a=o instanceof Error?o.message:String(o);n.push(`${t}: invalid JSONata expression (${a})`);return}let s=Hh(e);for(let o of s)r.has(o)||n.push(`${t}: disallowed namespace "${o}" in expression`);}function Ao(e,t,r){if(Array.isArray(e)){e.forEach((s,o)=>{Ao(s,`${t}/${o}`,r);});return}if(typeof e=="string"){let s=Ju(e);if(!s)return;new Set(["card_data","requires","computed_values"]).has(s)||r.push(`${t}: disallowed namespace "${s}" in view reference`);return}if(!e||typeof e!="object")return;let n=e;for(let[s,o]of Object.entries(n))Ao(o,`${t}/${s}`,r);}function zh(){if(vn)return vn;let e=new Uu.default({allErrors:true});return Bh(e),vn=e.compile(ha),vn}function Hu(e){let t=zh(),r=t(e),n=(t.errors??[]).map(s=>`${s.instancePath||"/"}: ${s.message??"unknown error"}`);if(e&&typeof e=="object"&&!Array.isArray(e)){let s=e.source_defs;if(Array.isArray(s)){let o=new Set,a=new Set;s.forEach((i,u)=>{if(!i||typeof i!="object"||Array.isArray(i))return;let c=i;typeof c.bindTo=="string"&&c.bindTo&&(o.has(c.bindTo)&&n.push(`/source_defs/${u}/bindTo: bindTo "${c.bindTo}" must be unique across all source_defs`),o.add(c.bindTo)),typeof c.outputFile=="string"&&c.outputFile&&(a.has(c.outputFile)&&n.push(`/source_defs/${u}/outputFile: outputFile "${c.outputFile}" must be unique across all source_defs`),a.add(c.outputFile));});}}return !r||n.length>0?{ok:false,errors:n}:{ok:true,errors:[]}}function zu(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:true,errors:[]};let r=e,n=r.compute;Array.isArray(n)&&n.forEach((c,l)=>{if(!c||typeof c!="object"||Array.isArray(c))return;let d=c.expr;typeof d!="string"||d.trim().length===0||Ku(d,`/compute/${l}/expr`,new Set(["card_data","requires","fetched_sources","computed_values"]),t);});let s=new Set(["card_data","requires","fetched_sources","computed_values"]),o=r.provides;Array.isArray(o)&&o.forEach((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 y=Ju(d);y===null?t.push(`/provides/${l}/ref: path "${d}" must start with a valid namespace (${[...s].join(", ")})`):s.has(y)||t.push(`/provides/${l}/ref: disallowed namespace "${y}" in path "${d}" (valid: ${[...s].join(", ")})`);});let a=r.view;a&&typeof a=="object"&&!Array.isArray(a)&&Ao(a,"/view",t);let i=new Set(["card_data","requires"]),u=r.source_defs;return Array.isArray(u)&&u.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[y,g]of Object.entries(d))typeof g!="string"||g.trim().length===0||Ku(g,`/source_defs/${l}/projections/${y}`,i,t);}),{ok:t.length===0,errors:t}}function Io(e){let t=Hu(e);if(!t.ok)return t;let r=zu(e);return r.ok?{ok:true,errors:[]}:{ok:false,errors:r.errors}}var ot={RUNNING:"running",COMPLETED:"completed",FAILED:"failed",INACTIVATED:"inactivated"};function $e(e){return e?Array.isArray(e.provides)?e.provides:[]:[]}function at(e){return e?Array.isArray(e.requires)?e.requires:[]:[]}function Wu(e){return e.tasks??{}}function Po(e){return e?e.status===ot.FAILED||e.status===ot.INACTIVATED:false}function Yu(e,t){return e.refreshStrategy??t?.refreshStrategy??"data-changed"}function Xu(e){return e.maxExecutions}function Qu(e,t){let r=new Set;for(let[n,s]of Object.entries(t))if(s.status===ot.COMPLETED){let o=e.tasks[n];o&&$e(o).forEach(i=>r.add(i));}return Array.from(r)}function Zu(e,t){let r={};return e.forEach(n=>{let s=t[n];if(!s)return;$e(s).forEach(a=>{r[a]||(r[a]=[]),r[a].push(n);});}),r}function ec(e,t,r){let n=e.tasks[t]??bn(),s={};if(r){let a=r.tasks[t],i=at(a);for(let u of i)for(let[c,l]of Object.entries(r.tasks))if($e(l).includes(u)){let d=e.tasks[c];d?.lastDataHash&&(s[u]=d.lastDataHash);break}}let o={...n,status:"running",startedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),progress:0,error:void 0,startConsumedHashes:s};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function tc(e,t,r,n,s,o){let a=e.tasks[r]??bn(),i=t.tasks[r];if(!i)throw new Error(`Task "${r}" not found in graph`);let u;n&&i.on&&i.on[n]?u=i.on[n]:u=$e(i);let c=a.startConsumedHashes?{...a.startConsumedHashes}:{...a.lastConsumedHashes};if(!a.startConsumedHashes){let y=i.requires??[];for(let g of y)for(let[f,p]of Object.entries(t.tasks))if($e(p).includes(g)){let k=e.tasks[f];k?.lastDataHash&&(c[g]=k.lastDataHash);break}}let l={...a,status:"completed",completedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),executionCount:a.executionCount+1,lastEpoch:a.executionCount+1,lastDataHash:s,data:o,lastConsumedHashes:c,error:void 0},d=[...new Set([...e.availableOutputs,...u])];return {...e,tasks:{...e.tasks,[r]:l},availableOutputs:d,lastUpdated:new Date().toISOString()}}function rc(e,t,r,n){let s=e.tasks[r]??bn(),o=t.tasks[r];if(o?.retry){let u=s.retryCount+1;if(u<=o.retry.max_attempts){let c={...s,status:"not-started",retryCount:u,lastUpdated:new Date().toISOString(),error:n};return {...e,tasks:{...e.tasks,[r]:c},lastUpdated:new Date().toISOString()}}}let a={...s,status:"failed",failedAt:new Date().toISOString(),lastUpdated:new Date().toISOString(),error:n,executionCount:s.executionCount+1},i=e.availableOutputs;if(o?.on_failure&&o.on_failure.length>0&&(i=[...new Set([...e.availableOutputs,...o.on_failure])]),o?.circuit_breaker&&a.executionCount>=o.circuit_breaker.max_executions){let u=o.circuit_breaker.on_break;i=[...new Set([...i,...u])];}return {...e,tasks:{...e.tasks,[r]:a},availableOutputs:i,lastUpdated:new Date().toISOString()}}function nc(e,t,r,n){let s=e.tasks[t]??bn(),o={...s,progress:typeof n=="number"?n:s.progress,messages:[...s.messages??[],...r?[{message:r,timestamp:new Date().toISOString(),status:s.status}]:[]],lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:o},lastUpdated:new Date().toISOString()}}function sc(e,t){let r=e.tasks[t];if(!r)return e;let n={...r,status:"not-started",startedAt:void 0,completedAt:void 0,failedAt:void 0,error:void 0,data:void 0,progress:null,lastUpdated:new Date().toISOString()};return {...e,tasks:{...e.tasks,[t]:n},lastUpdated:new Date().toISOString()}}function bn(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function kn(e,t){let r=`live-${Date.now()}`,n={};for(let o of Object.keys(e.tasks))n[o]=ac();let s={status:"running",tasks:n,availableOutputs:[],stuckDetection:{is_stuck:false,stuck_description:null,outputs_unresolvable:[],tasks_blocked:[]},lastUpdated:new Date().toISOString(),executionId:r,executionConfig:{executionMode:e.settings.execution_mode??"eligibility-mode",conflictStrategy:e.settings.conflict_strategy??"alphabetical",completionStrategy:e.settings.completion}};return {config:e,state:s}}function Wh(e,t){let{config:r,state:n}=e;if("executionId"in t&&t.executionId&&t.executionId!==n.executionId)return e;switch(t.type){case "task-started":return {config:r,state:ec(n,t.taskName,r)};case "task-completed":return {config:r,state:tc(n,r,t.taskName,t.result,t.dataHash,t.data)};case "task-failed":return {config:r,state:rc(n,r,t.taskName,t.error)};case "task-progress":return {config:r,state:nc(n,t.taskName,t.message,t.progress)};case "task-restart":return {config:r,state:sc(n,t.taskName)};case "inject-tokens":return {config:r,state:{...n,availableOutputs:[...new Set([...n.availableOutputs,...t.tokens])],lastUpdated:new Date().toISOString()}};case "agent-action":return {config:r,state:rg(n,t.action)};case "task-upsert":return Yh(e,t.taskName,t.taskConfig);case "task-removal":return Xh(e,t.taskName);case "node-requires-add":return Qh(e,t.nodeName,t.tokens);case "node-requires-remove":return Zh(e,t.nodeName,t.tokens);case "node-provides-add":return eg(e,t.nodeName,t.tokens);case "node-provides-remove":return tg(e,t.nodeName,t.tokens);default:return e}}function oc(e,t){return t.reduce((r,n)=>Wh(r,n),e)}function Yh(e,t,r){let n=!!e.config.tasks[t];return {config:{...e.config,tasks:{...e.config.tasks,[t]:r}},state:{...e.state,tasks:{...e.state.tasks,[t]:n?e.state.tasks[t]:ac()},lastUpdated:new Date().toISOString()}}}function Xh(e,t){if(!e.config.tasks[t])return e;let{[t]:r,...n}=e.config.tasks,{[t]:s,...o}=e.state.tasks;return {config:{...e.config,tasks:n},state:{...e.state,tasks:o,lastUpdated:new Date().toISOString()}}}function Qh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=at(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:[...s,...o]}}},state:e.state}}function Zh(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=at(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,requires:o}}},state:e.state}}function eg(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=$e(n),o=r.filter(a=>!s.includes(a));return o.length===0?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:[...s,...o]}}},state:e.state}}function tg(e,t,r){let n=e.config.tasks[t];if(!n)return e;let s=$e(n),o=s.filter(a=>!r.includes(a));return o.length===s.length?e:{config:{...e.config,tasks:{...e.config.tasks,[t]:{...n,provides:o}}},state:e.state}}function Rr(e){return {version:1,config:e.config,state:e.state,snapshotAt:new Date().toISOString()}}function Sn(e){if(!e||typeof e!="object")throw new Error("Invalid snapshot: expected an object");let t=e;if(!t.config||typeof t.config!="object")throw new Error('Invalid snapshot: missing or invalid "config"');if(!t.state||typeof t.state!="object")throw new Error('Invalid snapshot: missing or invalid "state"');let r=t.config,n=t.state;if(!r.settings||typeof r.settings!="object")throw new Error("Invalid snapshot: config.settings missing");if(!r.tasks||typeof r.tasks!="object")throw new Error("Invalid snapshot: config.tasks missing");if(!n.tasks||typeof n.tasks!="object")throw new Error("Invalid snapshot: state.tasks missing");if(!Array.isArray(n.availableOutputs))throw new Error("Invalid snapshot: state.availableOutputs must be an array");return {config:r,state:n}}function ac(){return {status:"not-started",executionCount:0,retryCount:0,lastEpoch:0,messages:[],progress:null}}function rg(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 $r(e){let{config:t,state:r}=e,n=Wu(t);if(Object.keys(n).length===0)return {eligible:[],pending:[],unresolved:[],blocked:[],conflicts:{}};let o=ng(n),a=Qu(t,r.tasks),i=new Set([...a,...r.availableOutputs]),u=[],c=[],l=[],d=[];for(let[g,f]of Object.entries(n)){let p=r.tasks[g],k=Yu(f,t.settings),h=k!=="once";if(p?.status===ot.RUNNING||Po(p))continue;let m=Xu(f);if(m!==void 0&&p&&p.executionCount>=m||f.circuit_breaker&&p&&p.executionCount>=f.circuit_breaker.max_executions||!h&&p?.status===ot.COMPLETED)continue;if(h&&p?.status===ot.COMPLETED){let _=at(f),C=false;switch(k){case "data-changed":{_.length>0&&_.some(q=>{for(let[F,re]of Object.entries(n))if($e(re).includes(q)){let U=r.tasks[F];if(!U)continue;let ce=p.lastConsumedHashes?.[q];return U.lastDataHash==null?U.executionCount>p.lastEpoch:U.lastDataHash!==ce}return false})||(C=true);break}case "epoch-changed":{_.length>0&&_.some(q=>{for(let[F,re]of Object.entries(n))if($e(re).includes(q)){let U=r.tasks[F];if(U&&U.executionCount>p.lastEpoch)return true}return false})||(C=true);break}case "time-based":{let N=f.refreshInterval??0;if(N<=0){C=true;break}let q=p.completedAt;if(!q){C=true;break}(Date.now()-Date.parse(q))/1e3<N&&(C=true);break}case "manual":C=true;break}if(C)continue}let v=at(f);if(v.length===0){u.push(g);continue}let w=[],S=[],$=[];for(let _ of v){if(i.has(_))continue;let C=o[_]||[];C.length===0?w.push(_):C.every(q=>Po(r.tasks[q]))?$.push({token:_,failedProducer:C[0]}):S.push(_);}w.length>0?l.push({taskName:g,missingTokens:w}):$.length>0?d.push({taskName:g,failedTokens:$.map(_=>_.token),failedProducers:[...new Set($.map(_=>_.failedProducer))]}):S.length>0?c.push({taskName:g,waitingOn:S}):u.push(g);}let y={};if(u.length>1){let g=Zu(u,n);for(let[f,p]of Object.entries(g))p.length>1&&(y[f]=p);}return {eligible:u,pending:c,unresolved:l,blocked:d,conflicts:y}}function ng(e){let t={};for(let[r,n]of Object.entries(e)){for(let s of $e(n))t[s]||(t[s]=[]),t[s].push(r);if(n.on)for(let s of Object.values(n.on))for(let o of s)t[o]||(t[o]=[]),t[o].includes(r)||t[o].push(r);if(n.on_failure)for(let s of n.on_failure)t[s]||(t[s]=[]),t[s].includes(r)||t[s].push(r);}return t}var Cr=class{buffer=[];append(t){this.buffer.push(t);}drain(){let t=this.buffer;return this.buffer=[],t}get size(){return this.buffer.length}};function Oo(e){let t=jo(e);return sg(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(n=>JSON.stringify(n)+":"+jo(t[n])).join(",")+"}"}function sg(e){let t=0xcbf29ce484222325n,r=0x100000001b3n,n=0xffffffffffffffffn;for(let s=0;s<e.length;s++)t^=BigInt(e.charCodeAt(s)),t=t*r&n;return t.toString(16).padStart(16,"0")}function og(e){if(typeof Buffer<"u")return Buffer.from(e,"utf8").toString("base64url");if(typeof btoa=="function"){let t=new TextEncoder().encode(e),r="";for(let n of t)r+=String.fromCharCode(n);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}throw new Error("No base64 encoder available in this runtime")}function ag(e){if(typeof Buffer<"u")return Buffer.from(e,"base64url").toString("utf8");if(typeof atob=="function"){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o++)s[o]=n.charCodeAt(o);return new TextDecoder().decode(s)}throw new Error("No base64 decoder available in this runtime")}function ic(e){let t=JSON.stringify({t:e,n:Date.now().toString(36)+Math.random().toString(36).slice(2,6)});return og(t)}function ig(e){try{let t=JSON.parse(ag(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function uc(e,t,r){let{handlers:n,onDrain:s}=t,o=new Cr,a="state"in e&&"config"in e?e:kn(e),i=false,u=new Set,c=new Map(Object.entries(n)),l=new Cr,d=false,y=false;function g(){if(!i){if(d){y=true;return}d=true;try{do y=!1,f();while(y)}finally{d=false;}}}function f(){let m=l.drain(),v=o.drain(),w=[...m,...v];w.length>0&&(a=oc(a,w));let S=$r(a);w.length>0&&s?.(w,a,S);for(let $ of S.eligible)h($);for(let $ of w)if($.type==="task-progress"){let{taskName:_,update:C}=$;if(!a.config.tasks[_])continue;let q=a.state.tasks[_];if(!q||q.status!=="running")continue;let F=ic(_),re=k(_,F,C).catch(U=>{i||(l.append({type:"task-failed",taskName:_,error:U.message??String(U),timestamp:new Date().toISOString()}),g());}).finally(()=>{u.delete(re);});u.add(re);}}function p(m){let w=a.config.tasks[m].requires??[],S=new Map;for(let[_,C]of Object.entries(a.config.tasks))for(let N of C.provides??[])S.set(N,_);let $={};for(let _ of w){let C=S.get(_);C?$[_]=a.state.tasks[C]?.data:$[_]=void 0;}return $}async function k(m,v,w){let S=a.config.tasks[m],$=S.taskHandlers??[],_=p(m);for(let C of $){let N=c.get(C);if(!N)throw new Error(`Handler '${C}' not found in registry (task '${m}')`);let q={nodeId:m,state:_,taskState:a.state.tasks[m],config:S,callbackToken:v,update:w};if(await N(q)==="task-initiate-failure")throw new Error(`Handler '${C}' returned task-initiate-failure (task '${m}')`)}}function h(m){let w=a.config.tasks[m]?.taskHandlers;if(!w||w.length===0)return;l.append({type:"task-started",taskName:m,timestamp:new Date().toISOString()}),g();let S=ic(m),$=k(m,S).catch(_=>{i||(l.append({type:"task-failed",taskName:m,error:_.message??String(_),timestamp:new Date().toISOString()}),g());}).finally(()=>{u.delete($);});u.add($);}return {push(m){i||(m.type==="task-completed"&&m.data&&!m.dataHash&&(m={...m,dataHash:Oo(m.data)}),o.append(m),g());},pushAll(m){if(!i){for(let v of m)v.type==="task-completed"&&v.data&&!v.dataHash?o.append({...v,dataHash:Oo(v.data)}):o.append(v);g();}},resolveCallback(m,v,w){if(i)return;let S=ig(m);if(!S)return;let{taskName:$}=S;if(a.config.tasks[$]){if(w&&w.length>0)o.append({type:"task-failed",taskName:$,error:w.join("; "),timestamp:new Date().toISOString()});else {let _=v&&Object.keys(v).length>0?Oo(v):void 0;o.append({type:"task-completed",taskName:$,data:v,dataHash:_,timestamp:new Date().toISOString()});}g();}},addNode(m,v){i||(o.append({type:"task-upsert",taskName:m,taskConfig:v,timestamp:new Date().toISOString()}),g());},removeNode(m){i||(o.append({type:"task-removal",taskName:m,timestamp:new Date().toISOString()}),g());},addRequires(m,v){i||(o.append({type:"node-requires-add",nodeName:m,tokens:v,timestamp:new Date().toISOString()}),g());},removeRequires(m,v){i||(o.append({type:"node-requires-remove",nodeName:m,tokens:v,timestamp:new Date().toISOString()}),g());},addProvides(m,v){i||(o.append({type:"node-provides-add",nodeName:m,tokens:v,timestamp:new Date().toISOString()}),g());},removeProvides(m,v){i||(o.append({type:"node-provides-remove",nodeName:m,tokens:v,timestamp:new Date().toISOString()}),g());},registerHandler(m,v){c.set(m,v);},unregisterHandler(m){c.delete(m);},retrigger(m){i||a.config.tasks[m]&&(o.append({type:"task-restart",taskName:m,timestamp:new Date().toISOString()}),g());},retriggerAll(m){if(!i){for(let v of m)a.config.tasks[v]&&o.append({type:"task-restart",taskName:v,timestamp:new Date().toISOString()});g();}},snapshot(){return Rr(a)},getState(){return a},getSchedule(){return $r(a)},async waitForHandlers(){u.size>0&&await Promise.allSettled([...u]);},async dispose(m){m?.wait&&u.size>0&&await Promise.allSettled([...u]),i=true;}}}var cg=createRequire(import.meta.url),wn=cg("./jsonata-sync.cjs"),lc=wn;function cc(e,t){if(!t||!e)return;let r=t.split("."),n=e;for(let s=0;s<r.length;s++){if(n==null)return;n=n[r[s]];}return n}function fc(e,t,r){let n=t.split("."),s=e;for(let o=0;o<n.length-1;o++)(s[n[o]]==null||typeof s[n[o]]!="object")&&(s[n[o]]={}),s=s[n[o]];s[n[n.length-1]]=r;}async function dg(e,t){if(!e?.compute?.length)return e;e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values};for(let s of e.compute)try{let o=await wn(s.expr).evaluate(n);fc(e.computed_values,s.bindTo,o),n.computed_values=e.computed_values;}catch{}return e}function lg(e,t){if(!e?.compute?.length)return {ok:true,node:e};e.card_data||(e.card_data={}),e.computed_values={},e._sourcesData=t?.sourcesData??{};let r=e.requires??{},n={card_data:e.card_data,requires:r,expects_data:r,fetched_sources:e._sourcesData,data:e.computed_values,computed_values:e.computed_values},s=[];for(let o of e.compute)try{let a=lc(o.expr).evaluate(n);fc(e.computed_values,o.bindTo,a),n.computed_values=e.computed_values;}catch(a){let i=a instanceof Error?a.message:String(a);s.push({bindTo:o.bindTo,error:i});}return s.length>0?{ok:true,node:e,errors:s}:{ok:true,node:e}}async function fg(e,t,r){let n={...r??{},card_data:t.card_data??{},requires:t.requires??{},fetched_sources:t._sourcesData??{},computed_values:t.computed_values??{}};return wn(e).evaluate(n)}function pg(e,t){return t.startsWith("fetched_sources.")?cc(e._sourcesData??{},t.slice(16)):cc(e,t)}var dc=new Set(["metric","table","editable-table","chart","form","filter","list","notes","todo","alert","narrative","badge","text","markdown","ref","custom","actions"]),mg=new Set(["id","meta","requires","provides","view","card_data","compute","source_defs"]);function hg(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return {ok:false,errors:["Node must be a non-null object"]};let r=e;(typeof r.id!="string"||!r.id)&&t.push("id: required, must be a non-empty string");for(let n of Object.keys(r))mg.has(n)||t.push(`Unknown top-level key: "${n}"`);if((r.card_data==null||typeof r.card_data!="object"||Array.isArray(r.card_data))&&t.push("card_data: required, must be an object"),r.meta!=null)if(typeof r.meta!="object"||Array.isArray(r.meta))t.push("meta: must be an object");else {let n=r.meta;n.title!=null&&typeof n.title!="string"&&t.push("meta.title: must be a string"),n.tags!=null&&!Array.isArray(n.tags)&&t.push("meta.tags: must be an array");}if(r.requires!=null&&!Array.isArray(r.requires)&&t.push("requires: must be an array of strings"),r.provides!=null&&(Array.isArray(r.provides)?r.provides.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`provides[${s}]: must be an object with bindTo and ref`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`provides[${s}]: missing required "bindTo" string`),(typeof o.ref!="string"||!o.ref)&&t.push(`provides[${s}]: missing required "ref" string`);}}):t.push("provides: must be an array of { bindTo, ref } bindings")),r.compute!=null&&(Array.isArray(r.compute)?r.compute.forEach((n,s)=>{if(!n||typeof n!="object"||Array.isArray(n))t.push(`compute[${s}]: must be a compute step object`);else {let o=n;(typeof o.bindTo!="string"||!o.bindTo)&&t.push(`compute[${s}]: missing required "bindTo" property`),(typeof o.expr!="string"||!o.expr)&&t.push(`compute[${s}]: missing required "expr" string (JSONata expression)`);}}):t.push("compute: must be an array of compute steps")),r.source_defs!=null)if(!Array.isArray(r.source_defs))t.push("source_defs: must be an array");else {let n=new Set,s=new Set;r.source_defs.forEach((o,a)=>{if(!o||typeof o!="object"||Array.isArray(o))t.push(`source_defs[${a}]: must be an object`);else {let i=o;typeof i.bindTo!="string"||!i.bindTo?t.push(`source_defs[${a}]: missing required "bindTo" property`):(n.has(i.bindTo)&&t.push(`source_defs[${a}]: bindTo "${i.bindTo}" is not unique across source_defs`),n.add(i.bindTo)),typeof i.outputFile!="string"||!i.outputFile?t.push(`source_defs[${a}]: missing required "outputFile" property`):(s.has(i.outputFile)&&t.push(`source_defs[${a}]: outputFile "${i.outputFile}" is not unique across source_defs`),s.add(i.outputFile)),i.optionalForCompletionGating!=null&&typeof i.optionalForCompletionGating!="boolean"&&t.push(`source_defs[${a}]: optionalForCompletionGating must be a boolean`);}});}if(r.view!=null)if(typeof r.view!="object"||Array.isArray(r.view))t.push("view: must be an object");else {let n=r.view;!Array.isArray(n.elements)||n.elements.length===0?t.push("view.elements: required, must be a non-empty array"):n.elements.forEach((s,o)=>{if(!s||typeof s!="object"){t.push(`view.elements[${o}]: must be an object`);return}!s.kind||typeof s.kind!="string"?t.push(`view.elements[${o}].kind: required, must be a string`):dc.has(s.kind)||t.push(`view.elements[${o}].kind: unknown kind "${s.kind}". Valid: ${[...dc].join(", ")}`),s.data!=null&&(typeof s.data!="object"||Array.isArray(s.data))&&t.push(`view.elements[${o}].data: must be an object`);}),n.layout!=null&&(typeof n.layout!="object"||Array.isArray(n.layout))&&t.push("view.layout: must be an object"),n.features!=null&&(typeof n.features!="object"||Array.isArray(n.features))&&t.push("view.features: must be an object");}return {ok:t.length===0,errors:t}}async function gg(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return Promise.all(e.map(async n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=await wn(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}}))}function yg(e,t){if(!e||e.length===0)return [];let r={card_data:t.card_data??{},requires:t.requires??{}};return e.map(n=>{let s={};if(n.projections&&typeof n.projections=="object"&&!Array.isArray(n.projections)){for(let[o,a]of Object.entries(n.projections))if(typeof a=="string"&&a.trim().length>0)try{s[o]=lc(a).evaluate(r);}catch{s[o]=void 0;}}return {...n,_projections:s}})}var it={run:dg,runSync:lg,eval:fg,resolve:pg,validate:hg,enrichSources:gg,enrichSourcesSync:yg};function vg(e,t){let r;return /\.m?js$/i.test(e)?r="local-node":/\.py$/i.test(e)?r="local-python":r="local-process",{meta:"task-executor",howToRun:r,whatToRun:oe({kind:"fs-path",value:e}),...t?{extra:t}:{}}}function _n(e){return JSON.stringify(e)}function Rn(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 $n(e,t){function r(){return e.readIndex()??{}}function n(s,o,a){let i=String(o||"").split(".").filter(Boolean);if(i.length===0)return a&&typeof a=="object"&&!Array.isArray(a)?a:{value:a};let u={...s},c=u;for(let l=0;l<i.length-1;l++){let d=i[l],y=c[d],g=y&&typeof y=="object"&&!Array.isArray(y)?{...y}:{};c[d]=g,c=g;}return c[i[i.length-1]]=a,u}return {readCard(s){let o=r()[s];return !o||!e.cardExists(o.key)?null:e.readCard(o.key)},readCardKey(s){return r()[s]?.key??null},readAllCards(){let s=[];for(let[o,a]of Object.entries(r())){if(!e.cardExists(a.key))continue;let i=e.readCard(a.key);i?s.push(i):t?.(`[card-store] could not read card "${o}" at key "${a.key}"`);}return s},readChecksumIndex(){let s={};for(let[o,a]of Object.entries(r()))s[o]=a.checksum;return s},changedSince(s){let o=r(),a=[];for(let[i,u]of Object.entries(o))s[i]!==u.checksum&&a.push(i);for(let i of Object.keys(s))o[i]||a.push(i);return a},validateUpsert(s,o){let a=r(),i=a[s],u=Object.entries(a).find(([,c])=>c.key===o);return i&&i.key!==o?{ok:false,error:`Card id "${s}" is already mapped to key "${i.key}", cannot remap to "${o}"`}:u&&u[0]!==s?{ok:false,error:`Key "${o}" is already mapped to card id "${u[0]}", cannot remap to "${s}"`}:{ok:true}},writeCard(s,o,a){let i=r(),u=a??i[s]?.key??e.defaultCardKey(s),c=e.writeCard(u,o);i[s]={key:u,checksum:c,updatedAt:new Date().toISOString()},e.writeIndex(i);},patchCard(s,o,a){let i=r(),u=i[s];if(!u||!e.cardExists(u.key))throw new Error(`card "${s}" not found`);let c=e.readCard(u.key);if(!c||typeof c!="object"||Array.isArray(c))throw new Error(`card "${s}" is not patchable`);let l=n(c,o,a),d=e.writeCard(u.key,l);i[s]={key:u.key,checksum:d,updatedAt:new Date().toISOString()},e.writeIndex(i);},removeCard(s){let o=r();o[s]&&(delete o[s],e.writeIndex(o));},readIndex(){return r()}}}function No(e,t){return {readSourceData(r,n){let s=e.read(`${r}/${n}`);if(s==null)return null;let o=s.trim();if(!o)return null;try{return JSON.parse(o)}catch{return o}},ingestSourceDataStaged(r,n,s,o){let a=t(s);e.write(`${r}/.staged/${o}/${n}`,a);},commitSourceData(r,n,s){let o=`${r}/.staged/${s}/${n}`,a=e.read(o);return a==null?false:(e.write(`${r}/${n}`,a),e.remove(o),true)},hasSource(r,n){return e.exists(`${r}/${n}`)}}}function hc(e){function t(r){let n=e.readAllEntries();if(!r)return n;let s=n.findIndex(o=>o.id===r);return s===-1?n:n.slice(s+1)}return {readEntriesAfterCursor(r){let n=t(r);return n.length===0?{events:[],newCursor:r}:{events:n.map(s=>s.event),newCursor:n[n.length-1].id}},pendingCount(r){return t(r).length},appendEvent(r){e.appendEntry({id:e.generateId(),event:r});}}}function gc(e,t){return {appendEntries(r,n){if(!r||n.length===0)return;let s=e.read(r)??[];e.write(r,[...s,...n]);},dispatchEntriesForJournalId(r,n){if(!r)return;let s=e.read(r);if(!(!s||s.length===0)){for(let o of s)try{n(o);}catch(a){let i=a instanceof Error?a.message:String(a);try{t(o,i);}catch{}}e.delete(r);}}}}var Er="v1",ut="board/graph",yc="board/lastJournalProcessedId";function pc(e){return `cards/${e}/runtime`}function vc(e){return {readRuntime(t){return e.read(pc(t))??{_sources:{}}},writeRuntime(t,r){e.write(pc(t),r);}}}function bg(e,t){let r={...e};for(let n of t.deleteKeys)delete r[n];return {...r,...t.shallowMerge}}function bc(e){return {readSnapshot(t){return e.readValues(t)},commitSnapshot(t,r){if(r.schemaVersion!==Er)throw new Error(`Unsupported snapshot schema version: ${r.schemaVersion}`);let n=e.readValues(t);if(n.version!==r.expectedVersion)return {ok:false,reason:"version-mismatch",currentVersion:n.version};let s=bg(n.values,r);return {ok:true,newVersion:e.writeValues(t,s,r.deleteKeys)}}}}function qo(e){function t(r){let n=e.read(r);return n==null?null:typeof n=="string"?n:JSON.stringify(n)}return {readTaskExecutorRef(){let r=t("task-executor");if(r?.trim())return Rn(r.trim())},writeTaskExecutorRef(r){e.write("task-executor",_n(r));},readChatHandlerRef(){let r=t("chat-handler");if(r?.trim())return Rn(r.trim())},writeChatHandlerRef(r){e.write("chat-handler",_n(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);},readChatHandler(){return t("chat-handler")?.trim()||void 0},writeChatHandler(r){e.write("chat-handler",r);}}}function kc(e){return {writeComputedValues(t,r){e.write(`cards/${t}/computed_values`,r);},readComputedValues(t){return e.read(`cards/${t}/computed_values`)},readAllComputedValues(){let t={};for(let r of e.listKeys("cards/")){let n=r.match(/^cards\/([^/]+)\/computed_values$/);n&&(t[n[1]]=e.read(r));}return t},writeDataObjects(t){for(let[r,n]of Object.entries(t))r&&e.write(`data-objects/${r}`,n);},readDataObject(t){return e.read(`data-objects/${t}`)},readAllDataObjects(){let t={};for(let r of e.listKeys("data-objects/"))t[r.slice(13)]=e.read(r);return t},writeStatusSnapshot(t){e.write("status",t);},readStatusSnapshot(){return e.read("status")}}}function kg(e){return e?.lastRequestedAt?!e.lastFetchedAt||e.lastFetchedAt<e.lastRequestedAt:false}function Sg(e,t){return e?.lastRequestedAt?kg(e)?"in-flight":!e.lastFetchedAt||e.lastFetchedAt<t?"dispatch":"idle":"dispatch"}function wg(e,t){let r={...e,lastFetchedAt:t};return delete r.lastError,r}function mc(e,t){let r={...e,lastError:t};return delete r.lastFetchedAt,r}function Cn(e,t){let r=t.state.tasks,n=t.config.tasks,s=Object.keys(r),o=$r(t),a={completed:0,failed:0,in_progress:0,pending:0,blocked:0,unresolved:0},i=new Map;for(let f of o.pending)i.set(f.taskName,f.waitingOn);for(let f of o.unresolved)i.set(f.taskName,f.missingTokens);for(let f of o.blocked)i.set(f.taskName,f.failedTokens);let u=new Map;for(let[f,p]of Object.entries(n))for(let k of p.requires??[]){let h=u.get(k)??[];h.push(f),u.set(k,h);}let c=s.sort().map(f=>{let p=r[f],k=n[f]??{requires:[],provides:[]};p.status==="completed"?a.completed+=1:p.status==="failed"?a.failed+=1:p.status==="in-progress"&&(a.in_progress+=1);let h=k.requires??[],m=k.provides??[],v=Object.keys(p.data??{}).sort(),w=h.filter(q=>t.state.availableOutputs.includes(q)),S=h.filter(q=>!t.state.availableOutputs.includes(q)),$=i.get(f)??S,_=new Set;for(let q of m)for(let F of u.get(q)??[])F!==f&&_.add(F);let C=p.failedAt,N=p.error?{message:p.error,code:"TASK_FAILED",at:C,source:"task-runtime"}:void 0;return {name:f,status:p.status,error:N,requires:h,requires_satisfied:w,requires_missing:S,provides_declared:m,provides_runtime:v,blocked_by:$,unblocks:Array.from(_).sort(),runtime:{attempt_count:p.executionCount??0,restart_count:p.retryCount??0,in_progress_since:p.status==="in-progress"?p.startedAt??null:null,last_transition_at:p.lastUpdated??null,last_completed_at:p.completedAt??null,last_restarted_at:p.startedAt??null,status_age_ms:p.lastUpdated?0:null}}});a.pending=o.pending.length,a.blocked=o.blocked.length,a.unresolved=o.unresolved.length;let l=c.map(f=>({name:f.name,fanOut:f.unblocks.length})).sort((f,p)=>p.fanOut-f.fanOut||f.name.localeCompare(p.name)),d=l.length>0?l[0]:{name:null,fanOut:0},y=new Set;for(let f of Object.values(n))for(let p of f.requires??[])y.add(p);let g=0;for(let[f,p]of Object.entries(n)){let k=(p.requires??[]).length===0,m=(p.provides??[]).some(v=>(u.get(v)??[]).some(w=>w!==f));k&&!m&&(g+=1);}return {schema_version:"v1",meta:{board:{path:e}},summary:{card_count:s.length,completed:a.completed,eligible:o.eligible.length,pending:a.pending,blocked:a.blocked,unresolved:a.unresolved,failed:a.failed,in_progress:a.in_progress,orphan_cards:g,topology:{edge_count:Array.from(y).length,max_fan_out_card:d.name,max_fan_out:d.fanOut}},cards:c}}function _g(){return new Date().toISOString()}function Sc(e,t,r,n,s,o,a){return async i=>{let u=[],c=r.cardStore.readCard(i.nodeId);if(!c)return "task-initiate-failure";let l=c.id,d=c.card_data??{},y=c.source_defs??[],g=y.filter(M=>M.optionalForCompletionGating!==true),f=r.cardRuntimeStore.readRuntime(l),p=false,k=()=>{p&&(r.cardRuntimeStore.writeRuntime(l,f),p=false);},h=M=>({...f._sources[M]??{}}),m=(M,V)=>{f._sources[M]=V,p=true;},v=i.taskState?.executionCount??0,w=f._lastExecutionCount;if(typeof w=="number"&&w!==v&&(f._sources={},p=true),w!==v&&(f._lastExecutionCount=v,p=true),i.update){let M=i.update,V=M.outputFile;if(V){let R=h(V);if(M.failure)m(V,mc(R,M.reason??"unknown"));else {let b=M.rqt;if(!R.lastFetchedAt||b>R.lastFetchedAt){let E=typeof M.deliveryToken=="string"?M.deliveryToken:void 0,A=false;E&&(A=r.fetchedSourcesStore.commitSourceData(l,V,E)),A?m(V,wg(R,b)):m(V,mc(R,`source delivery commit failed for ${V} token=${String(E)}`));}}k();}}let S={};for(let M of y)if(M.outputFile){let V=r.fetchedSourcesStore.readSourceData(l,M.outputFile);V!==null&&(S[M.bindTo]=V);}let $={};for(let[M,V]of Object.entries(i.state??{}))if(V!==null&&typeof V=="object"&&!Array.isArray(V)){let R=V[M];$[M]=R!==void 0?R:V;}else $[M]=V;let _={id:l,card_data:{...d},requires:$,source_defs:y,compute:c.compute};_._sourcesData=S,c.compute&&it.runSync(_,{sourcesData:S}),(o??r.outputStore.writeComputedValues.bind(r.outputStore))(l,_.computed_values??{});let C={...c},N=it.enrichSourcesSync(Array.isArray(c.source_defs)?c.source_defs:void 0,{card_data:c.card_data,requires:$}),q=e.value;C.source_defs=Array.isArray(N)?N.map(M=>({...M,boardDir:typeof M.boardDir=="string"&&M.boardDir?M.boardDir:q})):N;let F=_g(),re=i.update?void 0:F,U=g.filter(M=>{let V=M.outputFile;if(typeof V!="string"||!V)return true;let R=h(V);re&&(R={...R,queueRequestedAt:re},m(V,R));let b=R.queueRequestedAt??R.lastRequestedAt??F,E=Sg(R,b);return E==="in-flight"?false:E==="dispatch"});if(k(),U.length>0){let M=false,V=F;for(let R of U){let b=R.outputFile;if(typeof b!="string"||!b)continue;let E=h(b),A=E.queueRequestedAt??F;m(b,{...E,lastRequestedAt:A}),V=A,M=true;}return M&&k(),M&&(u.push({taskKind:"source-fetch",payload:{boardRef:oe(e),enrichedCard:C,callbackToken:i.callbackToken,rqt:V}}),r.executionRequestStore.appendEntries(t,u)),"task-initiated"}let ce=c.provides??[],qe={};for(let{bindTo:M,ref:V}of ce)qe[M]=it.resolve(_,V);return (a??r.outputStore.writeDataObjects.bind(r.outputStore))(qe),y.filter(M=>{if(M.optionalForCompletionGating!==true)return false;let V=h(M.outputFile);return !V.lastRequestedAt||!V.lastFetchedAt?true:V.lastFetchedAt<=V.lastRequestedAt}).length>0&&u.push({taskKind:"source-fetch",payload:{boardRef:oe(e),enrichedCard:C,callbackToken:i.callbackToken,rqt:F}}),n(i.nodeId,qe),u.length>0&&r.executionRequestStore.appendEntries(t,u),"task-initiated"}}var En={settings:{completion:"manual",refreshStrategy:"data-changed"},tasks:{}};function wc(e){return {[ut]:e.graph,[yc]:e.lastDrainedJournalId}}function _c(e){let t=e[ut],r=e[yc];if(!t||typeof t!="object")throw new Error(`State snapshot is missing required key: ${ut}`);return {graph:t,lastDrainedJournalId:typeof r=="string"?r:""}}function Rc(e){let t=e.requires,r=e.provides?.map(n=>n.bindTo)??[];return {requires:t&&t.length>0?t:void 0,provides:r,taskHandlers:["card-handler"],description:e.meta?.title??e.id}}function Q(e){return e!==void 0?{status:"success",data:e}:{status:"success"}}function j(e){return {status:"fail",error:e}}function ee(e){return {status:"error",error:e instanceof Error?e.message:String(e)}}function Rg(e){let t=new TextEncoder().encode(e),r=Array.from(t,n=>String.fromCharCode(n)).join("");return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Cc(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),s=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(s)}function xn(e){try{let t=JSON.parse(Cc(e));return typeof t?.t=="string"?{taskName:t.t}:null}catch{return null}}function $g(e){return Rg(JSON.stringify(e))}function $c(e){try{let t=JSON.parse(Cc(e));return typeof t?.cbk=="string"&&typeof t?.cid=="string"&&typeof t?.b=="string"&&typeof t?.d=="string"?t:null}catch{return null}}function Ce(){return new Date().toISOString()}function Cg(e,t){let r=t.onWarn??(()=>{}),n=oe(e);function s(R){if(R.length!==0)try{let b=t.publishBoardChangeNotifications?.(R);b&&typeof b.catch=="function"&&b.catch(E=>r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${E instanceof Error?E.message:String(E)}`));}catch(b){r(`[board-live-cards-public] publishBoardChangeNotifications failed: ${b instanceof Error?b.message:String(b)}`);}}function o(){let R=i().readCardStoreRef();if(!R)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let b=t.kvStorageForRef(R);return {readIndex(){return b.read("_index")},writeIndex(E){b.write("_index",E);},readCard(E){return b.read(E)},writeCard(E,A){return b.write(E,A),t.hashFn(A)},cardExists(E){return b.read(E)!==null},defaultCardKey(E){return E}}}let a={readValues(R){let b=t.kvStorage("state-snapshot"),E=b.listKeys().sort();if(E.length===0)return {version:null,values:{}};let A={};for(let Y of E)A[Y]=b.read(Y);return {version:t.hashFn(A),values:A}},writeValues(R,b,E){let A=t.kvStorage("state-snapshot");for(let Y of E)A.delete(Y);for(let[Y,te]of Object.entries(b))A.write(Y,te);return t.hashFn(b)}},i=()=>qo(t.kvStorage("config")),u=()=>bc(a),c=()=>hc(t.journalAdapter()),l=()=>$n(o(),r),d=()=>{let R=i().readOutputsStoreRef();if(!R)throw new Error(`Board at ${e.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);return kc(t.kvStorageForRef(R))};function y(){return !!u().readSnapshot(e.value).values[ut]}function g(){let R=u().readSnapshot(e.value);if(!R.values[ut])throw new Error(`Board not initialized at ${e.value}`);return _c(R.values)}function f(R,b){let E=u().commitSnapshot(e.value,{schemaVersion:Er,expectedVersion:b,commitId:t.genId(),committedAt:Ce(),deleteKeys:[],shallowMerge:wc(R)});if(!E.ok)throw new Error(`Snapshot commit failed (version mismatch): expected=${b??"null"} current=${E.currentVersion??"null"}`)}function p(R){c().appendEvent(R);}async function k(){let R=(I,D)=>{let ae=I.payload,ze=(ae?.enrichedCard??{}).id??ae?.cardId??"unknown";p({type:"task-failed",taskName:ze,error:D,timestamp:Ce()});},b=gc(t.kvStorage("execution-requests"),R),E=vc(t.kvStorage("card-runtime")),A=No(t.blobStorage("sources"),I=>t.resolveBlob(I)),Y=new Map,te={readRuntime(I){return Y.get(I)??E.readRuntime(I)},writeRuntime(I,D){Y.set(I,D);}},we=[],_e=new Map,Be={readSourceData(I,D){let ae=`${I}/${D}`;return _e.has(ae)?_e.get(ae):A.readSourceData(I,D)},ingestSourceDataStaged(I,D,ae,Et){A.ingestSourceDataStaged(I,D,ae,Et);},commitSourceData(I,D,ae){let Et=`${I}/.staged/${ae}/${D}`,Ir=t.blobStorage("sources").read(Et);if(Ir==null)return false;let xt=`${I}/${D}`,Bo=Ir.trim();try{_e.set(xt,JSON.parse(Bo));}catch{_e.set(xt,Bo);}return we.push({cardId:I,outputFile:D,deliveryToken:ae}),true},hasSource(I,D){let ae=`${I}/${D}`;return _e.has(ae)?true:A.hasSource(I,D)}},De={cardStore:l(),cardRuntimeStore:te,fetchedSourcesStore:Be,outputStore:d(),executionRequestStore:b},dt=g(),lt=Sn(dt.graph),{events:$t,newCursor:Ct}=c().readEntriesAfterCursor(dt.lastDrainedJournalId),ft=[],An=[],In=[],Mo=new Map,Ic=(I,D)=>{ft.push({type:"task-completed",taskName:I,data:D,timestamp:Ce()});},Lo=(I,D)=>p({type:"task-failed",taskName:I,error:D,timestamp:Ce()}),Tr=uc(lt,{handlers:{"card-handler":Sc(e,Ct,De,Ic,Lo,(I,D)=>{An.push({cardId:I,values:D});},I=>{In.push(I);})}});for(ft=$t;ft.length>0;){let I=ft;ft=[];for(let D of I)if(D.type==="task-restart"){let ae=De.cardStore.readCard(D.taskName);ae&&Mo.set(D.taskName,ae);}Tr.pushAll(I),await Tr.waitForHandlers();}let Vo=Tr.getState();await Tr.dispose({wait:true});let Pc=u().readSnapshot(e.value).version;f({lastDrainedJournalId:Ct,graph:Rr(Vo)},Pc);for(let{cardId:I,values:D}of An)De.outputStore.writeComputedValues(I,D);for(let I of In)De.outputStore.writeDataObjects(I);for(let[I,D]of Y)E.writeRuntime(I,D);for(let{cardId:I,outputFile:D,deliveryToken:ae}of we)A.commitSourceData(I,D,ae);let Ar;try{Ar=Cn(n,Vo),De.outputStore.writeStatusSnapshot(Ar);}catch(I){r(`[board-live-cards-public] status publish failed: ${I instanceof Error?I.message:String(I)}`);}let Ut=[];for(let{cardId:I,values:D}of An)Ut.push({kind:"computed_values",cardId:I,values:D});for(let I of In)for(let[D,ae]of Object.entries(I))D&&Ut.push({kind:"data_object",key:D,payload:ae});for(let[I,D]of Mo)Ut.push({kind:"card_refreshed",cardId:I,card:D});Ar!==void 0&&Ut.push({kind:"status",status:Ar}),s(Ut);let Oc=i().readTaskExecutorRef()??{howToRun:"built-in",whatToRun:oe({kind:"built-in",value:"source-cli-task-executor"})};b.dispatchEntriesForJournalId(Ct,I=>{if(I.taskKind!=="source-fetch"){r(`[process-accumulated-events] unknown taskKind "${I.taskKind}" \u2014 skipping`);return}let D=I.payload,ae=D.enrichedCard?.id??"unknown",Et=D.enrichedCard?.source_defs??[];for(let ze of Et){if(!ze.outputFile){r(`[dispatch] source "${ze.bindTo}" has no outputFile \u2014 skipping`);continue}let Ir=$g({cbk:D.callbackToken,rg:e.value,br:oe(e),cid:ae,b:ze.bindTo,d:ze.outputFile,cs:void 0,rqt:D.rqt});t.dispatchExecution(Oc,{source_def:ze,base_ref:oe(e),callback:{token:Ir,via:t.selfRef}}).catch(xt=>Lo(ae,xt instanceof Error?xt.message:String(xt)));}});}async function h(){try{let R=()=>{let E=g(),{events:A}=c().readEntriesAfterCursor(E.lastDrainedJournalId);A.length<=0||(h(),t.requestProcessAccumulated?.());},b=await Ko(t.lock,k,R);return Q({ran:b!==!1})}catch(R){return ee(R)}}function m(R){try{let b=R.params?.cardStoreRef;if(!b)return j("init requires params.cardStoreRef \u2014 create a card store with card-store-cli and pass its ref here");if(!y()){let te=kn(En);f({lastDrainedJournalId:"",graph:Rr(te)},null);}let E=R.params?.outputsStoreRef;if(!E)return j("init requires params.outputsStoreRef \u2014 pass the outputs store ref here");let A=i();A.writeCardStoreRef(b),A.writeOutputsStoreRef(E);let Y=R.body??{};Y["task-executor-ref"]&&A.writeTaskExecutorRef(Y["task-executor-ref"]),Y["chat-handler-ref"]&&A.writeChatHandlerRef(Y["chat-handler-ref"]);try{d().writeStatusSnapshot(Cn(n,Sn(g().graph)));}catch{}return Q()}catch(b){return ee(b)}}function v(R){try{let b=d().readStatusSnapshot();if(!b){b=Cn(n,Sn(g().graph));try{d().writeStatusSnapshot(b);}catch{}}return Q(b)}catch(b){return ee(b)}}function w(R){try{let b=R.params?.id;return b?(p({type:"task-removal",taskName:b,timestamp:Ce()}),h(),Q()):j("removeCard requires params.id")}catch(b){return ee(b)}}function S(R){try{let b=R.params?.id;return b?(p({type:"task-restart",taskName:b,timestamp:Ce()}),h(),Q()):j("retrigger requires params.id")}catch(b){return ee(b)}}async function $(R){return h()}function _(R){try{let b=R.params?.cardId,E=R.params?.all,A=!!R.params?.restart;if(!b&&!E)return j("upsertCard requires --card-id <id> or --all");let Y=E?l().readAllCards().map(te=>te.id):[b];for(let te of Y)if(!l().readCard(te))return j(`Card "${te}" not found in board at ${e.value}`);for(let te of Y){let we=l().readCard(te),_e=Rc(we),Be=t.hashFn(_e),De=t.kvStorage("card-upsert"),dt=De.read(te),lt=dt?.taskConfigHash!==Be;if(!(!lt&&!A)){if(lt){let $t=dt?.blobRef??l().readCardKey(te)??te;p({type:"task-upsert",taskName:te,taskConfig:_e,timestamp:Ce()}),De.write(te,{blobRef:$t,taskConfigHash:Be,updatedAt:Ce()});}A&&p({type:"task-restart",taskName:te,timestamp:Ce()});}}return h(),Q()}catch(b){return ee(b)}}function C(R){try{let b=R.params?.token;if(!b)return j("taskFailed requires params.token");let E=R.params?.error??"unknown error",A=xn(b);return A?(p({type:"task-failed",taskName:A.taskName,error:E,timestamp:Ce()}),h(),Q()):j("Invalid callback token")}catch(b){return ee(b)}}function N(R){try{let b=R.params?.token;if(!b)return j("taskProgress requires params.token");let A=(R.body??{}).update??{},Y=xn(b);return Y?(p({type:"task-progress",taskName:Y.taskName,update:A,timestamp:Ce()}),h(),Q()):j("Invalid callback token")}catch(b){return ee(b)}}function q(R){try{let b=R.params?.token,E=R.params?.ref;if(!b)return j("sourceDataFetched requires params.token");if(!E)return j("sourceDataFetched requires params.ref");let A=$c(b);if(!A)return j("Invalid source token");let{cbk:Y,cid:te,b:we,d:_e,cs:Be,rqt:De}=A,dt=No(t.blobStorage("sources"),ft=>t.resolveBlob(ft)),lt=t.genId();dt.ingestSourceDataStaged(te,_e,Re(E),lt);let $t=xn(Y);if(!$t)return j("Invalid callback token embedded in source token");let Ct=Ce();return p({type:"task-progress",taskName:$t.taskName,update:{bindTo:we,outputFile:_e,fetchedAt:Ct,deliveryToken:lt,sourceChecksum:Be,rqt:De},timestamp:Ct}),h(),Q()}catch(b){return ee(b)}}function F(R){try{let b=R.params?.token,E=R.params?.reason??"unknown";if(!b)return j("sourceDataFetchFailure requires params.token");let A=$c(b);if(!A)return j("Invalid source token");let{cbk:Y,b:te,d:we,cs:_e}=A,Be=xn(Y);return Be?(p({type:"task-progress",taskName:Be.taskName,update:{bindTo:te,outputFile:we,failure:!0,reason:E,sourceChecksum:_e},timestamp:Ce()}),h(),Q()):j("Invalid callback token embedded in source token")}catch(b){return ee(b)}}function re(R){try{let b=i().readCardStoreRef();return b?Q({storeRef:b}):j(`Board at ${e.value} has no card store configured`)}catch(b){return ee(b)}}function U(R){try{let b=i().readOutputsStoreRef();return b?Q({storeRef:b}):j(`Board at ${e.value} has no outputs store configured`)}catch(b){return ee(b)}}function ce(R){try{let b=R.params?.key;if(!b)return j("getConfig requires params.key");let E=i(),A;switch(b){case "task-executor":A=E.readTaskExecutorRef()??null;break;case "chat-handler":A=E.readChatHandlerRef()??null;break;case "card-store-ref":A=E.readCardStoreRef();break;case "outputs-store-ref":A=E.readOutputsStoreRef();break;default:return j(`getConfig: unknown key "${b}"`)}return Q({value:A})}catch(b){return ee(b)}}function qe(R){try{let b=R.params?.key;if(!b)return j("getOutputsDataObject requires params.key");let E=d().readDataObject(b);return Q(E)}catch(b){return ee(b)}}function ct(R){try{return Q(d().readAllDataObjects())}catch(b){return ee(b)}}function M(R){try{let b=R.params?.key;if(!b)return j("getOutputsComputedValues requires params.key");let E=d().readComputedValues(b);return Q(E)}catch(b){return ee(b)}}function V(R){try{return Q(d().readAllComputedValues())}catch(b){return ee(b)}}return {init:m,status:v,getCardStoreRef:re,getOutputsStoreRef:U,getConfig:ce,getOutputsDataObject:qe,getAllOutputsDataObjects:ct,getOutputsComputedValues:M,getAllOutputsComputedValues:V,removeCard:w,retrigger:S,processAccumulatedEvents:$,upsertCard:_,taskFailed:C,taskProgress:N,sourceDataFetched:q,sourceDataFetchFailure:F}}function Eg(e,t){let r=()=>qo(t.kvStorage("config"));function n(){let h=r().readCardStoreRef();if(!h)throw new Error(`Board at ${e.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);let m=t.kvStorageForRef(h);return {readIndex(){return m.read("_index")},writeIndex(v){m.write("_index",v);},readCard(v){return m.read(v)},writeCard(v,w){return m.write(v,w),t.hashFn(w)},cardExists(v){return m.read(v)!==null},defaultCardKey(v){return v}}}let s=()=>$n(n(),t.onWarn??(()=>{}));function o(h,m){let v=t.validateSchema(m),w=[],S=r().readTaskExecutorRef();if(S&&Array.isArray(m.source_defs))for(let _ of m.source_defs){let C=typeof _.bindTo=="string"?_.bindTo:"(unknown)";try{let N;try{N=t.invokeExecutorSync(S,"validate-source-def",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(_)});}catch(F){let re=F;if(N=typeof re?.stdout=="string"?re.stdout:"",!N.trim()){w.push(`source "${C}": executor validate-source-def failed \u2014 ${F instanceof Error?F.message:String(F)}`);continue}}let q=JSON.parse(N.trim());if(!q.ok&&Array.isArray(q.errors))for(let F of q.errors)w.push(`source "${C}": ${F}`);}catch(N){w.push(`source "${C}": executor validate-source-def failed \u2014 ${N instanceof Error?N.message:String(N)}`);}}let $=[...v.errors,...w];return Q({cardId:h,isValid:$.length===0,issues:$})}function a(h,m,v){let w=r().readTaskExecutorRef();if(!w)return j("No task-executor registered for this board");let S=typeof h.bindTo=="string"?h.bindTo:"source",$=t.makeTempFilePath(`probe-in-${S}`),_=t.makeTempFilePath(`probe-out-${S}`),C=t.makeTempFilePath(`probe-err-${S}`,".txt"),N={...h,boardDir:e.value,_projections:m},q=oe({kind:"fs-path",value:$}),F=oe({kind:"fs-path",value:_}),re=oe({kind:"fs-path",value:C});t.absoluteBlob.write($,JSON.stringify(N,null,2));let U=null;try{if(t.invokeExecutorSync(w,"run-source-fetch",["--in-ref",q,"--out-ref",F,"--err-ref",re],{timeout:h.timeout??t.executorTimeouts?.probeMs??6e4}),U=t.absoluteBlob.read(_),U===null)return j("Executor produced no output file")}catch(ce){let qe=t.absoluteBlob.read(C)?.trim()??(ce instanceof Error?ce.message:String(ce));return j(`Probe failed: ${qe}`)}finally{try{t.absoluteBlob.remove($);}catch{}try{t.absoluteBlob.remove(C);}catch{}}if(v){let ce=Re(v);t.absoluteBlob.write(ce.value,U);}else try{t.absoluteBlob.remove(_);}catch{}return Q({bindTo:S,resultSizeBytes:U.length})}function i(h){try{let m=h.params?.cardId,v=h.params?.all;if(!m&&!v)return j("validateCard requires --card-id <id> or --all");let w=v?s().readAllCards().map($=>$.id):[m],S=[];for(let $ of w){let _=s().readCard($);if(!_){S.push({cardId:$,isValid:!1,issues:[`Card "${$}" not found`]});continue}let C=o($,_);if(C.status!=="success")return C;S.push(C.data);}return Q(S)}catch(m){return ee(m)}}function u(h){try{if(!h.body||typeof h.body!="object"||Array.isArray(h.body))return j("validateCardPreflight requires card JSON object in body");let m=h.body,v=m["card-content"]??m,w=typeof v.id=="string"?v.id:"(unknown)",S=o(w,v),$=r().readTaskExecutorRef();if($)try{let _=t.invokeExecutorSync($,"validate-card-preflight",[],{timeout:t.executorTimeouts?.validationMs??1e4,input:JSON.stringify(v)}),C=JSON.parse(_.trim());if(!C.ok&&Array.isArray(C.errors)&&C.errors.length>0){let N=[...S.status==="success"?S.data.issues:[],...C.errors];return Q({cardId:w,isValid:!1,issues:N})}}catch{}return S}catch(m){return ee(m)}}function c(h){try{let m=h.params?.cardId,v=h.params?.sourceIdx,w=h.params?.outRef;if(!m)return j("probeSource requires params.cardId");if(v===void 0)return j("probeSource requires params.sourceIdx");let $=(h.body??{})["mock-projections"]??{},_=s().readCard(m);if(!_)return j(`Card "${m}" not found`);let C=_.source_defs??[];return v<0||v>=C.length?j(`sourceIdx ${v} out of range (card has ${C.length} source(s))`):a(C[v],$,w)}catch(m){return ee(m)}}function l(h){try{let m=h.params?.outRef,v=h.body;if(!v)return j('probeTmpSource requires body with "source-def" and "mock-projections"');let w=v["source-def"],S=v["mock-projections"]??{};return w?a(w,S,m):j('probeTmpSource body requires "source-def"')}catch(m){return ee(m)}}function d(h){try{let m=h.params?.sourceIdx,v=h.params?.outRef;if(m===void 0)return j("probeSourcePreflight requires params.sourceIdx");if(!h.body||typeof h.body!="object"||Array.isArray(h.body))return j("probeSourcePreflight requires card JSON object in body");let w=h.body,S=w["card-content"]??w,$=w["mock-projections"]??{},_=S.source_defs??[];if(m<0||m>=_.length)return j(`sourceIdx ${m} out of range (card has ${_.length} source(s))`);let C=_[m],N=r().readTaskExecutorRef();if(N){let q=typeof C.bindTo=="string"?C.bindTo:"source";try{let F={...C,_projections:$},re=t.invokeExecutorSync(N,"probe-source-preflight",[],{timeout:C.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(F)}),U=JSON.parse(re.trim());return U.ok?Q({bindTo:q,reachable:U.reachable,latencyMs:U.latencyMs,note:U.note}):j(U.error??"Preflight probe failed")}catch{}}return a(C,$,v)}catch(m){return ee(m)}}function y(h){try{let m=r().readTaskExecutorRef();if(!m)return j("No task-executor registered for this board");let v=t.invokeExecutorSync(m,"describe-capabilities",[],{timeout:t.executorTimeouts?.describeMs??1e4});return Q(JSON.parse(v.trim()))}catch(m){return ee(m)}}function g(h){try{let m=h.body;if(!m||!Array.isArray(m.ops))return j("updatesInCardStore requires body.ops array");let v=m.ops,w=s();for(let S of v){let $=S.op,_=S.id;if(!_)return j('op is missing "id"');if($==="update"){let C=S["card-content"];if(!C)return j(`update op for "${_}" is missing "card-content"`);w.writeCard(_,C);}else return j(`Unknown op type: "${$??"(none)"}"`)}return Q()}catch(m){return ee(m)}}function f(h){try{let m=h.body;if(!m||!Array.isArray(m.ids))return j("readFromCardStore requires body.ids array");let v=m.ids,w=s(),S=v.map($=>({id:$,"card-content":w.readCard($)}));return Q({cards:S})}catch(m){return ee(m)}}function p(h){try{if(!h.body||typeof h.body!="object"||Array.isArray(h.body))return j("evalCardCompute requires a JSON object in body");let m=h.body,v=m["card-content"]??m,w=typeof v.id=="string"?v.id:"(unknown)",S=m["mock-fetched-sources"]??{},$=m["mock-requires"]??{},_=v.compute;if(!_||!Array.isArray(_)||_.length===0)return Q({cardId:w,ok:!0,computed_values:{},errors:[]});let C={id:w,card_data:v.card_data??{},requires:$,source_defs:v.source_defs,compute:_},N=it.runSync(C,{sourcesData:S}),q=N.node.computed_values??{},F=N.errors??[];return Q({cardId:w,ok:F.length===0,computed_values:q,errors:F})}catch(m){return ee(m)}}function k(h){try{if(!h.body||typeof h.body!="object"||Array.isArray(h.body))return j("simulateCardCycle requires a JSON object in body");let m=h.body,v=m["card-content"]??m,w=typeof v.id=="string"?v.id:"(unknown)",S=m["mock-fetched-sources"]??{},$=m["mock-requires"]??{},_=o(w,v),C=_.status==="success"?{isValid:_.data.isValid,issues:_.data.issues}:{isValid:!1,issues:[_.status==="fail"?_.error:"internal error"]},N=v.source_defs??[],q=v.card_data??{},F=[],re=[];if(N.length>0){F=it.enrichSourcesSync(N,{card_data:q,requires:$});for(let b of F){let E=b.projections,A=b._projections;if(E&&A){for(let Y of Object.keys(E))if(A[Y]===void 0){let te=typeof b.bindTo=="string"?b.bindTo:"(unknown)";re.push({bindTo:te,key:Y,error:`Projection "${Y}" resolved to undefined`});}}}}let U=[],ce=m["task-executor-ref"],qe=(ce?.howToRun&&ce?.whatToRun?ce:void 0)??r().readTaskExecutorRef();for(let b=0;b<F.length;b++){let E=F[b],A=typeof E.bindTo=="string"?E.bindTo:`source_${b}`;if(!qe){U.push({bindTo:A,skipped:!0,error:"No task executor configured"});continue}try{let Y={...E},te=t.invokeExecutorSync(qe,"probe-source-preflight",[],{timeout:E.timeout??t.executorTimeouts?.preflightMs??6e4,input:JSON.stringify(Y)}),we=JSON.parse(te.trim());U.push({bindTo:A,reachable:we.reachable,latencyMs:we.latencyMs,error:we.ok?void 0:we.error});}catch{U.push({bindTo:A,skipped:!0,error:"Executor does not support probe-source-preflight"});}}let ct=v.compute,M={},V=[];if(ct&&Array.isArray(ct)&&ct.length>0){let b={id:w,card_data:q,requires:$,source_defs:v.source_defs,compute:ct},E=it.runSync(b,{sourcesData:S});M=E.node.computed_values??{},V=E.errors??[];}let R=C.isValid&&re.length===0&&V.length===0&&U.every(b=>b.reachable!==!1);return Q({cardId:w,ok:R,validation:C,source_probes:U,projection_errors:re,computed_values:M,compute_errors:V})}catch(m){return ee(m)}}return {validateCard:i,validateCardPreflight:u,probeSource:c,probeTmpSource:l,probeSourcePreflight:d,evalCardCompute:p,simulateCardCycle:k,describeTaskExecutorCapabilities:y,updatesInCardStore:g,readFromCardStore:f}}function xg(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {get(s){try{let o=s.params?.id;if(o){let a=e.readCard(o);return a?t({cards:[a]}):r(`card "${o}" not found`)}return t({cards:e.readAllCards()})}catch(o){return n(o)}},set(s){try{let o=s.body;if(o==null)return r("set requires a body (card object or array of cards)");let a=Array.isArray(o)?o:[o];for(let i of a){if(typeof i.id!="string")return r("each card must have a string `id` field");e.writeCard(i.id,i);}return t({count:a.length})}catch(o){return n(o)}},del(s){try{let o=s.body?.ids??[],a=s.params?.id,i=a?[...o,a]:o;if(i.length===0)return r("del requires body.ids (string[]) or params.id");for(let u of i)e.removeCard(u);return t({count:i.length})}catch(o){return n(o)}},patch(s){try{let o=s.params?.id,a=s.params?.path;if(!o)return r("patch requires params.id");if(!a)return r("patch requires params.path");let i=s.body,u=i&&Object.prototype.hasOwnProperty.call(i,"value")?i.value:s.body;return e.patchCard(o,a,u),t({count:1})}catch(o){return n(o)}}}}function Tg(e){function t(s){return {status:"success",data:s}}function r(s){return {status:"fail",error:s}}function n(s){return {status:"error",error:s instanceof Error?s.message:String(s)}}return {list(s){try{let o=s.params?.prefix??"";return t({artifacts:e.list(o)})}catch(o){return n(o)}},head(s){try{let o=s.params?.key;return o?t({artifact:e.head(o)}):r("head requires params.key")}catch(o){return n(o)}},put(s){try{let o=s.params?.key,a=s.params?.contentType;if(!o)return r("put requires params.key");let i=s.body;if(typeof i=="string")return t({artifact:e.putText(o,i,a)});if(i&&typeof i=="object"&&typeof i.text=="string")return t({artifact:e.putText(o,i.text,a)});if(i&&typeof i=="object"&&Array.isArray(i.bytes)){let u=i.bytes,c=new Uint8Array(u.map(l=>Math.max(0,Math.min(255,Number(l)||0))));return t({artifact:e.putBytes(o,c,a)})}return r("put requires body as string, {text}, or {bytes:number[]}")}catch(o){return n(o)}},get(s){try{let o=s.params?.key,a=s.params?.as??"base64";if(!o)return r("get requires params.key");let i=e.head(o);if(!i)return r(`artifact "${o}" not found`);if(a==="text"){let c=e.getText(o);return c===null?r(`artifact "${o}" not found`):t({key:o,contentType:i.contentType,size:i.size,text:c})}let u=e.getBytes(o);return u===null?r(`artifact "${o}" not found`):t({key:o,contentType:i.contentType,size:i.size,bytes:[...u]})}catch(o){return n(o)}},del(s){try{let o=s.params?.key;return o?(e.remove(o),t({ok:!0})):r("del requires params.key")}catch(o){return n(o)}}}}var Tn=".artifacts-index.json";function Ec(){return new Date().toISOString()}function xc(e){return new TextEncoder().encode(e).byteLength}function xr(e){let t=e.read(Tn);if(!t)return {entries:{}};try{let r=JSON.parse(t);if(r&&r.entries&&typeof r.entries=="object")return r}catch{}return {entries:{}}}function Do(e,t){e.write(Tn,JSON.stringify(t,null,2));}function Ag(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function Tc(e,t,r){e.entries[t]={key:t,size:r.size,updatedAt:r.updatedAt,contentType:r.contentType};}function Fo(e){let t=String(e||"").match(/^(\d+)[-_]/);return t?parseInt(t[1],10):0}function Ig(e){let t=String(e||"").trim();if(!t)return "upload.bin";let r=Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"));return (r>=0?t.slice(r+1):t)||"upload.bin"}function Pg(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function Og(e){if(!e||e===".")return "";let t=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return t?`.${t}`:""}function jg(e){let t=Ig(e),r=t.lastIndexOf(".");return r<=0||r===t.length-1?{stem:t,ext:""}:{stem:t.slice(0,r),ext:t.slice(r)}}function Ng(e){let t=e.lastIndexOf("/");return t>=0?e.slice(t+1):e}function qg(e){function t(r){let n=e.stat?Ag(e.stat(r)):null;if(n)return n;let o=xr(e).entries[r];if(o)return {...o};if(!e.exists(r))return null;let a=e.read(r);return a===null?{key:r}:{key:r,size:xc(a)}}return {exists(r){return e.exists(r)},putText(r,n,s="text/plain; charset=utf-8"){e.write(r,n);let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??Ec(),o.size=o.size??xc(n);let a=xr(e);return Tc(a,r,o),Do(e,a),o},putBytes(r,n,s="application/octet-stream"){if(e.writeBytes)e.writeBytes(r,n);else {let i=JSON.stringify({__kind:"bytes-array",data:[...n]});e.write(r,i);}let o=t(r)??{key:r};o.contentType=s,o.updatedAt=o.updatedAt??Ec(),o.size=o.size??n.byteLength;let a=xr(e);return Tc(a,r,o),Do(e,a),o},getText(r){let n=e.read(r);if(n===null){if(!e.readBytes)return null;let s=e.readBytes(r);return s===null?null:Buffer.from(s).toString("utf-8")}try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new TextDecoder("utf-8").decode(new Uint8Array(s.data))}catch{}return n},getBytes(r){if(e.readBytes){let s=e.readBytes(r);if(s!==null)return s}let n=e.read(r);if(n===null)return null;try{let s=JSON.parse(n);if(s&&s.__kind==="bytes-array"&&Array.isArray(s.data))return new Uint8Array(s.data)}catch{}return new TextEncoder().encode(n)},head:t,list(r=""){let n=new Map;if(e.listKeys)for(let o of e.listKeys(r)){if(o===Tn)continue;let a=t(o)??{key:o};n.set(o,a);}let s=xr(e);for(let[o,a]of Object.entries(s.entries))o===Tn||r&&!o.startsWith(r)||n.has(o)||n.set(o,{...a});return [...n.values()].sort((o,a)=>o.key.localeCompare(a.key))},remove(r){e.remove(r);let n=xr(e);delete n.entries[r],Do(e,n);}}}function Dg(e,t){let r=t?.indexFileName||".index.json";function n(d){return `${d}/${r}`}function s(d){let y=e.getText(n(d));if(!y)return [];try{let g=JSON.parse(y);return Array.isArray(g)?g.filter(f=>f&&typeof f.stored_name=="string").map(f=>({serial:Number(f.serial||Fo(String(f.stored_name))||0),role:String(f.role||"system").toLowerCase(),stored_name:String(f.stored_name),path:typeof f.path=="string"?f.path:`${d}/chats/${String(f.stored_name)}`,updated_at:typeof f.updated_at=="string"?f.updated_at:null})):[]}catch{return []}}function o(d,y){e.putText(n(d),JSON.stringify(y,null,2),"application/json; charset=utf-8");}function a(d){let y=s(d),g=0;for(let f of y){let p=Number(f.serial||0);Number.isFinite(p)&&p>g&&(g=p);}return g+1}function i(d,y){let g=s(d);g.push(y),o(d,g);}function u(d){let y=s(d),g=[];for(let f of y){let p=`${d}/${f.stored_name}`,k=e.getText(p);k!==null&&g.push({serial:Number(f.serial||Fo(f.stored_name)||0),role:String(f.role||"system").toLowerCase(),text:k,path:typeof f.path=="string"?f.path:`${d}/chats/${f.stored_name}`,stored_name:f.stored_name,updated_at:f.updated_at||null});}return g.sort((f,p)=>f.serial-p.serial||f.stored_name.localeCompare(p.stored_name)),g}function c(d){let y=`${d}/`;for(let g of e.list(y))e.remove(g.key);}function l(d){let y=`${d}/`,g=e.list(y),f=0,p=0,k=false;for(let h of g){let m=h.key.slice(y.length);if(m===".processing"){k=true;continue}if(!/^(\d+)[-_]([a-z0-9_-]+)\.txt$/i.test(m))continue;f+=1;let v=h.updatedAt?Number(new Date(h.updatedAt).getTime()||0):0;v>p&&(p=v);}return {count:f,latest_mtime_ms:p,processing:k}}return {indexKey:n,loadIndex:s,saveIndex:o,nextSerial:a,appendIndexRecord:i,readRecords:u,clear:c,readSignal:l}}function Fg(e){function t(s,o){let a=0,i=[];Array.isArray(o)&&i.push(...o);for(let u of e.list(`${s}/`))i.push(Ng(u.key));for(let u of i){let c=Fo(u);Number.isFinite(c)&&c>a&&(a=c);}return a+1}function r(s,o,a){let i=Number(a?.maxLen||32),{stem:u,ext:c}=jg(s),l=Og(c),d=Pg(u),y=`${String(o).padStart(3,"0")}-`,g=l,f=i-y.length-g.length;f<1&&(g="",f=i-y.length);let p=d.slice(0,Math.max(1,f)),k=`${y}${p}${g}`;return k.length>i&&(k=k.slice(0,i).replace(/\.$/,"")),k}function n(s,o,a){let i=t(s,a?.seedNames),u=r(o,i,{maxLen:a?.maxLen});for(;e.exists(`${s}/${u}`);)i+=1,u=r(o,i,{maxLen:a?.maxLen});return u}return {nextSerial:t,buildStoredName:r,allocateStoredName:n}}function Mg(){function e(s,o){if(!Array.isArray(s))return [];let a=[];for(let i of s){if(!i||typeof i!="object")continue;let u=i;typeof u.stored_name=="string"&&a.push({name:typeof u.name=="string"?u.name:u.stored_name,stored_name:u.stored_name,size:typeof u.size=="number"&&Number.isFinite(u.size)?u.size:null,mime_type:typeof u.mime_type=="string"?u.mime_type:null,path:typeof u.path=="string"?u.path:null,uploaded_at:typeof u.uploaded_at=="string"?u.uploaded_at:o||null});}return a}function t(s){return !s||typeof s!="object"?[]:e(s.files,void 0)}function r(s,o){let a=t(s);if(o.length===0)return s.files=a,a;let i=new Set(a.map(u=>u.stored_name));for(let u of o)i.has(u.stored_name)||(a.push(u),i.add(u.stored_name));return s.files=a,a}function n(s,o,a){let i=t(s);if(!Number.isInteger(o)||o<0||o>=i.length)return {ok:false,reason:"index_out_of_range"};let u=i[o];return !u||!u.stored_name?{ok:false,reason:"missing_stored_name"}:a&&a!==u.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:u}}return {read:t,normalizeIncoming:e,merge:r,resolve:n}}function Ib(){return {async invoke(e,t){if(e.howToRun!=="local-node")return {dispatched:false,error:`createNodeSpawnInvocationAdapter: unsupported howToRun "${e.howToRun}"`};let r="";try{let o=e.whatToRun,a=typeof o=="string"?Re(o):o;a.kind==="fs-path"&&(r=a.value);}catch{r="";}if(!r)return {dispatched:false,error:"createNodeSpawnInvocationAdapter: could not resolve fs-path from whatToRun"};let n={...t};if(n.chatsKeyPrefix&&n.chatsBlobBasePath){let o=String(n.chatsKeyPrefix).split("/")[0];n.chatDir=pt(String(n.chatsBlobBasePath),o);}delete n.chatsKeyPrefix,delete n.chatsBlobBasePath;let s=Buffer.from(JSON.stringify(n)).toString("base64");try{return spawn(process.execPath,[r,"--boardId",String(t.boardId??""),"--cardId",String(t.cardId??""),"--extraEncJson",s],{stdio:"ignore",windowsHide:!0}).unref(),{dispatched:!0}}catch(o){return {dispatched:false,error:o instanceof Error?o.message:String(o)}}},async describe(e){if(e.howToRun!=="local-node")return null;let t="";try{let r=e.whatToRun,n=typeof r=="string"?Re(r):r;n.kind==="fs-path"&&(t=n.value);}catch{t="";}if(!t)return null;try{let r=spawnSync(process.execPath,[t,"describe"],{timeout:5e3,encoding:"utf-8",windowsHide:!0});return r.status!==0?null:JSON.parse(String(r.stdout).trim())}catch{return null}}}}var Bg=".board.lock";function Gg(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function Kg(e,t){return typeof e=="string"?{cliDir:e,opts:t}:{cliDir:void 0,opts:e}}function Ac(e){if(e)return e;let t=Yo(import.meta.url),r=[t,pt(t,"..","cli","node"),pt(t,"..","..","cli","node")];for(let n of r)try{return qn(n),n}catch{}throw new Error(`createFsBoardPlatformAdapter: could not resolve a public CLI directory from module dir ${t}`)}function Ug(e,t,r){let{cliDir:n,opts:s}=Gg(t,r),o=Ac(n),a=e.value,i=s?.suppressSpawn?"":qn(o),u={meta:"board-live-cards",howToRun:"local-node",whatToRun:i?oe({kind:"fs-path",value:i}):"",...s?.notifyChannel?{extra:{notifyChannel:s.notifyChannel}}:{}};return {kvStorage:c=>Kn(pt(a,`.${c}`)),blobStorage:c=>c?qr(pt(a,c)):qr(a),journalAdapter:()=>pa(a),lock:ma(pt(a,Bg)),selfRef:u,async dispatchExecution(c,l){if(s?.suppressSpawn)return {dispatched:false};try{let d=l.source_def?.bindTo??On().slice(0,8),y=Jt(a,`exec-in-${d}`),g=Jt(a,`exec-out-${d}`),f=Jt(a,`exec-err-${d}`,".txt"),p=oe({kind:"fs-path",value:y}),k=oe({kind:"fs-path",value:g}),h=oe({kind:"fs-path",value:f});return la({kind:"fs-path",value:y}).write(y,JSON.stringify(l,null,2)),da(c,{subcommand:"run-source-fetch",inRef:p,outRef:k,errRef:h},o),{dispatched:!0}}catch(d){return {dispatched:false,error:d instanceof Error?d.message:String(d)}}},resolveBlob(c){let l=zo(c.value)?Gn().read(c.value):qr(a).read(c.value);if(l===null)throw new Error(`resolveBlob: blob not found: ::${c.kind}::${c.value}`);return l},hashFn:fa,genId:()=>Wo(`${Date.now()}-${Math.random()}`).slice(0,32),kvStorageForRef:c=>Kn(Re(c).value),requestProcessAccumulated(){s?.suppressSpawn||Zo(o,e,s?.notifyChannel);},publishBoardChangeNotifications(c){if(!s?.notifyChannel||c.length===0)return;let l=c.map(d=>({id:On(),ts:new Date().toISOString(),boardRef:oe(e),notification:d}));ea(s.notifyChannel,l,s.onWarn);},onWarn:s?.onWarn}}function Pb(e,t,r){let{cliDir:n,opts:s}=Kg(t,r),o=Ac(n),a=Ug(e,o,s),i=Nr();return {...a,invokeExecutorSync(u,c,l,d){let{command:y,baseArgs:g}=Fn(u,o),f=u.extra?["--extra",Buffer.from(JSON.stringify(u.extra)).toString("base64")]:[];return i.executeSync(y,[...g,c,...l,...f],{timeout:d?.timeout??3e4,encoding:"utf-8",input:d?.input})},validateSchema(u){let c=Io(u);return {ok:c.errors.length===0,errors:c.errors}},makeTempFilePath(u,c){return Jt(e.value,u,c)},absoluteBlob:Gn()}}function Ob(e){try{let t=JSON.parse(Buffer.from(e,"base64url").toString());return typeof t.br=="string"?t.br:null}catch{return null}}
13
13
  export{ut as BOARD_GRAPH_KEY,En as EMPTY_CONFIG,Er as SNAPSHOT_SCHEMA_VERSION_V1,qg as createArtifactsStore,Tg as createArtifactsStorePublic,Eg as createBoardLiveCardsNonCorePublic,Cg as createBoardLiveCardsPublic,Mg as createCardFileMetadataStore,$n as createCardStore,xg as createCardStorePublic,Dg as createChatArtifactsStore,ud as createExecutionRefInvoker,Fg as createFileArtifactsStore,Pb as createFsBoardNonCorePlatformAdapter,Ug as createFsBoardPlatformAdapter,Ib as createNodeSpawnInvocationAdapter,Ob as decodeBoardRefFromToken,Mn as evaluateArgsMassaging,vg as executionRefFromScriptPath,ca as invokeExecutionRef,Ln as invokeExecutionRefSync,cd as invokeRefSync,Rn as parseExecutionRef,Re as parseRef,_n as serializeExecutionRef,oe as serializeRef};//# sourceMappingURL=fs-board-adapter.js.map
14
14
  //# sourceMappingURL=fs-board-adapter.js.map
@@ -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.0.4/browser/live-cards.js"></script>
23
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.0.4/browser/board-livecards-client.js"></script>
22
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/live-cards.js"></script>
23
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/board-livecards-client.js"></script>
24
24
  </head>
25
25
  <body class="bg-light">
26
26
  <div class="container-fluid py-3">
@@ -231,7 +231,7 @@ try {
231
231
 
232
232
  console.log('\n=== Step 2: start SSE worker ===');
233
233
  sseWorker = new Worker(SSE_WORKER_SCRIPT, {
234
- workerData: { sseUrl: `${BASE}/sse` },
234
+ workerData: { sseUrl: `${BASE}/sse?clientId=e2e-demo-sse` },
235
235
  });
236
236
  sseWorker.on('message', (msg) => {
237
237
  if (msg.type === 'frame') applyFrame(msg.payload);
@@ -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.0.4/browser/compute-jsonata.js"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/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.0.4/browser/live-cards.js"></script>
15
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.0.4/browser/board-livecards-localstorage.js"></script>
14
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/live-cards.js"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/board-livecards-localstorage.js"></script>
16
16
  </head>
17
17
  <body class="bg-light">
18
18
  <div class="container-fluid py-3">
@@ -40,6 +40,70 @@
40
40
  reporting results via <code>reportSourceFetched</code>.
41
41
  </div>
42
42
 
43
+ <details class="card card-body shadow-sm small mb-3">
44
+ <summary class="fw-semibold">Renderer / Theme API Example</summary>
45
+ <p class="text-muted mt-2 mb-2">
46
+ Copy this pattern to register a card renderer, a board theme, a board renderer,
47
+ or lightweight board skin classes.
48
+ </p>
49
+ <pre class="bg-dark text-light rounded p-3 mb-0" style="white-space: pre-wrap;"><code>LiveCard.registerCardRenderer('portfolio-card', {
50
+ createShell: function (model) {
51
+ var wrap = document.createElement('div');
52
+ wrap.className = 'card shadow-sm h-100 border-success-subtle';
53
+
54
+ var body = document.createElement('div');
55
+ body.className = 'card-body p-3';
56
+ wrap.appendChild(body);
57
+
58
+ return body;
59
+ },
60
+ renderBody: function (model, body, ctx) {
61
+ body.innerHTML = '';
62
+
63
+ var title = document.createElement('h6');
64
+ title.textContent = (model.card.meta && model.card.meta.title) || model.id;
65
+ body.appendChild(title);
66
+
67
+ var metrics = document.createElement('div');
68
+ ctx.renderBuiltin(model, 'metric', model.computed_values.total_value, metrics, { label: 'Total value' });
69
+ body.appendChild(metrics);
70
+ },
71
+
72
+ // Back-compat board skin fields also work when this renderer is present.
73
+ boardClass: 'demo-board-shell',
74
+ listClass: 'demo-board-list',
75
+ styles: '.demo-board-list { row-gap: 1rem; }'
76
+ });
77
+
78
+ LiveCard.registerBoardTheme('soft-grid', {
79
+ boardClass: 'px-2 py-1',
80
+ listClass: 'align-items-stretch',
81
+ styles: '.lc-board-grid { --bs-gutter-x: 1rem; --bs-gutter-y: 1rem; }'
82
+ });
83
+
84
+ LiveCard.registerBoardRenderer('framed-board', {
85
+ createBoardHost: function (ctx) {
86
+ var host = document.createElement('section');
87
+ host.className = 'border rounded-3 p-3 bg-white';
88
+ host.appendChild(ctx.defaultListEl);
89
+ return { mountEl: host, listEl: ctx.defaultListEl };
90
+ }
91
+ });
92
+
93
+ board = LiveCard.Board(engine, document.getElementById('boardRoot'), {
94
+ initialState: stateRef.current,
95
+ getNodeIds: function (s) { return s.cardIds; },
96
+ selectNode: function (s, id) { return s.modelsById[id]; },
97
+ boardTheme: 'soft-grid',
98
+ boardRenderer: 'framed-board',
99
+ boardSkin: {
100
+ boardClass: 'my-board-shell',
101
+ listClass: 'my-board-list',
102
+ styles: '.my-board-shell { background: #f8fafc; }'
103
+ }
104
+ });</code></pre>
105
+ </details>
106
+
43
107
  <div id="boardRoot">
44
108
  <div class="d-flex align-items-center justify-content-center" style="height: 72vh;">
45
109
  <div class="text-center">
@@ -708,6 +772,11 @@
708
772
 
709
773
  document.getElementById('boardRoot').innerHTML = '';
710
774
 
775
+ // Example extension points for board/card presentation:
776
+ // - LiveCard.registerCardRenderer(name, renderer)
777
+ // - LiveCard.registerBoardTheme(name, theme)
778
+ // - LiveCard.registerBoardRenderer(name, renderer)
779
+ // - Board(..., { boardSkin, boardClass, listClass, styles })
711
780
  board = LiveCard.Board(engine, document.getElementById('boardRoot'), {
712
781
  initialState: stateRef.current,
713
782
  getNodeIds: function (s) { return s.cardIds; },