yaml-flow 6.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/board-live-cards-cli.js +4 -4
  2. package/browser/asset-integrity.json +3 -3
  3. package/browser/board-livecards-client.js +2 -0
  4. package/browser/board-livecards-client.js.map +1 -0
  5. package/browser/board-livecards-localstorage.js +10 -0
  6. package/browser/board-livecards-localstorage.js.map +1 -0
  7. package/browser/board-livegraph-engine.js +2 -2
  8. package/browser/board-livegraph-engine.js.map +1 -1
  9. package/browser/card-compute.js +28 -28
  10. package/browser/compute-jsonata.js +5 -0
  11. package/browser/compute-jsonata.js.map +1 -0
  12. package/browser/live-cards.js +264 -151
  13. package/card-store.js +4 -4
  14. package/dist/{board-live-cards-public-CltXYgaY.d.cts → board-live-cards-public-5n1-syA3.d.cts} +8 -5
  15. package/dist/{board-live-cards-public-f-E-FAyp.d.ts → board-live-cards-public-CK_J8uv0.d.ts} +8 -5
  16. package/dist/board-livegraph-runtime/index.cjs +2 -2
  17. package/dist/board-livegraph-runtime/index.cjs.map +1 -1
  18. package/dist/board-livegraph-runtime/index.d.cts +11 -9
  19. package/dist/board-livegraph-runtime/index.d.ts +11 -9
  20. package/dist/board-livegraph-runtime/index.js +2 -2
  21. package/dist/board-livegraph-runtime/index.js.map +1 -1
  22. package/dist/board-livegraph-runtime/jsonata-sync.cjs +37 -1
  23. package/dist/card-compute/index.cjs +4 -4
  24. package/dist/card-compute/index.cjs.map +1 -1
  25. package/dist/card-compute/index.d.cts +5 -1
  26. package/dist/card-compute/index.d.ts +5 -1
  27. package/dist/card-compute/index.js +4 -4
  28. package/dist/card-compute/index.js.map +1 -1
  29. package/dist/card-compute/jsonata-sync.cjs +37 -1
  30. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +2 -1
  31. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +1 -1
  32. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +27 -14
  33. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.ts +27 -14
  34. package/dist/cli/browser-api/board-live-cards-browser-adapter.js +2 -1
  35. package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +1 -1
  36. package/dist/cli/browser-api/card-store-browser-api.cjs +1 -1
  37. package/dist/cli/browser-api/card-store-browser-api.cjs.map +1 -1
  38. package/dist/cli/browser-api/card-store-browser-api.js +1 -1
  39. package/dist/cli/browser-api/card-store-browser-api.js.map +1 -1
  40. package/dist/cli/browser-api/jsonata-sync.cjs +37 -1
  41. package/dist/cli/node/artifacts-store-cli.cjs +8 -8
  42. package/dist/cli/node/artifacts-store-cli.cjs.map +1 -1
  43. package/dist/cli/node/artifacts-store-cli.js +8 -8
  44. package/dist/cli/node/artifacts-store-cli.js.map +1 -1
  45. package/dist/cli/node/board-live-cards-cli.cjs +7 -7
  46. package/dist/cli/node/board-live-cards-cli.cjs.map +1 -1
  47. package/dist/cli/node/board-live-cards-cli.js +7 -7
  48. package/dist/cli/node/board-live-cards-cli.js.map +1 -1
  49. package/dist/cli/node/card-store-cli.cjs +5 -5
  50. package/dist/cli/node/card-store-cli.cjs.map +1 -1
  51. package/dist/cli/node/card-store-cli.js +5 -5
  52. package/dist/cli/node/card-store-cli.js.map +1 -1
  53. package/dist/cli/node/execution-adapter.cjs +3 -0
  54. package/dist/cli/node/execution-adapter.cjs.map +1 -0
  55. package/dist/cli/node/execution-adapter.d.cts +174 -0
  56. package/dist/cli/node/execution-adapter.d.ts +174 -0
  57. package/dist/cli/node/execution-adapter.js +3 -0
  58. package/dist/cli/node/execution-adapter.js.map +1 -0
  59. package/dist/cli/node/fs-board-adapter.cjs +7 -7
  60. package/dist/cli/node/fs-board-adapter.cjs.map +1 -1
  61. package/dist/cli/node/fs-board-adapter.d.cts +2 -2
  62. package/dist/cli/node/fs-board-adapter.d.ts +2 -2
  63. package/dist/cli/node/fs-board-adapter.js +7 -7
  64. package/dist/cli/node/fs-board-adapter.js.map +1 -1
  65. package/dist/cli/node/jsonata-sync.cjs +37 -1
  66. package/dist/cli/node/source-cli-task-executor.cjs +4 -4
  67. package/dist/cli/node/source-cli-task-executor.cjs.map +1 -1
  68. package/dist/cli/node/source-cli-task-executor.js +4 -4
  69. package/dist/cli/node/source-cli-task-executor.js.map +1 -1
  70. package/dist/continuous-event-graph/index.cjs +2 -2
  71. package/dist/continuous-event-graph/index.cjs.map +1 -1
  72. package/dist/continuous-event-graph/index.js +2 -2
  73. package/dist/continuous-event-graph/index.js.map +1 -1
  74. package/dist/continuous-event-graph/jsonata-sync.cjs +37 -1
  75. package/dist/execution-refs.cjs +2 -1
  76. package/dist/execution-refs.cjs.map +1 -1
  77. package/dist/execution-refs.d.cts +55 -12
  78. package/dist/execution-refs.d.ts +55 -12
  79. package/dist/execution-refs.js +2 -1
  80. package/dist/execution-refs.js.map +1 -1
  81. package/dist/index.cjs +10 -10
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.js +10 -10
  84. package/dist/index.js.map +1 -1
  85. package/dist/jsonata-sync.cjs +37 -1
  86. package/dist/server-runtime/index.cjs +9 -0
  87. package/dist/server-runtime/index.cjs.map +1 -0
  88. package/dist/server-runtime/index.d.cts +31 -0
  89. package/dist/server-runtime/index.d.ts +31 -0
  90. package/dist/server-runtime/index.js +9 -0
  91. package/dist/server-runtime/index.js.map +1 -0
  92. package/dist/server-runtime/jsonata-sync.cjs +7623 -0
  93. package/dist/step-machine-public/index.cjs +3 -0
  94. package/dist/step-machine-public/index.cjs.map +1 -0
  95. package/dist/step-machine-public/index.d.cts +166 -0
  96. package/dist/step-machine-public/index.d.ts +166 -0
  97. package/dist/step-machine-public/index.js +3 -0
  98. package/dist/step-machine-public/index.js.map +1 -0
  99. package/dist/step-machine-public/jsonata-sync.cjs +7623 -0
  100. package/dist/storage-refs.cjs +2 -2
  101. package/dist/storage-refs.cjs.map +1 -1
  102. package/dist/storage-refs.d.cts +6 -6
  103. package/dist/storage-refs.d.ts +6 -6
  104. package/dist/storage-refs.js +2 -2
  105. package/dist/storage-refs.js.map +1 -1
  106. package/dist/types-CU3DjTKL.d.cts +147 -0
  107. package/dist/types-HGDTWIun.d.ts +147 -0
  108. package/examples/browser/boards/portfolio-tracker/portfolio-t4.js +9 -10
  109. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +370 -0
  110. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.py +398 -0
  111. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-public.js +9 -10
  112. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +300 -0
  113. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +617 -0
  114. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-sse-worker.js +48 -0
  115. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +11 -10
  116. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +19 -4
  117. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +4 -8
  118. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +6 -10
  119. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +8 -16
  120. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +2 -6
  121. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +4 -8
  122. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +3 -7
  123. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +4 -8
  124. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +7 -16
  125. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +2 -6
  126. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +13 -3
  127. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +2 -1
  128. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +2 -1
  129. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +2 -1
  130. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +20 -24
  131. package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -3
  132. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +8 -13
  133. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +33 -9
  134. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +3 -1
  135. package/examples/cli/step-machine-demo/step2-double-cli.js +6 -12
  136. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +66 -4
  137. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +13 -5
  138. package/examples/example-board/agent-instructions.md +1 -1
  139. package/examples/example-board/cards/card-my-identity.json +30 -6
  140. package/examples/example-board/cards/card-portfolio-action.json +24 -6
  141. package/examples/example-board/cards/card-portfolio-intelligence.json +97 -0
  142. package/examples/example-board/cards/card-portfolio-risks.json +24 -6
  143. package/examples/example-board/cards/card-rebalance-impact.json +22 -6
  144. package/examples/example-board/cards/card-rebalance-sim.json +66 -15
  145. package/examples/example-board/cards/cardT-market-prices.json +80 -0
  146. package/examples/example-board/cards/{card-portfolio-value.json → cardT-portfolio-value.json} +38 -10
  147. package/examples/example-board/cards/cardT-portfolio.json +78 -0
  148. package/examples/example-board/demo-server-config.json +1 -1
  149. package/examples/example-board/demo-server.js +383 -69
  150. package/examples/example-board/demo-shell-localstorage.html +774 -0
  151. package/examples/example-board/demo-shell-with-server.html +18 -36
  152. package/examples/example-board/demo-shell.html +5 -4
  153. package/examples/example-board/demo-task-executor.js +213 -265
  154. package/package.json +15 -13
  155. package/step-machine-cli.js +43 -310
  156. package/board-livecards-server-runtime.js +0 -1513
  157. package/browser/board-livecards-runtime-client.js +0 -263
  158. package/dist/pycli/quickjs-board-runtime.global.js +0 -9
  159. package/dist/pycli/quickjs-board-runtime.global.js.map +0 -1
  160. package/dist/pycli/quickjs-step-machine-runtime.global.js +0 -5
  161. package/dist/pycli/quickjs-step-machine-runtime.global.js.map +0 -1
  162. package/examples/cli/step-machine-demo/two-step-math-handlers.js +0 -32
  163. package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +0 -24
  164. package/examples/example-board/cards/card-market-prices.json +0 -56
  165. package/examples/example-board/cards/card-portfolio.json +0 -44
  166. package/examples/example-board/demo-shell-browser.html +0 -675
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/event-graph/constants.ts","../../src/event-graph/graph-helpers.ts","../../src/event-graph/task-transitions.ts","../../src/continuous-event-graph/core.ts","../../src/continuous-event-graph/schedule.ts","../../src/continuous-event-graph/inspect.ts","../../src/continuous-event-graph/journal.ts","../../src/continuous-event-graph/reactive.ts","../../src/continuous-event-graph/validate.ts","../../src/continuous-event-graph/mutate.ts","../../src/continuous-event-graph/handlers.ts","../../src/card-compute/index.ts","../../src/continuous-event-graph/live-cards-bridge.ts"],"names":["TASK_STATUS","getProvides","task","getRequires","getAllTasks","graph","isNonActiveTask","taskState","getRefreshStrategy","taskConfig","graphSettings","getMaxExecutions","computeAvailableOutputs","taskStates","outputs","taskName","output","groupTasksByProvides","candidateTaskNames","tasks","outputGroups","applyTaskStart","state","existingTask","createDefaultGraphEngineStore","startConsumedHashes","requires","token","otherName","otherConfig","otherState","updatedTask","applyTaskCompletion","result","dataHash","data","outputTokens","lastConsumedHashes","newOutputs","applyTaskFailure","error","retryCount","breakTokens","applyTaskProgress","message","progress","applyTaskRestart","createLiveGraph","config","executionId","id","applyEvent","live","event","applyAgentAction","addNode","removeNode","addRequires","removeRequires","addProvides","removeProvides","applyEvents","events","current","name","exists","_removedConfig","remainingTasks","_removedState","remainingStates","nodeName","tokens","toAdd","t","remaining","injectTokens","drainTokens","toRemove","resetNode","disableNode","enableNode","getNode","snapshot","restore","snap","action","now","schedule","graphTasks","producerMap","buildProducerMap","computedOutputs","availableOutputs","eligible","pending","unresolved","blocked","strategy","rerunnable","maxExec","shouldSkip","req","consumed","interval","completedAt","missingTokens","pendingTokens","failedTokenInfo","producers","p","f","conflicts","outputKey","groupTasks","map","inspect","taskNames","running","completed","failed","waiting","notStarted","disabled","ts","openDeps","unresolvedCount","blockedCount","hasOpen","hasBlocked","ps","conflictTokens","deps","buildTaskDeps","cycles","detectCycles","producer","color","parent","dfs","node","dep","cycle","cur","getUnreachableTokens","available","tc","allRequired","unreachable","unreachableNodes","changed","isNonActive","hasUnreachableDep","allProducersUnreachable","reason","getUnreachableNodes","unreachableTokens","unreachableTokenSet","nodes","getUpstream","visited","tokenSet","nodeEntries","walk","getDownstream","consumerMap","consumers","consumer","MemoryJournal","computeDataHash","json","stableStringify","fnv1a64Hex","value","obj","k","input","hash","prime","mod","i","base64UrlEncode","bytes","binary","b","base64UrlDecode","base64","padded","encodeCallbackToken","payload","decodeCallbackToken","createReactiveGraph","configOrLive","options","initialHandlers","onDrain","inputQueue","disposed","pendingHandlers","handlers","internalJournal","draining","drainQueued","drain","drainOnce","internalEvents","inputEvents","dispatchTask","update","callbackToken","runPipeline","resolveUpstreamState","tokenToTask","cfg","producerTask","handlerNames","upstreamState","handlerName","handler","errors","decoded","fn","validateLiveGraph","issues","expectedOutputs","actualOutputs","allProducible","buildResult","validateReactiveGraph","referencedHandlers","taskHandlers","h","liveResult","warnings","mutateGraph","mutations","mutation","applySingleMutation","createCallbackHandler","getResolve","err","createFireAndForgetHandler","createShellHandler","commandTemplate","cwd","env","timeoutMs","exitCodeMap","captureOutput","nodeId","command","exec","stdout","stderr","exitCode","createProcessHandler","argsTemplate","args","a","execFile","detectRuntime","scriptPath","createScriptHandler","runtime","resolvedRuntime","createWebhookHandler","urlTemplate","method","headers","failOnNon2xx","url","body","controller","timer","response","text","createNoopHandler","staticData","_require","createRequire","jsonataSync","jsonata","deepGet","path","parts","deepSet","run","ctx","step","val","runSync","evalExpr","expr","resolve","VALID_ELEMENT_KINDS","ALLOWED_KEYS","validateNode","n","key","meta","s","bindTos","outputFiles","src","view","elem","enrichSources","source_defs","context","evalCtx","_projections","enrichSourcesSync","CardCompute","liveCardsToReactiveGraph","cards","boardSettings","boardId","board","sourceHandlers","defaultSourceHandler","cardHandlers","reactiveOptions","cardMap","card","sharedState","allTokens","tokenToCardId","binding","graphRef","buildSourceHandler","buildCardHandler","userHandler","factoryHandler","_cardMap","requiresData","producerId","computeNode","resultData","bindTo","ref","resultState"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Event Graph — Constants\n */\n\nimport type { CompletionStrategy, ConflictStrategy, ExecutionMode, ExecutionStatus, TaskStatus } from './types.js';\n\nexport const TASK_STATUS: Record<string, TaskStatus> = {\n NOT_STARTED: 'not-started',\n RUNNING: 'running',\n COMPLETED: 'completed',\n FAILED: 'failed',\n INACTIVATED: 'inactivated',\n} as const;\n\nexport const EXECUTION_STATUS: Record<string, ExecutionStatus> = {\n CREATED: 'created',\n RUNNING: 'running',\n PAUSED: 'paused',\n STOPPED: 'stopped',\n COMPLETED: 'completed',\n FAILED: 'failed',\n} as const;\n\nexport const COMPLETION_STRATEGIES: Record<string, CompletionStrategy> = {\n ALL_TASKS_DONE: 'all-tasks-done',\n ALL_OUTPUTS_DONE: 'all-outputs-done',\n ONLY_RESOLVED: 'only-resolved',\n GOAL_REACHED: 'goal-reached',\n MANUAL: 'manual',\n} as const;\n\nexport const EXECUTION_MODES: Record<string, ExecutionMode> = {\n DEPENDENCY_MODE: 'dependency-mode',\n ELIGIBILITY_MODE: 'eligibility-mode',\n} as const;\n\nexport const CONFLICT_STRATEGIES: Record<string, ConflictStrategy> = {\n ALPHABETICAL: 'alphabetical',\n PRIORITY_FIRST: 'priority-first',\n DURATION_FIRST: 'duration-first',\n COST_OPTIMIZED: 'cost-optimized',\n RESOURCE_AWARE: 'resource-aware',\n RANDOM_SELECT: 'random-select',\n USER_CHOICE: 'user-choice',\n PARALLEL_ALL: 'parallel-all',\n SKIP_CONFLICTS: 'skip-conflicts',\n ROUND_ROBIN: 'round-robin',\n} as const;\n\nexport const DEFAULTS = {\n EXECUTION_MODE: 'eligibility-mode' as ExecutionMode,\n CONFLICT_STRATEGY: 'alphabetical' as ConflictStrategy,\n COMPLETION_STRATEGY: 'all-outputs-done' as CompletionStrategy,\n MAX_ITERATIONS: 1000,\n} as const;\n","/**\n * Event Graph — Graph Helpers\n *\n * Pure functions for manipulating the requires/provides task dependency graph.\n * No I/O, no side effects.\n */\n\nimport type { GraphConfig, TaskConfig, GraphEngineStore, ExecutionState, RefreshStrategy } from './types.js';\nimport { TASK_STATUS } from './constants.js';\n\n// ============================================================================\n// Accessors — normalize requires/provides to always be arrays\n// ============================================================================\n\nexport function getProvides(task: TaskConfig | undefined): string[] {\n if (!task) return [];\n if (Array.isArray(task.provides)) return task.provides;\n return [];\n}\n\nexport function getRequires(task: TaskConfig | undefined): string[] {\n if (!task) return [];\n if (Array.isArray(task.requires)) return task.requires;\n return [];\n}\n\nexport function getAllTasks(graph: GraphConfig): Record<string, TaskConfig> {\n return graph.tasks ?? {};\n}\n\nexport function getTask(graph: GraphConfig, taskName: string): TaskConfig | undefined {\n return graph.tasks[taskName];\n}\n\nexport function hasTask(graph: GraphConfig, taskName: string): boolean {\n return taskName in graph.tasks;\n}\n\n// ============================================================================\n// Task State Predicates\n// ============================================================================\n\nexport function isNonActiveTask(taskState: GraphEngineStore | undefined): boolean {\n if (!taskState) return false;\n return taskState.status === TASK_STATUS.FAILED || taskState.status === TASK_STATUS.INACTIVATED;\n}\n\nexport function isTaskCompleted(taskState: GraphEngineStore | undefined): boolean {\n return taskState?.status === TASK_STATUS.COMPLETED;\n}\n\nexport function isTaskRunning(taskState: GraphEngineStore | undefined): boolean {\n return taskState?.status === TASK_STATUS.RUNNING;\n}\n\nexport function getRefreshStrategy(taskConfig: TaskConfig, graphSettings?: { refreshStrategy?: RefreshStrategy }): RefreshStrategy {\n return taskConfig.refreshStrategy ?? graphSettings?.refreshStrategy ?? 'data-changed';\n}\n\nexport function isRerunnable(taskConfig: TaskConfig, graphSettings?: { refreshStrategy?: RefreshStrategy }): boolean {\n return getRefreshStrategy(taskConfig, graphSettings) !== 'once';\n}\n\nexport function getMaxExecutions(taskConfig: TaskConfig): number | undefined {\n return taskConfig.maxExecutions;\n}\n\n// ============================================================================\n// Available Outputs Computation\n// ============================================================================\n\n/**\n * Dynamically compute available outputs from all completed tasks.\n * Tasks with strategies other than 'once' may have completed and reset.\n * Pure function.\n */\nexport function computeAvailableOutputs(\n graph: GraphConfig,\n taskStates: Record<string, GraphEngineStore>\n): string[] {\n const outputs: Set<string> = new Set();\n\n for (const [taskName, taskState] of Object.entries(taskStates)) {\n if (taskState.status === TASK_STATUS.COMPLETED) {\n const taskConfig = graph.tasks[taskName];\n if (taskConfig) {\n const provides = getProvides(taskConfig);\n provides.forEach(output => outputs.add(output));\n }\n }\n }\n\n return Array.from(outputs);\n}\n\n// ============================================================================\n// Conflict Detection\n// ============================================================================\n\n/**\n * Group candidate tasks by the outputs they provide.\n * Used to detect conflicts (multiple tasks providing the same output).\n */\nexport function groupTasksByProvides(\n candidateTaskNames: string[],\n tasks: Record<string, TaskConfig>\n): Record<string, string[]> {\n const outputGroups: Record<string, string[]> = {};\n\n candidateTaskNames.forEach(taskName => {\n const task = tasks[taskName];\n if (!task) return;\n const provides = getProvides(task);\n provides.forEach(output => {\n if (!outputGroups[output]) {\n outputGroups[output] = [];\n }\n outputGroups[output].push(taskName);\n });\n });\n\n return outputGroups;\n}\n\n/**\n * Check if a task's outputs conflict with other candidates.\n */\nexport function hasOutputConflict(\n taskName: string,\n taskProvides: string[],\n candidates: string[],\n tasks: Record<string, TaskConfig>\n): boolean {\n for (const otherName of candidates) {\n if (otherName === taskName) continue;\n const otherProvides = getProvides(tasks[otherName]);\n const overlapping = taskProvides.some(output => otherProvides.includes(output));\n if (overlapping) return true;\n }\n return false;\n}\n\n// ============================================================================\n// Immutable Graph Mutation\n// ============================================================================\n\nexport function addKeyToProvides(task: TaskConfig, key: string): TaskConfig {\n const current = getProvides(task);\n if (current.includes(key)) return task;\n return { ...task, provides: [...current, key] };\n}\n\nexport function removeKeyFromProvides(task: TaskConfig, key: string): TaskConfig {\n const current = getProvides(task);\n return { ...task, provides: current.filter(p => p !== key) };\n}\n\nexport function addKeyToRequires(task: TaskConfig, key: string): TaskConfig {\n const current = getRequires(task);\n if (current.includes(key)) return task;\n return { ...task, requires: [...current, key] };\n}\n\nexport function removeKeyFromRequires(task: TaskConfig, key: string): TaskConfig {\n const current = getRequires(task);\n return { ...task, requires: current.filter(r => r !== key) };\n}\n\n// ============================================================================\n// Dynamic Task Management\n// ============================================================================\n\n/**\n * Add a new task to a graph config. Returns a new GraphConfig (immutable).\n */\nexport function addDynamicTask(\n graph: GraphConfig,\n taskName: string,\n taskConfig: TaskConfig\n): GraphConfig {\n return {\n ...graph,\n tasks: {\n ...graph.tasks,\n [taskName]: taskConfig,\n },\n };\n}\n\n/**\n * Create default task state for a new task.\n */\nexport function createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n\n/**\n * Create the initial execution state for a graph.\n */\nexport function createInitialExecutionState(\n graph: GraphConfig,\n executionId: string\n): ExecutionState {\n const tasks: Record<string, GraphEngineStore> = {};\n for (const taskName of Object.keys(graph.tasks)) {\n tasks[taskName] = createDefaultGraphEngineStore();\n }\n\n return {\n status: 'running',\n tasks,\n availableOutputs: [],\n stuckDetection: { is_stuck: false, stuck_description: null, outputs_unresolvable: [], tasks_blocked: [] },\n lastUpdated: new Date().toISOString(),\n executionId,\n executionConfig: {\n executionMode: graph.settings.execution_mode ?? 'eligibility-mode',\n conflictStrategy: graph.settings.conflict_strategy ?? 'alphabetical',\n completionStrategy: graph.settings.completion,\n },\n };\n}\n","/**\n * Event Graph — Task State Transitions\n *\n * Pure functions for applying task lifecycle events to execution state.\n * Each function: f(state, ...) → newState\n */\n\nimport type { ExecutionState, GraphEngineStore, GraphConfig } from './types.js';\nimport { getProvides, getRequires } from './graph-helpers.js';\n\n/**\n * Apply task start to execution state. Pure function.\n */\nexport function applyTaskStart(state: ExecutionState, taskName: string, graph?: GraphConfig): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n\n // Snapshot upstream hashes at start time so that if an upstream task\n // completes while this task is running, applyTaskCompletion can detect\n // the mid-flight change and not absorb it into lastConsumedHashes.\n const startConsumedHashes: Record<string, string> = {};\n if (graph) {\n const taskConfig = graph.tasks[taskName];\n const requires = getRequires(taskConfig);\n for (const token of requires) {\n for (const [otherName, otherConfig] of Object.entries(graph.tasks)) {\n if (getProvides(otherConfig).includes(token)) {\n const otherState = state.tasks[otherName];\n if (otherState?.lastDataHash) startConsumedHashes[token] = otherState.lastDataHash;\n break;\n }\n }\n }\n }\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'running',\n startedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n progress: 0,\n error: undefined,\n startConsumedHashes,\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task completion to execution state.\n * Handles: default provides, conditional provides (on), refresh strategy, data hash tracking.\n * Pure function.\n */\nexport function applyTaskCompletion(\n state: ExecutionState,\n graph: GraphConfig,\n taskName: string,\n result?: string,\n dataHash?: string,\n data?: Record<string, unknown>\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n const taskConfig = graph.tasks[taskName];\n if (!taskConfig) {\n throw new Error(`Task \"${taskName}\" not found in graph`);\n }\n\n // Determine which outputs to produce\n let outputTokens: string[];\n if (result && taskConfig.on && taskConfig.on[result]) {\n // Conditional routing — use the on[result] provides\n outputTokens = taskConfig.on[result];\n } else {\n // Default provides\n outputTokens = getProvides(taskConfig);\n }\n\n // Use hashes snapshotted at task-start time as lastConsumedHashes.\n // This ensures that if an upstream task completed while this task was\n // running (mid-flight change), the old hash is preserved in\n // lastConsumedHashes → data-changed detects the difference on the\n // next schedule pass and re-runs this task.\n // Fall back to reading current upstream state only when startConsumedHashes\n // is absent (e.g. restored from an older snapshot without the field).\n const lastConsumedHashes: Record<string, string> = existingTask.startConsumedHashes\n ? { ...existingTask.startConsumedHashes }\n : { ...existingTask.lastConsumedHashes };\n\n if (!existingTask.startConsumedHashes) {\n // Legacy fallback: populate from current upstream state\n const requires = taskConfig.requires ?? [];\n for (const token of requires) {\n for (const [otherName, otherConfig] of Object.entries(graph.tasks)) {\n if (getProvides(otherConfig).includes(token)) {\n const otherState = state.tasks[otherName];\n if (otherState?.lastDataHash) {\n lastConsumedHashes[token] = otherState.lastDataHash;\n }\n break;\n }\n }\n }\n }\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'completed',\n completedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n executionCount: existingTask.executionCount + 1,\n lastEpoch: existingTask.executionCount + 1,\n lastDataHash: dataHash,\n data,\n lastConsumedHashes,\n error: undefined,\n };\n\n // Merge new outputs with existing available outputs\n const newOutputs = [...new Set([...state.availableOutputs, ...outputTokens])];\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n availableOutputs: newOutputs,\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task failure to execution state.\n * Handles: retry logic, on_failure token injection, circuit breaker.\n * Pure function.\n */\nexport function applyTaskFailure(\n state: ExecutionState,\n graph: GraphConfig,\n taskName: string,\n error: string\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n const taskConfig = graph.tasks[taskName];\n\n // Check retry\n if (taskConfig?.retry) {\n const retryCount = existingTask.retryCount + 1;\n if (retryCount <= taskConfig.retry.max_attempts) {\n // Retry — set back to not-started with incremented retry count\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'not-started',\n retryCount,\n lastUpdated: new Date().toISOString(),\n error,\n };\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n }\n }\n\n // No more retries — mark as failed\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'failed',\n failedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n error,\n executionCount: existingTask.executionCount + 1,\n };\n\n // Inject failure tokens if configured\n let newOutputs = state.availableOutputs;\n if (taskConfig?.on_failure && taskConfig.on_failure.length > 0) {\n newOutputs = [...new Set([...state.availableOutputs, ...taskConfig.on_failure])];\n }\n\n // Check circuit breaker\n if (taskConfig?.circuit_breaker && updatedTask.executionCount >= taskConfig.circuit_breaker.max_executions) {\n const breakTokens = taskConfig.circuit_breaker.on_break;\n newOutputs = [...new Set([...newOutputs, ...breakTokens])];\n }\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n availableOutputs: newOutputs,\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task progress update. Pure function.\n */\nexport function applyTaskProgress(\n state: ExecutionState,\n taskName: string,\n message?: string,\n progress?: number\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n progress: typeof progress === 'number' ? progress : existingTask.progress,\n messages: [\n ...(existingTask.messages ?? []),\n ...(message ? [{ message, timestamp: new Date().toISOString(), status: existingTask.status }] : []),\n ],\n lastUpdated: new Date().toISOString(),\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task restart to execution state.\n * Resets the task to not-started, preserving executionCount and lastEpoch\n * (history). Clears data, error, progress. The task becomes eligible for\n * scheduling again on the next drain cycle.\n * Pure function.\n */\nexport function applyTaskRestart(\n state: ExecutionState,\n taskName: string,\n): ExecutionState {\n const existingTask = state.tasks[taskName];\n if (!existingTask) return state;\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'not-started',\n startedAt: undefined,\n completedAt: undefined,\n failedAt: undefined,\n error: undefined,\n data: undefined,\n progress: null,\n lastUpdated: new Date().toISOString(),\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\nfunction createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n","/**\n * Continuous Event Graph — Core\n *\n * All functions are pure: f(LiveGraph, input) → LiveGraph\n *\n * - createLiveGraph: bootstrap from a GraphConfig\n * - applyEvent: reduce an event (task-started, task-completed, etc.)\n * - addNode / removeNode: structural graph mutations\n * - addRequires / removeRequires / addProvides / removeProvides: wiring mutations\n */\n\nimport type { GraphConfig, TaskConfig, GraphEvent, LiveGraph, NodeInfo, LiveGraphSnapshot } from './types.js';\nimport type { ExecutionState, GraphEngineStore } from '../event-graph/types.js';\nimport { getProvides, getRequires } from '../event-graph/graph-helpers.js';\nimport {\n applyTaskStart,\n applyTaskCompletion,\n applyTaskFailure,\n applyTaskProgress,\n applyTaskRestart,\n} from '../event-graph/task-transitions.js';\n\n// ============================================================================\n// Create\n// ============================================================================\n\n/**\n * Create a LiveGraph from a GraphConfig.\n * Initialises execution state for all tasks in the config.\n */\nexport function createLiveGraph(config: GraphConfig, executionId?: string): LiveGraph {\n const id = executionId ?? `live-${Date.now()}`;\n const tasks: Record<string, GraphEngineStore> = {};\n\n for (const taskName of Object.keys(config.tasks)) {\n tasks[taskName] = createDefaultGraphEngineStore();\n }\n\n const state: ExecutionState = {\n status: 'running',\n tasks,\n availableOutputs: [],\n stuckDetection: { is_stuck: false, stuck_description: null, outputs_unresolvable: [], tasks_blocked: [] },\n lastUpdated: new Date().toISOString(),\n executionId: id,\n executionConfig: {\n executionMode: config.settings.execution_mode ?? 'eligibility-mode',\n conflictStrategy: config.settings.conflict_strategy ?? 'alphabetical',\n completionStrategy: config.settings.completion,\n },\n };\n\n return { config, state };\n}\n\n// ============================================================================\n// Event Reducer\n// ============================================================================\n\n/**\n * Apply an event to the LiveGraph, producing a new LiveGraph.\n * Events are the shared vocabulary — both execution state transitions\n * (task-started, task-completed, etc.) and structural mutations\n * (task-upsert, task-removal, node-requires-add, etc.).\n *\n * Pure function: f(LiveGraph, GraphEvent) → LiveGraph\n */\nexport function applyEvent(live: LiveGraph, event: GraphEvent): LiveGraph {\n const { config, state } = live;\n\n // Ghost event filtering\n if ('executionId' in event && event.executionId && event.executionId !== state.executionId) {\n return live;\n }\n\n switch (event.type) {\n // --- Execution state transitions ---\n\n case 'task-started':\n return { config, state: applyTaskStart(state, event.taskName, config) };\n\n case 'task-completed':\n return { config, state: applyTaskCompletion(state, config, event.taskName, event.result, event.dataHash, event.data) };\n\n case 'task-failed':\n return { config, state: applyTaskFailure(state, config, event.taskName, event.error) };\n\n case 'task-progress':\n return { config, state: applyTaskProgress(state, event.taskName, event.message, event.progress) };\n\n case 'task-restart':\n return { config, state: applyTaskRestart(state, event.taskName) };\n\n case 'inject-tokens':\n return {\n config,\n state: {\n ...state,\n availableOutputs: [...new Set([...state.availableOutputs, ...event.tokens])],\n lastUpdated: new Date().toISOString(),\n },\n };\n\n case 'agent-action':\n return { config, state: applyAgentAction(state, event.action) };\n\n // --- Structural mutations ---\n\n case 'task-upsert':\n return addNode(live, event.taskName, event.taskConfig);\n\n case 'task-removal':\n return removeNode(live, event.taskName);\n\n case 'node-requires-add':\n return addRequires(live, event.nodeName, event.tokens);\n\n case 'node-requires-remove':\n return removeRequires(live, event.nodeName, event.tokens);\n\n case 'node-provides-add':\n return addProvides(live, event.nodeName, event.tokens);\n\n case 'node-provides-remove':\n return removeProvides(live, event.nodeName, event.tokens);\n\n default:\n return live;\n }\n}\n\n/**\n * Apply multiple events atomically to a LiveGraph.\n * Events are reduced sequentially, but the caller only sees the final state.\n * Use this for batch processing (e.g. draining a journal of pending events).\n */\nexport function applyEvents(live: LiveGraph, events: GraphEvent[]): LiveGraph {\n return events.reduce((current, event) => applyEvent(current, event), live);\n}\n\n// ============================================================================\n// Graph Mutations — node-level\n// ============================================================================\n\n/**\n * Upsert a node (task) in the live graph. Updates both config and state atomically.\n * If the node already exists, replaces its config but preserves its state.\n * If new, creates fresh default state.\n */\nexport function addNode(live: LiveGraph, name: string, taskConfig: TaskConfig): LiveGraph {\n const exists = !!live.config.tasks[name];\n return {\n config: {\n ...live.config,\n tasks: { ...live.config.tasks, [name]: taskConfig },\n },\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: exists ? live.state.tasks[name] : createDefaultGraphEngineStore(),\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Remove a node (task) from the live graph. Updates both config and state atomically.\n * If the node doesn't exist, returns the graph unchanged.\n * NOTE: Does not clean up references — other nodes' requires/provides are left intact.\n * The caller can use removeRequires() to clean up if needed.\n */\nexport function removeNode(live: LiveGraph, name: string): LiveGraph {\n if (!live.config.tasks[name]) return live;\n\n const { [name]: _removedConfig, ...remainingTasks } = live.config.tasks;\n const { [name]: _removedState, ...remainingStates } = live.state.tasks;\n\n return {\n config: {\n ...live.config,\n tasks: remainingTasks,\n },\n state: {\n ...live.state,\n tasks: remainingStates,\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Graph Mutations — wiring\n// ============================================================================\n\n/**\n * Add requires tokens to a node. If the node doesn't exist, returns unchanged.\n * Deduplicates — won't add tokens already in requires.\n */\nexport function addRequires(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getRequires(task);\n const toAdd = tokens.filter(t => !current.includes(t));\n if (toAdd.length === 0) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, requires: [...current, ...toAdd] },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Remove requires tokens from a node. If the node doesn't exist, returns unchanged.\n */\nexport function removeRequires(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getRequires(task);\n const remaining = current.filter(t => !tokens.includes(t));\n if (remaining.length === current.length) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, requires: remaining },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Add provides tokens to a node. If the node doesn't exist, returns unchanged.\n * Deduplicates — won't add tokens already in provides.\n */\nexport function addProvides(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getProvides(task);\n const toAdd = tokens.filter(t => !current.includes(t));\n if (toAdd.length === 0) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, provides: [...current, ...toAdd] },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Remove provides tokens from a node. If the node doesn't exist, returns unchanged.\n */\nexport function removeProvides(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getProvides(task);\n const remaining = current.filter(t => !tokens.includes(t));\n if (remaining.length === current.length) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, provides: remaining },\n },\n },\n state: live.state,\n };\n}\n\n// ============================================================================\n// Convenience — inject tokens via mutation (sugar over applyEvent)\n// ============================================================================\n\n/**\n * Inject tokens into the live graph's available outputs.\n * Equivalent to applyEvent(live, { type: 'inject-tokens', tokens, timestamp }).\n */\nexport function injectTokens(live: LiveGraph, tokens: string[]): LiveGraph {\n return applyEvent(live, {\n type: 'inject-tokens',\n tokens,\n timestamp: new Date().toISOString(),\n });\n}\n\n/**\n * Drain (remove) tokens from the live graph's available outputs.\n * Inverse of injectTokens — useful for expiring stale data or revoking signals.\n * Tokens that aren't currently available are silently ignored.\n * Pure function.\n */\nexport function drainTokens(live: LiveGraph, tokens: string[]): LiveGraph {\n const toRemove = new Set(tokens);\n const remaining = live.state.availableOutputs.filter(t => !toRemove.has(t));\n\n if (remaining.length === live.state.availableOutputs.length) return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n availableOutputs: remaining,\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Node lifecycle\n// ============================================================================\n\n/**\n * Reset a node's state back to not-started, clearing error, retry count, progress.\n * Config is untouched. Useful when a failed task should be retried later.\n * If the node doesn't exist, returns unchanged.\n */\nexport function resetNode(live: LiveGraph, name: string): LiveGraph {\n if (!live.config.tasks[name] || !live.state.tasks[name]) return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: createDefaultGraphEngineStore(),\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Disable a node — sets its status to 'inactivated'.\n * The scheduler will skip inactivated tasks. Config is untouched.\n * If the node doesn't exist or is already inactivated, returns unchanged.\n */\nexport function disableNode(live: LiveGraph, name: string): LiveGraph {\n const taskState = live.state.tasks[name];\n if (!taskState || taskState.status === 'inactivated') return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: { ...taskState, status: 'inactivated', lastUpdated: new Date().toISOString() },\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Enable a previously-disabled node — sets its status back to 'not-started'.\n * Only acts on 'inactivated' nodes. If the node isn't inactivated, returns unchanged.\n */\nexport function enableNode(live: LiveGraph, name: string): LiveGraph {\n const taskState = live.state.tasks[name];\n if (!taskState || taskState.status !== 'inactivated') return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: { ...taskState, status: 'not-started', lastUpdated: new Date().toISOString() },\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Read: getNode\n// ============================================================================\n\n/**\n * Get the config and state for a single node.\n * Returns undefined if the node doesn't exist.\n */\nexport function getNode(live: LiveGraph, name: string): NodeInfo | undefined {\n const config = live.config.tasks[name];\n if (!config) return undefined;\n const state = live.state.tasks[name] ?? createDefaultGraphEngineStore();\n return { name, config, state };\n}\n\n// ============================================================================\n// Persistence: snapshot / restore\n// ============================================================================\n\n/**\n * Serialize a LiveGraph to a plain JSON-safe object.\n * Can be persisted to disk, database, etc.\n */\nexport function snapshot(live: LiveGraph): LiveGraphSnapshot {\n return {\n version: 1,\n config: live.config,\n state: live.state,\n snapshotAt: new Date().toISOString(),\n };\n}\n\n/**\n * Restore a LiveGraph from a snapshot. Validates the shape.\n * Throws if the snapshot is invalid.\n */\nexport function restore(data: unknown): LiveGraph {\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid snapshot: expected an object');\n }\n\n const snap = data as Record<string, unknown>;\n\n if (!snap.config || typeof snap.config !== 'object') {\n throw new Error('Invalid snapshot: missing or invalid \"config\"');\n }\n if (!snap.state || typeof snap.state !== 'object') {\n throw new Error('Invalid snapshot: missing or invalid \"state\"');\n }\n\n const config = snap.config as GraphConfig;\n const state = snap.state as ExecutionState;\n\n if (!config.settings || typeof config.settings !== 'object') {\n throw new Error('Invalid snapshot: config.settings missing');\n }\n if (!config.tasks || typeof config.tasks !== 'object') {\n throw new Error('Invalid snapshot: config.tasks missing');\n }\n if (!state.tasks || typeof state.tasks !== 'object') {\n throw new Error('Invalid snapshot: state.tasks missing');\n }\n if (!Array.isArray(state.availableOutputs)) {\n throw new Error('Invalid snapshot: state.availableOutputs must be an array');\n }\n\n return { config, state };\n}\n\n// ============================================================================\n// Internals\n// ============================================================================\n\nfunction createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n\nfunction applyAgentAction(\n state: ExecutionState,\n action: 'start' | 'stop' | 'pause' | 'resume',\n): ExecutionState {\n const now = new Date().toISOString();\n switch (action) {\n case 'stop':\n return { ...state, status: 'stopped', lastUpdated: now };\n case 'pause':\n return { ...state, status: 'paused', lastUpdated: now };\n case 'resume':\n return { ...state, status: 'running', lastUpdated: now };\n default:\n return state;\n }\n}\n","/**\n * Continuous Event Graph — Schedule\n *\n * Pure read-only projection: LiveGraph → ScheduleResult\n *\n * Classifies every non-terminal task into one of:\n * - eligible: all requires satisfied, ready to dispatch\n * - pending: requires not yet met, but a viable producer exists (normal waiting)\n * - unresolved: requires not met, NO task in the graph can produce them (caller's problem)\n * - blocked: requires not met because the producing task FAILED (caller's problem)\n */\n\nimport type { LiveGraph, ScheduleResult, PendingTask, UnresolvedDependency, BlockedTask } from './types.js';\nimport { getProvides, getRequires, getAllTasks, isNonActiveTask, computeAvailableOutputs, getMaxExecutions, getRefreshStrategy, groupTasksByProvides } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n/**\n * Compute the scheduling status of every task in the live graph.\n * Pure function — no side effects.\n */\nexport function schedule(live: LiveGraph): ScheduleResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const taskNames = Object.keys(graphTasks);\n\n if (taskNames.length === 0) {\n return { eligible: [], pending: [], unresolved: [], blocked: [], conflicts: {} };\n }\n\n // Build producer map: token → tasks that produce it (includes on/on_failure)\n const producerMap = buildProducerMap(graphTasks);\n\n // Available outputs: from completed tasks + injected tokens\n const computedOutputs = computeAvailableOutputs(config, state.tasks);\n const availableOutputs = new Set([...computedOutputs, ...state.availableOutputs]);\n\n const eligible: string[] = [];\n const pending: PendingTask[] = [];\n const unresolved: UnresolvedDependency[] = [];\n const blocked: BlockedTask[] = [];\n\n for (const [taskName, taskConfig] of Object.entries(graphTasks)) {\n const taskState = state.tasks[taskName];\n const strategy = getRefreshStrategy(taskConfig, config.settings);\n const rerunnable = strategy !== 'once';\n\n // Always skip running or inactive (failed/inactivated) tasks\n if (taskState?.status === TASK_STATUS.RUNNING || isNonActiveTask(taskState)) {\n continue;\n }\n\n // Max executions cap\n const maxExec = getMaxExecutions(taskConfig);\n if (maxExec !== undefined && taskState && taskState.executionCount >= maxExec) {\n continue;\n }\n\n // Circuit breaker\n if (taskConfig.circuit_breaker && taskState &&\n taskState.executionCount >= taskConfig.circuit_breaker.max_executions) {\n continue;\n }\n\n // For once-only tasks: skip if completed\n if (!rerunnable && taskState?.status === TASK_STATUS.COMPLETED) {\n continue;\n }\n\n // For re-runnable tasks that already completed: check strategy\n if (rerunnable && taskState?.status === TASK_STATUS.COMPLETED) {\n const requires = getRequires(taskConfig);\n\n let shouldSkip = false;\n switch (strategy) {\n case 'data-changed': {\n if (requires.length > 0) {\n const hasChangedData = requires.some(req => {\n for (const [otherName, otherConfig] of Object.entries(graphTasks)) {\n if (getProvides(otherConfig).includes(req)) {\n const otherState = state.tasks[otherName];\n if (!otherState) continue;\n const consumed = taskState.lastConsumedHashes?.[req];\n if (otherState.lastDataHash == null) {\n return otherState.executionCount > taskState.lastEpoch;\n }\n return otherState.lastDataHash !== consumed;\n }\n }\n return false;\n });\n if (!hasChangedData) shouldSkip = true;\n } else {\n shouldSkip = true;\n }\n break;\n }\n case 'epoch-changed': {\n if (requires.length > 0) {\n const hasRefreshed = requires.some(req => {\n for (const [otherName, otherConfig] of Object.entries(graphTasks)) {\n if (getProvides(otherConfig).includes(req)) {\n const otherState = state.tasks[otherName];\n if (otherState && otherState.executionCount > taskState.lastEpoch) return true;\n }\n }\n return false;\n });\n if (!hasRefreshed) shouldSkip = true;\n } else {\n shouldSkip = true;\n }\n break;\n }\n case 'time-based': {\n const interval = taskConfig.refreshInterval ?? 0;\n if (interval <= 0) { shouldSkip = true; break; }\n const completedAt = taskState.completedAt;\n if (!completedAt) { shouldSkip = true; break; }\n const elapsedSec = (Date.now() - Date.parse(completedAt)) / 1000;\n if (elapsedSec < interval) shouldSkip = true;\n break;\n }\n case 'manual':\n shouldSkip = true;\n break;\n }\n if (shouldSkip) continue;\n }\n\n const requires = getRequires(taskConfig);\n\n // No requires → eligible (entry point)\n if (requires.length === 0) {\n eligible.push(taskName);\n continue;\n }\n\n // Check each required token\n const missingTokens: string[] = [];\n const pendingTokens: string[] = [];\n const failedTokenInfo: { token: string; failedProducer: string }[] = [];\n\n for (const token of requires) {\n if (availableOutputs.has(token)) continue;\n\n const producers = producerMap[token] || [];\n\n if (producers.length === 0) {\n // No task produces this token → unresolved\n missingTokens.push(token);\n } else {\n // Check if all producers have failed\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n if (allFailed) {\n failedTokenInfo.push({ token, failedProducer: producers[0] });\n } else {\n // At least one producer is viable → pending (normal wait)\n pendingTokens.push(token);\n }\n }\n }\n\n if (missingTokens.length > 0) {\n unresolved.push({ taskName, missingTokens });\n } else if (failedTokenInfo.length > 0) {\n blocked.push({\n taskName,\n failedTokens: failedTokenInfo.map(f => f.token),\n failedProducers: [...new Set(failedTokenInfo.map(f => f.failedProducer))],\n });\n } else if (pendingTokens.length > 0) {\n pending.push({ taskName, waitingOn: pendingTokens });\n } else {\n // All requires satisfied\n eligible.push(taskName);\n }\n }\n\n // Detect conflicts among eligible tasks\n const conflicts: Record<string, string[]> = {};\n if (eligible.length > 1) {\n const outputGroups = groupTasksByProvides(eligible, graphTasks);\n for (const [outputKey, groupTasks] of Object.entries(outputGroups)) {\n if (groupTasks.length > 1) {\n conflicts[outputKey] = groupTasks;\n }\n }\n }\n\n return { eligible, pending, unresolved, blocked, conflicts };\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Build a map: token → tasks that produce it (via provides, on, on_failure).\n */\nfunction buildProducerMap(tasks: Record<string, import('../event-graph/types.js').TaskConfig>): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n\n return map;\n}\n","/**\n * Continuous Event Graph — Inspect\n *\n * Pure read-only projection: LiveGraph → LiveGraphHealth\n *\n * Live health report combining config structure + runtime state.\n */\n\nimport type { LiveGraph, LiveGraphHealth, UnreachableTokensResult, UnreachableNodesResult, UpstreamResult, DownstreamResult } from './types.js';\nimport { getProvides, getRequires, getAllTasks, isNonActiveTask } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n/**\n * Compute a live health report for the graph.\n * Combines structural analysis (cycles, conflicts, open deps) with runtime state (task statuses).\n * Pure function — no side effects.\n */\nexport function inspect(live: LiveGraph): LiveGraphHealth {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const taskNames = Object.keys(graphTasks);\n\n // --- Task status counts ---\n let running = 0, completed = 0, failed = 0, waiting = 0, notStarted = 0, disabled = 0;\n\n for (const taskName of taskNames) {\n const ts = state.tasks[taskName];\n if (!ts || ts.status === TASK_STATUS.NOT_STARTED) {\n notStarted++;\n } else {\n switch (ts.status) {\n case TASK_STATUS.RUNNING: running++; break;\n case TASK_STATUS.COMPLETED: completed++; break;\n case TASK_STATUS.FAILED: failed++; break;\n case 'inactivated': disabled++; break;\n default: waiting++;\n }\n }\n }\n\n // --- Producer map ---\n const producerMap: Record<string, string[]> = {};\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n for (const token of getProvides(taskConfig)) {\n if (!producerMap[token]) producerMap[token] = [];\n producerMap[token].push(name);\n }\n if (taskConfig.on) {\n for (const tokens of Object.values(taskConfig.on)) {\n for (const token of tokens) {\n if (!producerMap[token]) producerMap[token] = [];\n if (!producerMap[token].includes(name)) producerMap[token].push(name);\n }\n }\n }\n if (taskConfig.on_failure) {\n for (const token of taskConfig.on_failure) {\n if (!producerMap[token]) producerMap[token] = [];\n if (!producerMap[token].includes(name)) producerMap[token].push(name);\n }\n }\n }\n\n // --- Open dependencies: tokens required but no producer exists ---\n const openDeps = new Set<string>();\n let unresolvedCount = 0;\n let blockedCount = 0;\n\n for (const [taskName, taskConfig] of Object.entries(graphTasks)) {\n const ts = state.tasks[taskName];\n // Skip already-completed or running\n if (ts?.status === TASK_STATUS.COMPLETED || ts?.status === TASK_STATUS.RUNNING) continue;\n\n let hasOpen = false;\n let hasBlocked = false;\n for (const token of getRequires(taskConfig)) {\n const producers = producerMap[token] || [];\n if (producers.length === 0) {\n openDeps.add(token);\n hasOpen = true;\n } else {\n const allFailed = producers.every(p => {\n const ps = state.tasks[p];\n return ps?.status === TASK_STATUS.FAILED || ps?.status === 'inactivated';\n });\n if (allFailed) hasBlocked = true;\n }\n }\n if (hasOpen) unresolvedCount++;\n if (hasBlocked && !hasOpen) blockedCount++;\n }\n\n // --- Conflict tokens: produced by multiple tasks ---\n const conflictTokens: string[] = [];\n for (const [token, producers] of Object.entries(producerMap)) {\n if (producers.length > 1) conflictTokens.push(token);\n }\n\n // --- Cycle detection (DFS) ---\n const deps = buildTaskDeps(graphTasks, producerMap);\n const cycles = detectCycles(taskNames, deps);\n\n return {\n totalNodes: taskNames.length,\n running, completed, failed, waiting, notStarted, disabled,\n unresolvedCount,\n blockedCount,\n openDependencies: [...openDeps],\n cycles,\n conflictTokens,\n };\n}\n\n// ============================================================================\n// Cycle detection internals (pure)\n// ============================================================================\n\nfunction buildTaskDeps(\n tasks: Record<string, import('../event-graph/types.js').TaskConfig>,\n producerMap: Record<string, string[]>,\n): Record<string, Set<string>> {\n const deps: Record<string, Set<string>> = {};\n for (const [name, config] of Object.entries(tasks)) {\n deps[name] = new Set<string>();\n for (const token of getRequires(config)) {\n for (const producer of (producerMap[token] || [])) {\n if (producer !== name) deps[name].add(producer);\n }\n }\n }\n return deps;\n}\n\nfunction detectCycles(\n taskNames: string[],\n deps: Record<string, Set<string>>,\n): string[][] {\n const WHITE = 0, GRAY = 1, BLACK = 2;\n const color: Record<string, number> = {};\n const parent: Record<string, string | null> = {};\n const cycles: string[][] = [];\n\n for (const name of taskNames) {\n color[name] = WHITE;\n parent[name] = null;\n }\n\n function dfs(node: string): void {\n color[node] = GRAY;\n for (const dep of deps[node] || []) {\n if (color[dep] === GRAY) {\n const cycle: string[] = [dep];\n let cur = node;\n while (cur !== dep) {\n cycle.push(cur);\n cur = parent[cur]!;\n }\n cycle.push(dep);\n cycle.reverse();\n cycles.push(cycle);\n } else if (color[dep] === WHITE) {\n parent[dep] = node;\n dfs(dep);\n }\n }\n color[node] = BLACK;\n }\n\n for (const name of taskNames) {\n if (color[name] === WHITE) dfs(name);\n }\n\n return cycles;\n}\n\n// ============================================================================\n// Reachability analysis (transitive)\n// ============================================================================\n\n/**\n * Build producer map: token → task names that produce it.\n */\nfunction buildProducerMap(\n tasks: Record<string, import('../event-graph/types.js').TaskConfig>,\n): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n return map;\n}\n\n/**\n * Get all tokens that are required but cannot be produced given the current\n * graph state. This is **transitive**: if token X is unreachable, and node A\n * is the only producer of token Y but A requires X, then Y is also unreachable.\n *\n * Takes into account:\n * - Tokens already in availableOutputs (reachable)\n * - Tokens from completed tasks (reachable)\n * - Failed/disabled producers (non-viable)\n *\n * Pure function.\n */\nexport function getUnreachableTokens(live: LiveGraph): UnreachableTokensResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const producerMap = buildProducerMap(graphTasks);\n\n // Tokens already available\n const available = new Set([...state.availableOutputs]);\n for (const [taskName, taskState] of Object.entries(state.tasks)) {\n if (taskState.status === 'completed') {\n const tc = graphTasks[taskName];\n if (tc) getProvides(tc).forEach(t => available.add(t));\n }\n }\n\n // Collect all required tokens\n const allRequired = new Set<string>();\n for (const taskConfig of Object.values(graphTasks)) {\n for (const token of getRequires(taskConfig)) {\n allRequired.add(token);\n }\n }\n\n // Iterative fixed-point: mark tokens unreachable if all their viable producers\n // are themselves unreachable (need an unreachable token).\n const unreachable = new Set<string>();\n const unreachableNodes = new Set<string>();\n\n // Seed: tokens with NO producer at all (and not already available)\n for (const token of allRequired) {\n if (available.has(token)) continue;\n const producers = producerMap[token] || [];\n if (producers.length === 0) {\n unreachable.add(token);\n }\n }\n\n // Fixed-point: propagate transitively\n let changed = true;\n while (changed) {\n changed = false;\n\n // Mark nodes as unreachable if any of their requires is unreachable\n // and they haven't already completed\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n if (unreachableNodes.has(name)) continue;\n const ts = state.tasks[name];\n if (ts?.status === 'completed') continue; // already done, skip\n\n // Check if non-active (failed/disabled) — it's a dead producer\n const isNonActive = isNonActiveTask(ts);\n\n const requires = getRequires(taskConfig);\n const hasUnreachableDep = requires.some(t => unreachable.has(t));\n\n if (isNonActive || hasUnreachableDep) {\n if (!unreachableNodes.has(name)) {\n unreachableNodes.add(name);\n changed = true;\n }\n }\n }\n\n // Mark tokens as unreachable if ALL their producers are unreachable/non-active\n for (const token of allRequired) {\n if (unreachable.has(token) || available.has(token)) continue;\n const producers = producerMap[token] || [];\n const allProducersUnreachable = producers.length > 0 &&\n producers.every(p => unreachableNodes.has(p) || isNonActiveTask(state.tasks[p]));\n if (producers.length === 0 || allProducersUnreachable) {\n if (!unreachable.has(token)) {\n unreachable.add(token);\n changed = true;\n }\n }\n }\n }\n\n // Build reason map\n const tokens: UnreachableTokensResult['tokens'] = [];\n for (const token of unreachable) {\n const producers = producerMap[token] || [];\n let reason: 'no-producer' | 'all-producers-failed' | 'transitive';\n if (producers.length === 0) {\n reason = 'no-producer';\n } else {\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n reason = allFailed ? 'all-producers-failed' : 'transitive';\n }\n tokens.push({ token, reason, producers });\n }\n\n return { tokens };\n}\n\n/**\n * Get all nodes that can never become eligible given the current graph state.\n * A node is unreachable if any of its required tokens is unreachable.\n *\n * This is the node-level companion to getUnreachableTokens — uses the same\n * transitive analysis.\n *\n * Pure function.\n */\nexport function getUnreachableNodes(live: LiveGraph): UnreachableNodesResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const { tokens: unreachableTokens } = getUnreachableTokens(live);\n const unreachableTokenSet = new Set(unreachableTokens.map(t => t.token));\n\n const nodes: UnreachableNodesResult['nodes'] = [];\n\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n const ts = state.tasks[name];\n if (ts?.status === 'completed') continue; // already done\n\n const requires = getRequires(taskConfig);\n const missingTokens = requires.filter(t => unreachableTokenSet.has(t));\n\n if (missingTokens.length > 0) {\n nodes.push({ nodeName: name, missingTokens });\n } else if (isNonActiveTask(ts)) {\n // Node itself is failed/disabled — it's unreachable too\n nodes.push({ nodeName: name, missingTokens: [] });\n }\n }\n\n return { nodes };\n}\n\n// ============================================================================\n// Graph traversal: upstream / downstream\n// ============================================================================\n\n/**\n * Get all nodes that transitively feed into the given node.\n * \"What's upstream of X?\" — traces backwards through requires → provides chains.\n *\n * Returns the set of upstream nodes and the tokens connecting them.\n * Does NOT include the target node itself.\n * Pure function.\n */\nexport function getUpstream(live: LiveGraph, nodeName: string): UpstreamResult {\n const graphTasks = getAllTasks(live.config);\n if (!graphTasks[nodeName]) return { nodeName, nodes: [], tokens: [] };\n\n const producerMap = buildProducerMap(graphTasks);\n const visited = new Set<string>();\n const tokenSet = new Set<string>();\n const nodeEntries: Map<string, Set<string>> = new Map();\n\n function walk(current: string): void {\n const taskConfig = graphTasks[current];\n if (!taskConfig) return;\n\n for (const token of getRequires(taskConfig)) {\n const producers = producerMap[token] || [];\n for (const producer of producers) {\n if (producer === nodeName) continue; // don't include target\n tokenSet.add(token);\n\n // Track which tokens this producer contributes\n if (!nodeEntries.has(producer)) nodeEntries.set(producer, new Set());\n nodeEntries.get(producer)!.add(token);\n\n if (!visited.has(producer)) {\n visited.add(producer);\n walk(producer);\n }\n }\n }\n }\n\n walk(nodeName);\n\n const nodes = [...nodeEntries.entries()].map(([name, tokens]) => ({\n nodeName: name,\n providesTokens: [...tokens],\n }));\n\n return { nodeName, nodes, tokens: [...tokenSet] };\n}\n\n/**\n * Get all nodes that transitively depend on the given node.\n * \"What breaks if I disable X?\" — traces forwards through provides → requires chains.\n *\n * Returns the set of downstream nodes and the tokens connecting them.\n * Does NOT include the target node itself.\n * Pure function.\n */\nexport function getDownstream(live: LiveGraph, nodeName: string): DownstreamResult {\n const graphTasks = getAllTasks(live.config);\n if (!graphTasks[nodeName]) return { nodeName, nodes: [], tokens: [] };\n\n // Build consumer map: token → nodes that require it\n const consumerMap: Record<string, string[]> = {};\n for (const [name, config] of Object.entries(graphTasks)) {\n for (const token of getRequires(config)) {\n if (!consumerMap[token]) consumerMap[token] = [];\n consumerMap[token].push(name);\n }\n }\n\n const visited = new Set<string>();\n const tokenSet = new Set<string>();\n const nodeEntries: Map<string, Set<string>> = new Map();\n\n function walk(current: string): void {\n const taskConfig = graphTasks[current];\n if (!taskConfig) return;\n\n for (const token of getProvides(taskConfig)) {\n const consumers = consumerMap[token] || [];\n for (const consumer of consumers) {\n if (consumer === nodeName) continue; // don't include target\n tokenSet.add(token);\n\n if (!nodeEntries.has(consumer)) nodeEntries.set(consumer, new Set());\n nodeEntries.get(consumer)!.add(token);\n\n if (!visited.has(consumer)) {\n visited.add(consumer);\n walk(consumer);\n }\n }\n }\n }\n\n walk(nodeName);\n\n const nodes = [...nodeEntries.entries()].map(([name, tokens]) => ({\n nodeName: name,\n requiresTokens: [...tokens],\n }));\n\n return { nodeName, nodes, tokens: [...tokenSet] };\n}\n","/**\n * Continuous Event Graph — Journal\n *\n * Append-only event log for the reactive layer.\n * Handlers append events here; drain() reads and clears atomically.\n *\n * Adapter:\n * - MemoryJournal: in-process array (default)\n */\n\nimport type { GraphEvent } from '../event-graph/types.js';\n\n// ============================================================================\n// Interface\n// ============================================================================\n\nexport interface Journal {\n /** Append an event to the journal. Safe to call from concurrent callbacks. */\n append(event: GraphEvent): void;\n /** Read all pending events and clear the journal atomically. */\n drain(): GraphEvent[];\n /** Number of pending events (for observability). */\n readonly size: number;\n}\n\n// ============================================================================\n// MemoryJournal — in-process, zero dependencies\n// ============================================================================\n\nexport class MemoryJournal implements Journal {\n private buffer: GraphEvent[] = [];\n\n append(event: GraphEvent): void {\n this.buffer.push(event);\n }\n\n drain(): GraphEvent[] {\n const events = this.buffer;\n this.buffer = [];\n return events;\n }\n\n get size(): number {\n return this.buffer.length;\n }\n}\n","/**\n * Continuous Event Graph — Reactive Layer\n *\n * Push-based, self-sustaining execution wrapper.\n *\n * Pattern:\n * 1. Register handlers for tasks\n * 2. Push an event (or inject tokens)\n * 3. The graph drives itself: drain journal → applyEvents → schedule → dispatch → repeat\n *\n * No daemon, no polling. Each handler callback appends to the journal,\n * which triggers a drain cycle that may dispatch the next wave.\n *\n * Dispatch failures, retries, and timeouts are managed internally\n * without touching the core engine types.\n */\n\nimport type { GraphConfig, TaskConfig, GraphEvent, GraphEngineStore } from '../event-graph/types.js';\nimport type { LiveGraph, LiveGraphSnapshot, ScheduleResult } from './types.js';\nimport { createLiveGraph, applyEvents, snapshot } from './core.js';\nimport { schedule } from './schedule.js';\nimport { MemoryJournal } from './journal.js';\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Deterministic hash of a data payload.\n * Recursively-sorted JSON → stable 64-bit hex.\n * Used to auto-compute dataHash when the handler doesn't provide one.\n * Exported so handler authors can pre-compute or test hashes.\n */\nexport function computeDataHash(data: Record<string, unknown>): string {\n const json = stableStringify(data);\n return fnv1a64Hex(json);\n}\n\n/** Recursively produce a JSON string with sorted keys at every level. */\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined || typeof value !== 'object') {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return '[' + value.map(stableStringify).join(',') + ']';\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return '{' + keys.map(k => JSON.stringify(k) + ':' + stableStringify(obj[k])).join(',') + '}';\n}\n\n/**\n * Stable 64-bit FNV-1a hash as 16-char hex.\n * Fast, deterministic, and browser/Node portable.\n */\nfunction fnv1a64Hex(input: string): string {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n const mod = 0xffffffffffffffffn;\n for (let i = 0; i < input.length; i++) {\n hash ^= BigInt(input.charCodeAt(i));\n hash = (hash * prime) & mod;\n }\n return hash.toString(16).padStart(16, '0');\n}\n\nfunction base64UrlEncode(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'utf8').toString('base64url');\n }\n if (typeof btoa === 'function') {\n const bytes = new TextEncoder().encode(input);\n let binary = '';\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n }\n throw new Error('No base64 encoder available in this runtime');\n}\n\nfunction base64UrlDecode(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'base64url').toString('utf8');\n }\n if (typeof atob === 'function') {\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return new TextDecoder().decode(bytes);\n }\n throw new Error('No base64 decoder available in this runtime');\n}\n\n/**\n * Encode a callback token for a task.\n * Opaque base64url string — can be sent to external systems.\n */\nfunction encodeCallbackToken(taskName: string): string {\n const payload = JSON.stringify({ t: taskName, n: Date.now().toString(36) + Math.random().toString(36).slice(2, 6) });\n return base64UrlEncode(payload);\n}\n\n/**\n * Decode a callback token → { taskName } or null if malformed.\n */\nfunction decodeCallbackToken(token: string): { taskName: string } | null {\n try {\n const payload = JSON.parse(base64UrlDecode(token));\n if (typeof payload?.t === 'string') return { taskName: payload.t };\n return null;\n } catch { return null; }\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Input passed to a task handler function.\n *\n * The reactive layer resolves upstream data from `requires` into `state`,\n * and provides this task's own engine store as `taskState`.\n * Handlers push output data back via `graph.resolveCallback(callbackToken, data)`.\n */\nexport interface TaskHandlerInput {\n /** This task's node ID (task name) */\n nodeId: string;\n /**\n * Upstream dependency data, keyed by require token name.\n * Only tokens from this task's `requires` are present.\n * Value is the producing task's `data` field (or undefined if not yet available).\n */\n state: Readonly<Record<string, Record<string, unknown> | undefined>>;\n /**\n * This task's own GraphEngineStore — includes status, data, executionCount, etc.\n */\n taskState: Readonly<GraphEngineStore>;\n /** This task's config */\n config: Readonly<TaskConfig>;\n /**\n * Opaque callback token encoding this task's identity.\n * Pass this to `graph.resolveCallback(callbackToken, data)` to complete the task.\n * Can be serialized and sent to external systems (webhooks, other scripts,\n * message queues) — any process with this token can push data back.\n */\n callbackToken: string;\n /**\n * Present only on task-progress re-invocations (source delivery / failure).\n * Contains the update payload from the task-progress event.\n * e.g. { bindTo: 'prices', fetchedAt: '...', dest: 'prices.json' }\n * or { bindTo: 'prices', failure: true, reason: 'timeout' }\n */\n update?: Record<string, unknown>;\n}\n\n/**\n * Handler return value — initiation status only.\n * - `'task-initiated'` — async work started successfully; data will arrive via resolveCallback\n * - `'task-initiate-failure'` — failed to start (bad config, connection refused, etc.)\n */\nexport type TaskHandlerReturn = 'task-initiated' | 'task-initiate-failure';\n\n/**\n * A named task handler function.\n * Registered in the handler registry, referenced by name in `taskConfig.taskHandlers`.\n *\n * The handler's job is to **initiate** async work, not await it.\n *\n * Flow:\n * 1. Handler receives `callbackToken` + upstream `state`\n * 2. Handler kicks off background work (internal, external script, webhook, etc.)\n * — passes `callbackToken` to the background work\n * 3. Handler returns `'task-initiated'` immediately\n * 4. Background work runs independently — when done, it calls\n * `graph.resolveCallback(callbackToken, data)` for success, or\n * `graph.resolveCallback(callbackToken, {}, ['error msg'])` for failure\n * 5. resolveCallback completes the task → data-changed cascade fires\n *\n * The callbackToken is opaque — pass it to the background work so it can\n * call back. Works across processes, scripts, webhooks, message queues.\n *\n * @example\n * ```ts\n * const fetchYahoo: TaskHandlerFn = async ({ state, callbackToken }) => {\n * const symbols = state['portfolio-form']?.holdings?.map(h => h.symbol) ?? [];\n * // Kick off background work — do NOT await\n * fetch(`https://api.yahoo.com/prices?s=${symbols.join(',')}`)\n * .then(res => res.json())\n * .then(prices => graph.resolveCallback(callbackToken, { prices }))\n * .catch(err => graph.resolveCallback(callbackToken, {}, [err.message]));\n * // Return immediately — background work will resolveCallback when done\n * return 'task-initiated';\n * };\n * ```\n */\nexport type TaskHandlerFn = (input: TaskHandlerInput) => Promise<TaskHandlerReturn>;\n\nexport interface ReactiveGraphOptions {\n /** Named handler registry — handler name → handler function */\n handlers: Record<string, TaskHandlerFn>;\n /** Called after each drain cycle — for observability */\n onDrain?: (events: GraphEvent[], live: LiveGraph, scheduleResult: ScheduleResult) => void;\n}\n\nexport interface ReactiveGraph {\n /** Push an event into the graph via journal. Triggers drain → schedule → dispatch. */\n push(event: GraphEvent): void;\n /** Push multiple events via journal. Single drain cycle after all are journaled. */\n pushAll(events: GraphEvent[]): void;\n /**\n * Resolve a callback token — complete (or fail) a task after initiation.\n * Journals task-completed or task-failed, then drains.\n * Gracefully ignores invalid tokens or tokens for tasks no longer in the graph.\n */\n resolveCallback(callbackToken: string, data: Record<string, unknown>, errors?: string[]): void;\n /** Add a node to the graph. Journals a task-upsert event, then drains. */\n addNode(name: string, taskConfig: TaskConfig): void;\n /** Remove a node from the graph. Journals a task-removal event, then drains. */\n removeNode(name: string): void;\n /** Add required tokens to an existing node. Journals event, then drains. */\n addRequires(nodeName: string, tokens: string[]): void;\n /** Remove required tokens from an existing node. Journals event, then drains. */\n removeRequires(nodeName: string, tokens: string[]): void;\n /** Add provided tokens to an existing node. Journals event, then drains. */\n addProvides(nodeName: string, tokens: string[]): void;\n /** Remove provided tokens from an existing node. Journals event, then drains. */\n removeProvides(nodeName: string, tokens: string[]): void;\n /** Register a named handler in the registry. */\n registerHandler(name: string, fn: TaskHandlerFn): void;\n /** Unregister a named handler from the registry. */\n unregisterHandler(name: string): void;\n /**\n * Re-trigger a task: journals a task-restart event, then drains.\n * data-changed cascade handles downstream automatically.\n */\n retrigger(taskName: string): void;\n /** Re-trigger multiple tasks via journal. */\n retriggerAll(taskNames: string[]): void;\n /**\n * Serialize current state to a JSON-safe snapshot.\n * Caller is responsible for writing to disk/DB/etc.\n * Restore via: `createReactiveGraph(restore(snapshotData), options)`\n */\n snapshot(): LiveGraphSnapshot;\n /** Read-only snapshot of current LiveGraph state. */\n getState(): LiveGraph;\n /** Current schedule projection. */\n getSchedule(): ScheduleResult;\n /**\n * Await all in-flight handler promises without disposing the graph.\n * Use this when you need to wait for async handlers to finish so you\n * can inspect side-effects (e.g. a TX accumulator) and then push more\n * events into the same graph instance.\n */\n waitForHandlers(): Promise<void>;\n /**\n * Stop accepting events.\n * @param options.wait — if true, await all in-flight handler promises before marking disposed.\n */\n dispose(options?: { wait?: boolean }): Promise<void>;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createReactiveGraph(\n configOrLive: GraphConfig | LiveGraph,\n options: ReactiveGraphOptions,\n executionId?: string,\n): ReactiveGraph {\n const {\n handlers: initialHandlers,\n onDrain,\n } = options;\n\n // Private input queue — caller pushes external events here via push()/pushAll().\n // The engine never reads from a caller-supplied journal; all external events must be\n // explicitly pushed in so that state mutations are always caller-controlled.\n const inputQueue = new MemoryJournal();\n\n let live = 'state' in configOrLive && 'config' in configOrLive\n ? configOrLive as LiveGraph\n : createLiveGraph(configOrLive as GraphConfig, executionId);\n let disposed = false;\n\n // Track in-flight handler promises so callers can await them before dispose.\n const pendingHandlers = new Set<Promise<void>>();\n\n // Handler registry — mutable, keyed by handler name\n const handlers = new Map<string, TaskHandlerFn>(Object.entries(initialHandlers));\n\n // Private journal for internal state transitions (task-started, task-failed from engine).\n // Never exposed outside; keeps internal events off the caller-supplied journal.\n const internalJournal = new MemoryJournal();\n\n // Drain lock — prevents re-entrant drain cycles\n let draining = false;\n let drainQueued = false;\n\n // --------------------------------------------------------------------------\n // Core drain cycle\n // --------------------------------------------------------------------------\n\n function drain(): void {\n if (disposed) return;\n if (draining) {\n drainQueued = true;\n return;\n }\n\n draining = true;\n try {\n do {\n drainQueued = false;\n drainOnce();\n } while (drainQueued);\n } finally {\n draining = false;\n }\n }\n\n function drainOnce(): void {\n // 1. Read all pending events — internal lifecycle transitions first (task-started, task-failed),\n // then caller-pushed external events (task-upsert, task-completed, etc.).\n // Internal must precede external so engine lifecycle always applies before caller completions.\n const internalEvents = internalJournal.drain();\n const inputEvents = inputQueue.drain();\n const events = [...internalEvents, ...inputEvents];\n\n // 2. Apply events atomically (if any)\n if (events.length > 0) {\n live = applyEvents(live, events);\n }\n\n // 3. Schedule — what can run?\n const result = schedule(live);\n\n // 4. Observability callback (only when there were events)\n if (events.length > 0) {\n onDrain?.(events, live, result);\n }\n\n // 5. Dispatch eligible tasks\n for (const taskName of result.eligible) {\n dispatchTask(taskName);\n }\n\n // 6. Re-invoke handlers for in-progress tasks that received a task-progress event.\n // task-progress events don't change task status (they're not applied by the engine),\n // so we route them here directly to their taskHandlers.\n for (const event of events) {\n if (event.type === 'task-progress') {\n const { taskName, update } = event;\n const taskConfig = live.config.tasks[taskName];\n if (!taskConfig) continue;\n const taskState = live.state.tasks[taskName];\n if (!taskState || taskState.status !== 'running') continue;\n const callbackToken = encodeCallbackToken(taskName);\n const p = runPipeline(taskName, callbackToken, update).catch((error: Error) => {\n if (disposed) return;\n internalJournal.append({\n type: 'task-failed',\n taskName,\n error: error.message ?? String(error),\n timestamp: new Date().toISOString(),\n });\n drain();\n }).finally(() => { pendingHandlers.delete(p); });\n pendingHandlers.add(p);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Resolve upstream state for a task's requires\n // --------------------------------------------------------------------------\n\n function resolveUpstreamState(taskName: string): Record<string, Record<string, unknown> | undefined> {\n const taskConfig = live.config.tasks[taskName];\n const requires = taskConfig.requires ?? [];\n\n const tokenToTask = new Map<string, string>();\n for (const [name, cfg] of Object.entries(live.config.tasks)) {\n for (const token of cfg.provides ?? []) {\n tokenToTask.set(token, name);\n }\n }\n\n const state: Record<string, Record<string, unknown> | undefined> = {};\n for (const token of requires) {\n const producerTask = tokenToTask.get(token);\n if (producerTask) {\n state[token] = live.state.tasks[producerTask]?.data;\n } else {\n state[token] = undefined;\n }\n }\n return state;\n }\n\n // --------------------------------------------------------------------------\n // Run the handler pipeline for a task\n // --------------------------------------------------------------------------\n\n async function runPipeline(taskName: string, callbackToken: string, update?: Record<string, unknown>): Promise<void> {\n const taskConfig = live.config.tasks[taskName];\n const handlerNames = taskConfig.taskHandlers ?? [];\n const upstreamState = resolveUpstreamState(taskName);\n\n for (const handlerName of handlerNames) {\n const handler = handlers.get(handlerName);\n if (!handler) {\n throw new Error(`Handler '${handlerName}' not found in registry (task '${taskName}')`);\n }\n\n const input: TaskHandlerInput = {\n nodeId: taskName,\n state: upstreamState,\n taskState: live.state.tasks[taskName],\n config: taskConfig,\n callbackToken,\n update,\n };\n\n const status = await handler(input);\n\n if (status === 'task-initiate-failure') {\n throw new Error(`Handler '${handlerName}' returned task-initiate-failure (task '${taskName}')`);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Dispatch a single task\n // --------------------------------------------------------------------------\n\n function dispatchTask(taskName: string): void {\n const taskConfig = live.config.tasks[taskName];\n const handlerNames = taskConfig?.taskHandlers;\n\n if (!handlerNames || handlerNames.length === 0) {\n // No taskHandlers — externally driven.\n return;\n }\n\n // Write task-started to internal journal only — not to the caller-supplied journal\n internalJournal.append({\n type: 'task-started',\n taskName,\n timestamp: new Date().toISOString(),\n });\n // Re-trigger drain so task-started is applied to graph state before caller saves.\n // Since we're called from within drainOnce(), draining=true here, so this sets\n // drainQueued=true — the do...while loop picks it up in the next pass.\n drain();\n\n const callbackToken = encodeCallbackToken(taskName);\n\n // Fire-and-forget: run the handler pipeline\n const p = runPipeline(taskName, callbackToken).catch((error: Error) => {\n if (disposed) return;\n internalJournal.append({\n type: 'task-failed',\n taskName,\n error: error.message ?? String(error),\n timestamp: new Date().toISOString(),\n });\n drain();\n }).finally(() => { pendingHandlers.delete(p); });\n pendingHandlers.add(p);\n }\n\n // --------------------------------------------------------------------------\n // Public API — every mutation goes through journal\n // --------------------------------------------------------------------------\n\n return {\n push(event: GraphEvent): void {\n if (disposed) return;\n if (event.type === 'task-completed' && event.data && !event.dataHash) {\n event = { ...event, dataHash: computeDataHash(event.data) };\n }\n inputQueue.append(event);\n drain();\n },\n\n pushAll(events: GraphEvent[]): void {\n if (disposed) return;\n for (const event of events) {\n if (event.type === 'task-completed' && event.data && !event.dataHash) {\n inputQueue.append({ ...event, dataHash: computeDataHash(event.data) });\n } else {\n inputQueue.append(event);\n }\n }\n drain();\n },\n\n resolveCallback(callbackToken: string, data: Record<string, unknown>, errors?: string[]): void {\n if (disposed) return;\n\n const decoded = decodeCallbackToken(callbackToken);\n if (!decoded) return;\n\n const { taskName } = decoded;\n if (!live.config.tasks[taskName]) return;\n\n if (errors && errors.length > 0) {\n inputQueue.append({\n type: 'task-failed',\n taskName,\n error: errors.join('; '),\n timestamp: new Date().toISOString(),\n });\n } else {\n const dataHash = data && Object.keys(data).length > 0 ? computeDataHash(data) : undefined;\n inputQueue.append({\n type: 'task-completed',\n taskName,\n data,\n dataHash,\n timestamp: new Date().toISOString(),\n });\n }\n drain();\n },\n\n addNode(name: string, taskConfig: TaskConfig): void {\n if (disposed) return;\n inputQueue.append({ type: 'task-upsert', taskName: name, taskConfig, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeNode(name: string): void {\n if (disposed) return;\n inputQueue.append({ type: 'task-removal', taskName: name, timestamp: new Date().toISOString() });\n drain();\n },\n\n addRequires(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-requires-add', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeRequires(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-requires-remove', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n addProvides(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-provides-add', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeProvides(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-provides-remove', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n registerHandler(name: string, fn: TaskHandlerFn): void {\n handlers.set(name, fn);\n },\n\n unregisterHandler(name: string): void {\n handlers.delete(name);\n },\n\n retrigger(taskName: string): void {\n if (disposed) return;\n if (!live.config.tasks[taskName]) return;\n inputQueue.append({\n type: 'task-restart',\n taskName,\n timestamp: new Date().toISOString(),\n });\n drain();\n },\n\n retriggerAll(taskNames: string[]): void {\n if (disposed) return;\n for (const name of taskNames) {\n if (!live.config.tasks[name]) continue;\n inputQueue.append({\n type: 'task-restart',\n taskName: name,\n timestamp: new Date().toISOString(),\n });\n }\n drain();\n },\n\n snapshot(): LiveGraphSnapshot {\n return snapshot(live);\n },\n\n getState(): LiveGraph {\n return live;\n },\n\n getSchedule(): ScheduleResult {\n return schedule(live);\n },\n\n async waitForHandlers(): Promise<void> {\n if (pendingHandlers.size > 0) {\n await Promise.allSettled([...pendingHandlers]);\n }\n },\n\n async dispose(options?: { wait?: boolean }): Promise<void> {\n if (options?.wait && pendingHandlers.size > 0) {\n await Promise.allSettled([...pendingHandlers]);\n }\n disposed = true;\n },\n };\n}\n","/**\n * Continuous Event Graph — Validation Utilities\n *\n * Runtime state-consistency checks for LiveGraph and ReactiveGraph.\n * Unlike event-graph/validate.ts which validates static GraphConfig structure,\n * these validate the *live* runtime state against its config.\n *\n * Pure functions — config+state in, diagnostics out.\n */\n\nimport type { LiveGraph } from './types.js';\nimport type { ReactiveGraph } from './reactive.js';\nimport type { GraphIssue, GraphValidationResult } from '../event-graph/validate.js';\nimport { getProvides, getAllTasks } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n// ============================================================================\n// validateLiveGraph — state/config consistency\n// ============================================================================\n\n/**\n * Validate that a LiveGraph's runtime state is consistent with its config.\n *\n * Checks:\n * - Every config task has a corresponding state entry (MISSING_STATE)\n * - No orphan state entries exist for tasks not in config (ORPHAN_STATE)\n * - Running tasks have a startedAt timestamp (RUNNING_WITHOUT_START)\n * - Completed tasks have a completedAt timestamp (COMPLETED_WITHOUT_TIMESTAMP)\n * - Failed tasks have a failedAt timestamp and error (FAILED_WITHOUT_INFO)\n * - Available outputs match what completed tasks should have produced (PHANTOM_OUTPUT / MISSING_OUTPUT)\n * - Execution counts are non-negative (INVALID_EXECUTION_COUNT)\n * - No task has executionCount > maxExecutions when capped (EXCEEDED_MAX_EXECUTIONS)\n */\nexport function validateLiveGraph(live: LiveGraph): GraphValidationResult {\n const issues: GraphIssue[] = [];\n const { config, state } = live;\n const tasks = getAllTasks(config);\n const taskNames = Object.keys(tasks);\n\n // ---- 1. Missing state entries ----\n for (const name of taskNames) {\n if (!state.tasks[name]) {\n issues.push({\n severity: 'error',\n code: 'MISSING_STATE',\n message: `Task \"${name}\" exists in config but has no state entry`,\n tasks: [name],\n });\n }\n }\n\n // ---- 2. Orphan state entries ----\n for (const name of Object.keys(state.tasks)) {\n if (!tasks[name]) {\n issues.push({\n severity: 'warning',\n code: 'ORPHAN_STATE',\n message: `State entry \"${name}\" has no corresponding task config`,\n tasks: [name],\n });\n }\n }\n\n // ---- 3. Status consistency ----\n for (const name of taskNames) {\n const ts = state.tasks[name];\n if (!ts) continue;\n\n if (ts.status === TASK_STATUS.RUNNING && !ts.startedAt) {\n issues.push({\n severity: 'warning',\n code: 'RUNNING_WITHOUT_START',\n message: `Task \"${name}\" is running but has no startedAt timestamp`,\n tasks: [name],\n });\n }\n\n if (ts.status === TASK_STATUS.COMPLETED && !ts.completedAt) {\n issues.push({\n severity: 'warning',\n code: 'COMPLETED_WITHOUT_TIMESTAMP',\n message: `Task \"${name}\" is completed but has no completedAt timestamp`,\n tasks: [name],\n });\n }\n\n if (ts.status === TASK_STATUS.FAILED) {\n if (!ts.failedAt) {\n issues.push({\n severity: 'warning',\n code: 'FAILED_WITHOUT_INFO',\n message: `Task \"${name}\" is failed but has no failedAt timestamp`,\n tasks: [name],\n });\n }\n if (!ts.error) {\n issues.push({\n severity: 'info',\n code: 'FAILED_WITHOUT_INFO',\n message: `Task \"${name}\" is failed but has no error message`,\n tasks: [name],\n });\n }\n }\n }\n\n // ---- 4. Available outputs consistency ----\n // Compute what outputs SHOULD be available based on completed tasks\n const expectedOutputs = new Set<string>();\n for (const name of taskNames) {\n const ts = state.tasks[name];\n if (ts?.status === TASK_STATUS.COMPLETED) {\n for (const token of getProvides(tasks[name])) {\n expectedOutputs.add(token);\n }\n }\n }\n\n const actualOutputs = new Set(state.availableOutputs);\n\n // Phantom outputs: in state but no completed task produced them\n // (tokens injected via inject-tokens are valid, so only flag those\n // that also aren't in ANY task's provides list — truly phantom)\n const allProducible = new Set<string>();\n for (const taskConfig of Object.values(tasks)) {\n for (const t of getProvides(taskConfig)) allProducible.add(t);\n if (taskConfig.on) {\n for (const tokens of Object.values(taskConfig.on)) {\n for (const t of tokens) allProducible.add(t);\n }\n }\n if (taskConfig.on_failure) {\n for (const t of taskConfig.on_failure) allProducible.add(t);\n }\n }\n\n for (const token of actualOutputs) {\n if (!expectedOutputs.has(token) && !allProducible.has(token)) {\n // Token is available but no task can produce it — likely injected, just info\n issues.push({\n severity: 'info',\n code: 'INJECTED_TOKEN',\n message: `Token \"${token}\" is available but no task in the graph can produce it (likely injected)`,\n tokens: [token],\n });\n }\n }\n\n // Missing outputs: a completed task's provides aren't in available outputs\n for (const token of expectedOutputs) {\n if (!actualOutputs.has(token)) {\n issues.push({\n severity: 'warning',\n code: 'MISSING_OUTPUT',\n message: `Token \"${token}\" should be available (its producer completed) but is not in availableOutputs`,\n tokens: [token],\n });\n }\n }\n\n // ---- 5. Execution count integrity ----\n for (const name of taskNames) {\n const ts = state.tasks[name];\n if (!ts) continue;\n\n if (ts.executionCount < 0) {\n issues.push({\n severity: 'error',\n code: 'INVALID_EXECUTION_COUNT',\n message: `Task \"${name}\" has negative execution count: ${ts.executionCount}`,\n tasks: [name],\n });\n }\n\n const maxExec = tasks[name].maxExecutions;\n if (maxExec !== undefined && ts.executionCount > maxExec) {\n issues.push({\n severity: 'error',\n code: 'EXCEEDED_MAX_EXECUTIONS',\n message: `Task \"${name}\" executed ${ts.executionCount} times, exceeding maxExecutions of ${maxExec}`,\n tasks: [name],\n });\n }\n }\n\n return buildResult(issues);\n}\n\n// ============================================================================\n// validateReactiveGraph — reactive-layer consistency\n// ============================================================================\n\n/**\n * Input for reactive graph validation.\n * Accepts the reactive graph instance plus the original options (for handler list reference).\n */\nexport interface ReactiveGraphValidationInput {\n /** The reactive graph instance to validate */\n graph: ReactiveGraph;\n /** The handler registry (handler name → handler function) */\n handlers: Record<string, unknown>;\n}\n\n/**\n * Validate reactive-graph-specific consistency.\n *\n * Checks:\n * - Every handler name referenced in taskConfig.taskHandlers exists in the registry (MISSING_HANDLER)\n * - No handlers registered that are not referenced by any task's taskHandlers (ORPHAN_HANDLER)\n * - Plus all validateLiveGraph checks on the underlying state\n */\nexport function validateReactiveGraph(input: ReactiveGraphValidationInput): GraphValidationResult {\n const { graph, handlers } = input;\n const live = graph.getState();\n const issues: GraphIssue[] = [];\n\n const tasks = getAllTasks(live.config);\n const taskNames = Object.keys(tasks);\n const handlerNames = new Set(Object.keys(handlers));\n\n // Collect all handler names referenced by any task's taskHandlers\n const referencedHandlers = new Set<string>();\n for (const name of taskNames) {\n const taskHandlers = tasks[name].taskHandlers;\n if (taskHandlers) {\n for (const h of taskHandlers) {\n referencedHandlers.add(h);\n }\n }\n }\n\n // ---- 1. Missing handlers — taskHandlers references a name not in registry ----\n for (const name of taskNames) {\n const taskHandlers = tasks[name].taskHandlers;\n if (!taskHandlers) continue; // externally driven — no handler needed\n for (const h of taskHandlers) {\n if (!handlers[h]) {\n issues.push({\n severity: 'error',\n code: 'MISSING_HANDLER',\n message: `Task \"${name}\" references handler \"${h}\" but it is not in the registry`,\n tasks: [name],\n });\n }\n }\n }\n\n // ---- 2. Orphan handlers — registered but not referenced by any task ----\n for (const name of handlerNames) {\n if (!referencedHandlers.has(name)) {\n issues.push({\n severity: 'warning',\n code: 'ORPHAN_HANDLER',\n message: `Handler \"${name}\" is registered but not referenced by any task's taskHandlers`,\n tasks: [name],\n });\n }\n }\n\n // ---- 3. Include underlying LiveGraph validation ----\n const liveResult = validateLiveGraph(live);\n issues.push(...liveResult.issues);\n\n return buildResult(issues);\n}\n\n// ============================================================================\n// Shared\n// ============================================================================\n\nfunction buildResult(issues: GraphIssue[]): GraphValidationResult {\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n return {\n valid: errors.length === 0,\n issues,\n errors,\n warnings,\n };\n}\n","/**\n * Continuous Event Graph — mutateGraph\n *\n * A higher-level batch mutation API.\n *\n * Unlike calling addNode/removeNode/injectTokens individually, mutateGraph\n * accepts a declarative array of mutations and applies them atomically.\n * This is useful for:\n * - Applying a set of structural changes + events in a single call\n * - Building mutation pipelines from external configs\n * - Reducing boilerplate when scripting graph changes\n *\n * Pattern: mutateGraph(live, mutations[]) → LiveGraph\n * Pure function — no side effects.\n */\n\nimport type { TaskConfig, GraphEvent } from '../event-graph/types.js';\nimport type { LiveGraph } from './types.js';\nimport {\n addNode,\n removeNode,\n addRequires,\n removeRequires,\n addProvides,\n removeProvides,\n injectTokens,\n drainTokens,\n resetNode,\n disableNode,\n enableNode,\n applyEvents,\n} from './core.js';\n\n// ============================================================================\n// Mutation types\n// ============================================================================\n\nexport type GraphMutation =\n | AddNodeMutation\n | RemoveNodeMutation\n | AddRequiresMutation\n | RemoveRequiresMutation\n | AddProvidesMutation\n | RemoveProvidesMutation\n | InjectTokensMutation\n | DrainTokensMutation\n | ResetNodeMutation\n | DisableNodeMutation\n | EnableNodeMutation\n | ApplyEventsMutation;\n\nexport interface AddNodeMutation {\n type: 'add-node';\n name: string;\n config: TaskConfig;\n}\n\nexport interface RemoveNodeMutation {\n type: 'remove-node';\n name: string;\n}\n\nexport interface AddRequiresMutation {\n type: 'add-requires';\n taskName: string;\n tokens: string[];\n}\n\nexport interface RemoveRequiresMutation {\n type: 'remove-requires';\n taskName: string;\n tokens: string[];\n}\n\nexport interface AddProvidesMutation {\n type: 'add-provides';\n taskName: string;\n tokens: string[];\n}\n\nexport interface RemoveProvidesMutation {\n type: 'remove-provides';\n taskName: string;\n tokens: string[];\n}\n\nexport interface InjectTokensMutation {\n type: 'inject-tokens';\n tokens: string[];\n}\n\nexport interface DrainTokensMutation {\n type: 'drain-tokens';\n tokens: string[];\n}\n\nexport interface ResetNodeMutation {\n type: 'reset-node';\n name: string;\n}\n\nexport interface DisableNodeMutation {\n type: 'disable-node';\n name: string;\n}\n\nexport interface EnableNodeMutation {\n type: 'enable-node';\n name: string;\n}\n\nexport interface ApplyEventsMutation {\n type: 'apply-events';\n events: GraphEvent[];\n}\n\n// ============================================================================\n// mutateGraph — apply mutations atomically\n// ============================================================================\n\n/**\n * Apply an ordered array of mutations to a LiveGraph, returning the new state.\n *\n * Mutations are applied in order. Each mutation can depend on the result of\n * the previous one (e.g., add a node, then inject tokens it requires).\n *\n * Pure function — does not modify the input.\n *\n * @param live - The current LiveGraph\n * @param mutations - Ordered array of mutations to apply\n * @returns The new LiveGraph after all mutations\n * @throws Error if a mutation references a non-existent task (for safety)\n */\nexport function mutateGraph(live: LiveGraph, mutations: GraphMutation[]): LiveGraph {\n let current = live;\n\n for (const mutation of mutations) {\n current = applySingleMutation(current, mutation);\n }\n\n return current;\n}\n\nfunction applySingleMutation(live: LiveGraph, mutation: GraphMutation): LiveGraph {\n switch (mutation.type) {\n case 'add-node':\n return addNode(live, mutation.name, mutation.config);\n case 'remove-node':\n return removeNode(live, mutation.name);\n case 'add-requires':\n return addRequires(live, mutation.taskName, mutation.tokens);\n case 'remove-requires':\n return removeRequires(live, mutation.taskName, mutation.tokens);\n case 'add-provides':\n return addProvides(live, mutation.taskName, mutation.tokens);\n case 'remove-provides':\n return removeProvides(live, mutation.taskName, mutation.tokens);\n case 'inject-tokens':\n return injectTokens(live, mutation.tokens);\n case 'drain-tokens':\n return drainTokens(live, mutation.tokens);\n case 'reset-node':\n return resetNode(live, mutation.name);\n case 'disable-node':\n return disableNode(live, mutation.name);\n case 'enable-node':\n return enableNode(live, mutation.name);\n case 'apply-events':\n return applyEvents(live, mutation.events);\n default:\n throw new Error(`Unknown mutation type: ${(mutation as { type: string }).type}`);\n }\n}\n","/**\n * Continuous Event Graph — Handler Factories\n *\n * Ready-made TaskHandlerFn factories for common integration patterns.\n * Each factory returns a TaskHandlerFn compatible with createReactiveGraph.\n *\n * In the callbackToken model, handlers are **initiators** — they kick off\n * background work and return 'task-initiated'. The background work calls\n * graph.resolveCallback(callbackToken, data) when done.\n *\n * Factories that wrap synchronous/async compute accept a `getGraph` getter\n * to obtain the resolveCallback reference (lazy-bound because the graph\n * doesn't exist yet at handler-creation time).\n *\n * Patterns:\n * createCallbackHandler — wrap an async function that computes data\n * createFireAndForgetHandler — side-effect-only (always resolves empty data)\n * createShellHandler — run a shell command, resolve with stdout\n * createScriptHandler — spawn a Node.js/Python script\n * createWebhookHandler — POST to a URL, resolve with response\n * createNoopHandler — always resolves immediately (testing/placeholders)\n */\n\nimport { exec, execFile } from 'node:child_process';\nimport type { TaskHandlerFn, TaskHandlerInput, TaskHandlerReturn } from './reactive.js';\n\n/** Minimal resolveCallback interface — matches ReactiveGraph.resolveCallback */\nexport interface ResolveCallbackFn {\n (callbackToken: string, data: Record<string, unknown>, errors?: string[]): void;\n}\n\n/**\n * Structured command specification for process-based handlers.\n *\n * Use this everywhere instead of raw command strings:\n * - command: the executable name or path (no embedded args)\n * - args: explicit argument array (no shell quoting needed)\n *\n * JSON config format:\n * Old: { \"command\": \"node path/to/exec.js --flag\" } ← parsed for compat by parseCommandSpec\n * New: { \"command\": \"node\", \"args\": [\"path/to/exec.js\", \"--flag\"] }\n */\nexport interface CommandSpec {\n /** Executable name or path. No embedded args. */\n command: string;\n /** Explicit argument list. No shell quoting needed. */\n args?: string[];\n /** Working directory. */\n cwd?: string;\n /** Additional environment variables merged over process.env. */\n env?: Record<string, string>;\n /** Timeout in milliseconds. */\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Callback handler — simplest pattern for plugging async functions\n// ============================================================================\n\n/**\n * Wrap a plain async function as a TaskHandlerFn.\n *\n * The function receives TaskHandlerInput and returns data.\n * The factory handles the callbackToken plumbing — it fires\n * the function in the background and calls resolveCallback.\n *\n * @param fn - Async function that computes and returns data\n * @param getResolve - Lazy getter for the resolveCallback function\n *\n * @example\n * ```ts\n * let graph: ReactiveGraph;\n * const handler = createCallbackHandler(\n * async ({ state }) => {\n * const prices = await fetchPrices(state['portfolio-form']?.symbols);\n * return { prices };\n * },\n * () => graph.resolveCallback.bind(graph),\n * );\n * graph = createReactiveGraph(config, { handlers: { fetchPrices: handler } });\n * ```\n */\nexport function createCallbackHandler(\n fn: (input: TaskHandlerInput) => Promise<Record<string, unknown>>,\n getResolve: () => ResolveCallbackFn,\n): TaskHandlerFn {\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken } = input;\n // Fire in background — do NOT await\n Promise.resolve(fn(input))\n .then(data => getResolve()(callbackToken, data))\n .catch(err => getResolve()(callbackToken, {}, [err instanceof Error ? err.message : String(err)]));\n return 'task-initiated';\n };\n}\n\n/**\n * Fire-and-forget variant — the async function is invoked but\n * the handler always resolves the task with empty data.\n * Useful for side-effect-only tasks (logging, notifications).\n *\n * @param fn - Side-effect function (logging, alerting, etc.)\n * @param getResolve - Lazy getter for the resolveCallback function\n *\n * @example\n * ```ts\n * const handler = createFireAndForgetHandler(\n * async ({ nodeId }) => { await sendSlack(`${nodeId} started`); },\n * () => graph.resolveCallback.bind(graph),\n * );\n * ```\n */\nexport function createFireAndForgetHandler(\n fn: (input: TaskHandlerInput) => Promise<void> | void,\n getResolve: () => ResolveCallbackFn,\n): TaskHandlerFn {\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken } = input;\n // Fire side-effect in background, always resolve with empty data\n Promise.resolve(fn(input))\n .then(() => getResolve()(callbackToken, {}))\n .catch(() => getResolve()(callbackToken, {})); // swallow errors — fire and forget\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Shell handler — run a shell command\n// ============================================================================\n\nexport interface ShellHandlerOptions {\n /** Shell command to run. Supports ${taskName} placeholder. */\n command: string;\n /** Working directory (default: process.cwd()) */\n cwd?: string;\n /** Additional environment variables */\n env?: Record<string, string>;\n /** Timeout in ms (default: 30000) */\n timeoutMs?: number;\n /** Map exit codes to result keys (default: 0 → 'success', non-zero → 'failure') */\n exitCodeMap?: Record<number, string>;\n /** If true, include stdout/stderr in data payload */\n captureOutput?: boolean;\n /** Lazy getter for the resolveCallback function */\n getResolve: () => ResolveCallbackFn;\n}\n\n/**\n * Create a TaskHandlerFn that runs a shell command.\n *\n * By default, exit code 0 = resolves with stdout data, non-zero = resolves with error.\n * Use exitCodeMap to map specific codes to result keys for conditional routing.\n *\n * @example\n * ```ts\n * const handler = createShellHandler({\n * command: 'python scripts/process.py --task ${taskName}',\n * cwd: '/app',\n * captureOutput: true,\n * getResolve: () => graph.resolveCallback.bind(graph),\n * });\n * ```\n */\nexport function createShellHandler(options: ShellHandlerOptions): TaskHandlerFn {\n const {\n command: commandTemplate,\n cwd,\n env,\n timeoutMs = 30_000,\n exitCodeMap,\n captureOutput = false,\n getResolve,\n } = options;\n\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken, nodeId } = input;\n const command = commandTemplate.replace(/\\$\\{taskName\\}/g, nodeId);\n\n // Fire in background\n exec(\n command,\n {\n cwd,\n env: env ? { ...process.env, ...env } : undefined,\n timeout: timeoutMs,\n maxBuffer: 10 * 1024 * 1024, // 10MB\n },\n (error, stdout, stderr) => {\n const exitCode = error?.code as number | undefined ?? (error ? 1 : 0);\n\n if (exitCode !== 0 && !exitCodeMap?.[exitCode]) {\n getResolve()(callbackToken, {}, [`Command exited with code ${exitCode}: ${stderr || error?.message}`]);\n return;\n }\n\n const data: Record<string, unknown> = {};\n if (captureOutput) {\n data.stdout = stdout;\n data.stderr = stderr;\n data.exitCode = exitCode;\n }\n\n getResolve()(callbackToken, data);\n },\n );\n\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Process handler — structured command execution (no shell)\n// ============================================================================\n\nexport interface ProcessHandlerOptions extends CommandSpec {\n /** Map exit codes to result keys (default: 0 → success, non-zero → error) */\n exitCodeMap?: Record<number, string>;\n /** If true, include stdout/stderr/exitCode in the data payload */\n captureOutput?: boolean;\n /** Lazy getter for the resolveCallback function */\n getResolve: () => ResolveCallbackFn;\n}\n\n/**\n * Create a TaskHandlerFn that spawns a process using structured command + args.\n *\n * Unlike createShellHandler, this uses execFile — no ambient shell, no quoting\n * issues, safe on Windows and Linux. ${taskName} is substituted in both the\n * command and each arg string.\n *\n * Prefer this over createShellHandler for all programmatic invocations\n * (task-executors, source fetchers, inference adapters).\n *\n * @example\n * ```ts\n * const handler = createProcessHandler({\n * command: 'node',\n * args: ['scripts/fetch.js', '--task', '${taskName}'],\n * cwd: '/app',\n * captureOutput: true,\n * getResolve: () => graph.resolveCallback.bind(graph),\n * });\n * ```\n */\nexport function createProcessHandler(options: ProcessHandlerOptions): TaskHandlerFn {\n const {\n command: commandTemplate,\n args: argsTemplate = [],\n cwd,\n env,\n timeoutMs = 30_000,\n exitCodeMap,\n captureOutput = false,\n getResolve,\n } = options;\n\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken, nodeId } = input;\n const command = commandTemplate.replace(/\\$\\{taskName\\}/g, nodeId);\n const args = argsTemplate.map(a => a.replace(/\\$\\{taskName\\}/g, nodeId));\n\n execFile(\n command,\n args,\n {\n cwd,\n env: env ? { ...process.env, ...env } : undefined,\n timeout: timeoutMs,\n maxBuffer: 10 * 1024 * 1024,\n encoding: 'utf8',\n windowsHide: true,\n },\n (error, stdout, stderr) => {\n const exitCode = error?.code as number | undefined ?? (error ? 1 : 0);\n\n if (exitCode !== 0 && !exitCodeMap?.[exitCode]) {\n getResolve()(callbackToken, {}, [`Process exited with code ${exitCode}: ${stderr || error?.message}`]);\n return;\n }\n\n const data: Record<string, unknown> = {};\n if (captureOutput) {\n data.stdout = stdout;\n data.stderr = stderr;\n data.exitCode = exitCode;\n }\n\n getResolve()(callbackToken, data);\n },\n );\n\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Script handler — spawn a script file\n// ============================================================================\n\nexport interface ScriptHandlerOptions {\n /** Path to the script file */\n scriptPath: string;\n /** Runtime to use (default: auto-detected from extension) */\n runtime?: 'node' | 'python' | 'python3' | 'bash' | 'sh';\n /** Additional CLI arguments */\n args?: string[];\n /** Working directory */\n cwd?: string;\n /** Timeout in ms (default: 60000) */\n timeoutMs?: number;\n /** If true, include stdout/stderr in data payload */\n captureOutput?: boolean;\n /** Lazy getter for the resolveCallback function */\n getResolve: () => ResolveCallbackFn;\n}\n\nfunction detectRuntime(scriptPath: string): string {\n if (scriptPath.endsWith('.js') || scriptPath.endsWith('.mjs') || scriptPath.endsWith('.ts')) return 'node';\n if (scriptPath.endsWith('.py')) return 'python3';\n if (scriptPath.endsWith('.sh')) return 'bash';\n return 'bash';\n}\n\n/**\n * Create a TaskHandlerFn that spawns a script file.\n *\n * Auto-detects the runtime from the file extension unless overridden.\n * The task name is passed as the first argument to the script,\n * followed by any additional args.\n *\n * @example\n * ```ts\n * const handler = createScriptHandler({\n * scriptPath: './scripts/etl.py',\n * args: ['--verbose'],\n * captureOutput: true,\n * getResolve: () => graph.resolveCallback.bind(graph),\n * });\n * ```\n */\nexport function createScriptHandler(options: ScriptHandlerOptions): TaskHandlerFn {\n const {\n scriptPath,\n runtime,\n args = [],\n cwd,\n timeoutMs = 60_000,\n captureOutput = false,\n getResolve,\n } = options;\n\n const resolvedRuntime = runtime ?? detectRuntime(scriptPath);\n const command = resolvedRuntime === 'node' ? process.execPath : resolvedRuntime;\n\n return createProcessHandler({\n command,\n args: [scriptPath, '${taskName}', ...args],\n cwd,\n timeoutMs,\n captureOutput,\n getResolve,\n });\n}\n\n// ============================================================================\n// Webhook handler — POST to a URL\n// ============================================================================\n\nexport interface WebhookHandlerOptions {\n /** URL to POST to. Supports ${taskName} placeholder. */\n url: string;\n /** HTTP method (default: POST) */\n method?: 'POST' | 'PUT' | 'PATCH';\n /** Additional headers */\n headers?: Record<string, string>;\n /** Timeout in ms (default: 30000) */\n timeoutMs?: number;\n /** If true, treat non-2xx status as failure */\n failOnNon2xx?: boolean;\n /** Lazy getter for the resolveCallback function */\n getResolve: () => ResolveCallbackFn;\n}\n\n/**\n * Create a TaskHandlerFn that sends an HTTP request.\n *\n * Uses native fetch (Node 18+). The task context (nodeId, config)\n * is sent as the JSON body along with the callbackToken.\n *\n * @example\n * ```ts\n * const handler = createWebhookHandler({\n * url: 'https://api.example.com/tasks/${taskName}/trigger',\n * headers: { 'Authorization': 'Bearer ...' },\n * getResolve: () => graph.resolveCallback.bind(graph),\n * });\n * ```\n */\nexport function createWebhookHandler(options: WebhookHandlerOptions): TaskHandlerFn {\n const {\n url: urlTemplate,\n method = 'POST',\n headers = {},\n timeoutMs = 30_000,\n failOnNon2xx = true,\n getResolve,\n } = options;\n\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken, nodeId, config } = input;\n const url = urlTemplate.replace(/\\$\\{taskName\\}/g, nodeId);\n const body = JSON.stringify({\n taskName: nodeId,\n callbackToken,\n config,\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n // Fire in background\n fetch(url, {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n body,\n signal: controller.signal,\n })\n .then(async (response) => {\n clearTimeout(timer);\n if (failOnNon2xx && !response.ok) {\n const text = await response.text().catch(() => '');\n getResolve()(callbackToken, {}, [`HTTP ${response.status}: ${text}`]);\n return;\n }\n const data = await response.json().catch(() => ({})) as Record<string, unknown>;\n getResolve()(callbackToken, data);\n })\n .catch((err) => {\n clearTimeout(timer);\n getResolve()(callbackToken, {}, [err instanceof Error ? err.message : String(err)]);\n });\n\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Noop handler — always resolves immediately\n// ============================================================================\n\n/**\n * Create a handler that always resolves immediately with static data.\n * Useful for testing, placeholders, or passthrough tasks.\n *\n * @param getResolve - Lazy getter for the resolveCallback function\n * @param staticData - Optional static data to resolve with\n */\nexport function createNoopHandler(\n getResolve: () => ResolveCallbackFn,\n staticData?: Record<string, unknown>,\n): TaskHandlerFn {\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n getResolve()(input.callbackToken, staticData ?? {});\n return 'task-initiated';\n };\n}\n","/**\n * card-compute — JSONata-powered compute engine for LiveCards nodes.\n *\n * Isomorphic: works in browser, Node.js, and bundlers.\n * No DOM dependency. Compute expressions are JSONata strings.\n *\n * @example\n * ```typescript\n * import { CardCompute } from 'yaml-flow/card-compute';\n *\n * const node = {\n * id: 'sales',\n * card_data: { data: [{ revenue: 100 }, { revenue: 200 }] },\n * compute: [\n * { bindTo: 'total', expr: '$sum(card_data.data.revenue)' },\n * { bindTo: 'avg', expr: '$average(card_data.data.revenue)' },\n * ],\n * };\n * await CardCompute.run(node);\n * // node.computed_values.total === 300\n * // node.computed_values.avg === 150\n * ```\n *\n * Expressions are evaluated against { card_data, requires, fetched_sources, computed_values }.\n * computed_values is ephemeral — never persisted to disk.\n */\n\nimport jsonata from 'jsonata';\nimport { createRequire } from 'module';\nconst _require = createRequire(import.meta.url);\n// QuickJS bundles may initialize the shim binding after this module executes.\n// Fallback to the standard jsonata import so sync evaluation still works.\nconst jsonataSync: typeof jsonata = (_require('./jsonata-sync.cjs') ?? jsonata) as typeof jsonata;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A source definition: cli writes to outputFile; bindTo names the fetched_sources.* key in compute context. Both bindTo and outputFile must be unique across source_defs in a card. */\nexport interface ComputeSource {\n bindTo: string;\n outputFile: string;\n cli?: string;\n // Deprecated alias retained for compatibility with older cards.\n script?: string;\n optionalForCompletionGating?: boolean;\n /** Named data projections: each key maps to a JSONata expression rooted at card_data or requires.\n * The engine evaluates these before spawning the executor and passes results as _projections. */\n projections?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/** Options for CardCompute.run() */\nexport interface RunOptions {\n /** Pre-loaded source results map (keyed by bindTo). Use in browser or when caller loads files. */\n sourcesData?: Record<string, unknown>;\n}\n\n/** A single compute step: bindTo names the computed_values key; expr is a JSONata expression. */\nexport interface ComputeStep {\n bindTo: string;\n expr: string;\n}\n\n/** Minimal node shape expected by CardCompute. */\nexport interface ComputeNode {\n id?: string;\n card_data?: Record<string, unknown>;\n requires?: Record<string, unknown>;\n source_defs?: ComputeSource[];\n compute?: ComputeStep[];\n computed_values?: Record<string, unknown>;\n /** Ephemeral: populated by run() from sourcesData option. Never persisted. */\n _sourcesData?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Deep path utilities\n// ---------------------------------------------------------------------------\n\nfunction deepGet(obj: unknown, path: string): unknown {\n if (!path || !obj) return undefined;\n const parts = path.split('.');\n let cur: unknown = obj;\n for (let i = 0; i < parts.length; i++) {\n if (cur == null) return undefined;\n cur = (cur as Record<string, unknown>)[parts[i]];\n }\n return cur;\n}\n\nfunction deepSet(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if (cur[parts[i]] == null || typeof cur[parts[i]] !== 'object') cur[parts[i]] = {};\n cur = cur[parts[i]] as Record<string, unknown>;\n }\n cur[parts[parts.length - 1]] = value;\n}\n\n// ---------------------------------------------------------------------------\n// Engine — JSONata-based async evaluation\n// ---------------------------------------------------------------------------\n\n/**\n * Run all compute steps on a node.\n * Each step's expr is evaluated against { card_data, requires, fetched_sources, computed_values }.\n * Results are written to node.computed_values[bindTo].\n * computed_values and _sourcesData are reset on each call — ephemeral, never persisted.\n *\n * @param options.sourcesData Pre-loaded map of { [bindTo]: data } for fetched_sources namespace.\n * In Node/CLI: loaded from outputFiles by the caller (card-handler).\n * In browser: passed in by the caller (e.g. from fetch results).\n */\nasync function run(node: ComputeNode, options?: RunOptions): Promise<ComputeNode> {\n if (!node?.compute?.length) return node;\n if (!node.card_data) node.card_data = {};\n node.computed_values = {};\n node._sourcesData = options?.sourcesData ?? {};\n\n // Context passed to JSONata\n const ctx: Record<string, unknown> = {\n card_data: node.card_data,\n requires: node.requires ?? {},\n fetched_sources: node._sourcesData,\n computed_values: node.computed_values,\n };\n\n for (const step of node.compute) {\n try {\n const val = await jsonata(step.expr).evaluate(ctx);\n deepSet(node.computed_values, step.bindTo, val);\n ctx.computed_values = node.computed_values; // subsequent steps see earlier results\n } catch (err) {\n console.error(`CardCompute.run error on \"${node.id ?? '?'}.${step.bindTo}\":`, err);\n }\n }\n\n return node;\n}\n\n/**\n * Synchronous version of run() — uses a vendored sync JSONata build\n * (async/await stripped from jsonata.js since all built-in functions\n * are CPU-only).\n *\n * Same semantics as `run()`: evaluates all compute steps, populates\n * `node.computed_values`, returns the mutated node.\n *\n * @returns `{ ok: true, node }` when all steps evaluated successfully.\n * `{ ok: false, node }` is currently never returned but reserved\n * for future use if an expression requires true async evaluation.\n */\nfunction runSync(node: ComputeNode, options?: RunOptions): { ok: boolean; node: ComputeNode } {\n if (!node?.compute?.length) return { ok: true, node };\n if (!node.card_data) node.card_data = {};\n node.computed_values = {};\n node._sourcesData = options?.sourcesData ?? {};\n\n const ctx: Record<string, unknown> = {\n card_data: node.card_data,\n requires: node.requires ?? {},\n fetched_sources: node._sourcesData,\n computed_values: node.computed_values,\n };\n\n for (const step of node.compute) {\n try {\n const val = jsonataSync(step.expr).evaluate(ctx);\n deepSet(node.computed_values, step.bindTo, val);\n ctx.computed_values = node.computed_values;\n } catch (err) {\n console.error(`CardCompute.runSync error on \"${node.id ?? '?'}.${step.bindTo}\":`, err);\n }\n }\n\n return { ok: true, node };\n}\n\n/**\n * Evaluate a single JSONata expression against a node's context.\n * Context is { card_data, requires, fetched_sources, computed_values }.\n */\nasync function evalExpr(expr: string, node: ComputeNode): Promise<unknown> {\n const ctx: Record<string, unknown> = {\n card_data: node.card_data ?? {},\n requires: node.requires ?? {},\n fetched_sources: node._sourcesData ?? {},\n computed_values: node.computed_values ?? {},\n };\n return jsonata(expr).evaluate(ctx);\n}\n\n// ---------------------------------------------------------------------------\n// resolve — synchronous deep-get from node\n// ---------------------------------------------------------------------------\n\nfunction resolve(node: ComputeNode, path: string): unknown {\n if (path.startsWith('fetched_sources.')) {\n return deepGet(node._sourcesData ?? {}, path.slice('fetched_sources.'.length));\n }\n\n return deepGet(node, path);\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\n/** Result of validateNode — ok: true means valid, ok: false has errors[]. */\nexport interface ValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nconst VALID_ELEMENT_KINDS = new Set([\n 'metric', 'table', 'editable-table', 'chart', 'form', 'filter', 'list',\n 'notes', 'todo', 'alert', 'narrative', 'badge', 'text',\n 'markdown', 'ref', 'custom', 'actions',\n]);\n\nconst ALLOWED_KEYS = new Set(['id', 'meta', 'requires', 'provides', 'view', 'card_data', 'compute', 'source_defs']);\n\nfunction validateNode(node: unknown): ValidationResult {\n const errors: string[] = [];\n\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n return { ok: false, errors: ['Node must be a non-null object'] };\n }\n\n const n = node as Record<string, unknown>;\n\n if (typeof n.id !== 'string' || !n.id) errors.push('id: required, must be a non-empty string');\n\n for (const key of Object.keys(n)) {\n if (!ALLOWED_KEYS.has(key)) errors.push(`Unknown top-level key: \"${key}\"`);\n }\n\n if (n.card_data == null || typeof n.card_data !== 'object' || Array.isArray(n.card_data)) {\n errors.push('card_data: required, must be an object');\n }\n\n if (n.meta != null) {\n if (typeof n.meta !== 'object' || Array.isArray(n.meta)) {\n errors.push('meta: must be an object');\n } else {\n const meta = n.meta as Record<string, unknown>;\n if (meta.title != null && typeof meta.title !== 'string') errors.push('meta.title: must be a string');\n if (meta.tags != null && !Array.isArray(meta.tags)) errors.push('meta.tags: must be an array');\n }\n }\n\n if (n.requires != null && !Array.isArray(n.requires)) errors.push('requires: must be an array of strings');\n\n if (n.provides != null) {\n if (!Array.isArray(n.provides)) {\n errors.push('provides: must be an array of { bindTo, ref } bindings');\n } else {\n (n.provides as unknown[]).forEach((p, i) => {\n if (!p || typeof p !== 'object' || Array.isArray(p)) {\n errors.push(`provides[${i}]: must be an object with bindTo and ref`);\n } else {\n const b = p as Record<string, unknown>;\n if (typeof b.bindTo !== 'string' || !b.bindTo) errors.push(`provides[${i}]: missing required \"bindTo\" string`);\n if (typeof b.ref !== 'string' || !b.ref) errors.push(`provides[${i}]: missing required \"ref\" string`);\n }\n });\n }\n }\n\n // compute — ordered array of { bindTo, expr } steps\n if (n.compute != null) {\n if (!Array.isArray(n.compute)) {\n errors.push('compute: must be an array of compute steps');\n } else {\n (n.compute as unknown[]).forEach((step, i) => {\n if (!step || typeof step !== 'object' || Array.isArray(step)) {\n errors.push(`compute[${i}]: must be a compute step object`);\n } else {\n const s = step as Record<string, unknown>;\n if (typeof s.bindTo !== 'string' || !s.bindTo) errors.push(`compute[${i}]: missing required \"bindTo\" property`);\n if (typeof s.expr !== 'string' || !s.expr) errors.push(`compute[${i}]: missing required \"expr\" string (JSONata expression)`);\n }\n });\n }\n }\n\n if (n.source_defs != null) {\n if (!Array.isArray(n.source_defs)) {\n errors.push('source_defs: must be an array');\n } else {\n const bindTos = new Set<string>();\n const outputFiles = new Set<string>();\n (n.source_defs as unknown[]).forEach((src, i) => {\n if (!src || typeof src !== 'object' || Array.isArray(src)) {\n errors.push(`source_defs[${i}]: must be an object`);\n } else {\n const s = src as Record<string, unknown>;\n if (typeof s.bindTo !== 'string' || !s.bindTo) {\n errors.push(`source_defs[${i}]: missing required \"bindTo\" property`);\n } else {\n if (bindTos.has(s.bindTo)) {\n errors.push(`source_defs[${i}]: bindTo \"${s.bindTo}\" is not unique across source_defs`);\n }\n bindTos.add(s.bindTo);\n }\n if (typeof s.outputFile !== 'string' || !s.outputFile) {\n errors.push(`source_defs[${i}]: missing required \"outputFile\" property`);\n } else {\n if (outputFiles.has(s.outputFile)) {\n errors.push(`source_defs[${i}]: outputFile \"${s.outputFile}\" is not unique across source_defs`);\n }\n outputFiles.add(s.outputFile);\n }\n if (s.optionalForCompletionGating != null && typeof s.optionalForCompletionGating !== 'boolean') {\n errors.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);\n }\n }\n });\n }\n }\n\n if (n.view != null) {\n if (typeof n.view !== 'object' || Array.isArray(n.view)) {\n errors.push('view: must be an object');\n } else {\n const view = n.view as Record<string, unknown>;\n if (!Array.isArray(view.elements) || view.elements.length === 0) {\n errors.push('view.elements: required, must be a non-empty array');\n } else {\n (view.elements as Record<string, unknown>[]).forEach((elem, i) => {\n if (!elem || typeof elem !== 'object') { errors.push(`view.elements[${i}]: must be an object`); return; }\n if (!elem.kind || typeof elem.kind !== 'string') {\n errors.push(`view.elements[${i}].kind: required, must be a string`);\n } else if (!VALID_ELEMENT_KINDS.has(elem.kind as string)) {\n errors.push(`view.elements[${i}].kind: unknown kind \"${elem.kind}\". Valid: ${[...VALID_ELEMENT_KINDS].join(', ')}`);\n }\n if (elem.data != null && (typeof elem.data !== 'object' || Array.isArray(elem.data))) {\n errors.push(`view.elements[${i}].data: must be an object`);\n }\n });\n }\n if (view.layout != null && (typeof view.layout !== 'object' || Array.isArray(view.layout))) errors.push('view.layout: must be an object');\n if (view.features != null && (typeof view.features !== 'object' || Array.isArray(view.features))) errors.push('view.features: must be an object');\n }\n }\n\n return { ok: errors.length === 0, errors };\n}\n\n/**\n * Enrich source_defs with execution context for template interpolation and prompt rendering.\n * Pure function: no side effects, returns new enriched source_defs array.\n * \n * @param source_defs - Array of source definitions\n * @param context - Execution context containing requires, sourcesData, computed_values\n * @returns Promise resolving to a new array of source_defs with _projections attached.\n * Each _projections entry is the evaluated result of the corresponding projections expression.\n */\nasync function enrichSources(\n source_defs: any[] | undefined,\n context: {\n card_data?: Record<string, any>;\n requires?: Record<string, any>;\n sourcesData?: Record<string, any>; // unused post-projections, kept for call-site compat\n computed_values?: Record<string, any>; // unused post-projections, kept for call-site compat\n }\n): Promise<any[]> {\n if (!source_defs || source_defs.length === 0) return [];\n\n const evalCtx = {\n card_data: context.card_data ?? {},\n requires: context.requires ?? {},\n };\n\n return Promise.all(\n source_defs.map(async (src: any) => {\n const _projections: Record<string, unknown> = {};\n if (src.projections && typeof src.projections === 'object' && !Array.isArray(src.projections)) {\n for (const [key, expr] of Object.entries(src.projections as Record<string, string>)) {\n if (typeof expr === 'string' && expr.trim().length > 0) {\n try {\n _projections[key] = await jsonata(expr).evaluate(evalCtx);\n } catch {\n _projections[key] = undefined;\n }\n }\n }\n }\n return { ...src, _projections };\n })\n );\n}\n\nfunction enrichSourcesSync(\n source_defs: any[] | undefined,\n context: {\n card_data?: Record<string, any>;\n requires?: Record<string, any>;\n }\n): any[] {\n if (!source_defs || source_defs.length === 0) return [];\n\n const evalCtx = {\n card_data: context.card_data ?? {},\n requires: context.requires ?? {},\n };\n\n return source_defs.map((src: any) => {\n const _projections: Record<string, unknown> = {};\n if (src.projections && typeof src.projections === 'object' && !Array.isArray(src.projections)) {\n for (const [key, expr] of Object.entries(src.projections as Record<string, string>)) {\n if (typeof expr === 'string' && expr.trim().length > 0) {\n try {\n _projections[key] = jsonataSync(expr).evaluate(evalCtx);\n } catch {\n _projections[key] = undefined;\n }\n }\n }\n }\n return { ...src, _projections };\n });\n}\n\nexport const CardCompute = {\n run,\n runSync,\n eval: evalExpr,\n resolve,\n validate: validateNode,\n enrichSources,\n enrichSourcesSync,\n};\n\nexport {\n validateLiveCard,\n validateLiveCardSchema,\n validateLiveCardRuntimeExpressions,\n validateLiveCardDefinition,\n} from './schema-validator.js';\n\nexport default CardCompute;\n\n","/**\n * Live Cards → Reactive Graph\n *\n * Takes an array of live card JSONs (card / source nodes) and produces\n * a fully wired ReactiveGraph where:\n *\n * - Each card becomes a task in the graph\n * - card.requires → task.requires (upstream card IDs as tokens)\n * - Each card produces a token equal to its own ID\n * - Card-type nodes: handler runs CardCompute.run() on a clone of the card,\n * returns the computed state as data (auto-hashed by the reactive layer)\n * - Source-type nodes: handler uses the source definition to fetch data,\n * or falls back to a user-provided handler / noop\n *\n * The reactive graph auto-computes dataHash on every handler result,\n * so `data-changed` refresh strategy works out of the box.\n *\n * @example\n * ```ts\n * import { liveCardsToReactiveGraph } from 'yaml-flow/continuous-event-graph';\n *\n * const cards = [\n * { id: 'prices', source_defs: [{ kind: 'api', bindTo: 'raw' }], state: {} },\n * { id: 'dashboard', requires: ['prices'], state: {}, compute: [{ bindTo: 'total', fn: 'sum', ... }], view: { ... } },\n * ];\n *\n * const rg = liveCardsToReactiveGraph(cards, {\n * sourceHandlers: {\n * prices: async () => ({ data: { raw: await fetchPrices() } }),\n * },\n * });\n *\n * // One push → the whole board computes itself\n * rg.push({ type: 'inject-tokens', tokens: [], timestamp: new Date().toISOString() });\n * ```\n */\n\nimport type { GraphConfig, TaskConfig } from '../event-graph/types.js';\nimport type { ReactiveGraph, ReactiveGraphOptions, TaskHandlerFn, TaskHandlerInput, TaskHandlerReturn } from './reactive.js';\nimport { createReactiveGraph } from './reactive.js';\nimport { CardCompute } from '../card-compute/index.js';\nimport type { ComputeNode } from '../card-compute/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal live card shape accepted by this utility.\n * Unified card — no type field. Behavior from sections present.\n */\n/** A provides binding: maps a token name to a source path in the card's data namespace. */\nexport interface ProvidesBinding {\n bindTo: string;\n ref: string;\n}\n\nexport interface LiveCard {\n id: string;\n requires?: string[];\n provides?: ProvidesBinding[];\n meta?: { title?: string; tags?: string[] };\n card_data?: Record<string, unknown>;\n compute?: { bindTo: string; fn: string; [key: string]: unknown }[];\n source_defs?: {\n cli?: string;\n bindTo: string;\n outputFile: string;\n kind?: 'api' | 'websocket' | 'static' | 'llm';\n [key: string]: unknown;\n }[];\n optionalSources?: {\n cli?: string;\n bindTo: string;\n outputFile: string;\n kind?: 'api' | 'websocket' | 'static' | 'llm';\n [key: string]: unknown;\n }[];\n view?: Record<string, unknown>;\n}\n\n/**\n * A Board is a named container of live card nodes.\n * Matches the shape used by LiveCard.Board() in browser/live-cards.js:\n * LiveCard.Board(engine, el, { nodes, positions?, mode, canvas, ... })\n *\n * The `nodes` array contains the card/source JSON objects.\n * Board-level metadata (id, title, settings) is carried through to the\n * generated GraphConfig.\n */\nexport interface LiveBoard {\n /** Board identifier */\n id?: string;\n /** Human-readable title */\n title?: string;\n /** The card/source nodes on this board */\n nodes: LiveCard[];\n /** Board display mode (informational — not used by the reactive graph) */\n mode?: 'board' | 'canvas';\n /** Canvas positions keyed by node ID (informational — not used) */\n positions?: Record<string, { x?: number; y?: number; w?: number; h?: number }>;\n /** Board-level settings forwarded to GraphConfig.settings */\n settings?: Partial<GraphConfig['settings']>;\n}\n\nexport interface LiveCardsToReactiveOptions {\n /** Custom handlers for source nodes (keyed by card ID). */\n sourceHandlers?: Record<string, TaskHandlerFn>;\n /**\n * Default handler factory for source nodes without an explicit handler.\n * Called once per source card during graph construction.\n * If not provided, source nodes without explicit handlers get a noop handler\n * that returns the card's current state.\n */\n defaultSourceHandler?: (card: LiveCard) => TaskHandlerFn;\n /**\n * Custom handlers for card nodes (keyed by card ID).\n * Overrides the default CardCompute.run() behavior.\n */\n cardHandlers?: Record<string, TaskHandlerFn>;\n /**\n * If provided, upstream card state is injected into downstream cards\n * before running compute. The key is the upstream card ID and the value\n * is the upstream card's latest state.\n */\n sharedState?: Map<string, Record<string, unknown>>;\n /** Override reactive graph options (journal, callbacks, etc.) */\n reactiveOptions?: Partial<Omit<ReactiveGraphOptions, 'handlers'>>;\n /** Graph-level settings overrides */\n graphSettings?: Partial<GraphConfig['settings']>;\n /** Execution ID for the reactive graph */\n executionId?: string;\n}\n\nexport interface LiveCardsToReactiveResult {\n /** The fully wired reactive graph — ready to push events into. */\n graph: ReactiveGraph;\n /** The generated GraphConfig (for inspection/serialization). */\n config: GraphConfig;\n /** The handler map (for use with validateReactiveGraph). */\n handlers: Record<string, TaskHandlerFn>;\n /** Card lookup by ID (original references). */\n cards: Map<string, LiveCard>;\n /**\n * Shared state map: cardId → latest computed state.\n * Updated automatically by built-in handlers after each task completes.\n * Custom cardHandlers/sourceHandlers can also read upstream data directly\n * from the engine: graph.getState().state.tasks[cardId].data\n */\n sharedState: Map<string, Record<string, unknown>>;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Convert live card JSONs or a Board into a fully wired ReactiveGraph.\n *\n * Overloads:\n * liveCardsToReactiveGraph(cards[], options?) — from a flat array of cards\n * liveCardsToReactiveGraph(board, options?) — from a LiveBoard object\n */\nexport function liveCardsToReactiveGraph(\n input: LiveCard[] | LiveBoard,\n options?: LiveCardsToReactiveOptions,\n): LiveCardsToReactiveResult;\nexport function liveCardsToReactiveGraph(\n input: LiveCard[] | LiveBoard,\n options: LiveCardsToReactiveOptions = {},\n): LiveCardsToReactiveResult {\n // Detect Board vs cards array\n let cards: LiveCard[];\n let boardSettings: Partial<GraphConfig['settings']> = {};\n let boardId: string | undefined;\n\n if (!Array.isArray(input) && 'nodes' in input) {\n // It's a LiveBoard\n const board = input as LiveBoard;\n cards = board.nodes;\n boardId = board.id;\n boardSettings = board.settings ?? {};\n } else {\n cards = input as LiveCard[];\n }\n\n const {\n sourceHandlers = {},\n defaultSourceHandler,\n cardHandlers = {},\n reactiveOptions = {},\n graphSettings = {},\n executionId,\n } = options;\n\n // Card lookup\n const cardMap = new Map<string, LiveCard>();\n for (const card of cards) {\n if (cardMap.has(card.id)) {\n throw new Error(`Duplicate card ID: \"${card.id}\"`);\n }\n cardMap.set(card.id, card);\n }\n\n // Shared state: stores latest computed state per card for cross-card data flow\n const sharedState = options.sharedState ?? new Map<string, Record<string, unknown>>();\n\n // Build GraphConfig\n const tasks: Record<string, TaskConfig> = {};\n\n // Collect all provided tokens for validation + build token→cardId map\n const allTokens = new Set<string>();\n const tokenToCardId = new Map<string, string>();\n for (const card of cards) {\n for (const binding of (card.provides ?? [{ bindTo: card.id, ref: 'card_data' }])) {\n allTokens.add(binding.bindTo);\n tokenToCardId.set(binding.bindTo, card.id);\n }\n }\n\n for (const card of cards) {\n const requires = card.requires ?? [];\n\n // Validate requires reference provided tokens\n for (const req of requires) {\n if (!allTokens.has(req)) {\n throw new Error(`Card \"${card.id}\" requires \"${req}\" but no card provides that token`);\n }\n }\n\n tasks[card.id] = {\n requires: requires.length > 0 ? requires : undefined,\n provides: (card.provides ?? [{ bindTo: card.id, ref: 'card_data' }]).map(p => p.bindTo),\n taskHandlers: [card.id],\n description: card.meta?.title ?? card.id,\n };\n }\n\n const config: GraphConfig = {\n id: boardId ?? `live-cards-${Date.now()}`,\n settings: {\n completion: 'manual',\n execution_mode: 'eligibility-mode',\n ...boardSettings,\n ...graphSettings,\n },\n tasks,\n };\n\n // Build handlers\n const handlers: Record<string, TaskHandlerFn> = {};\n\n // Create a lazy resolveCallback reference — graph doesn't exist yet\n let graphRef: ReactiveGraph | null = null;\n const getResolve = () => (token: string, data: Record<string, unknown>, errors?: string[]) => {\n graphRef!.resolveCallback(token, data, errors);\n };\n\n for (const card of cards) {\n if (card.source_defs && card.source_defs.length > 0) {\n handlers[card.id] = buildSourceHandler(card, sourceHandlers, defaultSourceHandler, sharedState, getResolve);\n } else {\n handlers[card.id] = buildCardHandler(card, cardHandlers, sharedState, cardMap, tokenToCardId, getResolve);\n }\n }\n\n // Create reactive graph\n const graph = createReactiveGraph(\n config,\n {\n ...reactiveOptions,\n handlers,\n },\n executionId,\n );\n graphRef = graph;\n\n return { graph, config, handlers, cards: cardMap, sharedState };\n}\n\n// ============================================================================\n// Handler builders\n// ============================================================================\n\nfunction buildSourceHandler(\n card: LiveCard,\n sourceHandlers: Record<string, TaskHandlerFn>,\n defaultSourceHandler: ((card: LiveCard) => TaskHandlerFn) | undefined,\n sharedState: Map<string, Record<string, unknown>>,\n getResolve: () => (token: string, data: Record<string, unknown>, errors?: string[]) => void,\n): TaskHandlerFn {\n // Explicit handler takes priority\n if (sourceHandlers[card.id]) {\n const userHandler = sourceHandlers[card.id];\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n // Wrap: fire user handler logic in background, resolve with data\n // User handler is already a TaskHandlerFn — it calls resolveCallback itself\n return userHandler(input);\n };\n }\n\n // User-provided factory\n if (defaultSourceHandler) {\n const factoryHandler = defaultSourceHandler(card);\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n return factoryHandler(input);\n };\n }\n\n // Default: return current card data (for static source_defs or pre-populated data)\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const data = { ...card.card_data };\n sharedState.set(card.id, data);\n getResolve()(input.callbackToken, data);\n return 'task-initiated';\n };\n}\n\nfunction buildCardHandler(\n card: LiveCard,\n cardHandlers: Record<string, TaskHandlerFn>,\n sharedState: Map<string, Record<string, unknown>>,\n _cardMap: Map<string, LiveCard>,\n tokenToCardId: Map<string, string>,\n getResolve: () => (token: string, data: Record<string, unknown>, errors?: string[]) => void,\n): TaskHandlerFn {\n // Explicit handler override\n if (cardHandlers[card.id]) {\n const userHandler = cardHandlers[card.id];\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n return userHandler(input);\n };\n }\n\n // Default: inject upstream data → run CardCompute → return computed values\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n // Clone the card's data to avoid mutating the original\n const requiresData: Record<string, unknown> = {};\n const requires = card.requires ?? [];\n for (const token of requires) {\n // Resolve token to the card that provides it\n const producerId = tokenToCardId.get(token) ?? token;\n const upstreamState = sharedState.get(producerId);\n if (upstreamState) {\n requiresData[token] = upstreamState[token] ?? upstreamState;\n }\n }\n\n const computeNode: ComputeNode = {\n id: card.id,\n card_data: { ...card.card_data },\n requires: requiresData,\n compute: card.compute as ComputeNode['compute'],\n };\n\n // Run compute expressions → writes to ephemeral computed_values\n await CardCompute.run(computeNode);\n\n // Build result: if card has explicit provides bindings, resolve each src path.\n // Otherwise spread full card_data + computed_values as data.\n let resultData: Record<string, unknown>;\n if (card.provides && card.provides.length > 0) {\n resultData = {};\n for (const { bindTo, ref } of card.provides) {\n resultData[bindTo] = CardCompute.resolve(computeNode, ref);\n }\n } else {\n resultData = { ...computeNode.card_data, ...computeNode.computed_values };\n }\n\n // Also update sharedState for downstream cards that read via requiresData\n const resultState = { ...computeNode.card_data, ...computeNode.computed_values };\n sharedState.set(card.id, resultState);\n\n getResolve()(input.callbackToken, resultData);\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n"]}
1
+ {"version":3,"sources":["../../src/event-graph/constants.ts","../../src/event-graph/graph-helpers.ts","../../src/event-graph/task-transitions.ts","../../src/continuous-event-graph/core.ts","../../src/continuous-event-graph/schedule.ts","../../src/continuous-event-graph/inspect.ts","../../src/continuous-event-graph/journal.ts","../../src/continuous-event-graph/reactive.ts","../../src/continuous-event-graph/validate.ts","../../src/continuous-event-graph/mutate.ts","../../src/continuous-event-graph/handlers.ts","../../src/card-compute/schema-validator.ts","../../src/card-compute/index.ts","../../src/continuous-event-graph/live-cards-bridge.ts"],"names":["TASK_STATUS","getProvides","task","getRequires","getAllTasks","graph","isNonActiveTask","taskState","getRefreshStrategy","taskConfig","graphSettings","getMaxExecutions","computeAvailableOutputs","taskStates","outputs","taskName","output","groupTasksByProvides","candidateTaskNames","tasks","outputGroups","applyTaskStart","state","existingTask","createDefaultGraphEngineStore","startConsumedHashes","requires","token","otherName","otherConfig","otherState","updatedTask","applyTaskCompletion","result","dataHash","data","outputTokens","lastConsumedHashes","newOutputs","applyTaskFailure","error","retryCount","breakTokens","applyTaskProgress","message","progress","applyTaskRestart","createLiveGraph","config","executionId","id","applyEvent","live","event","applyAgentAction","addNode","removeNode","addRequires","removeRequires","addProvides","removeProvides","applyEvents","events","current","name","exists","_removedConfig","remainingTasks","_removedState","remainingStates","nodeName","tokens","toAdd","t","remaining","injectTokens","drainTokens","toRemove","resetNode","disableNode","enableNode","getNode","snapshot","restore","snap","action","now","schedule","graphTasks","producerMap","buildProducerMap","computedOutputs","availableOutputs","eligible","pending","unresolved","blocked","strategy","rerunnable","maxExec","shouldSkip","req","consumed","interval","completedAt","missingTokens","pendingTokens","failedTokenInfo","producers","p","f","conflicts","outputKey","groupTasks","map","inspect","taskNames","running","completed","failed","waiting","notStarted","disabled","ts","openDeps","unresolvedCount","blockedCount","hasOpen","hasBlocked","ps","conflictTokens","deps","buildTaskDeps","cycles","detectCycles","producer","color","parent","dfs","node","dep","cycle","cur","getUnreachableTokens","available","tc","allRequired","unreachable","unreachableNodes","changed","isNonActive","hasUnreachableDep","allProducersUnreachable","reason","getUnreachableNodes","unreachableTokens","unreachableTokenSet","nodes","getUpstream","visited","tokenSet","nodeEntries","walk","getDownstream","consumerMap","consumers","consumer","MemoryJournal","computeDataHash","json","stableStringify","fnv1a64Hex","value","obj","k","input","hash","prime","mod","i","base64UrlEncode","bytes","binary","b","base64UrlDecode","base64","padded","encodeCallbackToken","payload","decodeCallbackToken","createReactiveGraph","configOrLive","options","initialHandlers","onDrain","inputQueue","disposed","pendingHandlers","handlers","internalJournal","draining","drainQueued","drain","drainOnce","internalEvents","inputEvents","dispatchTask","update","callbackToken","runPipeline","resolveUpstreamState","tokenToTask","cfg","producerTask","handlerNames","upstreamState","handlerName","handler","errors","decoded","fn","validateLiveGraph","issues","expectedOutputs","actualOutputs","allProducible","buildResult","validateReactiveGraph","referencedHandlers","taskHandlers","h","liveResult","warnings","mutateGraph","mutations","mutation","applySingleMutation","createCallbackHandler","getResolve","err","createFireAndForgetHandler","createShellHandler","commandTemplate","cwd","env","timeoutMs","exitCodeMap","captureOutput","nodeId","command","exec","stdout","stderr","exitCode","createProcessHandler","argsTemplate","args","a","execFile","detectRuntime","scriptPath","createScriptHandler","runtime","resolvedRuntime","createWebhookHandler","urlTemplate","method","headers","failOnNon2xx","url","body","controller","timer","response","text","createNoopHandler","staticData","_require","createRequire","jsonata","jsonataSync","deepGet","path","parts","deepSet","run","_requires","ctx","step","val","runSync","_requires2","msg","evalExpr","expr","vars","resolve","VALID_ELEMENT_KINDS","ALLOWED_KEYS","validateNode","n","key","meta","s","bindTos","outputFiles","src","view","elem","enrichSources","source_defs","context","evalCtx","_projections","enrichSourcesSync","CardCompute","liveCardsToReactiveGraph","cards","boardSettings","boardId","board","sourceHandlers","defaultSourceHandler","cardHandlers","reactiveOptions","cardMap","card","sharedState","allTokens","tokenToCardId","binding","graphRef","buildSourceHandler","buildCardHandler","userHandler","factoryHandler","_cardMap","requiresData","producerId","computeNode","resultData","bindTo","ref","resultState"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Event Graph — Constants\n */\n\nimport type { CompletionStrategy, ConflictStrategy, ExecutionMode, ExecutionStatus, TaskStatus } from './types.js';\n\nexport const TASK_STATUS: Record<string, TaskStatus> = {\n NOT_STARTED: 'not-started',\n RUNNING: 'running',\n COMPLETED: 'completed',\n FAILED: 'failed',\n INACTIVATED: 'inactivated',\n} as const;\n\nexport const EXECUTION_STATUS: Record<string, ExecutionStatus> = {\n CREATED: 'created',\n RUNNING: 'running',\n PAUSED: 'paused',\n STOPPED: 'stopped',\n COMPLETED: 'completed',\n FAILED: 'failed',\n} as const;\n\nexport const COMPLETION_STRATEGIES: Record<string, CompletionStrategy> = {\n ALL_TASKS_DONE: 'all-tasks-done',\n ALL_OUTPUTS_DONE: 'all-outputs-done',\n ONLY_RESOLVED: 'only-resolved',\n GOAL_REACHED: 'goal-reached',\n MANUAL: 'manual',\n} as const;\n\nexport const EXECUTION_MODES: Record<string, ExecutionMode> = {\n DEPENDENCY_MODE: 'dependency-mode',\n ELIGIBILITY_MODE: 'eligibility-mode',\n} as const;\n\nexport const CONFLICT_STRATEGIES: Record<string, ConflictStrategy> = {\n ALPHABETICAL: 'alphabetical',\n PRIORITY_FIRST: 'priority-first',\n DURATION_FIRST: 'duration-first',\n COST_OPTIMIZED: 'cost-optimized',\n RESOURCE_AWARE: 'resource-aware',\n RANDOM_SELECT: 'random-select',\n USER_CHOICE: 'user-choice',\n PARALLEL_ALL: 'parallel-all',\n SKIP_CONFLICTS: 'skip-conflicts',\n ROUND_ROBIN: 'round-robin',\n} as const;\n\nexport const DEFAULTS = {\n EXECUTION_MODE: 'eligibility-mode' as ExecutionMode,\n CONFLICT_STRATEGY: 'alphabetical' as ConflictStrategy,\n COMPLETION_STRATEGY: 'all-outputs-done' as CompletionStrategy,\n MAX_ITERATIONS: 1000,\n} as const;\n","/**\n * Event Graph — Graph Helpers\n *\n * Pure functions for manipulating the requires/provides task dependency graph.\n * No I/O, no side effects.\n */\n\nimport type { GraphConfig, TaskConfig, GraphEngineStore, ExecutionState, RefreshStrategy } from './types.js';\nimport { TASK_STATUS } from './constants.js';\n\n// ============================================================================\n// Accessors — normalize requires/provides to always be arrays\n// ============================================================================\n\nexport function getProvides(task: TaskConfig | undefined): string[] {\n if (!task) return [];\n if (Array.isArray(task.provides)) return task.provides;\n return [];\n}\n\nexport function getRequires(task: TaskConfig | undefined): string[] {\n if (!task) return [];\n if (Array.isArray(task.requires)) return task.requires;\n return [];\n}\n\nexport function getAllTasks(graph: GraphConfig): Record<string, TaskConfig> {\n return graph.tasks ?? {};\n}\n\nexport function getTask(graph: GraphConfig, taskName: string): TaskConfig | undefined {\n return graph.tasks[taskName];\n}\n\nexport function hasTask(graph: GraphConfig, taskName: string): boolean {\n return taskName in graph.tasks;\n}\n\n// ============================================================================\n// Task State Predicates\n// ============================================================================\n\nexport function isNonActiveTask(taskState: GraphEngineStore | undefined): boolean {\n if (!taskState) return false;\n return taskState.status === TASK_STATUS.FAILED || taskState.status === TASK_STATUS.INACTIVATED;\n}\n\nexport function isTaskCompleted(taskState: GraphEngineStore | undefined): boolean {\n return taskState?.status === TASK_STATUS.COMPLETED;\n}\n\nexport function isTaskRunning(taskState: GraphEngineStore | undefined): boolean {\n return taskState?.status === TASK_STATUS.RUNNING;\n}\n\nexport function getRefreshStrategy(taskConfig: TaskConfig, graphSettings?: { refreshStrategy?: RefreshStrategy }): RefreshStrategy {\n return taskConfig.refreshStrategy ?? graphSettings?.refreshStrategy ?? 'data-changed';\n}\n\nexport function isRerunnable(taskConfig: TaskConfig, graphSettings?: { refreshStrategy?: RefreshStrategy }): boolean {\n return getRefreshStrategy(taskConfig, graphSettings) !== 'once';\n}\n\nexport function getMaxExecutions(taskConfig: TaskConfig): number | undefined {\n return taskConfig.maxExecutions;\n}\n\n// ============================================================================\n// Available Outputs Computation\n// ============================================================================\n\n/**\n * Dynamically compute available outputs from all completed tasks.\n * Tasks with strategies other than 'once' may have completed and reset.\n * Pure function.\n */\nexport function computeAvailableOutputs(\n graph: GraphConfig,\n taskStates: Record<string, GraphEngineStore>\n): string[] {\n const outputs: Set<string> = new Set();\n\n for (const [taskName, taskState] of Object.entries(taskStates)) {\n if (taskState.status === TASK_STATUS.COMPLETED) {\n const taskConfig = graph.tasks[taskName];\n if (taskConfig) {\n const provides = getProvides(taskConfig);\n provides.forEach(output => outputs.add(output));\n }\n }\n }\n\n return Array.from(outputs);\n}\n\n// ============================================================================\n// Conflict Detection\n// ============================================================================\n\n/**\n * Group candidate tasks by the outputs they provide.\n * Used to detect conflicts (multiple tasks providing the same output).\n */\nexport function groupTasksByProvides(\n candidateTaskNames: string[],\n tasks: Record<string, TaskConfig>\n): Record<string, string[]> {\n const outputGroups: Record<string, string[]> = {};\n\n candidateTaskNames.forEach(taskName => {\n const task = tasks[taskName];\n if (!task) return;\n const provides = getProvides(task);\n provides.forEach(output => {\n if (!outputGroups[output]) {\n outputGroups[output] = [];\n }\n outputGroups[output].push(taskName);\n });\n });\n\n return outputGroups;\n}\n\n/**\n * Check if a task's outputs conflict with other candidates.\n */\nexport function hasOutputConflict(\n taskName: string,\n taskProvides: string[],\n candidates: string[],\n tasks: Record<string, TaskConfig>\n): boolean {\n for (const otherName of candidates) {\n if (otherName === taskName) continue;\n const otherProvides = getProvides(tasks[otherName]);\n const overlapping = taskProvides.some(output => otherProvides.includes(output));\n if (overlapping) return true;\n }\n return false;\n}\n\n// ============================================================================\n// Immutable Graph Mutation\n// ============================================================================\n\nexport function addKeyToProvides(task: TaskConfig, key: string): TaskConfig {\n const current = getProvides(task);\n if (current.includes(key)) return task;\n return { ...task, provides: [...current, key] };\n}\n\nexport function removeKeyFromProvides(task: TaskConfig, key: string): TaskConfig {\n const current = getProvides(task);\n return { ...task, provides: current.filter(p => p !== key) };\n}\n\nexport function addKeyToRequires(task: TaskConfig, key: string): TaskConfig {\n const current = getRequires(task);\n if (current.includes(key)) return task;\n return { ...task, requires: [...current, key] };\n}\n\nexport function removeKeyFromRequires(task: TaskConfig, key: string): TaskConfig {\n const current = getRequires(task);\n return { ...task, requires: current.filter(r => r !== key) };\n}\n\n// ============================================================================\n// Dynamic Task Management\n// ============================================================================\n\n/**\n * Add a new task to a graph config. Returns a new GraphConfig (immutable).\n */\nexport function addDynamicTask(\n graph: GraphConfig,\n taskName: string,\n taskConfig: TaskConfig\n): GraphConfig {\n return {\n ...graph,\n tasks: {\n ...graph.tasks,\n [taskName]: taskConfig,\n },\n };\n}\n\n/**\n * Create default task state for a new task.\n */\nexport function createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n\n/**\n * Create the initial execution state for a graph.\n */\nexport function createInitialExecutionState(\n graph: GraphConfig,\n executionId: string\n): ExecutionState {\n const tasks: Record<string, GraphEngineStore> = {};\n for (const taskName of Object.keys(graph.tasks)) {\n tasks[taskName] = createDefaultGraphEngineStore();\n }\n\n return {\n status: 'running',\n tasks,\n availableOutputs: [],\n stuckDetection: { is_stuck: false, stuck_description: null, outputs_unresolvable: [], tasks_blocked: [] },\n lastUpdated: new Date().toISOString(),\n executionId,\n executionConfig: {\n executionMode: graph.settings.execution_mode ?? 'eligibility-mode',\n conflictStrategy: graph.settings.conflict_strategy ?? 'alphabetical',\n completionStrategy: graph.settings.completion,\n },\n };\n}\n","/**\n * Event Graph — Task State Transitions\n *\n * Pure functions for applying task lifecycle events to execution state.\n * Each function: f(state, ...) → newState\n */\n\nimport type { ExecutionState, GraphEngineStore, GraphConfig } from './types.js';\nimport { getProvides, getRequires } from './graph-helpers.js';\n\n/**\n * Apply task start to execution state. Pure function.\n */\nexport function applyTaskStart(state: ExecutionState, taskName: string, graph?: GraphConfig): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n\n // Snapshot upstream hashes at start time so that if an upstream task\n // completes while this task is running, applyTaskCompletion can detect\n // the mid-flight change and not absorb it into lastConsumedHashes.\n const startConsumedHashes: Record<string, string> = {};\n if (graph) {\n const taskConfig = graph.tasks[taskName];\n const requires = getRequires(taskConfig);\n for (const token of requires) {\n for (const [otherName, otherConfig] of Object.entries(graph.tasks)) {\n if (getProvides(otherConfig).includes(token)) {\n const otherState = state.tasks[otherName];\n if (otherState?.lastDataHash) startConsumedHashes[token] = otherState.lastDataHash;\n break;\n }\n }\n }\n }\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'running',\n startedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n progress: 0,\n error: undefined,\n startConsumedHashes,\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task completion to execution state.\n * Handles: default provides, conditional provides (on), refresh strategy, data hash tracking.\n * Pure function.\n */\nexport function applyTaskCompletion(\n state: ExecutionState,\n graph: GraphConfig,\n taskName: string,\n result?: string,\n dataHash?: string,\n data?: Record<string, unknown>\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n const taskConfig = graph.tasks[taskName];\n if (!taskConfig) {\n throw new Error(`Task \"${taskName}\" not found in graph`);\n }\n\n // Determine which outputs to produce\n let outputTokens: string[];\n if (result && taskConfig.on && taskConfig.on[result]) {\n // Conditional routing — use the on[result] provides\n outputTokens = taskConfig.on[result];\n } else {\n // Default provides\n outputTokens = getProvides(taskConfig);\n }\n\n // Use hashes snapshotted at task-start time as lastConsumedHashes.\n // This ensures that if an upstream task completed while this task was\n // running (mid-flight change), the old hash is preserved in\n // lastConsumedHashes → data-changed detects the difference on the\n // next schedule pass and re-runs this task.\n // Fall back to reading current upstream state only when startConsumedHashes\n // is absent (e.g. restored from an older snapshot without the field).\n const lastConsumedHashes: Record<string, string> = existingTask.startConsumedHashes\n ? { ...existingTask.startConsumedHashes }\n : { ...existingTask.lastConsumedHashes };\n\n if (!existingTask.startConsumedHashes) {\n // Legacy fallback: populate from current upstream state\n const requires = taskConfig.requires ?? [];\n for (const token of requires) {\n for (const [otherName, otherConfig] of Object.entries(graph.tasks)) {\n if (getProvides(otherConfig).includes(token)) {\n const otherState = state.tasks[otherName];\n if (otherState?.lastDataHash) {\n lastConsumedHashes[token] = otherState.lastDataHash;\n }\n break;\n }\n }\n }\n }\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'completed',\n completedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n executionCount: existingTask.executionCount + 1,\n lastEpoch: existingTask.executionCount + 1,\n lastDataHash: dataHash,\n data,\n lastConsumedHashes,\n error: undefined,\n };\n\n // Merge new outputs with existing available outputs\n const newOutputs = [...new Set([...state.availableOutputs, ...outputTokens])];\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n availableOutputs: newOutputs,\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task failure to execution state.\n * Handles: retry logic, on_failure token injection, circuit breaker.\n * Pure function.\n */\nexport function applyTaskFailure(\n state: ExecutionState,\n graph: GraphConfig,\n taskName: string,\n error: string\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n const taskConfig = graph.tasks[taskName];\n\n // Check retry\n if (taskConfig?.retry) {\n const retryCount = existingTask.retryCount + 1;\n if (retryCount <= taskConfig.retry.max_attempts) {\n // Retry — set back to not-started with incremented retry count\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'not-started',\n retryCount,\n lastUpdated: new Date().toISOString(),\n error,\n };\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n }\n }\n\n // No more retries — mark as failed\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'failed',\n failedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n error,\n executionCount: existingTask.executionCount + 1,\n };\n\n // Inject failure tokens if configured\n let newOutputs = state.availableOutputs;\n if (taskConfig?.on_failure && taskConfig.on_failure.length > 0) {\n newOutputs = [...new Set([...state.availableOutputs, ...taskConfig.on_failure])];\n }\n\n // Check circuit breaker\n if (taskConfig?.circuit_breaker && updatedTask.executionCount >= taskConfig.circuit_breaker.max_executions) {\n const breakTokens = taskConfig.circuit_breaker.on_break;\n newOutputs = [...new Set([...newOutputs, ...breakTokens])];\n }\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n availableOutputs: newOutputs,\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task progress update. Pure function.\n */\nexport function applyTaskProgress(\n state: ExecutionState,\n taskName: string,\n message?: string,\n progress?: number\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n progress: typeof progress === 'number' ? progress : existingTask.progress,\n messages: [\n ...(existingTask.messages ?? []),\n ...(message ? [{ message, timestamp: new Date().toISOString(), status: existingTask.status }] : []),\n ],\n lastUpdated: new Date().toISOString(),\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task restart to execution state.\n * Resets the task to not-started, preserving executionCount and lastEpoch\n * (history). Clears data, error, progress. The task becomes eligible for\n * scheduling again on the next drain cycle.\n * Pure function.\n */\nexport function applyTaskRestart(\n state: ExecutionState,\n taskName: string,\n): ExecutionState {\n const existingTask = state.tasks[taskName];\n if (!existingTask) return state;\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'not-started',\n startedAt: undefined,\n completedAt: undefined,\n failedAt: undefined,\n error: undefined,\n data: undefined,\n progress: null,\n lastUpdated: new Date().toISOString(),\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\nfunction createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n","/**\n * Continuous Event Graph — Core\n *\n * All functions are pure: f(LiveGraph, input) → LiveGraph\n *\n * - createLiveGraph: bootstrap from a GraphConfig\n * - applyEvent: reduce an event (task-started, task-completed, etc.)\n * - addNode / removeNode: structural graph mutations\n * - addRequires / removeRequires / addProvides / removeProvides: wiring mutations\n */\n\nimport type { GraphConfig, TaskConfig, GraphEvent, LiveGraph, NodeInfo, LiveGraphSnapshot } from './types.js';\nimport type { ExecutionState, GraphEngineStore } from '../event-graph/types.js';\nimport { getProvides, getRequires } from '../event-graph/graph-helpers.js';\nimport {\n applyTaskStart,\n applyTaskCompletion,\n applyTaskFailure,\n applyTaskProgress,\n applyTaskRestart,\n} from '../event-graph/task-transitions.js';\n\n// ============================================================================\n// Create\n// ============================================================================\n\n/**\n * Create a LiveGraph from a GraphConfig.\n * Initialises execution state for all tasks in the config.\n */\nexport function createLiveGraph(config: GraphConfig, executionId?: string): LiveGraph {\n const id = executionId ?? `live-${Date.now()}`;\n const tasks: Record<string, GraphEngineStore> = {};\n\n for (const taskName of Object.keys(config.tasks)) {\n tasks[taskName] = createDefaultGraphEngineStore();\n }\n\n const state: ExecutionState = {\n status: 'running',\n tasks,\n availableOutputs: [],\n stuckDetection: { is_stuck: false, stuck_description: null, outputs_unresolvable: [], tasks_blocked: [] },\n lastUpdated: new Date().toISOString(),\n executionId: id,\n executionConfig: {\n executionMode: config.settings.execution_mode ?? 'eligibility-mode',\n conflictStrategy: config.settings.conflict_strategy ?? 'alphabetical',\n completionStrategy: config.settings.completion,\n },\n };\n\n return { config, state };\n}\n\n// ============================================================================\n// Event Reducer\n// ============================================================================\n\n/**\n * Apply an event to the LiveGraph, producing a new LiveGraph.\n * Events are the shared vocabulary — both execution state transitions\n * (task-started, task-completed, etc.) and structural mutations\n * (task-upsert, task-removal, node-requires-add, etc.).\n *\n * Pure function: f(LiveGraph, GraphEvent) → LiveGraph\n */\nexport function applyEvent(live: LiveGraph, event: GraphEvent): LiveGraph {\n const { config, state } = live;\n\n // Ghost event filtering\n if ('executionId' in event && event.executionId && event.executionId !== state.executionId) {\n return live;\n }\n\n switch (event.type) {\n // --- Execution state transitions ---\n\n case 'task-started':\n return { config, state: applyTaskStart(state, event.taskName, config) };\n\n case 'task-completed':\n return { config, state: applyTaskCompletion(state, config, event.taskName, event.result, event.dataHash, event.data) };\n\n case 'task-failed':\n return { config, state: applyTaskFailure(state, config, event.taskName, event.error) };\n\n case 'task-progress':\n return { config, state: applyTaskProgress(state, event.taskName, event.message, event.progress) };\n\n case 'task-restart':\n return { config, state: applyTaskRestart(state, event.taskName) };\n\n case 'inject-tokens':\n return {\n config,\n state: {\n ...state,\n availableOutputs: [...new Set([...state.availableOutputs, ...event.tokens])],\n lastUpdated: new Date().toISOString(),\n },\n };\n\n case 'agent-action':\n return { config, state: applyAgentAction(state, event.action) };\n\n // --- Structural mutations ---\n\n case 'task-upsert':\n return addNode(live, event.taskName, event.taskConfig);\n\n case 'task-removal':\n return removeNode(live, event.taskName);\n\n case 'node-requires-add':\n return addRequires(live, event.nodeName, event.tokens);\n\n case 'node-requires-remove':\n return removeRequires(live, event.nodeName, event.tokens);\n\n case 'node-provides-add':\n return addProvides(live, event.nodeName, event.tokens);\n\n case 'node-provides-remove':\n return removeProvides(live, event.nodeName, event.tokens);\n\n default:\n return live;\n }\n}\n\n/**\n * Apply multiple events atomically to a LiveGraph.\n * Events are reduced sequentially, but the caller only sees the final state.\n * Use this for batch processing (e.g. draining a journal of pending events).\n */\nexport function applyEvents(live: LiveGraph, events: GraphEvent[]): LiveGraph {\n return events.reduce((current, event) => applyEvent(current, event), live);\n}\n\n// ============================================================================\n// Graph Mutations — node-level\n// ============================================================================\n\n/**\n * Upsert a node (task) in the live graph. Updates both config and state atomically.\n * If the node already exists, replaces its config but preserves its state.\n * If new, creates fresh default state.\n */\nexport function addNode(live: LiveGraph, name: string, taskConfig: TaskConfig): LiveGraph {\n const exists = !!live.config.tasks[name];\n return {\n config: {\n ...live.config,\n tasks: { ...live.config.tasks, [name]: taskConfig },\n },\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: exists ? live.state.tasks[name] : createDefaultGraphEngineStore(),\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Remove a node (task) from the live graph. Updates both config and state atomically.\n * If the node doesn't exist, returns the graph unchanged.\n * NOTE: Does not clean up references — other nodes' requires/provides are left intact.\n * The caller can use removeRequires() to clean up if needed.\n */\nexport function removeNode(live: LiveGraph, name: string): LiveGraph {\n if (!live.config.tasks[name]) return live;\n\n const { [name]: _removedConfig, ...remainingTasks } = live.config.tasks;\n const { [name]: _removedState, ...remainingStates } = live.state.tasks;\n\n return {\n config: {\n ...live.config,\n tasks: remainingTasks,\n },\n state: {\n ...live.state,\n tasks: remainingStates,\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Graph Mutations — wiring\n// ============================================================================\n\n/**\n * Add requires tokens to a node. If the node doesn't exist, returns unchanged.\n * Deduplicates — won't add tokens already in requires.\n */\nexport function addRequires(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getRequires(task);\n const toAdd = tokens.filter(t => !current.includes(t));\n if (toAdd.length === 0) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, requires: [...current, ...toAdd] },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Remove requires tokens from a node. If the node doesn't exist, returns unchanged.\n */\nexport function removeRequires(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getRequires(task);\n const remaining = current.filter(t => !tokens.includes(t));\n if (remaining.length === current.length) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, requires: remaining },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Add provides tokens to a node. If the node doesn't exist, returns unchanged.\n * Deduplicates — won't add tokens already in provides.\n */\nexport function addProvides(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getProvides(task);\n const toAdd = tokens.filter(t => !current.includes(t));\n if (toAdd.length === 0) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, provides: [...current, ...toAdd] },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Remove provides tokens from a node. If the node doesn't exist, returns unchanged.\n */\nexport function removeProvides(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getProvides(task);\n const remaining = current.filter(t => !tokens.includes(t));\n if (remaining.length === current.length) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, provides: remaining },\n },\n },\n state: live.state,\n };\n}\n\n// ============================================================================\n// Convenience — inject tokens via mutation (sugar over applyEvent)\n// ============================================================================\n\n/**\n * Inject tokens into the live graph's available outputs.\n * Equivalent to applyEvent(live, { type: 'inject-tokens', tokens, timestamp }).\n */\nexport function injectTokens(live: LiveGraph, tokens: string[]): LiveGraph {\n return applyEvent(live, {\n type: 'inject-tokens',\n tokens,\n timestamp: new Date().toISOString(),\n });\n}\n\n/**\n * Drain (remove) tokens from the live graph's available outputs.\n * Inverse of injectTokens — useful for expiring stale data or revoking signals.\n * Tokens that aren't currently available are silently ignored.\n * Pure function.\n */\nexport function drainTokens(live: LiveGraph, tokens: string[]): LiveGraph {\n const toRemove = new Set(tokens);\n const remaining = live.state.availableOutputs.filter(t => !toRemove.has(t));\n\n if (remaining.length === live.state.availableOutputs.length) return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n availableOutputs: remaining,\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Node lifecycle\n// ============================================================================\n\n/**\n * Reset a node's state back to not-started, clearing error, retry count, progress.\n * Config is untouched. Useful when a failed task should be retried later.\n * If the node doesn't exist, returns unchanged.\n */\nexport function resetNode(live: LiveGraph, name: string): LiveGraph {\n if (!live.config.tasks[name] || !live.state.tasks[name]) return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: createDefaultGraphEngineStore(),\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Disable a node — sets its status to 'inactivated'.\n * The scheduler will skip inactivated tasks. Config is untouched.\n * If the node doesn't exist or is already inactivated, returns unchanged.\n */\nexport function disableNode(live: LiveGraph, name: string): LiveGraph {\n const taskState = live.state.tasks[name];\n if (!taskState || taskState.status === 'inactivated') return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: { ...taskState, status: 'inactivated', lastUpdated: new Date().toISOString() },\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Enable a previously-disabled node — sets its status back to 'not-started'.\n * Only acts on 'inactivated' nodes. If the node isn't inactivated, returns unchanged.\n */\nexport function enableNode(live: LiveGraph, name: string): LiveGraph {\n const taskState = live.state.tasks[name];\n if (!taskState || taskState.status !== 'inactivated') return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: { ...taskState, status: 'not-started', lastUpdated: new Date().toISOString() },\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Read: getNode\n// ============================================================================\n\n/**\n * Get the config and state for a single node.\n * Returns undefined if the node doesn't exist.\n */\nexport function getNode(live: LiveGraph, name: string): NodeInfo | undefined {\n const config = live.config.tasks[name];\n if (!config) return undefined;\n const state = live.state.tasks[name] ?? createDefaultGraphEngineStore();\n return { name, config, state };\n}\n\n// ============================================================================\n// Persistence: snapshot / restore\n// ============================================================================\n\n/**\n * Serialize a LiveGraph to a plain JSON-safe object.\n * Can be persisted to disk, database, etc.\n */\nexport function snapshot(live: LiveGraph): LiveGraphSnapshot {\n return {\n version: 1,\n config: live.config,\n state: live.state,\n snapshotAt: new Date().toISOString(),\n };\n}\n\n/**\n * Restore a LiveGraph from a snapshot. Validates the shape.\n * Throws if the snapshot is invalid.\n */\nexport function restore(data: unknown): LiveGraph {\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid snapshot: expected an object');\n }\n\n const snap = data as Record<string, unknown>;\n\n if (!snap.config || typeof snap.config !== 'object') {\n throw new Error('Invalid snapshot: missing or invalid \"config\"');\n }\n if (!snap.state || typeof snap.state !== 'object') {\n throw new Error('Invalid snapshot: missing or invalid \"state\"');\n }\n\n const config = snap.config as GraphConfig;\n const state = snap.state as ExecutionState;\n\n if (!config.settings || typeof config.settings !== 'object') {\n throw new Error('Invalid snapshot: config.settings missing');\n }\n if (!config.tasks || typeof config.tasks !== 'object') {\n throw new Error('Invalid snapshot: config.tasks missing');\n }\n if (!state.tasks || typeof state.tasks !== 'object') {\n throw new Error('Invalid snapshot: state.tasks missing');\n }\n if (!Array.isArray(state.availableOutputs)) {\n throw new Error('Invalid snapshot: state.availableOutputs must be an array');\n }\n\n return { config, state };\n}\n\n// ============================================================================\n// Internals\n// ============================================================================\n\nfunction createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n\nfunction applyAgentAction(\n state: ExecutionState,\n action: 'start' | 'stop' | 'pause' | 'resume',\n): ExecutionState {\n const now = new Date().toISOString();\n switch (action) {\n case 'stop':\n return { ...state, status: 'stopped', lastUpdated: now };\n case 'pause':\n return { ...state, status: 'paused', lastUpdated: now };\n case 'resume':\n return { ...state, status: 'running', lastUpdated: now };\n default:\n return state;\n }\n}\n","/**\n * Continuous Event Graph — Schedule\n *\n * Pure read-only projection: LiveGraph → ScheduleResult\n *\n * Classifies every non-terminal task into one of:\n * - eligible: all requires satisfied, ready to dispatch\n * - pending: requires not yet met, but a viable producer exists (normal waiting)\n * - unresolved: requires not met, NO task in the graph can produce them (caller's problem)\n * - blocked: requires not met because the producing task FAILED (caller's problem)\n */\n\nimport type { LiveGraph, ScheduleResult, PendingTask, UnresolvedDependency, BlockedTask } from './types.js';\nimport { getProvides, getRequires, getAllTasks, isNonActiveTask, computeAvailableOutputs, getMaxExecutions, getRefreshStrategy, groupTasksByProvides } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n/**\n * Compute the scheduling status of every task in the live graph.\n * Pure function — no side effects.\n */\nexport function schedule(live: LiveGraph): ScheduleResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const taskNames = Object.keys(graphTasks);\n\n if (taskNames.length === 0) {\n return { eligible: [], pending: [], unresolved: [], blocked: [], conflicts: {} };\n }\n\n // Build producer map: token → tasks that produce it (includes on/on_failure)\n const producerMap = buildProducerMap(graphTasks);\n\n // Available outputs: from completed tasks + injected tokens\n const computedOutputs = computeAvailableOutputs(config, state.tasks);\n const availableOutputs = new Set([...computedOutputs, ...state.availableOutputs]);\n\n const eligible: string[] = [];\n const pending: PendingTask[] = [];\n const unresolved: UnresolvedDependency[] = [];\n const blocked: BlockedTask[] = [];\n\n for (const [taskName, taskConfig] of Object.entries(graphTasks)) {\n const taskState = state.tasks[taskName];\n const strategy = getRefreshStrategy(taskConfig, config.settings);\n const rerunnable = strategy !== 'once';\n\n // Always skip running or inactive (failed/inactivated) tasks\n if (taskState?.status === TASK_STATUS.RUNNING || isNonActiveTask(taskState)) {\n continue;\n }\n\n // Max executions cap\n const maxExec = getMaxExecutions(taskConfig);\n if (maxExec !== undefined && taskState && taskState.executionCount >= maxExec) {\n continue;\n }\n\n // Circuit breaker\n if (taskConfig.circuit_breaker && taskState &&\n taskState.executionCount >= taskConfig.circuit_breaker.max_executions) {\n continue;\n }\n\n // For once-only tasks: skip if completed\n if (!rerunnable && taskState?.status === TASK_STATUS.COMPLETED) {\n continue;\n }\n\n // For re-runnable tasks that already completed: check strategy\n if (rerunnable && taskState?.status === TASK_STATUS.COMPLETED) {\n const requires = getRequires(taskConfig);\n\n let shouldSkip = false;\n switch (strategy) {\n case 'data-changed': {\n if (requires.length > 0) {\n const hasChangedData = requires.some(req => {\n for (const [otherName, otherConfig] of Object.entries(graphTasks)) {\n if (getProvides(otherConfig).includes(req)) {\n const otherState = state.tasks[otherName];\n if (!otherState) continue;\n const consumed = taskState.lastConsumedHashes?.[req];\n if (otherState.lastDataHash == null) {\n return otherState.executionCount > taskState.lastEpoch;\n }\n return otherState.lastDataHash !== consumed;\n }\n }\n return false;\n });\n if (!hasChangedData) shouldSkip = true;\n } else {\n shouldSkip = true;\n }\n break;\n }\n case 'epoch-changed': {\n if (requires.length > 0) {\n const hasRefreshed = requires.some(req => {\n for (const [otherName, otherConfig] of Object.entries(graphTasks)) {\n if (getProvides(otherConfig).includes(req)) {\n const otherState = state.tasks[otherName];\n if (otherState && otherState.executionCount > taskState.lastEpoch) return true;\n }\n }\n return false;\n });\n if (!hasRefreshed) shouldSkip = true;\n } else {\n shouldSkip = true;\n }\n break;\n }\n case 'time-based': {\n const interval = taskConfig.refreshInterval ?? 0;\n if (interval <= 0) { shouldSkip = true; break; }\n const completedAt = taskState.completedAt;\n if (!completedAt) { shouldSkip = true; break; }\n const elapsedSec = (Date.now() - Date.parse(completedAt)) / 1000;\n if (elapsedSec < interval) shouldSkip = true;\n break;\n }\n case 'manual':\n shouldSkip = true;\n break;\n }\n if (shouldSkip) continue;\n }\n\n const requires = getRequires(taskConfig);\n\n // No requires → eligible (entry point)\n if (requires.length === 0) {\n eligible.push(taskName);\n continue;\n }\n\n // Check each required token\n const missingTokens: string[] = [];\n const pendingTokens: string[] = [];\n const failedTokenInfo: { token: string; failedProducer: string }[] = [];\n\n for (const token of requires) {\n if (availableOutputs.has(token)) continue;\n\n const producers = producerMap[token] || [];\n\n if (producers.length === 0) {\n // No task produces this token → unresolved\n missingTokens.push(token);\n } else {\n // Check if all producers have failed\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n if (allFailed) {\n failedTokenInfo.push({ token, failedProducer: producers[0] });\n } else {\n // At least one producer is viable → pending (normal wait)\n pendingTokens.push(token);\n }\n }\n }\n\n if (missingTokens.length > 0) {\n unresolved.push({ taskName, missingTokens });\n } else if (failedTokenInfo.length > 0) {\n blocked.push({\n taskName,\n failedTokens: failedTokenInfo.map(f => f.token),\n failedProducers: [...new Set(failedTokenInfo.map(f => f.failedProducer))],\n });\n } else if (pendingTokens.length > 0) {\n pending.push({ taskName, waitingOn: pendingTokens });\n } else {\n // All requires satisfied\n eligible.push(taskName);\n }\n }\n\n // Detect conflicts among eligible tasks\n const conflicts: Record<string, string[]> = {};\n if (eligible.length > 1) {\n const outputGroups = groupTasksByProvides(eligible, graphTasks);\n for (const [outputKey, groupTasks] of Object.entries(outputGroups)) {\n if (groupTasks.length > 1) {\n conflicts[outputKey] = groupTasks;\n }\n }\n }\n\n return { eligible, pending, unresolved, blocked, conflicts };\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Build a map: token → tasks that produce it (via provides, on, on_failure).\n */\nfunction buildProducerMap(tasks: Record<string, import('../event-graph/types.js').TaskConfig>): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n\n return map;\n}\n","/**\n * Continuous Event Graph — Inspect\n *\n * Pure read-only projection: LiveGraph → LiveGraphHealth\n *\n * Live health report combining config structure + runtime state.\n */\n\nimport type { LiveGraph, LiveGraphHealth, UnreachableTokensResult, UnreachableNodesResult, UpstreamResult, DownstreamResult } from './types.js';\nimport { getProvides, getRequires, getAllTasks, isNonActiveTask } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n/**\n * Compute a live health report for the graph.\n * Combines structural analysis (cycles, conflicts, open deps) with runtime state (task statuses).\n * Pure function — no side effects.\n */\nexport function inspect(live: LiveGraph): LiveGraphHealth {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const taskNames = Object.keys(graphTasks);\n\n // --- Task status counts ---\n let running = 0, completed = 0, failed = 0, waiting = 0, notStarted = 0, disabled = 0;\n\n for (const taskName of taskNames) {\n const ts = state.tasks[taskName];\n if (!ts || ts.status === TASK_STATUS.NOT_STARTED) {\n notStarted++;\n } else {\n switch (ts.status) {\n case TASK_STATUS.RUNNING: running++; break;\n case TASK_STATUS.COMPLETED: completed++; break;\n case TASK_STATUS.FAILED: failed++; break;\n case 'inactivated': disabled++; break;\n default: waiting++;\n }\n }\n }\n\n // --- Producer map ---\n const producerMap: Record<string, string[]> = {};\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n for (const token of getProvides(taskConfig)) {\n if (!producerMap[token]) producerMap[token] = [];\n producerMap[token].push(name);\n }\n if (taskConfig.on) {\n for (const tokens of Object.values(taskConfig.on)) {\n for (const token of tokens) {\n if (!producerMap[token]) producerMap[token] = [];\n if (!producerMap[token].includes(name)) producerMap[token].push(name);\n }\n }\n }\n if (taskConfig.on_failure) {\n for (const token of taskConfig.on_failure) {\n if (!producerMap[token]) producerMap[token] = [];\n if (!producerMap[token].includes(name)) producerMap[token].push(name);\n }\n }\n }\n\n // --- Open dependencies: tokens required but no producer exists ---\n const openDeps = new Set<string>();\n let unresolvedCount = 0;\n let blockedCount = 0;\n\n for (const [taskName, taskConfig] of Object.entries(graphTasks)) {\n const ts = state.tasks[taskName];\n // Skip already-completed or running\n if (ts?.status === TASK_STATUS.COMPLETED || ts?.status === TASK_STATUS.RUNNING) continue;\n\n let hasOpen = false;\n let hasBlocked = false;\n for (const token of getRequires(taskConfig)) {\n const producers = producerMap[token] || [];\n if (producers.length === 0) {\n openDeps.add(token);\n hasOpen = true;\n } else {\n const allFailed = producers.every(p => {\n const ps = state.tasks[p];\n return ps?.status === TASK_STATUS.FAILED || ps?.status === 'inactivated';\n });\n if (allFailed) hasBlocked = true;\n }\n }\n if (hasOpen) unresolvedCount++;\n if (hasBlocked && !hasOpen) blockedCount++;\n }\n\n // --- Conflict tokens: produced by multiple tasks ---\n const conflictTokens: string[] = [];\n for (const [token, producers] of Object.entries(producerMap)) {\n if (producers.length > 1) conflictTokens.push(token);\n }\n\n // --- Cycle detection (DFS) ---\n const deps = buildTaskDeps(graphTasks, producerMap);\n const cycles = detectCycles(taskNames, deps);\n\n return {\n totalNodes: taskNames.length,\n running, completed, failed, waiting, notStarted, disabled,\n unresolvedCount,\n blockedCount,\n openDependencies: [...openDeps],\n cycles,\n conflictTokens,\n };\n}\n\n// ============================================================================\n// Cycle detection internals (pure)\n// ============================================================================\n\nfunction buildTaskDeps(\n tasks: Record<string, import('../event-graph/types.js').TaskConfig>,\n producerMap: Record<string, string[]>,\n): Record<string, Set<string>> {\n const deps: Record<string, Set<string>> = {};\n for (const [name, config] of Object.entries(tasks)) {\n deps[name] = new Set<string>();\n for (const token of getRequires(config)) {\n for (const producer of (producerMap[token] || [])) {\n if (producer !== name) deps[name].add(producer);\n }\n }\n }\n return deps;\n}\n\nfunction detectCycles(\n taskNames: string[],\n deps: Record<string, Set<string>>,\n): string[][] {\n const WHITE = 0, GRAY = 1, BLACK = 2;\n const color: Record<string, number> = {};\n const parent: Record<string, string | null> = {};\n const cycles: string[][] = [];\n\n for (const name of taskNames) {\n color[name] = WHITE;\n parent[name] = null;\n }\n\n function dfs(node: string): void {\n color[node] = GRAY;\n for (const dep of deps[node] || []) {\n if (color[dep] === GRAY) {\n const cycle: string[] = [dep];\n let cur = node;\n while (cur !== dep) {\n cycle.push(cur);\n cur = parent[cur]!;\n }\n cycle.push(dep);\n cycle.reverse();\n cycles.push(cycle);\n } else if (color[dep] === WHITE) {\n parent[dep] = node;\n dfs(dep);\n }\n }\n color[node] = BLACK;\n }\n\n for (const name of taskNames) {\n if (color[name] === WHITE) dfs(name);\n }\n\n return cycles;\n}\n\n// ============================================================================\n// Reachability analysis (transitive)\n// ============================================================================\n\n/**\n * Build producer map: token → task names that produce it.\n */\nfunction buildProducerMap(\n tasks: Record<string, import('../event-graph/types.js').TaskConfig>,\n): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n return map;\n}\n\n/**\n * Get all tokens that are required but cannot be produced given the current\n * graph state. This is **transitive**: if token X is unreachable, and node A\n * is the only producer of token Y but A requires X, then Y is also unreachable.\n *\n * Takes into account:\n * - Tokens already in availableOutputs (reachable)\n * - Tokens from completed tasks (reachable)\n * - Failed/disabled producers (non-viable)\n *\n * Pure function.\n */\nexport function getUnreachableTokens(live: LiveGraph): UnreachableTokensResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const producerMap = buildProducerMap(graphTasks);\n\n // Tokens already available\n const available = new Set([...state.availableOutputs]);\n for (const [taskName, taskState] of Object.entries(state.tasks)) {\n if (taskState.status === 'completed') {\n const tc = graphTasks[taskName];\n if (tc) getProvides(tc).forEach(t => available.add(t));\n }\n }\n\n // Collect all required tokens\n const allRequired = new Set<string>();\n for (const taskConfig of Object.values(graphTasks)) {\n for (const token of getRequires(taskConfig)) {\n allRequired.add(token);\n }\n }\n\n // Iterative fixed-point: mark tokens unreachable if all their viable producers\n // are themselves unreachable (need an unreachable token).\n const unreachable = new Set<string>();\n const unreachableNodes = new Set<string>();\n\n // Seed: tokens with NO producer at all (and not already available)\n for (const token of allRequired) {\n if (available.has(token)) continue;\n const producers = producerMap[token] || [];\n if (producers.length === 0) {\n unreachable.add(token);\n }\n }\n\n // Fixed-point: propagate transitively\n let changed = true;\n while (changed) {\n changed = false;\n\n // Mark nodes as unreachable if any of their requires is unreachable\n // and they haven't already completed\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n if (unreachableNodes.has(name)) continue;\n const ts = state.tasks[name];\n if (ts?.status === 'completed') continue; // already done, skip\n\n // Check if non-active (failed/disabled) — it's a dead producer\n const isNonActive = isNonActiveTask(ts);\n\n const requires = getRequires(taskConfig);\n const hasUnreachableDep = requires.some(t => unreachable.has(t));\n\n if (isNonActive || hasUnreachableDep) {\n if (!unreachableNodes.has(name)) {\n unreachableNodes.add(name);\n changed = true;\n }\n }\n }\n\n // Mark tokens as unreachable if ALL their producers are unreachable/non-active\n for (const token of allRequired) {\n if (unreachable.has(token) || available.has(token)) continue;\n const producers = producerMap[token] || [];\n const allProducersUnreachable = producers.length > 0 &&\n producers.every(p => unreachableNodes.has(p) || isNonActiveTask(state.tasks[p]));\n if (producers.length === 0 || allProducersUnreachable) {\n if (!unreachable.has(token)) {\n unreachable.add(token);\n changed = true;\n }\n }\n }\n }\n\n // Build reason map\n const tokens: UnreachableTokensResult['tokens'] = [];\n for (const token of unreachable) {\n const producers = producerMap[token] || [];\n let reason: 'no-producer' | 'all-producers-failed' | 'transitive';\n if (producers.length === 0) {\n reason = 'no-producer';\n } else {\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n reason = allFailed ? 'all-producers-failed' : 'transitive';\n }\n tokens.push({ token, reason, producers });\n }\n\n return { tokens };\n}\n\n/**\n * Get all nodes that can never become eligible given the current graph state.\n * A node is unreachable if any of its required tokens is unreachable.\n *\n * This is the node-level companion to getUnreachableTokens — uses the same\n * transitive analysis.\n *\n * Pure function.\n */\nexport function getUnreachableNodes(live: LiveGraph): UnreachableNodesResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const { tokens: unreachableTokens } = getUnreachableTokens(live);\n const unreachableTokenSet = new Set(unreachableTokens.map(t => t.token));\n\n const nodes: UnreachableNodesResult['nodes'] = [];\n\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n const ts = state.tasks[name];\n if (ts?.status === 'completed') continue; // already done\n\n const requires = getRequires(taskConfig);\n const missingTokens = requires.filter(t => unreachableTokenSet.has(t));\n\n if (missingTokens.length > 0) {\n nodes.push({ nodeName: name, missingTokens });\n } else if (isNonActiveTask(ts)) {\n // Node itself is failed/disabled — it's unreachable too\n nodes.push({ nodeName: name, missingTokens: [] });\n }\n }\n\n return { nodes };\n}\n\n// ============================================================================\n// Graph traversal: upstream / downstream\n// ============================================================================\n\n/**\n * Get all nodes that transitively feed into the given node.\n * \"What's upstream of X?\" — traces backwards through requires → provides chains.\n *\n * Returns the set of upstream nodes and the tokens connecting them.\n * Does NOT include the target node itself.\n * Pure function.\n */\nexport function getUpstream(live: LiveGraph, nodeName: string): UpstreamResult {\n const graphTasks = getAllTasks(live.config);\n if (!graphTasks[nodeName]) return { nodeName, nodes: [], tokens: [] };\n\n const producerMap = buildProducerMap(graphTasks);\n const visited = new Set<string>();\n const tokenSet = new Set<string>();\n const nodeEntries: Map<string, Set<string>> = new Map();\n\n function walk(current: string): void {\n const taskConfig = graphTasks[current];\n if (!taskConfig) return;\n\n for (const token of getRequires(taskConfig)) {\n const producers = producerMap[token] || [];\n for (const producer of producers) {\n if (producer === nodeName) continue; // don't include target\n tokenSet.add(token);\n\n // Track which tokens this producer contributes\n if (!nodeEntries.has(producer)) nodeEntries.set(producer, new Set());\n nodeEntries.get(producer)!.add(token);\n\n if (!visited.has(producer)) {\n visited.add(producer);\n walk(producer);\n }\n }\n }\n }\n\n walk(nodeName);\n\n const nodes = [...nodeEntries.entries()].map(([name, tokens]) => ({\n nodeName: name,\n providesTokens: [...tokens],\n }));\n\n return { nodeName, nodes, tokens: [...tokenSet] };\n}\n\n/**\n * Get all nodes that transitively depend on the given node.\n * \"What breaks if I disable X?\" — traces forwards through provides → requires chains.\n *\n * Returns the set of downstream nodes and the tokens connecting them.\n * Does NOT include the target node itself.\n * Pure function.\n */\nexport function getDownstream(live: LiveGraph, nodeName: string): DownstreamResult {\n const graphTasks = getAllTasks(live.config);\n if (!graphTasks[nodeName]) return { nodeName, nodes: [], tokens: [] };\n\n // Build consumer map: token → nodes that require it\n const consumerMap: Record<string, string[]> = {};\n for (const [name, config] of Object.entries(graphTasks)) {\n for (const token of getRequires(config)) {\n if (!consumerMap[token]) consumerMap[token] = [];\n consumerMap[token].push(name);\n }\n }\n\n const visited = new Set<string>();\n const tokenSet = new Set<string>();\n const nodeEntries: Map<string, Set<string>> = new Map();\n\n function walk(current: string): void {\n const taskConfig = graphTasks[current];\n if (!taskConfig) return;\n\n for (const token of getProvides(taskConfig)) {\n const consumers = consumerMap[token] || [];\n for (const consumer of consumers) {\n if (consumer === nodeName) continue; // don't include target\n tokenSet.add(token);\n\n if (!nodeEntries.has(consumer)) nodeEntries.set(consumer, new Set());\n nodeEntries.get(consumer)!.add(token);\n\n if (!visited.has(consumer)) {\n visited.add(consumer);\n walk(consumer);\n }\n }\n }\n }\n\n walk(nodeName);\n\n const nodes = [...nodeEntries.entries()].map(([name, tokens]) => ({\n nodeName: name,\n requiresTokens: [...tokens],\n }));\n\n return { nodeName, nodes, tokens: [...tokenSet] };\n}\n","/**\n * Continuous Event Graph — Journal\n *\n * Append-only event log for the reactive layer.\n * Handlers append events here; drain() reads and clears atomically.\n *\n * Adapter:\n * - MemoryJournal: in-process array (default)\n */\n\nimport type { GraphEvent } from '../event-graph/types.js';\n\n// ============================================================================\n// Interface\n// ============================================================================\n\nexport interface Journal {\n /** Append an event to the journal. Safe to call from concurrent callbacks. */\n append(event: GraphEvent): void;\n /** Read all pending events and clear the journal atomically. */\n drain(): GraphEvent[];\n /** Number of pending events (for observability). */\n readonly size: number;\n}\n\n// ============================================================================\n// MemoryJournal — in-process, zero dependencies\n// ============================================================================\n\nexport class MemoryJournal implements Journal {\n private buffer: GraphEvent[] = [];\n\n append(event: GraphEvent): void {\n this.buffer.push(event);\n }\n\n drain(): GraphEvent[] {\n const events = this.buffer;\n this.buffer = [];\n return events;\n }\n\n get size(): number {\n return this.buffer.length;\n }\n}\n","/**\n * Continuous Event Graph — Reactive Layer\n *\n * Push-based, self-sustaining execution wrapper.\n *\n * Pattern:\n * 1. Register handlers for tasks\n * 2. Push an event (or inject tokens)\n * 3. The graph drives itself: drain journal → applyEvents → schedule → dispatch → repeat\n *\n * No daemon, no polling. Each handler callback appends to the journal,\n * which triggers a drain cycle that may dispatch the next wave.\n *\n * Dispatch failures, retries, and timeouts are managed internally\n * without touching the core engine types.\n */\n\nimport type { GraphConfig, TaskConfig, GraphEvent, GraphEngineStore } from '../event-graph/types.js';\nimport type { LiveGraph, LiveGraphSnapshot, ScheduleResult } from './types.js';\nimport { createLiveGraph, applyEvents, snapshot } from './core.js';\nimport { schedule } from './schedule.js';\nimport { MemoryJournal } from './journal.js';\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Deterministic hash of a data payload.\n * Recursively-sorted JSON → stable 64-bit hex.\n * Used to auto-compute dataHash when the handler doesn't provide one.\n * Exported so handler authors can pre-compute or test hashes.\n */\nexport function computeDataHash(data: Record<string, unknown>): string {\n const json = stableStringify(data);\n return fnv1a64Hex(json);\n}\n\n/** Recursively produce a JSON string with sorted keys at every level. */\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined || typeof value !== 'object') {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return '[' + value.map(stableStringify).join(',') + ']';\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return '{' + keys.map(k => JSON.stringify(k) + ':' + stableStringify(obj[k])).join(',') + '}';\n}\n\n/**\n * Stable 64-bit FNV-1a hash as 16-char hex.\n * Fast, deterministic, and browser/Node portable.\n */\nfunction fnv1a64Hex(input: string): string {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n const mod = 0xffffffffffffffffn;\n for (let i = 0; i < input.length; i++) {\n hash ^= BigInt(input.charCodeAt(i));\n hash = (hash * prime) & mod;\n }\n return hash.toString(16).padStart(16, '0');\n}\n\nfunction base64UrlEncode(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'utf8').toString('base64url');\n }\n if (typeof btoa === 'function') {\n const bytes = new TextEncoder().encode(input);\n let binary = '';\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n }\n throw new Error('No base64 encoder available in this runtime');\n}\n\nfunction base64UrlDecode(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'base64url').toString('utf8');\n }\n if (typeof atob === 'function') {\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return new TextDecoder().decode(bytes);\n }\n throw new Error('No base64 decoder available in this runtime');\n}\n\n/**\n * Encode a callback token for a task.\n * Opaque base64url string — can be sent to external systems.\n */\nfunction encodeCallbackToken(taskName: string): string {\n const payload = JSON.stringify({ t: taskName, n: Date.now().toString(36) + Math.random().toString(36).slice(2, 6) });\n return base64UrlEncode(payload);\n}\n\n/**\n * Decode a callback token → { taskName } or null if malformed.\n */\nfunction decodeCallbackToken(token: string): { taskName: string } | null {\n try {\n const payload = JSON.parse(base64UrlDecode(token));\n if (typeof payload?.t === 'string') return { taskName: payload.t };\n return null;\n } catch { return null; }\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Input passed to a task handler function.\n *\n * The reactive layer resolves upstream data from `requires` into `state`,\n * and provides this task's own engine store as `taskState`.\n * Handlers push output data back via `graph.resolveCallback(callbackToken, data)`.\n */\nexport interface TaskHandlerInput {\n /** This task's node ID (task name) */\n nodeId: string;\n /**\n * Upstream dependency data, keyed by require token name.\n * Only tokens from this task's `requires` are present.\n * Value is the producing task's `data` field (or undefined if not yet available).\n */\n state: Readonly<Record<string, Record<string, unknown> | undefined>>;\n /**\n * This task's own GraphEngineStore — includes status, data, executionCount, etc.\n */\n taskState: Readonly<GraphEngineStore>;\n /** This task's config */\n config: Readonly<TaskConfig>;\n /**\n * Opaque callback token encoding this task's identity.\n * Pass this to `graph.resolveCallback(callbackToken, data)` to complete the task.\n * Can be serialized and sent to external systems (webhooks, other scripts,\n * message queues) — any process with this token can push data back.\n */\n callbackToken: string;\n /**\n * Present only on task-progress re-invocations (source delivery / failure).\n * Contains the update payload from the task-progress event.\n * e.g. { bindTo: 'prices', fetchedAt: '...', dest: 'prices.json' }\n * or { bindTo: 'prices', failure: true, reason: 'timeout' }\n */\n update?: Record<string, unknown>;\n}\n\n/**\n * Handler return value — initiation status only.\n * - `'task-initiated'` — async work started successfully; data will arrive via resolveCallback\n * - `'task-initiate-failure'` — failed to start (bad config, connection refused, etc.)\n */\nexport type TaskHandlerReturn = 'task-initiated' | 'task-initiate-failure';\n\n/**\n * A named task handler function.\n * Registered in the handler registry, referenced by name in `taskConfig.taskHandlers`.\n *\n * The handler's job is to **initiate** async work, not await it.\n *\n * Flow:\n * 1. Handler receives `callbackToken` + upstream `state`\n * 2. Handler kicks off background work (internal, external script, webhook, etc.)\n * — passes `callbackToken` to the background work\n * 3. Handler returns `'task-initiated'` immediately\n * 4. Background work runs independently — when done, it calls\n * `graph.resolveCallback(callbackToken, data)` for success, or\n * `graph.resolveCallback(callbackToken, {}, ['error msg'])` for failure\n * 5. resolveCallback completes the task → data-changed cascade fires\n *\n * The callbackToken is opaque — pass it to the background work so it can\n * call back. Works across processes, scripts, webhooks, message queues.\n *\n * @example\n * ```ts\n * const fetchYahoo: TaskHandlerFn = async ({ state, callbackToken }) => {\n * const symbols = state['portfolio-form']?.holdings?.map(h => h.symbol) ?? [];\n * // Kick off background work — do NOT await\n * fetch(`https://api.yahoo.com/prices?s=${symbols.join(',')}`)\n * .then(res => res.json())\n * .then(prices => graph.resolveCallback(callbackToken, { prices }))\n * .catch(err => graph.resolveCallback(callbackToken, {}, [err.message]));\n * // Return immediately — background work will resolveCallback when done\n * return 'task-initiated';\n * };\n * ```\n */\nexport type TaskHandlerFn = (input: TaskHandlerInput) => Promise<TaskHandlerReturn>;\n\nexport interface ReactiveGraphOptions {\n /** Named handler registry — handler name → handler function */\n handlers: Record<string, TaskHandlerFn>;\n /** Called after each drain cycle — for observability */\n onDrain?: (events: GraphEvent[], live: LiveGraph, scheduleResult: ScheduleResult) => void;\n}\n\nexport interface ReactiveGraph {\n /** Push an event into the graph via journal. Triggers drain → schedule → dispatch. */\n push(event: GraphEvent): void;\n /** Push multiple events via journal. Single drain cycle after all are journaled. */\n pushAll(events: GraphEvent[]): void;\n /**\n * Resolve a callback token — complete (or fail) a task after initiation.\n * Journals task-completed or task-failed, then drains.\n * Gracefully ignores invalid tokens or tokens for tasks no longer in the graph.\n */\n resolveCallback(callbackToken: string, data: Record<string, unknown>, errors?: string[]): void;\n /** Add a node to the graph. Journals a task-upsert event, then drains. */\n addNode(name: string, taskConfig: TaskConfig): void;\n /** Remove a node from the graph. Journals a task-removal event, then drains. */\n removeNode(name: string): void;\n /** Add required tokens to an existing node. Journals event, then drains. */\n addRequires(nodeName: string, tokens: string[]): void;\n /** Remove required tokens from an existing node. Journals event, then drains. */\n removeRequires(nodeName: string, tokens: string[]): void;\n /** Add provided tokens to an existing node. Journals event, then drains. */\n addProvides(nodeName: string, tokens: string[]): void;\n /** Remove provided tokens from an existing node. Journals event, then drains. */\n removeProvides(nodeName: string, tokens: string[]): void;\n /** Register a named handler in the registry. */\n registerHandler(name: string, fn: TaskHandlerFn): void;\n /** Unregister a named handler from the registry. */\n unregisterHandler(name: string): void;\n /**\n * Re-trigger a task: journals a task-restart event, then drains.\n * data-changed cascade handles downstream automatically.\n */\n retrigger(taskName: string): void;\n /** Re-trigger multiple tasks via journal. */\n retriggerAll(taskNames: string[]): void;\n /**\n * Serialize current state to a JSON-safe snapshot.\n * Caller is responsible for writing to disk/DB/etc.\n * Restore via: `createReactiveGraph(restore(snapshotData), options)`\n */\n snapshot(): LiveGraphSnapshot;\n /** Read-only snapshot of current LiveGraph state. */\n getState(): LiveGraph;\n /** Current schedule projection. */\n getSchedule(): ScheduleResult;\n /**\n * Await all in-flight handler promises without disposing the graph.\n * Use this when you need to wait for async handlers to finish so you\n * can inspect side-effects (e.g. a TX accumulator) and then push more\n * events into the same graph instance.\n */\n waitForHandlers(): Promise<void>;\n /**\n * Stop accepting events.\n * @param options.wait — if true, await all in-flight handler promises before marking disposed.\n */\n dispose(options?: { wait?: boolean }): Promise<void>;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createReactiveGraph(\n configOrLive: GraphConfig | LiveGraph,\n options: ReactiveGraphOptions,\n executionId?: string,\n): ReactiveGraph {\n const {\n handlers: initialHandlers,\n onDrain,\n } = options;\n\n // Private input queue — caller pushes external events here via push()/pushAll().\n // The engine never reads from a caller-supplied journal; all external events must be\n // explicitly pushed in so that state mutations are always caller-controlled.\n const inputQueue = new MemoryJournal();\n\n let live = 'state' in configOrLive && 'config' in configOrLive\n ? configOrLive as LiveGraph\n : createLiveGraph(configOrLive as GraphConfig, executionId);\n let disposed = false;\n\n // Track in-flight handler promises so callers can await them before dispose.\n const pendingHandlers = new Set<Promise<void>>();\n\n // Handler registry — mutable, keyed by handler name\n const handlers = new Map<string, TaskHandlerFn>(Object.entries(initialHandlers));\n\n // Private journal for internal state transitions (task-started, task-failed from engine).\n // Never exposed outside; keeps internal events off the caller-supplied journal.\n const internalJournal = new MemoryJournal();\n\n // Drain lock — prevents re-entrant drain cycles\n let draining = false;\n let drainQueued = false;\n\n // --------------------------------------------------------------------------\n // Core drain cycle\n // --------------------------------------------------------------------------\n\n function drain(): void {\n if (disposed) return;\n if (draining) {\n drainQueued = true;\n return;\n }\n\n draining = true;\n try {\n do {\n drainQueued = false;\n drainOnce();\n } while (drainQueued);\n } finally {\n draining = false;\n }\n }\n\n function drainOnce(): void {\n // 1. Read all pending events — internal lifecycle transitions first (task-started, task-failed),\n // then caller-pushed external events (task-upsert, task-completed, etc.).\n // Internal must precede external so engine lifecycle always applies before caller completions.\n const internalEvents = internalJournal.drain();\n const inputEvents = inputQueue.drain();\n const events = [...internalEvents, ...inputEvents];\n\n // 2. Apply events atomically (if any)\n if (events.length > 0) {\n live = applyEvents(live, events);\n }\n\n // 3. Schedule — what can run?\n const result = schedule(live);\n\n // 4. Observability callback (only when there were events)\n if (events.length > 0) {\n onDrain?.(events, live, result);\n }\n\n // 5. Dispatch eligible tasks\n for (const taskName of result.eligible) {\n dispatchTask(taskName);\n }\n\n // 6. Re-invoke handlers for in-progress tasks that received a task-progress event.\n // task-progress events don't change task status (they're not applied by the engine),\n // so we route them here directly to their taskHandlers.\n for (const event of events) {\n if (event.type === 'task-progress') {\n const { taskName, update } = event;\n const taskConfig = live.config.tasks[taskName];\n if (!taskConfig) continue;\n const taskState = live.state.tasks[taskName];\n if (!taskState || taskState.status !== 'running') continue;\n const callbackToken = encodeCallbackToken(taskName);\n const p = runPipeline(taskName, callbackToken, update).catch((error: Error) => {\n if (disposed) return;\n internalJournal.append({\n type: 'task-failed',\n taskName,\n error: error.message ?? String(error),\n timestamp: new Date().toISOString(),\n });\n drain();\n }).finally(() => { pendingHandlers.delete(p); });\n pendingHandlers.add(p);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Resolve upstream state for a task's requires\n // --------------------------------------------------------------------------\n\n function resolveUpstreamState(taskName: string): Record<string, Record<string, unknown> | undefined> {\n const taskConfig = live.config.tasks[taskName];\n const requires = taskConfig.requires ?? [];\n\n const tokenToTask = new Map<string, string>();\n for (const [name, cfg] of Object.entries(live.config.tasks)) {\n for (const token of cfg.provides ?? []) {\n tokenToTask.set(token, name);\n }\n }\n\n const state: Record<string, Record<string, unknown> | undefined> = {};\n for (const token of requires) {\n const producerTask = tokenToTask.get(token);\n if (producerTask) {\n state[token] = live.state.tasks[producerTask]?.data;\n } else {\n state[token] = undefined;\n }\n }\n return state;\n }\n\n // --------------------------------------------------------------------------\n // Run the handler pipeline for a task\n // --------------------------------------------------------------------------\n\n async function runPipeline(taskName: string, callbackToken: string, update?: Record<string, unknown>): Promise<void> {\n const taskConfig = live.config.tasks[taskName];\n const handlerNames = taskConfig.taskHandlers ?? [];\n const upstreamState = resolveUpstreamState(taskName);\n\n for (const handlerName of handlerNames) {\n const handler = handlers.get(handlerName);\n if (!handler) {\n throw new Error(`Handler '${handlerName}' not found in registry (task '${taskName}')`);\n }\n\n const input: TaskHandlerInput = {\n nodeId: taskName,\n state: upstreamState,\n taskState: live.state.tasks[taskName],\n config: taskConfig,\n callbackToken,\n update,\n };\n\n const status = await handler(input);\n\n if (status === 'task-initiate-failure') {\n throw new Error(`Handler '${handlerName}' returned task-initiate-failure (task '${taskName}')`);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Dispatch a single task\n // --------------------------------------------------------------------------\n\n function dispatchTask(taskName: string): void {\n const taskConfig = live.config.tasks[taskName];\n const handlerNames = taskConfig?.taskHandlers;\n\n if (!handlerNames || handlerNames.length === 0) {\n // No taskHandlers — externally driven.\n return;\n }\n\n // Write task-started to internal journal only — not to the caller-supplied journal\n internalJournal.append({\n type: 'task-started',\n taskName,\n timestamp: new Date().toISOString(),\n });\n // Re-trigger drain so task-started is applied to graph state before caller saves.\n // Since we're called from within drainOnce(), draining=true here, so this sets\n // drainQueued=true — the do...while loop picks it up in the next pass.\n drain();\n\n const callbackToken = encodeCallbackToken(taskName);\n\n // Fire-and-forget: run the handler pipeline\n const p = runPipeline(taskName, callbackToken).catch((error: Error) => {\n if (disposed) return;\n internalJournal.append({\n type: 'task-failed',\n taskName,\n error: error.message ?? String(error),\n timestamp: new Date().toISOString(),\n });\n drain();\n }).finally(() => { pendingHandlers.delete(p); });\n pendingHandlers.add(p);\n }\n\n // --------------------------------------------------------------------------\n // Public API — every mutation goes through journal\n // --------------------------------------------------------------------------\n\n return {\n push(event: GraphEvent): void {\n if (disposed) return;\n if (event.type === 'task-completed' && event.data && !event.dataHash) {\n event = { ...event, dataHash: computeDataHash(event.data) };\n }\n inputQueue.append(event);\n drain();\n },\n\n pushAll(events: GraphEvent[]): void {\n if (disposed) return;\n for (const event of events) {\n if (event.type === 'task-completed' && event.data && !event.dataHash) {\n inputQueue.append({ ...event, dataHash: computeDataHash(event.data) });\n } else {\n inputQueue.append(event);\n }\n }\n drain();\n },\n\n resolveCallback(callbackToken: string, data: Record<string, unknown>, errors?: string[]): void {\n if (disposed) return;\n\n const decoded = decodeCallbackToken(callbackToken);\n if (!decoded) return;\n\n const { taskName } = decoded;\n if (!live.config.tasks[taskName]) return;\n\n if (errors && errors.length > 0) {\n inputQueue.append({\n type: 'task-failed',\n taskName,\n error: errors.join('; '),\n timestamp: new Date().toISOString(),\n });\n } else {\n const dataHash = data && Object.keys(data).length > 0 ? computeDataHash(data) : undefined;\n inputQueue.append({\n type: 'task-completed',\n taskName,\n data,\n dataHash,\n timestamp: new Date().toISOString(),\n });\n }\n drain();\n },\n\n addNode(name: string, taskConfig: TaskConfig): void {\n if (disposed) return;\n inputQueue.append({ type: 'task-upsert', taskName: name, taskConfig, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeNode(name: string): void {\n if (disposed) return;\n inputQueue.append({ type: 'task-removal', taskName: name, timestamp: new Date().toISOString() });\n drain();\n },\n\n addRequires(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-requires-add', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeRequires(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-requires-remove', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n addProvides(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-provides-add', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeProvides(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-provides-remove', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n registerHandler(name: string, fn: TaskHandlerFn): void {\n handlers.set(name, fn);\n },\n\n unregisterHandler(name: string): void {\n handlers.delete(name);\n },\n\n retrigger(taskName: string): void {\n if (disposed) return;\n if (!live.config.tasks[taskName]) return;\n inputQueue.append({\n type: 'task-restart',\n taskName,\n timestamp: new Date().toISOString(),\n });\n drain();\n },\n\n retriggerAll(taskNames: string[]): void {\n if (disposed) return;\n for (const name of taskNames) {\n if (!live.config.tasks[name]) continue;\n inputQueue.append({\n type: 'task-restart',\n taskName: name,\n timestamp: new Date().toISOString(),\n });\n }\n drain();\n },\n\n snapshot(): LiveGraphSnapshot {\n return snapshot(live);\n },\n\n getState(): LiveGraph {\n return live;\n },\n\n getSchedule(): ScheduleResult {\n return schedule(live);\n },\n\n async waitForHandlers(): Promise<void> {\n if (pendingHandlers.size > 0) {\n await Promise.allSettled([...pendingHandlers]);\n }\n },\n\n async dispose(options?: { wait?: boolean }): Promise<void> {\n if (options?.wait && pendingHandlers.size > 0) {\n await Promise.allSettled([...pendingHandlers]);\n }\n disposed = true;\n },\n };\n}\n","/**\n * Continuous Event Graph — Validation Utilities\n *\n * Runtime state-consistency checks for LiveGraph and ReactiveGraph.\n * Unlike event-graph/validate.ts which validates static GraphConfig structure,\n * these validate the *live* runtime state against its config.\n *\n * Pure functions — config+state in, diagnostics out.\n */\n\nimport type { LiveGraph } from './types.js';\nimport type { ReactiveGraph } from './reactive.js';\nimport type { GraphIssue, GraphValidationResult } from '../event-graph/validate.js';\nimport { getProvides, getAllTasks } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n// ============================================================================\n// validateLiveGraph — state/config consistency\n// ============================================================================\n\n/**\n * Validate that a LiveGraph's runtime state is consistent with its config.\n *\n * Checks:\n * - Every config task has a corresponding state entry (MISSING_STATE)\n * - No orphan state entries exist for tasks not in config (ORPHAN_STATE)\n * - Running tasks have a startedAt timestamp (RUNNING_WITHOUT_START)\n * - Completed tasks have a completedAt timestamp (COMPLETED_WITHOUT_TIMESTAMP)\n * - Failed tasks have a failedAt timestamp and error (FAILED_WITHOUT_INFO)\n * - Available outputs match what completed tasks should have produced (PHANTOM_OUTPUT / MISSING_OUTPUT)\n * - Execution counts are non-negative (INVALID_EXECUTION_COUNT)\n * - No task has executionCount > maxExecutions when capped (EXCEEDED_MAX_EXECUTIONS)\n */\nexport function validateLiveGraph(live: LiveGraph): GraphValidationResult {\n const issues: GraphIssue[] = [];\n const { config, state } = live;\n const tasks = getAllTasks(config);\n const taskNames = Object.keys(tasks);\n\n // ---- 1. Missing state entries ----\n for (const name of taskNames) {\n if (!state.tasks[name]) {\n issues.push({\n severity: 'error',\n code: 'MISSING_STATE',\n message: `Task \"${name}\" exists in config but has no state entry`,\n tasks: [name],\n });\n }\n }\n\n // ---- 2. Orphan state entries ----\n for (const name of Object.keys(state.tasks)) {\n if (!tasks[name]) {\n issues.push({\n severity: 'warning',\n code: 'ORPHAN_STATE',\n message: `State entry \"${name}\" has no corresponding task config`,\n tasks: [name],\n });\n }\n }\n\n // ---- 3. Status consistency ----\n for (const name of taskNames) {\n const ts = state.tasks[name];\n if (!ts) continue;\n\n if (ts.status === TASK_STATUS.RUNNING && !ts.startedAt) {\n issues.push({\n severity: 'warning',\n code: 'RUNNING_WITHOUT_START',\n message: `Task \"${name}\" is running but has no startedAt timestamp`,\n tasks: [name],\n });\n }\n\n if (ts.status === TASK_STATUS.COMPLETED && !ts.completedAt) {\n issues.push({\n severity: 'warning',\n code: 'COMPLETED_WITHOUT_TIMESTAMP',\n message: `Task \"${name}\" is completed but has no completedAt timestamp`,\n tasks: [name],\n });\n }\n\n if (ts.status === TASK_STATUS.FAILED) {\n if (!ts.failedAt) {\n issues.push({\n severity: 'warning',\n code: 'FAILED_WITHOUT_INFO',\n message: `Task \"${name}\" is failed but has no failedAt timestamp`,\n tasks: [name],\n });\n }\n if (!ts.error) {\n issues.push({\n severity: 'info',\n code: 'FAILED_WITHOUT_INFO',\n message: `Task \"${name}\" is failed but has no error message`,\n tasks: [name],\n });\n }\n }\n }\n\n // ---- 4. Available outputs consistency ----\n // Compute what outputs SHOULD be available based on completed tasks\n const expectedOutputs = new Set<string>();\n for (const name of taskNames) {\n const ts = state.tasks[name];\n if (ts?.status === TASK_STATUS.COMPLETED) {\n for (const token of getProvides(tasks[name])) {\n expectedOutputs.add(token);\n }\n }\n }\n\n const actualOutputs = new Set(state.availableOutputs);\n\n // Phantom outputs: in state but no completed task produced them\n // (tokens injected via inject-tokens are valid, so only flag those\n // that also aren't in ANY task's provides list — truly phantom)\n const allProducible = new Set<string>();\n for (const taskConfig of Object.values(tasks)) {\n for (const t of getProvides(taskConfig)) allProducible.add(t);\n if (taskConfig.on) {\n for (const tokens of Object.values(taskConfig.on)) {\n for (const t of tokens) allProducible.add(t);\n }\n }\n if (taskConfig.on_failure) {\n for (const t of taskConfig.on_failure) allProducible.add(t);\n }\n }\n\n for (const token of actualOutputs) {\n if (!expectedOutputs.has(token) && !allProducible.has(token)) {\n // Token is available but no task can produce it — likely injected, just info\n issues.push({\n severity: 'info',\n code: 'INJECTED_TOKEN',\n message: `Token \"${token}\" is available but no task in the graph can produce it (likely injected)`,\n tokens: [token],\n });\n }\n }\n\n // Missing outputs: a completed task's provides aren't in available outputs\n for (const token of expectedOutputs) {\n if (!actualOutputs.has(token)) {\n issues.push({\n severity: 'warning',\n code: 'MISSING_OUTPUT',\n message: `Token \"${token}\" should be available (its producer completed) but is not in availableOutputs`,\n tokens: [token],\n });\n }\n }\n\n // ---- 5. Execution count integrity ----\n for (const name of taskNames) {\n const ts = state.tasks[name];\n if (!ts) continue;\n\n if (ts.executionCount < 0) {\n issues.push({\n severity: 'error',\n code: 'INVALID_EXECUTION_COUNT',\n message: `Task \"${name}\" has negative execution count: ${ts.executionCount}`,\n tasks: [name],\n });\n }\n\n const maxExec = tasks[name].maxExecutions;\n if (maxExec !== undefined && ts.executionCount > maxExec) {\n issues.push({\n severity: 'error',\n code: 'EXCEEDED_MAX_EXECUTIONS',\n message: `Task \"${name}\" executed ${ts.executionCount} times, exceeding maxExecutions of ${maxExec}`,\n tasks: [name],\n });\n }\n }\n\n return buildResult(issues);\n}\n\n// ============================================================================\n// validateReactiveGraph — reactive-layer consistency\n// ============================================================================\n\n/**\n * Input for reactive graph validation.\n * Accepts the reactive graph instance plus the original options (for handler list reference).\n */\nexport interface ReactiveGraphValidationInput {\n /** The reactive graph instance to validate */\n graph: ReactiveGraph;\n /** The handler registry (handler name → handler function) */\n handlers: Record<string, unknown>;\n}\n\n/**\n * Validate reactive-graph-specific consistency.\n *\n * Checks:\n * - Every handler name referenced in taskConfig.taskHandlers exists in the registry (MISSING_HANDLER)\n * - No handlers registered that are not referenced by any task's taskHandlers (ORPHAN_HANDLER)\n * - Plus all validateLiveGraph checks on the underlying state\n */\nexport function validateReactiveGraph(input: ReactiveGraphValidationInput): GraphValidationResult {\n const { graph, handlers } = input;\n const live = graph.getState();\n const issues: GraphIssue[] = [];\n\n const tasks = getAllTasks(live.config);\n const taskNames = Object.keys(tasks);\n const handlerNames = new Set(Object.keys(handlers));\n\n // Collect all handler names referenced by any task's taskHandlers\n const referencedHandlers = new Set<string>();\n for (const name of taskNames) {\n const taskHandlers = tasks[name].taskHandlers;\n if (taskHandlers) {\n for (const h of taskHandlers) {\n referencedHandlers.add(h);\n }\n }\n }\n\n // ---- 1. Missing handlers — taskHandlers references a name not in registry ----\n for (const name of taskNames) {\n const taskHandlers = tasks[name].taskHandlers;\n if (!taskHandlers) continue; // externally driven — no handler needed\n for (const h of taskHandlers) {\n if (!handlers[h]) {\n issues.push({\n severity: 'error',\n code: 'MISSING_HANDLER',\n message: `Task \"${name}\" references handler \"${h}\" but it is not in the registry`,\n tasks: [name],\n });\n }\n }\n }\n\n // ---- 2. Orphan handlers — registered but not referenced by any task ----\n for (const name of handlerNames) {\n if (!referencedHandlers.has(name)) {\n issues.push({\n severity: 'warning',\n code: 'ORPHAN_HANDLER',\n message: `Handler \"${name}\" is registered but not referenced by any task's taskHandlers`,\n tasks: [name],\n });\n }\n }\n\n // ---- 3. Include underlying LiveGraph validation ----\n const liveResult = validateLiveGraph(live);\n issues.push(...liveResult.issues);\n\n return buildResult(issues);\n}\n\n// ============================================================================\n// Shared\n// ============================================================================\n\nfunction buildResult(issues: GraphIssue[]): GraphValidationResult {\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n return {\n valid: errors.length === 0,\n issues,\n errors,\n warnings,\n };\n}\n","/**\n * Continuous Event Graph — mutateGraph\n *\n * A higher-level batch mutation API.\n *\n * Unlike calling addNode/removeNode/injectTokens individually, mutateGraph\n * accepts a declarative array of mutations and applies them atomically.\n * This is useful for:\n * - Applying a set of structural changes + events in a single call\n * - Building mutation pipelines from external configs\n * - Reducing boilerplate when scripting graph changes\n *\n * Pattern: mutateGraph(live, mutations[]) → LiveGraph\n * Pure function — no side effects.\n */\n\nimport type { TaskConfig, GraphEvent } from '../event-graph/types.js';\nimport type { LiveGraph } from './types.js';\nimport {\n addNode,\n removeNode,\n addRequires,\n removeRequires,\n addProvides,\n removeProvides,\n injectTokens,\n drainTokens,\n resetNode,\n disableNode,\n enableNode,\n applyEvents,\n} from './core.js';\n\n// ============================================================================\n// Mutation types\n// ============================================================================\n\nexport type GraphMutation =\n | AddNodeMutation\n | RemoveNodeMutation\n | AddRequiresMutation\n | RemoveRequiresMutation\n | AddProvidesMutation\n | RemoveProvidesMutation\n | InjectTokensMutation\n | DrainTokensMutation\n | ResetNodeMutation\n | DisableNodeMutation\n | EnableNodeMutation\n | ApplyEventsMutation;\n\nexport interface AddNodeMutation {\n type: 'add-node';\n name: string;\n config: TaskConfig;\n}\n\nexport interface RemoveNodeMutation {\n type: 'remove-node';\n name: string;\n}\n\nexport interface AddRequiresMutation {\n type: 'add-requires';\n taskName: string;\n tokens: string[];\n}\n\nexport interface RemoveRequiresMutation {\n type: 'remove-requires';\n taskName: string;\n tokens: string[];\n}\n\nexport interface AddProvidesMutation {\n type: 'add-provides';\n taskName: string;\n tokens: string[];\n}\n\nexport interface RemoveProvidesMutation {\n type: 'remove-provides';\n taskName: string;\n tokens: string[];\n}\n\nexport interface InjectTokensMutation {\n type: 'inject-tokens';\n tokens: string[];\n}\n\nexport interface DrainTokensMutation {\n type: 'drain-tokens';\n tokens: string[];\n}\n\nexport interface ResetNodeMutation {\n type: 'reset-node';\n name: string;\n}\n\nexport interface DisableNodeMutation {\n type: 'disable-node';\n name: string;\n}\n\nexport interface EnableNodeMutation {\n type: 'enable-node';\n name: string;\n}\n\nexport interface ApplyEventsMutation {\n type: 'apply-events';\n events: GraphEvent[];\n}\n\n// ============================================================================\n// mutateGraph — apply mutations atomically\n// ============================================================================\n\n/**\n * Apply an ordered array of mutations to a LiveGraph, returning the new state.\n *\n * Mutations are applied in order. Each mutation can depend on the result of\n * the previous one (e.g., add a node, then inject tokens it requires).\n *\n * Pure function — does not modify the input.\n *\n * @param live - The current LiveGraph\n * @param mutations - Ordered array of mutations to apply\n * @returns The new LiveGraph after all mutations\n * @throws Error if a mutation references a non-existent task (for safety)\n */\nexport function mutateGraph(live: LiveGraph, mutations: GraphMutation[]): LiveGraph {\n let current = live;\n\n for (const mutation of mutations) {\n current = applySingleMutation(current, mutation);\n }\n\n return current;\n}\n\nfunction applySingleMutation(live: LiveGraph, mutation: GraphMutation): LiveGraph {\n switch (mutation.type) {\n case 'add-node':\n return addNode(live, mutation.name, mutation.config);\n case 'remove-node':\n return removeNode(live, mutation.name);\n case 'add-requires':\n return addRequires(live, mutation.taskName, mutation.tokens);\n case 'remove-requires':\n return removeRequires(live, mutation.taskName, mutation.tokens);\n case 'add-provides':\n return addProvides(live, mutation.taskName, mutation.tokens);\n case 'remove-provides':\n return removeProvides(live, mutation.taskName, mutation.tokens);\n case 'inject-tokens':\n return injectTokens(live, mutation.tokens);\n case 'drain-tokens':\n return drainTokens(live, mutation.tokens);\n case 'reset-node':\n return resetNode(live, mutation.name);\n case 'disable-node':\n return disableNode(live, mutation.name);\n case 'enable-node':\n return enableNode(live, mutation.name);\n case 'apply-events':\n return applyEvents(live, mutation.events);\n default:\n throw new Error(`Unknown mutation type: ${(mutation as { type: string }).type}`);\n }\n}\n","/**\n * Continuous Event Graph — Handler Factories\n *\n * Ready-made TaskHandlerFn factories for common integration patterns.\n * Each factory returns a TaskHandlerFn compatible with createReactiveGraph.\n *\n * In the callbackToken model, handlers are **initiators** — they kick off\n * background work and return 'task-initiated'. The background work calls\n * graph.resolveCallback(callbackToken, data) when done.\n *\n * Factories that wrap synchronous/async compute accept a `getGraph` getter\n * to obtain the resolveCallback reference (lazy-bound because the graph\n * doesn't exist yet at handler-creation time).\n *\n * Patterns:\n * createCallbackHandler — wrap an async function that computes data\n * createFireAndForgetHandler — side-effect-only (always resolves empty data)\n * createShellHandler — run a shell command, resolve with stdout\n * createScriptHandler — spawn a Node.js/Python script\n * createWebhookHandler — POST to a URL, resolve with response\n * createNoopHandler — always resolves immediately (testing/placeholders)\n */\n\nimport { exec, execFile } from 'node:child_process';\nimport type { TaskHandlerFn, TaskHandlerInput, TaskHandlerReturn } from './reactive.js';\n\n/** Minimal resolveCallback interface — matches ReactiveGraph.resolveCallback */\nexport interface ResolveCallbackFn {\n (callbackToken: string, data: Record<string, unknown>, errors?: string[]): void;\n}\n\n/**\n * Structured command specification for process-based handlers.\n *\n * Use this everywhere instead of raw command strings:\n * - command: the executable name or path (no embedded args)\n * - args: explicit argument array (no shell quoting needed)\n *\n * JSON config format:\n * Old: { \"command\": \"node path/to/exec.js --flag\" } ← parsed for compat by parseCommandSpec\n * New: { \"command\": \"node\", \"args\": [\"path/to/exec.js\", \"--flag\"] }\n */\nexport interface CommandSpec {\n /** Executable name or path. No embedded args. */\n command: string;\n /** Explicit argument list. No shell quoting needed. */\n args?: string[];\n /** Working directory. */\n cwd?: string;\n /** Additional environment variables merged over process.env. */\n env?: Record<string, string>;\n /** Timeout in milliseconds. */\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Callback handler — simplest pattern for plugging async functions\n// ============================================================================\n\n/**\n * Wrap a plain async function as a TaskHandlerFn.\n *\n * The function receives TaskHandlerInput and returns data.\n * The factory handles the callbackToken plumbing — it fires\n * the function in the background and calls resolveCallback.\n *\n * @param fn - Async function that computes and returns data\n * @param getResolve - Lazy getter for the resolveCallback function\n *\n * @example\n * ```ts\n * let graph: ReactiveGraph;\n * const handler = createCallbackHandler(\n * async ({ state }) => {\n * const prices = await fetchPrices(state['portfolio-form']?.symbols);\n * return { prices };\n * },\n * () => graph.resolveCallback.bind(graph),\n * );\n * graph = createReactiveGraph(config, { handlers: { fetchPrices: handler } });\n * ```\n */\nexport function createCallbackHandler(\n fn: (input: TaskHandlerInput) => Promise<Record<string, unknown>>,\n getResolve: () => ResolveCallbackFn,\n): TaskHandlerFn {\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken } = input;\n // Fire in background — do NOT await\n Promise.resolve(fn(input))\n .then(data => getResolve()(callbackToken, data))\n .catch(err => getResolve()(callbackToken, {}, [err instanceof Error ? err.message : String(err)]));\n return 'task-initiated';\n };\n}\n\n/**\n * Fire-and-forget variant — the async function is invoked but\n * the handler always resolves the task with empty data.\n * Useful for side-effect-only tasks (logging, notifications).\n *\n * @param fn - Side-effect function (logging, alerting, etc.)\n * @param getResolve - Lazy getter for the resolveCallback function\n *\n * @example\n * ```ts\n * const handler = createFireAndForgetHandler(\n * async ({ nodeId }) => { await sendSlack(`${nodeId} started`); },\n * () => graph.resolveCallback.bind(graph),\n * );\n * ```\n */\nexport function createFireAndForgetHandler(\n fn: (input: TaskHandlerInput) => Promise<void> | void,\n getResolve: () => ResolveCallbackFn,\n): TaskHandlerFn {\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken } = input;\n // Fire side-effect in background, always resolve with empty data\n Promise.resolve(fn(input))\n .then(() => getResolve()(callbackToken, {}))\n .catch(() => getResolve()(callbackToken, {})); // swallow errors — fire and forget\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Shell handler — run a shell command\n// ============================================================================\n\nexport interface ShellHandlerOptions {\n /** Shell command to run. Supports ${taskName} placeholder. */\n command: string;\n /** Working directory (default: process.cwd()) */\n cwd?: string;\n /** Additional environment variables */\n env?: Record<string, string>;\n /** Timeout in ms (default: 30000) */\n timeoutMs?: number;\n /** Map exit codes to result keys (default: 0 → 'success', non-zero → 'failure') */\n exitCodeMap?: Record<number, string>;\n /** If true, include stdout/stderr in data payload */\n captureOutput?: boolean;\n /** Lazy getter for the resolveCallback function */\n getResolve: () => ResolveCallbackFn;\n}\n\n/**\n * Create a TaskHandlerFn that runs a shell command.\n *\n * By default, exit code 0 = resolves with stdout data, non-zero = resolves with error.\n * Use exitCodeMap to map specific codes to result keys for conditional routing.\n *\n * @example\n * ```ts\n * const handler = createShellHandler({\n * command: 'python scripts/process.py --task ${taskName}',\n * cwd: '/app',\n * captureOutput: true,\n * getResolve: () => graph.resolveCallback.bind(graph),\n * });\n * ```\n */\nexport function createShellHandler(options: ShellHandlerOptions): TaskHandlerFn {\n const {\n command: commandTemplate,\n cwd,\n env,\n timeoutMs = 30_000,\n exitCodeMap,\n captureOutput = false,\n getResolve,\n } = options;\n\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken, nodeId } = input;\n const command = commandTemplate.replace(/\\$\\{taskName\\}/g, nodeId);\n\n // Fire in background\n exec(\n command,\n {\n cwd,\n env: env ? { ...process.env, ...env } : undefined,\n timeout: timeoutMs,\n maxBuffer: 10 * 1024 * 1024, // 10MB\n },\n (error, stdout, stderr) => {\n const exitCode = error?.code as number | undefined ?? (error ? 1 : 0);\n\n if (exitCode !== 0 && !exitCodeMap?.[exitCode]) {\n getResolve()(callbackToken, {}, [`Command exited with code ${exitCode}: ${stderr || error?.message}`]);\n return;\n }\n\n const data: Record<string, unknown> = {};\n if (captureOutput) {\n data.stdout = stdout;\n data.stderr = stderr;\n data.exitCode = exitCode;\n }\n\n getResolve()(callbackToken, data);\n },\n );\n\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Process handler — structured command execution (no shell)\n// ============================================================================\n\nexport interface ProcessHandlerOptions extends CommandSpec {\n /** Map exit codes to result keys (default: 0 → success, non-zero → error) */\n exitCodeMap?: Record<number, string>;\n /** If true, include stdout/stderr/exitCode in the data payload */\n captureOutput?: boolean;\n /** Lazy getter for the resolveCallback function */\n getResolve: () => ResolveCallbackFn;\n}\n\n/**\n * Create a TaskHandlerFn that spawns a process using structured command + args.\n *\n * Unlike createShellHandler, this uses execFile — no ambient shell, no quoting\n * issues, safe on Windows and Linux. ${taskName} is substituted in both the\n * command and each arg string.\n *\n * Prefer this over createShellHandler for all programmatic invocations\n * (task-executors, source fetchers, inference adapters).\n *\n * @example\n * ```ts\n * const handler = createProcessHandler({\n * command: 'node',\n * args: ['scripts/fetch.js', '--task', '${taskName}'],\n * cwd: '/app',\n * captureOutput: true,\n * getResolve: () => graph.resolveCallback.bind(graph),\n * });\n * ```\n */\nexport function createProcessHandler(options: ProcessHandlerOptions): TaskHandlerFn {\n const {\n command: commandTemplate,\n args: argsTemplate = [],\n cwd,\n env,\n timeoutMs = 30_000,\n exitCodeMap,\n captureOutput = false,\n getResolve,\n } = options;\n\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken, nodeId } = input;\n const command = commandTemplate.replace(/\\$\\{taskName\\}/g, nodeId);\n const args = argsTemplate.map(a => a.replace(/\\$\\{taskName\\}/g, nodeId));\n\n execFile(\n command,\n args,\n {\n cwd,\n env: env ? { ...process.env, ...env } : undefined,\n timeout: timeoutMs,\n maxBuffer: 10 * 1024 * 1024,\n encoding: 'utf8',\n windowsHide: true,\n },\n (error, stdout, stderr) => {\n const exitCode = error?.code as number | undefined ?? (error ? 1 : 0);\n\n if (exitCode !== 0 && !exitCodeMap?.[exitCode]) {\n getResolve()(callbackToken, {}, [`Process exited with code ${exitCode}: ${stderr || error?.message}`]);\n return;\n }\n\n const data: Record<string, unknown> = {};\n if (captureOutput) {\n data.stdout = stdout;\n data.stderr = stderr;\n data.exitCode = exitCode;\n }\n\n getResolve()(callbackToken, data);\n },\n );\n\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Script handler — spawn a script file\n// ============================================================================\n\nexport interface ScriptHandlerOptions {\n /** Path to the script file */\n scriptPath: string;\n /** Runtime to use (default: auto-detected from extension) */\n runtime?: 'node' | 'python' | 'python3' | 'bash' | 'sh';\n /** Additional CLI arguments */\n args?: string[];\n /** Working directory */\n cwd?: string;\n /** Timeout in ms (default: 60000) */\n timeoutMs?: number;\n /** If true, include stdout/stderr in data payload */\n captureOutput?: boolean;\n /** Lazy getter for the resolveCallback function */\n getResolve: () => ResolveCallbackFn;\n}\n\nfunction detectRuntime(scriptPath: string): string {\n if (scriptPath.endsWith('.js') || scriptPath.endsWith('.mjs') || scriptPath.endsWith('.ts')) return 'node';\n if (scriptPath.endsWith('.py')) return 'python3';\n if (scriptPath.endsWith('.sh')) return 'bash';\n return 'bash';\n}\n\n/**\n * Create a TaskHandlerFn that spawns a script file.\n *\n * Auto-detects the runtime from the file extension unless overridden.\n * The task name is passed as the first argument to the script,\n * followed by any additional args.\n *\n * @example\n * ```ts\n * const handler = createScriptHandler({\n * scriptPath: './scripts/etl.py',\n * args: ['--verbose'],\n * captureOutput: true,\n * getResolve: () => graph.resolveCallback.bind(graph),\n * });\n * ```\n */\nexport function createScriptHandler(options: ScriptHandlerOptions): TaskHandlerFn {\n const {\n scriptPath,\n runtime,\n args = [],\n cwd,\n timeoutMs = 60_000,\n captureOutput = false,\n getResolve,\n } = options;\n\n const resolvedRuntime = runtime ?? detectRuntime(scriptPath);\n const command = resolvedRuntime === 'node' ? process.execPath : resolvedRuntime;\n\n return createProcessHandler({\n command,\n args: [scriptPath, '${taskName}', ...args],\n cwd,\n timeoutMs,\n captureOutput,\n getResolve,\n });\n}\n\n// ============================================================================\n// Webhook handler — POST to a URL\n// ============================================================================\n\nexport interface WebhookHandlerOptions {\n /** URL to POST to. Supports ${taskName} placeholder. */\n url: string;\n /** HTTP method (default: POST) */\n method?: 'POST' | 'PUT' | 'PATCH';\n /** Additional headers */\n headers?: Record<string, string>;\n /** Timeout in ms (default: 30000) */\n timeoutMs?: number;\n /** If true, treat non-2xx status as failure */\n failOnNon2xx?: boolean;\n /** Lazy getter for the resolveCallback function */\n getResolve: () => ResolveCallbackFn;\n}\n\n/**\n * Create a TaskHandlerFn that sends an HTTP request.\n *\n * Uses native fetch (Node 18+). The task context (nodeId, config)\n * is sent as the JSON body along with the callbackToken.\n *\n * @example\n * ```ts\n * const handler = createWebhookHandler({\n * url: 'https://api.example.com/tasks/${taskName}/trigger',\n * headers: { 'Authorization': 'Bearer ...' },\n * getResolve: () => graph.resolveCallback.bind(graph),\n * });\n * ```\n */\nexport function createWebhookHandler(options: WebhookHandlerOptions): TaskHandlerFn {\n const {\n url: urlTemplate,\n method = 'POST',\n headers = {},\n timeoutMs = 30_000,\n failOnNon2xx = true,\n getResolve,\n } = options;\n\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const { callbackToken, nodeId, config } = input;\n const url = urlTemplate.replace(/\\$\\{taskName\\}/g, nodeId);\n const body = JSON.stringify({\n taskName: nodeId,\n callbackToken,\n config,\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n // Fire in background\n fetch(url, {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n body,\n signal: controller.signal,\n })\n .then(async (response) => {\n clearTimeout(timer);\n if (failOnNon2xx && !response.ok) {\n const text = await response.text().catch(() => '');\n getResolve()(callbackToken, {}, [`HTTP ${response.status}: ${text}`]);\n return;\n }\n const data = await response.json().catch(() => ({})) as Record<string, unknown>;\n getResolve()(callbackToken, data);\n })\n .catch((err) => {\n clearTimeout(timer);\n getResolve()(callbackToken, {}, [err instanceof Error ? err.message : String(err)]);\n });\n\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Noop handler — always resolves immediately\n// ============================================================================\n\n/**\n * Create a handler that always resolves immediately with static data.\n * Useful for testing, placeholders, or passthrough tasks.\n *\n * @param getResolve - Lazy getter for the resolveCallback function\n * @param staticData - Optional static data to resolve with\n */\nexport function createNoopHandler(\n getResolve: () => ResolveCallbackFn,\n staticData?: Record<string, unknown>,\n): TaskHandlerFn {\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n getResolve()(input.callbackToken, staticData ?? {});\n return 'task-initiated';\n };\n}\n","/**\n * schema-validator — Full JSON Schema validation for LiveCards nodes.\n *\n * Uses AJV to validate against the published live-cards.schema.json.\n * For a lightweight sync check without AJV, use `CardCompute.validate()` instead.\n *\n * @example\n * ```typescript\n * import { validateLiveCardSchema } from 'yaml-flow/card-compute';\n *\n * const result = validateLiveCardSchema(node);\n * if (!result.ok) console.error(result.errors);\n * ```\n */\n\nimport type { ValidationResult } from './index.js';\nimport liveCardsSchema from '../../schema/live-cards.schema.json';\nimport Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { createRequire } from 'module';\nconst _require = createRequire(import.meta.url);\nconst jsonata: (expr: string) => { evaluate: (data: unknown) => unknown } = _require('./jsonata-sync.cjs');\n\ntype AjvValidateFunction = {\n (data: unknown): boolean;\n errors?: Array<{ instancePath?: string; message?: string }> | null;\n};\n\nlet _compiled: AjvValidateFunction | null = null;\n\nconst KNOWN_NAMESPACES = [\n 'card_data',\n 'requires',\n 'fetched_sources',\n 'computed_values',\n 'source_defs',\n] as const;\n\ntype KnownNamespace = typeof KNOWN_NAMESPACES[number];\n\nconst NAMESPACE_REFERENCE_RE = /\\b(card_data|requires|fetched_sources|computed_values|source_defs)\\b/g;\nconst ROOT_PATH_NAMESPACE_RE = /^\\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\\.|$)/;\n\nfunction referencedNamespaces(expression: string): Set<KnownNamespace> {\n const namespaces = new Set<KnownNamespace>();\n let match: RegExpExecArray | null;\n NAMESPACE_REFERENCE_RE.lastIndex = 0;\n while ((match = NAMESPACE_REFERENCE_RE.exec(expression)) !== null) {\n namespaces.add(match[1] as KnownNamespace);\n }\n return namespaces;\n}\n\nfunction parseRootPathNamespace(pathValue: string): KnownNamespace | null {\n const match = ROOT_PATH_NAMESPACE_RE.exec(pathValue);\n return match ? (match[1] as KnownNamespace) : null;\n}\n\nfunction validateJsonataExprWithNamespaces(\n expr: string,\n path: string,\n allowedNamespaces: Set<KnownNamespace>,\n errors: string[],\n): void {\n try {\n jsonata(expr);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n errors.push(`${path}: invalid JSONata expression (${message})`);\n return;\n }\n\n const usedNamespaces = referencedNamespaces(expr);\n for (const namespace of usedNamespaces) {\n if (!allowedNamespaces.has(namespace)) {\n errors.push(`${path}: disallowed namespace \"${namespace}\" in expression`);\n }\n }\n}\n\nfunction walkViewPathReferences(\n value: unknown,\n path: string,\n errors: string[],\n): void {\n if (Array.isArray(value)) {\n value.forEach((entry, index) => {\n walkViewPathReferences(entry, `${path}/${index}`, errors);\n });\n return;\n }\n\n if (typeof value === 'string') {\n const rootNamespace = parseRootPathNamespace(value);\n if (!rootNamespace) return;\n if (!new Set<KnownNamespace>(['card_data', 'requires', 'computed_values']).has(rootNamespace)) {\n errors.push(`${path}: disallowed namespace \"${rootNamespace}\" in view reference`);\n }\n return;\n }\n\n if (!value || typeof value !== 'object') return;\n\n const record = value as Record<string, unknown>;\n for (const [key, next] of Object.entries(record)) {\n walkViewPathReferences(next, `${path}/${key}`, errors);\n }\n}\n\nfunction getValidator(): AjvValidateFunction {\n if (_compiled) return _compiled;\n const ajv = new Ajv({ allErrors: true });\n addFormats(ajv);\n _compiled = ajv.compile(liveCardsSchema);\n return _compiled;\n}\n\n/**\n * Validate a node against the full LiveCards JSON Schema (draft-07).\n *\n * Requires `ajv` and `ajv-formats` to be installed.\n * Returns the same `ValidationResult` shape as `CardCompute.validate()`.\n */\nexport function validateLiveCardSchema(\n node: unknown,\n): ValidationResult {\n const validate = getValidator();\n const valid = validate(node);\n\n const errors = (validate.errors ?? []).map(e => {\n const path = e.instancePath || '/';\n return `${path}: ${e.message ?? 'unknown error'}`;\n });\n\n // JSON Schema draft-07 cannot enforce per-property uniqueness across array items.\n // Check bindTo and outputFile uniqueness here after the AJV structural pass.\n if (node && typeof node === 'object' && !Array.isArray(node)) {\n const source_defs = (node as Record<string, unknown>).source_defs;\n if (Array.isArray(source_defs)) {\n const bindTos = new Set<string>();\n const outputFiles = new Set<string>();\n source_defs.forEach((src, i) => {\n if (!src || typeof src !== 'object' || Array.isArray(src)) return;\n const s = src as Record<string, unknown>;\n if (typeof s.bindTo === 'string' && s.bindTo) {\n if (bindTos.has(s.bindTo)) {\n errors.push(`/source_defs/${i}/bindTo: bindTo \"${s.bindTo}\" must be unique across all source_defs`);\n }\n bindTos.add(s.bindTo);\n }\n if (typeof s.outputFile === 'string' && s.outputFile) {\n if (outputFiles.has(s.outputFile)) {\n errors.push(`/source_defs/${i}/outputFile: outputFile \"${s.outputFile}\" must be unique across all source_defs`);\n }\n outputFiles.add(s.outputFile);\n }\n });\n }\n }\n\n if (!valid || errors.length > 0) return { ok: false, errors };\n return { ok: true, errors: [] };\n}\n\n/**\n * Validate JSONata expressions in compute[] by compiling with the same parser used at runtime.\n */\nexport function validateLiveCardRuntimeExpressions(\n node: unknown,\n): ValidationResult {\n const errors: string[] = [];\n\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n return { ok: true, errors: [] };\n }\n\n const asRecord = node as Record<string, unknown>;\n\n const compute = asRecord.compute;\n if (Array.isArray(compute)) {\n compute.forEach((step, i) => {\n if (!step || typeof step !== 'object' || Array.isArray(step)) return;\n const expr = (step as Record<string, unknown>).expr;\n if (typeof expr !== 'string' || expr.trim().length === 0) return;\n validateJsonataExprWithNamespaces(\n expr,\n `/compute/${i}/expr`,\n new Set<KnownNamespace>(['card_data', 'requires', 'fetched_sources', 'computed_values']),\n errors,\n );\n });\n }\n\n // Validate provides[].ref paths use a valid root namespace.\n const VALID_PROVIDES_SRC_NAMESPACES = new Set<KnownNamespace>([\n 'card_data', 'requires', 'fetched_sources', 'computed_values',\n ]);\n const provides = asRecord.provides;\n if (Array.isArray(provides)) {\n provides.forEach((entry, i) => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return;\n const ref = (entry as Record<string, unknown>).ref;\n if (typeof ref !== 'string' || ref.trim().length === 0) return;\n const rootNamespace = parseRootPathNamespace(ref);\n if (rootNamespace === null) {\n errors.push(`/provides/${i}/ref: path \"${ref}\" must start with a valid namespace (${[...VALID_PROVIDES_SRC_NAMESPACES].join(', ')})`);\n } else if (!VALID_PROVIDES_SRC_NAMESPACES.has(rootNamespace)) {\n errors.push(`/provides/${i}/ref: disallowed namespace \"${rootNamespace}\" in path \"${ref}\" (valid: ${[...VALID_PROVIDES_SRC_NAMESPACES].join(', ')})`);\n }\n });\n }\n\n const view = asRecord.view;\n if (view && typeof view === 'object' && !Array.isArray(view)) {\n walkViewPathReferences(view, '/view', errors);\n }\n\n // Validate source_defs[i].projections values: each must be a JSONata expression rooted at\n // card_data or requires only. fetched_sources/computed_values/source_defs are not\n // valid here because sources run before those namespaces exist.\n const VALID_PROJECTION_NAMESPACES = new Set<KnownNamespace>(['card_data', 'requires']);\n const source_defs = asRecord.source_defs;\n if (Array.isArray(source_defs)) {\n source_defs.forEach((srcDef, i) => {\n if (!srcDef || typeof srcDef !== 'object' || Array.isArray(srcDef)) return;\n const projections = (srcDef as Record<string, unknown>).projections;\n if (!projections || typeof projections !== 'object' || Array.isArray(projections)) return;\n for (const [key, exprVal] of Object.entries(projections as Record<string, unknown>)) {\n if (typeof exprVal !== 'string' || exprVal.trim().length === 0) continue;\n validateJsonataExprWithNamespaces(\n exprVal,\n `/source_defs/${i}/projections/${key}`,\n VALID_PROJECTION_NAMESPACES,\n errors,\n );\n }\n });\n }\n\n return { ok: errors.length === 0, errors };\n}\n\nexport function validateLiveCard(\n node: unknown,\n): ValidationResult {\n return validateLiveCardDefinition(node);\n}\n\n/**\n * Full validation for live card definitions:\n * 1) JSON Schema structure/contract checks\n * 2) Runtime JSONata parser compatibility checks for compute expressions\n */\nexport function validateLiveCardDefinition(\n node: unknown,\n): ValidationResult {\n const schema = validateLiveCardSchema(node);\n if (!schema.ok) return schema;\n\n const runtime = validateLiveCardRuntimeExpressions(node);\n if (!runtime.ok) return { ok: false, errors: runtime.errors };\n\n return { ok: true, errors: [] };\n}\n","/**\n * card-compute — JSONata-powered compute engine for LiveCards nodes.\n *\n * Isomorphic: works in browser, Node.js, and bundlers.\n * No DOM dependency. Compute expressions are JSONata strings.\n *\n * @example\n * ```typescript\n * import { CardCompute } from 'yaml-flow/card-compute';\n *\n * const node = {\n * id: 'sales',\n * card_data: { data: [{ revenue: 100 }, { revenue: 200 }] },\n * compute: [\n * { bindTo: 'total', expr: '$sum(card_data.data.revenue)' },\n * { bindTo: 'avg', expr: '$average(card_data.data.revenue)' },\n * ],\n * };\n * await CardCompute.run(node);\n * // node.computed_values.total === 300\n * // node.computed_values.avg === 150\n * ```\n *\n * Expressions are evaluated against { card_data, requires, fetched_sources, computed_values }.\n * computed_values is ephemeral — never persisted to disk.\n */\n\nimport { createRequire } from 'module';\nconst _require = createRequire(import.meta.url);\nconst jsonata: (expr: string) => { evaluate: (data: unknown) => unknown } = _require('./jsonata-sync.cjs');\nconst jsonataSync = jsonata;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A source definition: cli writes to outputFile; bindTo names the fetched_sources.* key in compute context. Both bindTo and outputFile must be unique across source_defs in a card. */\nexport interface ComputeSource {\n bindTo: string;\n outputFile: string;\n cli?: string;\n // Deprecated alias retained for compatibility with older cards.\n script?: string;\n optionalForCompletionGating?: boolean;\n /** Named data projections: each key maps to a JSONata expression rooted at card_data or requires.\n * The engine evaluates these before spawning the executor and passes results as _projections. */\n projections?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/** Options for CardCompute.run() */\nexport interface RunOptions {\n /** Pre-loaded source results map (keyed by bindTo). Use in browser or when caller loads files. */\n sourcesData?: Record<string, unknown>;\n}\n\n/** A single compute step: bindTo names the computed_values key; expr is a JSONata expression. */\nexport interface ComputeStep {\n bindTo: string;\n expr: string;\n}\n\n/** Minimal node shape expected by CardCompute. */\nexport interface ComputeNode {\n id?: string;\n card_data?: Record<string, unknown>;\n requires?: Record<string, unknown>;\n source_defs?: ComputeSource[];\n compute?: ComputeStep[];\n computed_values?: Record<string, unknown>;\n /** Ephemeral: populated by run() from sourcesData option. Never persisted. */\n _sourcesData?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Deep path utilities\n// ---------------------------------------------------------------------------\n\nfunction deepGet(obj: unknown, path: string): unknown {\n if (!path || !obj) return undefined;\n const parts = path.split('.');\n let cur: unknown = obj;\n for (let i = 0; i < parts.length; i++) {\n if (cur == null) return undefined;\n cur = (cur as Record<string, unknown>)[parts[i]];\n }\n return cur;\n}\n\nfunction deepSet(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if (cur[parts[i]] == null || typeof cur[parts[i]] !== 'object') cur[parts[i]] = {};\n cur = cur[parts[i]] as Record<string, unknown>;\n }\n cur[parts[parts.length - 1]] = value;\n}\n\n// ---------------------------------------------------------------------------\n// Engine — JSONata-based async evaluation\n// ---------------------------------------------------------------------------\n\n/**\n * Run all compute steps on a node.\n * Each step's expr is evaluated against { card_data, requires, fetched_sources, computed_values }.\n * Results are written to node.computed_values[bindTo].\n * computed_values and _sourcesData are reset on each call — ephemeral, never persisted.\n *\n * @param options.sourcesData Pre-loaded map of { [bindTo]: data } for fetched_sources namespace.\n * In Node/CLI: loaded from outputFiles by the caller (card-handler).\n * In browser: passed in by the caller (e.g. from fetch results).\n */\nasync function run(node: ComputeNode, options?: RunOptions): Promise<ComputeNode> {\n if (!node?.compute?.length) return node;\n if (!node.card_data) node.card_data = {};\n node.computed_values = {};\n node._sourcesData = options?.sourcesData ?? {};\n\n // Context passed to JSONata. Structural keys take precedence over any user data.\n const _requires = node.requires ?? {};\n const ctx: Record<string, unknown> = {\n card_data: node.card_data,\n requires: _requires,\n expects_data: _requires, // alias: same reference as requires\n fetched_sources: node._sourcesData,\n data: node.computed_values, // alias: same reference as computed_values\n computed_values: node.computed_values,\n };\n\n for (const step of node.compute) {\n try {\n const val = await jsonata(step.expr).evaluate(ctx);\n deepSet(node.computed_values, step.bindTo, val);\n ctx.computed_values = node.computed_values; // subsequent steps see earlier results\n // ctx.data is the same reference as node.computed_values — already in sync\n } catch (err) {\n console.error(`CardCompute.run error on \"${node.id ?? '?'}.${step.bindTo}\":`, err);\n }\n }\n\n return node;\n}\n\n/**\n * Synchronous version of run() — uses a vendored sync JSONata build\n * (async/await stripped from jsonata.js since all built-in functions\n * are CPU-only).\n *\n * Same semantics as `run()`: evaluates all compute steps, populates\n * `node.computed_values`, returns the mutated node.\n *\n * @returns `{ ok: true, node }` when all steps evaluated successfully.\n * `{ ok: false, node }` is currently never returned but reserved\n * for future use if an expression requires true async evaluation.\n */\nfunction runSync(\n node: ComputeNode,\n options?: RunOptions,\n): { ok: boolean; node: ComputeNode; errors?: Array<{ bindTo: string; error: string }> } {\n if (!node?.compute?.length) return { ok: true, node };\n if (!node.card_data) node.card_data = {};\n node.computed_values = {};\n node._sourcesData = options?.sourcesData ?? {};\n\n const _requires2 = node.requires ?? {};\n const ctx: Record<string, unknown> = {\n card_data: node.card_data,\n requires: _requires2,\n expects_data: _requires2, // alias: same reference as requires\n fetched_sources: node._sourcesData,\n data: node.computed_values, // alias: same reference as computed_values\n computed_values: node.computed_values,\n };\n\n const errors: Array<{ bindTo: string; error: string }> = [];\n for (const step of node.compute) {\n try {\n const val = jsonataSync(step.expr).evaluate(ctx);\n deepSet(node.computed_values, step.bindTo, val);\n ctx.computed_values = node.computed_values;\n // ctx.data is the same reference as node.computed_values — already in sync\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n errors.push({ bindTo: step.bindTo, error: msg });\n console.error(`CardCompute.runSync error on \"${node.id ?? '?'}.${step.bindTo}\":`, err);\n }\n }\n\n return errors.length > 0 ? { ok: true, node, errors } : { ok: true, node };\n}\n\n/**\n * Evaluate a single JSONata expression against a node's context.\n * Context is { card_data, requires, fetched_sources, computed_values }.\n */\nasync function evalExpr(\n expr: string,\n node: ComputeNode,\n vars?: Record<string, unknown>,\n): Promise<unknown> {\n const ctx: Record<string, unknown> = {\n ...(vars ?? {}),\n card_data: node.card_data ?? {},\n requires: node.requires ?? {},\n fetched_sources: node._sourcesData ?? {},\n computed_values: node.computed_values ?? {},\n };\n return jsonata(expr).evaluate(ctx);\n}\n\n// ---------------------------------------------------------------------------\n// resolve — synchronous deep-get from node\n// ---------------------------------------------------------------------------\n\nfunction resolve(node: ComputeNode, path: string): unknown {\n if (path.startsWith('fetched_sources.')) {\n return deepGet(node._sourcesData ?? {}, path.slice('fetched_sources.'.length));\n }\n\n return deepGet(node, path);\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\n/** Result of validateNode — ok: true means valid, ok: false has errors[]. */\nexport interface ValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nconst VALID_ELEMENT_KINDS = new Set([\n 'metric', 'table', 'editable-table', 'chart', 'form', 'filter', 'list',\n 'notes', 'todo', 'alert', 'narrative', 'badge', 'text',\n 'markdown', 'ref', 'custom', 'actions',\n]);\n\nconst ALLOWED_KEYS = new Set(['id', 'meta', 'requires', 'provides', 'view', 'card_data', 'compute', 'source_defs']);\n\nfunction validateNode(node: unknown): ValidationResult {\n const errors: string[] = [];\n\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n return { ok: false, errors: ['Node must be a non-null object'] };\n }\n\n const n = node as Record<string, unknown>;\n\n if (typeof n.id !== 'string' || !n.id) errors.push('id: required, must be a non-empty string');\n\n for (const key of Object.keys(n)) {\n if (!ALLOWED_KEYS.has(key)) errors.push(`Unknown top-level key: \"${key}\"`);\n }\n\n if (n.card_data == null || typeof n.card_data !== 'object' || Array.isArray(n.card_data)) {\n errors.push('card_data: required, must be an object');\n }\n\n if (n.meta != null) {\n if (typeof n.meta !== 'object' || Array.isArray(n.meta)) {\n errors.push('meta: must be an object');\n } else {\n const meta = n.meta as Record<string, unknown>;\n if (meta.title != null && typeof meta.title !== 'string') errors.push('meta.title: must be a string');\n if (meta.tags != null && !Array.isArray(meta.tags)) errors.push('meta.tags: must be an array');\n }\n }\n\n if (n.requires != null && !Array.isArray(n.requires)) errors.push('requires: must be an array of strings');\n\n if (n.provides != null) {\n if (!Array.isArray(n.provides)) {\n errors.push('provides: must be an array of { bindTo, ref } bindings');\n } else {\n (n.provides as unknown[]).forEach((p, i) => {\n if (!p || typeof p !== 'object' || Array.isArray(p)) {\n errors.push(`provides[${i}]: must be an object with bindTo and ref`);\n } else {\n const b = p as Record<string, unknown>;\n if (typeof b.bindTo !== 'string' || !b.bindTo) errors.push(`provides[${i}]: missing required \"bindTo\" string`);\n if (typeof b.ref !== 'string' || !b.ref) errors.push(`provides[${i}]: missing required \"ref\" string`);\n }\n });\n }\n }\n\n // compute — ordered array of { bindTo, expr } steps\n if (n.compute != null) {\n if (!Array.isArray(n.compute)) {\n errors.push('compute: must be an array of compute steps');\n } else {\n (n.compute as unknown[]).forEach((step, i) => {\n if (!step || typeof step !== 'object' || Array.isArray(step)) {\n errors.push(`compute[${i}]: must be a compute step object`);\n } else {\n const s = step as Record<string, unknown>;\n if (typeof s.bindTo !== 'string' || !s.bindTo) errors.push(`compute[${i}]: missing required \"bindTo\" property`);\n if (typeof s.expr !== 'string' || !s.expr) errors.push(`compute[${i}]: missing required \"expr\" string (JSONata expression)`);\n }\n });\n }\n }\n\n if (n.source_defs != null) {\n if (!Array.isArray(n.source_defs)) {\n errors.push('source_defs: must be an array');\n } else {\n const bindTos = new Set<string>();\n const outputFiles = new Set<string>();\n (n.source_defs as unknown[]).forEach((src, i) => {\n if (!src || typeof src !== 'object' || Array.isArray(src)) {\n errors.push(`source_defs[${i}]: must be an object`);\n } else {\n const s = src as Record<string, unknown>;\n if (typeof s.bindTo !== 'string' || !s.bindTo) {\n errors.push(`source_defs[${i}]: missing required \"bindTo\" property`);\n } else {\n if (bindTos.has(s.bindTo)) {\n errors.push(`source_defs[${i}]: bindTo \"${s.bindTo}\" is not unique across source_defs`);\n }\n bindTos.add(s.bindTo);\n }\n if (typeof s.outputFile !== 'string' || !s.outputFile) {\n errors.push(`source_defs[${i}]: missing required \"outputFile\" property`);\n } else {\n if (outputFiles.has(s.outputFile)) {\n errors.push(`source_defs[${i}]: outputFile \"${s.outputFile}\" is not unique across source_defs`);\n }\n outputFiles.add(s.outputFile);\n }\n if (s.optionalForCompletionGating != null && typeof s.optionalForCompletionGating !== 'boolean') {\n errors.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);\n }\n }\n });\n }\n }\n\n if (n.view != null) {\n if (typeof n.view !== 'object' || Array.isArray(n.view)) {\n errors.push('view: must be an object');\n } else {\n const view = n.view as Record<string, unknown>;\n if (!Array.isArray(view.elements) || view.elements.length === 0) {\n errors.push('view.elements: required, must be a non-empty array');\n } else {\n (view.elements as Record<string, unknown>[]).forEach((elem, i) => {\n if (!elem || typeof elem !== 'object') { errors.push(`view.elements[${i}]: must be an object`); return; }\n if (!elem.kind || typeof elem.kind !== 'string') {\n errors.push(`view.elements[${i}].kind: required, must be a string`);\n } else if (!VALID_ELEMENT_KINDS.has(elem.kind as string)) {\n errors.push(`view.elements[${i}].kind: unknown kind \"${elem.kind}\". Valid: ${[...VALID_ELEMENT_KINDS].join(', ')}`);\n }\n if (elem.data != null && (typeof elem.data !== 'object' || Array.isArray(elem.data))) {\n errors.push(`view.elements[${i}].data: must be an object`);\n }\n });\n }\n if (view.layout != null && (typeof view.layout !== 'object' || Array.isArray(view.layout))) errors.push('view.layout: must be an object');\n if (view.features != null && (typeof view.features !== 'object' || Array.isArray(view.features))) errors.push('view.features: must be an object');\n }\n }\n\n return { ok: errors.length === 0, errors };\n}\n\n/**\n * Enrich source_defs with execution context for template interpolation and prompt rendering.\n * Pure function: no side effects, returns new enriched source_defs array.\n * \n * @param source_defs - Array of source definitions\n * @param context - Execution context containing requires, sourcesData, computed_values\n * @returns Promise resolving to a new array of source_defs with _projections attached.\n * Each _projections entry is the evaluated result of the corresponding projections expression.\n */\nasync function enrichSources(\n source_defs: any[] | undefined,\n context: {\n card_data?: Record<string, any>;\n requires?: Record<string, any>;\n sourcesData?: Record<string, any>; // unused post-projections, kept for call-site compat\n computed_values?: Record<string, any>; // unused post-projections, kept for call-site compat\n }\n): Promise<any[]> {\n if (!source_defs || source_defs.length === 0) return [];\n\n const evalCtx = {\n card_data: context.card_data ?? {},\n requires: context.requires ?? {},\n };\n\n return Promise.all(\n source_defs.map(async (src: any) => {\n const _projections: Record<string, unknown> = {};\n if (src.projections && typeof src.projections === 'object' && !Array.isArray(src.projections)) {\n for (const [key, expr] of Object.entries(src.projections as Record<string, string>)) {\n if (typeof expr === 'string' && expr.trim().length > 0) {\n try {\n _projections[key] = await jsonata(expr).evaluate(evalCtx);\n } catch {\n _projections[key] = undefined;\n }\n }\n }\n }\n return { ...src, _projections };\n })\n );\n}\n\nfunction enrichSourcesSync(\n source_defs: any[] | undefined,\n context: {\n card_data?: Record<string, any>;\n requires?: Record<string, any>;\n }\n): any[] {\n if (!source_defs || source_defs.length === 0) return [];\n\n const evalCtx = {\n card_data: context.card_data ?? {},\n requires: context.requires ?? {},\n };\n\n return source_defs.map((src: any) => {\n const _projections: Record<string, unknown> = {};\n if (src.projections && typeof src.projections === 'object' && !Array.isArray(src.projections)) {\n for (const [key, expr] of Object.entries(src.projections as Record<string, string>)) {\n if (typeof expr === 'string' && expr.trim().length > 0) {\n try {\n _projections[key] = jsonataSync(expr).evaluate(evalCtx);\n } catch {\n _projections[key] = undefined;\n }\n }\n }\n }\n return { ...src, _projections };\n });\n}\n\nexport const CardCompute = {\n run,\n runSync,\n eval: evalExpr,\n resolve,\n validate: validateNode,\n enrichSources,\n enrichSourcesSync,\n};\n\nexport {\n validateLiveCard,\n validateLiveCardSchema,\n validateLiveCardRuntimeExpressions,\n validateLiveCardDefinition,\n} from './schema-validator.js';\n\nexport default CardCompute;\n\n","/**\n * Live Cards → Reactive Graph\n *\n * Takes an array of live card JSONs (card / source nodes) and produces\n * a fully wired ReactiveGraph where:\n *\n * - Each card becomes a task in the graph\n * - card.requires → task.requires (upstream card IDs as tokens)\n * - Each card produces a token equal to its own ID\n * - Card-type nodes: handler runs CardCompute.run() on a clone of the card,\n * returns the computed state as data (auto-hashed by the reactive layer)\n * - Source-type nodes: handler uses the source definition to fetch data,\n * or falls back to a user-provided handler / noop\n *\n * The reactive graph auto-computes dataHash on every handler result,\n * so `data-changed` refresh strategy works out of the box.\n *\n * @example\n * ```ts\n * import { liveCardsToReactiveGraph } from 'yaml-flow/continuous-event-graph';\n *\n * const cards = [\n * { id: 'prices', source_defs: [{ kind: 'api', bindTo: 'raw' }], state: {} },\n * { id: 'dashboard', requires: ['prices'], state: {}, compute: [{ bindTo: 'total', fn: 'sum', ... }], view: { ... } },\n * ];\n *\n * const rg = liveCardsToReactiveGraph(cards, {\n * sourceHandlers: {\n * prices: async () => ({ data: { raw: await fetchPrices() } }),\n * },\n * });\n *\n * // One push → the whole board computes itself\n * rg.push({ type: 'inject-tokens', tokens: [], timestamp: new Date().toISOString() });\n * ```\n */\n\nimport type { GraphConfig, TaskConfig } from '../event-graph/types.js';\nimport type { ReactiveGraph, ReactiveGraphOptions, TaskHandlerFn, TaskHandlerInput, TaskHandlerReturn } from './reactive.js';\nimport { createReactiveGraph } from './reactive.js';\nimport { CardCompute } from '../card-compute/index.js';\nimport type { ComputeNode } from '../card-compute/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal live card shape accepted by this utility.\n * Unified card — no type field. Behavior from sections present.\n */\n/** A provides binding: maps a token name to a source path in the card's data namespace. */\nexport interface ProvidesBinding {\n bindTo: string;\n ref: string;\n}\n\nexport interface LiveCard {\n id: string;\n requires?: string[];\n provides?: ProvidesBinding[];\n meta?: { title?: string; tags?: string[] };\n card_data?: Record<string, unknown>;\n compute?: { bindTo: string; fn: string; [key: string]: unknown }[];\n source_defs?: {\n cli?: string;\n bindTo: string;\n outputFile: string;\n kind?: 'api' | 'websocket' | 'static' | 'llm';\n [key: string]: unknown;\n }[];\n optionalSources?: {\n cli?: string;\n bindTo: string;\n outputFile: string;\n kind?: 'api' | 'websocket' | 'static' | 'llm';\n [key: string]: unknown;\n }[];\n view?: Record<string, unknown>;\n}\n\n/**\n * A Board is a named container of live card nodes.\n * Matches the shape used by LiveCard.Board() in browser/live-cards.js:\n * LiveCard.Board(engine, el, { nodes, positions?, mode, canvas, ... })\n *\n * The `nodes` array contains the card/source JSON objects.\n * Board-level metadata (id, title, settings) is carried through to the\n * generated GraphConfig.\n */\nexport interface LiveBoard {\n /** Board identifier */\n id?: string;\n /** Human-readable title */\n title?: string;\n /** The card/source nodes on this board */\n nodes: LiveCard[];\n /** Board display mode (informational — not used by the reactive graph) */\n mode?: 'board' | 'canvas';\n /** Canvas positions keyed by node ID (informational — not used) */\n positions?: Record<string, { x?: number; y?: number; w?: number; h?: number }>;\n /** Board-level settings forwarded to GraphConfig.settings */\n settings?: Partial<GraphConfig['settings']>;\n}\n\nexport interface LiveCardsToReactiveOptions {\n /** Custom handlers for source nodes (keyed by card ID). */\n sourceHandlers?: Record<string, TaskHandlerFn>;\n /**\n * Default handler factory for source nodes without an explicit handler.\n * Called once per source card during graph construction.\n * If not provided, source nodes without explicit handlers get a noop handler\n * that returns the card's current state.\n */\n defaultSourceHandler?: (card: LiveCard) => TaskHandlerFn;\n /**\n * Custom handlers for card nodes (keyed by card ID).\n * Overrides the default CardCompute.run() behavior.\n */\n cardHandlers?: Record<string, TaskHandlerFn>;\n /**\n * If provided, upstream card state is injected into downstream cards\n * before running compute. The key is the upstream card ID and the value\n * is the upstream card's latest state.\n */\n sharedState?: Map<string, Record<string, unknown>>;\n /** Override reactive graph options (journal, callbacks, etc.) */\n reactiveOptions?: Partial<Omit<ReactiveGraphOptions, 'handlers'>>;\n /** Graph-level settings overrides */\n graphSettings?: Partial<GraphConfig['settings']>;\n /** Execution ID for the reactive graph */\n executionId?: string;\n}\n\nexport interface LiveCardsToReactiveResult {\n /** The fully wired reactive graph — ready to push events into. */\n graph: ReactiveGraph;\n /** The generated GraphConfig (for inspection/serialization). */\n config: GraphConfig;\n /** The handler map (for use with validateReactiveGraph). */\n handlers: Record<string, TaskHandlerFn>;\n /** Card lookup by ID (original references). */\n cards: Map<string, LiveCard>;\n /**\n * Shared state map: cardId → latest computed state.\n * Updated automatically by built-in handlers after each task completes.\n * Custom cardHandlers/sourceHandlers can also read upstream data directly\n * from the engine: graph.getState().state.tasks[cardId].data\n */\n sharedState: Map<string, Record<string, unknown>>;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Convert live card JSONs or a Board into a fully wired ReactiveGraph.\n *\n * Overloads:\n * liveCardsToReactiveGraph(cards[], options?) — from a flat array of cards\n * liveCardsToReactiveGraph(board, options?) — from a LiveBoard object\n */\nexport function liveCardsToReactiveGraph(\n input: LiveCard[] | LiveBoard,\n options?: LiveCardsToReactiveOptions,\n): LiveCardsToReactiveResult;\nexport function liveCardsToReactiveGraph(\n input: LiveCard[] | LiveBoard,\n options: LiveCardsToReactiveOptions = {},\n): LiveCardsToReactiveResult {\n // Detect Board vs cards array\n let cards: LiveCard[];\n let boardSettings: Partial<GraphConfig['settings']> = {};\n let boardId: string | undefined;\n\n if (!Array.isArray(input) && 'nodes' in input) {\n // It's a LiveBoard\n const board = input as LiveBoard;\n cards = board.nodes;\n boardId = board.id;\n boardSettings = board.settings ?? {};\n } else {\n cards = input as LiveCard[];\n }\n\n const {\n sourceHandlers = {},\n defaultSourceHandler,\n cardHandlers = {},\n reactiveOptions = {},\n graphSettings = {},\n executionId,\n } = options;\n\n // Card lookup\n const cardMap = new Map<string, LiveCard>();\n for (const card of cards) {\n if (cardMap.has(card.id)) {\n throw new Error(`Duplicate card ID: \"${card.id}\"`);\n }\n cardMap.set(card.id, card);\n }\n\n // Shared state: stores latest computed state per card for cross-card data flow\n const sharedState = options.sharedState ?? new Map<string, Record<string, unknown>>();\n\n // Build GraphConfig\n const tasks: Record<string, TaskConfig> = {};\n\n // Collect all provided tokens for validation + build token→cardId map\n const allTokens = new Set<string>();\n const tokenToCardId = new Map<string, string>();\n for (const card of cards) {\n for (const binding of (card.provides ?? [{ bindTo: card.id, ref: 'card_data' }])) {\n allTokens.add(binding.bindTo);\n tokenToCardId.set(binding.bindTo, card.id);\n }\n }\n\n for (const card of cards) {\n const requires = card.requires ?? [];\n\n // Validate requires reference provided tokens\n for (const req of requires) {\n if (!allTokens.has(req)) {\n throw new Error(`Card \"${card.id}\" requires \"${req}\" but no card provides that token`);\n }\n }\n\n tasks[card.id] = {\n requires: requires.length > 0 ? requires : undefined,\n provides: (card.provides ?? [{ bindTo: card.id, ref: 'card_data' }]).map(p => p.bindTo),\n taskHandlers: [card.id],\n description: card.meta?.title ?? card.id,\n };\n }\n\n const config: GraphConfig = {\n id: boardId ?? `live-cards-${Date.now()}`,\n settings: {\n completion: 'manual',\n execution_mode: 'eligibility-mode',\n ...boardSettings,\n ...graphSettings,\n },\n tasks,\n };\n\n // Build handlers\n const handlers: Record<string, TaskHandlerFn> = {};\n\n // Create a lazy resolveCallback reference — graph doesn't exist yet\n let graphRef: ReactiveGraph | null = null;\n const getResolve = () => (token: string, data: Record<string, unknown>, errors?: string[]) => {\n graphRef!.resolveCallback(token, data, errors);\n };\n\n for (const card of cards) {\n if (card.source_defs && card.source_defs.length > 0) {\n handlers[card.id] = buildSourceHandler(card, sourceHandlers, defaultSourceHandler, sharedState, getResolve);\n } else {\n handlers[card.id] = buildCardHandler(card, cardHandlers, sharedState, cardMap, tokenToCardId, getResolve);\n }\n }\n\n // Create reactive graph\n const graph = createReactiveGraph(\n config,\n {\n ...reactiveOptions,\n handlers,\n },\n executionId,\n );\n graphRef = graph;\n\n return { graph, config, handlers, cards: cardMap, sharedState };\n}\n\n// ============================================================================\n// Handler builders\n// ============================================================================\n\nfunction buildSourceHandler(\n card: LiveCard,\n sourceHandlers: Record<string, TaskHandlerFn>,\n defaultSourceHandler: ((card: LiveCard) => TaskHandlerFn) | undefined,\n sharedState: Map<string, Record<string, unknown>>,\n getResolve: () => (token: string, data: Record<string, unknown>, errors?: string[]) => void,\n): TaskHandlerFn {\n // Explicit handler takes priority\n if (sourceHandlers[card.id]) {\n const userHandler = sourceHandlers[card.id];\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n // Wrap: fire user handler logic in background, resolve with data\n // User handler is already a TaskHandlerFn — it calls resolveCallback itself\n return userHandler(input);\n };\n }\n\n // User-provided factory\n if (defaultSourceHandler) {\n const factoryHandler = defaultSourceHandler(card);\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n return factoryHandler(input);\n };\n }\n\n // Default: return current card data (for static source_defs or pre-populated data)\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n const data = { ...card.card_data };\n sharedState.set(card.id, data);\n getResolve()(input.callbackToken, data);\n return 'task-initiated';\n };\n}\n\nfunction buildCardHandler(\n card: LiveCard,\n cardHandlers: Record<string, TaskHandlerFn>,\n sharedState: Map<string, Record<string, unknown>>,\n _cardMap: Map<string, LiveCard>,\n tokenToCardId: Map<string, string>,\n getResolve: () => (token: string, data: Record<string, unknown>, errors?: string[]) => void,\n): TaskHandlerFn {\n // Explicit handler override\n if (cardHandlers[card.id]) {\n const userHandler = cardHandlers[card.id];\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n return userHandler(input);\n };\n }\n\n // Default: inject upstream data → run CardCompute → return computed values\n return async (input: TaskHandlerInput): Promise<TaskHandlerReturn> => {\n // Clone the card's data to avoid mutating the original\n const requiresData: Record<string, unknown> = {};\n const requires = card.requires ?? [];\n for (const token of requires) {\n // Resolve token to the card that provides it\n const producerId = tokenToCardId.get(token) ?? token;\n const upstreamState = sharedState.get(producerId);\n if (upstreamState) {\n requiresData[token] = upstreamState[token] ?? upstreamState;\n }\n }\n\n const computeNode: ComputeNode = {\n id: card.id,\n card_data: { ...card.card_data },\n requires: requiresData,\n compute: card.compute as ComputeNode['compute'],\n };\n\n // Run compute expressions → writes to ephemeral computed_values\n await CardCompute.run(computeNode);\n\n // Build result: if card has explicit provides bindings, resolve each src path.\n // Otherwise spread full card_data + computed_values as data.\n let resultData: Record<string, unknown>;\n if (card.provides && card.provides.length > 0) {\n resultData = {};\n for (const { bindTo, ref } of card.provides) {\n resultData[bindTo] = CardCompute.resolve(computeNode, ref);\n }\n } else {\n resultData = { ...computeNode.card_data, ...computeNode.computed_values };\n }\n\n // Also update sharedState for downstream cards that read via requiresData\n const resultState = { ...computeNode.card_data, ...computeNode.computed_values };\n sharedState.set(card.id, resultState);\n\n getResolve()(input.callbackToken, resultData);\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n"]}