yaml-flow 2.7.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +168 -3
  2. package/browser/ingest-board.js +296 -0
  3. package/browser/live-cards.js +303 -0
  4. package/browser/live-cards.schema.json +22 -2
  5. package/dist/card-compute/index.cjs +6751 -0
  6. package/dist/card-compute/index.cjs.map +1 -1
  7. package/dist/card-compute/index.d.cts +24 -1
  8. package/dist/card-compute/index.d.ts +24 -1
  9. package/dist/card-compute/index.js +6747 -1
  10. package/dist/card-compute/index.js.map +1 -1
  11. package/dist/{constants-BEbO2_OK.d.ts → constants-B_ftYTTE.d.ts} +36 -6
  12. package/dist/{constants-BNjeIlZ8.d.cts → constants-CiyHX8L-.d.cts} +36 -6
  13. package/dist/continuous-event-graph/index.cjs +399 -42
  14. package/dist/continuous-event-graph/index.cjs.map +1 -1
  15. package/dist/continuous-event-graph/index.d.cts +124 -5
  16. package/dist/continuous-event-graph/index.d.ts +124 -5
  17. package/dist/continuous-event-graph/index.js +396 -43
  18. package/dist/continuous-event-graph/index.js.map +1 -1
  19. package/dist/event-graph/index.cjs +6784 -44
  20. package/dist/event-graph/index.cjs.map +1 -1
  21. package/dist/event-graph/index.d.cts +5 -5
  22. package/dist/event-graph/index.d.ts +5 -5
  23. package/dist/event-graph/index.js +6777 -43
  24. package/dist/event-graph/index.js.map +1 -1
  25. package/dist/index.cjs +7678 -73
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +6 -6
  28. package/dist/index.d.ts +6 -6
  29. package/dist/index.js +7665 -73
  30. package/dist/index.js.map +1 -1
  31. package/dist/inference/index.cjs +17 -8
  32. package/dist/inference/index.cjs.map +1 -1
  33. package/dist/inference/index.d.cts +2 -2
  34. package/dist/inference/index.d.ts +2 -2
  35. package/dist/inference/index.js +17 -8
  36. package/dist/inference/index.js.map +1 -1
  37. package/dist/step-machine/index.cjs +6600 -0
  38. package/dist/step-machine/index.cjs.map +1 -1
  39. package/dist/step-machine/index.d.cts +26 -1
  40. package/dist/step-machine/index.d.ts +26 -1
  41. package/dist/step-machine/index.js +6596 -1
  42. package/dist/step-machine/index.js.map +1 -1
  43. package/dist/{types-DAI_a2as.d.ts → types-BpWrH1sf.d.cts} +16 -7
  44. package/dist/{types-DAI_a2as.d.cts → types-BpWrH1sf.d.ts} +16 -7
  45. package/dist/{types-mS_pPftm.d.ts → types-BuEo3wVG.d.ts} +1 -1
  46. package/dist/{types-C2lOwquM.d.cts → types-CxJg9Jrt.d.cts} +1 -1
  47. package/package.json +3 -2
  48. package/schema/event-graph.schema.json +254 -0
  49. package/schema/live-cards.schema.json +22 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/event-graph/constants.ts","../../src/event-graph/graph-helpers.ts","../../src/event-graph/task-transitions.ts","../../src/continuous-event-graph/core.ts","../../src/continuous-event-graph/schedule.ts","../../src/continuous-event-graph/inspect.ts"],"names":["updatedTask","createDefaultTaskState","requires","buildProducerMap"],"mappings":"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","file":"index.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, TaskState, ExecutionState } 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: TaskState | 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: TaskState | undefined): boolean {\n return taskState?.status === TASK_STATUS.COMPLETED;\n}\n\nexport function isTaskRunning(taskState: TaskState | undefined): boolean {\n return taskState?.status === TASK_STATUS.RUNNING;\n}\n\nexport function isRepeatableTask(taskConfig: TaskConfig): boolean {\n return taskConfig.repeatable === true || (typeof taskConfig.repeatable === 'object' && taskConfig.repeatable !== null);\n}\n\nexport function getRepeatableMax(taskConfig: TaskConfig): number | undefined {\n if (taskConfig.repeatable === true) return undefined; // unlimited\n if (typeof taskConfig.repeatable === 'object' && taskConfig.repeatable !== null) {\n return taskConfig.repeatable.max;\n }\n return undefined;\n}\n\n// ============================================================================\n// Available Outputs Computation\n// ============================================================================\n\n/**\n * Dynamically compute available outputs from all completed tasks.\n * For repeatable tasks, outputs are versioned by epoch.\n * Pure function.\n */\nexport function computeAvailableOutputs(\n graph: GraphConfig,\n taskStates: Record<string, TaskState>\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 createDefaultTaskState(): TaskState {\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, TaskState> = {};\n for (const taskName of Object.keys(graph.tasks)) {\n tasks[taskName] = createDefaultTaskState();\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, TaskState, GraphConfig } from './types.js';\nimport { getProvides, isRepeatableTask } 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] ?? createDefaultTaskState();\n\n const updatedTask: TaskState = {\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), repeatable epoch tracking.\n * Pure function.\n */\nexport function applyTaskCompletion(\n state: ExecutionState,\n graph: GraphConfig,\n taskName: string,\n result?: string\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultTaskState();\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 const updatedTask: TaskState = {\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 error: undefined,\n };\n\n // For repeatable tasks, reset status to 'not-started' so they can run again\n // but keep executionCount incremented for epoch tracking\n if (isRepeatableTask(taskConfig)) {\n updatedTask.status = 'not-started';\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] ?? createDefaultTaskState();\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: TaskState = {\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: TaskState = {\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] ?? createDefaultTaskState();\n\n const updatedTask: TaskState = {\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\nfunction createDefaultTaskState(): TaskState {\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, TaskState } from '../event-graph/types.js';\nimport { getProvides, getRequires } from '../event-graph/graph-helpers.js';\nimport {\n applyTaskStart,\n applyTaskCompletion,\n applyTaskFailure,\n applyTaskProgress,\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, TaskState> = {};\n\n for (const taskName of Object.keys(config.tasks)) {\n tasks[taskName] = createDefaultTaskState();\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 execution event to the LiveGraph, producing a new LiveGraph.\n * Events are the shared vocabulary: task-started, task-completed, task-failed,\n * task-progress, inject-tokens, agent-action.\n *\n * Config is NOT mutated by events — only state changes.\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 let newState: ExecutionState;\n\n switch (event.type) {\n case 'task-started':\n newState = applyTaskStart(state, event.taskName);\n break;\n\n case 'task-completed':\n newState = applyTaskCompletion(state, config, event.taskName, event.result);\n break;\n\n case 'task-failed':\n newState = applyTaskFailure(state, config, event.taskName, event.error);\n break;\n\n case 'task-progress':\n newState = applyTaskProgress(state, event.taskName, event.message, event.progress);\n break;\n\n case 'inject-tokens':\n newState = {\n ...state,\n availableOutputs: [...new Set([...state.availableOutputs, ...event.tokens])],\n lastUpdated: new Date().toISOString(),\n };\n break;\n\n case 'agent-action':\n newState = applyAgentAction(state, event.action);\n break;\n\n default:\n return live;\n }\n\n return { config, state: newState };\n}\n\n// ============================================================================\n// Graph Mutations — node-level\n// ============================================================================\n\n/**\n * Add a node (task) to the live graph. Updates both config and state atomically.\n * If the node already exists, returns the graph unchanged.\n */\nexport function addNode(live: LiveGraph, name: string, taskConfig: TaskConfig): LiveGraph {\n if (live.config.tasks[name]) return live;\n\n return {\n config: {\n ...live.config,\n tasks: { ...live.config.tasks, [name]: taskConfig },\n },\n state: {\n ...live.state,\n tasks: { ...live.state.tasks, [name]: createDefaultTaskState() },\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]: createDefaultTaskState(),\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] ?? createDefaultTaskState();\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 createDefaultTaskState(): TaskState {\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, isRepeatableTask, getRepeatableMax, 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\n // Skip terminal tasks\n if (!isRepeatableTask(taskConfig)) {\n if (taskState?.status === TASK_STATUS.COMPLETED ||\n taskState?.status === TASK_STATUS.RUNNING ||\n isNonActiveTask(taskState)) {\n continue;\n }\n } else {\n if (taskState?.status === TASK_STATUS.RUNNING || isNonActiveTask(taskState)) {\n continue;\n }\n const maxExec = getRepeatableMax(taskConfig);\n if (maxExec !== undefined && taskState && taskState.executionCount >= maxExec) {\n continue;\n }\n // Circuit breaker\n if (taskConfig.circuit_breaker && taskState &&\n taskState.executionCount >= taskConfig.circuit_breaker.max_executions) {\n continue;\n }\n // Repeatable + completed: need refreshed inputs\n if (taskState?.status === TASK_STATUS.COMPLETED) {\n const requires = getRequires(taskConfig);\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) continue;\n } else {\n continue;\n }\n }\n }\n\n const requires = getRequires(taskConfig);\n\n // No requires → eligible (entry point)\n if (requires.length === 0) {\n eligible.push(taskName);\n continue;\n }\n\n // Check each required token\n const missingTokens: string[] = [];\n const pendingTokens: string[] = [];\n const failedTokenInfo: { token: string; failedProducer: string }[] = [];\n\n for (const token of requires) {\n if (availableOutputs.has(token)) continue;\n\n const producers = producerMap[token] || [];\n\n if (producers.length === 0) {\n // No task produces this token → unresolved\n missingTokens.push(token);\n } else {\n // Check if all producers have failed\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n if (allFailed) {\n failedTokenInfo.push({ token, failedProducer: producers[0] });\n } else {\n // At least one producer is viable → pending (normal wait)\n pendingTokens.push(token);\n }\n }\n }\n\n if (missingTokens.length > 0) {\n unresolved.push({ taskName, missingTokens });\n } else if (failedTokenInfo.length > 0) {\n blocked.push({\n taskName,\n failedTokens: failedTokenInfo.map(f => f.token),\n failedProducers: [...new Set(failedTokenInfo.map(f => f.failedProducer))],\n });\n } else if (pendingTokens.length > 0) {\n pending.push({ taskName, waitingOn: pendingTokens });\n } else {\n // All requires satisfied\n eligible.push(taskName);\n }\n }\n\n // Detect conflicts among eligible tasks\n const conflicts: Record<string, string[]> = {};\n if (eligible.length > 1) {\n const outputGroups = groupTasksByProvides(eligible, graphTasks);\n for (const [outputKey, groupTasks] of Object.entries(outputGroups)) {\n if (groupTasks.length > 1) {\n conflicts[outputKey] = groupTasks;\n }\n }\n }\n\n return { eligible, pending, unresolved, blocked, conflicts };\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Build a map: token → tasks that produce it (via provides, on, on_failure).\n */\nfunction buildProducerMap(tasks: Record<string, import('../event-graph/types.js').TaskConfig>): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n\n return map;\n}\n","/**\n * Continuous Event Graph — Inspect\n *\n * Pure read-only projection: LiveGraph → LiveGraphHealth\n *\n * Live health report combining config structure + runtime state.\n */\n\nimport type { LiveGraph, LiveGraphHealth, UnreachableTokensResult, UnreachableNodesResult, UpstreamResult, DownstreamResult } from './types.js';\nimport { getProvides, getRequires, getAllTasks, isNonActiveTask } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n/**\n * Compute a live health report for the graph.\n * Combines structural analysis (cycles, conflicts, open deps) with runtime state (task statuses).\n * Pure function — no side effects.\n */\nexport function inspect(live: LiveGraph): LiveGraphHealth {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const taskNames = Object.keys(graphTasks);\n\n // --- Task status counts ---\n let running = 0, completed = 0, failed = 0, waiting = 0, notStarted = 0, disabled = 0;\n\n for (const taskName of taskNames) {\n const ts = state.tasks[taskName];\n if (!ts || ts.status === TASK_STATUS.NOT_STARTED) {\n notStarted++;\n } else {\n switch (ts.status) {\n case TASK_STATUS.RUNNING: running++; break;\n case TASK_STATUS.COMPLETED: completed++; break;\n case TASK_STATUS.FAILED: failed++; break;\n case 'inactivated': disabled++; break;\n default: waiting++;\n }\n }\n }\n\n // --- Producer map ---\n const producerMap: Record<string, string[]> = {};\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n for (const token of getProvides(taskConfig)) {\n if (!producerMap[token]) producerMap[token] = [];\n producerMap[token].push(name);\n }\n if (taskConfig.on) {\n for (const tokens of Object.values(taskConfig.on)) {\n for (const token of tokens) {\n if (!producerMap[token]) producerMap[token] = [];\n if (!producerMap[token].includes(name)) producerMap[token].push(name);\n }\n }\n }\n if (taskConfig.on_failure) {\n for (const token of taskConfig.on_failure) {\n if (!producerMap[token]) producerMap[token] = [];\n if (!producerMap[token].includes(name)) producerMap[token].push(name);\n }\n }\n }\n\n // --- Open dependencies: tokens required but no producer exists ---\n const openDeps = new Set<string>();\n let unresolvedCount = 0;\n let blockedCount = 0;\n\n for (const [taskName, taskConfig] of Object.entries(graphTasks)) {\n const ts = state.tasks[taskName];\n // Skip already-completed or running\n if (ts?.status === TASK_STATUS.COMPLETED || ts?.status === TASK_STATUS.RUNNING) continue;\n\n let hasOpen = false;\n let hasBlocked = false;\n for (const token of getRequires(taskConfig)) {\n const producers = producerMap[token] || [];\n if (producers.length === 0) {\n openDeps.add(token);\n hasOpen = true;\n } else {\n const allFailed = producers.every(p => {\n const ps = state.tasks[p];\n return ps?.status === TASK_STATUS.FAILED || ps?.status === 'inactivated';\n });\n if (allFailed) hasBlocked = true;\n }\n }\n if (hasOpen) unresolvedCount++;\n if (hasBlocked && !hasOpen) blockedCount++;\n }\n\n // --- Conflict tokens: produced by multiple tasks ---\n const conflictTokens: string[] = [];\n for (const [token, producers] of Object.entries(producerMap)) {\n if (producers.length > 1) conflictTokens.push(token);\n }\n\n // --- Cycle detection (DFS) ---\n const deps = buildTaskDeps(graphTasks, producerMap);\n const cycles = detectCycles(taskNames, deps);\n\n return {\n totalNodes: taskNames.length,\n running, completed, failed, waiting, notStarted, disabled,\n unresolvedCount,\n blockedCount,\n openDependencies: [...openDeps],\n cycles,\n conflictTokens,\n };\n}\n\n// ============================================================================\n// Cycle detection internals (pure)\n// ============================================================================\n\nfunction buildTaskDeps(\n tasks: Record<string, import('../event-graph/types.js').TaskConfig>,\n producerMap: Record<string, string[]>,\n): Record<string, Set<string>> {\n const deps: Record<string, Set<string>> = {};\n for (const [name, config] of Object.entries(tasks)) {\n deps[name] = new Set<string>();\n for (const token of getRequires(config)) {\n for (const producer of (producerMap[token] || [])) {\n if (producer !== name) deps[name].add(producer);\n }\n }\n }\n return deps;\n}\n\nfunction detectCycles(\n taskNames: string[],\n deps: Record<string, Set<string>>,\n): string[][] {\n const WHITE = 0, GRAY = 1, BLACK = 2;\n const color: Record<string, number> = {};\n const parent: Record<string, string | null> = {};\n const cycles: string[][] = [];\n\n for (const name of taskNames) {\n color[name] = WHITE;\n parent[name] = null;\n }\n\n function dfs(node: string): void {\n color[node] = GRAY;\n for (const dep of deps[node] || []) {\n if (color[dep] === GRAY) {\n const cycle: string[] = [dep];\n let cur = node;\n while (cur !== dep) {\n cycle.push(cur);\n cur = parent[cur]!;\n }\n cycle.push(dep);\n cycle.reverse();\n cycles.push(cycle);\n } else if (color[dep] === WHITE) {\n parent[dep] = node;\n dfs(dep);\n }\n }\n color[node] = BLACK;\n }\n\n for (const name of taskNames) {\n if (color[name] === WHITE) dfs(name);\n }\n\n return cycles;\n}\n\n// ============================================================================\n// Reachability analysis (transitive)\n// ============================================================================\n\n/**\n * Build producer map: token → task names that produce it.\n */\nfunction buildProducerMap(\n tasks: Record<string, import('../event-graph/types.js').TaskConfig>,\n): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n return map;\n}\n\n/**\n * Get all tokens that are required but cannot be produced given the current\n * graph state. This is **transitive**: if token X is unreachable, and node A\n * is the only producer of token Y but A requires X, then Y is also unreachable.\n *\n * Takes into account:\n * - Tokens already in availableOutputs (reachable)\n * - Tokens from completed tasks (reachable)\n * - Failed/disabled producers (non-viable)\n *\n * Pure function.\n */\nexport function getUnreachableTokens(live: LiveGraph): UnreachableTokensResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const producerMap = buildProducerMap(graphTasks);\n\n // Tokens already available\n const available = new Set([...state.availableOutputs]);\n for (const [taskName, taskState] of Object.entries(state.tasks)) {\n if (taskState.status === 'completed') {\n const tc = graphTasks[taskName];\n if (tc) getProvides(tc).forEach(t => available.add(t));\n }\n }\n\n // Collect all required tokens\n const allRequired = new Set<string>();\n for (const taskConfig of Object.values(graphTasks)) {\n for (const token of getRequires(taskConfig)) {\n allRequired.add(token);\n }\n }\n\n // Iterative fixed-point: mark tokens unreachable if all their viable producers\n // are themselves unreachable (need an unreachable token).\n const unreachable = new Set<string>();\n const unreachableNodes = new Set<string>();\n\n // Seed: tokens with NO producer at all (and not already available)\n for (const token of allRequired) {\n if (available.has(token)) continue;\n const producers = producerMap[token] || [];\n if (producers.length === 0) {\n unreachable.add(token);\n }\n }\n\n // Fixed-point: propagate transitively\n let changed = true;\n while (changed) {\n changed = false;\n\n // Mark nodes as unreachable if any of their requires is unreachable\n // and they haven't already completed\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n if (unreachableNodes.has(name)) continue;\n const ts = state.tasks[name];\n if (ts?.status === 'completed') continue; // already done, skip\n\n // Check if non-active (failed/disabled) — it's a dead producer\n const isNonActive = isNonActiveTask(ts);\n\n const requires = getRequires(taskConfig);\n const hasUnreachableDep = requires.some(t => unreachable.has(t));\n\n if (isNonActive || hasUnreachableDep) {\n if (!unreachableNodes.has(name)) {\n unreachableNodes.add(name);\n changed = true;\n }\n }\n }\n\n // Mark tokens as unreachable if ALL their producers are unreachable/non-active\n for (const token of allRequired) {\n if (unreachable.has(token) || available.has(token)) continue;\n const producers = producerMap[token] || [];\n const allProducersUnreachable = producers.length > 0 &&\n producers.every(p => unreachableNodes.has(p) || isNonActiveTask(state.tasks[p]));\n if (producers.length === 0 || allProducersUnreachable) {\n if (!unreachable.has(token)) {\n unreachable.add(token);\n changed = true;\n }\n }\n }\n }\n\n // Build reason map\n const tokens: UnreachableTokensResult['tokens'] = [];\n for (const token of unreachable) {\n const producers = producerMap[token] || [];\n let reason: 'no-producer' | 'all-producers-failed' | 'transitive';\n if (producers.length === 0) {\n reason = 'no-producer';\n } else {\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n reason = allFailed ? 'all-producers-failed' : 'transitive';\n }\n tokens.push({ token, reason, producers });\n }\n\n return { tokens };\n}\n\n/**\n * Get all nodes that can never become eligible given the current graph state.\n * A node is unreachable if any of its required tokens is unreachable.\n *\n * This is the node-level companion to getUnreachableTokens — uses the same\n * transitive analysis.\n *\n * Pure function.\n */\nexport function getUnreachableNodes(live: LiveGraph): UnreachableNodesResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const { tokens: unreachableTokens } = getUnreachableTokens(live);\n const unreachableTokenSet = new Set(unreachableTokens.map(t => t.token));\n\n const nodes: UnreachableNodesResult['nodes'] = [];\n\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n const ts = state.tasks[name];\n if (ts?.status === 'completed') continue; // already done\n\n const requires = getRequires(taskConfig);\n const missingTokens = requires.filter(t => unreachableTokenSet.has(t));\n\n if (missingTokens.length > 0) {\n nodes.push({ nodeName: name, missingTokens });\n } else if (isNonActiveTask(ts)) {\n // Node itself is failed/disabled — it's unreachable too\n nodes.push({ nodeName: name, missingTokens: [] });\n }\n }\n\n return { nodes };\n}\n\n// ============================================================================\n// Graph traversal: upstream / downstream\n// ============================================================================\n\n/**\n * Get all nodes that transitively feed into the given node.\n * \"What's upstream of X?\" — traces backwards through requires → provides chains.\n *\n * Returns the set of upstream nodes and the tokens connecting them.\n * Does NOT include the target node itself.\n * Pure function.\n */\nexport function getUpstream(live: LiveGraph, nodeName: string): UpstreamResult {\n const graphTasks = getAllTasks(live.config);\n if (!graphTasks[nodeName]) return { nodeName, nodes: [], tokens: [] };\n\n const producerMap = buildProducerMap(graphTasks);\n const visited = new Set<string>();\n const tokenSet = new Set<string>();\n const nodeEntries: Map<string, Set<string>> = new Map();\n\n function walk(current: string): void {\n const taskConfig = graphTasks[current];\n if (!taskConfig) return;\n\n for (const token of getRequires(taskConfig)) {\n const producers = producerMap[token] || [];\n for (const producer of producers) {\n if (producer === nodeName) continue; // don't include target\n tokenSet.add(token);\n\n // Track which tokens this producer contributes\n if (!nodeEntries.has(producer)) nodeEntries.set(producer, new Set());\n nodeEntries.get(producer)!.add(token);\n\n if (!visited.has(producer)) {\n visited.add(producer);\n walk(producer);\n }\n }\n }\n }\n\n walk(nodeName);\n\n const nodes = [...nodeEntries.entries()].map(([name, tokens]) => ({\n nodeName: name,\n providesTokens: [...tokens],\n }));\n\n return { nodeName, nodes, tokens: [...tokenSet] };\n}\n\n/**\n * Get all nodes that transitively depend on the given node.\n * \"What breaks if I disable X?\" — traces forwards through provides → requires chains.\n *\n * Returns the set of downstream nodes and the tokens connecting them.\n * Does NOT include the target node itself.\n * Pure function.\n */\nexport function getDownstream(live: LiveGraph, nodeName: string): DownstreamResult {\n const graphTasks = getAllTasks(live.config);\n if (!graphTasks[nodeName]) return { nodeName, nodes: [], tokens: [] };\n\n // Build consumer map: token → nodes that require it\n const consumerMap: Record<string, string[]> = {};\n for (const [name, config] of Object.entries(graphTasks)) {\n for (const token of getRequires(config)) {\n if (!consumerMap[token]) consumerMap[token] = [];\n consumerMap[token].push(name);\n }\n }\n\n const visited = new Set<string>();\n const tokenSet = new Set<string>();\n const nodeEntries: Map<string, Set<string>> = new Map();\n\n function walk(current: string): void {\n const taskConfig = graphTasks[current];\n if (!taskConfig) return;\n\n for (const token of getProvides(taskConfig)) {\n const consumers = consumerMap[token] || [];\n for (const consumer of consumers) {\n if (consumer === nodeName) continue; // don't include target\n tokenSet.add(token);\n\n if (!nodeEntries.has(consumer)) nodeEntries.set(consumer, new Set());\n nodeEntries.get(consumer)!.add(token);\n\n if (!visited.has(consumer)) {\n visited.add(consumer);\n walk(consumer);\n }\n }\n }\n }\n\n walk(nodeName);\n\n const nodes = [...nodeEntries.entries()].map(([name, tokens]) => ({\n nodeName: name,\n requiresTokens: [...tokens],\n }));\n\n return { nodeName, nodes, tokens: [...tokenSet] };\n}\n"]}
1
+ {"version":3,"sources":["../../src/event-graph/constants.ts","../../src/event-graph/graph-helpers.ts","../../src/event-graph/task-transitions.ts","../../src/continuous-event-graph/core.ts","../../src/continuous-event-graph/schedule.ts","../../src/continuous-event-graph/inspect.ts","../../src/continuous-event-graph/journal.ts","../../src/continuous-event-graph/reactive.ts"],"names":["updatedTask","createDefaultTaskState","requires","buildProducerMap","existsSync","writeFileSync","appendFileSync","readFileSync"],"mappings":"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","file":"index.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, TaskState, 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: TaskState | 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: TaskState | undefined): boolean {\n return taskState?.status === TASK_STATUS.COMPLETED;\n}\n\nexport function isTaskRunning(taskState: TaskState | 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, TaskState>\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 createDefaultTaskState(): TaskState {\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, TaskState> = {};\n for (const taskName of Object.keys(graph.tasks)) {\n tasks[taskName] = createDefaultTaskState();\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, TaskState, 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] ?? createDefaultTaskState();\n\n const updatedTask: TaskState = {\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): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultTaskState();\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: TaskState = {\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 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] ?? createDefaultTaskState();\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: TaskState = {\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: TaskState = {\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] ?? createDefaultTaskState();\n\n const updatedTask: TaskState = {\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\nfunction createDefaultTaskState(): TaskState {\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, TaskState } from '../event-graph/types.js';\nimport { getProvides, getRequires } from '../event-graph/graph-helpers.js';\nimport {\n applyTaskStart,\n applyTaskCompletion,\n applyTaskFailure,\n applyTaskProgress,\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, TaskState> = {};\n\n for (const taskName of Object.keys(config.tasks)) {\n tasks[taskName] = createDefaultTaskState();\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 execution event to the LiveGraph, producing a new LiveGraph.\n * Events are the shared vocabulary: task-started, task-completed, task-failed,\n * task-progress, inject-tokens, agent-action.\n *\n * Config is NOT mutated by events — only state changes.\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 let newState: ExecutionState;\n\n switch (event.type) {\n case 'task-started':\n newState = applyTaskStart(state, event.taskName);\n break;\n\n case 'task-completed':\n newState = applyTaskCompletion(state, config, event.taskName, event.result, event.dataHash);\n break;\n\n case 'task-failed':\n newState = applyTaskFailure(state, config, event.taskName, event.error);\n break;\n\n case 'task-progress':\n newState = applyTaskProgress(state, event.taskName, event.message, event.progress);\n break;\n\n case 'inject-tokens':\n newState = {\n ...state,\n availableOutputs: [...new Set([...state.availableOutputs, ...event.tokens])],\n lastUpdated: new Date().toISOString(),\n };\n break;\n\n case 'agent-action':\n newState = applyAgentAction(state, event.action);\n break;\n\n default:\n return live;\n }\n\n return { config, state: newState };\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 * Add a node (task) to the live graph. Updates both config and state atomically.\n * If the node already exists, returns the graph unchanged.\n */\nexport function addNode(live: LiveGraph, name: string, taskConfig: TaskConfig): LiveGraph {\n if (live.config.tasks[name]) return live;\n\n return {\n config: {\n ...live.config,\n tasks: { ...live.config.tasks, [name]: taskConfig },\n },\n state: {\n ...live.state,\n tasks: { ...live.state.tasks, [name]: createDefaultTaskState() },\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]: createDefaultTaskState(),\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] ?? createDefaultTaskState();\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 createDefaultTaskState(): TaskState {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n\nfunction applyAgentAction(\n state: ExecutionState,\n action: 'start' | 'stop' | 'pause' | 'resume',\n): ExecutionState {\n const now = new Date().toISOString();\n switch (action) {\n case 'stop':\n return { ...state, status: 'stopped', lastUpdated: now };\n case 'pause':\n return { ...state, status: 'paused', lastUpdated: now };\n case 'resume':\n return { ...state, status: 'running', lastUpdated: now };\n default:\n return state;\n }\n}\n","/**\n * Continuous Event Graph — Schedule\n *\n * Pure read-only projection: LiveGraph → ScheduleResult\n *\n * Classifies every non-terminal task into one of:\n * - eligible: all requires satisfied, ready to dispatch\n * - pending: requires not yet met, but a viable producer exists (normal waiting)\n * - unresolved: requires not met, NO task in the graph can produce them (caller's problem)\n * - blocked: requires not met because the producing task FAILED (caller's problem)\n */\n\nimport type { LiveGraph, ScheduleResult, PendingTask, UnresolvedDependency, BlockedTask } from './types.js';\nimport { getProvides, getRequires, getAllTasks, isNonActiveTask, computeAvailableOutputs, getMaxExecutions, getRefreshStrategy, groupTasksByProvides } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n/**\n * Compute the scheduling status of every task in the live graph.\n * Pure function — no side effects.\n */\nexport function schedule(live: LiveGraph): ScheduleResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const taskNames = Object.keys(graphTasks);\n\n if (taskNames.length === 0) {\n return { eligible: [], pending: [], unresolved: [], blocked: [], conflicts: {} };\n }\n\n // Build producer map: token → tasks that produce it (includes on/on_failure)\n const producerMap = buildProducerMap(graphTasks);\n\n // Available outputs: from completed tasks + injected tokens\n const computedOutputs = computeAvailableOutputs(config, state.tasks);\n const availableOutputs = new Set([...computedOutputs, ...state.availableOutputs]);\n\n const eligible: string[] = [];\n const pending: PendingTask[] = [];\n const unresolved: UnresolvedDependency[] = [];\n const blocked: BlockedTask[] = [];\n\n for (const [taskName, taskConfig] of Object.entries(graphTasks)) {\n const taskState = state.tasks[taskName];\n const strategy = getRefreshStrategy(taskConfig, config.settings);\n const rerunnable = strategy !== 'once';\n\n // Always skip running or inactive (failed/inactivated) tasks\n if (taskState?.status === TASK_STATUS.RUNNING || isNonActiveTask(taskState)) {\n continue;\n }\n\n // Max executions cap\n const maxExec = getMaxExecutions(taskConfig);\n if (maxExec !== undefined && taskState && taskState.executionCount >= maxExec) {\n continue;\n }\n\n // Circuit breaker\n if (taskConfig.circuit_breaker && taskState &&\n taskState.executionCount >= taskConfig.circuit_breaker.max_executions) {\n continue;\n }\n\n // For once-only tasks: skip if completed\n if (!rerunnable && taskState?.status === TASK_STATUS.COMPLETED) {\n continue;\n }\n\n // For re-runnable tasks that already completed: check strategy\n if (rerunnable && taskState?.status === TASK_STATUS.COMPLETED) {\n const requires = getRequires(taskConfig);\n\n let shouldSkip = false;\n switch (strategy) {\n case 'data-changed': {\n if (requires.length > 0) {\n const hasChangedData = requires.some(req => {\n for (const [otherName, otherConfig] of Object.entries(graphTasks)) {\n if (getProvides(otherConfig).includes(req)) {\n const otherState = state.tasks[otherName];\n if (!otherState) continue;\n const consumed = taskState.lastConsumedHashes?.[req];\n if (otherState.lastDataHash == null) {\n return otherState.executionCount > taskState.lastEpoch;\n }\n return otherState.lastDataHash !== consumed;\n }\n }\n return false;\n });\n if (!hasChangedData) shouldSkip = true;\n } else {\n shouldSkip = true;\n }\n break;\n }\n case 'epoch-changed': {\n if (requires.length > 0) {\n const hasRefreshed = requires.some(req => {\n for (const [otherName, otherConfig] of Object.entries(graphTasks)) {\n if (getProvides(otherConfig).includes(req)) {\n const otherState = state.tasks[otherName];\n if (otherState && otherState.executionCount > taskState.lastEpoch) return true;\n }\n }\n return false;\n });\n if (!hasRefreshed) shouldSkip = true;\n } else {\n shouldSkip = true;\n }\n break;\n }\n case 'time-based': {\n const interval = taskConfig.refreshInterval ?? 0;\n if (interval <= 0) { shouldSkip = true; break; }\n const completedAt = taskState.completedAt;\n if (!completedAt) { shouldSkip = true; break; }\n const elapsedSec = (Date.now() - Date.parse(completedAt)) / 1000;\n if (elapsedSec < interval) shouldSkip = true;\n break;\n }\n case 'manual':\n shouldSkip = true;\n break;\n }\n if (shouldSkip) continue;\n }\n\n const requires = getRequires(taskConfig);\n\n // No requires → eligible (entry point)\n if (requires.length === 0) {\n eligible.push(taskName);\n continue;\n }\n\n // Check each required token\n const missingTokens: string[] = [];\n const pendingTokens: string[] = [];\n const failedTokenInfo: { token: string; failedProducer: string }[] = [];\n\n for (const token of requires) {\n if (availableOutputs.has(token)) continue;\n\n const producers = producerMap[token] || [];\n\n if (producers.length === 0) {\n // No task produces this token → unresolved\n missingTokens.push(token);\n } else {\n // Check if all producers have failed\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n if (allFailed) {\n failedTokenInfo.push({ token, failedProducer: producers[0] });\n } else {\n // At least one producer is viable → pending (normal wait)\n pendingTokens.push(token);\n }\n }\n }\n\n if (missingTokens.length > 0) {\n unresolved.push({ taskName, missingTokens });\n } else if (failedTokenInfo.length > 0) {\n blocked.push({\n taskName,\n failedTokens: failedTokenInfo.map(f => f.token),\n failedProducers: [...new Set(failedTokenInfo.map(f => f.failedProducer))],\n });\n } else if (pendingTokens.length > 0) {\n pending.push({ taskName, waitingOn: pendingTokens });\n } else {\n // All requires satisfied\n eligible.push(taskName);\n }\n }\n\n // Detect conflicts among eligible tasks\n const conflicts: Record<string, string[]> = {};\n if (eligible.length > 1) {\n const outputGroups = groupTasksByProvides(eligible, graphTasks);\n for (const [outputKey, groupTasks] of Object.entries(outputGroups)) {\n if (groupTasks.length > 1) {\n conflicts[outputKey] = groupTasks;\n }\n }\n }\n\n return { eligible, pending, unresolved, blocked, conflicts };\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Build a map: token → tasks that produce it (via provides, on, on_failure).\n */\nfunction buildProducerMap(tasks: Record<string, import('../event-graph/types.js').TaskConfig>): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n\n return map;\n}\n","/**\n * Continuous Event Graph — Inspect\n *\n * Pure read-only projection: LiveGraph → LiveGraphHealth\n *\n * Live health report combining config structure + runtime state.\n */\n\nimport type { LiveGraph, LiveGraphHealth, UnreachableTokensResult, UnreachableNodesResult, UpstreamResult, DownstreamResult } from './types.js';\nimport { getProvides, getRequires, getAllTasks, isNonActiveTask } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n/**\n * Compute a live health report for the graph.\n * Combines structural analysis (cycles, conflicts, open deps) with runtime state (task statuses).\n * Pure function — no side effects.\n */\nexport function inspect(live: LiveGraph): LiveGraphHealth {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const taskNames = Object.keys(graphTasks);\n\n // --- Task status counts ---\n let running = 0, completed = 0, failed = 0, waiting = 0, notStarted = 0, disabled = 0;\n\n for (const taskName of taskNames) {\n const ts = state.tasks[taskName];\n if (!ts || ts.status === TASK_STATUS.NOT_STARTED) {\n notStarted++;\n } else {\n switch (ts.status) {\n case TASK_STATUS.RUNNING: running++; break;\n case TASK_STATUS.COMPLETED: completed++; break;\n case TASK_STATUS.FAILED: failed++; break;\n case 'inactivated': disabled++; break;\n default: waiting++;\n }\n }\n }\n\n // --- Producer map ---\n const producerMap: Record<string, string[]> = {};\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n for (const token of getProvides(taskConfig)) {\n if (!producerMap[token]) producerMap[token] = [];\n producerMap[token].push(name);\n }\n if (taskConfig.on) {\n for (const tokens of Object.values(taskConfig.on)) {\n for (const token of tokens) {\n if (!producerMap[token]) producerMap[token] = [];\n if (!producerMap[token].includes(name)) producerMap[token].push(name);\n }\n }\n }\n if (taskConfig.on_failure) {\n for (const token of taskConfig.on_failure) {\n if (!producerMap[token]) producerMap[token] = [];\n if (!producerMap[token].includes(name)) producerMap[token].push(name);\n }\n }\n }\n\n // --- Open dependencies: tokens required but no producer exists ---\n const openDeps = new Set<string>();\n let unresolvedCount = 0;\n let blockedCount = 0;\n\n for (const [taskName, taskConfig] of Object.entries(graphTasks)) {\n const ts = state.tasks[taskName];\n // Skip already-completed or running\n if (ts?.status === TASK_STATUS.COMPLETED || ts?.status === TASK_STATUS.RUNNING) continue;\n\n let hasOpen = false;\n let hasBlocked = false;\n for (const token of getRequires(taskConfig)) {\n const producers = producerMap[token] || [];\n if (producers.length === 0) {\n openDeps.add(token);\n hasOpen = true;\n } else {\n const allFailed = producers.every(p => {\n const ps = state.tasks[p];\n return ps?.status === TASK_STATUS.FAILED || ps?.status === 'inactivated';\n });\n if (allFailed) hasBlocked = true;\n }\n }\n if (hasOpen) unresolvedCount++;\n if (hasBlocked && !hasOpen) blockedCount++;\n }\n\n // --- Conflict tokens: produced by multiple tasks ---\n const conflictTokens: string[] = [];\n for (const [token, producers] of Object.entries(producerMap)) {\n if (producers.length > 1) conflictTokens.push(token);\n }\n\n // --- Cycle detection (DFS) ---\n const deps = buildTaskDeps(graphTasks, producerMap);\n const cycles = detectCycles(taskNames, deps);\n\n return {\n totalNodes: taskNames.length,\n running, completed, failed, waiting, notStarted, disabled,\n unresolvedCount,\n blockedCount,\n openDependencies: [...openDeps],\n cycles,\n conflictTokens,\n };\n}\n\n// ============================================================================\n// Cycle detection internals (pure)\n// ============================================================================\n\nfunction buildTaskDeps(\n tasks: Record<string, import('../event-graph/types.js').TaskConfig>,\n producerMap: Record<string, string[]>,\n): Record<string, Set<string>> {\n const deps: Record<string, Set<string>> = {};\n for (const [name, config] of Object.entries(tasks)) {\n deps[name] = new Set<string>();\n for (const token of getRequires(config)) {\n for (const producer of (producerMap[token] || [])) {\n if (producer !== name) deps[name].add(producer);\n }\n }\n }\n return deps;\n}\n\nfunction detectCycles(\n taskNames: string[],\n deps: Record<string, Set<string>>,\n): string[][] {\n const WHITE = 0, GRAY = 1, BLACK = 2;\n const color: Record<string, number> = {};\n const parent: Record<string, string | null> = {};\n const cycles: string[][] = [];\n\n for (const name of taskNames) {\n color[name] = WHITE;\n parent[name] = null;\n }\n\n function dfs(node: string): void {\n color[node] = GRAY;\n for (const dep of deps[node] || []) {\n if (color[dep] === GRAY) {\n const cycle: string[] = [dep];\n let cur = node;\n while (cur !== dep) {\n cycle.push(cur);\n cur = parent[cur]!;\n }\n cycle.push(dep);\n cycle.reverse();\n cycles.push(cycle);\n } else if (color[dep] === WHITE) {\n parent[dep] = node;\n dfs(dep);\n }\n }\n color[node] = BLACK;\n }\n\n for (const name of taskNames) {\n if (color[name] === WHITE) dfs(name);\n }\n\n return cycles;\n}\n\n// ============================================================================\n// Reachability analysis (transitive)\n// ============================================================================\n\n/**\n * Build producer map: token → task names that produce it.\n */\nfunction buildProducerMap(\n tasks: Record<string, import('../event-graph/types.js').TaskConfig>,\n): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n return map;\n}\n\n/**\n * Get all tokens that are required but cannot be produced given the current\n * graph state. This is **transitive**: if token X is unreachable, and node A\n * is the only producer of token Y but A requires X, then Y is also unreachable.\n *\n * Takes into account:\n * - Tokens already in availableOutputs (reachable)\n * - Tokens from completed tasks (reachable)\n * - Failed/disabled producers (non-viable)\n *\n * Pure function.\n */\nexport function getUnreachableTokens(live: LiveGraph): UnreachableTokensResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const producerMap = buildProducerMap(graphTasks);\n\n // Tokens already available\n const available = new Set([...state.availableOutputs]);\n for (const [taskName, taskState] of Object.entries(state.tasks)) {\n if (taskState.status === 'completed') {\n const tc = graphTasks[taskName];\n if (tc) getProvides(tc).forEach(t => available.add(t));\n }\n }\n\n // Collect all required tokens\n const allRequired = new Set<string>();\n for (const taskConfig of Object.values(graphTasks)) {\n for (const token of getRequires(taskConfig)) {\n allRequired.add(token);\n }\n }\n\n // Iterative fixed-point: mark tokens unreachable if all their viable producers\n // are themselves unreachable (need an unreachable token).\n const unreachable = new Set<string>();\n const unreachableNodes = new Set<string>();\n\n // Seed: tokens with NO producer at all (and not already available)\n for (const token of allRequired) {\n if (available.has(token)) continue;\n const producers = producerMap[token] || [];\n if (producers.length === 0) {\n unreachable.add(token);\n }\n }\n\n // Fixed-point: propagate transitively\n let changed = true;\n while (changed) {\n changed = false;\n\n // Mark nodes as unreachable if any of their requires is unreachable\n // and they haven't already completed\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n if (unreachableNodes.has(name)) continue;\n const ts = state.tasks[name];\n if (ts?.status === 'completed') continue; // already done, skip\n\n // Check if non-active (failed/disabled) — it's a dead producer\n const isNonActive = isNonActiveTask(ts);\n\n const requires = getRequires(taskConfig);\n const hasUnreachableDep = requires.some(t => unreachable.has(t));\n\n if (isNonActive || hasUnreachableDep) {\n if (!unreachableNodes.has(name)) {\n unreachableNodes.add(name);\n changed = true;\n }\n }\n }\n\n // Mark tokens as unreachable if ALL their producers are unreachable/non-active\n for (const token of allRequired) {\n if (unreachable.has(token) || available.has(token)) continue;\n const producers = producerMap[token] || [];\n const allProducersUnreachable = producers.length > 0 &&\n producers.every(p => unreachableNodes.has(p) || isNonActiveTask(state.tasks[p]));\n if (producers.length === 0 || allProducersUnreachable) {\n if (!unreachable.has(token)) {\n unreachable.add(token);\n changed = true;\n }\n }\n }\n }\n\n // Build reason map\n const tokens: UnreachableTokensResult['tokens'] = [];\n for (const token of unreachable) {\n const producers = producerMap[token] || [];\n let reason: 'no-producer' | 'all-producers-failed' | 'transitive';\n if (producers.length === 0) {\n reason = 'no-producer';\n } else {\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n reason = allFailed ? 'all-producers-failed' : 'transitive';\n }\n tokens.push({ token, reason, producers });\n }\n\n return { tokens };\n}\n\n/**\n * Get all nodes that can never become eligible given the current graph state.\n * A node is unreachable if any of its required tokens is unreachable.\n *\n * This is the node-level companion to getUnreachableTokens — uses the same\n * transitive analysis.\n *\n * Pure function.\n */\nexport function getUnreachableNodes(live: LiveGraph): UnreachableNodesResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const { tokens: unreachableTokens } = getUnreachableTokens(live);\n const unreachableTokenSet = new Set(unreachableTokens.map(t => t.token));\n\n const nodes: UnreachableNodesResult['nodes'] = [];\n\n for (const [name, taskConfig] of Object.entries(graphTasks)) {\n const ts = state.tasks[name];\n if (ts?.status === 'completed') continue; // already done\n\n const requires = getRequires(taskConfig);\n const missingTokens = requires.filter(t => unreachableTokenSet.has(t));\n\n if (missingTokens.length > 0) {\n nodes.push({ nodeName: name, missingTokens });\n } else if (isNonActiveTask(ts)) {\n // Node itself is failed/disabled — it's unreachable too\n nodes.push({ nodeName: name, missingTokens: [] });\n }\n }\n\n return { nodes };\n}\n\n// ============================================================================\n// Graph traversal: upstream / downstream\n// ============================================================================\n\n/**\n * Get all nodes that transitively feed into the given node.\n * \"What's upstream of X?\" — traces backwards through requires → provides chains.\n *\n * Returns the set of upstream nodes and the tokens connecting them.\n * Does NOT include the target node itself.\n * Pure function.\n */\nexport function getUpstream(live: LiveGraph, nodeName: string): UpstreamResult {\n const graphTasks = getAllTasks(live.config);\n if (!graphTasks[nodeName]) return { nodeName, nodes: [], tokens: [] };\n\n const producerMap = buildProducerMap(graphTasks);\n const visited = new Set<string>();\n const tokenSet = new Set<string>();\n const nodeEntries: Map<string, Set<string>> = new Map();\n\n function walk(current: string): void {\n const taskConfig = graphTasks[current];\n if (!taskConfig) return;\n\n for (const token of getRequires(taskConfig)) {\n const producers = producerMap[token] || [];\n for (const producer of producers) {\n if (producer === nodeName) continue; // don't include target\n tokenSet.add(token);\n\n // Track which tokens this producer contributes\n if (!nodeEntries.has(producer)) nodeEntries.set(producer, new Set());\n nodeEntries.get(producer)!.add(token);\n\n if (!visited.has(producer)) {\n visited.add(producer);\n walk(producer);\n }\n }\n }\n }\n\n walk(nodeName);\n\n const nodes = [...nodeEntries.entries()].map(([name, tokens]) => ({\n nodeName: name,\n providesTokens: [...tokens],\n }));\n\n return { nodeName, nodes, tokens: [...tokenSet] };\n}\n\n/**\n * Get all nodes that transitively depend on the given node.\n * \"What breaks if I disable X?\" — traces forwards through provides → requires chains.\n *\n * Returns the set of downstream nodes and the tokens connecting them.\n * Does NOT include the target node itself.\n * Pure function.\n */\nexport function getDownstream(live: LiveGraph, nodeName: string): DownstreamResult {\n const graphTasks = getAllTasks(live.config);\n if (!graphTasks[nodeName]) return { nodeName, nodes: [], tokens: [] };\n\n // Build consumer map: token → nodes that require it\n const consumerMap: Record<string, string[]> = {};\n for (const [name, config] of Object.entries(graphTasks)) {\n for (const token of getRequires(config)) {\n if (!consumerMap[token]) consumerMap[token] = [];\n consumerMap[token].push(name);\n }\n }\n\n const visited = new Set<string>();\n const tokenSet = new Set<string>();\n const nodeEntries: Map<string, Set<string>> = new Map();\n\n function walk(current: string): void {\n const taskConfig = graphTasks[current];\n if (!taskConfig) return;\n\n for (const token of getProvides(taskConfig)) {\n const consumers = consumerMap[token] || [];\n for (const consumer of consumers) {\n if (consumer === nodeName) continue; // don't include target\n tokenSet.add(token);\n\n if (!nodeEntries.has(consumer)) nodeEntries.set(consumer, new Set());\n nodeEntries.get(consumer)!.add(token);\n\n if (!visited.has(consumer)) {\n visited.add(consumer);\n walk(consumer);\n }\n }\n }\n }\n\n walk(nodeName);\n\n const nodes = [...nodeEntries.entries()].map(([name, tokens]) => ({\n nodeName: name,\n requiresTokens: [...tokens],\n }));\n\n return { nodeName, nodes, tokens: [...tokenSet] };\n}\n","/**\n * Continuous Event Graph — Journal\n *\n * Append-only event log for the reactive layer.\n * Handlers append events here; drain() reads and clears atomically.\n *\n * Two adapters:\n * - MemoryJournal: in-process array (default)\n * - FileJournal: append to a JSONL file, truncate on drain\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// ============================================================================\n// FileJournal — append to JSONL file, drain reads + truncates\n// ============================================================================\n\nimport { readFileSync, writeFileSync, appendFileSync, existsSync } from 'fs';\n\nexport class FileJournal implements Journal {\n private pending = 0;\n\n constructor(private readonly path: string) {\n // Ensure file exists\n if (!existsSync(path)) {\n writeFileSync(path, '', 'utf-8');\n }\n }\n\n append(event: GraphEvent): void {\n appendFileSync(this.path, JSON.stringify(event) + '\\n', 'utf-8');\n this.pending++;\n }\n\n drain(): GraphEvent[] {\n const content = readFileSync(this.path, 'utf-8').trim();\n // Truncate immediately\n writeFileSync(this.path, '', 'utf-8');\n this.pending = 0;\n\n if (!content) return [];\n\n return content.split('\\n').map(line => JSON.parse(line) as GraphEvent);\n }\n\n get size(): number {\n // Re-count from file for accuracy (pending is a hint)\n try {\n const content = readFileSync(this.path, 'utf-8').trim();\n if (!content) return 0;\n return content.split('\\n').length;\n } catch {\n return this.pending;\n }\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 } from '../event-graph/types.js';\nimport type { LiveGraph, ScheduleResult } from './types.js';\nimport { createLiveGraph, applyEvent, applyEvents, addNode, removeNode } from './core.js';\nimport { schedule } from './schedule.js';\nimport { MemoryJournal } from './journal.js';\nimport type { Journal } from './journal.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Context passed to task handlers. */\nexport interface TaskHandlerContext {\n /** Name of the task being executed */\n taskName: string;\n /** Current snapshot of the live graph (read-only — do not mutate) */\n live: Readonly<LiveGraph>;\n /** The task's own config */\n config: TaskConfig;\n}\n\n/** A task handler function. Return value becomes the event's `data` payload. */\nexport type TaskHandler = (ctx: TaskHandlerContext) => Promise<TaskHandlerResult>;\n\nexport interface TaskHandlerResult {\n /** Optional result key for conditional routing (task's `on` map) */\n result?: string;\n /** Optional data payload */\n data?: Record<string, unknown>;\n /** Optional content hash for data-changed strategy */\n dataHash?: string;\n}\n\n/** Internal dispatch tracking — NOT exposed to the core engine. */\nexport interface DispatchEntry {\n status: 'initiated' | 'dispatch-failed' | 'timed-out' | 'retry-queued' | 'abandoned';\n dispatchedAt: number;\n dispatchAttempts: number;\n lastError?: string;\n}\n\nexport interface ReactiveGraphOptions {\n /** Task handlers keyed by task name */\n handlers: Record<string, TaskHandler>;\n /** Max times to retry dispatching a handler that fails to invoke (default: 3) */\n maxDispatchRetries?: number;\n /** Default timeout in ms for handler callbacks (default: 30000). 0 = no timeout. */\n defaultTimeoutMs?: number;\n /** Journal adapter (default: MemoryJournal) */\n journal?: Journal;\n /** Called when a handler fails to dispatch */\n onDispatchFailed?: (taskName: string, error: Error, attempt: number) => void;\n /** Called when a task is abandoned after max dispatch retries */\n onAbandoned?: (taskName: string) => void;\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. Triggers drain → schedule → dispatch cascade. */\n push(event: GraphEvent): void;\n /** Push multiple events. Single drain cycle after all are journaled. */\n pushAll(events: GraphEvent[]): void;\n /** Add a node with its handler. Triggers re-evaluation. */\n addNode(name: string, taskConfig: TaskConfig, handler: TaskHandler): void;\n /** Remove a node and its handler. */\n removeNode(name: string): void;\n /** Read-only snapshot of current LiveGraph state. */\n getState(): LiveGraph;\n /** Current schedule projection. */\n getSchedule(): ScheduleResult;\n /** Internal dispatch tracking (for observability/debugging). */\n getDispatchState(): ReadonlyMap<string, DispatchEntry>;\n /** Cancel pending timeouts and stop dispatching. */\n dispose(): void;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createReactiveGraph(\n config: GraphConfig,\n options: ReactiveGraphOptions,\n executionId?: string,\n): ReactiveGraph {\n const {\n handlers: initialHandlers,\n maxDispatchRetries = 3,\n defaultTimeoutMs = 30_000,\n journal = new MemoryJournal(),\n onDispatchFailed,\n onAbandoned,\n onDrain,\n } = options;\n\n let live = createLiveGraph(config, executionId);\n let disposed = false;\n\n // Handler registry — mutable so addNode/removeNode can update it\n const handlers = new Map<string, TaskHandler>(Object.entries(initialHandlers));\n\n // Dispatch tracking — reactive-layer only, never touches core types\n const dispatched = new Map<string, DispatchEntry>();\n\n // Timeout timers — so we can cancel them on dispose\n const timeoutTimers = new Map<string, ReturnType<typeof setTimeout>>();\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. Sweep timeouts\n sweepTimeouts();\n\n // 2. Read all pending events from journal\n const events = journal.drain();\n\n // 3. Clear dispatch tracking for tasks that completed or failed\n for (const event of events) {\n if (event.type === 'task-completed' || event.type === 'task-failed') {\n const taskName = (event as { taskName: string }).taskName;\n dispatched.delete(taskName);\n clearTimeout(timeoutTimers.get(taskName));\n timeoutTimers.delete(taskName);\n }\n }\n\n // 4. Apply all events atomically\n if (events.length > 0) {\n live = applyEvents(live, events);\n }\n\n // 5. Schedule — what can run?\n const result = schedule(live);\n\n // 6. Observability callback\n if (onDrain && events.length > 0) {\n onDrain(events, live, result);\n }\n\n // 7. Dispatch eligible tasks not already initiated\n for (const taskName of result.eligible) {\n if (dispatched.has(taskName)) continue;\n dispatchTask(taskName);\n }\n\n // 8. Re-dispatch retry-queued tasks\n for (const [taskName, entry] of dispatched) {\n if (entry.status === 'retry-queued') {\n dispatchTask(taskName);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Dispatch a single task\n // --------------------------------------------------------------------------\n\n function dispatchTask(taskName: string): void {\n const handler = handlers.get(taskName);\n if (!handler) {\n // No handler registered — push task-failed to core\n journal.append({\n type: 'task-failed',\n taskName,\n error: `No handler registered for task \"${taskName}\"`,\n timestamp: new Date().toISOString(),\n });\n drainQueued = true;\n return;\n }\n\n const existing = dispatched.get(taskName);\n const attempt = existing ? existing.dispatchAttempts + 1 : 1;\n\n // Check max retries\n if (attempt > maxDispatchRetries) {\n dispatched.set(taskName, {\n status: 'abandoned',\n dispatchedAt: existing?.dispatchedAt ?? Date.now(),\n dispatchAttempts: attempt - 1,\n lastError: existing?.lastError,\n });\n onAbandoned?.(taskName);\n // Notify core engine so on_failure/circuit_breaker can fire\n journal.append({\n type: 'task-failed',\n taskName,\n error: `dispatch-abandoned: handler unreachable after ${attempt - 1} attempts${existing?.lastError ? ` (${existing.lastError})` : ''}`,\n timestamp: new Date().toISOString(),\n });\n drainQueued = true;\n return;\n }\n\n // Mark initiated\n dispatched.set(taskName, {\n status: 'initiated',\n dispatchedAt: Date.now(),\n dispatchAttempts: attempt,\n });\n\n // Push task-started to journal\n journal.append({\n type: 'task-started',\n taskName,\n timestamp: new Date().toISOString(),\n });\n\n // Set up timeout\n if (defaultTimeoutMs > 0) {\n const timer = setTimeout(() => {\n if (disposed) return;\n const entry = dispatched.get(taskName);\n if (entry?.status === 'initiated') {\n dispatched.set(taskName, {\n ...entry,\n status: 'timed-out',\n });\n // Queue retry or abandon on next drain\n dispatched.set(taskName, {\n ...entry,\n status: entry.dispatchAttempts >= maxDispatchRetries ? 'abandoned' : 'retry-queued',\n });\n if (entry.dispatchAttempts >= maxDispatchRetries) {\n onAbandoned?.(taskName);\n journal.append({\n type: 'task-failed',\n taskName,\n error: `dispatch-timeout: no callback after ${defaultTimeoutMs}ms (${entry.dispatchAttempts} attempts)`,\n timestamp: new Date().toISOString(),\n });\n }\n drain();\n }\n }, defaultTimeoutMs);\n timeoutTimers.set(taskName, timer);\n }\n\n // Fire-and-forget: invoke handler\n const ctx: TaskHandlerContext = {\n taskName,\n live: live,\n config: live.config.tasks[taskName],\n };\n\n try {\n const promise = handler(ctx);\n promise.then(\n (handlerResult) => {\n if (disposed) return;\n clearTimeout(timeoutTimers.get(taskName));\n timeoutTimers.delete(taskName);\n\n journal.append({\n type: 'task-completed',\n taskName,\n result: handlerResult.result,\n data: handlerResult.data,\n dataHash: handlerResult.dataHash,\n timestamp: new Date().toISOString(),\n });\n drain();\n },\n (error: Error) => {\n if (disposed) return;\n clearTimeout(timeoutTimers.get(taskName));\n timeoutTimers.delete(taskName);\n\n journal.append({\n type: 'task-failed',\n taskName,\n error: error.message ?? String(error),\n timestamp: new Date().toISOString(),\n });\n drain();\n },\n );\n } catch (syncError: unknown) {\n // Handler threw synchronously (not async)\n const err = syncError instanceof Error ? syncError : new Error(String(syncError));\n dispatched.set(taskName, {\n status: 'dispatch-failed',\n dispatchedAt: Date.now(),\n dispatchAttempts: attempt,\n lastError: err.message,\n });\n onDispatchFailed?.(taskName, err, attempt);\n dispatched.set(taskName, {\n ...dispatched.get(taskName)!,\n status: 'retry-queued',\n });\n drainQueued = true;\n }\n }\n\n // --------------------------------------------------------------------------\n // Timeout sweep\n // --------------------------------------------------------------------------\n\n function sweepTimeouts(): void {\n // Timeouts are handled via setTimeout callbacks, but we also sweep\n // on each drain cycle for any that might have slipped through.\n const now = Date.now();\n for (const [taskName, entry] of dispatched) {\n if (entry.status !== 'initiated') continue;\n if (defaultTimeoutMs <= 0) continue;\n if (now - entry.dispatchedAt >= defaultTimeoutMs) {\n dispatched.set(taskName, {\n ...entry,\n status: entry.dispatchAttempts >= maxDispatchRetries ? 'abandoned' : 'retry-queued',\n });\n if (entry.dispatchAttempts >= maxDispatchRetries) {\n onAbandoned?.(taskName);\n journal.append({\n type: 'task-failed',\n taskName,\n error: `dispatch-timeout: no callback after ${defaultTimeoutMs}ms (${entry.dispatchAttempts} attempts)`,\n timestamp: new Date().toISOString(),\n });\n }\n clearTimeout(timeoutTimers.get(taskName));\n timeoutTimers.delete(taskName);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Public API\n // --------------------------------------------------------------------------\n\n return {\n push(event: GraphEvent): void {\n if (disposed) return;\n // Apply immediately (not via journal — this is an external push)\n live = applyEvent(live, event);\n // Then schedule + dispatch\n drain();\n },\n\n pushAll(events: GraphEvent[]): void {\n if (disposed) return;\n if (events.length === 0) return;\n live = applyEvents(live, events);\n drain();\n },\n\n addNode(name: string, taskConfig: TaskConfig, handler: TaskHandler): void {\n if (disposed) return;\n live = addNode(live, name, taskConfig);\n handlers.set(name, handler);\n drain();\n },\n\n removeNode(name: string): void {\n if (disposed) return;\n live = removeNode(live, name);\n handlers.delete(name);\n dispatched.delete(name);\n clearTimeout(timeoutTimers.get(name));\n timeoutTimers.delete(name);\n },\n\n getState(): LiveGraph {\n return live;\n },\n\n getSchedule(): ScheduleResult {\n return schedule(live);\n },\n\n getDispatchState(): ReadonlyMap<string, DispatchEntry> {\n return dispatched;\n },\n\n dispose(): void {\n disposed = true;\n for (const timer of timeoutTimers.values()) {\n clearTimeout(timer);\n }\n timeoutTimers.clear();\n },\n };\n}\n"]}