yaml-flow 5.1.0 → 5.2.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.
- package/{examples/example-board/reusable-server-runtime.js → board-livecards-server-runtime.js} +42 -20
- package/{examples/example-board/reusable-board-runtime-client.js → browser/board-livecards-runtime-client.js} +6 -2
- package/browser/{board-livegraph-runtime.js → board-livegraph-engine.js} +212 -16
- package/browser/board-livegraph-engine.js.map +1 -0
- package/browser/live-cards.js +362 -38
- package/browser/live-cards.schema.json +20 -4
- package/dist/board-livegraph-runtime/index.cjs +210 -14
- package/dist/board-livegraph-runtime/index.cjs.map +1 -1
- package/dist/board-livegraph-runtime/index.d.cts +49 -5
- package/dist/board-livegraph-runtime/index.d.ts +49 -5
- package/dist/board-livegraph-runtime/index.js +209 -15
- package/dist/board-livegraph-runtime/index.js.map +1 -1
- package/dist/card-compute/index.cjs +63 -7
- package/dist/card-compute/index.cjs.map +1 -1
- package/dist/card-compute/index.d.cts +2 -2
- package/dist/card-compute/index.d.ts +2 -2
- package/dist/card-compute/index.js +63 -7
- package/dist/card-compute/index.js.map +1 -1
- package/dist/cli/board-live-cards-cli.cjs +664 -75
- package/dist/cli/board-live-cards-cli.cjs.map +1 -1
- package/dist/cli/board-live-cards-cli.d.cts +33 -5
- package/dist/cli/board-live-cards-cli.d.ts +33 -5
- package/dist/cli/board-live-cards-cli.js +661 -76
- package/dist/cli/board-live-cards-cli.js.map +1 -1
- package/dist/{constants-ozjf1Ejw.d.cts → constants-BzZUyYlp.d.cts} +1 -1
- package/dist/{constants-DuzE5n03.d.ts → constants-oCEbNpul.d.ts} +1 -1
- package/dist/continuous-event-graph/index.cjs +47 -14
- package/dist/continuous-event-graph/index.cjs.map +1 -1
- package/dist/continuous-event-graph/index.d.cts +9 -9
- package/dist/continuous-event-graph/index.d.ts +9 -9
- package/dist/continuous-event-graph/index.js +47 -14
- package/dist/continuous-event-graph/index.js.map +1 -1
- package/dist/event-graph/index.cjs +29 -12
- package/dist/event-graph/index.cjs.map +1 -1
- package/dist/event-graph/index.d.cts +5 -5
- package/dist/event-graph/index.d.ts +5 -5
- package/dist/event-graph/index.js +29 -12
- package/dist/event-graph/index.js.map +1 -1
- package/dist/index.cjs +93 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +93 -20
- package/dist/index.js.map +1 -1
- package/dist/inference/index.cjs +29 -12
- package/dist/inference/index.cjs.map +1 -1
- package/dist/inference/index.d.cts +2 -2
- package/dist/inference/index.d.ts +2 -2
- package/dist/inference/index.js +29 -12
- package/dist/inference/index.js.map +1 -1
- package/dist/{journal-NLYuqege.d.ts → journal-9HEgs7dU.d.ts} +1 -1
- package/dist/{journal-DRfJiheM.d.cts → journal-B-JCfQnh.d.cts} +1 -1
- package/dist/{live-cards-bridge-Or7fdEJV.d.ts → live-cards-bridge-CeNxiVcm.d.ts} +6 -2
- package/dist/{live-cards-bridge-vGJ6tMzN.d.cts → live-cards-bridge-z_rJCSbi.d.cts} +6 -2
- package/dist/{schedule-CMcZe5Ny.d.ts → schedule-Cszq9LYY.d.ts} +1 -1
- package/dist/{schedule-CiucyCan.d.cts → schedule-qWNL0RQh.d.cts} +1 -1
- package/dist/{types-CMFSIjpc.d.cts → types-BBhqYGhE.d.cts} +4 -0
- package/dist/{types-CMFSIjpc.d.ts → types-BBhqYGhE.d.ts} +4 -0
- package/dist/{types-BzLD8bjb.d.cts → types-CHSdoAAA.d.cts} +1 -1
- package/dist/{types-C2eJ7DAV.d.ts → types-CoW0gQl3.d.ts} +1 -1
- package/dist/{validate-DJQTQ6bP.d.ts → validate-BAVzUJWa.d.ts} +1 -1
- package/dist/{validate-ke92Cleg.d.cts → validate-Dbu7ygys.d.cts} +1 -1
- package/examples/browser/boards/portfolio-tracker/cards/portfolio-risk-assessment.json +28 -0
- package/examples/browser/boards/portfolio-tracker/cards/rebalancing-strategy.json +28 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker-inference-adapter.js +187 -0
- package/examples/browser/boards/portfolio-tracker/portfolio-tracker.js +139 -5
- package/examples/example-board/agent-instructions-cardlayout.md +28 -0
- package/examples/example-board/agent-instructions.md +603 -0
- package/examples/example-board/cards/card-concentration.json +42 -0
- package/examples/example-board/cards/card-market-prices.json +51 -0
- package/examples/example-board/cards/card-portfolio-action.json +19 -0
- package/examples/example-board/cards/card-portfolio-risks.json +19 -0
- package/examples/example-board/cards/card-portfolio-value.json +62 -0
- package/examples/example-board/cards/card-portfolio.json +44 -0
- package/examples/example-board/demo-chat-handler.js +373 -33
- package/examples/example-board/demo-server-config.json +0 -2
- package/examples/example-board/demo-server.js +46 -7
- package/examples/example-board/demo-shell-browser.html +75 -207
- package/examples/example-board/demo-shell-with-server.html +14 -9
- package/examples/example-board/demo-shell.html +1 -1
- package/examples/example-board/demo-task-executor.js +259 -41
- package/package.json +6 -2
- package/schema/live-cards.schema.json +20 -4
- package/browser/board-livegraph-runtime.js.map +0 -1
- package/examples/example-board/board.yaml +0 -23
- package/examples/example-board/bootstrap_payload.json +0 -1
- package/examples/example-board/cards/card-chain-region-alert.json +0 -39
- package/examples/example-board/cards/card-chain-region-totals.json +0 -26
- package/examples/example-board/cards/card-chain-top-region.json +0 -24
- package/examples/example-board/cards/card-ex-actions.json +0 -32
- package/examples/example-board/cards/card-ex-chart.json +0 -30
- package/examples/example-board/cards/card-ex-filter.json +0 -36
- package/examples/example-board/cards/card-ex-filtered-by-preference.json +0 -59
- package/examples/example-board/cards/card-ex-form.json +0 -91
- package/examples/example-board/cards/card-ex-list.json +0 -22
- package/examples/example-board/cards/card-ex-markdown.json +0 -17
- package/examples/example-board/cards/card-ex-metric.json +0 -19
- package/examples/example-board/cards/card-ex-narrative.json +0 -36
- package/examples/example-board/cards/card-ex-source-http.json +0 -28
- package/examples/example-board/cards/card-ex-source.json +0 -21
- package/examples/example-board/cards/card-ex-status.json +0 -35
- package/examples/example-board/cards/card-ex-table.json +0 -30
- package/examples/example-board/cards/card-ex-todo.json +0 -29
- package/examples/example-board/mock.db +0 -15
- package/examples/example-board/reusable-runtime-artifacts-adapter.js +0 -233
|
@@ -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/journal.ts","../../src/continuous-event-graph/reactive.ts","../../src/card-compute/index.ts","../../src/cli/board-live-cards-cli.ts"],"names":["updatedTask","createDefaultGraphEngineStore","requires","path","jsonata","randomUUID","fs","envelope","lockSync","decodeCallbackToken","os","child","spawn","execFileSync","execFile","resolve","__dirname","fileURLToPath","fg","outFile"],"mappings":"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","file":"board-live-cards-cli.cjs","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 } from './graph-helpers.js';\n\n/**\n * Apply task start to execution state. Pure function.\n */\nexport function applyTaskStart(state: ExecutionState, taskName: string): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\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 };\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 // Build lastConsumedHashes: snapshot the data hashes of all upstream tasks\n const lastConsumedHashes: Record<string, string> = { ...existingTask.lastConsumedHashes };\n const requires = taskConfig.requires ?? [];\n for (const token of requires) {\n // Find the task that provides this token and grab its hash\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 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) };\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 — 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 /** Stop accepting events. */\n dispose(): 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 // 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 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 });\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 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 });\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 dispose(): void {\n disposed = true;\n },\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';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A source definition: cli writes to outputFile; bindTo names the fetched_sources.* key in compute context. */\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 [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 sources?: 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 * 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', 'chart', 'form', 'filter', 'list',\n 'notes', 'todo', 'alert', 'narrative', 'badge', 'text',\n 'markdown', 'custom',\n]);\n\nconst ALLOWED_KEYS = new Set(['id', 'meta', 'requires', 'provides', 'view', 'card_data', 'compute', 'sources']);\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, src } 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 src`);\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.src !== 'string' || !b.src) errors.push(`provides[${i}]: missing required \"src\" 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.sources != null) {\n if (!Array.isArray(n.sources)) {\n errors.push('sources: must be an array');\n } else {\n (n.sources as unknown[]).forEach((src, i) => {\n if (!src || typeof src !== 'object' || Array.isArray(src)) {\n errors.push(`sources[${i}]: must be an object`);\n } else {\n const s = src as Record<string, unknown>;\n if (typeof s.bindTo !== 'string' || !s.bindTo) errors.push(`sources[${i}]: missing required \"bindTo\" property`);\n if (s.outputFile != null && typeof s.outputFile !== 'string') errors.push(`sources[${i}]: outputFile must be a string`);\n if (s.optionalForCompletionGating != null && typeof s.optionalForCompletionGating !== 'boolean') {\n errors.push(`sources[${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 sources with execution context for template interpolation and prompt rendering.\n * Pure function: no side effects, returns new enriched sources array.\n * \n * @param sources - Array of source definitions\n * @param context - Execution context containing requires, sourcesData, computed_values\n * @returns New array of sources with _requires, _sourcesData, _computed_values attached\n */\nfunction enrichSources(\n sources: any[] | undefined,\n context: {\n requires?: Record<string, any>;\n sourcesData?: Record<string, any>;\n computed_values?: Record<string, any>;\n }\n): any[] {\n if (!sources || sources.length === 0) return [];\n \n return sources.map((src: any) => ({\n ...src,\n _requires: context.requires ?? {},\n _sourcesData: context.sourcesData ?? {},\n _computed_values: context.computed_values ?? {},\n }));\n}\n\nexport const CardCompute = {\n run,\n eval: evalExpr,\n resolve,\n validate: validateNode,\n enrichSources,\n};\n\nexport {\n validateLiveCard,\n validateLiveCardSchema,\n validateLiveCardRuntimeExpressions,\n validateLiveCardDefinition,\n} from './schema-validator.js';\n\nexport default CardCompute;\n\n","/**\n * Board Live Cards — Disk persistence + CLI for ReactiveGraph.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { execFile, execFileSync, spawn } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport fg from 'fast-glob';\nimport { lockSync } from 'proper-lockfile';\nimport { restore } from '../continuous-event-graph/core.js';\nimport type { LiveGraph, LiveGraphSnapshot } from '../continuous-event-graph/types.js';\nimport type { ReactiveGraph, TaskHandlerFn } from '../continuous-event-graph/reactive.js';\nimport { createReactiveGraph } from '../continuous-event-graph/reactive.js';\nimport { createLiveGraph, snapshot } from '../continuous-event-graph/core.js';\nimport { schedule } from '../continuous-event-graph/schedule.js';\nimport type { GraphConfig, TaskConfig, GraphEvent } from '../event-graph/types.js';\nimport type { LiveCard } from '../continuous-event-graph/live-cards-bridge.js';\nimport type { Journal } from '../continuous-event-graph/journal.js';\nimport { CardCompute } from '../card-compute/index.js';\nimport type { ComputeNode, ComputeStep, ComputeSource } from '../card-compute/index.js';\n\nconst BOARD_FILE = 'board-graph.json';\nconst JOURNAL_FILE = 'board-journal.jsonl';\nconst TASK_EXECUTOR_LOG_FILE = 'task-executor.jsonl';\nconst INVENTORY_FILE = 'cards-inventory.jsonl';\nconst RUNTIME_OUT_FILE = '.runtime-out';\nconst DEFAULT_RUNTIME_OUT_DIR = 'runtime-out';\nconst RUNTIME_STATUS_FILE = 'board-livegraph-status.json';\nconst RUNTIME_CARDS_DIR = 'cards';\nconst RUNTIME_DATA_OBJECTS_DIR = 'data-objects';\nconst EMPTY_CONFIG: GraphConfig = { settings: { completion: 'manual', refreshStrategy: 'data-changed' }, tasks: {} } as GraphConfig;\n\n/** Envelope stored in board-graph.json — wraps the LiveGraph snapshot with journal pointer. */\nexport interface BoardEnvelope {\n lastDrainedJournalId: string;\n graph: LiveGraphSnapshot;\n}\n\n// ============================================================================\n// Board Journal — append-only JSONL with GUID IDs\n// ============================================================================\n\nexport interface JournalEntry {\n id: string;\n event: GraphEvent;\n}\n\nexport class BoardJournal implements Journal {\n private readonly journalPath: string;\n private lastDrainedId: string;\n\n constructor(journalPath: string, lastDrainedJournalId: string) {\n this.journalPath = journalPath;\n this.lastDrainedId = lastDrainedJournalId;\n }\n\n append(event: GraphEvent): void {\n const entry: JournalEntry = { id: randomUUID(), event };\n fs.appendFileSync(this.journalPath, JSON.stringify(entry) + '\\n', 'utf-8');\n }\n\n drain(): GraphEvent[] {\n if (!fs.existsSync(this.journalPath)) return [];\n const content = fs.readFileSync(this.journalPath, 'utf-8').trim();\n if (!content) return [];\n const entries: JournalEntry[] = content.split('\\n').map(l => JSON.parse(l));\n\n // Find the index of the last drained entry; take everything after it\n let startIdx = 0;\n if (this.lastDrainedId) {\n const drainedIdx = entries.findIndex(e => e.id === this.lastDrainedId);\n if (drainedIdx !== -1) startIdx = drainedIdx + 1;\n }\n\n const undrained = entries.slice(startIdx);\n if (undrained.length > 0) {\n this.lastDrainedId = undrained[undrained.length - 1].id;\n }\n return undrained.map(e => e.event);\n }\n\n get size(): number {\n if (!fs.existsSync(this.journalPath)) return 0;\n const content = fs.readFileSync(this.journalPath, 'utf-8').trim();\n if (!content) return 0;\n const entries: JournalEntry[] = content.split('\\n').map(l => JSON.parse(l));\n if (!this.lastDrainedId) return entries.length;\n const drainedIdx = entries.findIndex(e => e.id === this.lastDrainedId);\n return drainedIdx === -1 ? entries.length : entries.length - drainedIdx - 1;\n }\n\n get lastDrainedJournalId(): string {\n return this.lastDrainedId;\n }\n}\n\n// ============================================================================\n// Cards inventory\n// ============================================================================\n\nexport interface CardInventoryEntry {\n cardId: string;\n cardFilePath: string;\n addedAt: string;\n}\n\nexport interface CardInventoryIndex {\n byCardId: Map<string, CardInventoryEntry>;\n byCardPath: Map<string, CardInventoryEntry>;\n}\n\nexport function readCardInventory(boardDir: string): CardInventoryEntry[] {\n const inventoryPath = path.join(boardDir, INVENTORY_FILE);\n if (!fs.existsSync(inventoryPath)) return [];\n const lines = fs.readFileSync(inventoryPath, 'utf-8').split('\\n').filter(l => l.trim());\n return lines.map(l => JSON.parse(l) as CardInventoryEntry);\n}\n\nexport function lookupCardPath(boardDir: string, cardId: string): string | null {\n const entries = readCardInventory(boardDir);\n const entry = entries.find(e => e.cardId === cardId);\n return entry?.cardFilePath ?? null;\n}\n\nexport function appendCardInventory(boardDir: string, entry: CardInventoryEntry): void {\n const inventoryPath = path.join(boardDir, INVENTORY_FILE);\n const normalized: CardInventoryEntry = { ...entry, cardFilePath: path.resolve(entry.cardFilePath) };\n fs.appendFileSync(inventoryPath, JSON.stringify(normalized) + '\\n');\n}\n\nexport function buildCardInventoryIndex(boardDir: string): CardInventoryIndex {\n const byCardId = new Map<string, CardInventoryEntry>();\n const byCardPath = new Map<string, CardInventoryEntry>();\n\n for (const entry of readCardInventory(boardDir)) {\n const normalizedPath = path.resolve(entry.cardFilePath);\n const normalizedEntry: CardInventoryEntry = {\n ...entry,\n cardFilePath: normalizedPath,\n };\n\n const existingById = byCardId.get(entry.cardId);\n if (existingById && existingById.cardFilePath !== normalizedPath) {\n throw new Error(\n `Inventory invariant violation: card id \"${entry.cardId}\" maps to multiple files: ` +\n `\"${existingById.cardFilePath}\" and \"${normalizedPath}\"`\n );\n }\n\n const existingByPath = byCardPath.get(normalizedPath);\n if (existingByPath && existingByPath.cardId !== entry.cardId) {\n throw new Error(\n `Inventory invariant violation: file \"${normalizedPath}\" maps to multiple ids: ` +\n `\"${existingByPath.cardId}\" and \"${entry.cardId}\"`\n );\n }\n\n byCardId.set(entry.cardId, normalizedEntry);\n byCardPath.set(normalizedPath, normalizedEntry);\n }\n\n return { byCardId, byCardPath };\n}\n\n// ============================================================================\n// Library\n// ============================================================================\n\n/**\n * Initialize a board directory.\n * - Dir doesn't exist → create it, write empty board-graph.json\n * - Dir exists + valid board-graph.json → no-op, return 'exists'\n * - Dir exists + non-empty (no valid board-graph.json) → throw\n */\nexport function initBoard(dir: string): 'created' | 'exists' {\n const boardPath = path.join(dir, BOARD_FILE);\n\n if (fs.existsSync(boardPath)) {\n // Validate it's a real board envelope\n const envelope = JSON.parse(fs.readFileSync(boardPath, 'utf-8')) as BoardEnvelope;\n restore(envelope.graph);\n return 'exists';\n }\n\n if (fs.existsSync(dir)) {\n const entries = fs.readdirSync(dir);\n if (entries.length > 0) {\n throw new Error(`Directory \"${dir}\" is not empty and has no valid ${BOARD_FILE}`);\n }\n }\n\n fs.mkdirSync(dir, { recursive: true });\n const live = createLiveGraph(EMPTY_CONFIG);\n const snap = snapshot(live);\n const envelope: BoardEnvelope = { lastDrainedJournalId: '', graph: snap };\n fs.writeFileSync(boardPath, JSON.stringify(envelope, null, 2));\n return 'created';\n}\n\nexport function loadBoardEnvelope(dir: string): BoardEnvelope {\n const raw = fs.readFileSync(path.join(dir, BOARD_FILE), 'utf-8');\n return JSON.parse(raw) as BoardEnvelope;\n}\n\nexport function loadBoard(dir: string): LiveGraph {\n const envelope = loadBoardEnvelope(dir);\n return restore(envelope.graph);\n}\n\nexport function saveBoard(dir: string, rg: ReactiveGraph, journal: BoardJournal): void {\n const snap = rg.snapshot();\n const envelope: BoardEnvelope = {\n lastDrainedJournalId: journal.lastDrainedJournalId,\n graph: snap,\n };\n writeJsonAtomic(path.join(dir, BOARD_FILE), envelope);\n\n // Publish status snapshot in the same persistence path as board writes.\n const live = restore(snap);\n const statusObject = buildBoardStatusObject(dir, live);\n writeJsonAtomic(resolveStatusSnapshotPath(dir), statusObject);\n}\n\nfunction runtimeOutConfigPath(boardDir: string): string {\n return path.join(boardDir, RUNTIME_OUT_FILE);\n}\n\nfunction resolveConfiguredRuntimeOutDir(boardDir: string): string {\n const cfgPath = runtimeOutConfigPath(boardDir);\n if (fs.existsSync(cfgPath)) {\n const configured = fs.readFileSync(cfgPath, 'utf-8').trim();\n if (configured) {\n return path.isAbsolute(configured) ? configured : path.resolve(boardDir, configured);\n }\n }\n\n const defaultDir = path.join(boardDir, DEFAULT_RUNTIME_OUT_DIR);\n fs.writeFileSync(cfgPath, defaultDir, 'utf-8');\n return defaultDir;\n}\n\nfunction configureRuntimeOutDir(boardDir: string, runtimeOut?: string): string {\n let resolved: string;\n if (runtimeOut) {\n resolved = path.isAbsolute(runtimeOut) ? runtimeOut : path.resolve(boardDir, runtimeOut);\n } else {\n resolved = path.join(boardDir, DEFAULT_RUNTIME_OUT_DIR);\n }\n\n fs.mkdirSync(resolved, { recursive: true });\n fs.writeFileSync(runtimeOutConfigPath(boardDir), resolved, 'utf-8');\n return resolved;\n}\n\nfunction resolveStatusSnapshotPath(boardDir: string): string {\n return path.join(resolveConfiguredRuntimeOutDir(boardDir), RUNTIME_STATUS_FILE);\n}\n\nfunction resolveComputedValuesPath(boardDir: string, cardId: string): string {\n return path.join(resolveConfiguredRuntimeOutDir(boardDir), RUNTIME_CARDS_DIR, `${cardId}.computed.json`);\n}\n\nfunction resolveDataObjectsDirPath(boardDir: string): string {\n return path.join(resolveConfiguredRuntimeOutDir(boardDir), RUNTIME_DATA_OBJECTS_DIR);\n}\n\nfunction toDataObjectFileName(token: string): string {\n // Keep token recognizable in filenames while avoiding path traversal.\n return token.replace(/[\\\\/]/g, '__');\n}\n\nfunction writeRuntimeDataObjects(boardDir: string, data: Record<string, unknown>): void {\n for (const [token, payload] of Object.entries(data)) {\n if (!token) continue;\n const fileName = toDataObjectFileName(token);\n if (!fileName) continue;\n const filePath = path.join(resolveDataObjectsDirPath(boardDir), fileName);\n writeJsonAtomic(filePath, payload);\n }\n}\n\nfunction writeJsonAtomic(filePath: string, payload: unknown): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmpPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n fs.writeFileSync(tmpPath, JSON.stringify(payload, null, 2), 'utf-8');\n fs.renameSync(tmpPath, filePath);\n}\n\n/**\n * Acquire an exclusive lock on the board, run `fn`, then release.\n * Uses proper-lockfile on board-graph.json.\n */\nexport function withBoardLock<T>(boardDir: string, fn: () => T): T {\n const boardPath = path.join(boardDir, BOARD_FILE);\n const release = lockSync(boardPath, { retries: { retries: 5, minTimeout: 100 } });\n try {\n return fn();\n } finally {\n release();\n }\n}\n\n// ============================================================================\n// Standalone journal append + opportunistic drain\n// ============================================================================\n\n/**\n * Decode a callback token → { taskName } or null if malformed.\n * Mirrors the private encodeCallbackToken format in reactive.ts.\n */\nfunction decodeCallbackToken(token: string): { taskName: string } | null {\n try {\n const payload = JSON.parse(Buffer.from(token, 'base64url').toString());\n if (typeof payload?.t === 'string') return { taskName: payload.t };\n return null;\n } catch { return null; }\n}\n\n// ============================================================================\n// Source token — per-source opaque token carrying all delivery metadata\n// ============================================================================\n\nexport interface SourceTokenPayload {\n /** Original callback token from the reactive graph (encodes taskName) */\n cbk: string;\n /** Board directory (absolute path) */\n rg: string;\n /** Card id */\n cid: string;\n /** sources[].bindTo */\n b: string;\n /** sources[].outputFile (relative to boardDir) */\n d: string;\n}\n\nexport function encodeSourceToken(payload: SourceTokenPayload): string {\n return Buffer.from(JSON.stringify(payload)).toString('base64url');\n}\n\nexport function decodeSourceToken(token: string): SourceTokenPayload | null {\n try {\n const p = JSON.parse(Buffer.from(token, 'base64url').toString());\n if (typeof p?.cbk === 'string' && typeof p?.cid === 'string' && typeof p?.b === 'string' && typeof p?.d === 'string') {\n return p as SourceTokenPayload;\n }\n return null;\n } catch { return null; }\n}\n\n// ============================================================================\n// Runtime state sidecar — <cardId>.runtime.json\n// ============================================================================\n\nexport interface SourceRuntimeEntry {\n lastRequestedAt?: string;\n lastFetchedAt?: string;\n lastError?: string;\n}\n\nexport interface CardRuntimeState {\n _sources: Record<string, SourceRuntimeEntry>;\n}\n\nfunction runtimePath(boardDir: string, cardId: string): string {\n return path.join(boardDir, `${cardId}.runtime.json`);\n}\n\nfunction readRuntimeState(boardDir: string, cardId: string): CardRuntimeState {\n const p = runtimePath(boardDir, cardId);\n if (!fs.existsSync(p)) return { _sources: {} };\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')) as CardRuntimeState; }\n catch { return { _sources: {} }; }\n}\n\nfunction writeRuntimeState(boardDir: string, cardId: string, state: CardRuntimeState): void {\n fs.writeFileSync(runtimePath(boardDir, cardId), JSON.stringify(state, null, 2));\n}\n\n/**\n * Append a raw event to the journal file. No lock, no file read.\n * Safe for hundreds of concurrent callers (appendFileSync is atomic for small writes).\n */\nexport function appendEventToJournal(boardDir: string, event: GraphEvent): void {\n const journalPath = path.join(boardDir, JOURNAL_FILE);\n const entry: JournalEntry = { id: randomUUID(), event };\n fs.appendFileSync(journalPath, JSON.stringify(entry) + '\\n', 'utf-8');\n}\n\n/**\n * Read journal entries after the given ID. Pure file read, no mutation.\n */\nexport function getUndrainedEntries(boardDir: string, lastDrainedId: string): JournalEntry[] {\n const journalPath = path.join(boardDir, JOURNAL_FILE);\n if (!fs.existsSync(journalPath)) return [];\n const content = fs.readFileSync(journalPath, 'utf-8').trim();\n if (!content) return [];\n const entries: JournalEntry[] = content.split('\\n').map(l => JSON.parse(l));\n if (!lastDrainedId) return entries;\n const idx = entries.findIndex(e => e.id === lastDrainedId);\n return idx === -1 ? entries : entries.slice(idx + 1);\n}\n\nfunction determineLatestPendingAccumulated(boardDir: string): number {\n const boardPath = path.join(boardDir, BOARD_FILE);\n if (!fs.existsSync(boardPath)) return 0;\n try {\n const envelope = loadBoardEnvelope(boardDir);\n return getUndrainedEntries(boardDir, envelope.lastDrainedJournalId).length;\n } catch {\n return 0;\n }\n}\n\nfunction shouldUseShellForCommand(cmd: string, forceShell?: boolean): boolean {\n if (typeof forceShell === 'boolean') return forceShell;\n return process.platform === 'win32' && /\\.(cmd|bat)$/i.test(cmd);\n}\n\n/** Cached git-bash path (resolved once per process, persisted to disk across invocations). */\nlet _gitBashPath: string | false | undefined;\nconst GIT_BASH_CACHE_FILE = path.join(os.tmpdir(), '.board-live-cards-git-bash-cache.json');\n\nfunction findGitBash(): string | false {\n if (_gitBashPath !== undefined) return _gitBashPath;\n if (process.platform !== 'win32') return (_gitBashPath = false);\n\n // Try disk cache first\n try {\n const cached = JSON.parse(fs.readFileSync(GIT_BASH_CACHE_FILE, 'utf8'));\n if (cached.path === false || (typeof cached.path === 'string' && fs.existsSync(cached.path))) {\n return (_gitBashPath = cached.path);\n }\n } catch { /* cache miss or corrupt — probe fresh */ }\n\n const candidates = [\n process.env.SHELL,\n process.env.PROGRAMFILES && path.join(process.env.PROGRAMFILES, 'Git', 'usr', 'bin', 'bash.exe'),\n process.env.PROGRAMFILES && path.join(process.env.PROGRAMFILES, 'Git', 'bin', 'bash.exe'),\n process.env['PROGRAMFILES(X86)'] && path.join(process.env['PROGRAMFILES(X86)'], 'Git', 'bin', 'bash.exe'),\n process.env.LOCALAPPDATA && path.join(process.env.LOCALAPPDATA, 'Programs', 'Git', 'bin', 'bash.exe'),\n ];\n for (const c of candidates) {\n if (c && /bash(\\.exe)?$/i.test(c) && fs.existsSync(c)) {\n _gitBashPath = c;\n try { fs.writeFileSync(GIT_BASH_CACHE_FILE, JSON.stringify({ path: c })); } catch { /* best-effort */ }\n return _gitBashPath;\n }\n }\n _gitBashPath = false;\n try { fs.writeFileSync(GIT_BASH_CACHE_FILE, JSON.stringify({ path: false })); } catch { /* best-effort */ }\n return _gitBashPath;\n}\n\nfunction shellQuote(s: string): string {\n return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\nfunction spawnDetachedCommand(cmd: string, args: string[]): void {\n if (process.platform === 'win32') {\n const bash = findGitBash();\n if (bash) {\n // Git-bash background: no console popup, survives parent exit.\n const shellCmd = [cmd, ...args].map((a) => shellQuote(a.replace(/\\\\/g, '/'))).join(' ');\n const child = spawn(bash, ['-c', shellCmd], { detached: true, stdio: 'ignore', windowsHide: true });\n child.unref();\n return;\n }\n // Fallback: cmd /c start /b + detached so child survives parent exit.\n const child = spawn('cmd', ['/c', 'start', '/b', '', cmd, ...args], {\n detached: true,\n stdio: 'ignore',\n windowsHide: true,\n });\n child.unref();\n return;\n }\n // Unix: straightforward detached spawn.\n const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });\n child.unref();\n}\n\nfunction execCommandSync(\n cmd: string,\n args: string[],\n options?: {\n shell?: boolean;\n timeout?: number;\n encoding?: BufferEncoding;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n },\n): string {\n const output = execFileSync(cmd, args, {\n shell: shouldUseShellForCommand(cmd, options?.shell),\n timeout: options?.timeout,\n encoding: options?.encoding,\n cwd: options?.cwd,\n windowsHide: true,\n env: options?.env,\n });\n return typeof output === 'string' ? output : output.toString('utf-8');\n}\n\nfunction execCommandAsync(\n cmd: string,\n args: string[],\n callback: (err: Error | null, stdout: string, stderr: string) => void,\n): void {\n execFile(\n cmd,\n args,\n { shell: shouldUseShellForCommand(cmd), encoding: 'utf8', windowsHide: true },\n (err, stdout, stderr) => callback(err ?? null, stdout, stderr),\n );\n}\n\nfunction splitCommandLine(command: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: '\"' | '\\'' | null = null;\n\n for (const ch of command.trim()) {\n if (quote) {\n if (ch === quote) {\n quote = null;\n } else {\n current += ch;\n }\n continue;\n }\n\n if (ch === '\"' || ch === '\\'') {\n quote = ch;\n continue;\n }\n\n if (/\\s/.test(ch)) {\n if (current) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += ch;\n }\n\n if (quote) {\n throw new Error(`Unterminated quote in command: ${command}`);\n }\n\n if (current) tokens.push(current);\n return tokens;\n}\n\nfunction spawnDetachedProcessAccumulatedWorker(boardDir: string): boolean {\n const { cmd, args: cliArgs } = getCliInvocation('process-accumulated-events', ['--rg', boardDir, '--inline-loop']);\n try {\n spawnDetachedCommand(cmd, cliArgs);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function processAccumulatedEventsInlineLoop(boardDir: string, settleDelayMs = 50): Promise<boolean> {\n while (determineLatestPendingAccumulated(boardDir) > 0) {\n const ran = processAccumulatedEvents(boardDir);\n if (!ran) return false;\n await new Promise<void>(resolve => setTimeout(resolve, settleDelayMs));\n }\n return true;\n}\n\nfunction shouldAvoidDetachedProcessSpawn(): boolean {\n return process.env.BOARD_LIVE_CARDS_NO_SPAWN === '1';\n}\n\n/**\n * Run one lock-guarded processing pass for this board.\n *\n * GUARANTEE (single-pass only):\n * - At most one process performs this pass at a time (board lock).\n * - If lock is acquired, exactly one drain/apply/save cycle is executed.\n * - If lock is busy, returns false immediately (no waiting).\n *\n * This function does NOT guarantee full settlement; it only advances the baton\n * by one cycle in the relay model.\n */\nexport function processAccumulatedEvents(boardDir: string): boolean {\n const boardPath = path.join(boardDir, BOARD_FILE);\n let release: (() => void) | undefined;\n try {\n release = lockSync(boardPath, { retries: 0 });\n } catch {\n // Lock held by another process — it will drain our entries\n return false;\n }\n try {\n const { rg, journal } = createBoardReactiveGraph(boardDir);\n // Explicitly drain the external journal and push events into the reactive graph.\n // The engine never reads from external storage — the caller owns that boundary.\n const undrained = journal.drain();\n rg.pushAll(undrained);\n saveBoard(boardDir, rg, journal);\n rg.dispose();\n return true;\n } finally {\n release!();\n }\n}\n\n/**\n * Schedule continued draining until the board eventually settles.\n *\n * GUARANTEE (system-level eventual progress):\n * - Default behavior launches a detached background worker process that runs\n * `process-accumulated-events --inline-loop`.\n * - Returns quickly to caller; does not synchronously wait for settlement.\n * - Under relay assumptions, pending entries eventually drain to zero:\n * 1) at least one runner continues, 2) no crash/forced exit in relay window,\n * 3) lock remains healthy, 4) new events do not arrive forever.\n *\n * INTERNAL MODE:\n * - `inlineLoop: true` executes the while(pending) loop in the current process.\n * - Used by the worker command to avoid recursive worker spawning.\n */\nexport async function processAccumulatedEventsInfinitePass(\n boardDir: string,\n settleDelayMs = 50,\n options?: { inlineLoop?: boolean },\n): Promise<boolean> {\n if (options?.inlineLoop || shouldAvoidDetachedProcessSpawn()) {\n return processAccumulatedEventsInlineLoop(boardDir, settleDelayMs);\n }\n return spawnDetachedProcessAccumulatedWorker(boardDir);\n}\n\n/**\n * Forced drain entrypoint: first run one immediate pass, then delegate to\n * infinite-pass continuation.\n *\n * GUARANTEE:\n * - In default mode, this guarantees immediate forward progress (single pass)\n * and guaranteed scheduling of eventual continuation (background worker).\n * - In `inlineLoop` mode, this runs full in-process settle loop and returns\n * only after pending reaches zero (or lock contention aborts loop).\n */\nexport async function processAccumulatedEventsForced(\n boardDir: string,\n options?: { inlineLoop?: boolean },\n): Promise<void> {\n processAccumulatedEvents(boardDir);\n await processAccumulatedEventsInfinitePass(boardDir, 50, options);\n}\n\n// ============================================================================\n// Card transform\n// ============================================================================\n\nexport type BoardLiveCard = LiveCard;\n\n/**\n * Transform a LiveCard into a TaskConfig for the reactive graph.\n *\n * Every card gets handler: 'card-handler'.\n * The handler inspects the card and decides what to do:\n * run compute, invoke sources.\n */\nexport function liveCardToTaskConfig(card: BoardLiveCard): TaskConfig {\n const requires = card.requires;\n const provides = card.provides?.map(p => p.bindTo) ?? [];\n\n return {\n requires: requires && requires.length > 0 ? requires : undefined,\n provides,\n taskHandlers: ['card-handler'],\n description: card.meta?.title ?? card.id,\n };\n}\n\n// ============================================================================\n// Reactive graph factory\n// ============================================================================\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst REPO_ROOT = path.resolve(__dirname, '..', '..');\nconst LOCAL_TSX_CLI = path.join(REPO_ROOT, 'node_modules', 'tsx', 'dist', 'cli.mjs');\n\n/**\n * Generalized CLI invocation: determines how to invoke this script in current environment.\n * Returns { cmd, args } suitable for execFile() or execFileSync().\n */\nfunction getCliInvocation(command: string, args: string[]): { cmd: string; args: string[] } {\n const jsPath = path.join(__dirname, 'board-live-cards-cli.js');\n if (fs.existsSync(jsPath)) {\n return { cmd: process.execPath, args: [jsPath, command, ...args] };\n }\n\n const tsPath = path.join(__dirname, 'board-live-cards-cli.ts');\n if (fs.existsSync(tsPath) && fs.existsSync(LOCAL_TSX_CLI)) {\n return { cmd: process.execPath, args: [LOCAL_TSX_CLI, tsPath, command, ...args] };\n }\n\n const npxCmd = process.platform === 'win32' ? 'npx.cmd' : 'npx';\n return { cmd: npxCmd, args: ['tsx', tsPath, command, ...args] };\n}\n\nfunction invokeRunSources(boardDir: string, cardPath: string, callbackToken: string, callback: (err: Error | null) => void): void {\n const { cmd, args } = getCliInvocation('run-sources-internal', ['--card', cardPath, '--token', callbackToken, '--rg', boardDir]);\n try {\n spawnDetachedCommand(cmd, args);\n callback(null);\n } catch (err) {\n callback(err instanceof Error ? err : new Error(String(err)));\n }\n}\n\nfunction appendTaskExecutorLog(boardDir: string, hydratedSource: unknown): void {\n try {\n const entry = {\n timestamp: new Date().toISOString(),\n hydratedSource,\n };\n fs.appendFileSync(path.join(boardDir, TASK_EXECUTOR_LOG_FILE), JSON.stringify(entry) + '\\n', 'utf-8');\n } catch (logErr) {\n console.error(`[task-executor-log] append failed: ${logErr instanceof Error ? logErr.message : String(logErr)}`);\n }\n}\n\nfunction invokeSourceDataFetched(sourceToken: string, tmpFile: string, callback: (err: Error | null) => void): void {\n const { cmd, args } = getCliInvocation('source-data-fetched', ['--tmp', tmpFile, '--token', sourceToken]);\n execCommandAsync(cmd, args, (err, stdout, stderr) => {\n if (err) console.error(`[source-data-fetched] call failed:`, err.message);\n if (stdout) console.log(stdout.trim());\n if (stderr) console.error(stderr.trim());\n callback(err);\n });\n}\n\nfunction invokeSourceDataFetchFailure(sourceToken: string, reason: string, callback: (err: Error | null) => void): void {\n const { cmd, args } = getCliInvocation('source-data-fetch-failure', ['--token', sourceToken, '--reason', reason]);\n execCommandAsync(cmd, args, (err) => callback(err));\n}\n\n/**\n * Spin up a ReactiveGraph from a board directory with all handlers wired.\n *\n * Single handler:\n * card-handler — reads card.json, loads sourcesData from outputFiles, runs CardCompute,\n * checks undelivered sources, emits task-completed or spawns run-sources-internal.\n * Fire & forget — returns 'task-initiated' immediately.\n */\nexport interface BoardReactiveGraph {\n rg: ReactiveGraph;\n journal: BoardJournal;\n}\n\nexport function createBoardReactiveGraph(boardDir: string): BoardReactiveGraph {\n const envelope = loadBoardEnvelope(boardDir);\n const live = restore(envelope.graph);\n const journalPath = path.join(boardDir, JOURNAL_FILE);\n const journal = new BoardJournal(journalPath, envelope.lastDrainedJournalId);\n\n const handlers: Record<string, TaskHandlerFn> = {\n 'card-handler': async (input) => {\n const cardPath = lookupCardPath(boardDir, input.nodeId);\n if (!cardPath) return 'task-initiate-failure';\n\n const card = JSON.parse(fs.readFileSync(cardPath, 'utf-8')) as Record<string, unknown>;\n const cardId = card.id as string;\n const cardState = (card.card_data ?? {}) as Record<string, unknown>;\n const allSources: ComputeSource[] = (card.sources ?? []) as ComputeSource[];\n // optionalForCompletionGating defaults to false when absent.\n const requiredSources = allSources.filter(s => s.optionalForCompletionGating !== true);\n\n // Read (or initialise) the runtime sidecar\n const runtime = readRuntimeState(boardDir, cardId);\n let runtimeDirty = false;\n\n // ---- Handle a task-progress re-invocation (source delivery or failure) ----\n if (input.update) {\n const u = input.update;\n const bindTo = u.bindTo as string;\n if (!runtime._sources[bindTo]) runtime._sources[bindTo] = {};\n\n if (u.failure) {\n // Source fetch failed — record error, stay in-progress\n runtime._sources[bindTo].lastError = (u.reason as string | undefined) ?? 'unknown';\n delete runtime._sources[bindTo].lastFetchedAt;\n runtimeDirty = true;\n console.log(`[card-handler] source \"${bindTo}\" fetch failed: ${runtime._sources[bindTo].lastError}`);\n } else {\n // Successful delivery — dest file already renamed into place by CLI\n runtime._sources[bindTo].lastFetchedAt = (u.fetchedAt as string | undefined) ?? new Date().toISOString();\n delete runtime._sources[bindTo].lastError;\n runtimeDirty = true;\n console.log(`[card-handler] source \"${bindTo}\" delivered → ${u.dest}`);\n }\n\n if (runtimeDirty) writeRuntimeState(boardDir, cardId, runtime);\n }\n\n // ---- Load sourcesData from outputFiles ----\n const sourcesData: Record<string, unknown> = {};\n for (const src of allSources) {\n if (src.outputFile) {\n const filePath = path.join(boardDir, src.outputFile);\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, 'utf-8').trim();\n try { sourcesData[src.bindTo] = JSON.parse(raw); }\n catch { sourcesData[src.bindTo] = raw; }\n }\n }\n }\n\n // ---- Run compute ----\n // input.state[token] = the full task-completed data object from the producer\n // (e.g. { orders: [...] }). Unwrap to the specific token value so that\n // compute expressions see requires.orders = [...] not requires.orders = { orders: [...] }.\n const requires: Record<string, unknown> = {};\n for (const [token, taskData] of Object.entries(input.state ?? {})) {\n if (taskData !== null && typeof taskData === 'object' && !Array.isArray(taskData)) {\n const unwrapped = (taskData as Record<string, unknown>)[token];\n requires[token] = unwrapped !== undefined ? unwrapped : taskData;\n } else {\n requires[token] = taskData;\n }\n }\n\n const computeNode: ComputeNode = {\n id: cardId,\n card_data: { ...cardState },\n requires,\n sources: allSources,\n compute: card.compute as ComputeStep[] | undefined,\n };\n // Always populate _sourcesData so resolve(\"sources.*\") works even without compute steps.\n computeNode._sourcesData = sourcesData;\n if (card.compute) {\n await CardCompute.run(computeNode, { sourcesData });\n }\n const cvPath = resolveComputedValuesPath(boardDir, cardId);\n writeJsonAtomic(cvPath, {\n schema_version: 'v1',\n card_id: cardId,\n computed_values: computeNode.computed_values ?? {},\n });\n\n // ---- Delivery check: lastFetchedAt > lastRequestedAt for all required sources ----\n const now = new Date().toISOString();\n const undeliveredRequired = requiredSources.filter(s => {\n if (!s.outputFile) return false;\n const entry = runtime._sources[s.bindTo];\n if (!entry?.lastRequestedAt) return true; // never requested — treat as undelivered\n if (!entry.lastFetchedAt) return true; // requested but not yet fetched\n return entry.lastFetchedAt <= entry.lastRequestedAt; // stale\n });\n\n if (undeliveredRequired.length > 0) {\n // First-time or re-request: stamp lastRequestedAt for any not-yet-requested sources\n // and invoke run-sources-internal to deliver them.\n let stampedAny = false;\n for (const src of undeliveredRequired) {\n const entry = runtime._sources[src.bindTo] ?? {};\n // Only re-stamp if not already requested after last fetch (avoid double-dispatch)\n if (!entry.lastRequestedAt || (entry.lastFetchedAt && entry.lastFetchedAt >= entry.lastRequestedAt)) {\n entry.lastRequestedAt = now;\n runtime._sources[src.bindTo] = entry;\n stampedAny = true;\n }\n }\n if (stampedAny) writeRuntimeState(boardDir, cardId, runtime);\n\n // ---- Enrich sources with execution context before calling executor ----\n // Use CardCompute.enrichSources to attach requires, sourcesData, and computed_values\n // to each source so that copilot prompts and other templates can be interpolated with full context.\n const enrichedCard = { ...card };\n const enrichedSources = CardCompute.enrichSources(\n (Array.isArray(card.sources) ? card.sources : undefined),\n {\n requires,\n sourcesData,\n computed_values: computeNode.computed_values,\n }\n );\n // Preserve execution context for relative source.cli commands.\n const sourceCwd = path.dirname(cardPath);\n enrichedCard.sources = Array.isArray(enrichedSources)\n ? enrichedSources.map((src) => ({\n ...src,\n cwd: typeof src.cwd === 'string' && src.cwd ? src.cwd : sourceCwd,\n boardDir: typeof src.boardDir === 'string' && src.boardDir ? src.boardDir : boardDir,\n }))\n : enrichedSources;\n\n // Write enriched card to temp location for this invocation\n const enrichedCardPath = path.join(os.tmpdir(), `card-enriched-${cardId}-${Date.now()}.json`);\n fs.writeFileSync(enrichedCardPath, JSON.stringify(enrichedCard, null, 2), 'utf-8');\n\n invokeRunSources(boardDir, enrichedCardPath, input.callbackToken, (err) => {\n if (err) {\n console.error(`[card-handler] ${input.nodeId}:`, err.message);\n try { fs.unlinkSync(enrichedCardPath); } catch {}\n }\n });\n return 'task-initiated';\n }\n\n // ---- All required sources delivered — build provides + emit task-completed ----\n const providesBindings = (card.provides ?? []) as { bindTo: string; src: string }[];\n const data: Record<string, unknown> = {};\n for (const { bindTo, src } of providesBindings) {\n data[bindTo] = CardCompute.resolve(computeNode, src);\n }\n\n // Persist task-completed token objects for SSE/runtime consumers.\n writeRuntimeDataObjects(boardDir, data);\n\n // Spawn undelivered non-gating sources in background.\n const undeliveredOptional = allSources.filter(s => {\n if (s.optionalForCompletionGating !== true || !s.outputFile) return false;\n const entry = runtime._sources[s.bindTo];\n if (!entry?.lastRequestedAt) return true;\n if (!entry.lastFetchedAt) return true;\n return entry.lastFetchedAt <= entry.lastRequestedAt;\n });\n if (undeliveredOptional.length > 0) {\n invokeRunSources(boardDir, cardPath, input.callbackToken, (err) => {\n if (err) console.error(`[card-handler] ${input.nodeId}:`, err.message);\n });\n }\n\n appendEventToJournal(boardDir, {\n type: 'task-completed',\n taskName: input.nodeId,\n data,\n timestamp: new Date().toISOString(),\n });\n return 'task-initiated';\n },\n };\n\n const rg = createReactiveGraph(live, { handlers });\n return { rg, journal };\n}\n\n// ============================================================================\n// CLI\n// ============================================================================\n\n/**\n * Helper function to add a single card from file.\n * Throws errors instead of calling process.exit() so it can be used in tests.\n */\nfunction addSingleCardFromFile(dir: string, cardFile: string): void {\n const absCardPath = path.resolve(cardFile);\n if (!fs.existsSync(absCardPath)) {\n throw new Error(`Card file not found: ${absCardPath}`);\n }\n\n let card: BoardLiveCard;\n try {\n card = JSON.parse(fs.readFileSync(absCardPath, 'utf-8'));\n } catch (err) {\n throw new Error(`Failed to parse card file: ${absCardPath} - ${err instanceof Error ? err.message : String(err)}`);\n }\n\n if (!card.id) {\n throw new Error('Card JSON must have an \"id\" field');\n }\n\n // Check for duplicate\n const existing = readCardInventory(dir);\n if (existing.some(e => e.cardId === card.id)) {\n throw new Error(`Card \"${card.id}\" already exists in inventory`);\n }\n\n // Append to inventory first — handlers need it to look up card paths\n appendCardInventory(dir, {\n cardId: card.id,\n cardFilePath: absCardPath,\n addedAt: new Date().toISOString(),\n });\n\n // Transform card → TaskConfig\n const taskConfig = liveCardToTaskConfig(card);\n\n // 1. Append task-upsert event to journal (no lock)\n appendEventToJournal(dir, {\n type: 'task-upsert',\n taskName: card.id,\n taskConfig,\n timestamp: new Date().toISOString(),\n });\n\n console.log(`Card \"${card.id}\" added to board at ${path.resolve(dir)} (drain scheduled)`);\n console.log(` taskHandlers: [${taskConfig.taskHandlers?.join(', ') ?? ''}]`);\n console.log(` provides: [${taskConfig.provides.join(', ')}]`);\n if (taskConfig.requires) console.log(` requires: [${taskConfig.requires.join(', ')}]`);\n}\n\nfunction resolveCardGlobMatches(cardGlob: string): string[] {\n const patterns = cardGlob\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n .map(p => p.replace(/\\\\/g, '/'));\n const matches = fg.sync(patterns, {\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: false,\n });\n // fast-glob returns forward-slash paths; normalise to native so comparisons\n // against inventory entries (which use path.resolve → backslash on Windows) match.\n return [...matches].map(m => path.resolve(m)).sort((a, b) => a.localeCompare(b));\n}\n\nfunction cmdAddCards(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const cardIdx = args.indexOf('--card');\n const globIdx = args.indexOf('--card-glob');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const cardFile = cardIdx !== -1 ? args[cardIdx + 1] : undefined;\n const cardGlob = globIdx !== -1 ? args[globIdx + 1] : undefined;\n \n if (!dir || (!cardFile && !cardGlob) || (cardFile && cardGlob)) {\n throw new Error('Usage: board-live-cards add-cards --rg <dir> (--card <card.json> | --card-glob <glob>)');\n }\n\n if (cardFile) {\n addSingleCardFromFile(dir, cardFile);\n } else {\n const matches = resolveCardGlobMatches(cardGlob!);\n if (matches.length === 0) {\n throw new Error(`No card files matched glob: ${cardGlob}`);\n }\n for (const match of matches) {\n addSingleCardFromFile(dir, match);\n }\n console.log(`Added ${matches.length} cards from glob: ${cardGlob}`);\n }\n\n void processAccumulatedEventsInfinitePass(dir);\n}\n\n\nfunction cmdInit(args: string[]): void {\n const dir = args[0];\n if (!dir) { \n throw new Error('Usage: board-live-cards init <dir> [--task-executor <script>] [--chat-handler <script>] [--runtime-out <dir>]');\n }\n\n const teIdx = args.indexOf('--task-executor');\n const taskExecutor = teIdx !== -1 ? args[teIdx + 1] : undefined;\n const chIdx = args.indexOf('--chat-handler');\n const chatHandler = chIdx !== -1 ? args[chIdx + 1] : undefined;\n const roIdx = args.indexOf('--runtime-out');\n const runtimeOut = roIdx !== -1 ? args[roIdx + 1] : undefined;\n if (roIdx !== -1 && !runtimeOut) {\n throw new Error('Usage: board-live-cards init <dir> [--task-executor <script>] [--chat-handler <script>] [--runtime-out <dir>]');\n }\n\n const result = initBoard(dir);\n\n if (taskExecutor) {\n fs.writeFileSync(path.join(dir, '.task-executor'), taskExecutor, 'utf-8');\n }\n if (chatHandler) {\n fs.writeFileSync(path.join(dir, '.chat-handler'), chatHandler, 'utf-8');\n }\n\n const runtimeOutDir = configureRuntimeOutDir(dir, runtimeOut);\n // Ensure status snapshot exists right after init.\n const live = loadBoard(dir);\n writeJsonAtomic(resolveStatusSnapshotPath(dir), buildBoardStatusObject(dir, live));\n\n if (result === 'exists') {\n console.log(`Board already initialized at ${path.resolve(dir)}${taskExecutor ? ` (task-executor updated: ${taskExecutor})` : ''} (runtime-out: ${runtimeOutDir})`);\n } else {\n console.log(`Board initialized at ${path.resolve(dir)}${taskExecutor ? ` (task-executor: ${taskExecutor})` : ''} (runtime-out: ${runtimeOutDir})`);\n }\n}\n\nfunction buildBoardStatusObject(dir: string, live: LiveGraph): BoardStatusObject {\n const taskState = live.state.tasks;\n const taskConfig = live.config.tasks;\n const cardNames = Object.keys(taskState);\n const sched = schedule(live);\n\n const statusCounts = {\n completed: 0,\n failed: 0,\n in_progress: 0,\n pending: 0,\n blocked: 0,\n unresolved: 0,\n };\n\n const waitingByCard = new Map<string, string[]>();\n for (const p of sched.pending) waitingByCard.set(p.taskName, p.waitingOn);\n for (const u of sched.unresolved) waitingByCard.set(u.taskName, u.missingTokens);\n for (const b of sched.blocked) waitingByCard.set(b.taskName, b.failedTokens);\n\n const dependentsByToken = new Map<string, string[]>();\n for (const [name, cfg] of Object.entries(taskConfig)) {\n for (const token of cfg.requires ?? []) {\n const dependents = dependentsByToken.get(token) ?? [];\n dependents.push(name);\n dependentsByToken.set(token, dependents);\n }\n }\n\n const cards: BoardStatusCard[] = cardNames.sort().map((name) => {\n const state = taskState[name] as {\n status: string;\n data?: Record<string, unknown>;\n error?: string;\n startedAt?: string;\n completedAt?: string;\n failedAt?: string;\n lastUpdated?: string;\n executionCount?: number;\n retryCount?: number;\n };\n const cfg = taskConfig[name] ?? { requires: [], provides: [] };\n\n if (state.status === 'completed') statusCounts.completed += 1;\n else if (state.status === 'failed') statusCounts.failed += 1;\n else if (state.status === 'in-progress') statusCounts.in_progress += 1;\n\n const requires = cfg.requires ?? [];\n const provides = cfg.provides ?? [];\n const runtimeKeys = Object.keys(state.data ?? {}).sort();\n const requiresSatisfied = requires.filter((token) => live.state.availableOutputs.includes(token));\n const requiresMissing = requires.filter((token) => !live.state.availableOutputs.includes(token));\n const blockedBy = waitingByCard.get(name) ?? requiresMissing;\n\n const unblocks = new Set<string>();\n for (const token of provides) {\n for (const dependent of dependentsByToken.get(token) ?? []) {\n if (dependent !== name) unblocks.add(dependent);\n }\n }\n\n const lastFailureAt = state.failedAt;\n const error = state.error\n ? {\n message: state.error,\n code: 'TASK_FAILED',\n at: lastFailureAt,\n source: 'task-runtime' as const,\n }\n : undefined;\n\n return {\n name,\n status: state.status,\n error,\n requires,\n requires_satisfied: requiresSatisfied,\n requires_missing: requiresMissing,\n provides_declared: provides,\n provides_runtime: runtimeKeys,\n blocked_by: blockedBy,\n unblocks: Array.from(unblocks).sort(),\n runtime: {\n attempt_count: state.executionCount ?? 0,\n restart_count: state.retryCount ?? 0,\n in_progress_since: state.status === 'in-progress' ? (state.startedAt ?? null) : null,\n last_transition_at: state.lastUpdated ?? null,\n last_completed_at: state.completedAt ?? null,\n last_restarted_at: state.startedAt ?? null,\n status_age_ms: state.lastUpdated ? Math.max(0, Date.now() - Date.parse(state.lastUpdated)) : null,\n },\n };\n });\n\n statusCounts.pending = sched.pending.length;\n statusCounts.blocked = sched.blocked.length;\n statusCounts.unresolved = sched.unresolved.length;\n\n const fanOut = cards\n .map((c) => ({ name: c.name, fanOut: c.unblocks.length }))\n .sort((a, b) => b.fanOut - a.fanOut || a.name.localeCompare(b.name));\n const maxFanOut = fanOut.length > 0 ? fanOut[0] : { name: null, fanOut: 0 };\n\n const allRequires = new Set<string>();\n for (const cfg of Object.values(taskConfig)) {\n for (const r of cfg.requires ?? []) allRequires.add(r);\n }\n let orphanCards = 0;\n for (const [name, cfg] of Object.entries(taskConfig)) {\n const requiresNone = (cfg.requires ?? []).length === 0;\n const provides = cfg.provides ?? [];\n const feedsAny = provides.some((p) => (dependentsByToken.get(p) ?? []).some((d) => d !== name));\n if (requiresNone && !feedsAny) orphanCards += 1;\n }\n\n return {\n schema_version: 'v1',\n meta: {\n board: {\n path: path.resolve(dir),\n },\n },\n summary: {\n card_count: cardNames.length,\n completed: statusCounts.completed,\n eligible: sched.eligible.length,\n pending: statusCounts.pending,\n blocked: statusCounts.blocked,\n unresolved: statusCounts.unresolved,\n failed: statusCounts.failed,\n in_progress: statusCounts.in_progress,\n orphan_cards: orphanCards,\n topology: {\n edge_count: Array.from(allRequires).length,\n max_fan_out_card: maxFanOut.name,\n max_fan_out: maxFanOut.fanOut,\n },\n },\n cards,\n };\n}\n\nfunction cmdStatus(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const asJson = args.includes('--json');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n if (!dir) { console.error('Usage: board-live-cards status --rg <dir>'); process.exit(1); }\n\n const statusOutPath = resolveStatusSnapshotPath(dir);\n let statusObject: BoardStatusObject;\n if (fs.existsSync(statusOutPath)) {\n statusObject = JSON.parse(fs.readFileSync(statusOutPath, 'utf-8')) as BoardStatusObject;\n } else {\n // Backfill once if snapshot file doesn't exist yet.\n statusObject = buildBoardStatusObject(dir, loadBoard(dir));\n writeJsonAtomic(statusOutPath, statusObject);\n }\n\n if (asJson) {\n console.log(JSON.stringify(statusObject, null, 2));\n return;\n }\n\n console.log(`Board: ${statusObject.meta.board.path}`);\n console.log(`Tasks: ${statusObject.summary.card_count}`);\n console.log('');\n\n for (const card of statusObject.cards) {\n const dataKeys = card.provides_runtime.join(', ');\n console.log(` ${card.status.padEnd(12)} ${card.name}${dataKeys ? ` — [${dataKeys}]` : ''}`);\n }\n\n console.log('');\n console.log(`Schedule: ${statusObject.summary.eligible} eligible, ${statusObject.summary.pending} pending, ${statusObject.summary.blocked} blocked, ${statusObject.summary.unresolved} unresolved`);\n}\n\nexport interface BoardStatusCard {\n name: string;\n status: string;\n error?: {\n message: string;\n code?: string;\n at?: string;\n source?: 'task-runtime' | 'source-fetch' | 'timeout' | 'unknown';\n };\n requires: string[];\n requires_satisfied: string[];\n requires_missing: string[];\n provides_declared: string[];\n provides_runtime: string[];\n blocked_by: string[];\n unblocks: string[];\n runtime: {\n attempt_count: number;\n restart_count: number;\n in_progress_since: string | null;\n last_transition_at: string | null;\n last_completed_at: string | null;\n last_restarted_at: string | null;\n status_age_ms: number | null;\n };\n}\n\nexport interface BoardStatusObject {\n schema_version: 'v1';\n meta: {\n board: {\n path: string;\n };\n };\n summary: {\n card_count: number;\n completed: number;\n eligible: number;\n pending: number;\n blocked: number;\n unresolved: number;\n failed?: number;\n in_progress?: number;\n orphan_cards?: number;\n topology?: {\n edge_count: number;\n max_fan_out_card: string | null;\n max_fan_out: number;\n };\n };\n cards: BoardStatusCard[];\n}\n\nfunction cmdTaskCompleted(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const tokenIdx = args.indexOf('--token');\n const dataIdx = args.indexOf('--data');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n if (!dir || !token) {\n console.error('Usage: board-live-cards task-completed --rg <dir> --token <token> [--data <json>]');\n process.exit(1);\n }\n\n const decoded = decodeCallbackToken(token);\n if (!decoded) {\n console.error('Invalid callback token');\n process.exit(1);\n }\n\n const data: Record<string, unknown> = dataIdx !== -1\n ? JSON.parse(args[dataIdx + 1])\n : {};\n\n // Persist task-completed token objects for SSE/runtime consumers.\n writeRuntimeDataObjects(dir, data);\n\n // 1. Append event to journal (no lock)\n appendEventToJournal(dir, {\n type: 'task-completed',\n taskName: decoded.taskName,\n data,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsForced(dir);\n console.log('Task completed.');\n}\n\nfunction cmdTaskFailed(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const tokenIdx = args.indexOf('--token');\n const errorIdx = args.indexOf('--error');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n const errorMsg = errorIdx !== -1 ? args[errorIdx + 1] : 'unknown error';\n if (!dir || !token) {\n console.error('Usage: board-live-cards task-failed --rg <dir> --token <token> [--error <message>]');\n process.exit(1);\n }\n\n const decoded = decodeCallbackToken(token);\n if (!decoded) {\n console.error('Invalid callback token');\n process.exit(1);\n }\n\n // 1. Append event to journal (no lock)\n appendEventToJournal(dir, {\n type: 'task-failed',\n taskName: decoded.taskName,\n error: errorMsg,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsForced(dir);\n console.log('Task failed.');\n}\n\nfunction cmdRemoveCard(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const idIdx = args.indexOf('--id');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const cardId = idIdx !== -1 ? args[idIdx + 1] : undefined;\n if (!dir || !cardId) {\n console.error('Usage: board-live-cards remove-card --rg <dir> --id <card-id>');\n process.exit(1);\n }\n\n appendEventToJournal(dir, {\n type: 'task-removal',\n taskName: cardId,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsInfinitePass(dir);\n console.log(`Card \"${cardId}\" removed.`);\n}\n\nfunction cmdSourceDataFetched(args: string[]): void {\n const tmpIdx = args.indexOf('--tmp');\n const tokenIdx = args.indexOf('--token');\n const tmpFile = tmpIdx !== -1 ? args[tmpIdx + 1] : undefined;\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n if (!tmpFile || !token) {\n console.error('Usage: board-live-cards source-data-fetched --tmp <tmp-file> --token <sourceToken>');\n process.exit(1);\n }\n\n const payload = decodeSourceToken(token);\n if (!payload) {\n console.error('Invalid source token');\n process.exit(1);\n }\n\n const { cbk, rg, cid, b, d } = payload;\n const destPath = path.join(rg, d);\n\n // Atomic move: rename from tmp into boardDir destination\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\n fs.renameSync(tmpFile, destPath);\n console.log(`[source-data-fetched] ${cid}.${b} → ${d}`);\n\n const fetchedAt = new Date().toISOString();\n const cbkDecoded = decodeCallbackToken(cbk);\n if (!cbkDecoded) {\n console.error('Invalid callback token embedded in source token');\n process.exit(1);\n }\n\n appendEventToJournal(rg, {\n type: 'task-progress',\n taskName: cbkDecoded.taskName,\n update: { bindTo: b, fetchedAt, dest: d },\n timestamp: fetchedAt,\n });\n\n void processAccumulatedEventsInfinitePass(rg);\n}\n\nfunction cmdSourceDataFetchFailure(args: string[]): void {\n const tokenIdx = args.indexOf('--token');\n const reasonIdx = args.indexOf('--reason');\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n const reason = reasonIdx !== -1 ? args[reasonIdx + 1] : 'unknown';\n if (!token) {\n console.error('Usage: board-live-cards source-data-fetch-failure --token <sourceToken> [--reason <msg>]');\n process.exit(1);\n }\n\n const payload = decodeSourceToken(token);\n if (!payload) {\n console.error('Invalid source token');\n process.exit(1);\n }\n\n const { cbk, rg, cid, b } = payload;\n console.log(`[source-data-fetch-failure] ${cid}.${b}: ${reason}`);\n\n const cbkDecoded = decodeCallbackToken(cbk);\n if (!cbkDecoded) {\n console.error('Invalid callback token embedded in source token');\n process.exit(1);\n }\n\n const timestamp = new Date().toISOString();\n appendEventToJournal(rg, {\n type: 'task-progress',\n taskName: cbkDecoded.taskName,\n update: { bindTo: b, failure: true, reason },\n timestamp,\n });\n\n void processAccumulatedEventsInfinitePass(rg);\n}\n\nfunction cmdRunSources(args: string[]): void {\n const cardIdx = args.indexOf('--card');\n const tokenIdx = args.indexOf('--token');\n const rgIdx = args.indexOf('--rg');\n const cardFilePath = cardIdx !== -1 ? args[cardIdx + 1] : undefined;\n const callbackToken = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n const boardDir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n if (!cardFilePath || !callbackToken || !boardDir) {\n console.error('Usage: board-live-cards run-sources-internal --card <path> --token <token> --rg <dir>');\n process.exit(1);\n }\n\n const card = JSON.parse(fs.readFileSync(cardFilePath, 'utf-8'));\n if (path.basename(cardFilePath).startsWith('card-enriched-')) {\n try { fs.unlinkSync(cardFilePath); } catch { /* best-effort */ }\n }\n console.log(`[run-sources-internal] Processing card \"${card.id as string}\"`);\n\n // Load registered task-executor (if any)\n const executorFile = path.join(boardDir!, '.task-executor');\n const taskExecutor = fs.existsSync(executorFile) ? fs.readFileSync(executorFile, 'utf-8').trim() : undefined;\n\n type SourceDef = {\n cli?: string;\n bindTo: string;\n outputFile?: string;\n optionalForCompletionGating?: boolean;\n timeout?: number;\n cwd?: string;\n boardDir?: string;\n };\n\n function runSource(src: SourceDef): void {\n const sourceToken = encodeSourceToken({\n cbk: callbackToken!,\n rg: boardDir!,\n cid: card.id as string,\n b: src.bindTo,\n d: src.outputFile ?? '',\n });\n\n function reportFailure(reason: string): void {\n invokeSourceDataFetchFailure(sourceToken, reason, (err) => {\n if (err) console.error(`[run-sources-internal] source-data-fetch-failure call failed:`, err.message);\n });\n }\n\n function reportFetched(outFile: string): void {\n invokeSourceDataFetched(sourceToken, outFile, () => {\n // logging already done in helper\n });\n }\n\n if (taskExecutor) {\n // External task-executor registered: invoke run-source-fetch subcommand\n if (!src.outputFile) {\n console.warn(`[run-sources-internal] source \"${src.bindTo}\" has no outputFile configured — cannot deliver`);\n reportFailure('no outputFile configured');\n return;\n }\n const inFile = path.join(os.tmpdir(), `card-source-in-${src.bindTo}-${Date.now()}.json`);\n const outFile = path.join(os.tmpdir(), `card-source-out-${src.bindTo}-${Date.now()}.json`);\n const errFile = path.join(os.tmpdir(), `card-source-err-${src.bindTo}-${Date.now()}.txt`);\n const sourceForExecutor = {\n ...src,\n cwd: typeof src.cwd === 'string' && src.cwd ? src.cwd : path.dirname(cardFilePath || ''),\n boardDir: typeof src.boardDir === 'string' && src.boardDir ? src.boardDir : boardDir,\n };\n appendTaskExecutorLog(boardDir!, sourceForExecutor);\n fs.writeFileSync(inFile, JSON.stringify(sourceForExecutor, null, 2), 'utf-8');\n console.log(`[run-sources-internal] task-executor: ${taskExecutor} run-source-fetch --in ${inFile} --out ${outFile} --err ${errFile}`);\n try {\n execCommandSync(taskExecutor, ['run-source-fetch', '--in', inFile, '--out', outFile, '--err', errFile], {\n shell: true,\n timeout: src.timeout ?? 120_000,\n });\n } catch (err: unknown) {\n const reason = (err as Error).message ?? String(err);\n console.error(`[run-sources-internal] task-executor failed for source \"${src.bindTo}\":`, reason);\n reportFailure(reason);\n return;\n }\n if (fs.existsSync(outFile)) {\n reportFetched(outFile);\n } else {\n const errMsg = fs.existsSync(errFile) ? fs.readFileSync(errFile, 'utf-8').trim() : 'executor produced no output file';\n console.warn(`[run-sources-internal] source \"${src.bindTo}\": ${errMsg}`);\n reportFailure(errMsg);\n }\n return;\n }\n\n // No external executor: execute source.cli directly in this process.\n if (!src.outputFile) {\n console.warn(`[run-sources-internal] source \"${src.bindTo}\" has no outputFile configured — cannot deliver`);\n reportFailure('no outputFile configured');\n return;\n }\n const outFile = path.join(os.tmpdir(), `card-source-out-${src.bindTo}-${Date.now()}.json`);\n if (!src.cli) {\n const errMsg = 'source.cli is required for built-in source execution';\n console.warn(`[run-sources-internal] source \"${src.bindTo}\": ${errMsg}`);\n reportFailure(errMsg);\n return;\n }\n\n const timeout = src.timeout ?? 120_000;\n const sourceCwd = typeof src.cwd === 'string' ? src.cwd : path.dirname(cardFilePath || '');\n const sourceBoardDir = typeof src.boardDir === 'string' ? src.boardDir : boardDir;\n const cmdParts = splitCommandLine(src.cli);\n if (cmdParts.length === 0) {\n const errMsg = 'source.cli command is empty';\n console.warn(`[run-sources-internal] source \"${src.bindTo}\": ${errMsg}`);\n reportFailure(errMsg);\n return;\n }\n\n const rawCmd = cmdParts[0];\n const cmd = /^(node|node\\.exe)$/i.test(rawCmd) ? process.execPath : rawCmd;\n const cliArgs = cmdParts.slice(1);\n\n let stdout: string;\n try {\n stdout = execCommandSync(cmd, cliArgs, {\n shell: false,\n encoding: 'utf-8',\n timeout,\n cwd: sourceCwd,\n env: {\n ...process.env,\n ...(sourceBoardDir ? { BOARD_DIR: sourceBoardDir } : {}),\n },\n });\n } catch (err: unknown) {\n const reason = (err as Error).message ?? String(err);\n console.error(`[run-sources-internal] source fetch failed for source \"${src.bindTo}\":`, reason);\n reportFailure(reason);\n return;\n }\n\n fs.writeFileSync(outFile, stdout.trim(), 'utf-8');\n reportFetched(outFile);\n }\n\n const sources = (card.sources ?? []) as SourceDef[];\n for (const src of sources) {\n runSource(src);\n }\n}\n\n/**\n * Run-source-fetch protocol: execute a source definition.\n * Board-live-cards built-in implementation understands source.cli field.\n *\n * Reads source definition from --in, executes its cli field,\n * writes result to --out file. Presence of --out indicates success.\n */\nfunction cmdRunSourceFetch(args: string[]): void {\n const inIdx = args.indexOf('--in');\n const outIdx = args.indexOf('--out');\n const errIdx = args.indexOf('--err');\n\n const inFile = inIdx !== -1 ? args[inIdx + 1] : undefined;\n const outFile = outIdx !== -1 ? args[outIdx + 1] : undefined;\n const errFile = errIdx !== -1 ? args[errIdx + 1] : undefined;\n\n if (!inFile || !outFile) {\n console.error('Usage: board-live-cards run-source-fetch --in <source.json> --out <result.json> [--err <error.txt>]');\n process.exit(1);\n }\n\n if (!fs.existsSync(inFile)) {\n const msg = `Input file not found: ${inFile}`;\n if (errFile) fs.writeFileSync(errFile, msg);\n console.error(`[run-source-fetch] ${msg}`);\n process.exit(1);\n }\n\n // Parse source definition\n let source: any;\n try {\n const raw = fs.readFileSync(inFile, 'utf-8');\n source = JSON.parse(raw);\n } catch (err) {\n const msg = `Failed to parse input file: ${(err as Error).message}`;\n if (errFile) fs.writeFileSync(errFile, msg);\n console.error(`[run-source-fetch] ${msg}`);\n process.exit(1);\n }\n\n // Source must have a cli field (not script)\n if (!source.cli) {\n const msg = 'Source definition missing cli field (board-live-cards built-in executor only understands source.cli)';\n if (errFile) fs.writeFileSync(errFile, msg);\n console.error(`[run-source-fetch] ${msg}`);\n process.exit(1);\n }\n\n // Execute the source cli command\n console.log(`[run-source-fetch] executing: ${source.cli}`);\n const timeout = source.timeout ?? 120_000;\n const sourceCwd = typeof source.cwd === 'string' ? source.cwd : process.cwd();\n const sourceBoardDir = typeof source.boardDir === 'string' ? source.boardDir : undefined;\n\n // Parse command with quote support to preserve args like --flag \"value with spaces\".\n const cmdParts = splitCommandLine(source.cli);\n if (cmdParts.length === 0) {\n const msg = 'Source cli command is empty';\n if (errFile) fs.writeFileSync(errFile, msg);\n console.error(`[run-source-fetch] ${msg}`);\n process.exit(1);\n }\n const rawCmd = cmdParts[0];\n const cmd = /^(node|node\\.exe)$/i.test(rawCmd) ? process.execPath : rawCmd;\n const cliArgs = cmdParts.slice(1);\n\n let stdout: string;\n try {\n stdout = execCommandSync(cmd, cliArgs, {\n shell: false,\n encoding: 'utf-8',\n timeout,\n cwd: sourceCwd,\n env: {\n ...process.env,\n ...(sourceBoardDir ? { BOARD_DIR: sourceBoardDir } : {}),\n },\n });\n } catch (err: unknown) {\n const msg = (err as Error).message ?? String(err);\n console.error(`[run-source-fetch] cli failed: ${msg}`);\n if (errFile) fs.writeFileSync(errFile, msg);\n process.exit(1);\n }\n\n // Write result to --out\n const result = stdout.trim();\n try {\n fs.writeFileSync(outFile, result);\n console.log(`[run-source-fetch] result written to ${outFile}`);\n } catch (err) {\n const msg = `Failed to write output file: ${(err as Error).message}`;\n console.error(`[run-source-fetch] ${msg}`);\n if (errFile) fs.writeFileSync(errFile, msg);\n process.exit(1);\n }\n}\n\nfunction cmdUpdateCard(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const idIdx = args.indexOf('--card-id');\n const restart = args.includes('--restart');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const cardId = idIdx !== -1 ? args[idIdx + 1] : undefined;\n if (!dir || !cardId) {\n throw new Error('Usage: board-live-cards update-card --rg <dir> --card-id <card-id> [--restart]');\n }\n\n // 1. Look up card in inventory\n const cardPath = lookupCardPath(dir, cardId);\n if (!cardPath) {\n throw new Error(`Card \"${cardId}\" not found in inventory`);\n }\n\n // 2. Validate card file exists on disk\n if (!fs.existsSync(cardPath)) {\n throw new Error(`Card file not found: ${cardPath}`);\n }\n\n // 3. Read updated card, transform to TaskConfig, upsert\n const card: BoardLiveCard = JSON.parse(fs.readFileSync(cardPath, 'utf-8'));\n const taskConfig = liveCardToTaskConfig(card);\n\n appendEventToJournal(dir, {\n type: 'task-upsert',\n taskName: cardId,\n taskConfig,\n timestamp: new Date().toISOString(),\n });\n\n // 4. Optionally restart the task so handler re-runs with updated card\n if (restart) {\n appendEventToJournal(dir, {\n type: 'task-restart',\n taskName: cardId,\n timestamp: new Date().toISOString(),\n });\n }\n\n void processAccumulatedEventsInfinitePass(dir);\n console.log(`Card \"${cardId}\" updated${restart ? ' (restarted)' : ''}.`);\n}\n\nfunction cmdUpsertCard(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const cardIdx = args.indexOf('--card');\n const globIdx = args.indexOf('--card-glob');\n const cardIdIdx = args.indexOf('--card-id');\n const restart = args.includes('--restart');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const cardFile = cardIdx !== -1 ? args[cardIdx + 1] : undefined;\n const cardGlob = globIdx !== -1 ? args[globIdx + 1] : undefined;\n const requestedCardId = cardIdIdx !== -1 ? args[cardIdIdx + 1] : undefined;\n\n if (!dir || (!cardFile && !cardGlob) || (cardFile && cardGlob)) {\n console.error('Usage: board-live-cards upsert-card --rg <dir> (--card <card.json> | --card-glob <glob>) [--card-id <card-id>] [--restart]');\n process.exit(1);\n }\n\n if (cardGlob && requestedCardId) {\n console.error('Usage: --card-id may be used only with --card (single file), not with --card-glob');\n process.exit(1);\n }\n\n const cardFiles = cardFile\n ? [path.resolve(cardFile)]\n : resolveCardGlobMatches(cardGlob!);\n\n if (!cardFile && cardFiles.length === 0) {\n console.error(`No card files matched glob: ${cardGlob}`);\n process.exit(1);\n }\n\n const idx = buildCardInventoryIndex(dir);\n const batchByCardId = new Map<string, string>();\n const batchByCardPath = new Map<string, string>();\n const plans: Array<{\n card: BoardLiveCard;\n absCardPath: string;\n isInsert: boolean;\n }> = [];\n const logs: string[] = [];\n\n // Phase 1: pre-validate entire batch (atomicity guard)\n for (const absCardPath of cardFiles) {\n if (!fs.existsSync(absCardPath)) {\n console.error(`Card file not found: ${absCardPath}`);\n process.exit(1);\n }\n\n const card: BoardLiveCard = JSON.parse(fs.readFileSync(absCardPath, 'utf-8'));\n if (!card.id) {\n console.error(`Card JSON must have an \"id\" field (${absCardPath})`);\n process.exit(1);\n }\n\n if (requestedCardId && requestedCardId !== card.id) {\n console.error(\n `Card id mismatch: --card-id \"${requestedCardId}\" does not match file id \"${card.id}\" (${absCardPath})`\n );\n process.exit(1);\n }\n\n const seenPathCardId = batchByCardPath.get(absCardPath);\n if (seenPathCardId && seenPathCardId !== card.id) {\n console.error(\n `Upsert rejected: file \"${absCardPath}\" appears multiple times in batch with conflicting ids ` +\n `(\"${seenPathCardId}\" vs \"${card.id}\")`\n );\n process.exit(1);\n }\n\n const seenCardPath = batchByCardId.get(card.id);\n if (seenCardPath && seenCardPath !== absCardPath) {\n console.error(\n `Upsert rejected: card id \"${card.id}\" appears multiple times in batch with conflicting files ` +\n `(\"${seenCardPath}\" vs \"${absCardPath}\")`\n );\n process.exit(1);\n }\n\n const existingById = idx.byCardId.get(card.id);\n const existingByPath = idx.byCardPath.get(absCardPath);\n\n // Enforce strict one-to-one mapping between card id and file path.\n if (existingByPath && existingByPath.cardId !== card.id) {\n console.error(\n `Upsert rejected: file \"${absCardPath}\" is already mapped to card id \"${existingByPath.cardId}\", ` +\n `cannot remap to \"${card.id}\"`\n );\n process.exit(1);\n }\n\n if (existingById && existingById.cardFilePath !== absCardPath) {\n console.error(\n `Upsert rejected: card id \"${card.id}\" is already mapped to file \"${existingById.cardFilePath}\", ` +\n `cannot remap to \"${absCardPath}\"`\n );\n process.exit(1);\n }\n\n batchByCardPath.set(absCardPath, card.id);\n batchByCardId.set(card.id, absCardPath);\n\n plans.push({\n card,\n absCardPath,\n isInsert: !existingById,\n });\n }\n\n // Phase 2: commit writes after full pre-validation succeeds\n for (const plan of plans) {\n const { card, absCardPath, isInsert } = plan;\n\n if (isInsert) {\n const newEntry: CardInventoryEntry = {\n cardId: card.id,\n cardFilePath: absCardPath,\n addedAt: new Date().toISOString(),\n };\n appendCardInventory(dir, newEntry);\n idx.byCardId.set(card.id, newEntry);\n idx.byCardPath.set(absCardPath, newEntry);\n }\n\n const taskConfig = liveCardToTaskConfig(card);\n appendEventToJournal(dir, {\n type: 'task-upsert',\n taskName: card.id,\n taskConfig,\n timestamp: new Date().toISOString(),\n });\n\n if (restart) {\n appendEventToJournal(dir, {\n type: 'task-restart',\n taskName: card.id,\n timestamp: new Date().toISOString(),\n });\n }\n\n logs.push(`Card \"${card.id}\" ${isInsert ? 'upserted (inserted)' : 'upserted (updated)'}${restart ? ' (restarted)' : ''}.`);\n }\n\n void processAccumulatedEventsInfinitePass(dir);\n if (cardGlob) {\n console.log(`Upserted ${cardFiles.length} cards from glob: ${cardGlob}${restart ? ' (restarted)' : ''}`);\n } else {\n console.log(logs[0]);\n }\n}\n\n/**\n * process-accumulated-events command.\n *\n * Default mode: performs one immediate pass and schedules relay continuation\n * in a detached worker process.\n *\n * Internal mode (--inline-loop): execute full in-process settle loop.\n * Used only by the detached worker to avoid recursive respawn.\n */\nasync function cmdTryDrain(args: string[]): Promise<void> {\n const rgIdx = args.indexOf('--rg');\n const inlineLoop = args.includes('--inline-loop');\n const boardDir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n if (!boardDir) {\n console.error('Usage: board-live-cards process-accumulated-events --rg <dir>');\n process.exit(1);\n }\n\n await processAccumulatedEventsForced(boardDir, { inlineLoop });\n}\n\nfunction cmdRetrigger(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const taskIdx = args.indexOf('--task');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const taskName = taskIdx !== -1 ? args[taskIdx + 1] : undefined;\n if (!dir || !taskName) {\n console.error('Usage: board-live-cards retrigger --rg <dir> --task <task-name>');\n process.exit(1);\n }\n\n appendEventToJournal(dir, {\n type: 'task-restart',\n taskName,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsInfinitePass(dir);\n console.log(`Task \"${taskName}\" retriggered.`);\n}\n\nexport async function cli(argv: string[]): Promise<void> {\n const cmd = argv[0];\n const rest = argv.slice(1);\n\n switch (cmd) {\n case 'help':\n case '--help':\n case '-h': return cmdHelp();\n case 'init': return cmdInit(rest);\n case 'status': return cmdStatus(rest);\n case 'add-cards': return cmdAddCards(rest);\n case 'update-card': return cmdUpdateCard(rest);\n case 'upsert-card': return cmdUpsertCard(rest);\n case 'remove-card': return cmdRemoveCard(rest);\n case 'retrigger': return cmdRetrigger(rest);\n case 'task-completed': return cmdTaskCompleted(rest);\n case 'task-failed': return cmdTaskFailed(rest);\n case 'source-data-fetched': return cmdSourceDataFetched(rest);\n case 'source-data-fetch-failure': return cmdSourceDataFetchFailure(rest);\n case 'run-sources-internal': return cmdRunSources(rest);\n case 'run-source-fetch': return cmdRunSourceFetch(rest);\n case 'process-accumulated-events': return await cmdTryDrain(rest);\n default:\n throw new Error(`Unknown command: ${cmd ?? '(none)'}`);\n }\n}\n\nfunction cmdHelp(): void {\n console.log(`\nboard-live-cards-cli — LiveCards board CLI\n\nUSAGE\n board-live-cards-cli <command> [options]\n\nBOARD MANAGEMENT\n init <dir> [--task-executor <script>] [--runtime-out <dir>]\n Create a new board in <dir>.\n If --task-executor is given, writes <dir>/.task-executor with the script path.\n Writes <dir>/.runtime-out (default: <dir>/runtime-out).\n Published runtime files:\n <runtime-out>/board-livegraph-status.json\n <runtime-out>/cards/<card-id>.computed.json\n Re-running init on an existing board is safe; --task-executor updates the registration.\n\n status --rg <dir> [--json]\n Read and print the published status snapshot from <runtime-out>/board-livegraph-status.json.\n --json emits the stable machine-readable status object.\n\nCARD MANAGEMENT\n add-cards --rg <dir> (--card <card.json> | --card-glob <glob>)\n Add one card or many cards from a glob and trigger processing.\n --card adds one JSON file.\n --card-glob adds all matching files in deterministic order.\n Example glob: \"examples/browser/boards/portfolio-tracker/cards/*.json\"\n\n update-card --rg <dir> --card-id <card-id> [--restart]\n Re-read the card JSON from disk and patch the board.\n --restart clears the task so it re-triggers from scratch.\n\n upsert-card --rg <dir> (--card <card.json> | --card-glob <glob>) [--card-id <card-id>] [--restart]\n Insert or update one or many cards.\n Enforces strict one-to-one mapping between card id and file path:\n - same id + same file path: update\n - new id + new file path: insert\n - id remap or file remap: rejected\n If --card-id is provided, it must match the id inside the file.\n --card-id is valid only with --card (single file), not with --card-glob.\n --restart clears the task so it re-triggers from scratch.\n\n remove-card --rg <dir> --id <card-id>\n Remove a card and its task from the board.\n\n retrigger --rg <dir> --task <task-name>\n Mark a task not-started and drain to re-trigger it.\n\nTASK CALLBACKS (called by task executor scripts)\n task-completed --token <callbackToken> [--data <json>]\n Signal successful task completion with optional JSON result data.\n\n task-failed --token <callbackToken> [--error <message>]\n Signal task failure with an optional error message.\n\nSOURCE CALLBACKS (called internally by run-sources-internal)\n source-data-fetched --tmp <file> --token <sourceToken>\n Atomically rename <file> into the outputFile destination and record delivery\n in runtime.json. Appends a task-progress event to re-invoke the card handler.\n\n source-data-fetch-failure --token <sourceToken> [--reason <message>]\n Record a source fetch failure in runtime.json and append a task-progress event.\n\nINTERNAL COMMANDS\n process-accumulated-events --rg <dir>\n Executes forced drain for this board.\n This command is also used as the background relay worker.\n By default it schedules a detached worker and returns quickly.\n Internal workers run with --inline-loop to perform the settle loop.\n\n Eventual-progress guarantee is relay-based (not per-call blocking guarantee):\n 1) at least one runner continues processing,\n 2) no crash/forced exit in relay window,\n 3) lock stays healthy,\n 4) event production eventually quiesces.\n\n run-sources-internal-internal --card <card.json> --token <callbackToken> --rg <dir>\n Execute all source[] entries for a card, then report delivery or failure.\n (Internal command — invoked by the card-handler. Not intended for direct use.)\n\n If <dir>/.task-executor exists, invokes it with run-source-fetch subcommand:\n <executor> run-source-fetch --in <source_json> --out <outfile> --err <errfile>\n \n If no .task-executor is registered, uses board-live-cards built-in run-source-fetch.\n\n run-source-fetch --in <source.json> --out <result.json> [--err <error.txt>]\n Execute a source definition. Board-live-cards reads source.cli and executes it.\n Writes result to --out. Presence of --out after exit indicates success.\n\nRUN-SOURCE-FETCH PROTOCOL\n External task-executors implement:\n <executor> run-source-fetch --in <source.json> --out <result.json> [--err <error.txt>]\n\n INPUT: --in file contains the full sources[x] definition object\n OUTPUT: --out file is written with the result to signal success.\n --err file may be written to explain failure.\n \n Exit code and --out presence determine success:\n Exit 0 + --out file present → source delivery recorded, card re-evaluated.\n Exit non-zero OR --out absent → source-data-fetch-failure recorded.\n\nBOARD-LIVE-CARDS BUILT-IN EXECUTOR\n Understands source.cli field only:\n \"sources\": [{ \"cli\": \"node ../fetch-prices.js\", \"bindTo\": \"prices\", \"outputFile\": \"prices.json\" }]\n \n The source.cli command is executed with:\n - Direct command invocation (no shell; quote-aware argument parsing)\n - Stdout is captured and delivered to the card as-is\n - Timeout from source.timeout (default 120s)\n \n The source.cli command must:\n - Execute successfully (exit 0)\n - Write output to stdout\n - Complete within the timeout\n \n The output format is the concern of the card's compute function to interpret.\n \n External task-executors can interpret source definitions however they want.\n\nEXAMPLES\n board-live-cards-cli init ./my-board\n board-live-cards-cli init ./my-board --task-executor ./executors/my-runner.py\n board-live-cards-cli add-cards --rg ./my-board --card cards/prices.json\n board-live-cards-cli status --rg ./my-board\n board-live-cards-cli retrigger --rg ./my-board --task price-fetch\n`.trimStart());\n}\n\n// Run when invoked directly\nconst isMain = process.argv[1] && path.resolve(process.argv[1]) === path.resolve(new URL(import.meta.url).pathname.replace(/^\\/([A-Z]:)/, '$1'));\nif (isMain) {\n cli(process.argv.slice(2)).catch((err) => {\n const msg = err instanceof Error ? err.stack ?? err.message : String(err);\n console.error(msg);\n process.exit(1);\n });\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/journal.ts","../../src/continuous-event-graph/reactive.ts","../../src/card-compute/index.ts","../../src/cli/board-live-cards-cli.ts"],"names":["updatedTask","createDefaultGraphEngineStore","requires","path","jsonata","randomUUID","fs","envelope","lockSync","decodeCallbackToken","os","child","spawn","execFileSync","execFile","resolve","__dirname","fileURLToPath","now","fg","outFile","runtimePath"],"mappings":"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","file":"board-live-cards-cli.cjs","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 — 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 /** Stop accepting events. */\n dispose(): 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 // 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 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 });\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 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 });\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 dispose(): void {\n disposed = true;\n },\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';\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 sources 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 [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 sources?: 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 * 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', 'chart', 'form', 'filter', 'list',\n 'notes', 'todo', 'alert', 'narrative', 'badge', 'text',\n 'markdown', 'custom',\n]);\n\nconst ALLOWED_KEYS = new Set(['id', 'meta', 'requires', 'provides', 'view', 'card_data', 'compute', 'sources']);\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, src } 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 src`);\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.src !== 'string' || !b.src) errors.push(`provides[${i}]: missing required \"src\" 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.sources != null) {\n if (!Array.isArray(n.sources)) {\n errors.push('sources: must be an array');\n } else {\n const bindTos = new Set<string>();\n const outputFiles = new Set<string>();\n (n.sources as unknown[]).forEach((src, i) => {\n if (!src || typeof src !== 'object' || Array.isArray(src)) {\n errors.push(`sources[${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(`sources[${i}]: missing required \"bindTo\" property`);\n } else {\n if (bindTos.has(s.bindTo)) {\n errors.push(`sources[${i}]: bindTo \"${s.bindTo}\" is not unique across sources`);\n }\n bindTos.add(s.bindTo);\n }\n if (typeof s.outputFile !== 'string' || !s.outputFile) {\n errors.push(`sources[${i}]: missing required \"outputFile\" property`);\n } else {\n if (outputFiles.has(s.outputFile)) {\n errors.push(`sources[${i}]: outputFile \"${s.outputFile}\" is not unique across sources`);\n }\n outputFiles.add(s.outputFile);\n }\n if (s.optionalForCompletionGating != null && typeof s.optionalForCompletionGating !== 'boolean') {\n errors.push(`sources[${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 sources with execution context for template interpolation and prompt rendering.\n * Pure function: no side effects, returns new enriched sources array.\n * \n * @param sources - Array of source definitions\n * @param context - Execution context containing requires, sourcesData, computed_values\n * @returns New array of sources with _requires, _sourcesData, _computed_values attached\n */\nfunction enrichSources(\n sources: any[] | undefined,\n context: {\n requires?: Record<string, any>;\n sourcesData?: Record<string, any>;\n computed_values?: Record<string, any>;\n }\n): any[] {\n if (!sources || sources.length === 0) return [];\n \n return sources.map((src: any) => ({\n ...src,\n _requires: context.requires ?? {},\n _sourcesData: context.sourcesData ?? {},\n _computed_values: context.computed_values ?? {},\n }));\n}\n\nexport const CardCompute = {\n run,\n eval: evalExpr,\n resolve,\n validate: validateNode,\n enrichSources,\n};\n\nexport {\n validateLiveCard,\n validateLiveCardSchema,\n validateLiveCardRuntimeExpressions,\n validateLiveCardDefinition,\n} from './schema-validator.js';\n\nexport default CardCompute;\n\n","/**\n * Board Live Cards — Disk persistence + CLI for ReactiveGraph.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { execFile, execFileSync, spawn } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport fg from 'fast-glob';\nimport { lockSync } from 'proper-lockfile';\nimport { restore } from '../continuous-event-graph/core.js';\nimport type { LiveGraph, LiveGraphSnapshot } from '../continuous-event-graph/types.js';\nimport type { ReactiveGraph, TaskHandlerFn } from '../continuous-event-graph/reactive.js';\nimport { createReactiveGraph } from '../continuous-event-graph/reactive.js';\nimport { createLiveGraph, snapshot } from '../continuous-event-graph/core.js';\nimport { schedule } from '../continuous-event-graph/schedule.js';\nimport type { GraphConfig, TaskConfig, GraphEvent } from '../event-graph/types.js';\nimport type { LiveCard } from '../continuous-event-graph/live-cards-bridge.js';\nimport type { Journal } from '../continuous-event-graph/journal.js';\nimport { CardCompute } from '../card-compute/index.js';\nimport type { ComputeNode, ComputeStep, ComputeSource } from '../card-compute/index.js';\n\nconst BOARD_FILE = 'board-graph.json';\nconst JOURNAL_FILE = 'board-journal.jsonl';\nconst TASK_EXECUTOR_LOG_FILE = 'task-executor.jsonl';\nconst INFERENCE_ADAPTER_LOG_FILE = 'inference-adapter.jsonl';\nconst INVENTORY_FILE = 'cards-inventory.jsonl';\nconst RUNTIME_OUT_FILE = '.runtime-out';\nconst DEFAULT_RUNTIME_OUT_DIR = 'runtime-out';\nconst RUNTIME_STATUS_FILE = 'board-livegraph-status.json';\nconst RUNTIME_CARDS_DIR = 'cards';\nconst RUNTIME_DATA_OBJECTS_DIR = 'data-objects';\nconst INFERENCE_ADAPTER_FILE = '.inference-adapter';\nconst DEFAULT_TASK_COMPLETION_RULE = 'all_required_sources_fetched';\nconst EMPTY_CONFIG: GraphConfig = { settings: { completion: 'manual', refreshStrategy: 'data-changed' }, tasks: {} } as GraphConfig;\n\n/** Envelope stored in board-graph.json — wraps the LiveGraph snapshot with journal pointer. */\nexport interface BoardEnvelope {\n lastDrainedJournalId: string;\n graph: LiveGraphSnapshot;\n}\n\n// ============================================================================\n// Board Journal — append-only JSONL with GUID IDs\n// ============================================================================\n\nexport interface JournalEntry {\n id: string;\n event: GraphEvent;\n}\n\nexport class BoardJournal implements Journal {\n private readonly journalPath: string;\n private lastDrainedId: string;\n\n constructor(journalPath: string, lastDrainedJournalId: string) {\n this.journalPath = journalPath;\n this.lastDrainedId = lastDrainedJournalId;\n }\n\n append(event: GraphEvent): void {\n const entry: JournalEntry = { id: randomUUID(), event };\n fs.appendFileSync(this.journalPath, JSON.stringify(entry) + '\\n', 'utf-8');\n }\n\n drain(): GraphEvent[] {\n if (!fs.existsSync(this.journalPath)) return [];\n const content = fs.readFileSync(this.journalPath, 'utf-8').trim();\n if (!content) return [];\n const entries: JournalEntry[] = content.split('\\n').map(l => JSON.parse(l));\n\n // Find the index of the last drained entry; take everything after it\n let startIdx = 0;\n if (this.lastDrainedId) {\n const drainedIdx = entries.findIndex(e => e.id === this.lastDrainedId);\n if (drainedIdx !== -1) startIdx = drainedIdx + 1;\n }\n\n const undrained = entries.slice(startIdx);\n if (undrained.length > 0) {\n this.lastDrainedId = undrained[undrained.length - 1].id;\n }\n return undrained.map(e => e.event);\n }\n\n get size(): number {\n if (!fs.existsSync(this.journalPath)) return 0;\n const content = fs.readFileSync(this.journalPath, 'utf-8').trim();\n if (!content) return 0;\n const entries: JournalEntry[] = content.split('\\n').map(l => JSON.parse(l));\n if (!this.lastDrainedId) return entries.length;\n const drainedIdx = entries.findIndex(e => e.id === this.lastDrainedId);\n return drainedIdx === -1 ? entries.length : entries.length - drainedIdx - 1;\n }\n\n get lastDrainedJournalId(): string {\n return this.lastDrainedId;\n }\n}\n\n// ============================================================================\n// Cards inventory\n// ============================================================================\n\nexport interface CardInventoryEntry {\n cardId: string;\n cardFilePath: string;\n addedAt: string;\n}\n\nexport interface CardInventoryIndex {\n byCardId: Map<string, CardInventoryEntry>;\n byCardPath: Map<string, CardInventoryEntry>;\n}\n\nexport function readCardInventory(boardDir: string): CardInventoryEntry[] {\n const inventoryPath = path.join(boardDir, INVENTORY_FILE);\n if (!fs.existsSync(inventoryPath)) return [];\n const lines = fs.readFileSync(inventoryPath, 'utf-8').split('\\n').filter(l => l.trim());\n return lines.map(l => JSON.parse(l) as CardInventoryEntry);\n}\n\nexport function lookupCardPath(boardDir: string, cardId: string): string | null {\n const entries = readCardInventory(boardDir);\n const entry = entries.find(e => e.cardId === cardId);\n return entry?.cardFilePath ?? null;\n}\n\nexport function appendCardInventory(boardDir: string, entry: CardInventoryEntry): void {\n const inventoryPath = path.join(boardDir, INVENTORY_FILE);\n const normalized: CardInventoryEntry = { ...entry, cardFilePath: path.resolve(entry.cardFilePath) };\n fs.appendFileSync(inventoryPath, JSON.stringify(normalized) + '\\n');\n}\n\nexport function buildCardInventoryIndex(boardDir: string): CardInventoryIndex {\n const byCardId = new Map<string, CardInventoryEntry>();\n const byCardPath = new Map<string, CardInventoryEntry>();\n\n for (const entry of readCardInventory(boardDir)) {\n const normalizedPath = path.resolve(entry.cardFilePath);\n const normalizedEntry: CardInventoryEntry = {\n ...entry,\n cardFilePath: normalizedPath,\n };\n\n const existingById = byCardId.get(entry.cardId);\n if (existingById && existingById.cardFilePath !== normalizedPath) {\n throw new Error(\n `Inventory invariant violation: card id \"${entry.cardId}\" maps to multiple files: ` +\n `\"${existingById.cardFilePath}\" and \"${normalizedPath}\"`\n );\n }\n\n const existingByPath = byCardPath.get(normalizedPath);\n if (existingByPath && existingByPath.cardId !== entry.cardId) {\n throw new Error(\n `Inventory invariant violation: file \"${normalizedPath}\" maps to multiple ids: ` +\n `\"${existingByPath.cardId}\" and \"${entry.cardId}\"`\n );\n }\n\n byCardId.set(entry.cardId, normalizedEntry);\n byCardPath.set(normalizedPath, normalizedEntry);\n }\n\n return { byCardId, byCardPath };\n}\n\n// ============================================================================\n// Library\n// ============================================================================\n\n/**\n * Initialize a board directory.\n * - Dir doesn't exist → create it, write empty board-graph.json\n * - Dir exists + valid board-graph.json → no-op, return 'exists'\n * - Dir exists + non-empty (no valid board-graph.json) → throw\n */\nexport function initBoard(dir: string): 'created' | 'exists' {\n const boardPath = path.join(dir, BOARD_FILE);\n\n if (fs.existsSync(boardPath)) {\n // Validate it's a real board envelope\n const envelope = JSON.parse(fs.readFileSync(boardPath, 'utf-8')) as BoardEnvelope;\n restore(envelope.graph);\n return 'exists';\n }\n\n if (fs.existsSync(dir)) {\n const entries = fs.readdirSync(dir);\n if (entries.length > 0) {\n throw new Error(`Directory \"${dir}\" is not empty and has no valid ${BOARD_FILE}`);\n }\n }\n\n fs.mkdirSync(dir, { recursive: true });\n const live = createLiveGraph(EMPTY_CONFIG);\n const snap = snapshot(live);\n const envelope: BoardEnvelope = { lastDrainedJournalId: '', graph: snap };\n fs.writeFileSync(boardPath, JSON.stringify(envelope, null, 2));\n return 'created';\n}\n\nexport function loadBoardEnvelope(dir: string): BoardEnvelope {\n const raw = fs.readFileSync(path.join(dir, BOARD_FILE), 'utf-8');\n return JSON.parse(raw) as BoardEnvelope;\n}\n\nexport function loadBoard(dir: string): LiveGraph {\n const envelope = loadBoardEnvelope(dir);\n return restore(envelope.graph);\n}\n\nexport function saveBoard(dir: string, rg: ReactiveGraph, journal: BoardJournal): void {\n const snap = rg.snapshot();\n const envelope: BoardEnvelope = {\n lastDrainedJournalId: journal.lastDrainedJournalId,\n graph: snap,\n };\n writeJsonAtomic(path.join(dir, BOARD_FILE), envelope);\n\n // Publish status snapshot in the same persistence path as board writes.\n const live = restore(snap);\n const statusObject = buildBoardStatusObject(dir, live);\n writeJsonAtomic(resolveStatusSnapshotPath(dir), statusObject);\n}\n\nfunction runtimeOutConfigPath(boardDir: string): string {\n return path.join(boardDir, RUNTIME_OUT_FILE);\n}\n\nfunction resolveConfiguredRuntimeOutDir(boardDir: string): string {\n const cfgPath = runtimeOutConfigPath(boardDir);\n if (fs.existsSync(cfgPath)) {\n const configured = fs.readFileSync(cfgPath, 'utf-8').trim();\n if (configured) {\n return path.isAbsolute(configured) ? configured : path.resolve(boardDir, configured);\n }\n }\n\n const defaultDir = path.join(boardDir, DEFAULT_RUNTIME_OUT_DIR);\n fs.writeFileSync(cfgPath, defaultDir, 'utf-8');\n return defaultDir;\n}\n\nfunction configureRuntimeOutDir(boardDir: string, runtimeOut?: string): string {\n let resolved: string;\n if (runtimeOut) {\n resolved = path.isAbsolute(runtimeOut) ? runtimeOut : path.resolve(boardDir, runtimeOut);\n } else {\n resolved = path.join(boardDir, DEFAULT_RUNTIME_OUT_DIR);\n }\n\n fs.mkdirSync(resolved, { recursive: true });\n fs.writeFileSync(runtimeOutConfigPath(boardDir), resolved, 'utf-8');\n return resolved;\n}\n\nfunction resolveStatusSnapshotPath(boardDir: string): string {\n return path.join(resolveConfiguredRuntimeOutDir(boardDir), RUNTIME_STATUS_FILE);\n}\n\nfunction resolveComputedValuesPath(boardDir: string, cardId: string): string {\n return path.join(resolveConfiguredRuntimeOutDir(boardDir), RUNTIME_CARDS_DIR, `${cardId}.computed.json`);\n}\n\nfunction resolveDataObjectsDirPath(boardDir: string): string {\n return path.join(resolveConfiguredRuntimeOutDir(boardDir), RUNTIME_DATA_OBJECTS_DIR);\n}\n\nfunction toDataObjectFileName(token: string): string {\n // Keep token recognizable in filenames while avoiding path traversal.\n return token.replace(/[\\\\/]/g, '__');\n}\n\nfunction writeRuntimeDataObjects(boardDir: string, data: Record<string, unknown>): void {\n for (const [token, payload] of Object.entries(data)) {\n if (!token) continue;\n const fileName = toDataObjectFileName(token);\n if (!fileName) continue;\n const filePath = path.join(resolveDataObjectsDirPath(boardDir), fileName);\n writeJsonAtomic(filePath, payload);\n }\n}\n\nfunction writeJsonAtomic(filePath: string, payload: unknown): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmpPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n fs.writeFileSync(tmpPath, JSON.stringify(payload, null, 2), 'utf-8');\n fs.renameSync(tmpPath, filePath);\n}\n\n/**\n * Acquire an exclusive lock on the board, run `fn`, then release.\n * Uses proper-lockfile on board-graph.json.\n */\nexport function withBoardLock<T>(boardDir: string, fn: () => T): T {\n const boardPath = path.join(boardDir, BOARD_FILE);\n const release = lockSync(boardPath, { retries: { retries: 5, minTimeout: 100 } });\n try {\n return fn();\n } finally {\n release();\n }\n}\n\n// ============================================================================\n// Standalone journal append + opportunistic drain\n// ============================================================================\n\n/**\n * Decode a callback token → { taskName } or null if malformed.\n * Mirrors the private encodeCallbackToken format in reactive.ts.\n */\nfunction decodeCallbackToken(token: string): { taskName: string } | null {\n try {\n const payload = JSON.parse(Buffer.from(token, 'base64url').toString());\n if (typeof payload?.t === 'string') return { taskName: payload.t };\n return null;\n } catch { return null; }\n}\n\n// ============================================================================\n// Source token — per-source opaque token carrying all delivery metadata\n// ============================================================================\n\nexport interface SourceTokenPayload {\n /** Original callback token from the reactive graph (encodes taskName) */\n cbk: string;\n /** Board directory (absolute path) */\n rg: string;\n /** Card id */\n cid: string;\n /** sources[].bindTo */\n b: string;\n /** sources[].outputFile (relative to boardDir) */\n d: string;\n /** Per-source invocation checksum */\n cs?: string;\n}\n\nexport function encodeSourceToken(payload: SourceTokenPayload): string {\n return Buffer.from(JSON.stringify(payload)).toString('base64url');\n}\n\nexport function decodeSourceToken(token: string): SourceTokenPayload | null {\n try {\n const p = JSON.parse(Buffer.from(token, 'base64url').toString());\n if (typeof p?.cbk === 'string' && typeof p?.cid === 'string' && typeof p?.b === 'string' && typeof p?.d === 'string') {\n return p as SourceTokenPayload;\n }\n return null;\n } catch { return null; }\n}\n\n// ============================================================================\n// Runtime state sidecar — <cardId>.runtime.json\n// ============================================================================\n\nexport interface SourceRuntimeEntry {\n lastRequestedAt?: string;\n lastFetchedAt?: string;\n lastError?: string;\n /** Timestamp of the most recent card-handler dispatch — updated on every fresh invocation.\n * Replaces checksum-based gating: a source fetch is needed whenever\n * lastFetchedAt is absent or older than queueRequestedAt. */\n queueRequestedAt?: string;\n}\n\nexport interface InferenceRuntimeEntry {\n lastRequestedAt?: string;\n lastFetchedAt?: string;\n lastError?: string;\n /** Same semantics as SourceRuntimeEntry.queueRequestedAt. */\n queueRequestedAt?: string;\n}\n\ntype FetchRuntimeEntry = SourceRuntimeEntry | InferenceRuntimeEntry;\n\nfunction markRequested(entry: FetchRuntimeEntry, requestedAt: string): void {\n entry.lastRequestedAt = requestedAt;\n}\n\nfunction markFetchFailed(entry: FetchRuntimeEntry, reason: string): void {\n entry.lastError = reason;\n delete entry.lastFetchedAt;\n}\n\nfunction markFetchCompleted(entry: FetchRuntimeEntry, fetchedAt: string): void {\n entry.lastFetchedAt = fetchedAt;\n delete entry.lastError;\n}\n\nexport function isSourceInFlight(entry: FetchRuntimeEntry | undefined): boolean {\n if (!entry?.lastRequestedAt) return false;\n return !entry.lastFetchedAt || entry.lastFetchedAt < entry.lastRequestedAt;\n}\n\n/**\n * Decide what to do with a source/inference fetch given the current runtime entry\n * and the timestamp of the latest card-handler dispatch (queueRequestedAt).\n *\n * - 'dispatch' : fetch not yet started for this run, or previous fetch predates the request\n * - 'in-flight': fetch is already running for this run — update queueRequestedAt and wait\n * - 'idle' : fetch already completed for this run — nothing to do\n */\nexport function decideSourceAction(\n entry: FetchRuntimeEntry | undefined,\n queueRequestedAt: string,\n): 'dispatch' | 'in-flight' | 'idle' {\n if (!entry?.lastRequestedAt) return 'dispatch';\n const inFlight = isSourceInFlight(entry);\n if (inFlight) return 'in-flight'; // wait; caller updates queueRequestedAt\n if (!entry.lastFetchedAt) return 'dispatch'; // requested but never fetched\n if (entry.lastFetchedAt < queueRequestedAt) return 'dispatch'; // fetched before current run\n return 'idle'; // already fetched for this run\n}\n\nexport function nextEntryAfterFetchDelivery<T extends FetchRuntimeEntry>(\n entry: T,\n fetchedAt: string,\n): T {\n const next = { ...entry };\n markFetchCompleted(next, fetchedAt);\n // If queueRequestedAt is newer than the fetch just completed, the caller\n // already updated queueRequestedAt while the fetch was in-flight.\n // The next card-handler invocation will see lastFetchedAt < queueRequestedAt\n // and dispatch again — no special queuing needed here.\n return next as T;\n}\n\nexport function nextEntryAfterFetchFailure<T extends FetchRuntimeEntry>(\n entry: T,\n reason: string,\n): T {\n const next = { ...entry };\n markFetchFailed(next, reason);\n return next as T;\n}\n\nexport interface CardRuntimeState {\n _sources: Record<string, SourceRuntimeEntry>;\n _inferenceEntry?: InferenceRuntimeEntry;\n _lastExecutionCount?: number;\n}\n\nfunction runtimePath(boardDir: string, cardId: string): string {\n return path.join(boardDir, `${cardId}.runtime.json`);\n}\n\nfunction readRuntimeState(boardDir: string, cardId: string): CardRuntimeState {\n const p = runtimePath(boardDir, cardId);\n if (!fs.existsSync(p)) return { _sources: {} };\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')) as CardRuntimeState; }\n catch { return { _sources: {} }; }\n}\n\nfunction writeRuntimeState(boardDir: string, cardId: string, state: CardRuntimeState): void {\n fs.writeFileSync(runtimePath(boardDir, cardId), JSON.stringify(state, null, 2));\n}\n\n/**\n * Append a raw event to the journal file. No lock, no file read.\n * Safe for hundreds of concurrent callers (appendFileSync is atomic for small writes).\n */\nexport function appendEventToJournal(boardDir: string, event: GraphEvent): void {\n const journalPath = path.join(boardDir, JOURNAL_FILE);\n const entry: JournalEntry = { id: randomUUID(), event };\n fs.appendFileSync(journalPath, JSON.stringify(entry) + '\\n', 'utf-8');\n}\n\n/**\n * Read journal entries after the given ID. Pure file read, no mutation.\n */\nexport function getUndrainedEntries(boardDir: string, lastDrainedId: string): JournalEntry[] {\n const journalPath = path.join(boardDir, JOURNAL_FILE);\n if (!fs.existsSync(journalPath)) return [];\n const content = fs.readFileSync(journalPath, 'utf-8').trim();\n if (!content) return [];\n const entries: JournalEntry[] = content.split('\\n').map(l => JSON.parse(l));\n if (!lastDrainedId) return entries;\n const idx = entries.findIndex(e => e.id === lastDrainedId);\n return idx === -1 ? entries : entries.slice(idx + 1);\n}\n\nfunction determineLatestPendingAccumulated(boardDir: string): number {\n const boardPath = path.join(boardDir, BOARD_FILE);\n if (!fs.existsSync(boardPath)) return 0;\n try {\n const envelope = loadBoardEnvelope(boardDir);\n return getUndrainedEntries(boardDir, envelope.lastDrainedJournalId).length;\n } catch {\n return 0;\n }\n}\n\nfunction shouldUseShellForCommand(cmd: string, forceShell?: boolean): boolean {\n if (typeof forceShell === 'boolean') return forceShell;\n return process.platform === 'win32' && /\\.(cmd|bat)$/i.test(cmd);\n}\n\n/** Cached git-bash path (resolved once per process, persisted to disk across invocations). */\nlet _gitBashPath: string | false | undefined;\nconst GIT_BASH_CACHE_FILE = path.join(os.tmpdir(), '.board-live-cards-git-bash-cache.json');\n\nfunction findGitBash(): string | false {\n if (_gitBashPath !== undefined) return _gitBashPath;\n if (process.platform !== 'win32') return (_gitBashPath = false);\n\n // Try disk cache first\n try {\n const cached = JSON.parse(fs.readFileSync(GIT_BASH_CACHE_FILE, 'utf8'));\n if (cached.path === false || (typeof cached.path === 'string' && fs.existsSync(cached.path))) {\n return (_gitBashPath = cached.path);\n }\n } catch { /* cache miss or corrupt — probe fresh */ }\n\n const candidates = [\n process.env.SHELL,\n process.env.PROGRAMFILES && path.join(process.env.PROGRAMFILES, 'Git', 'usr', 'bin', 'bash.exe'),\n process.env.PROGRAMFILES && path.join(process.env.PROGRAMFILES, 'Git', 'bin', 'bash.exe'),\n process.env['PROGRAMFILES(X86)'] && path.join(process.env['PROGRAMFILES(X86)'], 'Git', 'bin', 'bash.exe'),\n process.env.LOCALAPPDATA && path.join(process.env.LOCALAPPDATA, 'Programs', 'Git', 'bin', 'bash.exe'),\n ];\n for (const c of candidates) {\n if (c && /bash(\\.exe)?$/i.test(c) && fs.existsSync(c)) {\n _gitBashPath = c;\n try { fs.writeFileSync(GIT_BASH_CACHE_FILE, JSON.stringify({ path: c })); } catch { /* best-effort */ }\n return _gitBashPath;\n }\n }\n _gitBashPath = false;\n try { fs.writeFileSync(GIT_BASH_CACHE_FILE, JSON.stringify({ path: false })); } catch { /* best-effort */ }\n return _gitBashPath;\n}\n\nfunction shellQuote(s: string): string {\n return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\nfunction spawnDetachedCommand(cmd: string, args: string[]): void {\n if (process.platform === 'win32') {\n const bash = findGitBash();\n if (bash) {\n // Git-bash background: no console popup, survives parent exit.\n const shellCmd = [cmd, ...args].map((a) => shellQuote(a.replace(/\\\\/g, '/'))).join(' ');\n const child = spawn(bash, ['-c', shellCmd], { detached: true, stdio: 'ignore', windowsHide: true });\n child.unref();\n return;\n }\n // Fallback: cmd /c start /b + detached so child survives parent exit.\n const child = spawn('cmd', ['/c', 'start', '/b', '', cmd, ...args], {\n detached: true,\n stdio: 'ignore',\n windowsHide: true,\n });\n child.unref();\n return;\n }\n // Unix: straightforward detached spawn.\n const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });\n child.unref();\n}\n\nfunction execCommandSync(\n cmd: string,\n args: string[],\n options?: {\n shell?: boolean;\n timeout?: number;\n encoding?: BufferEncoding;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n },\n): string {\n const output = execFileSync(cmd, args, {\n shell: shouldUseShellForCommand(cmd, options?.shell),\n timeout: options?.timeout,\n encoding: options?.encoding,\n cwd: options?.cwd,\n windowsHide: true,\n env: options?.env,\n });\n return typeof output === 'string' ? output : output.toString('utf-8');\n}\n\nfunction execCommandAsync(\n cmd: string,\n args: string[],\n callback: (err: Error | null, stdout: string, stderr: string) => void,\n): void {\n execFile(\n cmd,\n args,\n { shell: shouldUseShellForCommand(cmd), encoding: 'utf8', windowsHide: true },\n (err, stdout, stderr) => callback(err ?? null, stdout, stderr),\n );\n}\n\nfunction splitCommandLine(command: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: '\"' | '\\'' | null = null;\n\n for (const ch of command.trim()) {\n if (quote) {\n if (ch === quote) {\n quote = null;\n } else {\n current += ch;\n }\n continue;\n }\n\n if (ch === '\"' || ch === '\\'') {\n quote = ch;\n continue;\n }\n\n if (/\\s/.test(ch)) {\n if (current) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += ch;\n }\n\n if (quote) {\n throw new Error(`Unterminated quote in command: ${command}`);\n }\n\n if (current) tokens.push(current);\n return tokens;\n}\n\nfunction resolveCommandInvocation(rawCmd: string, rawArgs: string[]): { cmd: string; args: string[] } {\n if (/^(node|node\\.exe)$/i.test(rawCmd)) {\n return { cmd: process.execPath, args: rawArgs };\n }\n // Keep script-based commands consistent for source and inference paths.\n if (/\\.m?js$/i.test(rawCmd)) {\n return { cmd: process.execPath, args: [rawCmd, ...rawArgs] };\n }\n return { cmd: rawCmd, args: rawArgs };\n}\n\nfunction spawnDetachedProcessAccumulatedWorker(boardDir: string): boolean {\n const { cmd, args: cliArgs } = getCliInvocation('process-accumulated-events', ['--rg', boardDir, '--inline-loop']);\n try {\n spawnDetachedCommand(cmd, cliArgs);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function processAccumulatedEventsInlineLoop(boardDir: string, settleDelayMs = 50): Promise<boolean> {\n while (determineLatestPendingAccumulated(boardDir) > 0) {\n const ran = processAccumulatedEvents(boardDir);\n if (!ran) return false;\n await new Promise<void>(resolve => setTimeout(resolve, settleDelayMs));\n }\n return true;\n}\n\nfunction shouldAvoidDetachedProcessSpawn(): boolean {\n return process.env.BOARD_LIVE_CARDS_NO_SPAWN === '1';\n}\n\n/**\n * Run one lock-guarded processing pass for this board.\n *\n * GUARANTEE (single-pass only):\n * - At most one process performs this pass at a time (board lock).\n * - If lock is acquired, exactly one drain/apply/save cycle is executed.\n * - If lock is busy, returns false immediately (no waiting).\n *\n * This function does NOT guarantee full settlement; it only advances the baton\n * by one cycle in the relay model.\n */\nexport function processAccumulatedEvents(boardDir: string): boolean {\n const boardPath = path.join(boardDir, BOARD_FILE);\n let release: (() => void) | undefined;\n try {\n release = lockSync(boardPath, { retries: 0 });\n } catch {\n // Lock held by another process — it will drain our entries\n return false;\n }\n try {\n const { rg, journal } = createBoardReactiveGraph(boardDir);\n // Explicitly drain the external journal and push events into the reactive graph.\n // The engine never reads from external storage — the caller owns that boundary.\n const undrained = journal.drain();\n rg.pushAll(undrained);\n saveBoard(boardDir, rg, journal);\n rg.dispose();\n return true;\n } finally {\n release!();\n }\n}\n\n/**\n * Schedule continued draining until the board eventually settles.\n *\n * GUARANTEE (system-level eventual progress):\n * - Default behavior launches a detached background worker process that runs\n * `process-accumulated-events --inline-loop`.\n * - Returns quickly to caller; does not synchronously wait for settlement.\n * - Under relay assumptions, pending entries eventually drain to zero:\n * 1) at least one runner continues, 2) no crash/forced exit in relay window,\n * 3) lock remains healthy, 4) new events do not arrive forever.\n *\n * INTERNAL MODE:\n * - `inlineLoop: true` executes the while(pending) loop in the current process.\n * - Used by the worker command to avoid recursive worker spawning.\n */\nexport async function processAccumulatedEventsInfinitePass(\n boardDir: string,\n settleDelayMs = 50,\n options?: { inlineLoop?: boolean },\n): Promise<boolean> {\n if (options?.inlineLoop || shouldAvoidDetachedProcessSpawn()) {\n return processAccumulatedEventsInlineLoop(boardDir, settleDelayMs);\n }\n return spawnDetachedProcessAccumulatedWorker(boardDir);\n}\n\n/**\n * Forced drain entrypoint: first run one immediate pass, then delegate to\n * infinite-pass continuation.\n *\n * GUARANTEE:\n * - In default mode, this guarantees immediate forward progress (single pass)\n * and guaranteed scheduling of eventual continuation (background worker).\n * - In `inlineLoop` mode, this runs full in-process settle loop and returns\n * only after pending reaches zero (or lock contention aborts loop).\n */\nexport async function processAccumulatedEventsForced(\n boardDir: string,\n options?: { inlineLoop?: boolean },\n): Promise<void> {\n processAccumulatedEvents(boardDir);\n await processAccumulatedEventsInfinitePass(boardDir, 50, options);\n}\n\n// ============================================================================\n// Card transform\n// ============================================================================\n\nexport type BoardLiveCard = LiveCard;\n\n/**\n * Transform a LiveCard into a TaskConfig for the reactive graph.\n *\n * Every card gets handler: 'card-handler'.\n * The handler inspects the card and decides what to do:\n * run compute, invoke sources.\n */\nexport function liveCardToTaskConfig(card: BoardLiveCard): TaskConfig {\n const requires = card.requires;\n const provides = card.provides?.map(p => p.bindTo) ?? [];\n\n return {\n requires: requires && requires.length > 0 ? requires : undefined,\n provides,\n taskHandlers: ['card-handler'],\n description: card.meta?.title ?? card.id,\n };\n}\n\n// ============================================================================\n// Reactive graph factory\n// ============================================================================\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst REPO_ROOT = path.resolve(__dirname, '..', '..');\nconst LOCAL_TSX_CLI = path.join(REPO_ROOT, 'node_modules', 'tsx', 'dist', 'cli.mjs');\n\n/**\n * Generalized CLI invocation: determines how to invoke this script in current environment.\n * Returns { cmd, args } suitable for execFile() or execFileSync().\n */\nfunction getCliInvocation(command: string, args: string[]): { cmd: string; args: string[] } {\n const jsPath = path.join(__dirname, 'board-live-cards-cli.js');\n if (fs.existsSync(jsPath)) {\n return { cmd: process.execPath, args: [jsPath, command, ...args] };\n }\n\n const tsPath = path.join(__dirname, 'board-live-cards-cli.ts');\n if (fs.existsSync(tsPath) && fs.existsSync(LOCAL_TSX_CLI)) {\n return { cmd: process.execPath, args: [LOCAL_TSX_CLI, tsPath, command, ...args] };\n }\n\n const npxCmd = process.platform === 'win32' ? 'npx.cmd' : 'npx';\n return { cmd: npxCmd, args: ['tsx', tsPath, command, ...args] };\n}\n\nfunction invokeRunSources(\n boardDir: string,\n cardPath: string,\n callbackToken: string,\n callback: (err: Error | null) => void,\n): void {\n const args = ['--card', cardPath, '--token', callbackToken, '--rg', boardDir];\n const { cmd, args: cmdArgs } = getCliInvocation('run-sources-internal', args);\n try {\n spawnDetachedCommand(cmd, cmdArgs);\n callback(null);\n } catch (err) {\n callback(err instanceof Error ? err : new Error(String(err)));\n }\n}\n\nfunction invokeRunInference(boardDir: string, cardId: string, inputFile: string, callbackToken: string, checksum: string | undefined, callback: (err: Error | null) => void): void {\n const inferenceToken = encodeSourceToken({ cbk: callbackToken, rg: boardDir, cid: cardId, b: '', d: '', cs: checksum });\n const { cmd, args } = getCliInvocation('run-inference-internal', ['--in', inputFile, '--token', inferenceToken]);\n try {\n spawnDetachedCommand(cmd, args);\n callback(null);\n } catch (err) {\n callback(err instanceof Error ? err : new Error(String(err)));\n }\n}\n\n\n\nfunction appendTaskExecutorLog(\n boardDir: string,\n hydratedSource: unknown,\n mode: 'external-task-executor' | 'built-in-run-source-fetch',\n): void {\n try {\n const entry = {\n timestamp: new Date().toISOString(),\n mode,\n hydratedSource,\n };\n fs.appendFileSync(path.join(boardDir, TASK_EXECUTOR_LOG_FILE), JSON.stringify(entry) + '\\n', 'utf-8');\n } catch (logErr) {\n console.error(`[task-executor-log] append failed: ${logErr instanceof Error ? logErr.message : String(logErr)}`);\n }\n}\n\nfunction appendInferenceAdapterLog(boardDir: string, cardId: string, payload: unknown): void {\n try {\n const entry = {\n timestamp: new Date().toISOString(),\n cardId,\n payload,\n };\n fs.appendFileSync(path.join(boardDir, INFERENCE_ADAPTER_LOG_FILE), JSON.stringify(entry) + '\\n', 'utf-8');\n } catch (logErr) {\n console.error(`[inference-adapter-log] append failed: ${logErr instanceof Error ? logErr.message : String(logErr)}`);\n }\n}\n\nfunction invokeSourceDataFetched(sourceToken: string, tmpFile: string, callback: (err: Error | null) => void): void {\n const { cmd, args } = getCliInvocation('source-data-fetched', ['--tmp', tmpFile, '--token', sourceToken]);\n execCommandAsync(cmd, args, (err, stdout, stderr) => {\n if (err) console.error(`[source-data-fetched] call failed:`, err.message);\n if (stdout) console.log(stdout.trim());\n if (stderr) console.error(stderr.trim());\n callback(err);\n });\n}\n\nfunction invokeSourceDataFetchFailure(sourceToken: string, reason: string, callback: (err: Error | null) => void): void {\n const { cmd, args } = getCliInvocation('source-data-fetch-failure', ['--token', sourceToken, '--reason', reason]);\n execCommandAsync(cmd, args, (err) => callback(err));\n}\n\n/**\n * Spin up a ReactiveGraph from a board directory with all handlers wired.\n *\n * Single handler:\n * card-handler — reads card.json, loads sourcesData from outputFiles, runs CardCompute,\n * checks undelivered sources, emits task-completed or spawns run-sources-internal.\n * Fire & forget — returns 'task-initiated' immediately.\n */\nexport interface BoardReactiveGraph {\n rg: ReactiveGraph;\n journal: BoardJournal;\n}\n\nexport function createBoardReactiveGraph(boardDir: string): BoardReactiveGraph {\n const envelope = loadBoardEnvelope(boardDir);\n const live = restore(envelope.graph);\n const journalPath = path.join(boardDir, JOURNAL_FILE);\n const journal = new BoardJournal(journalPath, envelope.lastDrainedJournalId);\n\n const handlers: Record<string, TaskHandlerFn> = {\n 'card-handler': async (input) => {\n const cardPath = lookupCardPath(boardDir, input.nodeId);\n if (!cardPath) return 'task-initiate-failure';\n\n const card = JSON.parse(fs.readFileSync(cardPath, 'utf-8')) as Record<string, unknown>;\n const cardId = card.id as string;\n const cardState = (card.card_data ?? {}) as Record<string, unknown>;\n const allSources: ComputeSource[] = (card.sources ?? []) as ComputeSource[];\n // optionalForCompletionGating defaults to false when absent.\n const requiredSources = allSources.filter(s => s.optionalForCompletionGating !== true);\n\n // Read (or initialise) the runtime sidecar\n const runtime = readRuntimeState(boardDir, cardId);\n let runtimeDirty = false;\n\n // ---- If the task was restarted, clear stale source/inference state ----\n const currentExecutionCount = input.taskState?.executionCount ?? 0;\n if (typeof runtime._lastExecutionCount === 'number' && runtime._lastExecutionCount !== currentExecutionCount) {\n runtime._sources = {};\n runtime._inferenceEntry = undefined;\n }\n if (runtime._lastExecutionCount !== currentExecutionCount) {\n runtime._lastExecutionCount = currentExecutionCount;\n runtimeDirty = true;\n }\n\n // ---- Handle a task-progress re-invocation (source delivery or failure) ----\n if (input.update) {\n const u = input.update;\n const outputFile = u.outputFile as string;\n // Only process source updates (which have outputFile); skip non-source updates like inference-done\n if (outputFile) {\n if (!runtime._sources[outputFile]) runtime._sources[outputFile] = {};\n const entry = runtime._sources[outputFile];\n\n if (u.failure) {\n // Source fetch failed — record error, stay in-progress\n runtime._sources[outputFile] = nextEntryAfterFetchFailure(entry, (u.reason as string | undefined) ?? 'unknown');\n runtimeDirty = true;\n } else {\n // Successful delivery — output file already in place by CLI\n runtime._sources[outputFile] = nextEntryAfterFetchDelivery(\n entry,\n (u.fetchedAt as string | undefined) ?? new Date().toISOString(),\n );\n runtimeDirty = true;\n }\n\n if (runtimeDirty) writeRuntimeState(boardDir, cardId, runtime);\n }\n }\n\n // ---- Load sourcesData from outputFiles ----\n const sourcesData: Record<string, unknown> = {};\n for (const src of allSources) {\n if (src.outputFile) {\n const filePath = path.join(boardDir, src.outputFile);\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, 'utf-8').trim();\n try { sourcesData[src.bindTo] = JSON.parse(raw); }\n catch { sourcesData[src.bindTo] = raw; }\n }\n }\n }\n\n // ---- Run compute ----\n // input.state[token] = the full task-completed data object from the producer\n // (e.g. { orders: [...] }). Unwrap to the specific token value so that\n // compute expressions see requires.orders = [...] not requires.orders = { orders: [...] }.\n const requires: Record<string, unknown> = {};\n for (const [token, taskData] of Object.entries(input.state ?? {})) {\n if (taskData !== null && typeof taskData === 'object' && !Array.isArray(taskData)) {\n const unwrapped = (taskData as Record<string, unknown>)[token];\n requires[token] = unwrapped !== undefined ? unwrapped : taskData;\n } else {\n requires[token] = taskData;\n }\n }\n\n const computeNode: ComputeNode = {\n id: cardId,\n card_data: { ...cardState },\n requires,\n sources: allSources,\n compute: card.compute as ComputeStep[] | undefined,\n };\n // Always populate _sourcesData so resolve(\"sources.*\") works even without compute steps.\n computeNode._sourcesData = sourcesData;\n if (card.compute) {\n await CardCompute.run(computeNode, { sourcesData });\n }\n const cvPath = resolveComputedValuesPath(boardDir, cardId);\n writeJsonAtomic(cvPath, {\n schema_version: 'v1',\n card_id: cardId,\n computed_values: computeNode.computed_values ?? {},\n });\n\n // Build enriched source payloads and checksums up-front so dispatch gating\n // can react to input changes, not only timestamp delivery state.\n const enrichedCard = { ...card };\n const enrichedSources = CardCompute.enrichSources(\n (Array.isArray(card.sources) ? card.sources : undefined),\n {\n requires,\n sourcesData,\n computed_values: computeNode.computed_values,\n }\n );\n const sourceCwd = path.dirname(cardPath);\n enrichedCard.sources = Array.isArray(enrichedSources)\n ? enrichedSources.map((src) => ({\n ...src,\n cwd: typeof src.cwd === 'string' && src.cwd ? src.cwd : sourceCwd,\n boardDir: typeof src.boardDir === 'string' && src.boardDir ? src.boardDir : boardDir,\n }))\n : enrichedSources;\n\n const enrichedByOutput = new Map<string, unknown>();\n for (const src of (Array.isArray(enrichedCard.sources) ? enrichedCard.sources : [])) {\n const outputFile = (src as { outputFile?: unknown }).outputFile;\n if (typeof outputFile === 'string' && outputFile) {\n enrichedByOutput.set(outputFile, src);\n }\n }\n\n // ---- Delivery check: source fetched after queueRequestedAt for all required sources ----\n // queueRequestedAt is stamped on every fresh card-handler dispatch (not-started / completed).\n // A source needs fetching when: never fetched, or lastFetchedAt < queueRequestedAt.\n // While a fetch is in-flight we just update queueRequestedAt so the next completion\n // sees the latest request and re-fetches if needed.\n const now = new Date().toISOString();\n // Use the invocation time as queueRequestedAt for this run.\n const runQueuedAt = input.update ? undefined : now; // only stamp on fresh dispatch, not task-progress\n\n const undeliveredRequired = requiredSources.filter(s => {\n const outputFile = s.outputFile;\n if (typeof outputFile !== 'string' || !outputFile) return true;\n if (!runtime._sources[outputFile]) runtime._sources[outputFile] = {};\n const entry = runtime._sources[outputFile];\n // On a fresh dispatch, update queueRequestedAt to the current time.\n if (runQueuedAt) {\n entry.queueRequestedAt = runQueuedAt;\n runtimeDirty = true;\n }\n const qrt = entry.queueRequestedAt ?? entry.lastRequestedAt ?? now;\n const action = decideSourceAction(entry, qrt);\n if (action === 'in-flight') return false; // wait; queueRequestedAt already updated above\n return action === 'dispatch';\n });\n\n if (runtimeDirty) writeRuntimeState(boardDir, cardId, runtime);\n\n if (undeliveredRequired.length > 0) {\n let stampedAny = false;\n for (const src of undeliveredRequired) {\n const outputFile = src.outputFile;\n if (typeof outputFile !== 'string' || !outputFile) continue;\n const entry = runtime._sources[outputFile] ?? {};\n markRequested(entry, now);\n runtime._sources[outputFile] = entry;\n stampedAny = true;\n }\n if (stampedAny) writeRuntimeState(boardDir, cardId, runtime);\n if (!stampedAny) return 'task-initiated';\n\n // Write enriched card to temp location for this invocation\n const enrichedCardPath = path.join(os.tmpdir(), `card-enriched-${cardId}-${Date.now()}.json`);\n fs.writeFileSync(enrichedCardPath, JSON.stringify(enrichedCard, null, 2), 'utf-8');\n\n invokeRunSources(boardDir, enrichedCardPath, input.callbackToken, (err) => {\n if (err) {\n console.error(`[card-handler] ${input.nodeId}:`, err.message);\n try { fs.unlinkSync(enrichedCardPath); } catch {}\n }\n });\n return 'task-initiated';\n }\n\n // ---- All required sources delivered — build provides payload ----\n const providesBindings = (card.provides ?? []) as { bindTo: string; src: string }[];\n const data: Record<string, unknown> = {};\n for (const { bindTo, src } of providesBindings) {\n data[bindTo] = CardCompute.resolve(computeNode, src);\n }\n\n const completionRule = typeof card.when_is_task_completed === 'string' && card.when_is_task_completed.trim()\n ? card.when_is_task_completed.trim()\n : DEFAULT_TASK_COMPLETION_RULE;\n\n const cardData = card.card_data as Record<string, unknown> | undefined;\n const llmCompletion = (cardData?.llm_task_completion_inference ?? {}) as Record<string, unknown>;\n const isLlmTaskCompleted = llmCompletion.isTaskCompleted === true;\n // inferenceRequested lives in the runtime sidecar, not the card file\n const inferenceEntry = runtime._inferenceEntry ?? {};\n const inferenceRequestedAt = typeof inferenceEntry.lastRequestedAt === 'string'\n ? inferenceEntry.lastRequestedAt\n : undefined;\n const inferenceCompletedAt = typeof llmCompletion.inferenceCompletedAt === 'string'\n ? llmCompletion.inferenceCompletedAt\n : undefined;\n const inferencePending = !!inferenceRequestedAt\n && (!inferenceCompletedAt || inferenceCompletedAt < inferenceRequestedAt);\n\n const latestRequiredSourceFetchedAt = requiredSources.reduce<string | undefined>((latest, src) => {\n const fetchedAt = runtime._sources[src.outputFile]?.lastFetchedAt;\n if (typeof fetchedAt !== 'string') return latest;\n if (!latest || fetchedAt > latest) return fetchedAt;\n return latest;\n }, undefined);\n\n const shouldRequestInference = !inferenceRequestedAt\n || !inferenceCompletedAt\n || (!!latestRequiredSourceFetchedAt && latestRequiredSourceFetchedAt > inferenceCompletedAt);\n\n if (completionRule !== DEFAULT_TASK_COMPLETION_RULE) {\n if (isLlmTaskCompleted) {\n // Card carries adapter-evaluated completion; proceed with deterministic completion path below.\n } else if (inferencePending) {\n // Request already in flight. Wait for completion callback.\n return 'task-initiated';\n } else if (!shouldRequestInference) {\n // Latest inference has completed and inputs are unchanged. Keep task in progress.\n return 'task-initiated';\n } else {\n const now = new Date().toISOString();\n const inferencePayload = {\n cardId,\n taskName: input.nodeId,\n completionRule,\n context: {\n requires,\n sourcesData,\n computed_values: computeNode.computed_values ?? {},\n provides: data,\n card_data: computeNode.card_data ?? {},\n },\n };\n\n // Gate inference dispatch using queueRequestedAt — same pattern as source fetches.\n // On a fresh card-handler dispatch update queueRequestedAt; if in-flight just wait.\n if (runQueuedAt) {\n inferenceEntry.queueRequestedAt = runQueuedAt;\n runtimeDirty = true;\n }\n const inferenceQrt = inferenceEntry.queueRequestedAt ?? inferenceEntry.lastRequestedAt ?? now;\n const inferenceAction = decideSourceAction(inferenceEntry, inferenceQrt);\n\n if (inferenceAction === 'in-flight') {\n // Fetch in-flight; queueRequestedAt already updated — wait for completion.\n runtime._inferenceEntry = inferenceEntry;\n if (runtimeDirty) writeRuntimeState(boardDir, cardId, runtime);\n return 'task-initiated';\n }\n\n if (inferenceAction === 'idle') {\n // Already fetched for this run.\n return 'task-initiated';\n }\n\n // dispatch — proceed with invocation\n const inferenceInFile = path.join(os.tmpdir(), `card-inference-${cardId}-${Date.now()}.json`);\n fs.writeFileSync(inferenceInFile, JSON.stringify(inferencePayload, null, 2), 'utf-8');\n appendInferenceAdapterLog(boardDir, cardId, inferencePayload);\n\n markRequested(inferenceEntry, now);\n runtime._inferenceEntry = inferenceEntry;\n runtimeDirty = true;\n\n invokeRunInference(boardDir, cardId, inferenceInFile, input.callbackToken, undefined, (err) => {\n if (err) {\n console.error(`[card-handler] ${input.nodeId}:`, err.message);\n const failedAt = new Date().toISOString();\n appendEventToJournal(boardDir, {\n type: 'task-failed',\n taskName: input.nodeId,\n error: err.message,\n timestamp: failedAt,\n });\n }\n });\n return 'task-initiated';\n }\n }\n\n // Persist task-completed token objects for SSE/runtime consumers.\n writeRuntimeDataObjects(boardDir, data);\n\n // Spawn undelivered non-gating sources in background.\n const undeliveredOptional = allSources.filter(s => {\n if (s.optionalForCompletionGating !== true) return false;\n const entry = runtime._sources[s.outputFile];\n if (!entry?.lastRequestedAt) return true;\n if (!entry.lastFetchedAt) return true;\n return entry.lastFetchedAt <= entry.lastRequestedAt;\n });\n if (undeliveredOptional.length > 0) {\n invokeRunSources(boardDir, cardPath, input.callbackToken, (err) => {\n if (err) console.error(`[card-handler] ${input.nodeId}:`, err.message);\n });\n }\n\n appendEventToJournal(boardDir, {\n type: 'task-completed',\n taskName: input.nodeId,\n data,\n timestamp: new Date().toISOString(),\n });\n return 'task-initiated';\n },\n };\n\n const rg = createReactiveGraph(live, { handlers });\n return { rg, journal };\n}\n\n// ============================================================================\n// CLI\n// ============================================================================\n\n/**\n * Helper function to add a single card from file.\n * Throws errors instead of calling process.exit() so it can be used in tests.\n */\nfunction addSingleCardFromFile(dir: string, cardFile: string): void {\n const absCardPath = path.resolve(cardFile);\n if (!fs.existsSync(absCardPath)) {\n throw new Error(`Card file not found: ${absCardPath}`);\n }\n\n let card: BoardLiveCard;\n try {\n card = JSON.parse(fs.readFileSync(absCardPath, 'utf-8'));\n } catch (err) {\n throw new Error(`Failed to parse card file: ${absCardPath} - ${err instanceof Error ? err.message : String(err)}`);\n }\n\n if (!card.id) {\n throw new Error('Card JSON must have an \"id\" field');\n }\n\n // Check for duplicate\n const existing = readCardInventory(dir);\n if (existing.some(e => e.cardId === card.id)) {\n throw new Error(`Card \"${card.id}\" already exists in inventory`);\n }\n\n // Append to inventory first — handlers need it to look up card paths\n appendCardInventory(dir, {\n cardId: card.id,\n cardFilePath: absCardPath,\n addedAt: new Date().toISOString(),\n });\n\n // Transform card → TaskConfig\n const taskConfig = liveCardToTaskConfig(card);\n\n // 1. Append task-upsert event to journal (no lock)\n appendEventToJournal(dir, {\n type: 'task-upsert',\n taskName: card.id,\n taskConfig,\n timestamp: new Date().toISOString(),\n });\n\n console.log(`Card \"${card.id}\" added to board at ${path.resolve(dir)} (drain scheduled)`);\n console.log(` taskHandlers: [${taskConfig.taskHandlers?.join(', ') ?? ''}]`);\n console.log(` provides: [${taskConfig.provides.join(', ')}]`);\n if (taskConfig.requires) console.log(` requires: [${taskConfig.requires.join(', ')}]`);\n}\n\nfunction resolveCardGlobMatches(cardGlob: string): string[] {\n const patterns = cardGlob\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n .map(p => p.replace(/\\\\/g, '/'));\n const matches = fg.sync(patterns, {\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: false,\n });\n // fast-glob returns forward-slash paths; normalise to native so comparisons\n // against inventory entries (which use path.resolve → backslash on Windows) match.\n return [...matches].map(m => path.resolve(m)).sort((a, b) => a.localeCompare(b));\n}\n\nfunction cmdAddCards(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const cardIdx = args.indexOf('--card');\n const globIdx = args.indexOf('--card-glob');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const cardFile = cardIdx !== -1 ? args[cardIdx + 1] : undefined;\n const cardGlob = globIdx !== -1 ? args[globIdx + 1] : undefined;\n \n if (!dir || (!cardFile && !cardGlob) || (cardFile && cardGlob)) {\n throw new Error('Usage: board-live-cards add-cards --rg <dir> (--card <card.json> | --card-glob <glob>)');\n }\n\n if (cardFile) {\n addSingleCardFromFile(dir, cardFile);\n } else {\n const matches = resolveCardGlobMatches(cardGlob!);\n if (matches.length === 0) {\n throw new Error(`No card files matched glob: ${cardGlob}`);\n }\n for (const match of matches) {\n addSingleCardFromFile(dir, match);\n }\n console.log(`Added ${matches.length} cards from glob: ${cardGlob}`);\n }\n\n void processAccumulatedEventsInfinitePass(dir);\n}\n\n\nfunction cmdInit(args: string[]): void {\n const dir = args[0];\n if (!dir) { \n throw new Error('Usage: board-live-cards init <dir> [--task-executor <script>] [--chat-handler <script>] [--inference-adapter <script>] [--runtime-out <dir>]');\n }\n\n const teIdx = args.indexOf('--task-executor');\n const taskExecutor = teIdx !== -1 ? args[teIdx + 1] : undefined;\n const chIdx = args.indexOf('--chat-handler');\n const chatHandler = chIdx !== -1 ? args[chIdx + 1] : undefined;\n const iaIdx = args.indexOf('--inference-adapter');\n const inferenceAdapter = iaIdx !== -1 ? args[iaIdx + 1] : undefined;\n const roIdx = args.indexOf('--runtime-out');\n const runtimeOut = roIdx !== -1 ? args[roIdx + 1] : undefined;\n if (roIdx !== -1 && !runtimeOut) {\n throw new Error('Usage: board-live-cards init <dir> [--task-executor <script>] [--chat-handler <script>] [--inference-adapter <script>] [--runtime-out <dir>]');\n }\n\n const result = initBoard(dir);\n\n if (taskExecutor) {\n fs.writeFileSync(path.join(dir, '.task-executor'), taskExecutor, 'utf-8');\n }\n if (chatHandler) {\n fs.writeFileSync(path.join(dir, '.chat-handler'), chatHandler, 'utf-8');\n }\n if (inferenceAdapter) {\n fs.writeFileSync(path.join(dir, INFERENCE_ADAPTER_FILE), inferenceAdapter, 'utf-8');\n }\n\n const runtimeOutDir = configureRuntimeOutDir(dir, runtimeOut);\n // Ensure status snapshot exists right after init.\n const live = loadBoard(dir);\n writeJsonAtomic(resolveStatusSnapshotPath(dir), buildBoardStatusObject(dir, live));\n\n if (result === 'exists') {\n console.log(`Board already initialized at ${path.resolve(dir)}${taskExecutor ? ` (task-executor updated: ${taskExecutor})` : ''} (runtime-out: ${runtimeOutDir})`);\n } else {\n console.log(`Board initialized at ${path.resolve(dir)}${taskExecutor ? ` (task-executor: ${taskExecutor})` : ''} (runtime-out: ${runtimeOutDir})`);\n }\n}\n\nfunction buildBoardStatusObject(dir: string, live: LiveGraph): BoardStatusObject {\n const taskState = live.state.tasks;\n const taskConfig = live.config.tasks;\n const cardNames = Object.keys(taskState);\n const sched = schedule(live);\n\n const statusCounts = {\n completed: 0,\n failed: 0,\n in_progress: 0,\n pending: 0,\n blocked: 0,\n unresolved: 0,\n };\n\n const waitingByCard = new Map<string, string[]>();\n for (const p of sched.pending) waitingByCard.set(p.taskName, p.waitingOn);\n for (const u of sched.unresolved) waitingByCard.set(u.taskName, u.missingTokens);\n for (const b of sched.blocked) waitingByCard.set(b.taskName, b.failedTokens);\n\n const dependentsByToken = new Map<string, string[]>();\n for (const [name, cfg] of Object.entries(taskConfig)) {\n for (const token of cfg.requires ?? []) {\n const dependents = dependentsByToken.get(token) ?? [];\n dependents.push(name);\n dependentsByToken.set(token, dependents);\n }\n }\n\n const cards: BoardStatusCard[] = cardNames.sort().map((name) => {\n const state = taskState[name] as {\n status: string;\n data?: Record<string, unknown>;\n error?: string;\n startedAt?: string;\n completedAt?: string;\n failedAt?: string;\n lastUpdated?: string;\n executionCount?: number;\n retryCount?: number;\n };\n const cfg = taskConfig[name] ?? { requires: [], provides: [] };\n\n if (state.status === 'completed') statusCounts.completed += 1;\n else if (state.status === 'failed') statusCounts.failed += 1;\n else if (state.status === 'in-progress') statusCounts.in_progress += 1;\n\n const requires = cfg.requires ?? [];\n const provides = cfg.provides ?? [];\n const runtimeKeys = Object.keys(state.data ?? {}).sort();\n const requiresSatisfied = requires.filter((token) => live.state.availableOutputs.includes(token));\n const requiresMissing = requires.filter((token) => !live.state.availableOutputs.includes(token));\n const blockedBy = waitingByCard.get(name) ?? requiresMissing;\n\n const unblocks = new Set<string>();\n for (const token of provides) {\n for (const dependent of dependentsByToken.get(token) ?? []) {\n if (dependent !== name) unblocks.add(dependent);\n }\n }\n\n const lastFailureAt = state.failedAt;\n const error = state.error\n ? {\n message: state.error,\n code: 'TASK_FAILED',\n at: lastFailureAt,\n source: 'task-runtime' as const,\n }\n : undefined;\n\n return {\n name,\n status: state.status,\n error,\n requires,\n requires_satisfied: requiresSatisfied,\n requires_missing: requiresMissing,\n provides_declared: provides,\n provides_runtime: runtimeKeys,\n blocked_by: blockedBy,\n unblocks: Array.from(unblocks).sort(),\n runtime: {\n attempt_count: state.executionCount ?? 0,\n restart_count: state.retryCount ?? 0,\n in_progress_since: state.status === 'in-progress' ? (state.startedAt ?? null) : null,\n last_transition_at: state.lastUpdated ?? null,\n last_completed_at: state.completedAt ?? null,\n last_restarted_at: state.startedAt ?? null,\n status_age_ms: state.lastUpdated ? Math.max(0, Date.now() - Date.parse(state.lastUpdated)) : null,\n },\n };\n });\n\n statusCounts.pending = sched.pending.length;\n statusCounts.blocked = sched.blocked.length;\n statusCounts.unresolved = sched.unresolved.length;\n\n const fanOut = cards\n .map((c) => ({ name: c.name, fanOut: c.unblocks.length }))\n .sort((a, b) => b.fanOut - a.fanOut || a.name.localeCompare(b.name));\n const maxFanOut = fanOut.length > 0 ? fanOut[0] : { name: null, fanOut: 0 };\n\n const allRequires = new Set<string>();\n for (const cfg of Object.values(taskConfig)) {\n for (const r of cfg.requires ?? []) allRequires.add(r);\n }\n let orphanCards = 0;\n for (const [name, cfg] of Object.entries(taskConfig)) {\n const requiresNone = (cfg.requires ?? []).length === 0;\n const provides = cfg.provides ?? [];\n const feedsAny = provides.some((p) => (dependentsByToken.get(p) ?? []).some((d) => d !== name));\n if (requiresNone && !feedsAny) orphanCards += 1;\n }\n\n return {\n schema_version: 'v1',\n meta: {\n board: {\n path: path.resolve(dir),\n },\n },\n summary: {\n card_count: cardNames.length,\n completed: statusCounts.completed,\n eligible: sched.eligible.length,\n pending: statusCounts.pending,\n blocked: statusCounts.blocked,\n unresolved: statusCounts.unresolved,\n failed: statusCounts.failed,\n in_progress: statusCounts.in_progress,\n orphan_cards: orphanCards,\n topology: {\n edge_count: Array.from(allRequires).length,\n max_fan_out_card: maxFanOut.name,\n max_fan_out: maxFanOut.fanOut,\n },\n },\n cards,\n };\n}\n\nfunction cmdStatus(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const asJson = args.includes('--json');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n if (!dir) { console.error('Usage: board-live-cards status --rg <dir>'); process.exit(1); }\n\n const statusOutPath = resolveStatusSnapshotPath(dir);\n let statusObject: BoardStatusObject;\n if (fs.existsSync(statusOutPath)) {\n statusObject = JSON.parse(fs.readFileSync(statusOutPath, 'utf-8')) as BoardStatusObject;\n } else {\n // Backfill once if snapshot file doesn't exist yet.\n statusObject = buildBoardStatusObject(dir, loadBoard(dir));\n writeJsonAtomic(statusOutPath, statusObject);\n }\n\n if (asJson) {\n console.log(JSON.stringify(statusObject, null, 2));\n return;\n }\n\n console.log(`Board: ${statusObject.meta.board.path}`);\n console.log(`Tasks: ${statusObject.summary.card_count}`);\n console.log('');\n\n for (const card of statusObject.cards) {\n const dataKeys = card.provides_runtime.join(', ');\n console.log(` ${card.status.padEnd(12)} ${card.name}${dataKeys ? ` — [${dataKeys}]` : ''}`);\n }\n\n console.log('');\n console.log(`Schedule: ${statusObject.summary.eligible} eligible, ${statusObject.summary.pending} pending, ${statusObject.summary.blocked} blocked, ${statusObject.summary.unresolved} unresolved`);\n}\n\nexport interface BoardStatusCard {\n name: string;\n status: string;\n error?: {\n message: string;\n code?: string;\n at?: string;\n source?: 'task-runtime' | 'source-fetch' | 'timeout' | 'unknown';\n };\n requires: string[];\n requires_satisfied: string[];\n requires_missing: string[];\n provides_declared: string[];\n provides_runtime: string[];\n blocked_by: string[];\n unblocks: string[];\n runtime: {\n attempt_count: number;\n restart_count: number;\n in_progress_since: string | null;\n last_transition_at: string | null;\n last_completed_at: string | null;\n last_restarted_at: string | null;\n status_age_ms: number | null;\n };\n}\n\nexport interface BoardStatusObject {\n schema_version: 'v1';\n meta: {\n board: {\n path: string;\n };\n };\n summary: {\n card_count: number;\n completed: number;\n eligible: number;\n pending: number;\n blocked: number;\n unresolved: number;\n failed?: number;\n in_progress?: number;\n orphan_cards?: number;\n topology?: {\n edge_count: number;\n max_fan_out_card: string | null;\n max_fan_out: number;\n };\n };\n cards: BoardStatusCard[];\n}\n\nfunction cmdTaskCompleted(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const tokenIdx = args.indexOf('--token');\n const dataIdx = args.indexOf('--data');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n if (!dir || !token) {\n console.error('Usage: board-live-cards task-completed --rg <dir> --token <token> [--data <json>]');\n process.exit(1);\n }\n\n const decoded = decodeCallbackToken(token);\n if (!decoded) {\n console.error('Invalid callback token');\n process.exit(1);\n }\n\n const data: Record<string, unknown> = dataIdx !== -1\n ? JSON.parse(args[dataIdx + 1])\n : {};\n\n // Persist task-completed token objects for SSE/runtime consumers.\n writeRuntimeDataObjects(dir, data);\n\n // 1. Append event to journal (no lock)\n appendEventToJournal(dir, {\n type: 'task-completed',\n taskName: decoded.taskName,\n data,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsForced(dir);\n console.log('Task completed.');\n}\n\nfunction cmdTaskFailed(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const tokenIdx = args.indexOf('--token');\n const errorIdx = args.indexOf('--error');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n const errorMsg = errorIdx !== -1 ? args[errorIdx + 1] : 'unknown error';\n if (!dir || !token) {\n console.error('Usage: board-live-cards task-failed --rg <dir> --token <token> [--error <message>]');\n process.exit(1);\n }\n\n const decoded = decodeCallbackToken(token);\n if (!decoded) {\n console.error('Invalid callback token');\n process.exit(1);\n }\n\n // 1. Append event to journal (no lock)\n appendEventToJournal(dir, {\n type: 'task-failed',\n taskName: decoded.taskName,\n error: errorMsg,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsForced(dir);\n console.log('Task failed.');\n}\n\nfunction cmdRemoveCard(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const idIdx = args.indexOf('--id');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const cardId = idIdx !== -1 ? args[idIdx + 1] : undefined;\n if (!dir || !cardId) {\n console.error('Usage: board-live-cards remove-card --rg <dir> --id <card-id>');\n process.exit(1);\n }\n\n appendEventToJournal(dir, {\n type: 'task-removal',\n taskName: cardId,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsInfinitePass(dir);\n console.log(`Card \"${cardId}\" removed.`);\n}\n\nfunction cmdSourceDataFetched(args: string[]): void {\n const tmpIdx = args.indexOf('--tmp');\n const tokenIdx = args.indexOf('--token');\n const tmpFile = tmpIdx !== -1 ? args[tmpIdx + 1] : undefined;\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n if (!tmpFile || !token) {\n console.error('Usage: board-live-cards source-data-fetched --tmp <tmp-file> --token <sourceToken>');\n process.exit(1);\n }\n\n const payload = decodeSourceToken(token);\n if (!payload) {\n console.error('Invalid source token');\n process.exit(1);\n }\n\n const { cbk, rg, cid, b, d, cs } = payload;\n const destPath = path.join(rg, d);\n\n // Atomic move: rename from tmp into boardDir destination\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\n fs.renameSync(tmpFile, destPath);\n console.log(`[source-data-fetched] ${cid}.${b} → ${d}`);\n\n const fetchedAt = new Date().toISOString();\n const cbkDecoded = decodeCallbackToken(cbk);\n if (!cbkDecoded) {\n console.error('Invalid callback token embedded in source token');\n process.exit(1);\n }\n\n appendEventToJournal(rg, {\n type: 'task-progress',\n taskName: cbkDecoded.taskName,\n update: { bindTo: b, outputFile: d, fetchedAt, sourceChecksum: cs },\n timestamp: fetchedAt,\n });\n\n void processAccumulatedEventsInfinitePass(rg);\n}\n\nfunction cmdSourceDataFetchFailure(args: string[]): void {\n const tokenIdx = args.indexOf('--token');\n const reasonIdx = args.indexOf('--reason');\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n const reason = reasonIdx !== -1 ? args[reasonIdx + 1] : 'unknown';\n if (!token) {\n console.error('Usage: board-live-cards source-data-fetch-failure --token <sourceToken> [--reason <msg>]');\n process.exit(1);\n }\n\n const payload = decodeSourceToken(token);\n if (!payload) {\n console.error('Invalid source token');\n process.exit(1);\n }\n\n const { cbk, rg, cid, b, d, cs } = payload;\n console.log(`[source-data-fetch-failure] ${cid}.${b}: ${reason}`);\n\n const cbkDecoded = decodeCallbackToken(cbk);\n if (!cbkDecoded) {\n console.error('Invalid callback token embedded in source token');\n process.exit(1);\n }\n\n const timestamp = new Date().toISOString();\n appendEventToJournal(rg, {\n type: 'task-progress',\n taskName: cbkDecoded.taskName,\n update: { bindTo: b, outputFile: d, failure: true, reason, sourceChecksum: cs },\n timestamp,\n });\n\n void processAccumulatedEventsInfinitePass(rg);\n}\n\nfunction cmdRunSources(args: string[]): void {\n const cardIdx = args.indexOf('--card');\n const tokenIdx = args.indexOf('--token');\n const rgIdx = args.indexOf('--rg');\n const sourceChecksumsIdx = args.indexOf('--source-checksums');\n const cardFilePath = cardIdx !== -1 ? args[cardIdx + 1] : undefined;\n const callbackToken = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n const boardDir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const sourceChecksumsJson = sourceChecksumsIdx !== -1 ? args[sourceChecksumsIdx + 1] : undefined;\n const sourceChecksums = sourceChecksumsJson ? JSON.parse(sourceChecksumsJson) as Record<string, string> : undefined;\n if (!cardFilePath || !callbackToken || !boardDir) {\n console.error('Usage: board-live-cards run-sources-internal --card <path> --token <token> --rg <dir> [--source-checksums <json>]');\n process.exit(1);\n }\n\n const card = JSON.parse(fs.readFileSync(cardFilePath, 'utf-8'));\n if (path.basename(cardFilePath).startsWith('card-enriched-')) {\n try { fs.unlinkSync(cardFilePath); } catch { /* best-effort */ }\n }\n console.log(`[run-sources-internal] Processing card \"${card.id as string}\"`);\n\n // Load registered task-executor (if any)\n const executorFile = path.join(boardDir!, '.task-executor');\n const taskExecutor = fs.existsSync(executorFile) ? fs.readFileSync(executorFile, 'utf-8').trim() : undefined;\n\n type SourceDef = {\n cli?: string;\n bindTo: string;\n outputFile?: string;\n optionalForCompletionGating?: boolean;\n timeout?: number;\n cwd?: string;\n boardDir?: string;\n };\n\n function runSource(src: SourceDef): void {\n const sourceChecksumForInvoke = src.outputFile ? sourceChecksums?.[src.outputFile] : undefined;\n const sourceToken = encodeSourceToken({\n cbk: callbackToken!,\n rg: boardDir!,\n cid: card.id as string,\n b: src.bindTo,\n d: src.outputFile ?? '',\n cs: sourceChecksumForInvoke,\n });\n\n function reportFailure(reason: string): void {\n invokeSourceDataFetchFailure(sourceToken, reason, (err) => {\n if (err) console.error(`[run-sources-internal] source-data-fetch-failure call failed:`, err.message);\n });\n }\n\n function reportFetched(outFile: string): void {\n invokeSourceDataFetched(sourceToken, outFile, () => {\n // logging already done in helper\n });\n }\n\n if (taskExecutor) {\n // External task-executor registered: invoke run-source-fetch subcommand\n if (!src.outputFile) {\n console.warn(`[run-sources-internal] source \"${src.bindTo}\" has no outputFile configured — cannot deliver`);\n reportFailure('no outputFile configured');\n return;\n }\n const inFile = path.join(os.tmpdir(), `card-source-in-${src.bindTo}-${Date.now()}.json`);\n const outFile = path.join(os.tmpdir(), `card-source-out-${src.bindTo}-${Date.now()}.json`);\n const errFile = path.join(os.tmpdir(), `card-source-err-${src.bindTo}-${Date.now()}.txt`);\n const sourceForExecutor = {\n ...src,\n cwd: typeof src.cwd === 'string' && src.cwd ? src.cwd : path.dirname(cardFilePath || ''),\n boardDir: typeof src.boardDir === 'string' && src.boardDir ? src.boardDir : boardDir,\n };\n appendTaskExecutorLog(boardDir!, sourceForExecutor, 'external-task-executor');\n fs.writeFileSync(inFile, JSON.stringify(sourceForExecutor, null, 2), 'utf-8');\n console.log(`[run-sources-internal] task-executor: ${taskExecutor} run-source-fetch --in ${inFile} --out ${outFile} --err ${errFile}`);\n try {\n execCommandSync(taskExecutor, ['run-source-fetch', '--in', inFile, '--out', outFile, '--err', errFile], {\n shell: true,\n timeout: src.timeout ?? 120_000,\n });\n } catch (err: unknown) {\n const reason = (err as Error).message ?? String(err);\n console.error(`[run-sources-internal] task-executor failed for source \"${src.bindTo}\":`, reason);\n reportFailure(reason);\n return;\n }\n if (fs.existsSync(outFile)) {\n reportFetched(outFile);\n } else {\n const errMsg = fs.existsSync(errFile) ? fs.readFileSync(errFile, 'utf-8').trim() : 'executor produced no output file';\n console.warn(`[run-sources-internal] source \"${src.bindTo}\": ${errMsg}`);\n reportFailure(errMsg);\n }\n return;\n }\n\n // No external executor: execute source.cli directly in this process.\n if (!src.outputFile) {\n console.warn(`[run-sources-internal] source \"${src.bindTo}\" has no outputFile configured — cannot deliver`);\n reportFailure('no outputFile configured');\n return;\n }\n const outFile = path.join(os.tmpdir(), `card-source-out-${src.bindTo}-${Date.now()}.json`);\n if (!src.cli) {\n const errMsg = 'source.cli is required for built-in source execution';\n console.warn(`[run-sources-internal] source \"${src.bindTo}\": ${errMsg}`);\n reportFailure(errMsg);\n return;\n }\n\n const timeout = src.timeout ?? 120_000;\n const sourceCwd = typeof src.cwd === 'string' ? src.cwd : path.dirname(cardFilePath || '');\n const sourceBoardDir = typeof src.boardDir === 'string' ? src.boardDir : boardDir;\n const sourceForBuiltInExecutor = {\n ...src,\n cwd: sourceCwd,\n boardDir: sourceBoardDir,\n };\n appendTaskExecutorLog(boardDir!, sourceForBuiltInExecutor, 'built-in-run-source-fetch');\n const cmdParts = splitCommandLine(src.cli);\n if (cmdParts.length === 0) {\n const errMsg = 'source.cli command is empty';\n console.warn(`[run-sources-internal] source \"${src.bindTo}\": ${errMsg}`);\n reportFailure(errMsg);\n return;\n }\n\n const rawCmd = cmdParts[0];\n const { cmd, args: cliArgs } = resolveCommandInvocation(rawCmd, cmdParts.slice(1));\n\n let stdout: string;\n try {\n stdout = execCommandSync(cmd, cliArgs, {\n shell: false,\n encoding: 'utf-8',\n timeout,\n cwd: sourceCwd,\n env: {\n ...process.env,\n ...(sourceBoardDir ? { BOARD_DIR: sourceBoardDir } : {}),\n },\n });\n } catch (err: unknown) {\n const reason = (err as Error).message ?? String(err);\n console.error(`[run-sources-internal] source fetch failed for source \"${src.bindTo}\":`, reason);\n reportFailure(reason);\n return;\n }\n\n fs.writeFileSync(outFile, stdout.trim(), 'utf-8');\n reportFetched(outFile);\n }\n\n const sources = (card.sources ?? []) as SourceDef[];\n for (const src of sources) {\n runSource(src);\n }\n}\n\nfunction cmdTaskProgress(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const tokenIdx = args.indexOf('--token');\n const updateIdx = args.indexOf('--update');\n\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const token = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n const updateJson = updateIdx !== -1 ? args[updateIdx + 1] : '{}';\n\n if (!dir || !token) {\n console.error('Usage: board-live-cards task-progress --rg <dir> --token <token> [--update <json>]');\n process.exit(1);\n }\n\n const decoded = decodeCallbackToken(token);\n if (!decoded) {\n console.error('Invalid callback token');\n process.exit(1);\n }\n\n const update = updateJson ? JSON.parse(updateJson) : {};\n\n appendEventToJournal(dir, {\n type: 'task-progress',\n taskName: decoded.taskName,\n update,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsInfinitePass(dir);\n}\n\nfunction cmdRunInference(args: string[]): void {\n const inIdx = args.indexOf('--in');\n const tokenIdx = args.indexOf('--token');\n const inFile = inIdx !== -1 ? args[inIdx + 1] : undefined;\n const inferenceToken = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n\n if (!inFile || !inferenceToken) {\n console.error('Usage: board-live-cards run-inference-internal --in <input.json> --token <inference-token>');\n process.exit(1);\n }\n\n // Decode inference token (encoded via encodeSourceToken: cbk, rg, cid, b='', d='', cs)\n const decodedToken = decodeSourceToken(inferenceToken);\n if (!decodedToken) {\n console.error('Invalid inference token');\n process.exit(1);\n }\n const callbackToken = decodedToken.cbk;\n const boardDir = decodedToken.rg;\n\n const cbkDecoded = decodeCallbackToken(callbackToken);\n if (!cbkDecoded) {\n console.error('Invalid callback token embedded in inference token');\n process.exit(1);\n }\n\n function spawnInferenceDone(tmpFile: string): void {\n const { cmd, args: cliArgs } = getCliInvocation('inference-done', ['--tmp', tmpFile, '--token', inferenceToken!]);\n spawnDetachedCommand(cmd, cliArgs);\n }\n\n function spawnInferenceDoneError(reason: string): void {\n const tmpFile = path.join(os.tmpdir(), `card-inference-err-${Date.now()}.json`);\n fs.writeFileSync(tmpFile, JSON.stringify({ isTaskCompleted: false, reason }), 'utf-8');\n spawnInferenceDone(tmpFile);\n }\n\n if (!fs.existsSync(inFile)) {\n spawnInferenceDoneError(`inference input not found: ${inFile}`);\n return;\n }\n\n const adapterFile = path.join(boardDir, INFERENCE_ADAPTER_FILE);\n const inferenceAdapter = fs.existsSync(adapterFile) ? fs.readFileSync(adapterFile, 'utf-8').trim() : undefined;\n if (!inferenceAdapter) {\n spawnInferenceDoneError(`inference adapter is not configured (${INFERENCE_ADAPTER_FILE})`);\n return;\n }\n\n const outFile = path.join(os.tmpdir(), `card-inference-out-${Date.now()}.json`);\n const errFile = path.join(os.tmpdir(), `card-inference-err-${Date.now()}.txt`);\n const adapterParts = splitCommandLine(inferenceAdapter);\n if (adapterParts.length === 0) {\n spawnInferenceDoneError('inference adapter command is empty');\n return;\n }\n\n const adapterRawCmd = adapterParts[0];\n const adapterRawArgs = adapterParts.slice(1);\n const { cmd: adapterCmd, args: adapterArgsPrefix } = resolveCommandInvocation(adapterRawCmd, adapterRawArgs);\n const adapterArgs = [...adapterArgsPrefix, 'run-inference', '--in', inFile, '--out', outFile, '--err', errFile];\n\n try {\n execCommandSync(adapterCmd, adapterArgs, {\n shell: false,\n timeout: 120_000,\n cwd: boardDir,\n env: {\n ...process.env,\n BOARD_DIR: boardDir,\n },\n });\n } catch (err: unknown) {\n const reason = (err as Error).message ?? String(err);\n spawnInferenceDoneError(reason);\n return;\n }\n\n if (!fs.existsSync(outFile)) {\n const errMsg = fs.existsSync(errFile)\n ? fs.readFileSync(errFile, 'utf-8').trim()\n : 'inference adapter produced no output file';\n spawnInferenceDoneError(errMsg);\n return;\n }\n\n // Adapter wrote outFile — pass it directly as --tmp; cmdInferenceDone reads and deletes it.\n spawnInferenceDone(outFile);\n}\n\nfunction cmdInferenceDone(args: string[]): void {\n const tmpIdx = args.indexOf('--tmp');\n const tokenIdx = args.indexOf('--token');\n\n const tmpFile = tmpIdx !== -1 ? args[tmpIdx + 1] : undefined;\n const inferenceToken = tokenIdx !== -1 ? args[tokenIdx + 1] : undefined;\n\n if (!tmpFile || !inferenceToken) {\n console.error('Usage: board-live-cards inference-done --tmp <result.json> --token <inference-token>');\n process.exit(1);\n }\n\n const decodedToken = decodeSourceToken(inferenceToken);\n if (!decodedToken) {\n console.error('Invalid inference token');\n process.exit(1);\n }\n\n const { cbk: callbackToken, rg: dir, cs: inputChecksum } = decodedToken;\n\n const decoded = decodeCallbackToken(callbackToken);\n if (!decoded) {\n console.error('Invalid callback token embedded in inference token');\n process.exit(1);\n }\n\n const taskName = decoded.taskName;\n const cardPath = lookupCardPath(dir, taskName);\n if (!cardPath) {\n console.error(`Card file for task \"${taskName}\" not found in inventory`);\n process.exit(1);\n }\n\n let result: { isTaskCompleted?: boolean; reason?: string; evidence?: string; data?: Record<string, unknown> } = {};\n if (fs.existsSync(tmpFile)) {\n try {\n result = JSON.parse(fs.readFileSync(tmpFile, 'utf-8').trim());\n } catch (err) {\n result = { isTaskCompleted: false, reason: `failed to parse inference result: ${err instanceof Error ? err.message : String(err)}` };\n }\n try { fs.unlinkSync(tmpFile); } catch { /* best-effort cleanup */ }\n } else {\n result = { isTaskCompleted: false, reason: `inference result file not found: ${tmpFile}` };\n }\n\n const isTaskCompletedFlag = result.isTaskCompleted === true;\n const inferenceCompletedAt = new Date().toISOString();\n\n const card = JSON.parse(fs.readFileSync(cardPath, 'utf-8')) as Record<string, unknown>;\n if (!card.card_data) card.card_data = {};\n const cardData = card.card_data as Record<string, unknown>;\n const existingInference = (cardData.llm_task_completion_inference && typeof cardData.llm_task_completion_inference === 'object')\n ? (cardData.llm_task_completion_inference as Record<string, unknown>)\n : {};\n cardData.llm_task_completion_inference = {\n ...existingInference,\n isTaskCompleted: isTaskCompletedFlag,\n reason: typeof result.reason === 'string' ? result.reason : '',\n evidence: typeof result.evidence === 'string' ? result.evidence : '',\n inferenceCompletedAt,\n };\n fs.writeFileSync(cardPath, JSON.stringify(card, null, 2), 'utf-8');\n\n // Update inference runtime entry to reflect completion\n const runtimePath = path.join(dir, `${taskName}.runtime.json`);\n let runtime: CardRuntimeState = { _sources: {} };\n if (fs.existsSync(runtimePath)) {\n try {\n runtime = JSON.parse(fs.readFileSync(runtimePath, 'utf-8')) as CardRuntimeState;\n } catch {}\n }\n\n const inferenceEntry = runtime._inferenceEntry ?? {};\n runtime._inferenceEntry = nextEntryAfterFetchDelivery(inferenceEntry, inferenceCompletedAt);\n\n fs.writeFileSync(runtimePath, JSON.stringify(runtime, null, 2), 'utf-8');\n\n appendEventToJournal(dir, {\n type: 'task-progress',\n taskName,\n update: {\n kind: 'inference-done',\n isTaskCompleted: isTaskCompletedFlag,\n inputChecksum,\n },\n timestamp: inferenceCompletedAt,\n });\n\n void processAccumulatedEventsInfinitePass(dir);\n}\n\n\n\n/**\n * Run-source-fetch protocol: execute a source definition.\n * Board-live-cards built-in implementation understands source.cli field.\n *\n * Reads source definition from --in, executes its cli field,\n * writes result to --out file. Presence of --out indicates success.\n */\nfunction cmdRunSourceFetch(args: string[]): void {\n const inIdx = args.indexOf('--in');\n const outIdx = args.indexOf('--out');\n const errIdx = args.indexOf('--err');\n\n const inFile = inIdx !== -1 ? args[inIdx + 1] : undefined;\n const outFile = outIdx !== -1 ? args[outIdx + 1] : undefined;\n const errFile = errIdx !== -1 ? args[errIdx + 1] : undefined;\n\n if (!inFile || !outFile) {\n console.error('Usage: board-live-cards run-source-fetch --in <source.json> --out <result.json> [--err <error.txt>]');\n process.exit(1);\n }\n\n if (!fs.existsSync(inFile)) {\n const msg = `Input file not found: ${inFile}`;\n if (errFile) fs.writeFileSync(errFile, msg);\n console.error(`[run-source-fetch] ${msg}`);\n process.exit(1);\n }\n\n // Parse source definition\n let source: any;\n try {\n const raw = fs.readFileSync(inFile, 'utf-8');\n source = JSON.parse(raw);\n } catch (err) {\n const msg = `Failed to parse input file: ${(err as Error).message}`;\n if (errFile) fs.writeFileSync(errFile, msg);\n console.error(`[run-source-fetch] ${msg}`);\n process.exit(1);\n }\n\n // Source must have a cli field (not script)\n if (!source.cli) {\n const msg = 'Source definition missing cli field (board-live-cards built-in executor only understands source.cli)';\n if (errFile) fs.writeFileSync(errFile, msg);\n console.error(`[run-source-fetch] ${msg}`);\n process.exit(1);\n }\n\n // Execute the source cli command\n console.log(`[run-source-fetch] executing: ${source.cli}`);\n const timeout = source.timeout ?? 120_000;\n const sourceCwd = typeof source.cwd === 'string' ? source.cwd : process.cwd();\n const sourceBoardDir = typeof source.boardDir === 'string' ? source.boardDir : undefined;\n\n // Parse command with quote support to preserve args like --flag \"value with spaces\".\n const cmdParts = splitCommandLine(source.cli);\n if (cmdParts.length === 0) {\n const msg = 'Source cli command is empty';\n if (errFile) fs.writeFileSync(errFile, msg);\n console.error(`[run-source-fetch] ${msg}`);\n process.exit(1);\n }\n const rawCmd = cmdParts[0];\n const { cmd, args: cliArgs } = resolveCommandInvocation(rawCmd, cmdParts.slice(1));\n\n let stdout: string;\n try {\n stdout = execCommandSync(cmd, cliArgs, {\n shell: false,\n encoding: 'utf-8',\n timeout,\n cwd: sourceCwd,\n env: {\n ...process.env,\n ...(sourceBoardDir ? { BOARD_DIR: sourceBoardDir } : {}),\n },\n });\n } catch (err: unknown) {\n const msg = (err as Error).message ?? String(err);\n console.error(`[run-source-fetch] cli failed: ${msg}`);\n if (errFile) fs.writeFileSync(errFile, msg);\n process.exit(1);\n }\n\n // Write result to --out\n const result = stdout.trim();\n try {\n fs.writeFileSync(outFile, result);\n console.log(`[run-source-fetch] result written to ${outFile}`);\n } catch (err) {\n const msg = `Failed to write output file: ${(err as Error).message}`;\n console.error(`[run-source-fetch] ${msg}`);\n if (errFile) fs.writeFileSync(errFile, msg);\n process.exit(1);\n }\n}\n\nfunction cmdUpdateCard(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const idIdx = args.indexOf('--card-id');\n const restart = args.includes('--restart');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const cardId = idIdx !== -1 ? args[idIdx + 1] : undefined;\n if (!dir || !cardId) {\n throw new Error('Usage: board-live-cards update-card --rg <dir> --card-id <card-id> [--restart]');\n }\n\n // 1. Look up card in inventory\n const cardPath = lookupCardPath(dir, cardId);\n if (!cardPath) {\n throw new Error(`Card \"${cardId}\" not found in inventory`);\n }\n\n // 2. Validate card file exists on disk\n if (!fs.existsSync(cardPath)) {\n throw new Error(`Card file not found: ${cardPath}`);\n }\n\n // 3. Read updated card, transform to TaskConfig, upsert\n const card: BoardLiveCard = JSON.parse(fs.readFileSync(cardPath, 'utf-8'));\n const taskConfig = liveCardToTaskConfig(card);\n\n appendEventToJournal(dir, {\n type: 'task-upsert',\n taskName: cardId,\n taskConfig,\n timestamp: new Date().toISOString(),\n });\n\n // 4. Optionally restart the task so handler re-runs with updated card\n if (restart) {\n appendEventToJournal(dir, {\n type: 'task-restart',\n taskName: cardId,\n timestamp: new Date().toISOString(),\n });\n }\n\n void processAccumulatedEventsInfinitePass(dir);\n console.log(`Card \"${cardId}\" updated${restart ? ' (restarted)' : ''}.`);\n}\n\nfunction cmdUpsertCard(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const cardIdx = args.indexOf('--card');\n const globIdx = args.indexOf('--card-glob');\n const cardIdIdx = args.indexOf('--card-id');\n const restart = args.includes('--restart');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const cardFile = cardIdx !== -1 ? args[cardIdx + 1] : undefined;\n const cardGlob = globIdx !== -1 ? args[globIdx + 1] : undefined;\n const requestedCardId = cardIdIdx !== -1 ? args[cardIdIdx + 1] : undefined;\n\n if (!dir || (!cardFile && !cardGlob) || (cardFile && cardGlob)) {\n console.error('Usage: board-live-cards upsert-card --rg <dir> (--card <card.json> | --card-glob <glob>) [--card-id <card-id>] [--restart]');\n process.exit(1);\n }\n\n if (cardGlob && requestedCardId) {\n console.error('Usage: --card-id may be used only with --card (single file), not with --card-glob');\n process.exit(1);\n }\n\n const cardFiles = cardFile\n ? [path.resolve(cardFile)]\n : resolveCardGlobMatches(cardGlob!);\n\n if (!cardFile && cardFiles.length === 0) {\n console.error(`No card files matched glob: ${cardGlob}`);\n process.exit(1);\n }\n\n const idx = buildCardInventoryIndex(dir);\n const batchByCardId = new Map<string, string>();\n const batchByCardPath = new Map<string, string>();\n const plans: Array<{\n card: BoardLiveCard;\n absCardPath: string;\n isInsert: boolean;\n }> = [];\n const logs: string[] = [];\n\n // Phase 1: pre-validate entire batch (atomicity guard)\n for (const absCardPath of cardFiles) {\n if (!fs.existsSync(absCardPath)) {\n console.error(`Card file not found: ${absCardPath}`);\n process.exit(1);\n }\n\n const card: BoardLiveCard = JSON.parse(fs.readFileSync(absCardPath, 'utf-8'));\n if (!card.id) {\n console.error(`Card JSON must have an \"id\" field (${absCardPath})`);\n process.exit(1);\n }\n\n if (requestedCardId && requestedCardId !== card.id) {\n console.error(\n `Card id mismatch: --card-id \"${requestedCardId}\" does not match file id \"${card.id}\" (${absCardPath})`\n );\n process.exit(1);\n }\n\n const seenPathCardId = batchByCardPath.get(absCardPath);\n if (seenPathCardId && seenPathCardId !== card.id) {\n console.error(\n `Upsert rejected: file \"${absCardPath}\" appears multiple times in batch with conflicting ids ` +\n `(\"${seenPathCardId}\" vs \"${card.id}\")`\n );\n process.exit(1);\n }\n\n const seenCardPath = batchByCardId.get(card.id);\n if (seenCardPath && seenCardPath !== absCardPath) {\n console.error(\n `Upsert rejected: card id \"${card.id}\" appears multiple times in batch with conflicting files ` +\n `(\"${seenCardPath}\" vs \"${absCardPath}\")`\n );\n process.exit(1);\n }\n\n const existingById = idx.byCardId.get(card.id);\n const existingByPath = idx.byCardPath.get(absCardPath);\n\n // Enforce strict one-to-one mapping between card id and file path.\n if (existingByPath && existingByPath.cardId !== card.id) {\n console.error(\n `Upsert rejected: file \"${absCardPath}\" is already mapped to card id \"${existingByPath.cardId}\", ` +\n `cannot remap to \"${card.id}\"`\n );\n process.exit(1);\n }\n\n if (existingById && existingById.cardFilePath !== absCardPath) {\n console.error(\n `Upsert rejected: card id \"${card.id}\" is already mapped to file \"${existingById.cardFilePath}\", ` +\n `cannot remap to \"${absCardPath}\"`\n );\n process.exit(1);\n }\n\n batchByCardPath.set(absCardPath, card.id);\n batchByCardId.set(card.id, absCardPath);\n\n plans.push({\n card,\n absCardPath,\n isInsert: !existingById,\n });\n }\n\n // Phase 2: commit writes after full pre-validation succeeds\n for (const plan of plans) {\n const { card, absCardPath, isInsert } = plan;\n\n if (isInsert) {\n const newEntry: CardInventoryEntry = {\n cardId: card.id,\n cardFilePath: absCardPath,\n addedAt: new Date().toISOString(),\n };\n appendCardInventory(dir, newEntry);\n idx.byCardId.set(card.id, newEntry);\n idx.byCardPath.set(absCardPath, newEntry);\n }\n\n const taskConfig = liveCardToTaskConfig(card);\n appendEventToJournal(dir, {\n type: 'task-upsert',\n taskName: card.id,\n taskConfig,\n timestamp: new Date().toISOString(),\n });\n\n if (restart) {\n appendEventToJournal(dir, {\n type: 'task-restart',\n taskName: card.id,\n timestamp: new Date().toISOString(),\n });\n }\n\n logs.push(`Card \"${card.id}\" ${isInsert ? 'upserted (inserted)' : 'upserted (updated)'}${restart ? ' (restarted)' : ''}.`);\n }\n\n void processAccumulatedEventsInfinitePass(dir);\n if (cardGlob) {\n console.log(`Upserted ${cardFiles.length} cards from glob: ${cardGlob}${restart ? ' (restarted)' : ''}`);\n } else {\n console.log(logs[0]);\n }\n}\n\n/**\n * process-accumulated-events command.\n *\n * Default mode: performs one immediate pass and schedules relay continuation\n * in a detached worker process.\n *\n * Internal mode (--inline-loop): execute full in-process settle loop.\n * Used only by the detached worker to avoid recursive respawn.\n */\nasync function cmdTryDrain(args: string[]): Promise<void> {\n const rgIdx = args.indexOf('--rg');\n const inlineLoop = args.includes('--inline-loop');\n const boardDir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n if (!boardDir) {\n console.error('Usage: board-live-cards process-accumulated-events --rg <dir>');\n process.exit(1);\n }\n\n await processAccumulatedEventsForced(boardDir, { inlineLoop });\n}\n\nfunction cmdRetrigger(args: string[]): void {\n const rgIdx = args.indexOf('--rg');\n const taskIdx = args.indexOf('--task');\n const dir = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const taskName = taskIdx !== -1 ? args[taskIdx + 1] : undefined;\n if (!dir || !taskName) {\n console.error('Usage: board-live-cards retrigger --rg <dir> --task <task-name>');\n process.exit(1);\n }\n\n appendEventToJournal(dir, {\n type: 'task-restart',\n taskName,\n timestamp: new Date().toISOString(),\n });\n\n void processAccumulatedEventsInfinitePass(dir);\n console.log(`Task \"${taskName}\" retriggered.`);\n}\n\nexport async function cli(argv: string[]): Promise<void> {\n const cmd = argv[0];\n const rest = argv.slice(1);\n\n switch (cmd) {\n case 'help':\n case '--help':\n case '-h': return cmdHelp();\n case 'init': return cmdInit(rest);\n case 'status': return cmdStatus(rest);\n case 'add-cards': return cmdAddCards(rest);\n case 'update-card': return cmdUpdateCard(rest);\n case 'upsert-card': return cmdUpsertCard(rest);\n case 'remove-card': return cmdRemoveCard(rest);\n case 'retrigger': return cmdRetrigger(rest);\n case 'task-completed': return cmdTaskCompleted(rest);\n case 'task-failed': return cmdTaskFailed(rest);\n case 'task-progress': return cmdTaskProgress(rest);\n case 'source-data-fetched': return cmdSourceDataFetched(rest);\n case 'source-data-fetch-failure': return cmdSourceDataFetchFailure(rest);\n case 'run-sources-internal': return cmdRunSources(rest);\n case 'run-inference-internal': return cmdRunInference(rest);\n case 'inference-done': return cmdInferenceDone(rest);\n case 'run-source-fetch': return cmdRunSourceFetch(rest);\n case 'probe-source': return await cmdProbeSource(rest);\n case 'process-accumulated-events': return await cmdTryDrain(rest);\n default:\n throw new Error(`Unknown command: ${cmd ?? '(none)'}`);\n }\n}\n\nasync function cmdProbeSource(args: string[]): Promise<void> {\n const cardIdx = args.indexOf('--card');\n const sourceIdxArg = args.indexOf('--source-idx');\n const sourceBindArg = args.indexOf('--source-bind');\n const mockReqIdx = args.indexOf('--mock-requires');\n const rgIdx = args.indexOf('--rg');\n const outIdx = args.indexOf('--out');\n\n const cardFilePath = cardIdx !== -1 ? args[cardIdx + 1] : undefined;\n const sourceIdxVal = sourceIdxArg !== -1 ? parseInt(args[sourceIdxArg + 1], 10) : 0;\n const sourceBindVal = sourceBindArg !== -1 ? args[sourceBindArg + 1] : undefined;\n const mockReqRaw = mockReqIdx !== -1 ? args[mockReqIdx + 1] : undefined;\n const boardDirArg = rgIdx !== -1 ? args[rgIdx + 1] : undefined;\n const outFile = outIdx !== -1 ? args[outIdx + 1] : undefined;\n\n if (!cardFilePath) {\n console.error('Usage: board-live-cards probe-source --card <card.json> [--source-idx <n>] [--source-bind <name>] [--mock-requires <json>] [--rg <boardDir>] [--out <result.json>]');\n process.exit(1);\n }\n\n // Read card\n let card: any;\n try {\n card = JSON.parse(fs.readFileSync(path.resolve(cardFilePath), 'utf-8'));\n } catch (e) {\n console.error(`[probe-source] Cannot read card: ${(e as Error).message}`);\n process.exit(1);\n }\n\n const sources: any[] = card.sources ?? [];\n if (sources.length === 0) {\n console.error(`[probe-source] Card \"${card.id}\" has no sources`);\n process.exit(1);\n }\n\n // Select source by index or bindTo name\n let sourceIdx: number;\n if (sourceBindVal) {\n sourceIdx = sources.findIndex((s: any) => s.bindTo === sourceBindVal);\n if (sourceIdx === -1) {\n console.error(`[probe-source] No source with bindTo=\"${sourceBindVal}\" in card \"${card.id}\"`);\n process.exit(1);\n }\n } else {\n sourceIdx = sourceIdxVal;\n if (isNaN(sourceIdx) || sourceIdx < 0 || sourceIdx >= sources.length) {\n console.error(`[probe-source] --source-idx ${sourceIdxVal} out of range (card has ${sources.length} source(s))`);\n process.exit(1);\n }\n }\n\n const sourceDef = sources[sourceIdx];\n const cardDir = path.resolve(path.dirname(cardFilePath));\n const boardDir = boardDirArg ? path.resolve(boardDirArg) : cardDir;\n\n // Parse --mock-requires (JSON string or @file.json)\n let mockRequires: Record<string, unknown> = {};\n if (mockReqRaw) {\n const raw = mockReqRaw.startsWith('@')\n ? fs.readFileSync(path.resolve(mockReqRaw.slice(1)), 'utf-8')\n : mockReqRaw;\n try {\n mockRequires = JSON.parse(raw);\n } catch (e) {\n console.error(`[probe-source] --mock-requires is not valid JSON: ${(e as Error).message}`);\n process.exit(1);\n }\n }\n\n // Detect registered task-executor\n const executorFile = path.join(boardDir, '.task-executor');\n const taskExecutor = fs.existsSync(executorFile) ? fs.readFileSync(executorFile, 'utf-8').trim() : undefined;\n\n // Build --in payload — mirrors exactly what run-sources-internal passes to the executor\n const inPayload: Record<string, unknown> = {\n ...sourceDef,\n cwd: typeof sourceDef.cwd === 'string' && sourceDef.cwd ? sourceDef.cwd : cardDir,\n boardDir: typeof sourceDef.boardDir === 'string' && sourceDef.boardDir ? sourceDef.boardDir : boardDir,\n _requires: mockRequires,\n _sourcesData: {},\n _computed_values: {},\n };\n\n const sourceKind: string = sourceDef.chartApi ? 'chartApi'\n : sourceDef.http ? 'http'\n : (sourceDef.copilot || sourceDef.prompt_template) ? 'copilot'\n : sourceDef.cli ? 'cli'\n : 'mock';\n\n console.log(`[probe-source] card: ${card.id}`);\n console.log(`[probe-source] source[${sourceIdx}]: bindTo=\"${sourceDef.bindTo}\" kind=${sourceKind}`);\n console.log(`[probe-source] _requires: ${JSON.stringify(mockRequires)}`);\n console.log(`[probe-source] executor: ${taskExecutor ?? 'built-in (source.cli only)'}`);\n console.log(`[probe-source] running fetch...`);\n\n const ts = Date.now();\n const inFile = path.join(os.tmpdir(), `probe-in-${sourceDef.bindTo}-${ts}.json`);\n const tmpOut = path.join(os.tmpdir(), `probe-out-${sourceDef.bindTo}-${ts}.json`);\n const errFile = path.join(os.tmpdir(), `probe-err-${sourceDef.bindTo}-${ts}.txt`);\n\n fs.writeFileSync(inFile, JSON.stringify(inPayload, null, 2), 'utf-8');\n\n let passed = false;\n let errorMsg: string | undefined;\n let resultRaw: string | undefined;\n\n try {\n if (taskExecutor) {\n execCommandSync(taskExecutor, ['run-source-fetch', '--in', inFile, '--out', tmpOut, '--err', errFile], {\n shell: true,\n timeout: (sourceDef.timeout as number) ?? 30_000,\n });\n } else {\n // Built-in path: only source.cli is supported\n if (!inPayload.cli) {\n throw new Error('No task-executor registered and source has no cli field — cannot probe with built-in executor');\n }\n const cmdParts = splitCommandLine(inPayload.cli as string);\n const rawCmd = cmdParts[0];\n const { cmd, args: cliArgs } = resolveCommandInvocation(rawCmd, cmdParts.slice(1));\n const stdout = execCommandSync(cmd, cliArgs, {\n shell: false,\n encoding: 'utf-8',\n timeout: (sourceDef.timeout as number) ?? 30_000,\n cwd: inPayload.cwd as string,\n });\n fs.writeFileSync(tmpOut, (stdout as string).trim(), 'utf-8');\n }\n\n passed = fs.existsSync(tmpOut);\n if (passed) {\n resultRaw = fs.readFileSync(tmpOut, 'utf-8');\n } else {\n errorMsg = fs.existsSync(errFile) ? fs.readFileSync(errFile, 'utf-8').trim() : 'executor produced no output file';\n }\n } catch (e) {\n errorMsg = (e as Error).message ?? String(e);\n if (!errorMsg && fs.existsSync(errFile)) {\n errorMsg = fs.readFileSync(errFile, 'utf-8').trim();\n }\n }\n\n // Cleanup temp inputs\n for (const f of [inFile, errFile]) {\n try { fs.unlinkSync(f); } catch { /* best-effort */ }\n }\n\n // Report\n if (passed && resultRaw !== undefined) {\n const resultSize = resultRaw.length;\n const sample = resultRaw.slice(0, 300);\n console.log(`[probe-source] STATUS: PROBE_PASS`);\n console.log(`[probe-source] result size: ${resultSize} bytes`);\n console.log(`[probe-source] sample: ${sample}${resultSize > 300 ? '...' : ''}`);\n if (outFile) {\n fs.writeFileSync(path.resolve(outFile), resultRaw);\n console.log(`[probe-source] result written to: ${outFile}`);\n } else {\n try { fs.unlinkSync(tmpOut); } catch { /* best-effort */ }\n }\n } else {\n console.log(`[probe-source] STATUS: PROBE_FAIL`);\n if (errorMsg) console.log(`[probe-source] error: ${errorMsg}`);\n try { if (fs.existsSync(tmpOut)) fs.unlinkSync(tmpOut); } catch { /* best-effort */ }\n }\n\n // Machine-readable summary line — agents parse this\n const summary = {\n status: passed ? 'PROBE_PASS' : 'PROBE_FAIL',\n cardId: card.id as string,\n sourceIdx,\n bindTo: sourceDef.bindTo as string,\n sourceKind,\n mockRequiresKeys: Object.keys(mockRequires),\n resultSizeBytes: resultRaw !== undefined ? resultRaw.length : 0,\n error: errorMsg ?? undefined,\n };\n console.log(`[probe-source:result] ${JSON.stringify(summary)}`);\n\n process.exit(passed ? 0 : 1);\n}\n\nfunction cmdHelp(): void {\n console.log(`\nboard-live-cards-cli — LiveCards board CLI\n\nUSAGE\n board-live-cards-cli <command> [options]\n\nBOARD MANAGEMENT\n init <dir> [--task-executor <script>] [--chat-handler <script>] [--inference-adapter <script>] [--runtime-out <dir>]\n Create a new board in <dir>.\n If --task-executor is given, writes <dir>/.task-executor with the script path.\n If --chat-handler is given, writes <dir>/.chat-handler with the script path.\n If --inference-adapter is given, writes <dir>/.inference-adapter with the script path.\n Writes <dir>/.runtime-out (default: <dir>/runtime-out).\n Published runtime files:\n <runtime-out>/board-livegraph-status.json\n <runtime-out>/cards/<card-id>.computed.json\n Re-running init on an existing board is safe; handler registrations are updated.\n\n status --rg <dir> [--json]\n Read and print the published status snapshot from <runtime-out>/board-livegraph-status.json.\n --json emits the stable machine-readable status object.\n\nCARD MANAGEMENT\n add-cards --rg <dir> (--card <card.json> | --card-glob <glob>)\n Add one card or many cards from a glob and trigger processing.\n --card adds one JSON file.\n --card-glob adds all matching files in deterministic order.\n Example glob: \"examples/browser/boards/portfolio-tracker/cards/*.json\"\n\n update-card --rg <dir> --card-id <card-id> [--restart]\n Re-read the card JSON from disk and patch the board.\n --restart clears the task so it re-triggers from scratch.\n\n upsert-card --rg <dir> (--card <card.json> | --card-glob <glob>) [--card-id <card-id>] [--restart]\n Insert or update one or many cards.\n Enforces strict one-to-one mapping between card id and file path:\n - same id + same file path: update\n - new id + new file path: insert\n - id remap or file remap: rejected\n If --card-id is provided, it must match the id inside the file.\n --card-id is valid only with --card (single file), not with --card-glob.\n --restart clears the task so it re-triggers from scratch.\n\n remove-card --rg <dir> --id <card-id>\n Remove a card and its task from the board.\n\n retrigger --rg <dir> --task <task-name>\n Mark a task not-started and drain to re-trigger it.\n\nTASK CALLBACKS (called by task executor scripts)\n task-completed --token <callbackToken> [--data <json>]\n Signal successful task completion with optional JSON result data.\n\n task-failed --token <callbackToken> [--error <message>]\n Signal task failure with an optional error message.\n\n task-progress --rg <dir> --token <callbackToken> [--update <json>]\n Signal task progress with optional update payload (for waiting on more evidence, etc.).\n\nSOURCE CALLBACKS (called internally by run-sources-internal)\n source-data-fetched --tmp <file> --token <sourceToken>\n Atomically rename <file> into the outputFile destination and record delivery\n via journal events. Appends a task-progress event to re-invoke the card handler.\n\n source-data-fetch-failure --token <sourceToken> [--reason <message>]\n Record a source fetch failure via journal events and append a task-progress event.\n\nINTERNAL COMMANDS\n process-accumulated-events --rg <dir>\n Executes forced drain for this board.\n This command is also used as the background relay worker.\n By default it schedules a detached worker and returns quickly.\n Internal workers run with --inline-loop to perform the settle loop.\n\n Eventual-progress guarantee is relay-based (not per-call blocking guarantee):\n 1) at least one runner continues processing,\n 2) no crash/forced exit in relay window,\n 3) lock stays healthy,\n 4) event production eventually quiesces.\n\n run-sources-internal --card <card.json> --token <callbackToken> --rg <dir>\n Execute all source[] entries for a card, then report delivery or failure.\n (Internal command — invoked by the card-handler. Not intended for direct use.)\n\n If <dir>/.task-executor exists, invokes it with run-source-fetch subcommand:\n <executor> run-source-fetch --in <source_json> --out <outfile> --err <errfile>\n \n If no .task-executor is registered, uses board-live-cards built-in run-source-fetch.\n\n run-source-fetch --in <source.json> --out <result.json> [--err <error.txt>]\n Execute a source definition. Board-live-cards reads source.cli and executes it.\n Writes result to --out. Presence of --out after exit indicates success.\n\n probe-source --card <card.json> [--source-idx <n>] [--source-bind <name>]\n [--mock-requires <json>] [--rg <boardDir>] [--out <result.json>]\n Validate that a card source can be fetched successfully.\n Reads the card file, extracts the chosen source (default: index 0), builds the\n run-source-fetch --in payload with the supplied _requires data, invokes the\n registered task-executor (or built-in executor for source.cli), and reports pass/fail.\n --mock-requires: JSON string (or @file.json) providing the _requires token values\n the source needs. Craft the minimal payload that exercises the\n source — e.g. '{\"holdings\":[{\"ticker\":\"AAPL\",\"quantity\":10}]}'.\n If omitted, _requires is passed as empty ({}).\n --source-idx: 0-based index into card.sources[]. Default: 0.\n --source-bind: Select source by its bindTo name instead of index.\n --rg: Board directory used to find .task-executor. Defaults to the\n directory containing the card file.\n --out: Optional path to write the raw fetch result JSON.\n Prints a structured report ending with a [probe-source:result] JSON line.\n Exits 0 on PROBE_PASS, 1 on PROBE_FAIL.\n\n run-inference-internal --in <input.json> --token <inferenceToken>\n Execute inference via registered .inference-adapter and forward result to inference-done.\n inferenceToken encodes boardDir (rg), cardId (cid), callbackToken (cbk), checksum (cs).\n (Internal command — invoked by the card-handler when custom completion rule is used.)\n\n inference-done --tmp <result.json> --token <inferenceToken>\n Persist llm_task_completion_inference on the card and append a task-progress event.\n Reads boardDir/callbackToken/checksum from decoded inferenceToken; deletes --tmp file after reading.\n (Internal command — invoked by run-inference-internal.)\n\nRUN-SOURCE-FETCH PROTOCOL\n External task-executors implement:\n <executor> run-source-fetch --in <source.json> --out <result.json> [--err <error.txt>]\n\n INPUT: --in file contains the full sources[x] definition object\n OUTPUT: --out file is written with the result to signal success.\n --err file may be written to explain failure.\n \n Exit code and --out presence determine success:\n Exit 0 + --out file present → source delivery recorded, card re-evaluated.\n Exit non-zero OR --out absent → source-data-fetch-failure recorded.\n\nBOARD-LIVE-CARDS BUILT-IN EXECUTOR\n Understands source.cli field only:\n \"sources\": [{ \"cli\": \"node ../fetch-prices.js\", \"bindTo\": \"prices\", \"outputFile\": \"prices.json\" }]\n \n The source.cli command is executed with:\n - Direct command invocation (no shell; quote-aware argument parsing)\n - Stdout is captured and delivered to the card as-is\n - Timeout from source.timeout (default 120s)\n \n The source.cli command must:\n - Execute successfully (exit 0)\n - Write output to stdout\n - Complete within the timeout\n \n The output format is the concern of the card's compute function to interpret.\n \n External task-executors can interpret source definitions however they want.\n\nEXAMPLES\n board-live-cards-cli init ./my-board\n board-live-cards-cli init ./my-board --task-executor ./executors/my-runner.py\n board-live-cards-cli add-cards --rg ./my-board --card cards/prices.json\n board-live-cards-cli status --rg ./my-board\n board-live-cards-cli retrigger --rg ./my-board --task price-fetch\n board-live-cards-cli probe-source --card cards/card-market-prices.json --source-idx 0 --rg ./my-board --mock-requires '{\"holdings\":[{\"ticker\":\"AAPL\",\"quantity\":10}]}'\n`.trimStart());\n}\n\n// Run when invoked directly\nconst isMain = process.argv[1] && path.resolve(process.argv[1]) === path.resolve(new URL(import.meta.url).pathname.replace(/^\\/([A-Z]:)/, '$1'));\nif (isMain) {\n cli(process.argv.slice(2)).catch((err) => {\n const msg = err instanceof Error ? err.stack ?? err.message : String(err);\n console.error(msg);\n process.exit(1);\n });\n}\n"]}
|