@workglow/task-graph 0.0.121 → 0.0.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +99 -58
- package/dist/browser.js.map +8 -8
- package/dist/bun.js +99 -58
- package/dist/bun.js.map +8 -8
- package/dist/node.js +99 -58
- package/dist/node.js.map +8 -8
- package/dist/storage/TaskGraphRepository.d.ts.map +1 -1
- package/dist/storage/TaskGraphTabularRepository.d.ts.map +1 -1
- package/dist/storage/TaskOutputRepository.d.ts.map +1 -1
- package/dist/storage/TaskOutputTabularRepository.d.ts.map +1 -1
- package/dist/task/ConditionalTask.d.ts.map +1 -1
- package/dist/task/FallbackTask.d.ts +44 -44
- package/dist/task/FallbackTask.d.ts.map +1 -1
- package/dist/task/FallbackTaskRunner.d.ts +0 -8
- package/dist/task/FallbackTaskRunner.d.ts.map +1 -1
- package/dist/task/GraphAsTask.d.ts +1 -1
- package/dist/task/GraphAsTask.d.ts.map +1 -1
- package/dist/task/GraphAsTaskRunner.d.ts.map +1 -1
- package/dist/task/IteratorTask.d.ts +12 -12
- package/dist/task/IteratorTask.d.ts.map +1 -1
- package/dist/task/IteratorTaskRunner.d.ts +9 -1
- package/dist/task/IteratorTaskRunner.d.ts.map +1 -1
- package/dist/task/JobQueueTask.d.ts +9 -9
- package/dist/task/JobQueueTask.d.ts.map +1 -1
- package/dist/task/MapTask.d.ts +18 -18
- package/dist/task/MapTask.d.ts.map +1 -1
- package/dist/task/ReduceTask.d.ts +13 -13
- package/dist/task/ReduceTask.d.ts.map +1 -1
- package/dist/task/Task.d.ts +2 -1
- package/dist/task/Task.d.ts.map +1 -1
- package/dist/task/TaskError.d.ts.map +1 -1
- package/dist/task/TaskEvents.d.ts +14 -0
- package/dist/task/TaskEvents.d.ts.map +1 -1
- package/dist/task/TaskJSON.d.ts +4 -4
- package/dist/task/TaskJSON.d.ts.map +1 -1
- package/dist/task/TaskQueueRegistry.d.ts.map +1 -1
- package/dist/task/TaskRunner.d.ts.map +1 -1
- package/dist/task/WhileTask.d.ts +21 -21
- package/dist/task/WhileTask.d.ts.map +1 -1
- package/dist/task/WhileTaskRunner.d.ts.map +1 -1
- package/dist/task/index.d.ts +1 -1
- package/dist/task-graph/Dataflow.d.ts.map +1 -1
- package/dist/task-graph/TaskGraph.d.ts.map +1 -1
- package/dist/task-graph/TaskGraphRunner.d.ts +8 -2
- package/dist/task-graph/TaskGraphRunner.d.ts.map +1 -1
- package/dist/task-graph/TaskGraphScheduler.d.ts.map +1 -1
- package/dist/task-graph/Workflow.d.ts.map +1 -1
- package/package.json +19 -14
package/dist/node.js.map
CHANGED
|
@@ -3,20 +3,20 @@
|
|
|
3
3
|
"sources": ["../src/task/TaskTypes.ts", "../src/task-graph/Dataflow.ts", "../src/task-graph/GraphSchemaUtils.ts", "../src/task/TaskError.ts", "../src/storage/TaskOutputRepository.ts", "../src/task/InputResolver.ts", "../src/task/StreamTypes.ts", "../src/task/TaskRunner.ts", "../src/task/Task.ts", "../src/task/ConditionUtils.ts", "../src/task/ConditionalTask.ts", "../src/task-graph/TaskGraphScheduler.ts", "../src/task-graph/TaskGraphRunner.ts", "../src/task/GraphAsTaskRunner.ts", "../src/task/GraphAsTask.ts", "../src/task-graph/Conversions.ts", "../src/task-graph/TaskGraphEvents.ts", "../src/task-graph/TaskGraph.ts", "../src/common.ts", "../src/task-graph/GraphToWorkflowCode.ts", "../src/task-graph/Workflow.ts", "../src/task/index.ts", "../src/task/FallbackTask.ts", "../src/task/FallbackTaskRunner.ts", "../src/task/IteratorTask.ts", "../src/task/IteratorTaskRunner.ts", "../src/task/WhileTask.ts", "../src/task/WhileTaskRunner.ts", "../src/task/iterationSchema.ts", "../src/task/JobQueueFactory.ts", "../src/task/JobQueueTask.ts", "../src/task/TaskQueueRegistry.ts", "../src/task/MapTask.ts", "../src/task/ReduceTask.ts", "../src/task/TaskJSON.ts", "../src/task/TaskRegistry.ts", "../src/storage/TaskGraphRepository.ts", "../src/storage/TaskGraphTabularRepository.ts", "../src/storage/TaskOutputTabularRepository.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { type DataPortSchema, type FromSchema, StripJSONSchema } from \"@workglow/util\";\nimport type { Task } from \"./Task\";\n\n/**\n * Enum representing the possible states of a task\n *\n * PENDING -> PROCESSING -> COMPLETED\n * PENDING -> PROCESSING -> STREAMING -> COMPLETED\n * PENDING -> PROCESSING -> ABORTING -> FAILED\n * PENDING -> PROCESSING -> FAILED\n * PENDING -> DISABLED\n */\nexport type TaskStatus =\n | \"PENDING\"\n | \"DISABLED\"\n | \"PROCESSING\"\n | \"STREAMING\"\n | \"COMPLETED\"\n | \"ABORTING\"\n | \"FAILED\";\n\nexport const TaskStatus = {\n /** Task is created but not yet started */\n PENDING: \"PENDING\",\n /** Task is disabled due to conditional logic */\n DISABLED: \"DISABLED\",\n /** Task is currently running */\n PROCESSING: \"PROCESSING\",\n /** Task has begun producing streaming output chunks */\n STREAMING: \"STREAMING\",\n /** Task has completed successfully */\n COMPLETED: \"COMPLETED\",\n /** Task is in the process of being aborted */\n ABORTING: \"ABORTING\",\n /** Task has failed */\n FAILED: \"FAILED\",\n} as const satisfies Record<TaskStatus, TaskStatus>;\n\n// ========================================================================\n// Core Task Data Types\n// ========================================================================\n\nexport interface DataPorts extends StripJSONSchema<Record<string, any>> {\n [key: string]: unknown;\n}\n\n/** Type for task input data */\nexport type TaskInput = DataPorts;\n\n/** Type for task output data */\nexport type TaskOutput = DataPorts;\n\nexport type CompoundTaskOutput =\n | {\n outputs: TaskOutput[];\n }\n | {\n [key: string]: unknown | unknown[] | undefined;\n };\n\n/** Type for task type names */\nexport type TaskTypeName = string;\n\n// ========================================================================\n// Task Configuration Schema and Types\n// ========================================================================\n\n/**\n * Base JSON Schema for task configuration.\n * Exported so subclasses can compose their own schema with:\n * `...TaskConfigSchema[\"properties\"]`\n *\n * Fields:\n * - id: unique task identifier (any type)\n * - title: human-readable name for the task instance (overrides static title)\n * - description: human-readable description (overrides static description)\n * - cacheable: design-time cache flag (runtime override goes in IRunConfig)\n * - inputSchema: dynamic input schema override (for tasks like InputTask)\n * - outputSchema: dynamic output schema override (for tasks like OutputTask)\n * - extras: arbitrary user data serialized with the task JSON\n * - timeout: max execution time in milliseconds (auto-aborts with TaskTimeoutError)\n */\nexport const TaskConfigSchema = {\n type: \"object\",\n properties: {\n id: {\n \"x-ui-hidden\": true,\n },\n title: { type: \"string\" },\n description: { type: \"string\" },\n cacheable: { type: \"boolean\" },\n timeout: { type: \"number\", description: \"Max execution time in milliseconds\" },\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: true,\n \"x-ui-hidden\": true,\n },\n outputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: true,\n \"x-ui-hidden\": true,\n },\n extras: {\n type: \"object\",\n additionalProperties: true,\n \"x-ui-hidden\": true,\n },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\ntype BaseFromSchema = FromSchema<typeof TaskConfigSchema>;\n\n/**\n * Base type for task configuration, derived from TaskConfigSchema.\n * Use `TaskConfigSchema` when building JSON schemas in subclasses.\n * Use this type when declaring the Config generic parameter.\n */\nexport type TaskConfig = Omit<BaseFromSchema, \"id\" | \"inputSchema\" | \"outputSchema\"> & {\n /** Unique identifier for the task (uuid4 by default) */\n id?: unknown;\n /** Dynamic input schema override for the task instance */\n inputSchema?: DataPortSchema;\n /** Dynamic output schema override for the task instance */\n outputSchema?: DataPortSchema;\n};\n\n/** Type for task ID */\nexport type TaskIdType = Task<TaskInput, TaskOutput, TaskConfig>[\"config\"][\"id\"];\n",
|
|
6
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { areSemanticallyCompatible, EventEmitter } from \"@workglow/util\";\nimport { type StreamEvent } from \"../task/StreamTypes\";\nimport { TaskError } from \"../task/TaskError\";\nimport { DataflowJson } from \"../task/TaskJSON\";\nimport { TaskIdType, TaskOutput, TaskStatus } from \"../task/TaskTypes\";\nimport {\n DataflowEventListener,\n DataflowEventListeners,\n DataflowEventParameters,\n DataflowEvents,\n} from \"./DataflowEvents\";\nimport { TaskGraph } from \"./TaskGraph\";\n\nexport type DataflowIdType = `${string}[${string}] ==> ${string}[${string}]`;\n\nexport const DATAFLOW_ALL_PORTS = \"*\";\nexport const DATAFLOW_ERROR_PORT = \"[error]\";\n\n/**\n * Represents a data flow between two tasks, indicating how one task's output is used as input for another task\n */\nexport class Dataflow {\n constructor(\n public sourceTaskId: TaskIdType,\n public sourceTaskPortId: string,\n public targetTaskId: TaskIdType,\n public targetTaskPortId: string\n ) {}\n public static createId(\n sourceTaskId: TaskIdType,\n sourceTaskPortId: string,\n targetTaskId: TaskIdType,\n targetTaskPortId: string\n ): DataflowIdType {\n return `${sourceTaskId}[${sourceTaskPortId}] ==> ${targetTaskId}[${targetTaskPortId}]`;\n }\n get id(): DataflowIdType {\n return Dataflow.createId(\n this.sourceTaskId,\n this.sourceTaskPortId,\n this.targetTaskId,\n this.targetTaskPortId\n );\n }\n public value: any = undefined;\n public status: TaskStatus = TaskStatus.PENDING;\n public error: TaskError | undefined;\n\n /**\n * Active stream for this dataflow edge.\n * Set when a streaming upstream task begins producing chunks.\n * Multiple downstream consumers can each get an independent reader via tee().\n */\n public stream: ReadableStream<StreamEvent> | undefined = undefined;\n\n /**\n * Sets the active stream on this dataflow.\n * @param stream The ReadableStream of StreamEvents from the upstream task\n */\n public setStream(stream: ReadableStream<StreamEvent>): void {\n this.stream = stream;\n }\n\n /**\n * Gets the active stream from this dataflow, or undefined if not streaming.\n */\n public getStream(): ReadableStream<StreamEvent> | undefined {\n return this.stream;\n }\n\n /**\n * Consumes the active stream to completion and materializes the value.\n *\n * Accumulation of text-delta chunks is the responsibility of the **source\n * task** (via TaskRunner.executeStreamingTask when shouldAccumulate=true).\n * When accumulation is needed the source task emits an enriched finish event\n * that carries the fully-assembled port data. All downstream edges share that\n * enriched event through tee'd ReadableStreams, so no edge needs to\n * re-accumulate independently.\n *\n * This method therefore only reads snapshot and finish events:\n * - **snapshot**: used for replace-mode tasks that emit incremental snapshots.\n * - **finish**: the primary materialization path; carries complete data when\n * the source task accumulated, or provider-level data otherwise.\n * - text-delta / object-delta: ignored here (handled by source task).\n *\n * After consumption the stream reference is cleared. Calling this method on\n * a dataflow that has no stream is a no-op.\n */\n public async awaitStreamValue(): Promise<void> {\n if (!this.stream) return;\n\n const reader = this.stream.getReader();\n let lastSnapshotData: any = undefined;\n let finishData: any = undefined;\n let streamError: Error | undefined;\n\n try {\n while (true) {\n const { done, value: event } = await reader.read();\n if (done) break;\n\n switch (event.type) {\n case \"snapshot\":\n lastSnapshotData = event.data;\n break;\n case \"finish\":\n finishData = event.data;\n break;\n case \"error\":\n streamError = event.error;\n break;\n // text-delta, object-delta: source task handles accumulation\n }\n }\n } finally {\n reader.releaseLock();\n this.stream = undefined;\n }\n\n if (streamError) {\n this.error = streamError as TaskError;\n this.setStatus(TaskStatus.FAILED);\n throw streamError;\n }\n\n // Priority: snapshot > finish.\n // The source task enriches the finish event with accumulated text when\n // shouldAccumulate=true, so finishData carries complete port data.\n if (lastSnapshotData !== undefined) {\n this.setPortData(lastSnapshotData);\n } else if (finishData !== undefined) {\n this.setPortData(finishData);\n }\n }\n\n public reset() {\n this.status = TaskStatus.PENDING;\n this.error = undefined;\n this.value = undefined;\n this.stream = undefined;\n this.emit(\"reset\");\n this.emit(\"status\", this.status);\n }\n\n public setStatus(status: TaskStatus) {\n if (status === this.status) return;\n this.status = status;\n switch (status) {\n case TaskStatus.PROCESSING:\n this.emit(\"start\");\n break;\n case TaskStatus.STREAMING:\n this.emit(\"streaming\");\n break;\n case TaskStatus.COMPLETED:\n this.emit(\"complete\");\n break;\n case TaskStatus.ABORTING:\n this.emit(\"abort\");\n break;\n case TaskStatus.PENDING:\n this.emit(\"reset\");\n break;\n case TaskStatus.FAILED:\n this.emit(\"error\", this.error!);\n break;\n case TaskStatus.DISABLED:\n this.emit(\"disabled\");\n break;\n }\n this.emit(\"status\", this.status);\n }\n\n setPortData(entireDataBlock: any) {\n if (this.sourceTaskPortId === DATAFLOW_ALL_PORTS) {\n this.value = entireDataBlock;\n } else if (this.sourceTaskPortId === DATAFLOW_ERROR_PORT) {\n this.error = entireDataBlock;\n } else {\n this.value = entireDataBlock[this.sourceTaskPortId];\n }\n }\n\n getPortData(): TaskOutput {\n let result: TaskOutput;\n if (this.targetTaskPortId === DATAFLOW_ALL_PORTS) {\n result = this.value;\n } else if (this.targetTaskPortId === DATAFLOW_ERROR_PORT) {\n result = { [DATAFLOW_ERROR_PORT]: this.error };\n } else {\n result = { [this.targetTaskPortId]: this.value };\n }\n return result;\n }\n\n toJSON(): DataflowJson {\n return {\n sourceTaskId: this.sourceTaskId,\n sourceTaskPortId: this.sourceTaskPortId,\n targetTaskId: this.targetTaskId,\n targetTaskPortId: this.targetTaskPortId,\n };\n }\n\n semanticallyCompatible(\n graph: TaskGraph,\n dataflow: Dataflow\n ): \"static\" | \"runtime\" | \"incompatible\" {\n // TODO(str): this is inefficient\n const targetSchema = graph.getTask(dataflow.targetTaskId)!.inputSchema();\n const sourceSchema = graph.getTask(dataflow.sourceTaskId)!.outputSchema();\n\n if (typeof targetSchema === \"boolean\") {\n if (targetSchema === false) {\n return \"incompatible\";\n }\n return \"static\";\n }\n if (typeof sourceSchema === \"boolean\") {\n if (sourceSchema === false) {\n return \"incompatible\";\n }\n return \"runtime\";\n }\n\n let targetSchemaProperty =\n DATAFLOW_ALL_PORTS === dataflow.targetTaskPortId\n ? true // Accepts any schema (equivalent to Type.Any())\n : (targetSchema.properties as any)?.[dataflow.targetTaskPortId];\n // If the specific property doesn't exist but additionalProperties is true,\n // treat it as accepting any schema\n if (targetSchemaProperty === undefined && targetSchema.additionalProperties === true) {\n targetSchemaProperty = true;\n }\n let sourceSchemaProperty =\n DATAFLOW_ALL_PORTS === dataflow.sourceTaskPortId\n ? true // Accepts any schema (equivalent to Type.Any())\n : (sourceSchema.properties as any)?.[dataflow.sourceTaskPortId];\n // If the specific property doesn't exist but additionalProperties is true,\n // treat it as outputting any schema\n if (sourceSchemaProperty === undefined && sourceSchema.additionalProperties === true) {\n sourceSchemaProperty = true;\n }\n\n const semanticallyCompatible = areSemanticallyCompatible(\n sourceSchemaProperty,\n targetSchemaProperty\n );\n\n return semanticallyCompatible;\n }\n\n // ========================================================================\n // Event handling methods\n // ========================================================================\n\n /**\n * Event emitter for dataflow events\n */\n public get events(): EventEmitter<DataflowEventListeners> {\n if (!this._events) {\n this._events = new EventEmitter<DataflowEventListeners>();\n }\n return this._events;\n }\n protected _events: EventEmitter<DataflowEventListeners> | undefined;\n\n public subscribe<Event extends DataflowEvents>(\n name: Event,\n fn: DataflowEventListener<Event>\n ): () => void {\n return this.events.subscribe(name, fn);\n }\n\n /**\n * Registers an event listener\n */\n public on<Event extends DataflowEvents>(name: Event, fn: DataflowEventListener<Event>): void {\n this.events.on(name, fn);\n }\n\n /**\n * Removes an event listener\n */\n public off<Event extends DataflowEvents>(name: Event, fn: DataflowEventListener<Event>): void {\n this.events.off(name, fn);\n }\n\n /**\n * Registers a one-time event listener\n */\n public once<Event extends DataflowEvents>(name: Event, fn: DataflowEventListener<Event>): void {\n this.events.once(name, fn);\n }\n\n /**\n * Returns a promise that resolves when the specified event is emitted\n */\n public waitOn<Event extends DataflowEvents>(\n name: Event\n ): Promise<DataflowEventParameters<Event>> {\n return this.events.waitOn(name) as Promise<DataflowEventParameters<Event>>;\n }\n\n /**\n * Emits an event\n */\n public emit<Event extends DataflowEvents>(\n name: Event,\n ...args: DataflowEventParameters<Event>\n ): void {\n this._events?.emit(name, ...args);\n }\n}\n\n/**\n * Represents a data flow between two tasks, indicating how one task's output is used as input for another task\n *\n * This is a helper class that parses a data flow id string into a Dataflow object\n *\n * @param dataflow - The data flow string, e.g. \"sourceTaskId[sourceTaskPortId] ==> targetTaskId[targetTaskPortId]\"\n */\nexport class DataflowArrow extends Dataflow {\n constructor(dataflow: DataflowIdType) {\n // Parse the dataflow string using regex\n const pattern =\n /^([a-zA-Z0-9-]+?)\\[([a-zA-Z0-9-]+?)\\] ==> ([a-zA-Z0-9-]+?)\\[([a-zA-Z0-9-]+?)\\]$/;\n const match = dataflow.match(pattern);\n\n if (!match) {\n throw new Error(`Invalid dataflow format: ${dataflow}`);\n }\n\n const [, sourceTaskId, sourceTaskPortId, targetTaskId, targetTaskPortId] = match;\n super(sourceTaskId, sourceTaskPortId, targetTaskId, targetTaskPortId);\n }\n}\n",
|
|
6
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { areSemanticallyCompatible } from \"@workglow/schema\";\nimport { EventEmitter } from \"@workglow/util\";\nimport { type StreamEvent } from \"../task/StreamTypes\";\nimport { TaskError } from \"../task/TaskError\";\nimport { DataflowJson } from \"../task/TaskJSON\";\nimport { TaskIdType, TaskOutput, TaskStatus } from \"../task/TaskTypes\";\nimport {\n DataflowEventListener,\n DataflowEventListeners,\n DataflowEventParameters,\n DataflowEvents,\n} from \"./DataflowEvents\";\nimport { TaskGraph } from \"./TaskGraph\";\n\nexport type DataflowIdType = `${string}[${string}] ==> ${string}[${string}]`;\n\nexport const DATAFLOW_ALL_PORTS = \"*\";\nexport const DATAFLOW_ERROR_PORT = \"[error]\";\n\n/**\n * Represents a data flow between two tasks, indicating how one task's output is used as input for another task\n */\nexport class Dataflow {\n constructor(\n public sourceTaskId: TaskIdType,\n public sourceTaskPortId: string,\n public targetTaskId: TaskIdType,\n public targetTaskPortId: string\n ) {}\n public static createId(\n sourceTaskId: TaskIdType,\n sourceTaskPortId: string,\n targetTaskId: TaskIdType,\n targetTaskPortId: string\n ): DataflowIdType {\n return `${sourceTaskId}[${sourceTaskPortId}] ==> ${targetTaskId}[${targetTaskPortId}]`;\n }\n get id(): DataflowIdType {\n return Dataflow.createId(\n this.sourceTaskId,\n this.sourceTaskPortId,\n this.targetTaskId,\n this.targetTaskPortId\n );\n }\n public value: any = undefined;\n public status: TaskStatus = TaskStatus.PENDING;\n public error: TaskError | undefined;\n\n /**\n * Active stream for this dataflow edge.\n * Set when a streaming upstream task begins producing chunks.\n * Multiple downstream consumers can each get an independent reader via tee().\n */\n public stream: ReadableStream<StreamEvent> | undefined = undefined;\n\n /**\n * Sets the active stream on this dataflow.\n * @param stream The ReadableStream of StreamEvents from the upstream task\n */\n public setStream(stream: ReadableStream<StreamEvent>): void {\n this.stream = stream;\n }\n\n /**\n * Gets the active stream from this dataflow, or undefined if not streaming.\n */\n public getStream(): ReadableStream<StreamEvent> | undefined {\n return this.stream;\n }\n\n /**\n * Consumes the active stream to completion and materializes the value.\n *\n * Accumulation of text-delta chunks is the responsibility of the **source\n * task** (via TaskRunner.executeStreamingTask when shouldAccumulate=true).\n * When accumulation is needed the source task emits an enriched finish event\n * that carries the fully-assembled port data. All downstream edges share that\n * enriched event through tee'd ReadableStreams, so no edge needs to\n * re-accumulate independently.\n *\n * This method therefore only reads snapshot and finish events:\n * - **snapshot**: used for replace-mode tasks that emit incremental snapshots.\n * - **finish**: the primary materialization path; carries complete data when\n * the source task accumulated, or provider-level data otherwise.\n * - text-delta / object-delta: ignored here (handled by source task).\n *\n * After consumption the stream reference is cleared. Calling this method on\n * a dataflow that has no stream is a no-op.\n */\n public async awaitStreamValue(): Promise<void> {\n if (!this.stream) return;\n\n const reader = this.stream.getReader();\n let lastSnapshotData: any = undefined;\n let finishData: any = undefined;\n let streamError: Error | undefined;\n\n try {\n while (true) {\n const { done, value: event } = await reader.read();\n if (done) break;\n\n switch (event.type) {\n case \"snapshot\":\n lastSnapshotData = event.data;\n break;\n case \"finish\":\n finishData = event.data;\n break;\n case \"error\":\n streamError = event.error;\n break;\n // text-delta, object-delta: source task handles accumulation\n }\n }\n } finally {\n reader.releaseLock();\n this.stream = undefined;\n }\n\n if (streamError) {\n this.error = streamError as TaskError;\n this.setStatus(TaskStatus.FAILED);\n throw streamError;\n }\n\n // Priority: snapshot > finish.\n // The source task enriches the finish event with accumulated text when\n // shouldAccumulate=true, so finishData carries complete port data.\n if (lastSnapshotData !== undefined) {\n this.setPortData(lastSnapshotData);\n } else if (finishData !== undefined) {\n this.setPortData(finishData);\n }\n }\n\n public reset() {\n this.status = TaskStatus.PENDING;\n this.error = undefined;\n this.value = undefined;\n this.stream = undefined;\n this.emit(\"reset\");\n this.emit(\"status\", this.status);\n }\n\n public setStatus(status: TaskStatus) {\n if (status === this.status) return;\n this.status = status;\n switch (status) {\n case TaskStatus.PROCESSING:\n this.emit(\"start\");\n break;\n case TaskStatus.STREAMING:\n this.emit(\"streaming\");\n break;\n case TaskStatus.COMPLETED:\n this.emit(\"complete\");\n break;\n case TaskStatus.ABORTING:\n this.emit(\"abort\");\n break;\n case TaskStatus.PENDING:\n this.emit(\"reset\");\n break;\n case TaskStatus.FAILED:\n this.emit(\"error\", this.error!);\n break;\n case TaskStatus.DISABLED:\n this.emit(\"disabled\");\n break;\n }\n this.emit(\"status\", this.status);\n }\n\n setPortData(entireDataBlock: any) {\n if (this.sourceTaskPortId === DATAFLOW_ALL_PORTS) {\n this.value = entireDataBlock;\n } else if (this.sourceTaskPortId === DATAFLOW_ERROR_PORT) {\n this.error = entireDataBlock;\n } else {\n this.value = entireDataBlock[this.sourceTaskPortId];\n }\n }\n\n getPortData(): TaskOutput {\n let result: TaskOutput;\n if (this.targetTaskPortId === DATAFLOW_ALL_PORTS) {\n result = this.value;\n } else if (this.targetTaskPortId === DATAFLOW_ERROR_PORT) {\n result = { [DATAFLOW_ERROR_PORT]: this.error };\n } else {\n result = { [this.targetTaskPortId]: this.value };\n }\n return result;\n }\n\n toJSON(): DataflowJson {\n return {\n sourceTaskId: this.sourceTaskId,\n sourceTaskPortId: this.sourceTaskPortId,\n targetTaskId: this.targetTaskId,\n targetTaskPortId: this.targetTaskPortId,\n };\n }\n\n semanticallyCompatible(\n graph: TaskGraph,\n dataflow: Dataflow\n ): \"static\" | \"runtime\" | \"incompatible\" {\n // TODO(str): this is inefficient\n const targetSchema = graph.getTask(dataflow.targetTaskId)!.inputSchema();\n const sourceSchema = graph.getTask(dataflow.sourceTaskId)!.outputSchema();\n\n if (typeof targetSchema === \"boolean\") {\n if (targetSchema === false) {\n return \"incompatible\";\n }\n return \"static\";\n }\n if (typeof sourceSchema === \"boolean\") {\n if (sourceSchema === false) {\n return \"incompatible\";\n }\n return \"runtime\";\n }\n\n let targetSchemaProperty =\n DATAFLOW_ALL_PORTS === dataflow.targetTaskPortId\n ? true // Accepts any schema (equivalent to Type.Any())\n : (targetSchema.properties as any)?.[dataflow.targetTaskPortId];\n // If the specific property doesn't exist but additionalProperties is true,\n // treat it as accepting any schema\n if (targetSchemaProperty === undefined && targetSchema.additionalProperties === true) {\n targetSchemaProperty = true;\n }\n let sourceSchemaProperty =\n DATAFLOW_ALL_PORTS === dataflow.sourceTaskPortId\n ? true // Accepts any schema (equivalent to Type.Any())\n : (sourceSchema.properties as any)?.[dataflow.sourceTaskPortId];\n // If the specific property doesn't exist but additionalProperties is true,\n // treat it as outputting any schema\n if (sourceSchemaProperty === undefined && sourceSchema.additionalProperties === true) {\n sourceSchemaProperty = true;\n }\n\n const semanticallyCompatible = areSemanticallyCompatible(\n sourceSchemaProperty,\n targetSchemaProperty\n );\n\n return semanticallyCompatible;\n }\n\n // ========================================================================\n // Event handling methods\n // ========================================================================\n\n /**\n * Event emitter for dataflow events\n */\n public get events(): EventEmitter<DataflowEventListeners> {\n if (!this._events) {\n this._events = new EventEmitter<DataflowEventListeners>();\n }\n return this._events;\n }\n protected _events: EventEmitter<DataflowEventListeners> | undefined;\n\n public subscribe<Event extends DataflowEvents>(\n name: Event,\n fn: DataflowEventListener<Event>\n ): () => void {\n return this.events.subscribe(name, fn);\n }\n\n /**\n * Registers an event listener\n */\n public on<Event extends DataflowEvents>(name: Event, fn: DataflowEventListener<Event>): void {\n this.events.on(name, fn);\n }\n\n /**\n * Removes an event listener\n */\n public off<Event extends DataflowEvents>(name: Event, fn: DataflowEventListener<Event>): void {\n this.events.off(name, fn);\n }\n\n /**\n * Registers a one-time event listener\n */\n public once<Event extends DataflowEvents>(name: Event, fn: DataflowEventListener<Event>): void {\n this.events.once(name, fn);\n }\n\n /**\n * Returns a promise that resolves when the specified event is emitted\n */\n public waitOn<Event extends DataflowEvents>(\n name: Event\n ): Promise<DataflowEventParameters<Event>> {\n return this.events.waitOn(name) as Promise<DataflowEventParameters<Event>>;\n }\n\n /**\n * Emits an event\n */\n public emit<Event extends DataflowEvents>(\n name: Event,\n ...args: DataflowEventParameters<Event>\n ): void {\n this._events?.emit(name, ...args);\n }\n}\n\n/**\n * Represents a data flow between two tasks, indicating how one task's output is used as input for another task\n *\n * This is a helper class that parses a data flow id string into a Dataflow object\n *\n * @param dataflow - The data flow string, e.g. \"sourceTaskId[sourceTaskPortId] ==> targetTaskId[targetTaskPortId]\"\n */\nexport class DataflowArrow extends Dataflow {\n constructor(dataflow: DataflowIdType) {\n // Parse the dataflow string using regex\n const pattern =\n /^([a-zA-Z0-9-]+?)\\[([a-zA-Z0-9-]+?)\\] ==> ([a-zA-Z0-9-]+?)\\[([a-zA-Z0-9-]+?)\\]$/;\n const match = dataflow.match(pattern);\n\n if (!match) {\n throw new Error(`Invalid dataflow format: ${dataflow}`);\n }\n\n const [, sourceTaskId, sourceTaskPortId, targetTaskId, targetTaskPortId] = match;\n super(sourceTaskId, sourceTaskPortId, targetTaskId, targetTaskPortId);\n }\n}\n",
|
|
7
7
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { uuid4, type DataPortSchema } from \"@workglow/util\";\nimport { DATAFLOW_ALL_PORTS } from \"./Dataflow\";\nimport type { TaskGraph } from \"./TaskGraph\";\nimport type { TaskIdType } from \"../task/TaskTypes\";\nimport type {\n DataflowJson,\n JsonTaskItem,\n TaskGraphItemJson,\n TaskGraphJson,\n} from \"../task/TaskJSON\";\n\nexport interface GraphSchemaOptions {\n /**\n * When true, annotate each property with `x-source-task-id` or `x-source-task-ids`\n * to identify which task(s) the property originates from.\n */\n readonly trackOrigins?: boolean;\n}\n\n/**\n * Calculates the depth (longest path from any starting node) for each task in the graph.\n * @returns A map of task IDs to their depths\n */\nexport function calculateNodeDepths(graph: TaskGraph): Map<TaskIdType, number> {\n const depths = new Map<TaskIdType, number>();\n const tasks = graph.getTasks();\n\n // Initialize all depths to 0\n for (const task of tasks) {\n depths.set(task.id, 0);\n }\n\n // Use topological sort to calculate depths in order\n const sortedTasks = graph.topologicallySortedNodes();\n\n for (const task of sortedTasks) {\n const currentDepth = depths.get(task.id) || 0;\n const targetTasks = graph.getTargetTasks(task.id);\n\n // Update depths of all target tasks\n for (const targetTask of targetTasks) {\n const targetDepth = depths.get(targetTask.id) || 0;\n depths.set(targetTask.id, Math.max(targetDepth, currentDepth + 1));\n }\n }\n\n return depths;\n}\n\n/**\n * Computes the input schema for a graph by examining root tasks (no incoming edges)\n * and non-root tasks with unsatisfied required inputs.\n *\n * When `options.trackOrigins` is true, each property is annotated with\n * `x-source-task-id` (single origin) or `x-source-task-ids` (multiple origins).\n */\nexport function computeGraphInputSchema(\n graph: TaskGraph,\n options?: GraphSchemaOptions\n): DataPortSchema {\n const trackOrigins = options?.trackOrigins ?? false;\n const properties: Record<string, any> = {};\n const required: string[] = [];\n // Track which task IDs contribute each property name\n const propertyOrigins: Record<string, TaskIdType[]> = {};\n\n // Get all tasks in the graph\n const tasks = graph.getTasks();\n\n // Identify starting nodes: tasks with no incoming dataflows\n const startingNodes = tasks.filter((task) => graph.getSourceDataflows(task.id).length === 0);\n\n // Collect all properties from root tasks\n for (const task of startingNodes) {\n const taskInputSchema = task.inputSchema();\n if (typeof taskInputSchema === \"boolean\") {\n if (taskInputSchema === false) {\n continue;\n }\n if (taskInputSchema === true) {\n properties[DATAFLOW_ALL_PORTS] = {};\n continue;\n }\n }\n const taskProperties = taskInputSchema.properties || {};\n\n for (const [inputName, inputProp] of Object.entries(taskProperties)) {\n if (!properties[inputName]) {\n properties[inputName] = inputProp;\n\n if (taskInputSchema.required && taskInputSchema.required.includes(inputName)) {\n required.push(inputName);\n }\n\n if (trackOrigins) {\n propertyOrigins[inputName] = [task.id];\n }\n } else if (trackOrigins) {\n propertyOrigins[inputName].push(task.id);\n }\n }\n }\n\n // For non-root tasks, collect only REQUIRED properties not satisfied by dataflows.\n const sourceIds = new Set(startingNodes.map((t) => t.id));\n for (const task of tasks) {\n if (sourceIds.has(task.id)) continue;\n\n const taskInputSchema = task.inputSchema();\n if (typeof taskInputSchema === \"boolean\") continue;\n\n const requiredKeys = new Set<string>((taskInputSchema.required as string[] | undefined) || []);\n if (requiredKeys.size === 0) continue;\n\n const connectedPorts = new Set(\n graph.getSourceDataflows(task.id).map((df) => df.targetTaskPortId)\n );\n\n for (const key of requiredKeys) {\n if (connectedPorts.has(key)) continue;\n if (properties[key]) {\n // Property already collected — track additional origin\n if (trackOrigins) {\n propertyOrigins[key].push(task.id);\n }\n continue;\n }\n\n // Skip if the task already has a default value for this property\n if (task.defaults && task.defaults[key] !== undefined) continue;\n\n const prop = (taskInputSchema.properties || {})[key];\n if (!prop || typeof prop === \"boolean\") continue;\n\n properties[key] = prop;\n if (!required.includes(key)) {\n required.push(key);\n }\n\n if (trackOrigins) {\n propertyOrigins[key] = [task.id];\n }\n }\n }\n\n // Apply origin annotations\n if (trackOrigins) {\n for (const [propName, origins] of Object.entries(propertyOrigins)) {\n const prop = properties[propName];\n if (!prop || typeof prop === \"boolean\") continue;\n if (origins.length === 1) {\n properties[propName] = { ...prop, \"x-source-task-id\": origins[0] };\n } else {\n properties[propName] = { ...prop, \"x-source-task-ids\": origins };\n }\n }\n }\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n } as const satisfies DataPortSchema;\n}\n\n/**\n * Computes the output schema for a graph by examining leaf tasks (no outgoing edges)\n * at the maximum depth level.\n *\n * When `options.trackOrigins` is true, each property is annotated with\n * `x-source-task-id` (single origin) or `x-source-task-ids` (multiple origins).\n */\nexport function computeGraphOutputSchema(\n graph: TaskGraph,\n options?: GraphSchemaOptions\n): DataPortSchema {\n const trackOrigins = options?.trackOrigins ?? false;\n const properties: Record<string, any> = {};\n const required: string[] = [];\n // Track which task IDs contribute each property name\n const propertyOrigins: Record<string, TaskIdType[]> = {};\n\n // Find all ending nodes (nodes with no outgoing dataflows)\n const tasks = graph.getTasks();\n const endingNodes = tasks.filter((task) => graph.getTargetDataflows(task.id).length === 0);\n\n // Calculate depths for all nodes\n const depths = calculateNodeDepths(graph);\n\n // Find the maximum depth among ending nodes\n const maxDepth = Math.max(...endingNodes.map((task) => depths.get(task.id) || 0));\n\n // Filter ending nodes to only those at the maximum depth (last level)\n const lastLevelNodes = endingNodes.filter((task) => depths.get(task.id) === maxDepth);\n\n // Count how many ending nodes produce each property\n const propertyCount: Record<string, number> = {};\n const propertySchema: Record<string, any> = {};\n\n for (const task of lastLevelNodes) {\n const taskOutputSchema = task.outputSchema();\n if (typeof taskOutputSchema === \"boolean\") {\n if (taskOutputSchema === false) {\n continue;\n }\n if (taskOutputSchema === true) {\n properties[DATAFLOW_ALL_PORTS] = {};\n continue;\n }\n }\n const taskProperties = taskOutputSchema.properties || {};\n\n for (const [outputName, outputProp] of Object.entries(taskProperties)) {\n propertyCount[outputName] = (propertyCount[outputName] || 0) + 1;\n if (!propertySchema[outputName]) {\n propertySchema[outputName] = outputProp;\n }\n if (trackOrigins) {\n if (!propertyOrigins[outputName]) {\n propertyOrigins[outputName] = [task.id];\n } else {\n propertyOrigins[outputName].push(task.id);\n }\n }\n }\n }\n\n // Build the final schema: properties produced by multiple nodes become arrays\n for (const [outputName] of Object.entries(propertyCount)) {\n const outputProp = propertySchema[outputName];\n\n if (lastLevelNodes.length === 1) {\n properties[outputName] = outputProp;\n } else {\n properties[outputName] = {\n type: \"array\",\n items: outputProp as any,\n };\n }\n }\n\n // Apply origin annotations\n if (trackOrigins) {\n for (const [propName, origins] of Object.entries(propertyOrigins)) {\n const prop = properties[propName];\n if (!prop || typeof prop === \"boolean\") continue;\n if (origins.length === 1) {\n properties[propName] = { ...prop, \"x-source-task-id\": origins[0] };\n } else {\n properties[propName] = { ...prop, \"x-source-task-ids\": origins };\n }\n }\n }\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n } as DataPortSchema;\n}\n\n// ========================================================================\n// Boundary Node Injection\n// ========================================================================\n\n/**\n * Strips `x-source-task-id` and `x-source-task-ids` annotations from schema properties.\n */\nfunction stripOriginAnnotations(schema: DataPortSchema): DataPortSchema {\n if (typeof schema === \"boolean\" || !schema || typeof schema !== \"object\") return schema;\n const properties = schema.properties;\n if (!properties) return schema;\n\n const strippedProperties: Record<string, any> = {};\n for (const [key, prop] of Object.entries(properties)) {\n if (!prop || typeof prop !== \"object\") {\n strippedProperties[key] = prop;\n continue;\n }\n const {\n \"x-source-task-id\": _id,\n \"x-source-task-ids\": _ids,\n ...rest\n } = prop as Record<string, any>;\n strippedProperties[key] = rest;\n }\n\n return { ...schema, properties: strippedProperties } as DataPortSchema;\n}\n\n/**\n * Extracts origin task IDs from a schema property's `x-source-task-id` or `x-source-task-ids`.\n */\nfunction getOriginTaskIds(prop: Record<string, any>): TaskIdType[] {\n if (prop[\"x-source-task-ids\"]) {\n return prop[\"x-source-task-ids\"] as TaskIdType[];\n }\n if (prop[\"x-source-task-id\"] !== undefined) {\n return [prop[\"x-source-task-id\"] as TaskIdType];\n }\n return [];\n}\n\n/**\n * Adds synthetic InputTask and OutputTask boundary nodes to a TaskGraphJson.\n * The boundary nodes represent the graph's external interface.\n *\n * InputTask is placed first in the tasks array, OutputTask last.\n * Per-property dataflows connect them to the origin tasks using origin tracking annotations.\n */\nexport function addBoundaryNodesToGraphJson(json: TaskGraphJson, graph: TaskGraph): TaskGraphJson {\n const hasInputTask = json.tasks.some((t) => t.type === \"InputTask\");\n const hasOutputTask = json.tasks.some((t) => t.type === \"OutputTask\");\n\n // Skip entirely if both boundary tasks already exist\n if (hasInputTask && hasOutputTask) {\n return json;\n }\n\n const inputSchema = !hasInputTask\n ? computeGraphInputSchema(graph, { trackOrigins: true })\n : undefined;\n const outputSchema = !hasOutputTask\n ? computeGraphOutputSchema(graph, { trackOrigins: true })\n : undefined;\n\n const prependTasks: TaskGraphItemJson[] = [];\n const appendTasks: TaskGraphItemJson[] = [];\n const inputDataflows: DataflowJson[] = [];\n const outputDataflows: DataflowJson[] = [];\n\n if (!hasInputTask && inputSchema) {\n const inputTaskId = uuid4();\n const strippedInputSchema = stripOriginAnnotations(inputSchema);\n\n prependTasks.push({\n id: inputTaskId,\n type: \"InputTask\",\n config: {\n inputSchema: strippedInputSchema,\n outputSchema: strippedInputSchema,\n },\n });\n\n // Create per-property dataflows from InputTask to origin tasks\n if (typeof inputSchema !== \"boolean\" && inputSchema.properties) {\n for (const [propName, prop] of Object.entries(inputSchema.properties)) {\n if (!prop || typeof prop === \"boolean\") continue;\n const origins = getOriginTaskIds(prop as Record<string, any>);\n for (const originId of origins) {\n inputDataflows.push({\n sourceTaskId: inputTaskId,\n sourceTaskPortId: propName,\n targetTaskId: originId,\n targetTaskPortId: propName,\n });\n }\n }\n }\n }\n\n if (!hasOutputTask && outputSchema) {\n const outputTaskId = uuid4();\n const strippedOutputSchema = stripOriginAnnotations(outputSchema);\n\n appendTasks.push({\n id: outputTaskId,\n type: \"OutputTask\",\n config: {\n inputSchema: strippedOutputSchema,\n outputSchema: strippedOutputSchema,\n },\n });\n\n // Create per-property dataflows from origin tasks to OutputTask\n if (typeof outputSchema !== \"boolean\" && outputSchema.properties) {\n for (const [propName, prop] of Object.entries(outputSchema.properties)) {\n if (!prop || typeof prop === \"boolean\") continue;\n const origins = getOriginTaskIds(prop as Record<string, any>);\n for (const originId of origins) {\n outputDataflows.push({\n sourceTaskId: originId,\n sourceTaskPortId: propName,\n targetTaskId: outputTaskId,\n targetTaskPortId: propName,\n });\n }\n }\n }\n }\n\n return {\n tasks: [...prependTasks, ...json.tasks, ...appendTasks],\n dataflows: [...inputDataflows, ...json.dataflows, ...outputDataflows],\n };\n}\n\n/**\n * Adds synthetic InputTask and OutputTask boundary nodes to a dependency JSON items array.\n * Per-property dependencies connect them to the origin tasks using origin tracking annotations.\n */\nexport function addBoundaryNodesToDependencyJson(\n items: JsonTaskItem[],\n graph: TaskGraph\n): JsonTaskItem[] {\n const hasInputTask = items.some((t) => t.type === \"InputTask\");\n const hasOutputTask = items.some((t) => t.type === \"OutputTask\");\n\n // Skip entirely if both boundary tasks already exist\n if (hasInputTask && hasOutputTask) {\n return items;\n }\n\n const prependItems: JsonTaskItem[] = [];\n const appendItems: JsonTaskItem[] = [];\n\n if (!hasInputTask) {\n const inputSchema = computeGraphInputSchema(graph, { trackOrigins: true });\n const inputTaskId = uuid4();\n const strippedInputSchema = stripOriginAnnotations(inputSchema);\n\n prependItems.push({\n id: inputTaskId,\n type: \"InputTask\",\n config: {\n inputSchema: strippedInputSchema,\n outputSchema: strippedInputSchema,\n },\n });\n\n // Build dependencies for items that receive data from InputTask\n if (typeof inputSchema !== \"boolean\" && inputSchema.properties) {\n for (const [propName, prop] of Object.entries(inputSchema.properties)) {\n if (!prop || typeof prop === \"boolean\") continue;\n const origins = getOriginTaskIds(prop as Record<string, any>);\n for (const originId of origins) {\n const targetItem = items.find((item) => item.id === originId);\n if (!targetItem) continue;\n if (!targetItem.dependencies) {\n targetItem.dependencies = {};\n }\n const existing = targetItem.dependencies[propName];\n const dep = { id: inputTaskId, output: propName };\n if (!existing) {\n targetItem.dependencies[propName] = dep;\n } else if (Array.isArray(existing)) {\n existing.push(dep);\n } else {\n targetItem.dependencies[propName] = [existing, dep];\n }\n }\n }\n }\n }\n\n if (!hasOutputTask) {\n const outputSchema = computeGraphOutputSchema(graph, { trackOrigins: true });\n const outputTaskId = uuid4();\n const strippedOutputSchema = stripOriginAnnotations(outputSchema);\n\n // Build dependencies for OutputTask from origin tasks\n const outputDependencies: JsonTaskItem[\"dependencies\"] = {};\n if (typeof outputSchema !== \"boolean\" && outputSchema.properties) {\n for (const [propName, prop] of Object.entries(outputSchema.properties)) {\n if (!prop || typeof prop === \"boolean\") continue;\n const origins = getOriginTaskIds(prop as Record<string, any>);\n if (origins.length === 1) {\n outputDependencies[propName] = { id: origins[0], output: propName };\n } else if (origins.length > 1) {\n outputDependencies[propName] = origins.map((id) => ({ id, output: propName }));\n }\n }\n }\n\n appendItems.push({\n id: outputTaskId,\n type: \"OutputTask\",\n config: {\n inputSchema: strippedOutputSchema,\n outputSchema: strippedOutputSchema,\n },\n ...(Object.keys(outputDependencies).length > 0 ? { dependencies: outputDependencies } : {}),\n });\n }\n\n return [...prependItems, ...items, ...appendItems];\n}\n",
|
|
8
8
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { JobError } from \"@workglow/job-queue\";\nimport { BaseError } from \"@workglow/util\";\n\nexport class TaskError extends BaseError {\n static readonly type: string = \"TaskError\";\n constructor(message: string) {\n super(message);\n }\n}\n\n/**\n * A task configuration error\n *\n */\nexport class TaskConfigurationError extends TaskError {\n static readonly type: string = \"TaskConfigurationError\";\n constructor(message: string) {\n super(message);\n }\n}\n\n/**\n * A task workflow error\n */\nexport class WorkflowError extends TaskError {\n static readonly type: string = \"WorkflowError\";\n constructor(message: string) {\n super(message);\n }\n}\n\n/**\n * A task error that is caused by a task being aborted\n *\n * Examples: task.abort() was called, or some other reason an abort signal was received\n */\nexport class TaskAbortedError extends TaskError {\n static readonly type: string = \"TaskAbortedError\";\n constructor(message: string = \"Task aborted\") {\n super(message);\n }\n}\n\n/**\n * A task error that is caused by a task exceeding its timeout\n *\n * Examples: task.runConfig.timeout exceeded during execution\n */\nexport class TaskTimeoutError extends TaskAbortedError {\n static readonly type: string = \"TaskTimeoutError\";\n constructor(timeoutMs?: number) {\n super(timeoutMs ? `Task timed out after ${timeoutMs}ms` : \"Task timed out\");\n }\n}\n\n/**\n * A task error that is caused by a task failing\n *\n * Examples: task.run() threw an error\n */\nexport class TaskFailedError extends TaskError {\n static readonly type: string = \"TaskFailedError\";\n constructor(message: string = \"Task failed\") {\n super(message);\n }\n}\n\nexport class JobTaskFailedError extends TaskFailedError {\n static readonly type: string = \"JobTaskFailedError\";\n public jobError: JobError;\n constructor(err: JobError) {\n super(String(err));\n this.jobError = err;\n }\n}\n\n/**\n * A task error that is caused by an error converting JSON to a Task\n */\nexport class TaskJSONError extends TaskError {\n static readonly type: string = \"TaskJSONError\";\n constructor(message: string = \"Error converting JSON to a Task\") {\n super(message);\n }\n}\n\n/**\n * A task error that is caused by invalid input data\n *\n * Examples: task.run() received invalid input data\n */\nexport class TaskInvalidInputError extends TaskError {\n static readonly type: string = \"TaskInvalidInputError\";\n constructor(message: string = \"Invalid input data\") {\n super(message);\n }\n}\n",
|
|
9
9
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { createServiceToken, EventEmitter, EventParameters } from \"@workglow/util\";\nimport { TaskInput, TaskOutput } from \"../task/TaskTypes\";\n\n/**\n * Service token for TaskOutputRepository\n */\nexport const TASK_OUTPUT_REPOSITORY = createServiceToken<TaskOutputRepository>(\n \"taskgraph.taskOutputRepository\"\n);\n\nexport type TaskOutputEventListeners = {\n output_saved: (taskType: string) => void;\n output_retrieved: (taskType: string) => void;\n output_cleared: () => void;\n output_pruned: () => void;\n};\n\nexport type TaskOutputEvents = keyof TaskOutputEventListeners;\n\nexport type TaskOutputEventListener<Event extends TaskOutputEvents> =\n TaskOutputEventListeners[Event];\n\nexport type TaskOutputEventParameters<Event extends TaskOutputEvents> = EventParameters<\n TaskOutputEventListeners,\n Event\n>;\n\n/**\n * Abstract class for managing task outputs in a repository\n * Provides methods for saving, retrieving, and clearing task outputs\n */\nexport abstract class TaskOutputRepository {\n /**\n * Whether to compress the output\n */\n outputCompression: boolean;\n\n /**\n * Constructor for the TaskOutputRepository\n * @param options The options for the repository\n */\n constructor({ outputCompression = true }) {\n this.outputCompression = outputCompression;\n }\n\n private get events() {\n if (!this._events) {\n this._events = new EventEmitter<TaskOutputEventListeners>();\n }\n return this._events;\n }\n private _events: EventEmitter<TaskOutputEventListeners> | undefined;\n\n /**\n * Registers an event listener for a specific event\n * @param name The event name to listen for\n * @param fn The callback function to execute when the event occurs\n */\n on<Event extends TaskOutputEvents>(name: Event, fn: TaskOutputEventListener<Event>) {\n this.events.on(name, fn);\n }\n\n /**\n * Removes an event listener for a specific event\n * @param name The event name to stop listening for\n * @param fn The callback function to remove\n */\n off<Event extends TaskOutputEvents>(name: Event, fn: TaskOutputEventListener<Event>) {\n this.events.off(name, fn);\n }\n\n /**\n * Returns a promise that resolves when the event is emitted\n * @param name The event name to listen for\n * @returns a promise that resolves to the event parameters\n */\n waitOn<Event extends TaskOutputEvents>(name: Event) {\n return this.events.waitOn(name) as Promise<TaskOutputEventParameters<Event>>;\n }\n\n /**\n * Emits an event (if there are listeners)\n * @param name The event name to emit\n * @param args The event parameters\n */\n emit<Event extends TaskOutputEvents>(name: Event, ...args: TaskOutputEventParameters<Event>) {\n this._events?.emit(name, ...args);\n }\n\n /**\n * Saves a task output to the repository\n * @param taskType The type of task to save the output for\n * @param inputs The input parameters for the task\n * @param output The task output to save\n */\n abstract saveOutput(\n taskType: string,\n inputs: TaskInput,\n output: TaskOutput,\n createdAt?: Date // for testing purposes\n ): Promise<void>;\n\n /**\n * Retrieves a task output from the repository\n * @param taskType The type of task to retrieve the output for\n * @param inputs The input parameters for the task\n * @returns The retrieved task output, or undefined if not found\n */\n abstract getOutput(taskType: string, inputs: TaskInput): Promise<TaskOutput | undefined>;\n\n /**\n * Clears all task outputs from the repository\n * @emits output_cleared when the operation completes\n */\n abstract clear(): Promise<void>;\n\n /**\n * Returns the number of task outputs stored in the repository\n * @returns The count of stored task outputs\n */\n abstract size(): Promise<number>;\n\n /**\n * Clear all task outputs from the repository that are older than the given date\n * @param olderThanInMs The time in milliseconds to clear task outputs older than\n */\n abstract clearOlderThan(olderThanInMs: number): Promise<void>;\n}\n",
|
|
10
10
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { DataPortSchema, ServiceRegistry } from \"@workglow/util\";\nimport { getInputResolvers } from \"@workglow/util\";\n\n/**\n * Configuration for the input resolver\n */\nexport interface InputResolverConfig {\n readonly registry: ServiceRegistry;\n}\n\n/**\n * Extracts the format string from a schema, handling oneOf/anyOf wrappers.\n */\nfunction getSchemaFormat(schema: unknown): string | undefined {\n if (typeof schema !== \"object\" || schema === null) return undefined;\n\n const s = schema as Record<string, unknown>;\n\n // Direct format\n if (typeof s.format === \"string\") return s.format;\n\n // Check oneOf/anyOf for format\n const variants = (s.oneOf ?? s.anyOf) as unknown[] | undefined;\n if (Array.isArray(variants)) {\n for (const variant of variants) {\n if (typeof variant === \"object\" && variant !== null) {\n const v = variant as Record<string, unknown>;\n if (typeof v.format === \"string\") return v.format;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Extracts the object-typed schema from a property schema, handling oneOf/anyOf wrappers.\n * This is needed for patterns like `oneOf: [{ type: \"string\" }, { type: \"object\", properties: {...} }]`\n * where the model can be either a string ID or an inline config object.\n */\nfunction getObjectSchema(\n schema: unknown\n): (Record<string, unknown> & { properties: Record<string, unknown> }) | undefined {\n if (typeof schema !== \"object\" || schema === null) return undefined;\n\n const s = schema as Record<string, unknown>;\n\n // Direct object schema with properties\n if (s.type === \"object\" && s.properties && typeof s.properties === \"object\") {\n return s as Record<string, unknown> & { properties: Record<string, unknown> };\n }\n\n // Check oneOf/anyOf for object variant\n const variants = (s.oneOf ?? s.anyOf) as unknown[] | undefined;\n if (Array.isArray(variants)) {\n for (const variant of variants) {\n if (typeof variant === \"object\" && variant !== null) {\n const v = variant as Record<string, unknown>;\n if (v.type === \"object\" && v.properties && typeof v.properties === \"object\") {\n return v as Record<string, unknown> & { properties: Record<string, unknown> };\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Gets the format prefix from a format string.\n * For \"model:TextEmbedding\" returns \"model\"\n * For \"storage:tabular\" returns \"storage\"\n */\nfunction getFormatPrefix(format: string): string {\n const colonIndex = format.indexOf(\":\");\n return colonIndex >= 0 ? format.substring(0, colonIndex) : format;\n}\n\n/**\n * Resolves schema-annotated inputs by looking up string IDs from registries.\n * String values with matching format annotations are resolved to their instances.\n * Non-string values (objects/instances) are passed through unchanged.\n *\n * @param input The task input object\n * @param schema The task's input schema\n * @param config Configuration including the service registry\n * @returns The input with resolved values\n *\n * @example\n * ```typescript\n * // In TaskRunner.run()\n * const resolvedInput = await resolveSchemaInputs(\n * this.task.runInputData,\n * (this.task.constructor as typeof Task).inputSchema(),\n * { registry: this.registry }\n * );\n * ```\n */\nexport async function resolveSchemaInputs<T extends Record<string, unknown>>(\n input: T,\n schema: DataPortSchema,\n config: InputResolverConfig\n): Promise<T> {\n if (typeof schema === \"boolean\") return input;\n\n const properties = schema.properties;\n if (!properties || typeof properties !== \"object\") return input;\n\n const resolvers = getInputResolvers();\n const resolved: Record<string, unknown> = { ...input };\n\n for (const [key, propSchema] of Object.entries(properties)) {\n let value = resolved[key];\n\n // Phase 1: Resolve format-annotated string values\n const format = getSchemaFormat(propSchema);\n if (format) {\n // Try full format first (e.g., \"dataset:document-chunk\"), then fall back to prefix (e.g., \"dataset\")\n let resolver = resolvers.get(format);\n if (!resolver) {\n const prefix = getFormatPrefix(format);\n resolver = resolvers.get(prefix);\n }\n\n if (resolver) {\n // Handle string values\n if (typeof value === \"string\") {\n value = await resolver(value, format, config.registry);\n resolved[key] = value;\n }\n // Handle arrays - resolve string elements and pass through non-string elements unchanged\n else if (Array.isArray(value) && value.some((item) => typeof item === \"string\")) {\n const results = await Promise.all(\n value.map((item) =>\n typeof item === \"string\" ? resolver(item, format, config.registry) : item\n )\n );\n value = results.filter((result) => result !== undefined);\n resolved[key] = value;\n }\n }\n }\n\n // Phase 2: Recurse into object values if the schema defines nested properties\n if (\n value !== null &&\n value !== undefined &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n const objectSchema = getObjectSchema(propSchema);\n if (objectSchema) {\n resolved[key] = await resolveSchemaInputs(\n value as Record<string, unknown>,\n objectSchema as DataPortSchema,\n config\n );\n }\n }\n }\n\n return resolved as T;\n}\n",
|
|
11
11
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { DataPortSchema, JsonSchema } from \"@workglow/util\";\n\n/**\n * Stream mode determines how a task's streaming output is interpreted:\n * - `none`: No streaming (default). `execute()` returns `Promise<Output>`.\n * - `append`: Each chunk is a delta (e.g., a new token).\n * - `replace`: Each chunk is a corrected/revised snapshot of the complete output so far.\n * - `object`: Each chunk is a progressively more complete partial object snapshot.\n * - `mixed`: Multiple ports use different stream modes (e.g., append + object).\n *\n * Declared per-port via the `x-stream` schema extension property.\n * Absent `x-stream` = `\"none\"`.\n */\nexport type StreamMode = \"none\" | \"append\" | \"replace\" | \"object\" | \"mixed\";\n\n/**\n * Append mode: delta chunk (consumer accumulates).\n * `port` identifies which output port this delta belongs to.\n */\nexport type StreamTextDelta = {\n type: \"text-delta\";\n port: string;\n textDelta: string;\n};\n\n/**\n * Object delta for structured/object streaming.\n * `port` identifies which output port this delta belongs to.\n * Each `objectDelta` is a progressively more complete partial object snapshot.\n * Consumers should replace (not merge) their state with the latest delta.\n */\nexport type StreamObjectDelta = {\n type: \"object-delta\";\n port: string;\n objectDelta: Record<string, unknown> | unknown[];\n};\n\n/**\n * Replace mode: full snapshot chunk (replaces previous state).\n */\nexport type StreamSnapshot<Output = Record<string, any>> = {\n type: \"snapshot\";\n data: Output;\n};\n\n/**\n * Signals that the stream has finished. In append mode, the runner\n * accumulates text-delta chunks into the append port (determined by\n * the output schema's `x-stream: \"append\"` annotation); `data` may\n * carry additional fields (merged into the final output).\n * In replace mode, `data` contains the final output.\n */\nexport type StreamFinish<Output = Record<string, any>> = {\n type: \"finish\";\n data: Output;\n};\n\n/**\n * Signals that the stream encountered an error.\n */\nexport type StreamError = {\n type: \"error\";\n error: Error;\n};\n\n/**\n * Discriminated union of all stream event types.\n * Used as the element type for `AsyncIterable<StreamEvent>` streams\n * flowing through the DAG.\n */\nexport type StreamEvent<Output = Record<string, any>> =\n | StreamTextDelta\n | StreamObjectDelta\n | StreamSnapshot<Output>\n | StreamFinish<Output>\n | StreamError;\n\n// ========================================================================\n// Port-level stream helpers\n// ========================================================================\n\n/**\n * Reads the `x-stream` value from a specific port property in a DataPortSchema.\n * Returns `\"none\"` when the property or the `x-stream` annotation is absent.\n *\n * @param schema - The task's input or output DataPortSchema\n * @param portId - The property name (port ID) to inspect\n * @returns The StreamMode declared on that port\n */\nexport function getPortStreamMode(schema: DataPortSchema | JsonSchema, portId: string): StreamMode {\n if (typeof schema === \"boolean\") return \"none\";\n const prop = (schema.properties as Record<string, any>)?.[portId];\n if (!prop || typeof prop === \"boolean\") return \"none\";\n const xStream = prop[\"x-stream\"];\n if (xStream === \"append\" || xStream === \"replace\" || xStream === \"object\") return xStream;\n return \"none\";\n}\n\n/**\n * Returns all ports that declare an `x-stream` annotation, along with their mode.\n *\n * @param schema - The task's output (or input) DataPortSchema\n * @returns Array of `{ port, mode }` for every annotated port\n */\nexport function getStreamingPorts(\n schema: DataPortSchema\n): Array<{ port: string; mode: StreamMode }> {\n if (typeof schema === \"boolean\") return [];\n const props = schema.properties;\n if (!props) return [];\n\n const result: Array<{ port: string; mode: StreamMode }> = [];\n for (const [name, prop] of Object.entries(props)) {\n if (!prop || typeof prop === \"boolean\") continue;\n const xStream = (prop as any)[\"x-stream\"];\n if (xStream === \"append\" || xStream === \"replace\" || xStream === \"object\") {\n result.push({ port: name, mode: xStream });\n }\n }\n return result;\n}\n\n/**\n * Returns the dominant output stream mode for a task by inspecting its output schema.\n * Returns `\"mixed\"` when ports use different modes (e.g., append + object).\n * Returns `\"none\"` if no output port declares streaming.\n */\nexport function getOutputStreamMode(outputSchema: DataPortSchema): StreamMode {\n const ports = getStreamingPorts(outputSchema);\n if (ports.length === 0) return \"none\";\n\n const mode = ports[0].mode;\n for (let i = 1; i < ports.length; i++) {\n if (ports[i].mode !== mode) {\n return \"mixed\";\n }\n }\n return mode;\n}\n\n/**\n * Determines whether a task supports streaming by checking if any output port\n * has an `x-stream` annotation AND the task implements `executeStream()`.\n *\n * @param task - The task to inspect (must have `outputSchema()` and optionally `executeStream`)\n * @returns true if the task can produce streaming output\n */\nexport function isTaskStreamable(task: {\n outputSchema(): DataPortSchema;\n executeStream?: (...args: any[]) => any;\n}): boolean {\n if (typeof task.executeStream !== \"function\") return false;\n return getOutputStreamMode(task.outputSchema()) !== \"none\";\n}\n\n/**\n * Returns the port ID (property name) of the first output port that declares\n * `x-stream: \"append\"`, or `undefined` if no such port exists.\n *\n * @param schema - The task's output DataPortSchema\n * @returns The port name with append streaming, or undefined\n */\nexport function getAppendPortId(schema: DataPortSchema): string | undefined {\n if (typeof schema === \"boolean\") return undefined;\n const props = schema.properties;\n if (!props) return undefined;\n\n for (const [name, prop] of Object.entries(props)) {\n if (!prop || typeof prop === \"boolean\") continue;\n if ((prop as any)[\"x-stream\"] === \"append\") return name;\n }\n return undefined;\n}\n\n/**\n * Determines whether a dataflow edge needs to accumulate stream events\n * into a materialized value for the target port.\n *\n * Accumulation is needed when:\n * - The source output port declares streaming (`x-stream` is set)\n * - AND the target input port does NOT accept the same stream mode\n *\n * @param sourceSchema - Output schema of the source task\n * @param sourcePort - Port ID on the source task\n * @param targetSchema - Input schema of the target task\n * @param targetPort - Port ID on the target task\n * @returns true if the edge should accumulate; false if stream can pass through\n */\nexport function edgeNeedsAccumulation(\n sourceSchema: DataPortSchema,\n sourcePort: string,\n targetSchema: DataPortSchema,\n targetPort: string\n): boolean {\n const sourceMode = getPortStreamMode(sourceSchema, sourcePort);\n if (sourceMode === \"none\") return false;\n const targetMode = getPortStreamMode(targetSchema, targetPort);\n return sourceMode !== targetMode;\n}\n\n/**\n * Returns the port ID (property name) of the first output port that declares\n * `x-stream: \"object\"`, or `undefined` if no such port exists.\n *\n * @param schema - The task's output DataPortSchema\n * @returns The port name with object streaming, or undefined\n */\nexport function getObjectPortId(schema: DataPortSchema): string | undefined {\n if (typeof schema === \"boolean\") return undefined;\n const props = schema.properties;\n if (!props) return undefined;\n\n for (const [name, prop] of Object.entries(props)) {\n if (!prop || typeof prop === \"boolean\") continue;\n if ((prop as any)[\"x-stream\"] === \"object\") return name;\n }\n return undefined;\n}\n\n/**\n * Returns a map of port names to their JSON Schemas for every output port\n * that declares `\"x-structured-output\": true`.\n *\n * @param schema - The task's output DataPortSchema\n * @returns Map of port-name → JSON Schema for structured output ports\n */\nexport function getStructuredOutputSchemas(schema: DataPortSchema): Map<string, JsonSchema> {\n const result = new Map<string, JsonSchema>();\n if (typeof schema === \"boolean\") return result;\n const props = schema.properties;\n if (!props) return result;\n\n for (const [name, prop] of Object.entries(props)) {\n if (!prop || typeof prop === \"boolean\") continue;\n if ((prop as any)[\"x-structured-output\"] === true) {\n result.set(name, prop as JsonSchema);\n }\n }\n return result;\n}\n\n/**\n * Returns true if the schema has any output port with `\"x-structured-output\": true`.\n */\nexport function hasStructuredOutput(schema: DataPortSchema): boolean {\n return getStructuredOutputSchemas(schema).size > 0;\n}\n",
|
|
12
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n getTelemetryProvider,\n globalServiceRegistry,\n ServiceRegistry,\n SpanStatusCode,\n type ISpan,\n} from \"@workglow/util\";\nimport { TASK_OUTPUT_REPOSITORY, TaskOutputRepository } from \"../storage/TaskOutputRepository\";\nimport { ensureTask, type Taskish } from \"../task-graph/Conversions\";\nimport { resolveSchemaInputs } from \"./InputResolver\";\nimport { IRunConfig, ITask } from \"./ITask\";\nimport { ITaskRunner } from \"./ITaskRunner\";\nimport {\n getOutputStreamMode,\n getStreamingPorts,\n isTaskStreamable,\n type StreamEvent,\n type StreamMode,\n} from \"./StreamTypes\";\nimport { Task } from \"./Task\";\nimport {\n TaskAbortedError,\n TaskError,\n TaskFailedError,\n TaskInvalidInputError,\n TaskTimeoutError,\n} from \"./TaskError\";\nimport { TaskConfig, TaskInput, TaskOutput, TaskStatus } from \"./TaskTypes\";\n\n/**\n * Type guard that checks whether a value is an ITask-like object with a mutable `runConfig`.\n */\nfunction hasRunConfig(i: unknown): i is { runConfig: Partial<IRunConfig> } {\n return i !== null && typeof i === \"object\" && \"runConfig\" in (i as object);\n}\n\n/**\n * Responsible for running tasks\n * Manages the execution lifecycle of individual tasks\n */\nexport class TaskRunner<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends TaskConfig = TaskConfig,\n> implements ITaskRunner<Input, Output, Config> {\n /**\n * Whether the task is currently running\n */\n protected running = false;\n protected reactiveRunning = false;\n\n /**\n * The task to run\n */\n public readonly task: ITask<Input, Output, Config>;\n\n /**\n * AbortController for cancelling task execution\n */\n protected abortController?: AbortController;\n\n /**\n * The output cache for the task\n */\n protected outputCache?: TaskOutputRepository;\n\n /**\n * The service registry for the task\n */\n protected registry: ServiceRegistry = globalServiceRegistry;\n\n /**\n * Input streams for pass-through streaming tasks.\n * Set by the graph runner before executing a streaming task that has\n * upstream streaming edges. Keyed by input port name.\n */\n public inputStreams?: Map<string, ReadableStream<StreamEvent>>;\n\n /**\n * Timer handle for task-level timeout. Set when `IRunConfig.timeout` is\n * provided and cleared on completion, error, or abort.\n */\n protected timeoutTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * When a timeout triggers the abort, this holds the TaskTimeoutError so\n * handleAbort() can surface the correct error type instead of a generic\n * TaskAbortedError.\n */\n protected pendingTimeoutError?: TaskTimeoutError;\n\n /**\n * Whether the streaming task runner should accumulate text-delta chunks and\n * emit an enriched finish event. Set from IRunConfig.shouldAccumulate.\n * Defaults to true so standalone task execution is backward-compatible.\n * The graph runner sets this to false when no downstream edge needs\n * materialized data (no cache, all downstream tasks are also streaming).\n */\n protected shouldAccumulate: boolean = true;\n\n /**\n * Active telemetry span for the current task run.\n */\n protected telemetrySpan?: ISpan;\n\n /**\n * Constructor for TaskRunner\n * @param task The task to run\n */\n constructor(task: ITask<Input, Output, Config>) {\n this.task = task;\n this.own = this.own.bind(this);\n this.handleProgress = this.handleProgress.bind(this);\n }\n\n // ========================================================================\n // Public methods\n // ========================================================================\n\n /**\n * Runs the task and returns the output\n * @param overrides Optional input overrides\n * @param config Optional configuration overrides\n * @returns The task output\n */\n async run(overrides: Partial<Input> = {}, config: IRunConfig = {}): Promise<Output> {\n await this.handleStart(config);\n\n try {\n this.task.setInput(overrides);\n\n // Resolve schema-annotated inputs (models, repositories) before validation\n const schema = (this.task.constructor as typeof Task).inputSchema();\n this.task.runInputData = (await resolveSchemaInputs(\n this.task.runInputData as Record<string, unknown>,\n schema,\n { registry: this.registry }\n )) as Input;\n\n const isValid = await this.task.validateInput(this.task.runInputData);\n if (!isValid) {\n throw new TaskInvalidInputError(\"Invalid input data\");\n }\n\n if (this.abortController?.signal.aborted) {\n await this.handleAbort();\n throw new TaskAbortedError(\"Promise for task created and aborted before run\");\n }\n\n const inputs: Input = this.task.runInputData as Input;\n let outputs: Output | undefined;\n\n const isStreamable = isTaskStreamable(this.task);\n\n if (this.task.cacheable) {\n outputs = (await this.outputCache?.getOutput(this.task.type, inputs)) as Output;\n if (outputs) {\n this.telemetrySpan?.addEvent(\"workglow.task.cache_hit\");\n if (isStreamable) {\n this.task.runOutputData = outputs;\n this.task.emit(\"stream_start\");\n this.task.emit(\"stream_chunk\", { type: \"finish\", data: outputs } as StreamEvent);\n this.task.emit(\"stream_end\", outputs);\n this.task.runOutputData = await this.executeTaskReactive(inputs, outputs);\n } else {\n this.task.runOutputData = await this.executeTaskReactive(inputs, outputs);\n }\n }\n }\n if (!outputs) {\n if (isStreamable) {\n outputs = await this.executeStreamingTask(inputs);\n } else {\n outputs = await this.executeTask(inputs);\n }\n if (this.task.cacheable && outputs !== undefined) {\n await this.outputCache?.saveOutput(this.task.type, inputs, outputs);\n }\n this.task.runOutputData = outputs ?? ({} as Output);\n }\n\n await this.handleComplete();\n\n return this.task.runOutputData as Output;\n } catch (err: any) {\n await this.handleError(err);\n // If a timeout triggered the abort, throw the TaskTimeoutError instead\n // of the generic TaskAbortedError that the task's execute() may have thrown.\n throw this.task.error instanceof TaskTimeoutError ? this.task.error : err;\n }\n }\n\n /**\n * Runs the task in reactive mode\n * @param overrides Optional input overrides\n * @returns The task output\n */\n public async runReactive(overrides: Partial<Input> = {}): Promise<Output> {\n if (this.task.status === TaskStatus.PROCESSING) {\n return this.task.runOutputData as Output;\n }\n this.task.setInput(overrides);\n\n // Resolve schema-annotated inputs (models, repositories) before validation\n const schema = (this.task.constructor as typeof Task).inputSchema();\n this.task.runInputData = (await resolveSchemaInputs(\n this.task.runInputData as Record<string, unknown>,\n schema,\n { registry: this.registry }\n )) as Input;\n\n await this.handleStartReactive();\n\n try {\n const isValid = await this.task.validateInput(this.task.runInputData);\n if (!isValid) {\n throw new TaskInvalidInputError(\"Invalid input data\");\n }\n\n const resultReactive = await this.executeTaskReactive(\n this.task.runInputData as Input,\n this.task.runOutputData as Output\n );\n\n this.task.runOutputData = resultReactive;\n\n await this.handleCompleteReactive();\n } catch (err: any) {\n await this.handleErrorReactive();\n } finally {\n return this.task.runOutputData as Output;\n }\n }\n\n /**\n * Aborts task execution\n */\n public abort(): void {\n if (this.task.hasChildren()) {\n this.task.subGraph.abort();\n }\n this.abortController?.abort();\n }\n\n // ========================================================================\n // Protected methods\n // ========================================================================\n\n protected own<T extends Taskish<any, any>>(i: T): T {\n const task = ensureTask(i, { isOwned: true });\n this.task.subGraph.addTask(task);\n // Propagate parent registry and abort signal to owned ITask instances so\n // that calling task.run() on the returned value inherits this execution context.\n if (hasRunConfig(i)) {\n Object.assign(i.runConfig, {\n registry: this.registry,\n signal: this.abortController?.signal,\n });\n }\n return i;\n }\n\n /**\n * Protected method to execute a task by delegating back to the task itself.\n */\n protected async executeTask(input: Input): Promise<Output | undefined> {\n const result = await this.task.execute(input, {\n signal: this.abortController!.signal,\n updateProgress: this.handleProgress.bind(this),\n own: this.own,\n registry: this.registry,\n });\n return await this.executeTaskReactive(input, result || ({} as Output));\n }\n\n /**\n * Protected method for reactive execution delegation\n */\n protected async executeTaskReactive(input: Input, output: Output): Promise<Output> {\n const reactiveResult = await this.task.executeReactive(input, output, { own: this.own });\n return Object.assign({}, output, reactiveResult ?? {}) as Output;\n }\n\n /**\n * Executes a streaming task by consuming its executeStream() async iterable.\n *\n * When `shouldAccumulate` is true (default, set by graph runner when any downstream\n * edge needs materialized data, or when caching is on):\n * - text-delta chunks are accumulated per-port into a Map\n * - the raw finish event is NOT emitted; instead an enriched finish event is\n * emitted with the accumulated text merged in, so downstream dataflows can\n * materialize values without re-accumulating on their own\n *\n * When `shouldAccumulate` is false (set by graph runner when all downstream edges\n * are also streaming and no cache is needed):\n * - all events including the raw finish are emitted as-is (pure pass-through)\n * - no accumulation Map is maintained\n */\n protected async executeStreamingTask(input: Input): Promise<Output | undefined> {\n const streamMode: StreamMode = getOutputStreamMode(this.task.outputSchema());\n if (streamMode === \"append\") {\n const ports = getStreamingPorts(this.task.outputSchema());\n if (ports.length === 0) {\n throw new TaskError(\n `Task ${this.task.type} declares append streaming but no output port has x-stream: \"append\"`\n );\n }\n }\n if (streamMode === \"object\") {\n const ports = getStreamingPorts(this.task.outputSchema());\n if (ports.length === 0) {\n throw new TaskError(\n `Task ${this.task.type} declares object streaming but no output port has x-stream: \"object\"`\n );\n }\n }\n\n const accumulated = this.shouldAccumulate ? new Map<string, string>() : undefined;\n const accumulatedObjects = this.shouldAccumulate\n ? new Map<string, Record<string, unknown> | unknown[]>()\n : undefined;\n let chunkCount = 0;\n let finalOutput: Output | undefined;\n\n this.task.emit(\"stream_start\");\n\n const stream = this.task.executeStream!(input, {\n signal: this.abortController!.signal,\n updateProgress: this.handleProgress.bind(this),\n own: this.own,\n registry: this.registry,\n inputStreams: this.inputStreams,\n });\n\n for await (const event of stream) {\n chunkCount++;\n\n if (chunkCount === 1) {\n this.task.status = TaskStatus.STREAMING;\n this.task.emit(\"status\", this.task.status);\n }\n\n // For snapshot events, update runOutputData BEFORE emitting stream_chunk\n // so listeners see the latest snapshot when they handle the event\n if (event.type === \"snapshot\") {\n this.task.runOutputData = event.data as Output;\n }\n\n switch (event.type) {\n case \"text-delta\": {\n if (accumulated) {\n accumulated.set(event.port, (accumulated.get(event.port) ?? \"\") + event.textDelta);\n }\n this.task.emit(\"stream_chunk\", event as StreamEvent);\n const progress = Math.min(99, Math.round(100 * (1 - Math.exp(-0.05 * chunkCount))));\n await this.handleProgress(progress);\n break;\n }\n case \"object-delta\": {\n if (accumulatedObjects) {\n accumulatedObjects.set(event.port, event.objectDelta);\n }\n // Update runOutputData progressively so listeners see growing state\n this.task.runOutputData = {\n ...this.task.runOutputData,\n [event.port]: event.objectDelta,\n } as Output;\n this.task.emit(\"stream_chunk\", event as StreamEvent);\n const progress = Math.min(99, Math.round(100 * (1 - Math.exp(-0.05 * chunkCount))));\n await this.handleProgress(progress);\n break;\n }\n case \"snapshot\": {\n this.task.emit(\"stream_chunk\", event as StreamEvent);\n const progress = Math.min(99, Math.round(100 * (1 - Math.exp(-0.05 * chunkCount))));\n await this.handleProgress(progress);\n break;\n }\n case \"finish\": {\n if (accumulated || accumulatedObjects) {\n // Emit an enriched finish event: merge accumulated deltas into\n // the finish payload so downstream dataflows get complete port data\n // without needing to re-accumulate themselves.\n const merged: Record<string, unknown> = { ...(event.data || {}) };\n if (accumulated) {\n for (const [port, text] of accumulated) {\n if (text.length > 0) merged[port] = text;\n }\n }\n if (accumulatedObjects) {\n for (const [port, obj] of accumulatedObjects) {\n merged[port] = obj;\n }\n }\n finalOutput = merged as unknown as Output;\n this.task.emit(\"stream_chunk\", { type: \"finish\", data: merged } as StreamEvent);\n } else {\n // No accumulation: emit the raw finish event and use it directly\n finalOutput = event.data as Output;\n this.task.emit(\"stream_chunk\", event as StreamEvent);\n }\n break;\n }\n case \"error\": {\n throw event.error;\n }\n }\n }\n\n // Check if the task was aborted during streaming\n if (this.abortController?.signal.aborted) {\n throw new TaskAbortedError(\"Task aborted during streaming\");\n }\n\n if (finalOutput !== undefined) {\n this.task.runOutputData = finalOutput;\n }\n\n this.task.emit(\"stream_end\", this.task.runOutputData as Output);\n\n const reactiveResult = await this.executeTaskReactive(\n input,\n (this.task.runOutputData as Output) || ({} as Output)\n );\n return reactiveResult;\n }\n\n // ========================================================================\n // Protected Handlers\n // ========================================================================\n\n /**\n * Handles task start\n */\n protected async handleStart(config: IRunConfig = {}): Promise<void> {\n if (this.task.status === TaskStatus.PROCESSING) return;\n\n this.running = true;\n\n this.task.startedAt = new Date();\n this.task.progress = 0;\n this.task.status = TaskStatus.PROCESSING;\n\n this.abortController = new AbortController();\n this.abortController.signal.addEventListener(\"abort\", () => {\n this.handleAbort();\n });\n\n // If a parent signal is provided (e.g. set by context.own()), link it so\n // that aborting the parent also aborts this task.\n if (config.signal?.aborted) {\n this.abortController.abort();\n } else if (config.signal) {\n config.signal.addEventListener(\"abort\", () => this.abortController!.abort(), { once: true });\n }\n\n const cache = config.outputCache ?? this.task.runConfig?.outputCache;\n if (cache === true) {\n let instance = globalServiceRegistry.get(TASK_OUTPUT_REPOSITORY);\n this.outputCache = instance;\n } else if (cache === false) {\n this.outputCache = undefined;\n } else if (cache instanceof TaskOutputRepository) {\n this.outputCache = cache;\n }\n\n // shouldAccumulate defaults to true (backward-compatible for standalone runs)\n this.shouldAccumulate = config.shouldAccumulate !== false;\n\n // Start timeout timer if configured (timeout is a design-time config property)\n const timeout = (this.task.config as Record<string, unknown>).timeout as number | undefined;\n if (timeout !== undefined && timeout > 0) {\n this.pendingTimeoutError = new TaskTimeoutError(timeout);\n this.timeoutTimer = setTimeout(() => {\n this.abort();\n }, timeout);\n }\n\n if (config.updateProgress) {\n this.updateProgress = config.updateProgress;\n }\n\n if (config.registry) {\n this.registry = config.registry;\n }\n\n // Start telemetry span\n const telemetry = getTelemetryProvider();\n if (telemetry.isEnabled) {\n this.telemetrySpan = telemetry.startSpan(\"workglow.task.run\", {\n attributes: {\n \"workglow.task.type\": this.task.type,\n \"workglow.task.id\": String(this.task.config.id),\n \"workglow.task.cacheable\": this.task.cacheable,\n \"workglow.task.title\": this.task.title || undefined,\n },\n });\n }\n\n this.task.emit(\"start\");\n this.task.emit(\"status\", this.task.status);\n }\n private updateProgress = async (\n task: ITask,\n progress: number,\n message?: string,\n ...args: any[]\n ) => {};\n\n protected async handleStartReactive(): Promise<void> {\n this.reactiveRunning = true;\n }\n\n /**\n * Clears the timeout timer if one is active.\n */\n protected clearTimeoutTimer(): void {\n if (this.timeoutTimer !== undefined) {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = undefined;\n }\n }\n\n /**\n * Handles task abort\n */\n protected async handleAbort(): Promise<void> {\n if (this.task.status === TaskStatus.ABORTING) return;\n this.clearTimeoutTimer();\n this.task.status = TaskStatus.ABORTING;\n this.task.progress = 100;\n // Use the pending timeout error if the abort was triggered by a timeout\n this.task.error = this.pendingTimeoutError ?? new TaskAbortedError();\n this.pendingTimeoutError = undefined;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.ERROR, \"aborted\");\n this.telemetrySpan.addEvent(\"workglow.task.aborted\", {\n \"workglow.task.error\": this.task.error.message,\n });\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.task.emit(\"abort\", this.task.error);\n this.task.emit(\"status\", this.task.status);\n }\n\n protected async handleAbortReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles task completion\n */\n protected async handleComplete(): Promise<void> {\n if (this.task.status === TaskStatus.COMPLETED) return;\n this.clearTimeoutTimer();\n this.pendingTimeoutError = undefined;\n\n this.task.completedAt = new Date();\n this.task.progress = 100;\n this.task.status = TaskStatus.COMPLETED;\n this.abortController = undefined;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.OK);\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.task.emit(\"complete\");\n this.task.emit(\"status\", this.task.status);\n }\n\n protected async handleCompleteReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n protected async handleDisable(): Promise<void> {\n if (this.task.status === TaskStatus.DISABLED) return;\n this.task.status = TaskStatus.DISABLED;\n this.task.progress = 100;\n this.task.completedAt = new Date();\n this.abortController = undefined;\n this.task.emit(\"disabled\");\n this.task.emit(\"status\", this.task.status);\n }\n\n public async disable(): Promise<void> {\n await this.handleDisable();\n }\n\n /**\n * Handles task error\n * @param err Error that occurred\n */\n protected async handleError(err: Error): Promise<void> {\n if (err instanceof TaskAbortedError) return this.handleAbort();\n if (this.task.status === TaskStatus.FAILED) return;\n this.clearTimeoutTimer();\n this.pendingTimeoutError = undefined;\n if (this.task.hasChildren()) {\n this.task.subGraph!.abort();\n }\n\n this.task.completedAt = new Date();\n this.task.progress = 100;\n this.task.status = TaskStatus.FAILED;\n this.task.error =\n err instanceof TaskError ? err : new TaskFailedError(err?.message || \"Task failed\");\n this.abortController = undefined;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.ERROR, this.task.error.message);\n this.telemetrySpan.setAttributes({ \"workglow.task.error\": this.task.error.message });\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.task.emit(\"error\", this.task.error);\n this.task.emit(\"status\", this.task.status);\n }\n\n protected async handleErrorReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles task progress update\n * @param progress Progress value (0-100)\n * @param args Additional arguments\n */\n protected async handleProgress(\n progress: number,\n message?: string,\n ...args: any[]\n ): Promise<void> {\n this.task.progress = progress;\n await this.updateProgress(this.task, progress, message, ...args);\n this.task.emit(\"progress\", progress, message, ...args);\n }\n}\n",
|
|
13
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n compileSchema,\n deepEqual,\n EventEmitter,\n SchemaNode,\n uuid4,\n type DataPortSchema,\n type ServiceRegistry,\n} from \"@workglow/util\";\nimport { DATAFLOW_ALL_PORTS } from \"../task-graph/Dataflow\";\nimport { TaskGraph } from \"../task-graph/TaskGraph\";\nimport type { IExecuteContext, IExecuteReactiveContext, IRunConfig, ITask } from \"./ITask\";\nimport {\n TaskAbortedError,\n TaskConfigurationError,\n TaskError,\n TaskInvalidInputError,\n} from \"./TaskError\";\nimport {\n type TaskEventListener,\n type TaskEventListeners,\n type TaskEventParameters,\n type TaskEvents,\n} from \"./TaskEvents\";\nimport type { JsonTaskItem, TaskGraphItemJson, TaskGraphJsonOptions } from \"./TaskJSON\";\nimport { TaskRunner } from \"./TaskRunner\";\nimport {\n TaskConfigSchema,\n TaskStatus,\n type TaskConfig,\n type TaskIdType,\n type TaskInput,\n type TaskOutput,\n type TaskTypeName,\n} from \"./TaskTypes\";\n\n/**\n * Base class for all tasks that implements the ITask interface.\n * This abstract class provides common functionality for both simple and compound tasks.\n *\n * The Task class is responsible for:\n * 1. Defining what a task is (inputs, outputs, configuration)\n * 2. Providing the execution logic (via execute and executeReactive)\n * 3. Delegating the running logic to a TaskRunner\n */\nexport class Task<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends TaskConfig = TaskConfig,\n> implements ITask<Input, Output, Config> {\n // ========================================================================\n // Static properties - should be overridden by subclasses\n // ========================================================================\n\n /**\n * The type identifier for this task class\n */\n public static type: TaskTypeName = \"Task\";\n\n /**\n * The category this task belongs to\n */\n public static category: string = \"Hidden\";\n\n /**\n * The title of this task\n */\n public static title: string = \"\";\n\n /**\n * The description of this task\n */\n public static description: string = \"\";\n\n /**\n * Whether this task has side effects\n */\n public static cacheable: boolean = true;\n\n /**\n * Whether this task has dynamic input/output schemas that can change at runtime.\n * Tasks with dynamic schemas should override instance methods for inputSchema() and/or outputSchema()\n * and emit 'schemaChange' events when their schemas change.\n */\n public static hasDynamicSchemas: boolean = false;\n\n /**\n * When true, dynamically added input ports (via the universal \"Add Input\" handle in the builder)\n * are mirrored as output ports of the same name and type. Set this on pass-through tasks that\n * forward their additional inputs to their outputs unchanged.\n */\n public static passthroughInputsToOutputs: boolean = false;\n\n /**\n * When true, this task can be saved as a custom task with a preset configuration.\n * Tasks that have meaningful user-facing config options beyond the base fields should set this.\n */\n public static customizable: boolean = false;\n\n /**\n * Input schema for this task\n */\n public static inputSchema(): DataPortSchema {\n return {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n } as const satisfies DataPortSchema;\n }\n\n /**\n * Output schema for this task\n */\n public static outputSchema(): DataPortSchema {\n return {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n } as const satisfies DataPortSchema;\n }\n\n /**\n * Config schema for this task. Subclasses that add config properties MUST override this\n * and spread TaskConfigSchema[\"properties\"] into their own properties object.\n */\n public static configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n // ========================================================================\n // Task Execution Methods - Core logic provided by subclasses\n // ========================================================================\n\n /**\n * The actual task execution logic for subclasses to override\n *\n * @param input The input to the task\n * @param config The configuration for the task\n * @throws TaskError if the task fails\n * @returns The output of the task or undefined if no changes\n */\n public async execute(_input: Input, context: IExecuteContext): Promise<Output | undefined> {\n if (context.signal?.aborted) {\n throw new TaskAbortedError(\"Task aborted\");\n }\n return undefined;\n }\n\n /**\n * Default implementation of executeReactive that does nothing.\n * Subclasses should override this to provide actual reactive functionality.\n *\n * This is generally for UI updating, and should be lightweight.\n * @param input The input to the task\n * @param output The current output of the task\n * @returns The updated output of the task or undefined if no changes\n */\n public async executeReactive(\n _input: Input,\n output: Output,\n _context: IExecuteReactiveContext\n ): Promise<Output | undefined> {\n return output;\n }\n\n // ========================================================================\n // TaskRunner delegation - Executes and manages the task\n // ========================================================================\n\n /**\n * Task runner for handling the task execution\n */\n protected _runner: TaskRunner<Input, Output, Config> | undefined;\n\n /**\n * Gets the task runner instance\n * Creates a new one if it doesn't exist\n */\n public get runner(): TaskRunner<Input, Output, Config> {\n if (!this._runner) {\n this._runner = new TaskRunner<Input, Output, Config>(this);\n }\n return this._runner;\n }\n\n /**\n * Runs the task and returns the output\n * Delegates to the task runner\n *\n * @param overrides Optional input overrides\n * @param runConfig Optional per-call run configuration (merged with task's runConfig)\n * @throws TaskError if the task fails\n * @returns The task output\n */\n async run(overrides: Partial<Input> = {}, runConfig: Partial<IRunConfig> = {}): Promise<Output> {\n return this.runner.run(overrides, { ...this.runConfig, ...runConfig });\n }\n\n /**\n * Runs the task in reactive mode\n * Delegates to the task runner\n *\n * @param overrides Optional input overrides\n * @returns The task output\n */\n public async runReactive(overrides: Partial<Input> = {}): Promise<Output> {\n return this.runner.runReactive(overrides);\n }\n\n /**\n * Aborts task execution\n * Delegates to the task runner\n */\n public abort(): void {\n this.runner.abort();\n }\n\n /**\n * Disables task execution\n * Delegates to the task runner\n */\n public async disable(): Promise<void> {\n await this.runner.disable();\n }\n\n // ========================================================================\n // Static to Instance conversion methods\n // ========================================================================\n\n /**\n * Gets input schema for this task\n */\n public inputSchema(): DataPortSchema {\n return (this.constructor as typeof Task).inputSchema();\n }\n\n /**\n * Gets output schema for this task\n */\n public outputSchema(): DataPortSchema {\n return (this.constructor as typeof Task).outputSchema();\n }\n\n /**\n * Gets config schema for this task\n */\n public configSchema(): DataPortSchema {\n return (this.constructor as typeof Task).configSchema();\n }\n\n public get type(): TaskTypeName {\n return (this.constructor as typeof Task).type;\n }\n\n public get category(): string {\n return (this.constructor as typeof Task).category;\n }\n\n public get title(): string {\n return this.config?.title ?? (this.constructor as typeof Task).title;\n }\n\n public get description(): string {\n return this.config?.description ?? (this.constructor as typeof Task).description;\n }\n\n public get cacheable(): boolean {\n return (\n this.runConfig?.cacheable ??\n this.config?.cacheable ??\n (this.constructor as typeof Task).cacheable\n );\n }\n\n // ========================================================================\n // Instance properties using @template types\n // ========================================================================\n\n /**\n * Default input values for this task.\n * If no overrides at run time, then this would be equal to the input.\n * resetInputData() will reset inputs to these defaults.\n */\n defaults: Record<string, any>;\n\n /**\n * The input to the task at the time of the task run.\n * This takes defaults from construction time and overrides from run time.\n * It is the input that created the output.\n */\n runInputData: Record<string, any> = {};\n\n /**\n * The output of the task at the time of the task run.\n * This is the result of the task execution.\n */\n runOutputData: Record<string, any> = {};\n\n // ========================================================================\n // Task state properties\n // ========================================================================\n\n /**\n * The configuration of the task\n */\n config: Config;\n\n /**\n * Task id from config (read-only).\n */\n public get id(): unknown {\n return this.config.id;\n }\n\n /**\n * Runtime configuration (not serialized with the task).\n * Set via the constructor's third argument or mutated by the graph runner.\n */\n runConfig: Partial<IRunConfig> = {};\n\n /**\n * Current status of the task\n */\n status: TaskStatus = TaskStatus.PENDING;\n\n /**\n * Progress of the task (0-100)\n */\n progress: number = 0;\n\n /**\n * When the task was created\n */\n createdAt: Date = new Date();\n\n /**\n * When the task started execution\n */\n startedAt?: Date;\n\n /**\n * When the task completed execution\n */\n completedAt?: Date;\n\n /**\n * Error that occurred during task execution, if any\n */\n error?: TaskError;\n\n /**\n * Event emitter for task lifecycle events\n */\n public get events(): EventEmitter<TaskEventListeners> {\n if (!this._events) {\n this._events = new EventEmitter<TaskEventListeners>();\n }\n return this._events;\n }\n protected _events: EventEmitter<TaskEventListeners> | undefined;\n\n /**\n * Creates a new task instance\n *\n * @param callerDefaultInputs Default input values provided by the caller\n * @param config Configuration for the task\n */\n constructor(\n callerDefaultInputs: Partial<Input> = {},\n config: Partial<Config> = {},\n runConfig: Partial<IRunConfig> = {}\n ) {\n // Initialize input defaults\n const inputDefaults = this.getDefaultInputsFromStaticInputDefinitions();\n const mergedDefaults = Object.assign(inputDefaults, callerDefaultInputs);\n // Strip symbol properties (like [$JSONSchema]) before storing defaults\n this.defaults = this.stripSymbols(mergedDefaults) as Record<string, any>;\n this.resetInputData();\n\n // Setup configuration defaults (title comes from static class property as fallback)\n const title = (this.constructor as typeof Task).title || undefined;\n const baseConfig = Object.assign(\n {\n ...(title ? { title } : {}),\n },\n config\n ) as Config;\n if (baseConfig.id === undefined) {\n (baseConfig as Record<string, unknown>).id = uuid4();\n }\n this.config = this.validateAndApplyConfigDefaults(baseConfig);\n\n // Store runtime configuration\n this.runConfig = runConfig;\n }\n\n // ========================================================================\n // Input/Output handling\n // ========================================================================\n\n /**\n * Gets default input values from input schema\n */\n getDefaultInputsFromStaticInputDefinitions(): Partial<Input> {\n const schema = this.inputSchema();\n if (typeof schema === \"boolean\") {\n return {};\n }\n try {\n const compiledSchema = this.getInputSchemaNode();\n const defaultData = compiledSchema.getData(undefined, {\n addOptionalProps: true,\n removeInvalidData: false,\n useTypeDefaults: false,\n });\n return (defaultData || {}) as Partial<Input>;\n } catch (error) {\n console.warn(\n `Failed to compile input schema for ${this.type}, falling back to manual extraction:`,\n error\n );\n // Fallback to manual extraction if compilation fails\n return Object.entries(schema.properties || {}).reduce<Record<string, any>>(\n (acc, [id, prop]) => {\n const defaultValue = (prop as any).default;\n if (defaultValue !== undefined) {\n acc[id] = defaultValue;\n }\n return acc;\n },\n {}\n ) as Partial<Input>;\n }\n }\n\n /**\n * Resets input data to defaults\n */\n public resetInputData(): void {\n this.runInputData = this.smartClone(this.defaults) as Record<string, any>;\n }\n\n /**\n * Smart clone that deep-clones plain objects and arrays while preserving\n * class instances (objects with non-Object prototype) by reference.\n * Detects and throws an error on circular references.\n *\n * This is necessary because:\n * - structuredClone cannot clone class instances (methods are lost)\n * - JSON.parse/stringify loses methods and fails on circular references\n * - Class instances like repositories should be passed by reference\n *\n * This breaks the idea of everything being json serializable, but it allows\n * more efficient use cases. Do be careful with this though! Use sparingly.\n *\n * @param obj The object to clone\n * @param visited Set of objects in the current cloning path (for circular reference detection)\n * @returns A cloned object with class instances preserved by reference\n */\n private smartClone(obj: any, visited: WeakSet<object> = new WeakSet()): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Primitives (string, number, boolean, symbol, bigint) are returned as-is\n if (typeof obj !== \"object\") {\n return obj;\n }\n\n // Check for circular references\n if (visited.has(obj)) {\n throw new TaskConfigurationError(\n \"Circular reference detected in input data. \" +\n \"Cannot clone objects with circular references.\"\n );\n }\n\n // Clone TypedArrays (Float32Array, Int8Array, etc.) to avoid shared-mutation\n // between defaults and runInputData, while preserving DataView by reference.\n if (ArrayBuffer.isView(obj)) {\n // Preserve DataView instances by reference (constructor signature differs)\n if (typeof DataView !== \"undefined\" && obj instanceof DataView) {\n return obj;\n }\n // For TypedArrays, create a new instance with the same data\n const typedArray = obj as any;\n return new (typedArray.constructor as any)(typedArray);\n }\n\n // Preserve class instances (objects with non-Object/non-Array prototype)\n // This includes repository instances, custom classes, etc.\n if (!Array.isArray(obj)) {\n const proto = Object.getPrototypeOf(obj);\n if (proto !== Object.prototype && proto !== null) {\n return obj; // Pass by reference\n }\n }\n\n // Add object to visited set before recursing\n visited.add(obj);\n\n try {\n // Deep clone arrays, preserving class instances within\n if (Array.isArray(obj)) {\n return obj.map((item) => this.smartClone(item, visited));\n }\n\n // Deep clone plain objects\n const result: Record<string, any> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = this.smartClone(obj[key], visited);\n }\n }\n return result;\n } finally {\n // Remove from visited set after processing to allow the same object\n // in different branches (non-circular references)\n visited.delete(obj);\n }\n }\n\n /**\n * Sets the default input values for the task\n *\n * @param defaults The default input values to set\n */\n public setDefaults(defaults: Record<string, any>): void {\n // Strip symbol properties (like [$JSONSchema]) before storing defaults\n this.defaults = this.stripSymbols(defaults) as Record<string, any>;\n }\n\n /**\n * Sets input values for the task\n *\n * @param input Input values to set\n */\n public setInput(input: Record<string, any>): void {\n const schema = this.inputSchema();\n if (typeof schema === \"boolean\") {\n if (schema === true) {\n for (const [inputId, value] of Object.entries(input)) {\n if (value !== undefined) {\n this.runInputData[inputId] = value;\n }\n }\n }\n return;\n }\n const properties = schema.properties || {};\n\n // Copy explicitly defined properties\n for (const [inputId, prop] of Object.entries(properties)) {\n if (input[inputId] !== undefined) {\n this.runInputData[inputId] = input[inputId];\n } else if (this.runInputData[inputId] === undefined && (prop as any).default !== undefined) {\n this.runInputData[inputId] = (prop as any).default;\n }\n }\n\n // If additionalProperties is true, also copy any additional input properties\n if (schema.additionalProperties) {\n for (const [inputId, value] of Object.entries(input)) {\n if (!(inputId in properties)) {\n this.runInputData[inputId] = value;\n }\n }\n }\n }\n\n /**\n * Adds/merges input data during graph execution.\n * Unlike {@link setInput}, this method:\n * - Detects changes using deep equality\n * - Accumulates array values (appends rather than replaces)\n * - Handles DATAFLOW_ALL_PORTS for pass-through\n * - Handles additionalProperties for dynamic schemas\n *\n * @param overrides The input data to merge\n * @returns true if any input data was changed, false otherwise\n */\n public addInput(overrides: Partial<Input> | undefined): boolean {\n if (!overrides) return false;\n\n let changed = false;\n const inputSchema = this.inputSchema();\n\n if (typeof inputSchema === \"boolean\") {\n if (inputSchema === false) {\n return false;\n }\n // Schema is `true` - accept any input\n for (const [key, value] of Object.entries(overrides)) {\n if (!deepEqual(this.runInputData[key], value)) {\n this.runInputData[key] = value;\n changed = true;\n }\n }\n return changed;\n }\n\n const properties = inputSchema.properties || {};\n\n for (const [inputId, prop] of Object.entries(properties)) {\n if (inputId === DATAFLOW_ALL_PORTS) {\n this.runInputData = { ...this.runInputData, ...overrides };\n changed = true;\n } else {\n if (overrides[inputId] === undefined) continue;\n const isArray =\n (prop as any)?.type === \"array\" ||\n ((prop as any)?.type === \"any\" &&\n (Array.isArray(overrides[inputId]) || Array.isArray(this.runInputData[inputId])));\n\n if (isArray) {\n const existingItems = Array.isArray(this.runInputData[inputId])\n ? this.runInputData[inputId]\n : this.runInputData[inputId] !== undefined\n ? [this.runInputData[inputId]]\n : [];\n const newitems = [...existingItems];\n\n const overrideItem = overrides[inputId];\n if (Array.isArray(overrideItem)) {\n newitems.push(...overrideItem);\n } else {\n newitems.push(overrideItem);\n }\n this.runInputData[inputId] = newitems;\n changed = true;\n } else {\n if (!deepEqual(this.runInputData[inputId], overrides[inputId])) {\n this.runInputData[inputId] = overrides[inputId];\n changed = true;\n }\n }\n }\n }\n\n // If additionalProperties is true, also accept any additional input properties\n if (inputSchema.additionalProperties) {\n for (const [inputId, value] of Object.entries(overrides)) {\n if (!(inputId in properties)) {\n if (!deepEqual(this.runInputData[inputId], value)) {\n this.runInputData[inputId] = value;\n changed = true;\n }\n }\n }\n }\n\n return changed;\n }\n\n /**\n * Stub for narrowing input. Override in subclasses for custom logic.\n * @param input The input to narrow\n * @param _registry Optional service registry for lookups\n * @returns The (possibly narrowed) input\n */\n public async narrowInput(\n input: Record<string, any>,\n _registry: ServiceRegistry\n ): Promise<Record<string, any>> {\n return input;\n }\n\n // ========================================================================\n // Event handling methods\n // ========================================================================\n\n /**\n * Subscribes to an event\n */\n public subscribe<Event extends TaskEvents>(\n name: Event,\n fn: TaskEventListener<Event>\n ): () => void {\n return this.events.subscribe(name, fn);\n }\n\n /**\n * Registers an event listener\n */\n public on<Event extends TaskEvents>(name: Event, fn: TaskEventListener<Event>): void {\n this.events.on(name, fn);\n }\n\n /**\n * Removes an event listener\n */\n public off<Event extends TaskEvents>(name: Event, fn: TaskEventListener<Event>): void {\n this.events.off(name, fn);\n }\n\n /**\n * Registers a one-time event listener\n */\n public once<Event extends TaskEvents>(name: Event, fn: TaskEventListener<Event>): void {\n this.events.once(name, fn);\n }\n\n /**\n * Returns a promise that resolves when the specified event is emitted\n */\n public waitOn<Event extends TaskEvents>(name: Event): Promise<TaskEventParameters<Event>> {\n return this.events.waitOn(name) as Promise<TaskEventParameters<Event>>;\n }\n\n /**\n * Emits an event\n */\n public emit<Event extends TaskEvents>(name: Event, ...args: TaskEventParameters<Event>): void {\n // this one is not like the others. Listeners will cause a lazy load of the event emitter.\n // but no need to emit if no one is listening, so we don't want to create the event emitter if not needed\n this._events?.emit(name, ...args);\n }\n\n /**\n * Emits a schemaChange event when the task's input or output schema changes.\n * This should be called by tasks with dynamic schemas when their configuration\n * changes in a way that affects their schemas.\n *\n * @param inputSchema - The new input schema (optional, will use current schema if not provided)\n * @param outputSchema - The new output schema (optional, will use current schema if not provided)\n */\n protected emitSchemaChange(inputSchema?: DataPortSchema, outputSchema?: DataPortSchema): void {\n const finalInputSchema = inputSchema ?? this.inputSchema();\n const finalOutputSchema = outputSchema ?? this.outputSchema();\n this.emit(\"schemaChange\", finalInputSchema, finalOutputSchema);\n }\n\n // ========================================================================\n // Input validation methods\n // ========================================================================\n\n /**\n * Gets the compiled config schema node, or undefined if no configSchema is defined.\n *\n * The compiled schema is cached directly on the concrete class object (not in a shared\n * inherited Map) so that each subclass always uses its own configSchema() result.\n * A shared Map keyed only by type name can be poisoned if a different class computes\n * and caches the schema first — e.g., due to cross-package static-method resolution\n * inconsistencies in bundled outputs.\n */\n private static getConfigSchemaNode(): SchemaNode | undefined {\n const schema = this.configSchema();\n if (!schema) return undefined;\n // Use Object.hasOwn so each class gets its own entry rather than inheriting\n // from a parent class that already cached under the same key.\n if (!Object.hasOwn(this, \"__compiledConfigSchema\")) {\n try {\n const schemaNode =\n typeof schema === \"boolean\"\n ? compileSchema(schema ? {} : { not: {} })\n : compileSchema(schema);\n Object.defineProperty(this, \"__compiledConfigSchema\", {\n value: schemaNode,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n } catch (error) {\n console.warn(`Failed to compile config schema for ${this.type}:`, error);\n return undefined;\n }\n }\n return (this as any).__compiledConfigSchema as SchemaNode;\n }\n\n /**\n * Validates config against configSchema.\n * Returns config as-is; throws on validation errors.\n * Returns config as-is if no configSchema is defined.\n */\n private validateAndApplyConfigDefaults(config: Config): Config {\n const ctor = this.constructor as typeof Task;\n const schemaNode = ctor.getConfigSchemaNode();\n if (!schemaNode) return config;\n\n const result = schemaNode.validate(config);\n if (!result.valid) {\n const errorMessages = result.errors.map((e) => {\n const path = (e as any).data?.pointer || \"\";\n return `${e.message}${path ? ` (${path})` : \"\"}`;\n });\n throw new TaskConfigurationError(\n `[${ctor.name}] Configuration Error: ${errorMessages.join(\", \")}`\n );\n }\n\n return config;\n }\n\n protected static generateInputSchemaNode(schema: DataPortSchema) {\n if (typeof schema === \"boolean\") {\n if (schema === false) {\n return compileSchema({ not: {} });\n }\n return compileSchema({});\n }\n return compileSchema(schema);\n }\n\n /**\n * Gets the compiled input schema, cached per class (not in a shared inherited Map).\n * Uses Object.hasOwn so each subclass stores its own compiled schema and never\n * picks up a stale entry cached by a different class with the same type name.\n */\n protected static getInputSchemaNode(): SchemaNode {\n if (!Object.hasOwn(this, \"__compiledInputSchema\")) {\n const dataPortSchema = this.inputSchema();\n const schemaNode = this.generateInputSchemaNode(dataPortSchema);\n try {\n Object.defineProperty(this, \"__compiledInputSchema\", {\n value: schemaNode,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n } catch (error) {\n // If compilation fails, fall back to accepting any object structure\n // This is a safety net for schemas that json-schema-library can't compile\n console.warn(\n `Failed to compile input schema for ${this.type}, falling back to permissive validation:`,\n error\n );\n Object.defineProperty(this, \"__compiledInputSchema\", {\n value: compileSchema({}),\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n }\n return (this as any).__compiledInputSchema as SchemaNode;\n }\n\n protected getInputSchemaNode(): SchemaNode {\n return (this.constructor as typeof Task).getInputSchemaNode();\n }\n\n /**\n * Validates an input data object against the task's input schema\n */\n public async validateInput(input: Partial<Input>): Promise<boolean> {\n const ctor = this.constructor as typeof Task;\n let schemaNode: SchemaNode;\n if (ctor.hasDynamicSchemas) {\n // Dynamic-schema tasks use instance inputSchema() (e.g. config.inputSchema), not the static fallback.\n // The cached getInputSchemaNode uses static inputSchema() which would reject valid instance-specific inputs.\n const instanceSchema = this.inputSchema();\n schemaNode = ctor.generateInputSchemaNode(instanceSchema);\n } else {\n schemaNode = this.getInputSchemaNode();\n }\n const result = schemaNode.validate(input);\n\n if (!result.valid) {\n const errorMessages = result.errors.map((e) => {\n const path = e.data.pointer || \"\";\n return `${e.message}${path ? ` (${path})` : \"\"}`;\n });\n throw new TaskInvalidInputError(\n `Input ${JSON.stringify(Object.keys(input))} does not match schema: ${errorMessages.join(\", \")}`\n );\n }\n\n return true;\n }\n\n // ========================================================================\n // Serialization methods\n // ========================================================================\n\n /**\n * Strips symbol properties from an object to make it serializable\n * @param obj The object to strip symbols from\n * @returns A new object without symbol properties\n */\n private stripSymbols(obj: any): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n // Preserve TypedArrays (Float32Array, Int8Array, etc.)\n if (ArrayBuffer.isView(obj)) {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map((item) => this.stripSymbols(item));\n }\n if (typeof obj === \"object\") {\n const result: Record<string, any> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = this.stripSymbols(obj[key]);\n }\n }\n return result;\n }\n return obj;\n }\n\n /**\n * Serializes the task and its subtasks into a format that can be stored\n * @param _options Options controlling serialization (used by subclasses)\n * @returns The serialized task and subtasks\n */\n public toJSON(_options?: TaskGraphJsonOptions): TaskGraphItemJson {\n const ctor = this.constructor as typeof Task;\n\n // Build config by extracting only serializable properties defined in the configSchema.\n // We filter through the schema to avoid accidentally including non-serializable\n // values (e.g. functions like WhileTask.condition) or internal-only properties\n // that were never part of the serialized output and that consuming applications\n // don't expect (e.g. `queue` from JobQueueTask).\n const schema = ctor.configSchema();\n const schemaProperties =\n typeof schema !== \"boolean\" && schema?.properties\n ? (schema.properties as Record<string, Record<string, unknown>>)\n : {};\n\n const config: Record<string, unknown> = {};\n for (const [key, propSchema] of Object.entries(schemaProperties)) {\n if (key === \"id\") continue;\n // Skip internal properties marked as hidden (e.g. queue, compoundMerge)\n // except inputSchema/outputSchema/extras which are needed for task reconstruction\n if (\n propSchema?.[\"x-ui-hidden\"] === true &&\n key !== \"inputSchema\" &&\n key !== \"outputSchema\" &&\n key !== \"extras\"\n ) {\n continue;\n }\n const value = (this.config as Record<string, unknown>)[key];\n if (value === undefined) continue;\n // Skip non-serializable values (functions, symbols, etc.)\n if (typeof value === \"function\" || typeof value === \"symbol\") continue;\n config[key] = value;\n }\n\n // Omit title/description when they match the static class defaults\n if (config.title === ctor.title) delete config.title;\n if (config.description === ctor.description) delete config.description;\n\n // Omit empty extras\n const extras = config.extras as Record<string, unknown> | undefined;\n if (!extras || Object.keys(extras).length === 0) delete config.extras;\n\n const json: TaskGraphItemJson = this.stripSymbols({\n id: this.id,\n type: this.type,\n defaults: this.defaults,\n config,\n });\n return json;\n }\n\n /**\n * Converts the task to a JSON format suitable for dependency tracking\n * @param options Options controlling serialization (used by subclasses)\n * @returns The task and subtasks in JSON thats easier for humans to read\n */\n public toDependencyJSON(options?: TaskGraphJsonOptions): JsonTaskItem {\n const json = this.toJSON(options);\n return json;\n }\n\n // ========================================================================\n // Internal graph methods\n // ========================================================================\n\n /**\n * Checks if the task has children. Useful to gate to use of the internal subGraph\n * as this will return without creating a new graph if graph is non-existent .\n *\n * @returns True if the task has children, otherwise false\n */\n public hasChildren(): boolean {\n return (\n this._subGraph !== undefined &&\n this._subGraph !== null &&\n this._subGraph.getTasks().length > 0\n );\n }\n\n private _taskAddedListener: (taskId: TaskIdType) => void = () => {\n this.emit(\"regenerate\");\n };\n\n /**\n * The internal task graph containing subtasks\n *\n * In the base case, these may just be incidental tasks that are not part of the task graph\n * but are used to manage the task's state as part of task execution. Therefore, the graph\n * is not used by the default runner.\n */\n protected _subGraph: TaskGraph | undefined = undefined;\n\n /**\n * Sets the subtask graph for the compound task\n * @param subGraph The subtask graph to set\n */\n set subGraph(subGraph: TaskGraph) {\n if (this._subGraph) {\n this._subGraph.off(\"task_added\", this._taskAddedListener);\n }\n this._subGraph = subGraph;\n this._subGraph.on(\"task_added\", this._taskAddedListener);\n }\n\n /**\n * The internal task graph containing subtasks\n *\n * In the base case, these may just be incidental tasks that are not part of the task graph\n * but are used to manage the task's state as part of task execution. Therefore, the graph\n * is not used by the default runner.\n *\n * Creates a new graph if one doesn't exist.\n *\n * @returns The task graph\n */\n get subGraph(): TaskGraph {\n if (!this._subGraph) {\n this._subGraph = new TaskGraph();\n this._subGraph.on(\"task_added\", this._taskAddedListener);\n }\n return this._subGraph;\n }\n\n /**\n * Regenerates the task graph, which is internal state to execute() with config.own()\n *\n * This is a destructive operation that removes all dataflows and tasks from the graph.\n * It is used to reset the graph to a clean state.\n *\n * GraphAsTask and others override this and do not call super\n */\n public regenerateGraph(): void {\n if (this.hasChildren()) {\n for (const dataflow of this.subGraph.getDataflows()) {\n this.subGraph.removeDataflow(dataflow);\n }\n for (const child of this.subGraph.getTasks()) {\n this.subGraph.removeTask(child.id);\n }\n }\n this.events.emit(\"regenerate\");\n }\n}\n",
|
|
12
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n getTelemetryProvider,\n globalServiceRegistry,\n ServiceRegistry,\n SpanStatusCode,\n type ISpan,\n} from \"@workglow/util\";\nimport { TASK_OUTPUT_REPOSITORY, TaskOutputRepository } from \"../storage/TaskOutputRepository\";\nimport { ensureTask, type Taskish } from \"../task-graph/Conversions\";\nimport { resolveSchemaInputs } from \"./InputResolver\";\nimport { IRunConfig, ITask } from \"./ITask\";\nimport { ITaskRunner } from \"./ITaskRunner\";\nimport {\n getOutputStreamMode,\n getStreamingPorts,\n isTaskStreamable,\n type StreamEvent,\n type StreamMode,\n} from \"./StreamTypes\";\nimport { Task } from \"./Task\";\nimport {\n TaskAbortedError,\n TaskError,\n TaskFailedError,\n TaskInvalidInputError,\n TaskTimeoutError,\n} from \"./TaskError\";\nimport { TaskConfig, TaskInput, TaskOutput, TaskStatus } from \"./TaskTypes\";\n\n/**\n * Type guard that checks whether a value is an ITask-like object with a mutable `runConfig`.\n */\nfunction hasRunConfig(i: unknown): i is { runConfig: Partial<IRunConfig> } {\n return i !== null && typeof i === \"object\" && \"runConfig\" in (i as object);\n}\n\n/**\n * Responsible for running tasks\n * Manages the execution lifecycle of individual tasks\n */\nexport class TaskRunner<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends TaskConfig = TaskConfig,\n> implements ITaskRunner<Input, Output, Config> {\n /**\n * Whether the task is currently running\n */\n protected running = false;\n protected reactiveRunning = false;\n\n /**\n * The task to run\n */\n public readonly task: ITask<Input, Output, Config>;\n\n /**\n * AbortController for cancelling task execution\n */\n protected abortController?: AbortController;\n\n /**\n * The output cache for the task\n */\n protected outputCache?: TaskOutputRepository;\n\n /**\n * The service registry for the task\n */\n protected registry: ServiceRegistry = globalServiceRegistry;\n\n /**\n * Input streams for pass-through streaming tasks.\n * Set by the graph runner before executing a streaming task that has\n * upstream streaming edges. Keyed by input port name.\n */\n public inputStreams?: Map<string, ReadableStream<StreamEvent>>;\n\n /**\n * Timer handle for task-level timeout. Set when `IRunConfig.timeout` is\n * provided and cleared on completion, error, or abort.\n */\n protected timeoutTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * When a timeout triggers the abort, this holds the TaskTimeoutError so\n * handleAbort() can surface the correct error type instead of a generic\n * TaskAbortedError.\n */\n protected pendingTimeoutError?: TaskTimeoutError;\n\n /**\n * Whether the streaming task runner should accumulate text-delta chunks and\n * emit an enriched finish event. Set from IRunConfig.shouldAccumulate.\n * Defaults to true so standalone task execution is backward-compatible.\n * The graph runner sets this to false when no downstream edge needs\n * materialized data (no cache, all downstream tasks are also streaming).\n */\n protected shouldAccumulate: boolean = true;\n\n /**\n * Active telemetry span for the current task run.\n */\n protected telemetrySpan?: ISpan;\n\n /**\n * Constructor for TaskRunner\n * @param task The task to run\n */\n constructor(task: ITask<Input, Output, Config>) {\n this.task = task;\n this.own = this.own.bind(this);\n this.handleProgress = this.handleProgress.bind(this);\n }\n\n // ========================================================================\n // Public methods\n // ========================================================================\n\n /**\n * Runs the task and returns the output\n * @param overrides Optional input overrides\n * @param config Optional configuration overrides\n * @returns The task output\n */\n async run(overrides: Partial<Input> = {}, config: IRunConfig = {}): Promise<Output> {\n await this.handleStart(config);\n\n try {\n this.task.setInput(overrides);\n\n // Resolve schema-annotated inputs (models, repositories) before validation\n const schema = (this.task.constructor as typeof Task).inputSchema();\n this.task.runInputData = (await resolveSchemaInputs(\n this.task.runInputData as Record<string, unknown>,\n schema,\n { registry: this.registry }\n )) as Input;\n\n const isValid = await this.task.validateInput(this.task.runInputData);\n if (!isValid) {\n throw new TaskInvalidInputError(\"Invalid input data\");\n }\n\n if (this.abortController?.signal.aborted) {\n await this.handleAbort();\n throw new TaskAbortedError(\"Promise for task created and aborted before run\");\n }\n\n const inputs: Input = this.task.runInputData as Input;\n let outputs: Output | undefined;\n\n const isStreamable = isTaskStreamable(this.task);\n\n if (this.task.cacheable) {\n outputs = (await this.outputCache?.getOutput(this.task.type, inputs)) as Output;\n if (outputs) {\n this.telemetrySpan?.addEvent(\"workglow.task.cache_hit\");\n if (isStreamable) {\n this.task.runOutputData = outputs;\n this.task.emit(\"stream_start\");\n this.task.emit(\"stream_chunk\", { type: \"finish\", data: outputs } as StreamEvent);\n this.task.emit(\"stream_end\", outputs);\n this.task.runOutputData = await this.executeTaskReactive(inputs, outputs);\n } else {\n this.task.runOutputData = await this.executeTaskReactive(inputs, outputs);\n }\n }\n }\n if (!outputs) {\n if (isStreamable) {\n outputs = await this.executeStreamingTask(inputs);\n } else {\n outputs = await this.executeTask(inputs);\n }\n if (this.task.cacheable && outputs !== undefined) {\n await this.outputCache?.saveOutput(this.task.type, inputs, outputs);\n }\n this.task.runOutputData = outputs ?? ({} as Output);\n }\n\n await this.handleComplete();\n\n return this.task.runOutputData as Output;\n } catch (err: any) {\n await this.handleError(err);\n // If a timeout triggered the abort, throw the TaskTimeoutError instead\n // of the generic TaskAbortedError that the task's execute() may have thrown.\n throw this.task.error instanceof TaskTimeoutError ? this.task.error : err;\n }\n }\n\n /**\n * Runs the task in reactive mode\n * @param overrides Optional input overrides\n * @returns The task output\n */\n public async runReactive(overrides: Partial<Input> = {}): Promise<Output> {\n if (this.task.status === TaskStatus.PROCESSING) {\n return this.task.runOutputData as Output;\n }\n this.task.setInput(overrides);\n\n // Resolve schema-annotated inputs (models, repositories) before validation\n const schema = (this.task.constructor as typeof Task).inputSchema();\n this.task.runInputData = (await resolveSchemaInputs(\n this.task.runInputData as Record<string, unknown>,\n schema,\n { registry: this.registry }\n )) as Input;\n\n await this.handleStartReactive();\n\n try {\n const isValid = await this.task.validateInput(this.task.runInputData);\n if (!isValid) {\n throw new TaskInvalidInputError(\"Invalid input data\");\n }\n\n const resultReactive = await this.executeTaskReactive(\n this.task.runInputData as Input,\n this.task.runOutputData as Output\n );\n\n this.task.runOutputData = resultReactive;\n\n await this.handleCompleteReactive();\n } catch (err: any) {\n await this.handleErrorReactive();\n } finally {\n return this.task.runOutputData as Output;\n }\n }\n\n /**\n * Aborts task execution\n */\n public abort(): void {\n if (this.task.hasChildren()) {\n this.task.subGraph.abort();\n }\n this.abortController?.abort();\n }\n\n // ========================================================================\n // Protected methods\n // ========================================================================\n\n protected own<T extends Taskish<any, any>>(i: T): T {\n const task = ensureTask(i, { isOwned: true });\n this.task.subGraph.addTask(task);\n // Propagate parent registry and abort signal to owned ITask instances so\n // that calling task.run() on the returned value inherits this execution context.\n if (hasRunConfig(i)) {\n Object.assign(i.runConfig, {\n registry: this.registry,\n signal: this.abortController?.signal,\n });\n }\n return i;\n }\n\n /**\n * Protected method to execute a task by delegating back to the task itself.\n */\n protected async executeTask(input: Input): Promise<Output | undefined> {\n const result = await this.task.execute(input, {\n signal: this.abortController!.signal,\n updateProgress: this.handleProgress.bind(this),\n own: this.own,\n registry: this.registry,\n });\n return await this.executeTaskReactive(input, result || ({} as Output));\n }\n\n /**\n * Protected method for reactive execution delegation\n */\n protected async executeTaskReactive(input: Input, output: Output): Promise<Output> {\n const reactiveResult = await this.task.executeReactive(input, output, { own: this.own });\n return Object.assign({}, output, reactiveResult ?? {}) as Output;\n }\n\n /**\n * Executes a streaming task by consuming its executeStream() async iterable.\n *\n * When `shouldAccumulate` is true (default, set by graph runner when any downstream\n * edge needs materialized data, or when caching is on):\n * - text-delta chunks are accumulated per-port into a Map\n * - the raw finish event is NOT emitted; instead an enriched finish event is\n * emitted with the accumulated text merged in, so downstream dataflows can\n * materialize values without re-accumulating on their own\n *\n * When `shouldAccumulate` is false (set by graph runner when all downstream edges\n * are also streaming and no cache is needed):\n * - all events including the raw finish are emitted as-is (pure pass-through)\n * - no accumulation Map is maintained\n */\n protected async executeStreamingTask(input: Input): Promise<Output | undefined> {\n const streamMode: StreamMode = getOutputStreamMode(this.task.outputSchema());\n if (streamMode === \"append\") {\n const ports = getStreamingPorts(this.task.outputSchema());\n if (ports.length === 0) {\n throw new TaskError(\n `Task ${this.task.type} declares append streaming but no output port has x-stream: \"append\"`\n );\n }\n }\n if (streamMode === \"object\") {\n const ports = getStreamingPorts(this.task.outputSchema());\n if (ports.length === 0) {\n throw new TaskError(\n `Task ${this.task.type} declares object streaming but no output port has x-stream: \"object\"`\n );\n }\n }\n\n const accumulated = this.shouldAccumulate ? new Map<string, string>() : undefined;\n const accumulatedObjects = this.shouldAccumulate\n ? new Map<string, Record<string, unknown> | unknown[]>()\n : undefined;\n let chunkCount = 0;\n let finalOutput: Output | undefined;\n\n this.task.emit(\"stream_start\");\n\n const stream = this.task.executeStream!(input, {\n signal: this.abortController!.signal,\n updateProgress: this.handleProgress.bind(this),\n own: this.own,\n registry: this.registry,\n inputStreams: this.inputStreams,\n });\n\n for await (const event of stream) {\n chunkCount++;\n\n if (chunkCount === 1) {\n this.task.status = TaskStatus.STREAMING;\n this.task.emit(\"status\", this.task.status);\n }\n\n // For snapshot events, update runOutputData BEFORE emitting stream_chunk\n // so listeners see the latest snapshot when they handle the event\n if (event.type === \"snapshot\") {\n this.task.runOutputData = event.data as Output;\n }\n\n switch (event.type) {\n case \"text-delta\": {\n if (accumulated) {\n accumulated.set(event.port, (accumulated.get(event.port) ?? \"\") + event.textDelta);\n }\n this.task.emit(\"stream_chunk\", event as StreamEvent);\n const progress = Math.min(99, Math.round(100 * (1 - Math.exp(-0.05 * chunkCount))));\n await this.handleProgress(progress);\n break;\n }\n case \"object-delta\": {\n if (accumulatedObjects) {\n accumulatedObjects.set(event.port, event.objectDelta);\n }\n // Update runOutputData progressively so listeners see growing state\n this.task.runOutputData = {\n ...this.task.runOutputData,\n [event.port]: event.objectDelta,\n } as Output;\n this.task.emit(\"stream_chunk\", event as StreamEvent);\n const progress = Math.min(99, Math.round(100 * (1 - Math.exp(-0.05 * chunkCount))));\n await this.handleProgress(progress);\n break;\n }\n case \"snapshot\": {\n this.task.emit(\"stream_chunk\", event as StreamEvent);\n const progress = Math.min(99, Math.round(100 * (1 - Math.exp(-0.05 * chunkCount))));\n await this.handleProgress(progress);\n break;\n }\n case \"finish\": {\n if (accumulated || accumulatedObjects) {\n // Emit an enriched finish event: merge accumulated deltas into\n // the finish payload so downstream dataflows get complete port data\n // without needing to re-accumulate themselves.\n const merged: Record<string, unknown> = { ...(event.data || {}) };\n if (accumulated) {\n for (const [port, text] of accumulated) {\n if (text.length > 0) merged[port] = text;\n }\n }\n if (accumulatedObjects) {\n for (const [port, obj] of accumulatedObjects) {\n merged[port] = obj;\n }\n }\n finalOutput = merged as unknown as Output;\n this.task.emit(\"stream_chunk\", { type: \"finish\", data: merged } as StreamEvent);\n } else {\n // No accumulation: emit the raw finish event and use it directly\n finalOutput = event.data as Output;\n this.task.emit(\"stream_chunk\", event as StreamEvent);\n }\n break;\n }\n case \"error\": {\n throw event.error;\n }\n }\n }\n\n // Check if the task was aborted during streaming\n if (this.abortController?.signal.aborted) {\n throw new TaskAbortedError(\"Task aborted during streaming\");\n }\n\n if (finalOutput !== undefined) {\n this.task.runOutputData = finalOutput;\n }\n\n this.task.emit(\"stream_end\", this.task.runOutputData as Output);\n\n const reactiveResult = await this.executeTaskReactive(\n input,\n (this.task.runOutputData as Output) || ({} as Output)\n );\n return reactiveResult;\n }\n\n // ========================================================================\n // Protected Handlers\n // ========================================================================\n\n /**\n * Handles task start\n */\n protected async handleStart(config: IRunConfig = {}): Promise<void> {\n if (this.task.status === TaskStatus.PROCESSING) return;\n\n this.running = true;\n\n this.task.startedAt = new Date();\n this.task.progress = 0;\n this.task.status = TaskStatus.PROCESSING;\n\n this.abortController = new AbortController();\n this.abortController.signal.addEventListener(\"abort\", () => {\n this.handleAbort();\n });\n\n // If a parent signal is provided (e.g. set by context.own()), link it so\n // that aborting the parent also aborts this task.\n if (config.signal?.aborted) {\n this.abortController.abort();\n } else if (config.signal) {\n config.signal.addEventListener(\"abort\", () => this.abortController!.abort(), { once: true });\n }\n\n const cache = config.outputCache ?? this.task.runConfig?.outputCache;\n if (cache === true) {\n let instance = globalServiceRegistry.get(TASK_OUTPUT_REPOSITORY);\n this.outputCache = instance;\n } else if (cache === false) {\n this.outputCache = undefined;\n } else if (cache instanceof TaskOutputRepository) {\n this.outputCache = cache;\n }\n\n // shouldAccumulate defaults to true (backward-compatible for standalone runs)\n this.shouldAccumulate = config.shouldAccumulate !== false;\n\n // Start timeout timer if configured (timeout is a design-time config property)\n const timeout = (this.task.config as Record<string, unknown>).timeout as number | undefined;\n if (timeout !== undefined && timeout > 0) {\n this.pendingTimeoutError = new TaskTimeoutError(timeout);\n this.timeoutTimer = setTimeout(() => {\n this.abort();\n }, timeout);\n }\n\n if (config.updateProgress) {\n this.updateProgress = config.updateProgress;\n }\n\n if (config.registry) {\n this.registry = config.registry;\n }\n\n // Start telemetry span\n const telemetry = getTelemetryProvider();\n if (telemetry.isEnabled) {\n this.telemetrySpan = telemetry.startSpan(\"workglow.task.run\", {\n attributes: {\n \"workglow.task.type\": this.task.type,\n \"workglow.task.id\": String(this.task.config.id),\n \"workglow.task.cacheable\": this.task.cacheable,\n \"workglow.task.title\": this.task.title || undefined,\n },\n });\n }\n\n this.task.emit(\"start\");\n this.task.emit(\"status\", this.task.status);\n }\n private updateProgress = async (\n task: ITask,\n progress: number,\n message?: string,\n ...args: any[]\n ) => {};\n\n protected async handleStartReactive(): Promise<void> {\n this.reactiveRunning = true;\n }\n\n /**\n * Clears the timeout timer if one is active.\n */\n protected clearTimeoutTimer(): void {\n if (this.timeoutTimer !== undefined) {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = undefined;\n }\n }\n\n /**\n * Handles task abort\n */\n protected async handleAbort(): Promise<void> {\n if (this.task.status === TaskStatus.ABORTING) return;\n this.clearTimeoutTimer();\n this.task.status = TaskStatus.ABORTING;\n this.task.progress = 100;\n // Use the pending timeout error if the abort was triggered by a timeout\n this.task.error = this.pendingTimeoutError ?? new TaskAbortedError();\n this.pendingTimeoutError = undefined;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.ERROR, \"aborted\");\n this.telemetrySpan.addEvent(\"workglow.task.aborted\", {\n \"workglow.task.error\": this.task.error.message,\n });\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.task.emit(\"abort\", this.task.error);\n this.task.emit(\"status\", this.task.status);\n }\n\n protected async handleAbortReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles task completion\n */\n protected async handleComplete(): Promise<void> {\n if (this.task.status === TaskStatus.COMPLETED) return;\n this.clearTimeoutTimer();\n this.pendingTimeoutError = undefined;\n\n this.task.completedAt = new Date();\n this.task.progress = 100;\n this.task.status = TaskStatus.COMPLETED;\n this.abortController = undefined;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.OK);\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.task.emit(\"complete\");\n this.task.emit(\"status\", this.task.status);\n }\n\n protected async handleCompleteReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n protected async handleDisable(): Promise<void> {\n if (this.task.status === TaskStatus.DISABLED) return;\n this.task.status = TaskStatus.DISABLED;\n this.task.progress = 100;\n this.task.completedAt = new Date();\n this.abortController = undefined;\n this.task.emit(\"disabled\");\n this.task.emit(\"status\", this.task.status);\n }\n\n public async disable(): Promise<void> {\n await this.handleDisable();\n }\n\n /**\n * Handles task error\n * @param err Error that occurred\n */\n protected async handleError(err: Error): Promise<void> {\n if (err instanceof TaskAbortedError) return this.handleAbort();\n if (this.task.status === TaskStatus.FAILED) return;\n this.clearTimeoutTimer();\n this.pendingTimeoutError = undefined;\n if (this.task.hasChildren()) {\n this.task.subGraph!.abort();\n }\n\n this.task.completedAt = new Date();\n this.task.progress = 100;\n this.task.status = TaskStatus.FAILED;\n this.task.error =\n err instanceof TaskError ? err : new TaskFailedError(err?.message || \"Task failed\");\n this.abortController = undefined;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.ERROR, this.task.error.message);\n this.telemetrySpan.setAttributes({ \"workglow.task.error\": this.task.error.message });\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.task.emit(\"error\", this.task.error);\n this.task.emit(\"status\", this.task.status);\n }\n\n protected async handleErrorReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles task progress update\n * @param progress Progress value (0-100)\n * @param args Additional arguments\n */\n protected async handleProgress(\n progress: number,\n message?: string,\n ...args: any[]\n ): Promise<void> {\n this.task.progress = progress;\n // Emit before graph-level work (e.g. pushOutputFromNodeToEdges) so listeners are not stalled.\n this.task.emit(\"progress\", progress, message, ...args);\n await this.updateProgress(this.task, progress, message, ...args);\n }\n}\n",
|
|
13
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { compileSchema, type SchemaNode } from \"@workglow/schema\";\nimport {\n deepEqual,\n EventEmitter,\n uuid4,\n type DataPortSchema,\n type ServiceRegistry,\n} from \"@workglow/util\";\nimport { DATAFLOW_ALL_PORTS } from \"../task-graph/Dataflow\";\nimport { TaskGraph } from \"../task-graph/TaskGraph\";\nimport type { IExecuteContext, IExecuteReactiveContext, IRunConfig, ITask } from \"./ITask\";\nimport {\n TaskAbortedError,\n TaskConfigurationError,\n TaskError,\n TaskInvalidInputError,\n} from \"./TaskError\";\nimport {\n type TaskEventListener,\n type TaskEventListeners,\n type TaskEventParameters,\n type TaskEvents,\n} from \"./TaskEvents\";\nimport type { JsonTaskItem, TaskGraphItemJson, TaskGraphJsonOptions } from \"./TaskJSON\";\nimport { TaskRunner } from \"./TaskRunner\";\nimport {\n TaskConfigSchema,\n TaskStatus,\n type TaskConfig,\n type TaskIdType,\n type TaskInput,\n type TaskOutput,\n type TaskTypeName,\n} from \"./TaskTypes\";\n\n/**\n * Base class for all tasks that implements the ITask interface.\n * This abstract class provides common functionality for both simple and compound tasks.\n *\n * The Task class is responsible for:\n * 1. Defining what a task is (inputs, outputs, configuration)\n * 2. Providing the execution logic (via execute and executeReactive)\n * 3. Delegating the running logic to a TaskRunner\n */\nexport class Task<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends TaskConfig = TaskConfig,\n> implements ITask<Input, Output, Config> {\n // ========================================================================\n // Static properties - should be overridden by subclasses\n // ========================================================================\n\n /**\n * The type identifier for this task class\n */\n public static type: TaskTypeName = \"Task\";\n\n /**\n * The category this task belongs to\n */\n public static category: string = \"Hidden\";\n\n /**\n * The title of this task\n */\n public static title: string = \"\";\n\n /**\n * The description of this task\n */\n public static description: string = \"\";\n\n /**\n * Whether this task has side effects\n */\n public static cacheable: boolean = true;\n\n /**\n * Whether this task has dynamic input/output schemas that can change at runtime.\n * Tasks with dynamic schemas should override instance methods for inputSchema() and/or outputSchema()\n * and emit 'schemaChange' events when their schemas change.\n */\n public static hasDynamicSchemas: boolean = false;\n\n /**\n * When true, dynamically added input ports (via the universal \"Add Input\" handle in the builder)\n * are mirrored as output ports of the same name and type. Set this on pass-through tasks that\n * forward their additional inputs to their outputs unchanged.\n */\n public static passthroughInputsToOutputs: boolean = false;\n\n /**\n * When true, this task can be saved as a custom task with a preset configuration.\n * Tasks that have meaningful user-facing config options beyond the base fields should set this.\n */\n public static customizable: boolean = false;\n\n /**\n * Input schema for this task\n */\n public static inputSchema(): DataPortSchema {\n return {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n } as const satisfies DataPortSchema;\n }\n\n /**\n * Output schema for this task\n */\n public static outputSchema(): DataPortSchema {\n return {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n } as const satisfies DataPortSchema;\n }\n\n /**\n * Config schema for this task. Subclasses that add config properties MUST override this\n * and spread TaskConfigSchema[\"properties\"] into their own properties object.\n */\n public static configSchema(): DataPortSchema {\n return TaskConfigSchema;\n }\n\n // ========================================================================\n // Task Execution Methods - Core logic provided by subclasses\n // ========================================================================\n\n /**\n * The actual task execution logic for subclasses to override\n *\n * @param input The input to the task\n * @param config The configuration for the task\n * @throws TaskError if the task fails\n * @returns The output of the task or undefined if no changes\n */\n public async execute(_input: Input, context: IExecuteContext): Promise<Output | undefined> {\n if (context.signal?.aborted) {\n throw new TaskAbortedError(\"Task aborted\");\n }\n return undefined;\n }\n\n /**\n * Default implementation of executeReactive that does nothing.\n * Subclasses should override this to provide actual reactive functionality.\n *\n * This is generally for UI updating, and should be lightweight.\n * @param input The input to the task\n * @param output The current output of the task\n * @returns The updated output of the task or undefined if no changes\n */\n public async executeReactive(\n _input: Input,\n output: Output,\n _context: IExecuteReactiveContext\n ): Promise<Output | undefined> {\n return output;\n }\n\n // ========================================================================\n // TaskRunner delegation - Executes and manages the task\n // ========================================================================\n\n /**\n * Task runner for handling the task execution\n */\n protected _runner: TaskRunner<Input, Output, Config> | undefined;\n\n /**\n * Gets the task runner instance\n * Creates a new one if it doesn't exist\n */\n public get runner(): TaskRunner<Input, Output, Config> {\n if (!this._runner) {\n this._runner = new TaskRunner<Input, Output, Config>(this);\n }\n return this._runner;\n }\n\n /**\n * Runs the task and returns the output\n * Delegates to the task runner\n *\n * @param overrides Optional input overrides\n * @param runConfig Optional per-call run configuration (merged with task's runConfig)\n * @throws TaskError if the task fails\n * @returns The task output\n */\n async run(overrides: Partial<Input> = {}, runConfig: Partial<IRunConfig> = {}): Promise<Output> {\n return this.runner.run(overrides, { ...this.runConfig, ...runConfig });\n }\n\n /**\n * Runs the task in reactive mode\n * Delegates to the task runner\n *\n * @param overrides Optional input overrides\n * @returns The task output\n */\n public async runReactive(overrides: Partial<Input> = {}): Promise<Output> {\n return this.runner.runReactive(overrides);\n }\n\n /**\n * Aborts task execution\n * Delegates to the task runner\n */\n public abort(): void {\n this.runner.abort();\n }\n\n /**\n * Disables task execution\n * Delegates to the task runner\n */\n public async disable(): Promise<void> {\n await this.runner.disable();\n }\n\n // ========================================================================\n // Static to Instance conversion methods\n // ========================================================================\n\n /**\n * Gets input schema for this task\n */\n public inputSchema(): DataPortSchema {\n return (this.constructor as typeof Task).inputSchema();\n }\n\n /**\n * Gets output schema for this task\n */\n public outputSchema(): DataPortSchema {\n return (this.constructor as typeof Task).outputSchema();\n }\n\n /**\n * Gets config schema for this task\n */\n public configSchema(): DataPortSchema {\n return (this.constructor as typeof Task).configSchema();\n }\n\n public get type(): TaskTypeName {\n return (this.constructor as typeof Task).type;\n }\n\n public get category(): string {\n return (this.constructor as typeof Task).category;\n }\n\n public get title(): string {\n return this.config?.title ?? (this.constructor as typeof Task).title;\n }\n\n public get description(): string {\n return this.config?.description ?? (this.constructor as typeof Task).description;\n }\n\n public get cacheable(): boolean {\n return (\n this.runConfig?.cacheable ??\n this.config?.cacheable ??\n (this.constructor as typeof Task).cacheable\n );\n }\n\n // ========================================================================\n // Instance properties using @template types\n // ========================================================================\n\n /**\n * Default input values for this task.\n * If no overrides at run time, then this would be equal to the input.\n * resetInputData() will reset inputs to these defaults.\n */\n defaults: Record<string, any>;\n\n /**\n * The input to the task at the time of the task run.\n * This takes defaults from construction time and overrides from run time.\n * It is the input that created the output.\n */\n runInputData: Record<string, any> = {};\n\n /**\n * The output of the task at the time of the task run.\n * This is the result of the task execution.\n */\n runOutputData: Record<string, any> = {};\n\n // ========================================================================\n // Task state properties\n // ========================================================================\n\n /**\n * The configuration of the task\n */\n config: Config;\n\n /**\n * Task id from config (read-only).\n */\n public get id(): unknown {\n return this.config.id;\n }\n\n /**\n * Runtime configuration (not serialized with the task).\n * Set via the constructor's third argument or mutated by the graph runner.\n */\n runConfig: Partial<IRunConfig> = {};\n\n /**\n * Current status of the task\n */\n status: TaskStatus = TaskStatus.PENDING;\n\n /**\n * Progress of the task (0-100)\n */\n progress: number = 0;\n\n /**\n * When the task was created\n */\n createdAt: Date = new Date();\n\n /**\n * When the task started execution\n */\n startedAt?: Date;\n\n /**\n * When the task completed execution\n */\n completedAt?: Date;\n\n /**\n * Error that occurred during task execution, if any\n */\n error?: TaskError;\n\n /**\n * Event emitter for task lifecycle events\n */\n public get events(): EventEmitter<TaskEventListeners> {\n if (!this._events) {\n this._events = new EventEmitter<TaskEventListeners>();\n }\n return this._events;\n }\n protected _events: EventEmitter<TaskEventListeners> | undefined;\n\n /**\n * Creates a new task instance\n *\n * @param callerDefaultInputs Default input values provided by the caller\n * @param config Configuration for the task\n */\n constructor(\n callerDefaultInputs: Partial<Input> = {},\n config: Partial<Config> = {},\n runConfig: Partial<IRunConfig> = {}\n ) {\n // Initialize input defaults\n const inputDefaults = this.getDefaultInputsFromStaticInputDefinitions();\n const mergedDefaults = Object.assign(inputDefaults, callerDefaultInputs);\n // Strip symbol properties (like [$JSONSchema]) before storing defaults\n this.defaults = this.stripSymbols(mergedDefaults) as Record<string, any>;\n this.resetInputData();\n\n // Setup configuration defaults (title comes from static class property as fallback)\n const title = (this.constructor as typeof Task).title || undefined;\n const baseConfig = Object.assign(\n {\n ...(title ? { title } : {}),\n },\n config\n ) as Config;\n if (baseConfig.id === undefined) {\n (baseConfig as Record<string, unknown>).id = uuid4();\n }\n this.config = this.validateAndApplyConfigDefaults(baseConfig);\n\n // Store runtime configuration\n this.runConfig = runConfig;\n }\n\n // ========================================================================\n // Input/Output handling\n // ========================================================================\n\n /**\n * Gets default input values from input schema\n */\n getDefaultInputsFromStaticInputDefinitions(): Partial<Input> {\n const schema = this.inputSchema();\n if (typeof schema === \"boolean\") {\n return {};\n }\n try {\n const compiledSchema = this.getInputSchemaNode();\n const defaultData = compiledSchema.getData(undefined, {\n addOptionalProps: true,\n removeInvalidData: false,\n useTypeDefaults: false,\n });\n return (defaultData || {}) as Partial<Input>;\n } catch (error) {\n console.warn(\n `Failed to compile input schema for ${this.type}, falling back to manual extraction:`,\n error\n );\n // Fallback to manual extraction if compilation fails\n return Object.entries(schema.properties || {}).reduce<Record<string, any>>(\n (acc, [id, prop]) => {\n const defaultValue = (prop as any).default;\n if (defaultValue !== undefined) {\n acc[id] = defaultValue;\n }\n return acc;\n },\n {}\n ) as Partial<Input>;\n }\n }\n\n /**\n * Resets input data to defaults\n */\n public resetInputData(): void {\n this.runInputData = this.smartClone(this.defaults) as Record<string, any>;\n }\n\n /**\n * Smart clone that deep-clones plain objects and arrays while preserving\n * class instances (objects with non-Object prototype) by reference.\n * Detects and throws an error on circular references.\n *\n * This is necessary because:\n * - structuredClone cannot clone class instances (methods are lost)\n * - JSON.parse/stringify loses methods and fails on circular references\n * - Class instances like repositories should be passed by reference\n *\n * This breaks the idea of everything being json serializable, but it allows\n * more efficient use cases. Do be careful with this though! Use sparingly.\n *\n * @param obj The object to clone\n * @param visited Set of objects in the current cloning path (for circular reference detection)\n * @returns A cloned object with class instances preserved by reference\n */\n private smartClone(obj: any, visited: WeakSet<object> = new WeakSet()): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Primitives (string, number, boolean, symbol, bigint) are returned as-is\n if (typeof obj !== \"object\") {\n return obj;\n }\n\n // Check for circular references\n if (visited.has(obj)) {\n throw new TaskConfigurationError(\n \"Circular reference detected in input data. \" +\n \"Cannot clone objects with circular references.\"\n );\n }\n\n // Clone TypedArrays (Float32Array, Int8Array, etc.) to avoid shared-mutation\n // between defaults and runInputData, while preserving DataView by reference.\n if (ArrayBuffer.isView(obj)) {\n // Preserve DataView instances by reference (constructor signature differs)\n if (typeof DataView !== \"undefined\" && obj instanceof DataView) {\n return obj;\n }\n // For TypedArrays, create a new instance with the same data\n const typedArray = obj as any;\n return new (typedArray.constructor as any)(typedArray);\n }\n\n // Preserve class instances (objects with non-Object/non-Array prototype)\n // This includes repository instances, custom classes, etc.\n if (!Array.isArray(obj)) {\n const proto = Object.getPrototypeOf(obj);\n if (proto !== Object.prototype && proto !== null) {\n return obj; // Pass by reference\n }\n }\n\n // Add object to visited set before recursing\n visited.add(obj);\n\n try {\n // Deep clone arrays, preserving class instances within\n if (Array.isArray(obj)) {\n return obj.map((item) => this.smartClone(item, visited));\n }\n\n // Deep clone plain objects\n const result: Record<string, any> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = this.smartClone(obj[key], visited);\n }\n }\n return result;\n } finally {\n // Remove from visited set after processing to allow the same object\n // in different branches (non-circular references)\n visited.delete(obj);\n }\n }\n\n /**\n * Sets the default input values for the task\n *\n * @param defaults The default input values to set\n */\n public setDefaults(defaults: Record<string, any>): void {\n // Strip symbol properties (like [$JSONSchema]) before storing defaults\n this.defaults = this.stripSymbols(defaults) as Record<string, any>;\n }\n\n /**\n * Sets input values for the task\n *\n * @param input Input values to set\n */\n public setInput(input: Record<string, any>): void {\n const schema = this.inputSchema();\n if (typeof schema === \"boolean\") {\n if (schema === true) {\n for (const [inputId, value] of Object.entries(input)) {\n if (value !== undefined) {\n this.runInputData[inputId] = value;\n }\n }\n }\n return;\n }\n const properties = schema.properties || {};\n\n // Copy explicitly defined properties\n for (const [inputId, prop] of Object.entries(properties)) {\n if (input[inputId] !== undefined) {\n this.runInputData[inputId] = input[inputId];\n } else if (this.runInputData[inputId] === undefined && (prop as any).default !== undefined) {\n this.runInputData[inputId] = (prop as any).default;\n }\n }\n\n // If additionalProperties is true, also copy any additional input properties\n if (schema.additionalProperties) {\n for (const [inputId, value] of Object.entries(input)) {\n if (!(inputId in properties)) {\n this.runInputData[inputId] = value;\n }\n }\n }\n }\n\n /**\n * Adds/merges input data during graph execution.\n * Unlike {@link setInput}, this method:\n * - Detects changes using deep equality\n * - Accumulates array values (appends rather than replaces)\n * - Handles DATAFLOW_ALL_PORTS for pass-through\n * - Handles additionalProperties for dynamic schemas\n *\n * @param overrides The input data to merge\n * @returns true if any input data was changed, false otherwise\n */\n public addInput(overrides: Partial<Input> | undefined): boolean {\n if (!overrides) return false;\n\n let changed = false;\n const inputSchema = this.inputSchema();\n\n if (typeof inputSchema === \"boolean\") {\n if (inputSchema === false) {\n return false;\n }\n // Schema is `true` - accept any input\n for (const [key, value] of Object.entries(overrides)) {\n if (!deepEqual(this.runInputData[key], value)) {\n this.runInputData[key] = value;\n changed = true;\n }\n }\n return changed;\n }\n\n const properties = inputSchema.properties || {};\n\n for (const [inputId, prop] of Object.entries(properties)) {\n if (inputId === DATAFLOW_ALL_PORTS) {\n this.runInputData = { ...this.runInputData, ...overrides };\n changed = true;\n } else {\n if (overrides[inputId] === undefined) continue;\n const isArray =\n (prop as any)?.type === \"array\" ||\n ((prop as any)?.type === \"any\" &&\n (Array.isArray(overrides[inputId]) || Array.isArray(this.runInputData[inputId])));\n\n if (isArray) {\n const existingItems = Array.isArray(this.runInputData[inputId])\n ? this.runInputData[inputId]\n : this.runInputData[inputId] !== undefined\n ? [this.runInputData[inputId]]\n : [];\n const newitems = [...existingItems];\n\n const overrideItem = overrides[inputId];\n if (Array.isArray(overrideItem)) {\n newitems.push(...overrideItem);\n } else {\n newitems.push(overrideItem);\n }\n this.runInputData[inputId] = newitems;\n changed = true;\n } else {\n if (!deepEqual(this.runInputData[inputId], overrides[inputId])) {\n this.runInputData[inputId] = overrides[inputId];\n changed = true;\n }\n }\n }\n }\n\n // If additionalProperties is true, also accept any additional input properties\n if (inputSchema.additionalProperties) {\n for (const [inputId, value] of Object.entries(overrides)) {\n if (!(inputId in properties)) {\n if (!deepEqual(this.runInputData[inputId], value)) {\n this.runInputData[inputId] = value;\n changed = true;\n }\n }\n }\n }\n\n return changed;\n }\n\n /**\n * Stub for narrowing input. Override in subclasses for custom logic.\n * @param input The input to narrow\n * @param _registry Optional service registry for lookups\n * @returns The (possibly narrowed) input\n */\n public async narrowInput(\n input: Record<string, any>,\n _registry: ServiceRegistry\n ): Promise<Record<string, any>> {\n return input;\n }\n\n // ========================================================================\n // Event handling methods\n // ========================================================================\n\n /**\n * Subscribes to an event\n */\n public subscribe<Event extends TaskEvents>(\n name: Event,\n fn: TaskEventListener<Event>\n ): () => void {\n return this.events.subscribe(name, fn);\n }\n\n /**\n * Registers an event listener\n */\n public on<Event extends TaskEvents>(name: Event, fn: TaskEventListener<Event>): void {\n this.events.on(name, fn);\n }\n\n /**\n * Removes an event listener\n */\n public off<Event extends TaskEvents>(name: Event, fn: TaskEventListener<Event>): void {\n this.events.off(name, fn);\n }\n\n /**\n * Registers a one-time event listener\n */\n public once<Event extends TaskEvents>(name: Event, fn: TaskEventListener<Event>): void {\n this.events.once(name, fn);\n }\n\n /**\n * Returns a promise that resolves when the specified event is emitted\n */\n public waitOn<Event extends TaskEvents>(name: Event): Promise<TaskEventParameters<Event>> {\n return this.events.waitOn(name) as Promise<TaskEventParameters<Event>>;\n }\n\n /**\n * Emits an event\n */\n public emit<Event extends TaskEvents>(name: Event, ...args: TaskEventParameters<Event>): void {\n // Route through `events` so the emitter exists: `this._events?.emit` dropped progress when\n // nothing had accessed `task.events` yet (e.g. parent MapTask before CLI wired listeners).\n this.events.emit(name, ...args);\n }\n\n /**\n * Emits a schemaChange event when the task's input or output schema changes.\n * This should be called by tasks with dynamic schemas when their configuration\n * changes in a way that affects their schemas.\n *\n * @param inputSchema - The new input schema (optional, will use current schema if not provided)\n * @param outputSchema - The new output schema (optional, will use current schema if not provided)\n */\n protected emitSchemaChange(inputSchema?: DataPortSchema, outputSchema?: DataPortSchema): void {\n const finalInputSchema = inputSchema ?? this.inputSchema();\n const finalOutputSchema = outputSchema ?? this.outputSchema();\n this.emit(\"schemaChange\", finalInputSchema, finalOutputSchema);\n }\n\n // ========================================================================\n // Input validation methods\n // ========================================================================\n\n /**\n * Gets the compiled config schema node, or undefined if no configSchema is defined.\n *\n * The compiled schema is cached directly on the concrete class object (not in a shared\n * inherited Map) so that each subclass always uses its own configSchema() result.\n * A shared Map keyed only by type name can be poisoned if a different class computes\n * and caches the schema first — e.g., due to cross-package static-method resolution\n * inconsistencies in bundled outputs.\n */\n private static getConfigSchemaNode(): SchemaNode | undefined {\n const schema = this.configSchema();\n if (!schema) return undefined;\n // Use Object.hasOwn so each class gets its own entry rather than inheriting\n // from a parent class that already cached under the same key.\n if (!Object.hasOwn(this, \"__compiledConfigSchema\")) {\n try {\n const schemaNode =\n typeof schema === \"boolean\"\n ? compileSchema(schema ? {} : { not: {} })\n : compileSchema(schema);\n Object.defineProperty(this, \"__compiledConfigSchema\", {\n value: schemaNode,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n } catch (error) {\n console.warn(`Failed to compile config schema for ${this.type}:`, error);\n return undefined;\n }\n }\n return (this as any).__compiledConfigSchema as SchemaNode;\n }\n\n /**\n * Validates config against configSchema.\n * Returns config as-is; throws on validation errors.\n * Returns config as-is if no configSchema is defined.\n */\n private validateAndApplyConfigDefaults(config: Config): Config {\n const ctor = this.constructor as typeof Task;\n const schemaNode = ctor.getConfigSchemaNode();\n if (!schemaNode) return config;\n\n const result = schemaNode.validate(config);\n if (!result.valid) {\n const errorMessages = result.errors.map((e) => {\n const path = (e as any).data?.pointer || \"\";\n return `${e.message}${path ? ` (${path})` : \"\"}`;\n });\n throw new TaskConfigurationError(\n `[${ctor.name}] Configuration Error: ${errorMessages.join(\", \")}`\n );\n }\n\n return config;\n }\n\n protected static generateInputSchemaNode(schema: DataPortSchema) {\n if (typeof schema === \"boolean\") {\n if (schema === false) {\n return compileSchema({ not: {} });\n }\n return compileSchema({});\n }\n return compileSchema(schema);\n }\n\n /**\n * Gets the compiled input schema, cached per class (not in a shared inherited Map).\n * Uses Object.hasOwn so each subclass stores its own compiled schema and never\n * picks up a stale entry cached by a different class with the same type name.\n */\n protected static getInputSchemaNode(): SchemaNode {\n if (!Object.hasOwn(this, \"__compiledInputSchema\")) {\n const dataPortSchema = this.inputSchema();\n const schemaNode = this.generateInputSchemaNode(dataPortSchema);\n try {\n Object.defineProperty(this, \"__compiledInputSchema\", {\n value: schemaNode,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n } catch (error) {\n // If compilation fails, fall back to accepting any object structure\n // This is a safety net for schemas that json-schema-library can't compile\n console.warn(\n `Failed to compile input schema for ${this.type}, falling back to permissive validation:`,\n error\n );\n Object.defineProperty(this, \"__compiledInputSchema\", {\n value: compileSchema({}),\n writable: true,\n configurable: true,\n enumerable: false,\n });\n }\n }\n return (this as any).__compiledInputSchema as SchemaNode;\n }\n\n protected getInputSchemaNode(): SchemaNode {\n return (this.constructor as typeof Task).getInputSchemaNode();\n }\n\n /**\n * Validates an input data object against the task's input schema\n */\n public async validateInput(input: Partial<Input>): Promise<boolean> {\n const ctor = this.constructor as typeof Task;\n let schemaNode: SchemaNode;\n if (ctor.hasDynamicSchemas) {\n // Dynamic-schema tasks use instance inputSchema() (e.g. config.inputSchema), not the static fallback.\n // The cached getInputSchemaNode uses static inputSchema() which would reject valid instance-specific inputs.\n const instanceSchema = this.inputSchema();\n schemaNode = ctor.generateInputSchemaNode(instanceSchema);\n } else {\n schemaNode = this.getInputSchemaNode();\n }\n const result = schemaNode.validate(input);\n\n if (!result.valid) {\n const errorMessages = result.errors.map((e) => {\n const path = e.data.pointer || \"\";\n return `${e.message}${path ? ` (${path})` : \"\"}`;\n });\n throw new TaskInvalidInputError(\n `Input ${JSON.stringify(Object.keys(input))} does not match schema: ${errorMessages.join(\", \")}`\n );\n }\n\n return true;\n }\n\n // ========================================================================\n // Serialization methods\n // ========================================================================\n\n /**\n * Strips symbol properties from an object to make it serializable\n * @param obj The object to strip symbols from\n * @returns A new object without symbol properties\n */\n private stripSymbols(obj: any): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n // Preserve TypedArrays (Float32Array, Int8Array, etc.)\n if (ArrayBuffer.isView(obj)) {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map((item) => this.stripSymbols(item));\n }\n if (typeof obj === \"object\") {\n const result: Record<string, any> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = this.stripSymbols(obj[key]);\n }\n }\n return result;\n }\n return obj;\n }\n\n /**\n * Serializes the task and its subtasks into a format that can be stored\n * @param _options Options controlling serialization (used by subclasses)\n * @returns The serialized task and subtasks\n */\n public toJSON(_options?: TaskGraphJsonOptions): TaskGraphItemJson {\n const ctor = this.constructor as typeof Task;\n\n // Build config by extracting only serializable properties defined in the configSchema.\n // We filter through the schema to avoid accidentally including non-serializable\n // values (e.g. functions like WhileTask.condition) or internal-only properties\n // that were never part of the serialized output and that consuming applications\n // don't expect (e.g. `queue` from JobQueueTask).\n const schema = ctor.configSchema();\n const schemaProperties =\n typeof schema !== \"boolean\" && schema?.properties\n ? (schema.properties as Record<string, Record<string, unknown>>)\n : {};\n\n const config: Record<string, unknown> = {};\n for (const [key, propSchema] of Object.entries(schemaProperties)) {\n if (key === \"id\") continue;\n // Skip internal properties marked as hidden (e.g. queue, compoundMerge)\n // except inputSchema/outputSchema/extras which are needed for task reconstruction\n if (\n propSchema?.[\"x-ui-hidden\"] === true &&\n key !== \"inputSchema\" &&\n key !== \"outputSchema\" &&\n key !== \"extras\"\n ) {\n continue;\n }\n const value = (this.config as Record<string, unknown>)[key];\n if (value === undefined) continue;\n // Skip non-serializable values (functions, symbols, etc.)\n if (typeof value === \"function\" || typeof value === \"symbol\") continue;\n config[key] = value;\n }\n\n // Omit title/description when they match the static class defaults\n if (config.title === ctor.title) delete config.title;\n if (config.description === ctor.description) delete config.description;\n\n // Omit empty extras\n const extras = config.extras as Record<string, unknown> | undefined;\n if (!extras || Object.keys(extras).length === 0) delete config.extras;\n\n const base: TaskGraphItemJson = {\n id: this.id,\n type: this.type,\n defaults: this.defaults,\n };\n if (Object.keys(config).length > 0) {\n base.config = config;\n }\n return this.stripSymbols(base) as TaskGraphItemJson;\n }\n\n /**\n * Converts the task to a JSON format suitable for dependency tracking\n * @param options Options controlling serialization (used by subclasses)\n * @returns The task and subtasks in JSON thats easier for humans to read\n */\n public toDependencyJSON(options?: TaskGraphJsonOptions): JsonTaskItem {\n const json = this.toJSON(options);\n return json;\n }\n\n // ========================================================================\n // Internal graph methods\n // ========================================================================\n\n /**\n * Checks if the task has children. Useful to gate to use of the internal subGraph\n * as this will return without creating a new graph if graph is non-existent .\n *\n * @returns True if the task has children, otherwise false\n */\n public hasChildren(): boolean {\n return (\n this._subGraph !== undefined &&\n this._subGraph !== null &&\n this._subGraph.getTasks().length > 0\n );\n }\n\n private _taskAddedListener: (taskId: TaskIdType) => void = () => {\n this.emit(\"regenerate\");\n };\n\n /**\n * The internal task graph containing subtasks\n *\n * In the base case, these may just be incidental tasks that are not part of the task graph\n * but are used to manage the task's state as part of task execution. Therefore, the graph\n * is not used by the default runner.\n */\n protected _subGraph: TaskGraph | undefined = undefined;\n\n /**\n * Sets the subtask graph for the compound task\n * @param subGraph The subtask graph to set\n */\n set subGraph(subGraph: TaskGraph) {\n if (this._subGraph) {\n this._subGraph.off(\"task_added\", this._taskAddedListener);\n }\n this._subGraph = subGraph;\n this._subGraph.on(\"task_added\", this._taskAddedListener);\n }\n\n /**\n * The internal task graph containing subtasks\n *\n * In the base case, these may just be incidental tasks that are not part of the task graph\n * but are used to manage the task's state as part of task execution. Therefore, the graph\n * is not used by the default runner.\n *\n * Creates a new graph if one doesn't exist.\n *\n * @returns The task graph\n */\n get subGraph(): TaskGraph {\n if (!this._subGraph) {\n this._subGraph = new TaskGraph();\n this._subGraph.on(\"task_added\", this._taskAddedListener);\n }\n return this._subGraph;\n }\n\n /**\n * Regenerates the task graph, which is internal state to execute() with config.own()\n *\n * This is a destructive operation that removes all dataflows and tasks from the graph.\n * It is used to reset the graph to a clean state.\n *\n * GraphAsTask and others override this and do not call super\n */\n public regenerateGraph(): void {\n if (this.hasChildren()) {\n for (const dataflow of this.subGraph.getDataflows()) {\n this.subGraph.removeDataflow(dataflow);\n }\n for (const child of this.subGraph.getTasks()) {\n this.subGraph.removeTask(child.id);\n }\n }\n this.events.emit(\"regenerate\");\n }\n}\n",
|
|
14
14
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Comparison operators supported by the UI condition builder.\n */\nexport type ComparisonOperator =\n | \"equals\"\n | \"not_equals\"\n | \"greater_than\"\n | \"greater_or_equal\"\n | \"less_than\"\n | \"less_or_equal\"\n | \"contains\"\n | \"starts_with\"\n | \"ends_with\"\n | \"is_empty\"\n | \"is_not_empty\"\n | \"is_true\"\n | \"is_false\";\n\n/**\n * Serialized condition branch configuration from the UI builder.\n * Used by ConditionalTask to auto-build runtime condition functions.\n */\nexport interface UIConditionBranch {\n id: string;\n field: string;\n operator: ComparisonOperator;\n value: string;\n}\n\n/**\n * Serialized condition configuration from the UI builder.\n * Used by ConditionalTask to auto-build runtime branch configs.\n */\nexport interface UIConditionConfig {\n branches: UIConditionBranch[];\n exclusive: boolean;\n defaultBranch?: string;\n}\n\n/**\n * Evaluates a condition based on operator type.\n *\n * @param fieldValue - The value of the field being tested\n * @param operator - The comparison operator to apply\n * @param compareValue - The value to compare against (always a string from the UI)\n * @returns true if the condition is met, false otherwise\n */\nexport function evaluateCondition(\n fieldValue: unknown,\n operator: ComparisonOperator,\n compareValue: string\n): boolean {\n // Handle null/undefined\n if (fieldValue === null || fieldValue === undefined) {\n switch (operator) {\n case \"is_empty\":\n return true;\n case \"is_not_empty\":\n return false;\n case \"is_true\":\n return false;\n case \"is_false\":\n return true;\n default:\n return false;\n }\n }\n\n const strValue = String(fieldValue);\n const numValue = Number(fieldValue);\n\n switch (operator) {\n case \"equals\":\n // Try numeric comparison first, then string\n if (!isNaN(numValue) && !isNaN(Number(compareValue))) {\n return numValue === Number(compareValue);\n }\n return strValue === compareValue;\n\n case \"not_equals\":\n if (!isNaN(numValue) && !isNaN(Number(compareValue))) {\n return numValue !== Number(compareValue);\n }\n return strValue !== compareValue;\n\n case \"greater_than\":\n return numValue > Number(compareValue);\n\n case \"greater_or_equal\":\n return numValue >= Number(compareValue);\n\n case \"less_than\":\n return numValue < Number(compareValue);\n\n case \"less_or_equal\":\n return numValue <= Number(compareValue);\n\n case \"contains\":\n return strValue.toLowerCase().includes(compareValue.toLowerCase());\n\n case \"starts_with\":\n return strValue.toLowerCase().startsWith(compareValue.toLowerCase());\n\n case \"ends_with\":\n return strValue.toLowerCase().endsWith(compareValue.toLowerCase());\n\n case \"is_empty\":\n return strValue === \"\" || (Array.isArray(fieldValue) && fieldValue.length === 0);\n\n case \"is_not_empty\":\n return strValue !== \"\" && !(Array.isArray(fieldValue) && fieldValue.length === 0);\n\n case \"is_true\":\n return Boolean(fieldValue) === true;\n\n case \"is_false\":\n return Boolean(fieldValue) === false;\n\n default:\n return false;\n }\n}\n\n/**\n * Get a value from a nested object using dot notation.\n * e.g., \"user.name\" would get obj.user.name\n *\n * @param obj - The object to read from\n * @param path - Dot-separated path to the value\n * @returns The value at the path, or undefined if any segment is missing\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n",
|
|
15
15
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { getLogger, type DataPortSchema } from \"@workglow/util\";\nimport { evaluateCondition, getNestedValue, type UIConditionConfig } from \"./ConditionUtils\";\nimport type { IExecuteContext } from \"./ITask\";\nimport { Task } from \"./Task\";\nimport {\n TaskConfigSchema,\n type TaskConfig,\n type TaskInput,\n type TaskOutput,\n type TaskTypeName,\n} from \"./TaskTypes\";\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\n/**\n * A predicate function that evaluates whether a branch condition is met.\n * Receives the task's input data and returns true if the branch should be active.\n *\n * @template Input - The input type for the conditional task\n * @param input - The input data to evaluate\n * @returns true if the branch condition is met, false otherwise\n *\n * @example\n * ```typescript\n * // Simple numeric comparison\n * const isHighValue: ConditionFn<{ value: number }> = (input) => input.value > 100;\n *\n * // String equality check\n * const isAdmin: ConditionFn<{ role: string }> = (input) => input.role === \"admin\";\n *\n * // Complex boolean logic\n * const isEligible: ConditionFn<{ age: number; verified: boolean }> = (input) =>\n * input.age >= 18 && input.verified;\n * ```\n */\nexport type ConditionFn<Input> = (input: Input) => boolean;\n\n/**\n * Configuration for a single branch in a ConditionalTask.\n *\n * Each branch represents a possible path through the conditional logic.\n * When the condition evaluates to true, the branch becomes active and\n * its output port will receive the task's input data.\n *\n * @template Input - The input type for the conditional task\n *\n * @example\n * ```typescript\n * const highValueBranch: BranchConfig<{ amount: number }> = {\n * id: \"high\",\n * condition: (input) => input.amount > 1000,\n * outputPort: \"highValue\"\n * };\n * ```\n */\nexport interface BranchConfig<Input> {\n /** Unique identifier for this branch within the task */\n readonly id: string;\n\n /** Predicate function that determines if this branch is active */\n readonly condition: ConditionFn<Input>;\n\n /** Name of the output port that will receive data when this branch is active */\n readonly outputPort: string;\n}\n\n/**\n * Configuration interface for ConditionalTask.\n *\n * Extends the base TaskConfig with conditional-specific options including\n * branch definitions, default branch handling, and execution mode.\n *\n * @example\n * ```typescript\n * const config: ConditionalTaskConfig = {\n * id: \"router\",\n * branches: [\n * { id: \"premium\", condition: (i) => i.tier === \"premium\", outputPort: \"premium\" },\n * { id: \"standard\", condition: (i) => i.tier === \"standard\", outputPort: \"standard\" },\n * ],\n * defaultBranch: \"standard\",\n * exclusive: true, // Only first matching branch activates\n * };\n * ```\n */\nexport const conditionalTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n branches: { type: \"array\", items: {} },\n defaultBranch: { type: \"string\" },\n exclusive: { type: \"boolean\" },\n conditionConfig: { type: \"object\", additionalProperties: true },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type ConditionalTaskConfig = TaskConfig & {\n /** Branches may contain ConditionFn functions — not JSON-schema-representable */\n readonly branches?: BranchConfig<any>[];\n readonly defaultBranch?: string;\n readonly exclusive?: boolean;\n /** Serializable UI condition configuration used to build branches at runtime. */\n readonly conditionConfig?: UIConditionConfig;\n};\n\n// ============================================================================\n// ConditionalTask Class\n// ============================================================================\n\n/**\n * A task that evaluates conditions to determine which downstream paths are active.\n *\n * ConditionalTask implements conditional branching within a task graph, similar to\n * if/then/else or switch/case statements. It evaluates configured conditions against\n * its input and selectively enables output ports for active branches while disabling\n * dataflows to inactive branches.\n *\n * ## Key Features\n *\n * - **Condition-based routing**: Route data to different downstream tasks based on input values\n * - **Exclusive mode**: Act as a switch/case where only the first matching branch activates\n * - **Multi-path mode**: Enable multiple branches simultaneously when conditions match\n * - **Default branch**: Specify a fallback branch when no conditions match\n * - **Disabled propagation**: Inactive branches result in DISABLED status for downstream tasks\n *\n * ## Execution Modes\n *\n * ### Exclusive Mode (default)\n * In exclusive mode (`exclusive: true`), the task behaves like a switch statement.\n * Branches are evaluated in order, and only the first matching branch becomes active.\n * This is useful for mutually exclusive paths.\n *\n * ### Multi-Path Mode\n * In multi-path mode (`exclusive: false`), all branches whose conditions evaluate\n * to true become active simultaneously. This enables fan-out patterns where the\n * same input triggers multiple downstream processing paths.\n *\n * ## Output Behavior\n *\n * For each active branch, the task passes through its entire input to that branch's\n * output port. Inactive branches receive no data, and their outgoing dataflows are\n * set to DISABLED status, which cascades to downstream tasks that have no other\n * active inputs.\n *\n * @template Input - The input type for the task\n * @template Output - The output type for the task\n * @template Config - The configuration type (must extend ConditionalTaskConfig)\n *\n * @example\n * ```typescript\n * // Simple if/else routing based on a numeric threshold\n * const thresholdRouter = new ConditionalTask(\n * {},\n * {\n * branches: [\n * { id: \"high\", condition: (i) => i.value > 100, outputPort: \"highPath\" },\n * { id: \"low\", condition: (i) => i.value <= 100, outputPort: \"lowPath\" },\n * ],\n * }\n * );\n *\n * // Switch/case style routing based on string enum\n * const statusRouter = new ConditionalTask(\n * {},\n * {\n * branches: [\n * { id: \"active\", condition: (i) => i.status === \"active\", outputPort: \"active\" },\n * { id: \"pending\", condition: (i) => i.status === \"pending\", outputPort: \"pending\" },\n * { id: \"inactive\", condition: (i) => i.status === \"inactive\", outputPort: \"inactive\" },\n * ],\n * defaultBranch: \"inactive\",\n * exclusive: true,\n * }\n * );\n *\n * // Multi-path fan-out for parallel processing\n * const fanOut = new ConditionalTask(\n * {},\n * {\n * branches: [\n * { id: \"log\", condition: () => true, outputPort: \"logger\" },\n * { id: \"process\", condition: () => true, outputPort: \"processor\" },\n * { id: \"archive\", condition: (i) => i.shouldArchive, outputPort: \"archiver\" },\n * ],\n * exclusive: false, // All matching branches activate\n * }\n * );\n * ```\n */\nexport class ConditionalTask<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends ConditionalTaskConfig = ConditionalTaskConfig,\n> extends Task<Input, Output, Config> {\n /** Task type identifier for serialization and registry lookup */\n static type: TaskTypeName = \"ConditionalTask\";\n\n /** Category for UI organization and filtering */\n static category = \"Flow Control\";\n\n /** Human-readable title for display in UIs */\n static title = \"Condition\";\n static description = \"Route data based on conditions\";\n\n /** This task has dynamic schemas that change based on branch configuration */\n static hasDynamicSchemas: boolean = true;\n\n public static configSchema(): DataPortSchema {\n return conditionalTaskConfigSchema;\n }\n\n /**\n * Set of branch IDs that are currently active after execution.\n * Populated during execute() and used by the graph runner to\n * determine which dataflows should be enabled vs disabled.\n */\n public activeBranches: Set<string> = new Set();\n\n // ========================================================================\n // Execution methods\n // ========================================================================\n\n /**\n * Evaluates branch conditions and determines which branches are active.\n * Only active branches will have their output ports populated.\n *\n * @param input - The input data to evaluate conditions against\n * @param context - Execution context with signal and progress callback\n * @returns Output with active branch data and metadata\n */\n /**\n * Builds runtime branch configs from serialized UI condition config.\n */\n private buildBranchesFromConditionConfig(\n conditionConfig: UIConditionConfig\n ): BranchConfig<Input>[] {\n if (!conditionConfig?.branches || conditionConfig.branches.length === 0) {\n return [\n {\n id: \"default\",\n condition: () => true,\n outputPort: \"1\",\n },\n ];\n }\n\n return conditionConfig.branches.map((branch, index) => ({\n id: branch.id,\n outputPort: String(index + 1),\n condition: (inputData: Input): boolean => {\n const fieldValue = getNestedValue(inputData as Record<string, unknown>, branch.field);\n return evaluateCondition(fieldValue, branch.operator, branch.value);\n },\n }));\n }\n\n /**\n * Resolves the effective branches to evaluate.\n * Uses config.branches if they have condition functions,\n * otherwise falls back to conditionConfig from input or extras.\n */\n private resolveBranches(input: Input): {\n branches: BranchConfig<Input>[];\n isExclusive: boolean;\n defaultBranch: string | undefined;\n fromConditionConfig: boolean;\n } {\n const configBranches = this.config.branches ?? [];\n\n // If config branches have condition functions, use them directly\n if (configBranches.length > 0 && typeof configBranches[0].condition === \"function\") {\n return {\n branches: configBranches,\n isExclusive: this.config.exclusive ?? true,\n defaultBranch: this.config.defaultBranch,\n fromConditionConfig: false,\n };\n }\n\n // Try to find serialized conditionConfig from input or config\n const conditionConfig =\n ((input as Record<string, unknown>).conditionConfig as UIConditionConfig | undefined) ??\n this.config.conditionConfig;\n\n if (conditionConfig) {\n return {\n branches: this.buildBranchesFromConditionConfig(conditionConfig),\n isExclusive: conditionConfig.exclusive ?? true,\n defaultBranch: conditionConfig.defaultBranch,\n fromConditionConfig: true,\n };\n }\n\n // Fallback: use config branches even if they lack conditions\n return {\n branches: configBranches,\n isExclusive: this.config.exclusive ?? true,\n defaultBranch: this.config.defaultBranch,\n fromConditionConfig: false,\n };\n }\n\n public async execute(input: Input, context: IExecuteContext): Promise<Output | undefined> {\n if (context.signal?.aborted) {\n return undefined;\n }\n\n // Clear previous branch activation state\n this.activeBranches.clear();\n\n const { branches, isExclusive, defaultBranch, fromConditionConfig } =\n this.resolveBranches(input);\n\n // Evaluate each branch condition\n for (const branch of branches) {\n try {\n const isActive = branch.condition(input);\n if (isActive) {\n this.activeBranches.add(branch.id);\n if (isExclusive) {\n // In exclusive mode, stop at first match\n break;\n }\n }\n } catch (error) {\n // If condition throws, treat it as false (branch not taken)\n getLogger().warn(`Condition evaluation failed for branch \"${branch.id}\":`, { error });\n }\n }\n\n // If no branch matched and there's a default, use it\n if (this.activeBranches.size === 0 && defaultBranch) {\n const defaultBranchExists = branches.some((b) => b.id === defaultBranch);\n if (defaultBranchExists) {\n this.activeBranches.add(defaultBranch);\n }\n }\n\n // Build output: if from conditionConfig, use the UI-style output building\n if (fromConditionConfig) {\n return this.buildConditionConfigOutput(input, branches, isExclusive);\n }\n\n // Build output: pass through input to active branch ports\n return this.buildOutput(input);\n }\n\n /**\n * Builds output in the UI-style format where inputs are passed through\n * with numbered suffixes based on matched branches.\n */\n protected buildConditionConfigOutput(\n input: Input,\n branches: BranchConfig<Input>[],\n isExclusive: boolean\n ): Output {\n const output: Record<string, unknown> = {};\n\n // Remove conditionConfig from pass-through data\n const { conditionConfig, ...passThrough } = input as Record<string, unknown>;\n const inputKeys = Object.keys(passThrough);\n\n // Find matched branch number\n let matchedBranchNumber: number | null = null;\n for (let i = 0; i < branches.length; i++) {\n if (this.activeBranches.has(branches[i].id)) {\n if (matchedBranchNumber === null) {\n matchedBranchNumber = i + 1;\n }\n }\n }\n\n if (isExclusive) {\n if (matchedBranchNumber !== null) {\n for (const key of inputKeys) {\n output[`${key}_${matchedBranchNumber}`] = passThrough[key];\n }\n } else {\n for (const key of inputKeys) {\n output[`${key}_else`] = passThrough[key];\n }\n }\n } else {\n for (let i = 0; i < branches.length; i++) {\n if (this.activeBranches.has(branches[i].id)) {\n for (const key of inputKeys) {\n output[`${key}_${i + 1}`] = passThrough[key];\n }\n }\n }\n }\n\n return output as Output;\n }\n\n /**\n * Builds the output object with data routed to active branch ports.\n * Each active branch's output port receives the full input data.\n *\n * @param input - The input data to pass through to active branches\n * @returns Output object with active branch ports populated\n */\n protected buildOutput(input: Input): Output {\n const output: Record<string, unknown> = {\n _activeBranches: Array.from(this.activeBranches),\n };\n\n const branches = this.config.branches ?? [];\n\n // For each active branch, populate its output port with the input data\n for (const branch of branches) {\n if (this.activeBranches.has(branch.id)) {\n // Pass through all input properties to the active branch's output port\n output[branch.outputPort] = { ...input };\n }\n }\n\n return output as Output;\n }\n\n // ========================================================================\n // Branch information methods\n // ========================================================================\n\n /**\n * Checks if a specific branch is currently active.\n *\n * @param branchId - The ID of the branch to check\n * @returns true if the branch is active, false otherwise\n *\n * @example\n * ```typescript\n * await conditionalTask.run({ value: 150 });\n * if (conditionalTask.isBranchActive(\"high\")) {\n * console.log(\"High value path was taken\");\n * }\n * ```\n */\n public isBranchActive(branchId: string): boolean {\n return this.activeBranches.has(branchId);\n }\n\n /**\n * Gets the set of currently active branch IDs.\n * Returns a new Set to prevent external modification.\n *\n * @returns Set of active branch IDs\n */\n public getActiveBranches(): Set<string> {\n return new Set(this.activeBranches);\n }\n\n /**\n * Gets a map of output port names to their active status.\n * Useful for inspecting which output ports will have data.\n *\n * @returns Map of output port name to boolean active status\n *\n * @example\n * ```typescript\n * const portStatus = conditionalTask.getPortActiveStatus();\n * for (const [port, isActive] of portStatus) {\n * console.log(`Port ${port}: ${isActive ? \"active\" : \"inactive\"}`);\n * }\n * ```\n */\n public getPortActiveStatus(): Map<string, boolean> {\n const status = new Map<string, boolean>();\n const branches = this.config.branches ?? [];\n\n for (const branch of branches) {\n status.set(branch.outputPort, this.activeBranches.has(branch.id));\n }\n\n return status;\n }\n\n // ========================================================================\n // Schema methods\n // ========================================================================\n\n /**\n * Generates the output schema dynamically based on configured branches.\n * Each branch's output port is defined as an object type that will\n * receive the pass-through input data when active.\n *\n * @returns JSON Schema for the task's output\n */\n static outputSchema(): DataPortSchema {\n // Base schema - actual properties are determined by branch configuration\n return {\n type: \"object\",\n properties: {\n _activeBranches: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of active branch IDs after condition evaluation\",\n },\n },\n additionalProperties: true,\n } as const satisfies DataPortSchema;\n }\n\n /**\n * Instance method to get output schema with branch-specific ports.\n * Dynamically generates properties based on the configured branches.\n *\n * @returns JSON Schema for the task's output including branch ports\n */\n outputSchema(): DataPortSchema {\n const branches = this.config?.branches ?? [];\n const properties: Record<string, any> = {\n _activeBranches: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of active branch IDs after condition evaluation\",\n },\n };\n\n // Add each branch's output port to the schema\n for (const branch of branches) {\n properties[branch.outputPort] = {\n type: \"object\",\n description: `Output for branch \"${branch.id}\" when active`,\n additionalProperties: true,\n };\n }\n\n return {\n type: \"object\",\n properties,\n additionalProperties: false,\n } as DataPortSchema;\n }\n\n /**\n * Returns schema indicating the task accepts any input.\n * ConditionalTask passes through its input to active branches,\n * so it doesn't constrain the input type.\n *\n * @returns Schema that accepts any input\n */\n static inputSchema(): DataPortSchema {\n return {\n type: \"object\",\n properties: {},\n additionalProperties: true,\n } as const satisfies DataPortSchema;\n }\n\n /**\n * Instance method returning schema that accepts any input.\n *\n * @returns Schema that accepts any input\n */\n inputSchema(): DataPortSchema {\n return {\n type: \"object\",\n properties: {},\n additionalProperties: true,\n } as const satisfies DataPortSchema;\n }\n}\n",
|
|
16
16
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ITask } from \"../task/ITask\";\nimport { getPortStreamMode } from \"../task/StreamTypes\";\nimport { TaskStatus } from \"../task/TaskTypes\";\nimport { TaskGraph } from \"./TaskGraph\";\n\n/**\n * Interface for task graph schedulers\n */\nexport interface ITaskGraphScheduler {\n /**\n * Gets an async iterator of tasks that can be executed\n * @returns AsyncIterator of tasks that resolves to each task when it's ready\n */\n tasks(): AsyncIterableIterator<ITask>;\n\n /**\n * Notifies the scheduler that a task has completed\n * @param taskId The ID of the completed task\n */\n onTaskCompleted(taskId: unknown): void;\n\n /**\n * Notifies the scheduler that a task has begun streaming output.\n * Streaming tasks may unblock downstream streamable tasks early.\n * @param taskId The ID of the streaming task\n */\n onTaskStreaming(taskId: unknown): void;\n\n /**\n * Resets the scheduler state\n */\n reset(): void;\n}\n\n/**\n * Sequential scheduler that executes one task at a time in topological order\n * Useful for debugging and understanding task execution flow\n */\nexport class TopologicalScheduler implements ITaskGraphScheduler {\n private sortedNodes: ITask[];\n private currentIndex: number;\n\n constructor(private dag: TaskGraph) {\n this.sortedNodes = [];\n this.currentIndex = 0;\n this.reset();\n }\n\n async *tasks(): AsyncIterableIterator<ITask> {\n while (this.currentIndex < this.sortedNodes.length) {\n yield this.sortedNodes[this.currentIndex++];\n }\n }\n\n onTaskCompleted(taskId: unknown): void {\n // Topological scheduler doesn't need to track individual task completion\n }\n\n onTaskStreaming(taskId: unknown): void {\n // Topological scheduler doesn't support streaming-aware scheduling\n }\n\n reset(): void {\n this.sortedNodes = this.dag.topologicallySortedNodes();\n this.currentIndex = 0;\n }\n}\n\n/**\n * Event-driven scheduler that executes tasks as soon as their dependencies are satisfied\n * Most efficient for parallel execution but requires completion notifications\n */\nexport class DependencyBasedScheduler implements ITaskGraphScheduler {\n private completedTasks: Set<unknown>;\n private streamingTasks: Set<unknown>;\n private pendingTasks: Set<ITask>;\n private nextResolver: ((task: ITask | null) => void) | null = null;\n\n constructor(private dag: TaskGraph) {\n this.completedTasks = new Set();\n this.streamingTasks = new Set();\n this.pendingTasks = new Set();\n this.reset();\n }\n\n private isTaskReady(task: ITask): boolean {\n // DISABLED tasks are never ready - they should be skipped\n if (task.status === TaskStatus.DISABLED) {\n return false;\n }\n\n const sourceDataflows = this.dag.getSourceDataflows(task.id);\n\n // If task has incoming dataflows, check if all are DISABLED\n // (In that case, task will be disabled by propagateDisabledStatus, not ready to run)\n if (sourceDataflows.length > 0) {\n const allIncomingDisabled = sourceDataflows.every((df) => df.status === TaskStatus.DISABLED);\n if (allIncomingDisabled) {\n return false;\n }\n }\n\n // A task is ready if all its non-disabled dependencies are completed.\n // DISABLED dataflows are considered \"satisfied\" (their branch was not taken).\n //\n // Per-edge streaming: when the source output port AND the target input port\n // both declare matching `x-stream`, the dependency can be satisfied by\n // STREAMING status (not just COMPLETED). Edges where the target port does\n // NOT accept streams still require full completion.\n const activeDataflows = sourceDataflows.filter((df) => df.status !== TaskStatus.DISABLED);\n\n return activeDataflows.every((df) => {\n const depId = df.sourceTaskId;\n if (this.completedTasks.has(depId)) return true;\n\n // Check if this specific edge supports stream pass-through\n if (this.streamingTasks.has(depId)) {\n const sourceTask = this.dag.getTask(depId);\n if (sourceTask) {\n const sourceMode = getPortStreamMode(sourceTask.outputSchema(), df.sourceTaskPortId);\n const targetMode = getPortStreamMode(task.inputSchema(), df.targetTaskPortId);\n if (sourceMode !== \"none\" && sourceMode === targetMode) {\n return true;\n }\n }\n }\n\n return false;\n });\n }\n\n private async waitForNextTask(): Promise<ITask | null> {\n if (this.pendingTasks.size === 0) return null;\n\n // Remove any disabled tasks from pending (they were disabled by propagateDisabledStatus)\n for (const task of Array.from(this.pendingTasks)) {\n if (task.status === TaskStatus.DISABLED) {\n this.pendingTasks.delete(task);\n }\n }\n\n if (this.pendingTasks.size === 0) return null;\n\n const readyTask = Array.from(this.pendingTasks).find((task) => this.isTaskReady(task));\n if (readyTask) {\n this.pendingTasks.delete(readyTask);\n return readyTask;\n }\n\n // If there are pending tasks but none are ready, wait for task completion\n if (this.pendingTasks.size > 0) {\n return new Promise((resolve) => {\n this.nextResolver = resolve;\n });\n }\n\n return null;\n }\n\n async *tasks(): AsyncIterableIterator<ITask> {\n while (this.pendingTasks.size > 0) {\n const task = await this.waitForNextTask();\n if (task) {\n yield task;\n } else {\n break;\n }\n }\n }\n\n onTaskCompleted(taskId: unknown): void {\n this.completedTasks.add(taskId);\n\n // Remove any disabled tasks from pending\n for (const task of Array.from(this.pendingTasks)) {\n if (task.status === TaskStatus.DISABLED) {\n this.pendingTasks.delete(task);\n }\n }\n\n // Check if any pending tasks are now ready\n if (this.nextResolver) {\n const readyTask = Array.from(this.pendingTasks).find((task) => this.isTaskReady(task));\n if (readyTask) {\n this.pendingTasks.delete(readyTask);\n const resolver = this.nextResolver;\n this.nextResolver = null;\n resolver(readyTask);\n } else if (this.pendingTasks.size === 0) {\n // No more pending tasks - resolve with null to signal completion\n const resolver = this.nextResolver;\n this.nextResolver = null;\n resolver(null);\n }\n }\n }\n\n onTaskStreaming(taskId: unknown): void {\n this.streamingTasks.add(taskId);\n\n // Remove any disabled tasks from pending\n for (const task of Array.from(this.pendingTasks)) {\n if (task.status === TaskStatus.DISABLED) {\n this.pendingTasks.delete(task);\n }\n }\n\n // Check if any pending streamable tasks are now ready\n // (they can start when deps are STREAMING, not just COMPLETED)\n if (this.nextResolver) {\n const readyTask = Array.from(this.pendingTasks).find((task) => this.isTaskReady(task));\n if (readyTask) {\n this.pendingTasks.delete(readyTask);\n const resolver = this.nextResolver;\n this.nextResolver = null;\n resolver(readyTask);\n }\n }\n }\n\n reset(): void {\n this.completedTasks.clear();\n this.streamingTasks.clear();\n this.pendingTasks = new Set(this.dag.topologicallySortedNodes());\n this.nextResolver = null;\n }\n}\n",
|
|
17
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n collectPropertyValues,\n ConvertAllToOptionalArray,\n getLogger,\n getTelemetryProvider,\n globalServiceRegistry,\n ServiceRegistry,\n SpanStatusCode,\n uuid4,\n type ISpan,\n} from \"@workglow/util\";\nimport { TASK_OUTPUT_REPOSITORY, TaskOutputRepository } from \"../storage/TaskOutputRepository\";\nimport { ConditionalTask } from \"../task/ConditionalTask\";\nimport { ITask } from \"../task/ITask\";\nimport {\n edgeNeedsAccumulation,\n getOutputStreamMode,\n getStreamingPorts,\n isTaskStreamable,\n type StreamEvent,\n} from \"../task/StreamTypes\";\nimport { Task } from \"../task/Task\";\nimport { TaskAbortedError, TaskConfigurationError, TaskError } from \"../task/TaskError\";\nimport { TaskInput, TaskOutput, TaskStatus } from \"../task/TaskTypes\";\nimport { DATAFLOW_ALL_PORTS, DATAFLOW_ERROR_PORT } from \"./Dataflow\";\nimport { TaskGraph, TaskGraphRunConfig, TaskGraphRunReactiveConfig } from \"./TaskGraph\";\nimport { DependencyBasedScheduler, TopologicalScheduler } from \"./TaskGraphScheduler\";\n\nexport type GraphSingleTaskResult<T> = {\n id: unknown;\n type: String;\n data: T;\n};\nexport type GraphResultArray<T> = Array<GraphSingleTaskResult<T>>;\nexport type PropertyArrayGraphResult<T> = ConvertAllToOptionalArray<T>;\nexport type AnyGraphResult<T> = PropertyArrayGraphResult<T> | GraphResultArray<T>;\n\nexport const PROPERTY_ARRAY = \"PROPERTY_ARRAY\" as const;\nexport const GRAPH_RESULT_ARRAY = \"GRAPH_RESULT_ARRAY\" as const;\n\nexport type GraphResultMap<T> = {\n // array of results with id for tasks that created them -- output is an array of {id, type, data}[]\n [GRAPH_RESULT_ARRAY]: GraphResultArray<T>;\n // property-array -- output is consolidation of each output property, with duplicate properties turned into an array\n [PROPERTY_ARRAY]: PropertyArrayGraphResult<T>;\n};\n\n/**\n * Enum representing the possible compound merge strategies\n */\nexport type CompoundMergeStrategy = typeof PROPERTY_ARRAY | typeof GRAPH_RESULT_ARRAY;\n\nexport type GraphResult<\n Output,\n Merge extends CompoundMergeStrategy,\n> = GraphResultMap<Output>[Merge];\n\n/**\n * Class for running a task graph\n * Manages the execution of tasks in a task graph, including caching\n */\nexport class TaskGraphRunner {\n /**\n * Whether the task graph is currently running\n */\n protected running = false;\n protected reactiveRunning = false;\n\n /**\n * The task graph to run\n */\n public readonly graph: TaskGraph;\n\n /**\n * Output cache repository\n */\n protected outputCache?: TaskOutputRepository;\n /**\n * Whether leaf tasks (no outgoing edges) should accumulate their streaming\n * output. True by default so workflow return values are complete.\n */\n protected accumulateLeafOutputs: boolean = true;\n /**\n * Service registry for this graph run\n */\n protected registry: ServiceRegistry = globalServiceRegistry;\n /**\n * AbortController for cancelling graph execution\n */\n protected abortController: AbortController | undefined;\n\n /**\n * Maps to track task execution state\n */\n protected inProgressTasks: Map<unknown, Promise<TaskOutput>> = new Map();\n protected inProgressFunctions: Map<unknown, Promise<any>> = new Map();\n protected failedTaskErrors: Map<unknown, TaskError> = new Map();\n\n /**\n * Active telemetry span for the current graph run.\n */\n protected telemetrySpan?: ISpan;\n\n /**\n * Constructor for TaskGraphRunner\n * @param graph The task graph to run\n * @param outputCache The task output repository to use for caching task outputs\n * @param processScheduler The scheduler to use for task execution\n * @param reactiveScheduler The scheduler to use for reactive task execution\n */\n constructor(\n graph: TaskGraph,\n outputCache?: TaskOutputRepository,\n protected processScheduler = new DependencyBasedScheduler(graph),\n protected reactiveScheduler = new TopologicalScheduler(graph)\n ) {\n this.graph = graph;\n graph.outputCache = outputCache;\n this.handleProgress = this.handleProgress.bind(this);\n }\n\n /**\n * Unique ID for the current run, used for timing labels.\n */\n protected runId: string = \"\";\n\n // ========================================================================\n // Public methods\n // ========================================================================\n\n public async runGraph<ExecuteOutput extends TaskOutput>(\n input: TaskInput = {} as TaskInput,\n config?: TaskGraphRunConfig\n ): Promise<GraphResultArray<ExecuteOutput>> {\n await this.handleStart(config);\n\n const results: GraphResultArray<ExecuteOutput> = [];\n let error: TaskError | undefined;\n\n try {\n // TODO: A different graph runner may chunk tasks that are in parallel\n // rather them all currently available\n for await (const task of this.processScheduler.tasks()) {\n if (this.abortController?.signal.aborted) {\n break;\n }\n\n if (this.failedTaskErrors.size > 0) {\n break;\n }\n\n const isRootTask = this.graph.getSourceDataflows(task.id).length === 0;\n\n const runAsync = async () => {\n let errorRouted = false;\n try {\n // Only filter input for non-root tasks; root tasks get the full input\n const taskInput = isRootTask ? input : this.filterInputForTask(task, input);\n\n const taskPromise = this.runTask(task, taskInput);\n this.inProgressTasks!.set(task.id, taskPromise);\n const taskResult = await taskPromise;\n\n if (this.graph.getTargetDataflows(task.id).length === 0) {\n // we save the results of all the leaves\n results.push(taskResult as GraphSingleTaskResult<ExecuteOutput>);\n }\n } catch (error) {\n if (this.hasErrorOutputEdges(task)) {\n // Route the error through error-port dataflows instead of failing the graph.\n // pushErrorOutputToEdges sets edge statuses directly (COMPLETED for error\n // edges, DISABLED for normal edges), so we skip the normal status push.\n errorRouted = true;\n this.pushErrorOutputToEdges(task);\n } else {\n this.failedTaskErrors.set(task.id, error as TaskError);\n }\n } finally {\n // IMPORTANT: Push status to edges BEFORE notifying scheduler\n // This ensures dataflow statuses (including DISABLED) are set\n // before the scheduler checks which tasks are ready.\n // Skip normal status push when error routing already set edge statuses.\n if (!errorRouted) {\n this.pushStatusFromNodeToEdges(this.graph, task);\n this.pushErrorFromNodeToEdges(this.graph, task);\n }\n this.processScheduler.onTaskCompleted(task.id);\n }\n };\n\n // Start task execution without awaiting\n // so we can have many tasks running in parallel\n // but keep track of them to make sure they get awaited\n // otherwise, things will finish after this promise is resolved\n this.inProgressFunctions.set(Symbol(task.id as string), runAsync());\n }\n } catch (err) {\n error = err as Error;\n getLogger().error(\"Error running graph\", { error });\n }\n // Wait for all tasks to complete since we did not await runAsync()/this.runTaskWithProvenance()\n await Promise.allSettled(Array.from(this.inProgressTasks.values()));\n // Clean up stragglers to avoid unhandled promise rejections\n await Promise.allSettled(Array.from(this.inProgressFunctions.values()));\n\n if (this.failedTaskErrors.size > 0) {\n const latestError = this.failedTaskErrors.values().next().value!;\n this.handleError(latestError);\n throw latestError;\n }\n if (this.abortController?.signal.aborted) {\n await this.handleAbort();\n throw new TaskAbortedError();\n }\n\n await this.handleComplete();\n\n return results;\n }\n\n /**\n * Runs the task graph in a reactive manner\n * @param input Optional input to pass to root tasks (tasks with no incoming dataflows)\n * @param config Optional configuration for the reactive run. Supports overriding the\n * ServiceRegistry (`registry`), providing an output cache (`outputCache`), passing an\n * abort signal (`parentSignal`), and controlling whether streaming leaf task outputs are\n * accumulated into the return value (`accumulateLeafOutputs`).\n * @returns A promise that resolves when all tasks are complete\n * @throws TaskConfigurationError if the graph is already running reactively\n */\n public async runGraphReactive<Output extends TaskOutput>(\n input: TaskInput = {} as TaskInput,\n config?: TaskGraphRunReactiveConfig\n ): Promise<GraphResultArray<Output>> {\n await this.handleStartReactive(config);\n\n const results: GraphResultArray<Output> = [];\n try {\n for await (const task of this.reactiveScheduler.tasks()) {\n const isRootTask = this.graph.getSourceDataflows(task.id).length === 0;\n\n if (task.status === TaskStatus.PENDING) {\n task.resetInputData();\n this.copyInputFromEdgesToNode(task);\n // TODO: cacheable here??\n // if (task.cacheable) {\n // const results = await this.outputCache?.getOutput(\n // (task.constructor as any).type,\n // task.runInputData\n // );\n // if (results) {\n // task.runOutputData = results;\n // }\n // }\n }\n\n // For root tasks (no incoming dataflows), apply the input parameter\n // This is important for GraphAsTask subgraphs where the InputTask needs\n // to receive the parent's input values\n const taskInput = isRootTask ? input : {};\n\n const taskResult = await task.runReactive(taskInput);\n\n await this.pushOutputFromNodeToEdges(task, taskResult);\n if (this.graph.getTargetDataflows(task.id).length === 0) {\n results.push({\n id: task.id,\n type: (task.constructor as any).runtype || (task.constructor as any).type,\n data: taskResult as Output,\n });\n }\n }\n await this.handleCompleteReactive();\n return results;\n } catch (error) {\n await this.handleErrorReactive();\n throw error;\n }\n }\n\n /**\n * Aborts the task graph execution\n */\n public abort(): void {\n this.abortController?.abort();\n }\n\n /**\n * Disables the task graph execution\n */\n public async disable(): Promise<void> {\n await this.handleDisable();\n }\n\n /**\n * Filters graph-level input to only include properties that are not connected via dataflows for a given task\n * @param task The task to filter input for\n * @param input The graph-level input\n * @returns Filtered input containing only unconnected properties\n */\n protected filterInputForTask(task: ITask, input: TaskInput): TaskInput {\n // Get all inputs that are connected to this task via dataflows\n const sourceDataflows = this.graph.getSourceDataflows(task.id);\n const connectedInputs = new Set(sourceDataflows.map((df) => df.targetTaskPortId));\n\n // If DATAFLOW_ALL_PORTS (\"*\") is in the set, all inputs are connected\n const allPortsConnected = connectedInputs.has(DATAFLOW_ALL_PORTS);\n\n // Filter out connected inputs from the graph input\n const filteredInput: TaskInput = {};\n for (const [key, value] of Object.entries(input)) {\n // Skip this input if it's explicitly connected OR if all ports are connected\n if (!connectedInputs.has(key) && !allPortsConnected) {\n filteredInput[key] = value;\n }\n }\n\n return filteredInput;\n }\n\n /**\n * Adds input data to a task.\n * Delegates to {@link Task.addInput} for the actual merging logic.\n *\n * @param task The task to add input data to\n * @param overrides The input data to override (or add to if an array)\n */\n public addInputData(task: ITask, overrides: Partial<TaskInput> | undefined): void {\n if (!overrides) return;\n\n const changed = task.addInput(overrides);\n\n // TODO(str): This is a hack.\n if (changed && \"regenerateGraph\" in task && typeof task.regenerateGraph === \"function\") {\n task.regenerateGraph();\n }\n }\n\n // ========================================================================\n // Protected Handlers\n // ========================================================================\n public mergeExecuteOutputsToRunOutput<\n ExecuteOutput extends TaskOutput,\n Merge extends CompoundMergeStrategy = CompoundMergeStrategy,\n >(\n results: GraphResultArray<ExecuteOutput>,\n compoundMerge: Merge\n ): GraphResult<ExecuteOutput, Merge> {\n if (compoundMerge === GRAPH_RESULT_ARRAY) {\n return results as GraphResult<ExecuteOutput, Merge>;\n }\n\n if (compoundMerge === PROPERTY_ARRAY) {\n let fixedOutput = {} as PropertyArrayGraphResult<ExecuteOutput>;\n const outputs = results.map((result: any) => result.data);\n if (outputs.length === 1) {\n fixedOutput = outputs[0];\n } else if (outputs.length > 1) {\n const collected = collectPropertyValues<ExecuteOutput>(outputs as ExecuteOutput[]);\n if (Object.keys(collected).length > 0) {\n fixedOutput = collected;\n }\n }\n return fixedOutput as GraphResult<ExecuteOutput, Merge>;\n }\n throw new TaskConfigurationError(`Unknown compound merge strategy: ${compoundMerge}`);\n }\n\n /**\n * Copies input data from edges to a task\n * @param task The task to copy input data to\n */\n protected copyInputFromEdgesToNode(task: ITask) {\n const dataflows = this.graph.getSourceDataflows(task.id);\n for (const dataflow of dataflows) {\n this.addInputData(task, dataflow.getPortData());\n }\n }\n\n /**\n * Pushes the output of a task to its target tasks\n * @param node The task that produced the output\n * @param results The output of the task\n */\n protected async pushOutputFromNodeToEdges(node: ITask, results: TaskOutput) {\n const dataflows = this.graph.getTargetDataflows(node.id);\n for (const dataflow of dataflows) {\n const compatibility = dataflow.semanticallyCompatible(this.graph, dataflow);\n getLogger().debug(\"pushOutputFromNodeToEdges\", {\n dataflowId: dataflow.id,\n compatibility,\n resultsKeys: Object.keys(results),\n });\n if (compatibility === \"static\") {\n dataflow.setPortData(results);\n } else if (compatibility === \"runtime\") {\n const task = this.graph.getTask(dataflow.targetTaskId)!;\n const narrowed = await task.narrowInput({ ...results }, this.registry);\n dataflow.setPortData(narrowed);\n } else {\n // Warn only when we had data to push; empty results (e.g. progress mid-run) are expected\n const resultsKeys = Object.keys(results);\n if (resultsKeys.length > 0) {\n getLogger().warn(\"pushOutputFromNodeToEdge not compatible, not setting port data\", {\n dataflowId: dataflow.id,\n compatibility,\n resultsKeys,\n });\n }\n }\n }\n }\n\n /**\n * Pushes the status of a task to its target edges\n * @param node The task that produced the status\n *\n * For ConditionalTask, this method handles selective dataflow status:\n * - Active branch dataflows get COMPLETED status\n * - Inactive branch dataflows get DISABLED status\n */\n protected pushStatusFromNodeToEdges(graph: TaskGraph, node: ITask, status?: TaskStatus): void {\n if (!node?.config?.id) return;\n\n const dataflows = graph.getTargetDataflows(node.id);\n const effectiveStatus = status ?? node.status;\n\n // Check if this is a ConditionalTask with selective branching\n if (node instanceof ConditionalTask && effectiveStatus === TaskStatus.COMPLETED) {\n // Build a map of output port -> branch ID for lookup\n const branches = node.config.branches ?? [];\n const portToBranch = new Map<string, string>();\n for (const branch of branches) {\n portToBranch.set(branch.outputPort, branch.id);\n }\n\n const activeBranches = node.getActiveBranches();\n\n for (const dataflow of dataflows) {\n const branchId = portToBranch.get(dataflow.sourceTaskPortId);\n if (branchId !== undefined) {\n // This dataflow is from a branch port\n if (activeBranches.has(branchId)) {\n // Branch is active - dataflow gets completed status\n dataflow.setStatus(TaskStatus.COMPLETED);\n } else {\n // Branch is inactive - dataflow gets disabled status\n dataflow.setStatus(TaskStatus.DISABLED);\n }\n } else {\n // Not a branch port (e.g., _activeBranches metadata) - use normal status\n dataflow.setStatus(effectiveStatus);\n }\n }\n\n // Cascade disabled status to downstream tasks\n this.propagateDisabledStatus(graph);\n return;\n }\n\n // Default behavior for non-conditional tasks\n dataflows.forEach((dataflow) => {\n dataflow.setStatus(effectiveStatus);\n });\n }\n\n /**\n * Pushes the error of a task to its target edges\n * @param node The task that produced the error\n */\n protected pushErrorFromNodeToEdges(graph: TaskGraph, node: ITask): void {\n if (!node?.config?.id) return;\n graph.getTargetDataflows(node.id).forEach((dataflow) => {\n dataflow.error = node.error;\n });\n }\n\n /**\n * Returns true if the task has any outgoing dataflow edges that use the\n * error output port (`[error]`). These edges indicate that the task's\n * errors should be routed to downstream handler tasks instead of failing\n * the entire graph.\n */\n protected hasErrorOutputEdges(task: ITask): boolean {\n const dataflows = this.graph.getTargetDataflows(task.id);\n return dataflows.some((df) => df.sourceTaskPortId === DATAFLOW_ERROR_PORT);\n }\n\n /**\n * Routes a failed task's error through its error-port dataflow edges.\n *\n * For each outgoing dataflow:\n * - Error-port edges (`[error]`) receive the error data and get COMPLETED status\n * - Non-error-port edges get DISABLED status (the task didn't produce normal output)\n *\n * After setting edge statuses, propagateDisabledStatus() cascades DISABLED\n * through any downstream tasks that only had non-error inputs from this task.\n */\n protected pushErrorOutputToEdges(task: ITask): void {\n const taskError = task.error;\n const errorData = {\n error: taskError?.message ?? \"Unknown error\",\n errorType: (taskError?.constructor as { type?: string })?.type ?? \"TaskError\",\n };\n\n const dataflows = this.graph.getTargetDataflows(task.id);\n for (const df of dataflows) {\n if (df.sourceTaskPortId === DATAFLOW_ERROR_PORT) {\n // Route error data to the error-port edge\n df.value = errorData;\n df.setStatus(TaskStatus.COMPLETED);\n } else {\n // Normal output edges are disabled — this task didn't produce output\n df.setStatus(TaskStatus.DISABLED);\n }\n }\n\n // Cascade disabled status to downstream tasks whose ALL inputs are now disabled\n this.propagateDisabledStatus(this.graph);\n }\n\n /**\n * Propagates DISABLED status through the graph.\n *\n * When a task's ALL incoming dataflows are DISABLED, that task becomes unreachable\n * and should also be disabled. This cascades through the graph until no more\n * tasks can be disabled.\n *\n * This is used by ConditionalTask to disable downstream tasks on inactive branches.\n *\n * @param graph The task graph to propagate disabled status through\n */\n protected propagateDisabledStatus(graph: TaskGraph): void {\n let changed = true;\n\n // Keep iterating until no more changes (fixed-point iteration)\n while (changed) {\n changed = false;\n\n for (const task of graph.getTasks()) {\n // Only consider tasks that are still pending\n if (task.status !== TaskStatus.PENDING) {\n continue;\n }\n\n const incomingDataflows = graph.getSourceDataflows(task.id);\n\n // Skip tasks with no incoming dataflows (root tasks)\n if (incomingDataflows.length === 0) {\n continue;\n }\n\n // Check if ALL incoming dataflows are DISABLED\n const allDisabled = incomingDataflows.every((df) => df.status === TaskStatus.DISABLED);\n\n if (allDisabled) {\n // This task is unreachable - disable it synchronously\n // Set status directly to avoid async issues\n task.status = TaskStatus.DISABLED;\n task.progress = 100;\n task.completedAt = new Date();\n task.emit(\"disabled\");\n task.emit(\"status\", task.status);\n\n // Propagate disabled status to its outgoing dataflows\n graph.getTargetDataflows(task.id).forEach((dataflow) => {\n dataflow.setStatus(TaskStatus.DISABLED);\n });\n\n // Mark as completed in scheduler so it doesn't wait for this task\n this.processScheduler.onTaskCompleted(task.id);\n\n changed = true;\n }\n }\n }\n }\n\n /**\n * Determines whether a streaming task needs to accumulate its text-delta\n * chunks into an enriched finish event. Accumulation is needed when:\n *\n * 1. Output caching is active (the cached value must be fully materialised).\n * 2. Any outgoing dataflow edge connects a streaming output port to an input\n * port that is not streaming with the same mode (i.e. the downstream task\n * cannot consume a raw stream and needs a completed value).\n *\n * When accumulation is required the source task runs with shouldAccumulate=true,\n * emitting an enriched finish event that carries all accumulated port text.\n * All downstream dataflow edges share that event via tee'd streams so no\n * edge needs to re-accumulate independently.\n */\n protected taskNeedsAccumulation(task: ITask): boolean {\n if (this.outputCache) return true;\n\n const outEdges = this.graph.getTargetDataflows(task.id);\n if (outEdges.length === 0) return this.accumulateLeafOutputs;\n\n const outSchema = task.outputSchema();\n\n for (const df of outEdges) {\n if (df.sourceTaskPortId === DATAFLOW_ALL_PORTS) {\n // Conservative: if any streaming output port exists, accumulate.\n // This covers the case where all-ports edges fan into non-streaming tasks.\n if (getStreamingPorts(outSchema).length > 0) return true;\n continue;\n }\n\n const targetTask = this.graph.getTask(df.targetTaskId);\n if (!targetTask) continue;\n const inSchema = targetTask.inputSchema();\n\n if (edgeNeedsAccumulation(outSchema, df.sourceTaskPortId, inSchema, df.targetTaskPortId)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Runs a task\n * @param task The task to run\n * @param input The input for the task\n * @returns The output of the task\n */\n protected async runTask<T>(task: ITask, input: TaskInput): Promise<GraphSingleTaskResult<T>> {\n const isStreamable = isTaskStreamable(task);\n\n // For pass-through streaming tasks: if the task is streamable and has\n // streaming input edges, tee each stream so one copy is forwarded to\n // the task's executeStream() (via inputStreams) while the other stays\n // on the edge for materialization by awaitStreamInputs.\n if (isStreamable) {\n const dataflows = this.graph.getSourceDataflows(task.id);\n const streamingEdges = dataflows.filter((df) => df.stream !== undefined);\n if (streamingEdges.length > 0) {\n const inputStreams = new Map<string, ReadableStream<StreamEvent>>();\n for (const df of streamingEdges) {\n const stream = df.stream!;\n const [forwardCopy, materializeCopy] = stream.tee();\n inputStreams.set(df.targetTaskPortId, forwardCopy);\n df.setStream(materializeCopy);\n }\n task.runner.inputStreams = inputStreams;\n }\n }\n\n // Await any active streams on input dataflow edges so their values\n // are materialized before we read them. This applies to ALL downstream\n // tasks (both streaming and non-streaming) because copyInputFromEdgesToNode\n // reads via getPortData() which requires materialized values.\n // Streaming downstream tasks are still unblocked early by the scheduler\n // (they can start setup while upstream is streaming), but their actual\n // input data waits for upstream completion.\n await this.awaitStreamInputs(task);\n\n this.copyInputFromEdgesToNode(task);\n\n if (isStreamable) {\n return this.runStreamingTask<T>(task, input);\n }\n\n const results = await task.runner.run(input, {\n // Pass `false` when no cache so TaskRunner.handleStart explicitly clears\n // its own cached reference (undefined would leave the old value intact).\n outputCache: this.outputCache ?? false,\n updateProgress: async (task: ITask, progress: number, message?: string, ...args: any[]) =>\n await this.handleProgress(task, progress, message, ...args),\n registry: this.registry,\n });\n\n await this.pushOutputFromNodeToEdges(task, results);\n\n return {\n id: task.id,\n type: (task.constructor as any).runtype || (task.constructor as any).type,\n data: results as T,\n };\n }\n\n /**\n * For non-streaming downstream tasks, awaits completion of any active\n * streams on input dataflow edges, materializing their values.\n *\n * Streaming upstream tasks set a ReadableStream on outgoing edges.\n * Non-streaming downstream tasks cannot consume streams directly, so\n * this method reads each stream to completion and accumulates the\n * value (via Dataflow.awaitStreamValue) before the task reads its\n * inputs through the normal getPortData() path.\n */\n protected async awaitStreamInputs(task: ITask): Promise<void> {\n const dataflows = this.graph.getSourceDataflows(task.id);\n const streamPromises = dataflows\n .filter((df) => df.stream !== undefined)\n .map((df) => df.awaitStreamValue());\n if (streamPromises.length > 0) {\n await Promise.all(streamPromises);\n }\n }\n\n /**\n * Runs a streaming task within the DAG.\n * Listens for stream events to:\n * - Notify the scheduler when streaming begins (unblocking downstream streamable tasks)\n * - Push stream data to outgoing dataflow edges\n * - Have the source task accumulate and emit enriched finish events for\n * non-streaming downstream tasks (when taskNeedsAccumulation() is true)\n */\n protected async runStreamingTask<T>(\n task: ITask,\n input: TaskInput\n ): Promise<GraphSingleTaskResult<T>> {\n const streamMode = getOutputStreamMode(task.outputSchema());\n const shouldAccumulate = this.taskNeedsAccumulation(task);\n\n let streamingNotified = false;\n\n const onStatus = (status: TaskStatus) => {\n if (status === TaskStatus.STREAMING && !streamingNotified) {\n streamingNotified = true;\n this.pushStatusFromNodeToEdges(this.graph, task, TaskStatus.STREAMING);\n this.pushStreamToEdges(task, streamMode);\n this.processScheduler.onTaskStreaming(task.id);\n }\n };\n\n const onStreamStart = () => {\n this.graph.emit(\"task_stream_start\", task.id);\n };\n\n const onStreamChunk = (event: StreamEvent) => {\n this.graph.emit(\"task_stream_chunk\", task.id, event);\n };\n\n const onStreamEnd = (output: Record<string, any>) => {\n this.graph.emit(\"task_stream_end\", task.id, output);\n };\n\n task.on(\"status\", onStatus);\n task.on(\"stream_start\", onStreamStart);\n task.on(\"stream_chunk\", onStreamChunk);\n task.on(\"stream_end\", onStreamEnd);\n\n try {\n const results = await task.runner.run(input, {\n outputCache: this.outputCache ?? false,\n shouldAccumulate,\n updateProgress: async (task: ITask, progress: number, message?: string, ...args: any[]) =>\n await this.handleProgress(task, progress, message, ...args),\n registry: this.registry,\n });\n\n await this.pushOutputFromNodeToEdges(task, results);\n\n return {\n id: task.id,\n type: (task.constructor as any).runtype || (task.constructor as any).type,\n data: results as T,\n };\n } finally {\n task.off(\"status\", onStatus);\n task.off(\"stream_start\", onStreamStart);\n task.off(\"stream_chunk\", onStreamChunk);\n task.off(\"stream_end\", onStreamEnd);\n }\n }\n\n /**\n * Returns true if an event carries a port-specific delta (text-delta or object-delta).\n */\n private static isPortDelta(event: StreamEvent): event is StreamEvent & { port: string } {\n return event.type === \"text-delta\" || event.type === \"object-delta\";\n }\n\n /**\n * Creates a ReadableStream from task streaming events, optionally filtered\n * to a single port. When `portId` is undefined (DATAFLOW_ALL_PORTS), all\n * events pass through. When set, only delta events matching the port plus\n * control events (finish, error, snapshot) are enqueued.\n */\n private createStreamFromTaskEvents(task: ITask, portId?: string): ReadableStream<StreamEvent> {\n return new ReadableStream<StreamEvent>({\n start: (controller) => {\n const onChunk = (event: StreamEvent) => {\n try {\n if (\n portId !== undefined &&\n TaskGraphRunner.isPortDelta(event) &&\n event.port !== portId\n ) {\n return;\n }\n controller.enqueue(event);\n } catch {\n // Stream may be closed\n }\n };\n const onEnd = () => {\n try {\n controller.close();\n } catch {\n // Stream may already be closed\n }\n task.off(\"stream_chunk\", onChunk);\n task.off(\"stream_end\", onEnd);\n };\n task.on(\"stream_chunk\", onChunk);\n task.on(\"stream_end\", onEnd);\n },\n });\n }\n\n /**\n * Pushes stream events from a streaming task to its outgoing dataflow edges.\n * Creates per-port filtered ReadableStreams for specific-port edges and\n * unfiltered streams for DATAFLOW_ALL_PORTS edges. Within each port group,\n * uses tee() for fan-out to multiple consumers.\n */\n protected pushStreamToEdges(task: ITask, streamMode: string): void {\n const targetDataflows = this.graph.getTargetDataflows(task.id);\n if (targetDataflows.length === 0) return;\n\n // Group edges by their source port\n const groups = new Map<string, typeof targetDataflows>();\n for (const df of targetDataflows) {\n const key = df.sourceTaskPortId;\n let group = groups.get(key);\n if (!group) {\n group = [];\n groups.set(key, group);\n }\n group.push(df);\n }\n\n for (const [portKey, edges] of groups) {\n const filterPort = portKey === DATAFLOW_ALL_PORTS ? undefined : portKey;\n const stream = this.createStreamFromTaskEvents(task, filterPort);\n\n if (edges.length === 1) {\n edges[0].setStream(stream);\n } else {\n let currentStream = stream;\n for (let i = 0; i < edges.length; i++) {\n if (i === edges.length - 1) {\n edges[i].setStream(currentStream);\n } else {\n const [s1, s2] = currentStream.tee();\n edges[i].setStream(s1);\n currentStream = s2;\n }\n }\n }\n }\n }\n\n /**\n * Resets a task\n * @param graph The task graph to reset\n * @param task The task to reset\n * @param runId The run ID\n */\n protected resetTask(graph: TaskGraph, task: ITask, runId: string) {\n task.status = TaskStatus.PENDING;\n task.resetInputData();\n task.runOutputData = {};\n task.error = undefined;\n task.progress = 0;\n task.runConfig = { ...task.runConfig, runnerId: runId };\n this.pushStatusFromNodeToEdges(graph, task);\n this.pushErrorFromNodeToEdges(graph, task);\n task.emit(\"reset\");\n task.emit(\"status\", task.status);\n }\n\n /**\n * Resets the task graph, recursively\n * @param graph The task graph to reset\n */\n public resetGraph(graph: TaskGraph, runnerId: string) {\n graph.getTasks().forEach((node) => {\n this.resetTask(graph, node, runnerId);\n node.regenerateGraph();\n if (node.hasChildren()) {\n this.resetGraph(node.subGraph, runnerId);\n }\n });\n graph.getDataflows().forEach((dataflow) => {\n dataflow.reset();\n });\n }\n\n /**\n * Handles the start of task graph execution\n * @param parentSignal Optional abort signal from parent\n */\n protected async handleStart(config?: TaskGraphRunConfig): Promise<void> {\n // Setup registry - create child from global if not provided\n if (config?.registry !== undefined) {\n this.registry = config.registry;\n } else if (this.registry === undefined) {\n // Create a child container that inherits from global but allows overrides\n this.registry = new ServiceRegistry(globalServiceRegistry.container.createChildContainer());\n }\n\n this.accumulateLeafOutputs = config?.accumulateLeafOutputs !== false;\n\n if (config?.outputCache !== undefined) {\n if (typeof config.outputCache === \"boolean\") {\n if (config.outputCache === true) {\n this.outputCache = this.registry.get(TASK_OUTPUT_REPOSITORY);\n } else {\n this.outputCache = undefined;\n }\n } else {\n this.outputCache = config.outputCache;\n }\n this.graph.outputCache = this.outputCache;\n }\n // Prevent reentrancy\n if (this.running || this.reactiveRunning) {\n throw new TaskConfigurationError(\"Graph is already running\");\n }\n\n this.running = true;\n this.abortController = new AbortController();\n this.abortController.signal.addEventListener(\"abort\", () => {\n this.handleAbort();\n });\n\n if (config?.parentSignal?.aborted) {\n this.abortController.abort(); // Immediately abort if the parent is already aborted\n return;\n } else {\n config?.parentSignal?.addEventListener(\n \"abort\",\n () => {\n this.abortController?.abort();\n },\n { once: true }\n );\n }\n\n this.runId = uuid4();\n this.resetGraph(this.graph, this.runId);\n this.processScheduler.reset();\n this.inProgressTasks.clear();\n this.inProgressFunctions.clear();\n this.failedTaskErrors.clear();\n\n // Start telemetry span for the graph run\n const telemetry = getTelemetryProvider();\n if (telemetry.isEnabled) {\n this.telemetrySpan = telemetry.startSpan(\"workglow.graph.run\", {\n attributes: {\n \"workglow.graph.run_id\": this.runId,\n \"workglow.graph.task_count\": this.graph.getTasks().length,\n \"workglow.graph.dataflow_count\": this.graph.getDataflows().length,\n },\n });\n }\n\n this.graph.emit(\"start\");\n }\n\n protected async handleStartReactive(config?: TaskGraphRunConfig): Promise<void> {\n if (this.reactiveRunning) {\n throw new TaskConfigurationError(\"Graph is already running reactively\");\n }\n\n // Use explicit registry if provided; otherwise keep the existing one\n // (which is either globalServiceRegistry by default, or whatever handleStart set).\n if (config?.registry !== undefined) {\n this.registry = config.registry;\n }\n\n this.reactiveScheduler.reset();\n this.reactiveRunning = true;\n }\n\n /**\n * Handles the completion of task graph execution\n */\n protected async handleComplete(): Promise<void> {\n this.running = false;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.OK);\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.graph.emit(\"complete\");\n }\n\n protected async handleCompleteReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles errors during task graph execution\n */\n protected async handleError(error: TaskError): Promise<void> {\n await Promise.allSettled(\n this.graph.getTasks().map(async (task: ITask) => {\n if (task.status === TaskStatus.PROCESSING || task.status === TaskStatus.STREAMING) {\n return task.abort();\n }\n })\n );\n this.running = false;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.ERROR, error.message);\n this.telemetrySpan.setAttributes({ \"workglow.graph.error\": error.message });\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.graph.emit(\"error\", error);\n }\n\n protected async handleErrorReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles task graph abortion\n */\n protected async handleAbort(): Promise<void> {\n await Promise.allSettled(\n this.graph.getTasks().map(async (task: ITask) => {\n if (task.status === TaskStatus.PROCESSING || task.status === TaskStatus.STREAMING) {\n return task.abort();\n }\n })\n );\n this.running = false;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.ERROR, \"aborted\");\n this.telemetrySpan.addEvent(\"workglow.graph.aborted\");\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.graph.emit(\"abort\");\n }\n\n protected async handleAbortReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles task graph disabling\n */\n protected async handleDisable(): Promise<void> {\n await Promise.allSettled(\n this.graph.getTasks().map(async (task: ITask) => {\n if (task.status === TaskStatus.PENDING) {\n return task.disable();\n }\n })\n );\n this.running = false;\n this.graph.emit(\"disabled\");\n }\n\n /**\n * Handles progress updates for the task graph\n * Currently not implemented at the graph level\n * @param progress Progress value (0-100)\n * @param message Optional message\n * @param args Additional arguments\n */\n protected async handleProgress(\n task: ITask,\n progress: number,\n message?: string,\n ...args: any[]\n ): Promise<void> {\n const total = this.graph.getTasks().length;\n if (total > 1) {\n const completed = this.graph.getTasks().reduce((acc, t) => acc + t.progress, 0);\n progress = Math.round(completed / total);\n }\n this.pushStatusFromNodeToEdges(this.graph, task);\n // Only push output when the task has produced data; progress can fire mid-run with empty runOutputData\n if (task.runOutputData && Object.keys(task.runOutputData).length > 0) {\n await this.pushOutputFromNodeToEdges(task, task.runOutputData);\n }\n this.graph.emit(\"graph_progress\", progress, message, args);\n }\n}\n",
|
|
17
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n collectPropertyValues,\n ConvertAllToOptionalArray,\n getLogger,\n getTelemetryProvider,\n globalServiceRegistry,\n ServiceRegistry,\n SpanStatusCode,\n uuid4,\n type ISpan,\n} from \"@workglow/util\";\nimport { TASK_OUTPUT_REPOSITORY, TaskOutputRepository } from \"../storage/TaskOutputRepository\";\nimport { ConditionalTask } from \"../task/ConditionalTask\";\nimport { ITask } from \"../task/ITask\";\nimport {\n edgeNeedsAccumulation,\n getOutputStreamMode,\n getStreamingPorts,\n isTaskStreamable,\n type StreamEvent,\n} from \"../task/StreamTypes\";\nimport { Task } from \"../task/Task\";\nimport { TaskAbortedError, TaskConfigurationError, TaskError } from \"../task/TaskError\";\nimport { TaskInput, TaskOutput, TaskStatus } from \"../task/TaskTypes\";\nimport { DATAFLOW_ALL_PORTS, DATAFLOW_ERROR_PORT } from \"./Dataflow\";\nimport { TaskGraph, TaskGraphRunConfig, TaskGraphRunReactiveConfig } from \"./TaskGraph\";\nimport { DependencyBasedScheduler, TopologicalScheduler } from \"./TaskGraphScheduler\";\n\n/**\n * Tasks that inherit {@link Task.prototype.execute} without declaring their own `execute` on the\n * subclass prototype are omitted from graph-level progress averaging (they keep default 0% until\n * complete and would dilute the bar).\n */\nexport function taskPrototypeHasOwnExecute(task: ITask): boolean {\n const Ctor = task.constructor as typeof Task;\n return Object.hasOwn(Ctor.prototype, \"execute\");\n}\n\nexport type GraphSingleTaskResult<T> = {\n id: unknown;\n type: String;\n data: T;\n};\nexport type GraphResultArray<T> = Array<GraphSingleTaskResult<T>>;\nexport type PropertyArrayGraphResult<T> = ConvertAllToOptionalArray<T>;\nexport type AnyGraphResult<T> = PropertyArrayGraphResult<T> | GraphResultArray<T>;\n\nexport const PROPERTY_ARRAY = \"PROPERTY_ARRAY\" as const;\nexport const GRAPH_RESULT_ARRAY = \"GRAPH_RESULT_ARRAY\" as const;\n\nexport type GraphResultMap<T> = {\n // array of results with id for tasks that created them -- output is an array of {id, type, data}[]\n [GRAPH_RESULT_ARRAY]: GraphResultArray<T>;\n // property-array -- output is consolidation of each output property, with duplicate properties turned into an array\n [PROPERTY_ARRAY]: PropertyArrayGraphResult<T>;\n};\n\n/**\n * Enum representing the possible compound merge strategies\n */\nexport type CompoundMergeStrategy = typeof PROPERTY_ARRAY | typeof GRAPH_RESULT_ARRAY;\n\nexport type GraphResult<\n Output,\n Merge extends CompoundMergeStrategy,\n> = GraphResultMap<Output>[Merge];\n\n/**\n * Class for running a task graph\n * Manages the execution of tasks in a task graph, including caching\n */\nexport class TaskGraphRunner {\n /**\n * Whether the task graph is currently running\n */\n protected running = false;\n protected reactiveRunning = false;\n\n /**\n * The task graph to run\n */\n public readonly graph: TaskGraph;\n\n /**\n * Output cache repository\n */\n protected outputCache?: TaskOutputRepository;\n /**\n * Whether leaf tasks (no outgoing edges) should accumulate their streaming\n * output. True by default so workflow return values are complete.\n */\n protected accumulateLeafOutputs: boolean = true;\n /**\n * Service registry for this graph run\n */\n protected registry: ServiceRegistry = globalServiceRegistry;\n /**\n * AbortController for cancelling graph execution\n */\n protected abortController: AbortController | undefined;\n\n /**\n * Maps to track task execution state\n */\n protected inProgressTasks: Map<unknown, Promise<TaskOutput>> = new Map();\n protected inProgressFunctions: Map<unknown, Promise<any>> = new Map();\n protected failedTaskErrors: Map<unknown, TaskError> = new Map();\n\n /**\n * Active telemetry span for the current graph run.\n */\n protected telemetrySpan?: ISpan;\n\n /**\n * Constructor for TaskGraphRunner\n * @param graph The task graph to run\n * @param outputCache The task output repository to use for caching task outputs\n * @param processScheduler The scheduler to use for task execution\n * @param reactiveScheduler The scheduler to use for reactive task execution\n */\n constructor(\n graph: TaskGraph,\n outputCache?: TaskOutputRepository,\n protected processScheduler = new DependencyBasedScheduler(graph),\n protected reactiveScheduler = new TopologicalScheduler(graph)\n ) {\n this.graph = graph;\n graph.outputCache = outputCache;\n this.handleProgress = this.handleProgress.bind(this);\n }\n\n /**\n * Unique ID for the current run, used for timing labels.\n */\n protected runId: string = \"\";\n\n // ========================================================================\n // Public methods\n // ========================================================================\n\n public async runGraph<ExecuteOutput extends TaskOutput>(\n input: TaskInput = {} as TaskInput,\n config?: TaskGraphRunConfig\n ): Promise<GraphResultArray<ExecuteOutput>> {\n await this.handleStart(config);\n\n const results: GraphResultArray<ExecuteOutput> = [];\n let error: TaskError | undefined;\n\n try {\n // TODO: A different graph runner may chunk tasks that are in parallel\n // rather them all currently available\n for await (const task of this.processScheduler.tasks()) {\n if (this.abortController?.signal.aborted) {\n break;\n }\n\n if (this.failedTaskErrors.size > 0) {\n break;\n }\n\n const isRootTask = this.graph.getSourceDataflows(task.id).length === 0;\n\n const runAsync = async () => {\n let errorRouted = false;\n try {\n // Only filter input for non-root tasks; root tasks get the full input\n const taskInput = isRootTask ? input : this.filterInputForTask(task, input);\n\n const taskPromise = this.runTask(task, taskInput);\n this.inProgressTasks!.set(task.id, taskPromise);\n const taskResult = await taskPromise;\n\n if (this.graph.getTargetDataflows(task.id).length === 0) {\n // we save the results of all the leaves\n results.push(taskResult as GraphSingleTaskResult<ExecuteOutput>);\n }\n } catch (error) {\n if (this.hasErrorOutputEdges(task)) {\n // Route the error through error-port dataflows instead of failing the graph.\n // pushErrorOutputToEdges sets edge statuses directly (COMPLETED for error\n // edges, DISABLED for normal edges), so we skip the normal status push.\n errorRouted = true;\n this.pushErrorOutputToEdges(task);\n } else {\n this.failedTaskErrors.set(task.id, error as TaskError);\n }\n } finally {\n // IMPORTANT: Push status to edges BEFORE notifying scheduler\n // This ensures dataflow statuses (including DISABLED) are set\n // before the scheduler checks which tasks are ready.\n // Skip normal status push when error routing already set edge statuses.\n if (!errorRouted) {\n this.pushStatusFromNodeToEdges(this.graph, task);\n this.pushErrorFromNodeToEdges(this.graph, task);\n }\n this.processScheduler.onTaskCompleted(task.id);\n }\n };\n\n // Start task execution without awaiting\n // so we can have many tasks running in parallel\n // but keep track of them to make sure they get awaited\n // otherwise, things will finish after this promise is resolved\n this.inProgressFunctions.set(Symbol(task.id as string), runAsync());\n }\n } catch (err) {\n error = err as Error;\n getLogger().error(\"Error running graph\", { error });\n }\n // Wait for all tasks to complete since we did not await runAsync()/this.runTaskWithProvenance()\n await Promise.allSettled(Array.from(this.inProgressTasks.values()));\n // Clean up stragglers to avoid unhandled promise rejections\n await Promise.allSettled(Array.from(this.inProgressFunctions.values()));\n\n if (this.failedTaskErrors.size > 0) {\n const latestError = this.failedTaskErrors.values().next().value!;\n this.handleError(latestError);\n throw latestError;\n }\n if (this.abortController?.signal.aborted) {\n await this.handleAbort();\n throw new TaskAbortedError();\n }\n\n await this.handleComplete();\n\n return results;\n }\n\n /**\n * Runs the task graph in a reactive manner\n * @param input Optional input to pass to root tasks (tasks with no incoming dataflows)\n * @param config Optional configuration for the reactive run. Supports overriding the\n * ServiceRegistry (`registry`), providing an output cache (`outputCache`), passing an\n * abort signal (`parentSignal`), and controlling whether streaming leaf task outputs are\n * accumulated into the return value (`accumulateLeafOutputs`).\n * @returns A promise that resolves when all tasks are complete\n * @throws TaskConfigurationError if the graph is already running reactively\n */\n public async runGraphReactive<Output extends TaskOutput>(\n input: TaskInput = {} as TaskInput,\n config?: TaskGraphRunReactiveConfig\n ): Promise<GraphResultArray<Output>> {\n await this.handleStartReactive(config);\n\n const results: GraphResultArray<Output> = [];\n try {\n for await (const task of this.reactiveScheduler.tasks()) {\n const isRootTask = this.graph.getSourceDataflows(task.id).length === 0;\n\n if (task.status === TaskStatus.PENDING) {\n task.resetInputData();\n this.copyInputFromEdgesToNode(task);\n // TODO: cacheable here??\n // if (task.cacheable) {\n // const results = await this.outputCache?.getOutput(\n // (task.constructor as any).type,\n // task.runInputData\n // );\n // if (results) {\n // task.runOutputData = results;\n // }\n // }\n }\n\n // For root tasks (no incoming dataflows), apply the input parameter\n // This is important for GraphAsTask subgraphs where the InputTask needs\n // to receive the parent's input values\n const taskInput = isRootTask ? input : {};\n\n const taskResult = await task.runReactive(taskInput);\n\n await this.pushOutputFromNodeToEdges(task, taskResult);\n if (this.graph.getTargetDataflows(task.id).length === 0) {\n results.push({\n id: task.id,\n type: (task.constructor as any).runtype || (task.constructor as any).type,\n data: taskResult as Output,\n });\n }\n }\n await this.handleCompleteReactive();\n return results;\n } catch (error) {\n await this.handleErrorReactive();\n throw error;\n }\n }\n\n /**\n * Aborts the task graph execution\n */\n public abort(): void {\n this.abortController?.abort();\n }\n\n /**\n * Disables the task graph execution\n */\n public async disable(): Promise<void> {\n await this.handleDisable();\n }\n\n /**\n * Filters graph-level input to only include properties that are not connected via dataflows for a given task\n * @param task The task to filter input for\n * @param input The graph-level input\n * @returns Filtered input containing only unconnected properties\n */\n protected filterInputForTask(task: ITask, input: TaskInput): TaskInput {\n // Get all inputs that are connected to this task via dataflows\n const sourceDataflows = this.graph.getSourceDataflows(task.id);\n const connectedInputs = new Set(sourceDataflows.map((df) => df.targetTaskPortId));\n\n // If DATAFLOW_ALL_PORTS (\"*\") is in the set, all inputs are connected\n const allPortsConnected = connectedInputs.has(DATAFLOW_ALL_PORTS);\n\n // Filter out connected inputs from the graph input\n const filteredInput: TaskInput = {};\n for (const [key, value] of Object.entries(input)) {\n // Skip this input if it's explicitly connected OR if all ports are connected\n if (!connectedInputs.has(key) && !allPortsConnected) {\n filteredInput[key] = value;\n }\n }\n\n return filteredInput;\n }\n\n /**\n * Adds input data to a task.\n * Delegates to {@link Task.addInput} for the actual merging logic.\n *\n * @param task The task to add input data to\n * @param overrides The input data to override (or add to if an array)\n */\n public addInputData(task: ITask, overrides: Partial<TaskInput> | undefined): void {\n if (!overrides) return;\n\n const changed = task.addInput(overrides);\n\n // TODO(str): This is a hack.\n if (changed && \"regenerateGraph\" in task && typeof task.regenerateGraph === \"function\") {\n task.regenerateGraph();\n }\n }\n\n // ========================================================================\n // Protected Handlers\n // ========================================================================\n public mergeExecuteOutputsToRunOutput<\n ExecuteOutput extends TaskOutput,\n Merge extends CompoundMergeStrategy = CompoundMergeStrategy,\n >(\n results: GraphResultArray<ExecuteOutput>,\n compoundMerge: Merge\n ): GraphResult<ExecuteOutput, Merge> {\n if (compoundMerge === GRAPH_RESULT_ARRAY) {\n return results as GraphResult<ExecuteOutput, Merge>;\n }\n\n if (compoundMerge === PROPERTY_ARRAY) {\n let fixedOutput = {} as PropertyArrayGraphResult<ExecuteOutput>;\n const outputs = results.map((result: any) => result.data);\n if (outputs.length === 1) {\n fixedOutput = outputs[0];\n } else if (outputs.length > 1) {\n const collected = collectPropertyValues<ExecuteOutput>(outputs as ExecuteOutput[]);\n if (Object.keys(collected).length > 0) {\n fixedOutput = collected;\n }\n }\n return fixedOutput as GraphResult<ExecuteOutput, Merge>;\n }\n throw new TaskConfigurationError(`Unknown compound merge strategy: ${compoundMerge}`);\n }\n\n /**\n * Copies input data from edges to a task\n * @param task The task to copy input data to\n */\n protected copyInputFromEdgesToNode(task: ITask) {\n const dataflows = this.graph.getSourceDataflows(task.id);\n for (const dataflow of dataflows) {\n this.addInputData(task, dataflow.getPortData());\n }\n }\n\n /**\n * Pushes the output of a task to its target tasks\n * @param node The task that produced the output\n * @param results The output of the task\n */\n protected async pushOutputFromNodeToEdges(node: ITask, results: TaskOutput) {\n const dataflows = this.graph.getTargetDataflows(node.id);\n for (const dataflow of dataflows) {\n const compatibility = dataflow.semanticallyCompatible(this.graph, dataflow);\n getLogger().debug(\"pushOutputFromNodeToEdges\", {\n dataflowId: dataflow.id,\n compatibility,\n resultsKeys: Object.keys(results),\n });\n if (compatibility === \"static\") {\n dataflow.setPortData(results);\n } else if (compatibility === \"runtime\") {\n const task = this.graph.getTask(dataflow.targetTaskId)!;\n const narrowed = await task.narrowInput({ ...results }, this.registry);\n dataflow.setPortData(narrowed);\n } else {\n // Warn only when we had data to push; empty results (e.g. progress mid-run) are expected\n const resultsKeys = Object.keys(results);\n if (resultsKeys.length > 0) {\n getLogger().warn(\"pushOutputFromNodeToEdge not compatible, not setting port data\", {\n dataflowId: dataflow.id,\n compatibility,\n resultsKeys,\n });\n }\n }\n }\n }\n\n /**\n * Pushes the status of a task to its target edges\n * @param node The task that produced the status\n *\n * For ConditionalTask, this method handles selective dataflow status:\n * - Active branch dataflows get COMPLETED status\n * - Inactive branch dataflows get DISABLED status\n */\n protected pushStatusFromNodeToEdges(graph: TaskGraph, node: ITask, status?: TaskStatus): void {\n if (!node?.config?.id) return;\n\n const dataflows = graph.getTargetDataflows(node.id);\n const effectiveStatus = status ?? node.status;\n\n // Check if this is a ConditionalTask with selective branching\n if (node instanceof ConditionalTask && effectiveStatus === TaskStatus.COMPLETED) {\n // Build a map of output port -> branch ID for lookup\n const branches = node.config.branches ?? [];\n const portToBranch = new Map<string, string>();\n for (const branch of branches) {\n portToBranch.set(branch.outputPort, branch.id);\n }\n\n const activeBranches = node.getActiveBranches();\n\n for (const dataflow of dataflows) {\n const branchId = portToBranch.get(dataflow.sourceTaskPortId);\n if (branchId !== undefined) {\n // This dataflow is from a branch port\n if (activeBranches.has(branchId)) {\n // Branch is active - dataflow gets completed status\n dataflow.setStatus(TaskStatus.COMPLETED);\n } else {\n // Branch is inactive - dataflow gets disabled status\n dataflow.setStatus(TaskStatus.DISABLED);\n }\n } else {\n // Not a branch port (e.g., _activeBranches metadata) - use normal status\n dataflow.setStatus(effectiveStatus);\n }\n }\n\n // Cascade disabled status to downstream tasks\n this.propagateDisabledStatus(graph);\n return;\n }\n\n // Default behavior for non-conditional tasks\n dataflows.forEach((dataflow) => {\n dataflow.setStatus(effectiveStatus);\n });\n }\n\n /**\n * Pushes the error of a task to its target edges\n * @param node The task that produced the error\n */\n protected pushErrorFromNodeToEdges(graph: TaskGraph, node: ITask): void {\n if (!node?.config?.id) return;\n graph.getTargetDataflows(node.id).forEach((dataflow) => {\n dataflow.error = node.error;\n });\n }\n\n /**\n * Returns true if the task has any outgoing dataflow edges that use the\n * error output port (`[error]`). These edges indicate that the task's\n * errors should be routed to downstream handler tasks instead of failing\n * the entire graph.\n */\n protected hasErrorOutputEdges(task: ITask): boolean {\n const dataflows = this.graph.getTargetDataflows(task.id);\n return dataflows.some((df) => df.sourceTaskPortId === DATAFLOW_ERROR_PORT);\n }\n\n /**\n * Routes a failed task's error through its error-port dataflow edges.\n *\n * For each outgoing dataflow:\n * - Error-port edges (`[error]`) receive the error data and get COMPLETED status\n * - Non-error-port edges get DISABLED status (the task didn't produce normal output)\n *\n * After setting edge statuses, propagateDisabledStatus() cascades DISABLED\n * through any downstream tasks that only had non-error inputs from this task.\n */\n protected pushErrorOutputToEdges(task: ITask): void {\n const taskError = task.error;\n const errorData = {\n error: taskError?.message ?? \"Unknown error\",\n errorType: (taskError?.constructor as { type?: string })?.type ?? \"TaskError\",\n };\n\n const dataflows = this.graph.getTargetDataflows(task.id);\n for (const df of dataflows) {\n if (df.sourceTaskPortId === DATAFLOW_ERROR_PORT) {\n // Route error data to the error-port edge\n df.value = errorData;\n df.setStatus(TaskStatus.COMPLETED);\n } else {\n // Normal output edges are disabled — this task didn't produce output\n df.setStatus(TaskStatus.DISABLED);\n }\n }\n\n // Cascade disabled status to downstream tasks whose ALL inputs are now disabled\n this.propagateDisabledStatus(this.graph);\n }\n\n /**\n * Propagates DISABLED status through the graph.\n *\n * When a task's ALL incoming dataflows are DISABLED, that task becomes unreachable\n * and should also be disabled. This cascades through the graph until no more\n * tasks can be disabled.\n *\n * This is used by ConditionalTask to disable downstream tasks on inactive branches.\n *\n * @param graph The task graph to propagate disabled status through\n */\n protected propagateDisabledStatus(graph: TaskGraph): void {\n let changed = true;\n\n // Keep iterating until no more changes (fixed-point iteration)\n while (changed) {\n changed = false;\n\n for (const task of graph.getTasks()) {\n // Only consider tasks that are still pending\n if (task.status !== TaskStatus.PENDING) {\n continue;\n }\n\n const incomingDataflows = graph.getSourceDataflows(task.id);\n\n // Skip tasks with no incoming dataflows (root tasks)\n if (incomingDataflows.length === 0) {\n continue;\n }\n\n // Check if ALL incoming dataflows are DISABLED\n const allDisabled = incomingDataflows.every((df) => df.status === TaskStatus.DISABLED);\n\n if (allDisabled) {\n // This task is unreachable - disable it synchronously\n // Set status directly to avoid async issues\n task.status = TaskStatus.DISABLED;\n task.progress = 100;\n task.completedAt = new Date();\n task.emit(\"disabled\");\n task.emit(\"status\", task.status);\n\n // Propagate disabled status to its outgoing dataflows\n graph.getTargetDataflows(task.id).forEach((dataflow) => {\n dataflow.setStatus(TaskStatus.DISABLED);\n });\n\n // Mark as completed in scheduler so it doesn't wait for this task\n this.processScheduler.onTaskCompleted(task.id);\n\n changed = true;\n }\n }\n }\n }\n\n /**\n * Determines whether a streaming task needs to accumulate its text-delta\n * chunks into an enriched finish event. Accumulation is needed when:\n *\n * 1. Output caching is active (the cached value must be fully materialised).\n * 2. Any outgoing dataflow edge connects a streaming output port to an input\n * port that is not streaming with the same mode (i.e. the downstream task\n * cannot consume a raw stream and needs a completed value).\n *\n * When accumulation is required the source task runs with shouldAccumulate=true,\n * emitting an enriched finish event that carries all accumulated port text.\n * All downstream dataflow edges share that event via tee'd streams so no\n * edge needs to re-accumulate independently.\n */\n protected taskNeedsAccumulation(task: ITask): boolean {\n if (this.outputCache) return true;\n\n const outEdges = this.graph.getTargetDataflows(task.id);\n if (outEdges.length === 0) return this.accumulateLeafOutputs;\n\n const outSchema = task.outputSchema();\n\n for (const df of outEdges) {\n if (df.sourceTaskPortId === DATAFLOW_ALL_PORTS) {\n // Conservative: if any streaming output port exists, accumulate.\n // This covers the case where all-ports edges fan into non-streaming tasks.\n if (getStreamingPorts(outSchema).length > 0) return true;\n continue;\n }\n\n const targetTask = this.graph.getTask(df.targetTaskId);\n if (!targetTask) continue;\n const inSchema = targetTask.inputSchema();\n\n if (edgeNeedsAccumulation(outSchema, df.sourceTaskPortId, inSchema, df.targetTaskPortId)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Runs a task\n * @param task The task to run\n * @param input The input for the task\n * @returns The output of the task\n */\n protected async runTask<T>(task: ITask, input: TaskInput): Promise<GraphSingleTaskResult<T>> {\n const isStreamable = isTaskStreamable(task);\n\n // For pass-through streaming tasks: if the task is streamable and has\n // streaming input edges, tee each stream so one copy is forwarded to\n // the task's executeStream() (via inputStreams) while the other stays\n // on the edge for materialization by awaitStreamInputs.\n if (isStreamable) {\n const dataflows = this.graph.getSourceDataflows(task.id);\n const streamingEdges = dataflows.filter((df) => df.stream !== undefined);\n if (streamingEdges.length > 0) {\n const inputStreams = new Map<string, ReadableStream<StreamEvent>>();\n for (const df of streamingEdges) {\n const stream = df.stream!;\n const [forwardCopy, materializeCopy] = stream.tee();\n inputStreams.set(df.targetTaskPortId, forwardCopy);\n df.setStream(materializeCopy);\n }\n task.runner.inputStreams = inputStreams;\n }\n }\n\n // Await any active streams on input dataflow edges so their values\n // are materialized before we read them. This applies to ALL downstream\n // tasks (both streaming and non-streaming) because copyInputFromEdgesToNode\n // reads via getPortData() which requires materialized values.\n // Streaming downstream tasks are still unblocked early by the scheduler\n // (they can start setup while upstream is streaming), but their actual\n // input data waits for upstream completion.\n await this.awaitStreamInputs(task);\n\n this.copyInputFromEdgesToNode(task);\n\n if (isStreamable) {\n return this.runStreamingTask<T>(task, input);\n }\n\n const results = await task.runner.run(input, {\n // Pass `false` when no cache so TaskRunner.handleStart explicitly clears\n // its own cached reference (undefined would leave the old value intact).\n outputCache: this.outputCache ?? false,\n updateProgress: async (task: ITask, progress: number, message?: string, ...args: any[]) =>\n await this.handleProgress(task, progress, message, ...args),\n registry: this.registry,\n });\n\n await this.pushOutputFromNodeToEdges(task, results);\n\n return {\n id: task.id,\n type: (task.constructor as any).runtype || (task.constructor as any).type,\n data: results as T,\n };\n }\n\n /**\n * For non-streaming downstream tasks, awaits completion of any active\n * streams on input dataflow edges, materializing their values.\n *\n * Streaming upstream tasks set a ReadableStream on outgoing edges.\n * Non-streaming downstream tasks cannot consume streams directly, so\n * this method reads each stream to completion and accumulates the\n * value (via Dataflow.awaitStreamValue) before the task reads its\n * inputs through the normal getPortData() path.\n */\n protected async awaitStreamInputs(task: ITask): Promise<void> {\n const dataflows = this.graph.getSourceDataflows(task.id);\n const streamPromises = dataflows\n .filter((df) => df.stream !== undefined)\n .map((df) => df.awaitStreamValue());\n if (streamPromises.length > 0) {\n await Promise.all(streamPromises);\n }\n }\n\n /**\n * Runs a streaming task within the DAG.\n * Listens for stream events to:\n * - Notify the scheduler when streaming begins (unblocking downstream streamable tasks)\n * - Push stream data to outgoing dataflow edges\n * - Have the source task accumulate and emit enriched finish events for\n * non-streaming downstream tasks (when taskNeedsAccumulation() is true)\n */\n protected async runStreamingTask<T>(\n task: ITask,\n input: TaskInput\n ): Promise<GraphSingleTaskResult<T>> {\n const streamMode = getOutputStreamMode(task.outputSchema());\n const shouldAccumulate = this.taskNeedsAccumulation(task);\n\n let streamingNotified = false;\n\n const onStatus = (status: TaskStatus) => {\n if (status === TaskStatus.STREAMING && !streamingNotified) {\n streamingNotified = true;\n this.pushStatusFromNodeToEdges(this.graph, task, TaskStatus.STREAMING);\n this.pushStreamToEdges(task, streamMode);\n this.processScheduler.onTaskStreaming(task.id);\n }\n };\n\n const onStreamStart = () => {\n this.graph.emit(\"task_stream_start\", task.id);\n };\n\n const onStreamChunk = (event: StreamEvent) => {\n this.graph.emit(\"task_stream_chunk\", task.id, event);\n };\n\n const onStreamEnd = (output: Record<string, any>) => {\n this.graph.emit(\"task_stream_end\", task.id, output);\n };\n\n task.on(\"status\", onStatus);\n task.on(\"stream_start\", onStreamStart);\n task.on(\"stream_chunk\", onStreamChunk);\n task.on(\"stream_end\", onStreamEnd);\n\n try {\n const results = await task.runner.run(input, {\n outputCache: this.outputCache ?? false,\n shouldAccumulate,\n updateProgress: async (task: ITask, progress: number, message?: string, ...args: any[]) =>\n await this.handleProgress(task, progress, message, ...args),\n registry: this.registry,\n });\n\n await this.pushOutputFromNodeToEdges(task, results);\n\n return {\n id: task.id,\n type: (task.constructor as any).runtype || (task.constructor as any).type,\n data: results as T,\n };\n } finally {\n task.off(\"status\", onStatus);\n task.off(\"stream_start\", onStreamStart);\n task.off(\"stream_chunk\", onStreamChunk);\n task.off(\"stream_end\", onStreamEnd);\n }\n }\n\n /**\n * Returns true if an event carries a port-specific delta (text-delta or object-delta).\n */\n private static isPortDelta(event: StreamEvent): event is StreamEvent & { port: string } {\n return event.type === \"text-delta\" || event.type === \"object-delta\";\n }\n\n /**\n * Creates a ReadableStream from task streaming events, optionally filtered\n * to a single port. When `portId` is undefined (DATAFLOW_ALL_PORTS), all\n * events pass through. When set, only delta events matching the port plus\n * control events (finish, error, snapshot) are enqueued.\n */\n private createStreamFromTaskEvents(task: ITask, portId?: string): ReadableStream<StreamEvent> {\n return new ReadableStream<StreamEvent>({\n start: (controller) => {\n const onChunk = (event: StreamEvent) => {\n try {\n if (\n portId !== undefined &&\n TaskGraphRunner.isPortDelta(event) &&\n event.port !== portId\n ) {\n return;\n }\n controller.enqueue(event);\n } catch {\n // Stream may be closed\n }\n };\n const onEnd = () => {\n try {\n controller.close();\n } catch {\n // Stream may already be closed\n }\n task.off(\"stream_chunk\", onChunk);\n task.off(\"stream_end\", onEnd);\n };\n task.on(\"stream_chunk\", onChunk);\n task.on(\"stream_end\", onEnd);\n },\n });\n }\n\n /**\n * Pushes stream events from a streaming task to its outgoing dataflow edges.\n * Creates per-port filtered ReadableStreams for specific-port edges and\n * unfiltered streams for DATAFLOW_ALL_PORTS edges. Within each port group,\n * uses tee() for fan-out to multiple consumers.\n */\n protected pushStreamToEdges(task: ITask, streamMode: string): void {\n const targetDataflows = this.graph.getTargetDataflows(task.id);\n if (targetDataflows.length === 0) return;\n\n // Group edges by their source port\n const groups = new Map<string, typeof targetDataflows>();\n for (const df of targetDataflows) {\n const key = df.sourceTaskPortId;\n let group = groups.get(key);\n if (!group) {\n group = [];\n groups.set(key, group);\n }\n group.push(df);\n }\n\n for (const [portKey, edges] of groups) {\n const filterPort = portKey === DATAFLOW_ALL_PORTS ? undefined : portKey;\n const stream = this.createStreamFromTaskEvents(task, filterPort);\n\n if (edges.length === 1) {\n edges[0].setStream(stream);\n } else {\n let currentStream = stream;\n for (let i = 0; i < edges.length; i++) {\n if (i === edges.length - 1) {\n edges[i].setStream(currentStream);\n } else {\n const [s1, s2] = currentStream.tee();\n edges[i].setStream(s1);\n currentStream = s2;\n }\n }\n }\n }\n }\n\n /**\n * Resets a task\n * @param graph The task graph to reset\n * @param task The task to reset\n * @param runId The run ID\n */\n protected resetTask(graph: TaskGraph, task: ITask, runId: string) {\n task.status = TaskStatus.PENDING;\n task.resetInputData();\n task.runOutputData = {};\n task.error = undefined;\n task.progress = 0;\n task.runConfig = { ...task.runConfig, runnerId: runId };\n this.pushStatusFromNodeToEdges(graph, task);\n this.pushErrorFromNodeToEdges(graph, task);\n task.emit(\"reset\");\n task.emit(\"status\", task.status);\n }\n\n /**\n * Resets the task graph, recursively\n * @param graph The task graph to reset\n */\n public resetGraph(graph: TaskGraph, runnerId: string) {\n graph.getTasks().forEach((node) => {\n this.resetTask(graph, node, runnerId);\n node.regenerateGraph();\n if (node.hasChildren()) {\n this.resetGraph(node.subGraph, runnerId);\n }\n });\n graph.getDataflows().forEach((dataflow) => {\n dataflow.reset();\n });\n }\n\n /**\n * Handles the start of task graph execution\n * @param parentSignal Optional abort signal from parent\n */\n protected async handleStart(config?: TaskGraphRunConfig): Promise<void> {\n // Setup registry - create child from global if not provided\n if (config?.registry !== undefined) {\n this.registry = config.registry;\n } else if (this.registry === undefined) {\n // Create a child container that inherits from global but allows overrides\n this.registry = new ServiceRegistry(globalServiceRegistry.container.createChildContainer());\n }\n\n this.accumulateLeafOutputs = config?.accumulateLeafOutputs !== false;\n\n if (config?.outputCache !== undefined) {\n if (typeof config.outputCache === \"boolean\") {\n if (config.outputCache === true) {\n this.outputCache = this.registry.get(TASK_OUTPUT_REPOSITORY);\n } else {\n this.outputCache = undefined;\n }\n } else {\n this.outputCache = config.outputCache;\n }\n this.graph.outputCache = this.outputCache;\n }\n // Prevent reentrancy\n if (this.running || this.reactiveRunning) {\n throw new TaskConfigurationError(\"Graph is already running\");\n }\n\n this.running = true;\n this.abortController = new AbortController();\n this.abortController.signal.addEventListener(\"abort\", () => {\n this.handleAbort();\n });\n\n if (config?.parentSignal?.aborted) {\n this.abortController.abort(); // Immediately abort if the parent is already aborted\n return;\n } else {\n config?.parentSignal?.addEventListener(\n \"abort\",\n () => {\n this.abortController?.abort();\n },\n { once: true }\n );\n }\n\n this.runId = uuid4();\n this.resetGraph(this.graph, this.runId);\n this.processScheduler.reset();\n this.inProgressTasks.clear();\n this.inProgressFunctions.clear();\n this.failedTaskErrors.clear();\n\n // Start telemetry span for the graph run\n const telemetry = getTelemetryProvider();\n if (telemetry.isEnabled) {\n this.telemetrySpan = telemetry.startSpan(\"workglow.graph.run\", {\n attributes: {\n \"workglow.graph.run_id\": this.runId,\n \"workglow.graph.task_count\": this.graph.getTasks().length,\n \"workglow.graph.dataflow_count\": this.graph.getDataflows().length,\n },\n });\n }\n\n this.graph.emit(\"start\");\n }\n\n protected async handleStartReactive(config?: TaskGraphRunConfig): Promise<void> {\n if (this.reactiveRunning) {\n throw new TaskConfigurationError(\"Graph is already running reactively\");\n }\n\n // Use explicit registry if provided; otherwise keep the existing one\n // (which is either globalServiceRegistry by default, or whatever handleStart set).\n if (config?.registry !== undefined) {\n this.registry = config.registry;\n }\n\n this.reactiveScheduler.reset();\n this.reactiveRunning = true;\n }\n\n /**\n * Handles the completion of task graph execution\n */\n protected async handleComplete(): Promise<void> {\n this.running = false;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.OK);\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.graph.emit(\"complete\");\n }\n\n protected async handleCompleteReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles errors during task graph execution\n */\n protected async handleError(error: TaskError): Promise<void> {\n await Promise.allSettled(\n this.graph.getTasks().map(async (task: ITask) => {\n if (task.status === TaskStatus.PROCESSING || task.status === TaskStatus.STREAMING) {\n return task.abort();\n }\n })\n );\n this.running = false;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.ERROR, error.message);\n this.telemetrySpan.setAttributes({ \"workglow.graph.error\": error.message });\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.graph.emit(\"error\", error);\n }\n\n protected async handleErrorReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles task graph abortion\n */\n protected async handleAbort(): Promise<void> {\n await Promise.allSettled(\n this.graph.getTasks().map(async (task: ITask) => {\n if (task.status === TaskStatus.PROCESSING || task.status === TaskStatus.STREAMING) {\n return task.abort();\n }\n })\n );\n this.running = false;\n\n if (this.telemetrySpan) {\n this.telemetrySpan.setStatus(SpanStatusCode.ERROR, \"aborted\");\n this.telemetrySpan.addEvent(\"workglow.graph.aborted\");\n this.telemetrySpan.end();\n this.telemetrySpan = undefined;\n }\n\n this.graph.emit(\"abort\");\n }\n\n protected async handleAbortReactive(): Promise<void> {\n this.reactiveRunning = false;\n }\n\n /**\n * Handles task graph disabling\n */\n protected async handleDisable(): Promise<void> {\n await Promise.allSettled(\n this.graph.getTasks().map(async (task: ITask) => {\n if (task.status === TaskStatus.PENDING) {\n return task.disable();\n }\n })\n );\n this.running = false;\n this.graph.emit(\"disabled\");\n }\n\n /**\n * Handles progress updates for the task graph by averaging `progress` across tasks whose class\n * declares its own `execute` ({@link taskPrototypeHasOwnExecute}). Other nodes are ignored.\n * @param progress Progress value (0-100)\n * @param message Optional message\n * @param args Additional arguments\n */\n protected async handleProgress(\n task: ITask,\n progress: number,\n message?: string,\n ...args: any[]\n ): Promise<void> {\n const contributors = this.graph.getTasks().filter(taskPrototypeHasOwnExecute);\n if (contributors.length > 1) {\n const sum = contributors.reduce((acc, t) => acc + t.progress, 0);\n progress = Math.round(sum / contributors.length);\n } else if (contributors.length === 1) {\n const [only] = contributors;\n progress = only.progress;\n }\n this.pushStatusFromNodeToEdges(this.graph, task);\n // Emit aggregate progress before awaiting output push so UIs (and task `emit(\"progress\")` in\n // TaskRunner) are not blocked when pushOutput/narrowInput is slow or stalls mid-run.\n this.graph.emit(\"graph_progress\", progress, message, args);\n // Only push output when the task has produced data; progress can fire mid-run with empty runOutputData\n if (task.runOutputData && Object.keys(task.runOutputData).length > 0) {\n await this.pushOutputFromNodeToEdges(task, task.runOutputData);\n }\n }\n}\n",
|
|
18
18
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { GraphResultArray } from \"../task-graph/TaskGraphRunner\";\nimport { GraphAsTask } from \"./GraphAsTask\";\nimport { TaskRunner } from \"./TaskRunner\";\nimport { TaskConfig, TaskInput, TaskOutput } from \"./TaskTypes\";\n\nexport class GraphAsTaskRunner<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends TaskConfig = TaskConfig,\n> extends TaskRunner<Input, Output, Config> {\n declare task: GraphAsTask<Input, Output, Config>;\n\n /**\n * Protected method to execute a task subgraph by delegating back to the task itself.\n */\n protected async executeTaskChildren(input: Input): Promise<GraphResultArray<Output>> {\n const unsubscribe = this.task.subGraph!.subscribe(\n \"graph_progress\",\n (progress: number, message?: string, ...args: any[]) => {\n this.task.emit(\"progress\", progress, message, ...args);\n }\n );\n const results = await this.task.subGraph!.run<Output>(input, {\n parentSignal: this.abortController?.signal,\n outputCache: this.outputCache,\n registry: this.registry,\n });\n unsubscribe();\n return results;\n }\n /**\n * Protected method for reactive execution delegation\n *\n * For GraphAsTask, we pass the parent's runInputData to the subgraph's runReactive.\n * This ensures that root tasks in the subgraph (like InputTask) receive the\n * parent's input values after resetInputData() is called.\n */\n protected async executeTaskChildrenReactive(): Promise<GraphResultArray<Output>> {\n return this.task.subGraph!.runReactive<Output>(this.task.runInputData, {\n registry: this.registry,\n });\n }\n\n protected async handleDisable(): Promise<void> {\n if (this.task.hasChildren()) {\n await this.task.subGraph!.disable();\n }\n super.handleDisable();\n }\n\n // ========================================================================\n // TaskRunner method overrides and helpers\n // ========================================================================\n\n /**\n * Execute the task\n */\n protected async executeTask(input: Input): Promise<Output | undefined> {\n if (this.task.hasChildren()) {\n const runExecuteOutputData = await this.executeTaskChildren(input);\n this.task.runOutputData = this.task.subGraph.mergeExecuteOutputsToRunOutput(\n runExecuteOutputData,\n this.task.compoundMerge\n );\n } else {\n const result = await super.executeTask(input);\n this.task.runOutputData = result ?? ({} as Output);\n }\n return this.task.runOutputData as Output;\n }\n\n /**\n * Execute the task reactively\n */\n public async executeTaskReactive(input: Input, output: Output): Promise<Output> {\n if (this.task.hasChildren()) {\n const reactiveResults = await this.executeTaskChildrenReactive();\n this.task.runOutputData = this.task.subGraph.mergeExecuteOutputsToRunOutput(\n reactiveResults,\n this.task.compoundMerge\n );\n } else {\n const reactiveResults = await super.executeTaskReactive(input, output);\n this.task.runOutputData = Object.assign({}, output, reactiveResults ?? {}) as Output;\n }\n return this.task.runOutputData as Output;\n }\n}\n",
|
|
19
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { compileSchema, SchemaNode } from \"@workglow/util\";\nimport type { DataPortSchema } from \"@workglow/util\";\nimport { computeGraphInputSchema, computeGraphOutputSchema } from \"../task-graph/GraphSchemaUtils\";\nimport { TaskGraph } from \"../task-graph/TaskGraph\";\nimport { CompoundMergeStrategy, PROPERTY_ARRAY } from \"../task-graph/TaskGraphRunner\";\nimport type { CreateLoopWorkflow, Workflow } from \"../task-graph/Workflow\";\nimport { GraphAsTaskRunner } from \"./GraphAsTaskRunner\";\nimport type { IExecuteContext } from \"./ITask\";\nimport type { StreamEvent, StreamFinish } from \"./StreamTypes\";\nimport { Task } from \"./Task\";\nimport type { JsonTaskItem, TaskGraphItemJson, TaskGraphJsonOptions } from \"./TaskJSON\";\nimport {\n TaskConfigSchema,\n type TaskConfig,\n type TaskInput,\n type TaskOutput,\n type TaskTypeName,\n} from \"./TaskTypes\";\n\nexport const graphAsTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n compoundMerge: { type: \"string\", \"x-ui-hidden\": true },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type GraphAsTaskConfig = TaskConfig & {\n /** subGraph is extracted in the constructor before validation — not in the JSON schema */\n subGraph?: TaskGraph;\n compoundMerge?: CompoundMergeStrategy;\n};\n\n/**\n * A task that contains a subgraph of tasks\n */\nexport class GraphAsTask<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends GraphAsTaskConfig = GraphAsTaskConfig,\n> extends Task<Input, Output, Config> {\n // ========================================================================\n // Static properties - should be overridden by subclasses\n // ========================================================================\n\n public static type: TaskTypeName = \"GraphAsTask\";\n public static title: string = \"Group\";\n public static description: string = \"A group of tasks that are executed together\";\n public static category: string = \"Flow Control\";\n public static compoundMerge: CompoundMergeStrategy = PROPERTY_ARRAY;\n\n /** This task has dynamic schemas that change based on the subgraph structure */\n public static hasDynamicSchemas: boolean = true;\n\n // ========================================================================\n // Constructor\n // ========================================================================\n\n constructor(input: Partial<Input> = {}, config: Partial<Config> = {}) {\n const { subGraph, ...rest } = config;\n super(input, rest as Config);\n if (subGraph) {\n this.subGraph = subGraph;\n }\n this.regenerateGraph();\n }\n\n // ========================================================================\n // TaskRunner delegation - Executes and manages the task\n // ========================================================================\n\n declare _runner: GraphAsTaskRunner<Input, Output, Config>;\n\n /**\n * Task runner for handling the task execution\n */\n override get runner(): GraphAsTaskRunner<Input, Output, Config> {\n if (!this._runner) {\n this._runner = new GraphAsTaskRunner<Input, Output, Config>(this);\n }\n return this._runner;\n }\n\n // ========================================================================\n // Static to Instance conversion methods\n // ========================================================================\n\n public static configSchema(): DataPortSchema {\n return graphAsTaskConfigSchema;\n }\n\n public get compoundMerge(): CompoundMergeStrategy {\n return this.config?.compoundMerge || (this.constructor as typeof GraphAsTask).compoundMerge;\n }\n\n public get cacheable(): boolean {\n return (\n this.runConfig?.cacheable ??\n this.config?.cacheable ??\n ((this.constructor as typeof GraphAsTask).cacheable && !this.hasChildren())\n );\n }\n\n // ========================================================================\n // Input/Output handling\n // ========================================================================\n\n /**\n * Override inputSchema to compute it dynamically from the subgraph at runtime.\n * For root tasks (no incoming edges) all input properties are collected.\n * For non-root tasks, only REQUIRED properties that are not satisfied by\n * any internal dataflow are added — this ensures that required inputs are\n * included in the graph's input schema without pulling in every optional\n * downstream property.\n */\n public inputSchema(): DataPortSchema {\n // If there's no subgraph or it has no children, fall back to the static schema\n if (!this.hasChildren()) {\n return (this.constructor as typeof Task).inputSchema();\n }\n\n return computeGraphInputSchema(this.subGraph);\n }\n\n protected _inputSchemaNode: SchemaNode | undefined;\n /**\n * Gets the compiled input schema\n */\n protected override getInputSchemaNode(): SchemaNode {\n // every graph as task is different, so we need to compile the schema for each one\n if (!this._inputSchemaNode) {\n try {\n const dataPortSchema = this.inputSchema();\n const schemaNode = Task.generateInputSchemaNode(dataPortSchema);\n this._inputSchemaNode = schemaNode;\n } catch (error) {\n // If compilation fails, fall back to accepting any object structure\n // This is a safety net for schemas that json-schema-library can't compile\n console.warn(\n `Failed to compile input schema for ${this.type}, falling back to permissive validation:`,\n error\n );\n this._inputSchemaNode = compileSchema({});\n }\n }\n return this._inputSchemaNode!;\n }\n\n /**\n\n * Override outputSchema to compute it dynamically from the subgraph at runtime\n * The output schema depends on the compoundMerge strategy and the nodes at the last level\n */\n\n public override outputSchema(): DataPortSchema {\n // If there's no subgraph or it has no children, fall back to the static schema\n if (!this.hasChildren()) {\n return (this.constructor as typeof Task).outputSchema();\n }\n\n return computeGraphOutputSchema(this.subGraph);\n }\n\n /**\n * Resets input data to defaults\n */\n public resetInputData(): void {\n super.resetInputData();\n if (this.hasChildren()) {\n this.subGraph!.getTasks().forEach((node) => {\n node.resetInputData();\n });\n this.subGraph!.getDataflows().forEach((dataflow) => {\n dataflow.reset();\n });\n }\n }\n\n // ========================================================================\n // Streaming pass-through\n // ========================================================================\n\n /**\n * Stream pass-through for compound tasks: runs the subgraph and forwards\n * streaming events from ending nodes to the outer graph. Also re-yields\n * any input streams from upstream for cases where this GraphAsTask is\n * itself downstream of another streaming task.\n */\n async *executeStream(input: Input, context: IExecuteContext): AsyncIterable<StreamEvent<Output>> {\n // Forward upstream input streams first (pass-through from outer graph)\n if (context.inputStreams) {\n for (const [, stream] of context.inputStreams) {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value.type === \"finish\") continue;\n yield value as StreamEvent<Output>;\n }\n } finally {\n reader.releaseLock();\n }\n }\n }\n\n // Run the subgraph and forward streaming events from ending nodes\n if (this.hasChildren()) {\n const endingNodeIds = new Set<unknown>();\n const tasks = this.subGraph.getTasks();\n for (const task of tasks) {\n if (this.subGraph.getTargetDataflows(task.id).length === 0) {\n endingNodeIds.add(task.id);\n }\n }\n\n const eventQueue: StreamEvent<Output>[] = [];\n let resolveWaiting: (() => void) | undefined;\n let subgraphDone = false;\n\n const unsub = this.subGraph.subscribeToTaskStreaming({\n onStreamChunk: (taskId, event) => {\n if (endingNodeIds.has(taskId) && event.type !== \"finish\") {\n eventQueue.push(event as StreamEvent<Output>);\n resolveWaiting?.();\n }\n },\n });\n\n const runPromise = this.subGraph\n .run<Output>(input, { parentSignal: context.signal, accumulateLeafOutputs: false })\n .then((results) => {\n subgraphDone = true;\n resolveWaiting?.();\n return results;\n });\n\n // Yield events as they arrive from ending nodes\n while (!subgraphDone) {\n if (eventQueue.length === 0) {\n await new Promise<void>((resolve) => {\n resolveWaiting = resolve;\n });\n }\n while (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n }\n }\n // Drain any remaining events\n while (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n }\n\n unsub();\n\n const results = await runPromise;\n const mergedOutput = this.subGraph.mergeExecuteOutputsToRunOutput(\n results,\n this.compoundMerge\n ) as Output;\n yield { type: \"finish\", data: mergedOutput } as StreamFinish<Output>;\n } else {\n yield { type: \"finish\", data: input as unknown as Output } as StreamFinish<Output>;\n }\n }\n\n // ========================================================================\n // Compound task methods\n // ========================================================================\n\n /**\n * Regenerates the subtask graph and emits a \"regenerate\" event\n *\n * Subclasses should override this method to implement the actual graph\n * regeneration logic, but all they need to do is call this method to\n * emit the \"regenerate\" event.\n */\n public regenerateGraph(): void {\n this._inputSchemaNode = undefined;\n this.events.emit(\"regenerate\");\n }\n\n // ========================================================================\n // Serialization methods\n // ========================================================================\n\n /**\n * Serializes the task and its subtasks into a format that can be stored\n * @returns The serialized task and subtasks\n */\n public override toJSON(options?: TaskGraphJsonOptions): TaskGraphItemJson {\n let json = super.toJSON(options);\n const hasChildren = this.hasChildren();\n if (hasChildren) {\n json = {\n ...json,\n merge: this.compoundMerge,\n subgraph: this.subGraph!.toJSON(options),\n };\n }\n return json;\n }\n\n /**\n * Converts the task to a JSON format suitable for dependency tracking\n * @returns The task and subtasks in JSON thats easier for humans to read\n */\n public override toDependencyJSON(options?: TaskGraphJsonOptions): JsonTaskItem {\n const json = this.toJSON(options);\n if (this.hasChildren()) {\n if (\"subgraph\" in json) {\n delete json.subgraph;\n }\n return { ...json, subtasks: this.subGraph!.toDependencyJSON(options) };\n }\n return json;\n }\n}\n\ndeclare module \"../task-graph/Workflow\" {\n interface Workflow {\n /**\n * Starts a group that wraps inner tasks in a GraphAsTask subgraph.\n * Use .endGroup() to close the group and return to the parent workflow.\n */\n group: CreateLoopWorkflow<TaskInput, TaskOutput, GraphAsTaskConfig>;\n\n /**\n * Ends the group and returns to the parent workflow.\n */\n endGroup(): Workflow;\n }\n}\n\n// Prototype assignments live in Workflow.ts (bottom of file) to avoid\n// circular-dependency issues at module evaluation time.\n",
|
|
19
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { compileSchema, type SchemaNode } from \"@workglow/schema\";\nimport type { DataPortSchema } from \"@workglow/util\";\nimport { computeGraphInputSchema, computeGraphOutputSchema } from \"../task-graph/GraphSchemaUtils\";\nimport { TaskGraph } from \"../task-graph/TaskGraph\";\nimport { CompoundMergeStrategy, PROPERTY_ARRAY } from \"../task-graph/TaskGraphRunner\";\nimport type { CreateLoopWorkflow, Workflow } from \"../task-graph/Workflow\";\nimport { GraphAsTaskRunner } from \"./GraphAsTaskRunner\";\nimport type { IExecuteContext } from \"./ITask\";\nimport type { StreamEvent, StreamFinish } from \"./StreamTypes\";\nimport { Task } from \"./Task\";\nimport type { JsonTaskItem, TaskGraphItemJson, TaskGraphJsonOptions } from \"./TaskJSON\";\nimport {\n TaskConfigSchema,\n type TaskConfig,\n type TaskInput,\n type TaskOutput,\n type TaskTypeName,\n} from \"./TaskTypes\";\n\nexport const graphAsTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...TaskConfigSchema[\"properties\"],\n compoundMerge: { type: \"string\", \"x-ui-hidden\": true },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\nexport type GraphAsTaskConfig = TaskConfig & {\n /** subGraph is extracted in the constructor before validation — not in the JSON schema */\n subGraph?: TaskGraph;\n compoundMerge?: CompoundMergeStrategy;\n};\n\n/**\n * A task that contains a subgraph of tasks\n */\nexport class GraphAsTask<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends GraphAsTaskConfig = GraphAsTaskConfig,\n> extends Task<Input, Output, Config> {\n // ========================================================================\n // Static properties - should be overridden by subclasses\n // ========================================================================\n\n public static type: TaskTypeName = \"GraphAsTask\";\n public static title: string = \"Group\";\n public static description: string = \"A group of tasks that are executed together\";\n public static category: string = \"Flow Control\";\n public static compoundMerge: CompoundMergeStrategy = PROPERTY_ARRAY;\n\n /** This task has dynamic schemas that change based on the subgraph structure */\n public static hasDynamicSchemas: boolean = true;\n\n // ========================================================================\n // Constructor\n // ========================================================================\n\n constructor(input: Partial<Input> = {}, config: Partial<Config> = {}) {\n const { subGraph, ...rest } = config;\n super(input, rest as Config);\n if (subGraph) {\n this.subGraph = subGraph;\n }\n this.regenerateGraph();\n }\n\n // ========================================================================\n // TaskRunner delegation - Executes and manages the task\n // ========================================================================\n\n declare _runner: GraphAsTaskRunner<Input, Output, Config>;\n\n /**\n * Task runner for handling the task execution\n */\n override get runner(): GraphAsTaskRunner<Input, Output, Config> {\n if (!this._runner) {\n this._runner = new GraphAsTaskRunner<Input, Output, Config>(this);\n }\n return this._runner;\n }\n\n // ========================================================================\n // Static to Instance conversion methods\n // ========================================================================\n\n public static configSchema(): DataPortSchema {\n return graphAsTaskConfigSchema;\n }\n\n public get compoundMerge(): CompoundMergeStrategy {\n return this.config?.compoundMerge || (this.constructor as typeof GraphAsTask).compoundMerge;\n }\n\n public get cacheable(): boolean {\n return (\n this.runConfig?.cacheable ??\n this.config?.cacheable ??\n ((this.constructor as typeof GraphAsTask).cacheable && !this.hasChildren())\n );\n }\n\n // ========================================================================\n // Input/Output handling\n // ========================================================================\n\n /**\n * Override inputSchema to compute it dynamically from the subgraph at runtime.\n * For root tasks (no incoming edges) all input properties are collected.\n * For non-root tasks, only REQUIRED properties that are not satisfied by\n * any internal dataflow are added — this ensures that required inputs are\n * included in the graph's input schema without pulling in every optional\n * downstream property.\n */\n public inputSchema(): DataPortSchema {\n // If there's no subgraph or it has no children, fall back to the static schema\n if (!this.hasChildren()) {\n return (this.constructor as typeof Task).inputSchema();\n }\n\n return computeGraphInputSchema(this.subGraph);\n }\n\n protected _inputSchemaNode: SchemaNode | undefined;\n /**\n * Gets the compiled input schema\n */\n protected override getInputSchemaNode(): SchemaNode {\n // every graph as task is different, so we need to compile the schema for each one\n if (!this._inputSchemaNode) {\n try {\n const dataPortSchema = this.inputSchema();\n const schemaNode = Task.generateInputSchemaNode(dataPortSchema);\n this._inputSchemaNode = schemaNode;\n } catch (error) {\n // If compilation fails, fall back to accepting any object structure\n // This is a safety net for schemas that json-schema-library can't compile\n console.warn(\n `Failed to compile input schema for ${this.type}, falling back to permissive validation:`,\n error\n );\n this._inputSchemaNode = compileSchema({});\n }\n }\n return this._inputSchemaNode!;\n }\n\n /**\n\n * Override outputSchema to compute it dynamically from the subgraph at runtime\n * The output schema depends on the compoundMerge strategy and the nodes at the last level\n */\n\n public override outputSchema(): DataPortSchema {\n // If there's no subgraph or it has no children, fall back to the static schema\n if (!this.hasChildren()) {\n return (this.constructor as typeof Task).outputSchema();\n }\n\n return computeGraphOutputSchema(this.subGraph);\n }\n\n /**\n * Resets input data to defaults\n */\n public resetInputData(): void {\n super.resetInputData();\n if (this.hasChildren()) {\n this.subGraph!.getTasks().forEach((node) => {\n node.resetInputData();\n });\n this.subGraph!.getDataflows().forEach((dataflow) => {\n dataflow.reset();\n });\n }\n }\n\n // ========================================================================\n // Streaming pass-through\n // ========================================================================\n\n /**\n * Stream pass-through for compound tasks: runs the subgraph and forwards\n * streaming events from ending nodes to the outer graph. Also re-yields\n * any input streams from upstream for cases where this GraphAsTask is\n * itself downstream of another streaming task.\n */\n async *executeStream(input: Input, context: IExecuteContext): AsyncIterable<StreamEvent<Output>> {\n // Forward upstream input streams first (pass-through from outer graph)\n if (context.inputStreams) {\n for (const [, stream] of context.inputStreams) {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value.type === \"finish\") continue;\n yield value as StreamEvent<Output>;\n }\n } finally {\n reader.releaseLock();\n }\n }\n }\n\n // Run the subgraph and forward streaming events from ending nodes\n if (this.hasChildren()) {\n const endingNodeIds = new Set<unknown>();\n const tasks = this.subGraph.getTasks();\n for (const task of tasks) {\n if (this.subGraph.getTargetDataflows(task.id).length === 0) {\n endingNodeIds.add(task.id);\n }\n }\n\n const eventQueue: StreamEvent<Output>[] = [];\n let resolveWaiting: (() => void) | undefined;\n let subgraphDone = false;\n\n const unsub = this.subGraph.subscribeToTaskStreaming({\n onStreamChunk: (taskId, event) => {\n if (endingNodeIds.has(taskId) && event.type !== \"finish\") {\n eventQueue.push(event as StreamEvent<Output>);\n resolveWaiting?.();\n }\n },\n });\n\n const runPromise = this.subGraph\n .run<Output>(input, { parentSignal: context.signal, accumulateLeafOutputs: false })\n .then((results) => {\n subgraphDone = true;\n resolveWaiting?.();\n return results;\n });\n\n // Yield events as they arrive from ending nodes\n while (!subgraphDone) {\n if (eventQueue.length === 0) {\n await new Promise<void>((resolve) => {\n resolveWaiting = resolve;\n });\n }\n while (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n }\n }\n // Drain any remaining events\n while (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n }\n\n unsub();\n\n const results = await runPromise;\n const mergedOutput = this.subGraph.mergeExecuteOutputsToRunOutput(\n results,\n this.compoundMerge\n ) as Output;\n yield { type: \"finish\", data: mergedOutput } as StreamFinish<Output>;\n } else {\n yield { type: \"finish\", data: input as unknown as Output } as StreamFinish<Output>;\n }\n }\n\n // ========================================================================\n // Compound task methods\n // ========================================================================\n\n /**\n * Regenerates the subtask graph and emits a \"regenerate\" event\n *\n * Subclasses should override this method to implement the actual graph\n * regeneration logic, but all they need to do is call this method to\n * emit the \"regenerate\" event.\n */\n public regenerateGraph(): void {\n this._inputSchemaNode = undefined;\n this.events.emit(\"regenerate\");\n }\n\n // ========================================================================\n // Serialization methods\n // ========================================================================\n\n /**\n * Serializes the task and its subtasks into a format that can be stored\n * @returns The serialized task and subtasks\n */\n public override toJSON(options?: TaskGraphJsonOptions): TaskGraphItemJson {\n let json = super.toJSON(options);\n const hasChildren = this.hasChildren();\n if (hasChildren) {\n json = {\n ...json,\n merge: this.compoundMerge,\n subgraph: this.subGraph!.toJSON(options),\n };\n }\n return json;\n }\n\n /**\n * Converts the task to a JSON format suitable for dependency tracking\n * @returns The task and subtasks in JSON thats easier for humans to read\n */\n public override toDependencyJSON(options?: TaskGraphJsonOptions): JsonTaskItem {\n const json = this.toJSON(options);\n if (this.hasChildren()) {\n if (\"subgraph\" in json) {\n delete json.subgraph;\n }\n return { ...json, subtasks: this.subGraph!.toDependencyJSON(options) };\n }\n return json;\n }\n}\n\ndeclare module \"../task-graph/Workflow\" {\n interface Workflow {\n /**\n * Starts a group that wraps inner tasks in a GraphAsTask subgraph.\n * Use .endGroup() to close the group and return to the parent workflow.\n */\n group: CreateLoopWorkflow<TaskInput, TaskOutput, GraphAsTaskConfig>;\n\n /**\n * Ends the group and returns to the parent workflow.\n */\n endGroup(): Workflow;\n }\n}\n\n// Prototype assignments live in Workflow.ts (bottom of file) to avoid\n// circular-dependency issues at module evaluation time.\n",
|
|
20
20
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { DataPortSchema } from \"@workglow/util\";\nimport type { GraphAsTask } from \"../task/GraphAsTask\";\nimport type { IExecuteContext, ITask } from \"../task/ITask\";\nimport { Task } from \"../task/Task\";\nimport type { DataPorts } from \"../task/TaskTypes\";\nimport { DATAFLOW_ALL_PORTS } from \"./Dataflow\";\nimport type { ITaskGraph } from \"./ITaskGraph\";\nimport type { IWorkflow } from \"./IWorkflow\";\nimport { TaskGraph } from \"./TaskGraph\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PipeFunction<I extends DataPorts = any, O extends DataPorts = any> = (\n input: I,\n context: IExecuteContext\n) => O | Promise<O>;\n\nexport type Taskish<A extends DataPorts = DataPorts, B extends DataPorts = DataPorts> =\n | PipeFunction<A, B>\n | ITask<A, B>\n | ITaskGraph\n | IWorkflow<A, B>;\n\n// ============================================================================\n// Wrapper classes (lazily initialized to avoid circular dependency with\n// GraphAsTask — which transitively imports Workflow which imports this file)\n// ============================================================================\n\ntype GraphAsTaskConstructor = typeof GraphAsTask;\n\nlet _OwnGraphTask: GraphAsTaskConstructor;\nlet _OwnWorkflowTask: GraphAsTaskConstructor;\nlet _GraphTask: GraphAsTaskConstructor;\nlet _ConvWorkflowTask: GraphAsTaskConstructor;\n\nfunction getWrapperClasses() {\n if (!_OwnGraphTask) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const GaT = (require(\"../task/GraphAsTask\") as { GraphAsTask: GraphAsTaskConstructor })\n .GraphAsTask;\n\n class ListeningGraphAsTask extends GaT<any, any> {\n constructor(input: any, config: any) {\n super(input, config);\n this.subGraph.on(\"start\", () => {\n this.emit(\"start\");\n });\n this.subGraph.on(\"complete\", () => {\n this.emit(\"complete\");\n });\n this.subGraph.on(\"error\", (e) => {\n this.emit(\"error\", e);\n });\n }\n }\n\n class OwnGraphTask extends ListeningGraphAsTask {\n public static readonly type = \"Own[Graph]\";\n }\n\n class OwnWorkflowTask extends ListeningGraphAsTask {\n public static readonly type = \"Own[Workflow]\";\n }\n\n class GraphTask extends GaT {\n public static readonly type = \"Graph\";\n }\n\n class ConvWorkflowTask extends GaT {\n public static readonly type = \"Workflow\";\n }\n\n _OwnGraphTask = OwnGraphTask as unknown as GraphAsTaskConstructor;\n _OwnWorkflowTask = OwnWorkflowTask as unknown as GraphAsTaskConstructor;\n _GraphTask = GraphTask as unknown as GraphAsTaskConstructor;\n _ConvWorkflowTask = ConvWorkflowTask as unknown as GraphAsTaskConstructor;\n }\n}\n\n// ============================================================================\n// ensureTask — converts Taskish values into ITask instances\n// ============================================================================\n\nfunction convertPipeFunctionToTask<I extends DataPorts, O extends DataPorts>(\n fn: PipeFunction<I, O>,\n config?: any\n): ITask<I, O> {\n class QuickTask extends Task<I, O> {\n public static type = fn.name ? `𝑓 ${fn.name}` : \"𝑓\";\n public static inputSchema = () => {\n return {\n type: \"object\",\n properties: {\n [DATAFLOW_ALL_PORTS]: {},\n },\n additionalProperties: false,\n } as const satisfies DataPortSchema;\n };\n public static outputSchema = () => {\n return {\n type: \"object\",\n properties: {\n [DATAFLOW_ALL_PORTS]: {},\n },\n additionalProperties: false,\n } as const satisfies DataPortSchema;\n };\n public static cacheable = false;\n public async execute(input: I, context: IExecuteContext) {\n return fn(input, context);\n }\n }\n return new QuickTask({}, config);\n}\n\n/**\n * Checks if a value implements the IWorkflow interface (has a `graph` property\n * that is a TaskGraph and a `run` method). Used instead of `instanceof Workflow`\n * to avoid a circular dependency with the Workflow module.\n */\nfunction isWorkflowLike(arg: unknown): arg is IWorkflow {\n return (\n arg != null &&\n typeof arg === \"object\" &&\n \"graph\" in arg &&\n arg.graph instanceof TaskGraph &&\n \"run\" in arg &&\n typeof arg.run === \"function\"\n );\n}\n\nexport function ensureTask<I extends DataPorts, O extends DataPorts>(\n arg: Taskish<I, O>,\n config: any = {}\n): ITask<any, any, any> {\n if (arg instanceof Task) {\n return arg;\n }\n if (arg instanceof TaskGraph) {\n getWrapperClasses();\n const { isOwned, ...cleanConfig } = config;\n if (isOwned) {\n return new _OwnGraphTask({}, { ...cleanConfig, subGraph: arg });\n } else {\n return new _GraphTask({}, { ...cleanConfig, subGraph: arg });\n }\n }\n if (isWorkflowLike(arg)) {\n getWrapperClasses();\n const { isOwned, ...cleanConfig } = config;\n if (isOwned) {\n return new _OwnWorkflowTask({}, { ...cleanConfig, subGraph: arg.graph });\n } else {\n return new _ConvWorkflowTask({}, { ...cleanConfig, subGraph: arg.graph });\n }\n }\n return convertPipeFunctionToTask(arg as PipeFunction<I, O>, config);\n}\n",
|
|
21
21
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { EventParameters } from \"@workglow/util\";\nimport type { StreamEvent } from \"../task/StreamTypes\";\nimport { TaskIdType } from \"../task/TaskTypes\";\nimport { DataflowIdType } from \"./Dataflow\";\n\n/**\n * Events that can be emitted by the TaskGraph\n */\n\nexport type TaskGraphStatusListeners = {\n graph_progress: (progress: number, message?: string, ...args: any[]) => void;\n start: () => void;\n complete: () => void;\n error: (error: Error) => void;\n abort: () => void;\n disabled: () => void;\n /** Fired when a task in the graph starts streaming */\n task_stream_start: (taskId: TaskIdType) => void;\n /** Fired for each stream chunk produced by a task in the graph */\n task_stream_chunk: (taskId: TaskIdType, event: StreamEvent) => void;\n /** Fired when a task in the graph finishes streaming */\n task_stream_end: (taskId: TaskIdType, output: Record<string, any>) => void;\n};\nexport type TaskGraphStatusEvents = keyof TaskGraphStatusListeners;\nexport type TaskGraphStatusListener<Event extends TaskGraphStatusEvents> =\n TaskGraphStatusListeners[Event];\nexport type TaskGraphEventStatusParameters<Event extends TaskGraphStatusEvents> = EventParameters<\n TaskGraphStatusListeners,\n Event\n>;\n\nexport type GraphEventDagListeners = {\n task_added: (taskId: TaskIdType) => void;\n task_removed: (taskId: TaskIdType) => void;\n task_replaced: (taskId: TaskIdType) => void;\n dataflow_added: (dataflowId: DataflowIdType) => void;\n dataflow_removed: (dataflowId: DataflowIdType) => void;\n dataflow_replaced: (dataflowId: DataflowIdType) => void;\n};\nexport type GraphEventDagEvents = keyof GraphEventDagListeners;\nexport type GraphEventDagListener<Event extends GraphEventDagEvents> =\n GraphEventDagListeners[Event];\nexport type GraphEventDagParameters<Event extends GraphEventDagEvents> = EventParameters<\n GraphEventDagListeners,\n Event\n>;\n\nexport type TaskGraphListeners = TaskGraphStatusListeners & GraphEventDagListeners;\nexport type TaskGraphEvents = keyof TaskGraphListeners;\nexport type TaskGraphEventListener<Event extends TaskGraphEvents> = TaskGraphListeners[Event];\nexport type TaskGraphEventParameters<Event extends TaskGraphEvents> = EventParameters<\n TaskGraphListeners,\n Event\n>;\n\nexport const EventDagToTaskGraphMapping = {\n \"node-added\": \"task_added\",\n \"node-removed\": \"task_removed\",\n \"node-replaced\": \"task_replaced\",\n \"edge-added\": \"dataflow_added\",\n \"edge-removed\": \"dataflow_removed\",\n \"edge-replaced\": \"dataflow_replaced\",\n} as const;\n\nexport const EventTaskGraphToDagMapping = {\n task_added: \"node-added\",\n task_removed: \"node-removed\",\n task_replaced: \"node-replaced\",\n dataflow_added: \"edge-added\",\n dataflow_removed: \"edge-removed\",\n dataflow_replaced: \"edge-replaced\",\n} as const;\n",
|
|
22
22
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { DirectedAcyclicGraph, EventEmitter, ServiceRegistry, uuid4 } from \"@workglow/util\";\nimport { TaskOutputRepository } from \"../storage/TaskOutputRepository\";\nimport type { ITask } from \"../task/ITask\";\nimport type { StreamEvent } from \"../task/StreamTypes\";\nimport type { JsonTaskItem, TaskGraphJson, TaskGraphJsonOptions } from \"../task/TaskJSON\";\nimport type { TaskIdType, TaskInput, TaskOutput, TaskStatus } from \"../task/TaskTypes\";\nimport { ensureTask, type PipeFunction } from \"./Conversions\";\nimport { Dataflow, type DataflowIdType } from \"./Dataflow\";\nimport { addBoundaryNodesToDependencyJson, addBoundaryNodesToGraphJson } from \"./GraphSchemaUtils\";\nimport type { ITaskGraph } from \"./ITaskGraph\";\nimport {\n EventTaskGraphToDagMapping,\n GraphEventDagEvents,\n GraphEventDagParameters,\n TaskGraphEventListener,\n TaskGraphEvents,\n TaskGraphEventStatusParameters,\n TaskGraphStatusEvents,\n TaskGraphStatusListeners,\n} from \"./TaskGraphEvents\";\nimport {\n CompoundMergeStrategy,\n GraphResult,\n type GraphResultArray,\n TaskGraphRunner,\n} from \"./TaskGraphRunner\";\n\n/**\n * Configuration for running a task graph\n */\nexport interface TaskGraphRunConfig {\n /** Optional output cache to use for this task graph */\n outputCache?: TaskOutputRepository | boolean;\n /** Optional signal to abort the task graph */\n parentSignal?: AbortSignal;\n /** Optional service registry to use for this task graph (creates child from global if not provided) */\n registry?: ServiceRegistry;\n /**\n * When true, streaming leaf tasks (no outgoing edges) accumulate their full\n * output so the workflow return value is complete. Defaults to true.\n * Pass false for subgraph runs where the parent handles streaming via\n * subscriptions and does not rely on the return value for stream data.\n */\n accumulateLeafOutputs?: boolean;\n}\n\nexport interface TaskGraphRunReactiveConfig extends TaskGraphRunConfig {\n /** Optional service registry to use for this task graph */\n registry?: ServiceRegistry;\n}\n\nclass TaskGraphDAG extends DirectedAcyclicGraph<\n ITask<any, any, any>,\n Dataflow,\n TaskIdType,\n DataflowIdType\n> {\n constructor() {\n super(\n (task: ITask<any, any, any>) => task.id,\n (dataflow: Dataflow) => dataflow.id\n );\n }\n}\n\ninterface TaskGraphConstructorConfig {\n outputCache?: TaskOutputRepository;\n dag?: TaskGraphDAG;\n}\n\n/**\n * Represents a task graph, a directed acyclic graph of tasks and data flows\n */\nexport class TaskGraph implements ITaskGraph {\n /** Optional output cache to use for this task graph */\n public outputCache?: TaskOutputRepository;\n\n /**\n * Constructor for TaskGraph\n * @param config Configuration for the task graph\n */\n constructor({ outputCache, dag }: TaskGraphConstructorConfig = {}) {\n this.outputCache = outputCache;\n this._dag = dag || new TaskGraphDAG();\n }\n\n private _dag: TaskGraphDAG;\n\n private _runner: TaskGraphRunner | undefined;\n public get runner(): TaskGraphRunner {\n if (!this._runner) {\n this._runner = new TaskGraphRunner(this, this.outputCache);\n }\n return this._runner;\n }\n\n // ========================================================================\n // Public methods\n // ========================================================================\n\n /**\n * Runs the task graph\n * @param config Configuration for the graph run\n * @returns A promise that resolves when all tasks are complete\n * @throws TaskError if any tasks have failed\n */\n public run<ExecuteOutput extends TaskOutput>(\n input: TaskInput = {} as TaskInput,\n config: TaskGraphRunConfig = {}\n ): Promise<GraphResultArray<ExecuteOutput>> {\n return this.runner.runGraph<ExecuteOutput>(input, {\n outputCache: config?.outputCache || this.outputCache,\n parentSignal: config?.parentSignal || undefined,\n accumulateLeafOutputs: config?.accumulateLeafOutputs,\n registry: config?.registry,\n });\n }\n\n /**\n * Runs the task graph reactively\n * @returns A promise that resolves when all tasks are complete\n * @throws TaskError if any tasks have failed\n */\n public runReactive<Output extends TaskOutput>(\n input: TaskInput = {} as TaskInput,\n config: TaskGraphRunConfig = {}\n ): Promise<GraphResultArray<Output>> {\n return this.runner.runGraphReactive<Output>(input, config);\n }\n\n /**\n * Merges the execute output to the run output\n * @param results The execute output\n * @param compoundMerge The compound merge strategy to use\n * @returns The run output\n */\n\n public mergeExecuteOutputsToRunOutput<\n ExecuteOutput extends TaskOutput,\n Merge extends CompoundMergeStrategy = CompoundMergeStrategy,\n >(\n results: GraphResultArray<ExecuteOutput>,\n compoundMerge: Merge\n ): GraphResult<ExecuteOutput, Merge> {\n return this.runner.mergeExecuteOutputsToRunOutput(results, compoundMerge);\n }\n\n /**\n * Aborts the task graph\n */\n public abort() {\n this.runner.abort();\n }\n\n /**\n * Disables the task graph\n */\n public async disable() {\n await this.runner.disable();\n }\n\n /**\n * Retrieves a task from the task graph by its id\n * @param id The id of the task to retrieve\n * @returns The task with the given id, or undefined if not found\n */\n public getTask(id: TaskIdType): ITask<any, any, any> | undefined {\n return this._dag.getNode(id);\n }\n\n /**\n * Retrieves all tasks in the task graph\n * @returns An array of tasks in the task graph\n */\n public getTasks(): ITask<any, any, any>[] {\n return this._dag.getNodes();\n }\n\n /**\n * Retrieves all tasks in the task graph topologically sorted\n * @returns An array of tasks in the task graph topologically sorted\n */\n public topologicallySortedNodes(): ITask<any, any, any>[] {\n return this._dag.topologicallySortedNodes();\n }\n\n /**\n * Adds a task to the task graph\n * @param task The task to add\n * @returns The current task graph\n */\n public addTask(fn: PipeFunction<any, any>, config?: any): unknown;\n public addTask(task: ITask<any, any, any>): unknown;\n public addTask(task: ITask<any, any, any> | PipeFunction<any, any>, config?: any): unknown {\n return this._dag.addNode(ensureTask(task, config));\n }\n\n /**\n * Adds multiple tasks to the task graph\n * @param tasks The tasks to add\n * @returns The current task graph\n */\n public addTasks(tasks: PipeFunction<any, any>[]): unknown[];\n public addTasks(tasks: ITask<any, any, any>[]): unknown[];\n public addTasks(tasks: ITask<any, any, any>[] | PipeFunction<any, any>[]): unknown[] {\n return this._dag.addNodes(tasks.map(ensureTask));\n }\n\n /**\n * Adds a data flow to the task graph\n * @param dataflow The data flow to add\n * @returns The current task graph\n */\n public addDataflow(dataflow: Dataflow) {\n return this._dag.addEdge(dataflow.sourceTaskId, dataflow.targetTaskId, dataflow);\n }\n\n /**\n * Adds multiple data flows to the task graph\n * @param dataflows The data flows to add\n * @returns The current task graph\n */\n public addDataflows(dataflows: Dataflow[]) {\n const addedEdges = dataflows.map<[s: unknown, t: unknown, e: Dataflow]>((edge) => {\n return [edge.sourceTaskId, edge.targetTaskId, edge];\n });\n return this._dag.addEdges(addedEdges);\n }\n\n /**\n * Retrieves a data flow from the task graph by its id\n * @param id The id of the data flow to retrieve\n * @returns The data flow with the given id, or undefined if not found\n */\n public getDataflow(id: DataflowIdType): Dataflow | undefined {\n // @ts-ignore\n for (const i in this._dag.adjacency) {\n // @ts-ignore\n for (const j in this._dag.adjacency[i]) {\n // @ts-ignore\n const maybeEdges = this._dag.adjacency[i][j];\n if (maybeEdges !== null) {\n for (const edge of maybeEdges) {\n // @ts-ignore\n if (this._dag.edgeIdentity(edge, \"\", \"\") == id) {\n return edge;\n }\n }\n }\n }\n }\n }\n\n /**\n * Retrieves all data flows in the task graph\n * @returns An array of data flows in the task graph\n */\n public getDataflows(): Dataflow[] {\n return this._dag.getEdges().map((edge) => edge[2]);\n }\n\n /**\n * Removes a data flow from the task graph\n * @param dataflow The data flow to remove\n * @returns The current task graph\n */\n public removeDataflow(dataflow: Dataflow) {\n return this._dag.removeEdge(dataflow.sourceTaskId, dataflow.targetTaskId, dataflow.id);\n }\n\n /**\n * Retrieves the data flows that are sources of a given task\n * @param taskId The id of the task to retrieve sources for\n * @returns An array of data flows that are sources of the given task\n */\n public getSourceDataflows(taskId: unknown): Dataflow[] {\n return this._dag.inEdges(taskId).map(([, , dataflow]) => dataflow);\n }\n\n /**\n * Retrieves the data flows that are targets of a given task\n * @param taskId The id of the task to retrieve targets for\n * @returns An array of data flows that are targets of the given task\n */\n public getTargetDataflows(taskId: unknown): Dataflow[] {\n return this._dag.outEdges(taskId).map(([, , dataflow]) => dataflow);\n }\n\n /**\n * Retrieves the tasks that are sources of a given task\n * @param taskId The id of the task to retrieve sources for\n * @returns An array of tasks that are sources of the given task\n */\n public getSourceTasks(taskId: unknown): ITask<any, any, any>[] {\n return this.getSourceDataflows(taskId).map((dataflow) => this.getTask(dataflow.sourceTaskId)!);\n }\n\n /**\n * Retrieves the tasks that are targets of a given task\n * @param taskId The id of the task to retrieve targets for\n * @returns An array of tasks that are targets of the given task\n */\n public getTargetTasks(taskId: unknown): ITask<any, any, any>[] {\n return this.getTargetDataflows(taskId).map((dataflow) => this.getTask(dataflow.targetTaskId)!);\n }\n\n /**\n * Removes a task from the task graph\n * @param taskId The id of the task to remove\n * @returns The current task graph\n */\n public removeTask(taskId: unknown) {\n return this._dag.removeNode(taskId);\n }\n\n public resetGraph() {\n this.runner.resetGraph(this, uuid4());\n }\n\n /**\n * Converts the task graph to a JSON format suitable for dependency tracking\n * @param options Options controlling serialization (e.g., boundary nodes)\n * @returns A TaskGraphJson object representing the tasks and dataflows\n */\n public toJSON(options?: TaskGraphJsonOptions): TaskGraphJson {\n const tasks = this.getTasks().map((node) => node.toJSON(options));\n const dataflows = this.getDataflows().map((df) => df.toJSON());\n let json: TaskGraphJson = {\n tasks,\n dataflows,\n };\n if (options?.withBoundaryNodes) {\n json = addBoundaryNodesToGraphJson(json, this);\n }\n return json;\n }\n\n /**\n * Converts the task graph to a JSON format suitable for dependency tracking\n * @param options Options controlling serialization (e.g., boundary nodes)\n * @returns An array of JsonTaskItem objects, each representing a task and its dependencies\n */\n public toDependencyJSON(options?: TaskGraphJsonOptions): JsonTaskItem[] {\n const tasks = this.getTasks().flatMap((node) => node.toDependencyJSON(options));\n this.getDataflows().forEach((df) => {\n const target = tasks.find((node) => node.id === df.targetTaskId)!;\n if (!target.dependencies) {\n target.dependencies = {};\n }\n const targetDeps = target.dependencies[df.targetTaskPortId];\n if (!targetDeps) {\n target.dependencies[df.targetTaskPortId] = {\n id: df.sourceTaskId,\n output: df.sourceTaskPortId,\n };\n } else {\n if (Array.isArray(targetDeps)) {\n targetDeps.push({\n id: df.sourceTaskId,\n output: df.sourceTaskPortId,\n });\n } else {\n target.dependencies[df.targetTaskPortId] = [\n targetDeps,\n { id: df.sourceTaskId, output: df.sourceTaskPortId },\n ];\n }\n }\n });\n if (options?.withBoundaryNodes) {\n return addBoundaryNodesToDependencyJson(tasks, this);\n }\n return tasks;\n }\n\n // ========================================================================\n // Event handling\n // ========================================================================\n\n /**\n * Event emitter for task lifecycle events\n */\n public get events(): EventEmitter<TaskGraphStatusListeners> {\n if (!this._events) {\n this._events = new EventEmitter<TaskGraphStatusListeners>();\n }\n return this._events;\n }\n protected _events: EventEmitter<TaskGraphStatusListeners> | undefined;\n\n /**\n * Subscribes to an event\n * @param name - The event name to listen for\n * @param fn - The callback function to execute when the event occurs\n * @returns a function to unsubscribe from the event\n */\n public subscribe<Event extends TaskGraphEvents>(\n name: Event,\n fn: TaskGraphEventListener<Event>\n ): () => void {\n this.on(name, fn);\n return () => this.off(name, fn);\n }\n\n /**\n * Subscribes to status changes on all tasks (existing and future)\n * @param callback - Function called when any task's status changes\n * @param callback.taskId - The ID of the task whose status changed\n * @param callback.status - The new status of the task\n * @returns a function to unsubscribe from all task status events\n */\n public subscribeToTaskStatus(\n callback: (taskId: TaskIdType, status: TaskStatus) => void\n ): () => void {\n const unsubscribes: (() => void)[] = [];\n\n // Subscribe to status events on all existing tasks\n const tasks = this.getTasks();\n tasks.forEach((task) => {\n const unsub = task.subscribe(\"status\", (status) => {\n callback(task.id, status);\n });\n unsubscribes.push(unsub);\n });\n\n const handleTaskAdded = (taskId: TaskIdType) => {\n const task = this.getTask(taskId);\n if (!task || typeof task.subscribe !== \"function\") return;\n\n const unsub = task.subscribe(\"status\", (status) => {\n callback(task.id, status);\n });\n unsubscribes.push(unsub);\n };\n\n const graphUnsub = this.subscribe(\"task_added\", handleTaskAdded);\n unsubscribes.push(graphUnsub);\n\n // Return unsubscribe function\n return () => {\n unsubscribes.forEach((unsub) => unsub());\n };\n }\n\n /**\n * Subscribes to progress updates on all tasks (existing and future)\n * @param callback - Function called when any task reports progress\n * @param callback.taskId - The ID of the task reporting progress\n * @param callback.progress - The progress value (0-100)\n * @param callback.message - Optional progress message\n * @param callback.args - Additional arguments passed with the progress update\n * @returns a function to unsubscribe from all task progress events\n */\n public subscribeToTaskProgress(\n callback: (taskId: TaskIdType, progress: number, message?: string, ...args: any[]) => void\n ): () => void {\n const unsubscribes: (() => void)[] = [];\n\n // Subscribe to progress events on all existing tasks\n const tasks = this.getTasks();\n tasks.forEach((task) => {\n const unsub = task.subscribe(\"progress\", (progress, message, ...args) => {\n callback(task.id, progress, message, ...args);\n });\n unsubscribes.push(unsub);\n });\n\n const handleTaskAdded = (taskId: TaskIdType) => {\n const task = this.getTask(taskId);\n if (!task || typeof task.subscribe !== \"function\") return;\n\n const unsub = task.subscribe(\"progress\", (progress, message, ...args) => {\n callback(task.id, progress, message, ...args);\n });\n unsubscribes.push(unsub);\n };\n\n const graphUnsub = this.subscribe(\"task_added\", handleTaskAdded);\n unsubscribes.push(graphUnsub);\n\n // Return unsubscribe function\n return () => {\n unsubscribes.forEach((unsub) => unsub());\n };\n }\n\n /**\n * Subscribes to status changes on all dataflows (existing and future)\n * @param callback - Function called when any dataflow's status changes\n * @param callback.dataflowId - The ID of the dataflow whose status changed\n * @param callback.status - The new status of the dataflow\n * @returns a function to unsubscribe from all dataflow status events\n */\n public subscribeToDataflowStatus(\n callback: (dataflowId: DataflowIdType, status: TaskStatus) => void\n ): () => void {\n const unsubscribes: (() => void)[] = [];\n\n // Subscribe to status events on all existing dataflows\n const dataflows = this.getDataflows();\n dataflows.forEach((dataflow) => {\n const unsub = dataflow.subscribe(\"status\", (status) => {\n callback(dataflow.id, status);\n });\n unsubscribes.push(unsub);\n });\n\n const handleDataflowAdded = (dataflowId: DataflowIdType) => {\n const dataflow = this.getDataflow(dataflowId);\n if (!dataflow || typeof dataflow.subscribe !== \"function\") return;\n\n const unsub = dataflow.subscribe(\"status\", (status) => {\n callback(dataflow.id, status);\n });\n unsubscribes.push(unsub);\n };\n\n const graphUnsub = this.subscribe(\"dataflow_added\", handleDataflowAdded);\n unsubscribes.push(graphUnsub);\n\n // Return unsubscribe function\n return () => {\n unsubscribes.forEach((unsub) => unsub());\n };\n }\n\n /**\n * Subscribes to streaming events on the task graph.\n * Listens for task_stream_start, task_stream_chunk, and task_stream_end\n * events emitted by the TaskGraphRunner during streaming task execution.\n *\n * @param callbacks - Object with optional callbacks for each streaming event\n * @returns a function to unsubscribe from all streaming events\n */\n public subscribeToTaskStreaming(callbacks: {\n onStreamStart?: (taskId: TaskIdType) => void;\n onStreamChunk?: (taskId: TaskIdType, event: StreamEvent) => void;\n onStreamEnd?: (taskId: TaskIdType, output: Record<string, any>) => void;\n }): () => void {\n const unsubscribes: (() => void)[] = [];\n\n if (callbacks.onStreamStart) {\n const unsub = this.subscribe(\"task_stream_start\", callbacks.onStreamStart);\n unsubscribes.push(unsub);\n }\n\n if (callbacks.onStreamChunk) {\n const unsub = this.subscribe(\"task_stream_chunk\", callbacks.onStreamChunk);\n unsubscribes.push(unsub);\n }\n\n if (callbacks.onStreamEnd) {\n const unsub = this.subscribe(\"task_stream_end\", callbacks.onStreamEnd);\n unsubscribes.push(unsub);\n }\n\n return () => {\n unsubscribes.forEach((unsub) => unsub());\n };\n }\n\n /**\n * Registers an event listener for the specified event\n * @param name - The event name to listen for\n * @param fn - The callback function to execute when the event occurs\n */\n on<Event extends TaskGraphEvents>(name: Event, fn: TaskGraphEventListener<Event>) {\n const dagEvent = EventTaskGraphToDagMapping[name as keyof typeof EventTaskGraphToDagMapping];\n if (dagEvent) {\n // Safe cast: TaskGraph dag events (task_added, etc.) have the same signature as\n // the underlying DAG events (node-added, etc.) - both pass IDs, not full objects\n return this._dag.on(dagEvent, fn as Parameters<typeof this._dag.on>[1]);\n }\n return this.events.on(\n name as TaskGraphStatusEvents,\n fn as TaskGraphEventListener<TaskGraphStatusEvents>\n );\n }\n\n /**\n * Removes an event listener for the specified event\n * @param name - The event name to listen for\n * @param fn - The callback function to execute when the event occurs\n */\n off<Event extends TaskGraphEvents>(name: Event, fn: TaskGraphEventListener<Event>) {\n const dagEvent = EventTaskGraphToDagMapping[name as keyof typeof EventTaskGraphToDagMapping];\n if (dagEvent) {\n // Safe cast: TaskGraph dag events (task_added, etc.) have the same signature as\n // the underlying DAG events (node-added, etc.) - both pass IDs, not full objects\n return this._dag.off(dagEvent, fn as Parameters<typeof this._dag.off>[1]);\n }\n return this.events.off(\n name as TaskGraphStatusEvents,\n fn as TaskGraphEventListener<TaskGraphStatusEvents>\n );\n }\n\n /**\n * Emits an event for the specified event\n * @param name - The event name to emit\n * @param args - The arguments to pass to the event listener\n */\n emit<E extends GraphEventDagEvents>(name: E, ...args: GraphEventDagParameters<E>): void;\n emit<E extends TaskGraphStatusEvents>(name: E, ...args: TaskGraphEventStatusParameters<E>): void;\n emit(name: string, ...args: any[]): void {\n const dagEvent = EventTaskGraphToDagMapping[name as keyof typeof EventTaskGraphToDagMapping];\n if (dagEvent) {\n // @ts-ignore\n return this.emit_dag(name, ...args);\n } else {\n // @ts-ignore\n return this.emit_local(name, ...args);\n }\n }\n\n /**\n * Emits an event for the specified event\n * @param name - The event name to emit\n * @param args - The arguments to pass to the event listener\n */\n protected emit_local<Event extends TaskGraphStatusEvents>(\n name: Event,\n ...args: TaskGraphEventStatusParameters<Event>\n ) {\n return this.events?.emit(name, ...args);\n }\n\n /**\n * Emits an event for the specified event\n * @param name - The event name to emit\n * @param args - The arguments to pass to the event listener\n */\n protected emit_dag<Event extends GraphEventDagEvents>(\n name: Event,\n ...args: GraphEventDagParameters<Event>\n ) {\n const dagEvent = EventTaskGraphToDagMapping[name as keyof typeof EventTaskGraphToDagMapping];\n // Safe cast: GraphEventDagParameters matches the DAG's emit parameters (both are ID-based)\n return this._dag.emit(dagEvent, ...(args as unknown as [unknown]));\n }\n}\n\n/**\n * Super simple helper if you know the input and output handles, and there is only one each\n *\n * @param tasks\n * @param inputHandle\n * @param outputHandle\n * @returns\n */\nfunction serialGraphEdges(\n tasks: ITask<any, any, any>[],\n inputHandle: string,\n outputHandle: string\n): Dataflow[] {\n const edges: Dataflow[] = [];\n for (let i = 0; i < tasks.length - 1; i++) {\n edges.push(new Dataflow(tasks[i].id, inputHandle, tasks[i + 1].id, outputHandle));\n }\n return edges;\n}\n\n/**\n * Super simple helper if you know the input and output handles, and there is only one each\n *\n * @param tasks\n * @param inputHandle\n * @param outputHandle\n * @returns\n */\nexport function serialGraph(\n tasks: ITask<any, any, any>[],\n inputHandle: string,\n outputHandle: string\n): TaskGraph {\n const graph = new TaskGraph();\n graph.addTasks(tasks);\n graph.addDataflows(serialGraphEdges(tasks, inputHandle, outputHandle));\n return graph;\n}\n",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { DataPortSchema } from \"@workglow/util\";\nimport { CreateEndLoopWorkflow, CreateLoopWorkflow, Workflow } from \"../task-graph/Workflow\";\nimport { GraphAsTask, GraphAsTaskConfig, graphAsTaskConfigSchema } from \"./GraphAsTask\";\nimport { FallbackTaskRunner } from \"./FallbackTaskRunner\";\nimport type { TaskInput, TaskOutput, TaskTypeName } from \"./TaskTypes\";\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\n/**\n * Execution mode for the fallback task.\n *\n * - `\"task\"`: Each task in the subgraph is an independent alternative.\n * They are tried sequentially until one succeeds.\n *\n * - `\"data\"`: The subgraph contains a template workflow that is executed\n * multiple times with different input overrides from the `alternatives` array.\n */\nexport type FallbackMode = \"task\" | \"data\";\n\nexport const fallbackTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...graphAsTaskConfigSchema[\"properties\"],\n fallbackMode: { type: \"string\", enum: [\"task\", \"data\"] },\n alternatives: { type: \"array\", items: { type: \"object\", additionalProperties: true } },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\n/**\n * Configuration type for FallbackTask.\n * Extends GraphAsTaskConfig with fallback-specific options.\n */\nexport type FallbackTaskConfig = GraphAsTaskConfig & {\n /**\n * The fallback execution mode.\n * - `\"task\"`: Try each task in the subgraph as an alternative.\n * - `\"data\"`: Try the template workflow with each set of input overrides.\n * @default \"task\"\n */\n readonly fallbackMode?: FallbackMode;\n\n /**\n * Array of input overrides for data mode.\n * Each entry is merged with the task input before running the template.\n * Only used when `fallbackMode` is `\"data\"`.\n *\n * @example\n * ```typescript\n * alternatives: [\n * { model: \"openai:gpt-4\" },\n * { model: \"anthropic:claude-sonnet-4-20250514\" },\n * { model: \"onnx:Xenova/LaMini-Flan-T5-783M:q8\" },\n * ]\n * ```\n */\n readonly alternatives?: Record<string, unknown>[];\n};\n\n// ============================================================================\n// FallbackTask Class\n// ============================================================================\n\n/**\n * A task that tries multiple alternatives and returns the first successful result.\n *\n * FallbackTask provides resilient execution by automatically falling back to\n * alternative strategies when one fails. This is essential for production AI\n * workflows where provider availability is unpredictable.\n *\n * ## Execution Modes\n *\n * ### Task Mode (`fallbackMode: \"task\"`)\n * Each task added to the subgraph is an independent alternative. They are\n * tried sequentially in insertion order. The first successful result is\n * returned and remaining alternatives are skipped.\n *\n * ```typescript\n * // Via Workflow API:\n * workflow\n * .fallback()\n * .notifySlack({ channel: \"#alerts\", message: \"Hello\" })\n * .notifyEmail({ to: \"admin@example.com\", subject: \"Alert\" })\n * .notifySms({ phone: \"+1234567890\", message: \"Alert\" })\n * .endFallback();\n * ```\n *\n * ### Data Mode (`fallbackMode: \"data\"`)\n * The subgraph contains a template workflow that is executed multiple times,\n * each time with different input data merged from the `alternatives` array.\n *\n * ```typescript\n * // Via Workflow API:\n * workflow\n * .fallbackWith([\n * { model: \"openai:gpt-4\" },\n * { model: \"anthropic:claude-sonnet-4-20250514\" },\n * { model: \"onnx:Xenova/LaMini-Flan-T5-783M:q8\" },\n * ])\n * .textGeneration({ prompt: \"Hello\" })\n * .endFallbackWith();\n * ```\n *\n * ## Error Handling\n *\n * If all alternatives fail, a `TaskFailedError` is thrown with a message\n * that includes all individual error messages. Each attempt's error is\n * collected and reported for debugging.\n *\n * ## Output\n *\n * The output is the result from whichever alternative succeeded first.\n * The output schema matches the inner tasks' output schema.\n */\nexport class FallbackTask<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends FallbackTaskConfig = FallbackTaskConfig,\n> extends GraphAsTask<Input, Output, Config> {\n // ========================================================================\n // Static properties\n // ========================================================================\n\n public static type: TaskTypeName = \"FallbackTask\";\n public static category: string = \"Flow Control\";\n public static title: string = \"Fallback\";\n public static description: string = \"Try alternatives until one succeeds\";\n\n /** FallbackTask has dynamic schemas based on the subgraph structure. */\n public static hasDynamicSchemas: boolean = true;\n\n public static configSchema(): DataPortSchema {\n return fallbackTaskConfigSchema;\n }\n\n // ========================================================================\n // TaskRunner Override\n // ========================================================================\n\n declare _runner: FallbackTaskRunner<Input, Output, Config>;\n\n override get runner(): FallbackTaskRunner<Input, Output, Config> {\n if (!this._runner) {\n this._runner = new FallbackTaskRunner<Input, Output, Config>(this);\n }\n return this._runner;\n }\n\n // ========================================================================\n // Config accessors\n // ========================================================================\n\n public get fallbackMode(): FallbackMode {\n return this.config?.fallbackMode ?? \"task\";\n }\n\n public get alternatives(): Record<string, unknown>[] {\n return this.config?.alternatives ?? [];\n }\n\n // ========================================================================\n // Schema Methods\n // ========================================================================\n\n /**\n * In task mode, input schema is the union of all alternative tasks' inputs.\n * In data mode, input schema comes from the template workflow's starting nodes.\n */\n public override inputSchema(): DataPortSchema {\n if (!this.hasChildren()) {\n return (this.constructor as typeof FallbackTask).inputSchema();\n }\n\n if (this.fallbackMode === \"data\") {\n // Data mode: use the base GraphAsTask logic (union of starting node inputs)\n return super.inputSchema();\n }\n\n // Task mode: union of all tasks' input schemas (they are independent alternatives)\n const properties: Record<string, unknown> = {};\n const tasks = this.subGraph.getTasks();\n\n for (const task of tasks) {\n const taskInputSchema = task.inputSchema();\n if (typeof taskInputSchema === \"boolean\") continue;\n const taskProperties = taskInputSchema.properties || {};\n\n for (const [inputName, inputProp] of Object.entries(taskProperties)) {\n if (!properties[inputName]) {\n properties[inputName] = inputProp;\n }\n }\n }\n\n return {\n type: \"object\",\n properties,\n additionalProperties: true,\n } as DataPortSchema;\n }\n\n /**\n * Output schema is derived from the first task in the subgraph.\n * All alternatives should produce compatible output.\n */\n public override outputSchema(): DataPortSchema {\n if (!this.hasChildren()) {\n return (this.constructor as typeof FallbackTask).outputSchema();\n }\n\n const tasks = this.subGraph.getTasks();\n if (tasks.length === 0) {\n return { type: \"object\", properties: {}, additionalProperties: false } as DataPortSchema;\n }\n\n if (this.fallbackMode === \"task\") {\n // Task mode: use the first task's output schema (all alternatives should be compatible)\n const firstTask = tasks[0];\n return firstTask.outputSchema();\n }\n\n // Data mode: use the ending nodes' output schema via base class logic\n return super.outputSchema();\n }\n\n // ========================================================================\n // Serialization\n // ========================================================================\n\n public override toJSON() {\n const json = super.toJSON();\n return {\n ...json,\n config: {\n ...(\"config\" in json ? json.config : {}),\n fallbackMode: this.fallbackMode,\n ...(this.alternatives.length > 0 ? { alternatives: this.alternatives } : {}),\n },\n };\n }\n}\n\n// ============================================================================\n// Workflow Prototype Extensions\n// ============================================================================\n\ndeclare module \"../task-graph/Workflow\" {\n interface Workflow {\n /**\n * Starts a task-mode fallback block. Each task added inside the block\n * is an independent alternative tried sequentially until one succeeds.\n * Use `.endFallback()` to close the block and return to the parent workflow.\n */\n fallback: CreateLoopWorkflow<TaskInput, TaskOutput, FallbackTaskConfig>;\n\n /**\n * Ends the task-mode fallback block and returns to the parent workflow.\n */\n endFallback(): Workflow;\n\n /**\n * Starts a data-mode fallback block. The tasks added inside the block\n * form a template workflow that is re-run with each set of input overrides\n * from `alternatives`. Use `.endFallbackWith()` to close the block.\n *\n * @param alternatives - Array of input override objects to try sequentially\n */\n fallbackWith(alternatives: Record<string, unknown>[]): Workflow;\n\n /**\n * Ends the data-mode fallback block and returns to the parent workflow.\n */\n endFallbackWith(): Workflow;\n }\n}\n\nqueueMicrotask(() => {\n Workflow.prototype.fallback = function (this: Workflow): Workflow {\n return this.addLoopTask(FallbackTask, { fallbackMode: \"task\" });\n };\n Workflow.prototype.endFallback = CreateEndLoopWorkflow(\"endFallback\");\n\n Workflow.prototype.fallbackWith = function (\n this: Workflow,\n alternatives: Record<string, unknown>[]\n ): Workflow {\n return this.addLoopTask(FallbackTask, {\n fallbackMode: \"data\",\n alternatives,\n });\n };\n Workflow.prototype.endFallbackWith = CreateEndLoopWorkflow(\"endFallbackWith\");\n});\n",
|
|
28
28
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { FallbackTask, FallbackTaskConfig } from \"./FallbackTask\";\nimport { GraphAsTaskRunner } from \"./GraphAsTaskRunner\";\nimport type { ITask } from \"./ITask\";\nimport { TaskAbortedError, TaskFailedError, TaskTimeoutError } from \"./TaskError\";\nimport { TaskStatus, type TaskInput, type TaskOutput } from \"./TaskTypes\";\n\n/**\n * Runner for FallbackTask that executes alternatives sequentially until one succeeds.\n *\n * In **task mode**, each task in the subgraph is tried independently.\n * In **data mode**, the entire subgraph is re-run with different input overrides.\n */\nexport class FallbackTaskRunner<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends FallbackTaskConfig = FallbackTaskConfig,\n> extends GraphAsTaskRunner<Input, Output, Config> {\n declare task: FallbackTask<Input, Output, Config>;\n\n /**\n * Override executeTask to implement sequential fallback logic.\n */\n protected override async executeTask(input: Input): Promise<Output | undefined> {\n if (this.task.fallbackMode === \"data\") {\n return this.executeDataFallback(input);\n }\n return this.executeTaskFallback(input);\n }\n\n /**\n * For FallbackTask, reactive runs use the task's reactive hook only,\n * bypassing GraphAsTaskRunner's child-merging logic.\n */\n public override async executeTaskReactive(input: Input, output: Output): Promise<Output> {\n const reactiveResult = await this.task.executeReactive(input, output, { own: this.own });\n return Object.assign({}, output, reactiveResult ?? {}) as Output;\n }\n\n // ========================================================================\n // Task Mode: Try each task in the subgraph as an independent alternative\n // ========================================================================\n\n /**\n * Tries each task in the subgraph sequentially. Returns the first\n * successful result. If all fail, throws with collected errors.\n */\n private async executeTaskFallback(input: Input): Promise<Output | undefined> {\n const tasks = this.task.subGraph.getTasks();\n if (tasks.length === 0) {\n throw new TaskFailedError(\"FallbackTask has no alternatives to try\");\n }\n\n const errors: { task: ITask; error: Error }[] = [];\n const totalAttempts = tasks.length;\n\n for (let i = 0; i < tasks.length; i++) {\n if (this.abortController?.signal.aborted) {\n throw new TaskAbortedError(\"Fallback aborted\");\n }\n\n const alternativeTask = tasks[i];\n const attemptNumber = i + 1;\n\n await this.handleProgress(\n Math.round(((i + 0.5) / totalAttempts) * 100),\n `Trying alternative ${attemptNumber}/${totalAttempts}: ${alternativeTask.type}`\n );\n\n try {\n // Reset the task to PENDING so it can be run\n this.resetTask(alternativeTask);\n\n // Run the individual task with the parent's input\n const result = await alternativeTask.run(input);\n\n await this.handleProgress(\n 100,\n `Alternative ${attemptNumber}/${totalAttempts} succeeded: ${alternativeTask.type}`\n );\n\n // Apply reactive post-processing\n return (await this.executeTaskReactive(input, result as Output)) as Output;\n } catch (error) {\n // Aborts (non-timeout) are not retryable — propagate immediately\n if (error instanceof TaskAbortedError && !(error instanceof TaskTimeoutError)) {\n throw error;\n }\n errors.push({ task: alternativeTask, error: error as Error });\n // Continue to next alternative\n }\n }\n\n // All alternatives failed\n throw this.buildAggregateError(errors, \"task\");\n }\n\n // ========================================================================\n // Data Mode: Run the template workflow with different input overrides\n // ========================================================================\n\n /**\n * Runs the subgraph workflow multiple times, each time with a different\n * set of input overrides merged from `config.alternatives`.\n */\n private async executeDataFallback(input: Input): Promise<Output | undefined> {\n const alternatives = this.task.alternatives;\n if (alternatives.length === 0) {\n throw new TaskFailedError(\"FallbackTask has no data alternatives to try\");\n }\n\n const errors: { alternative: Record<string, unknown>; error: Error }[] = [];\n const totalAttempts = alternatives.length;\n\n for (let i = 0; i < alternatives.length; i++) {\n if (this.abortController?.signal.aborted) {\n throw new TaskAbortedError(\"Fallback aborted\");\n }\n\n const alternative = alternatives[i];\n const attemptNumber = i + 1;\n\n await this.handleProgress(\n Math.round(((i + 0.5) / totalAttempts) * 100),\n `Trying data alternative ${attemptNumber}/${totalAttempts}`\n );\n\n try {\n // Reset all tasks in the subgraph to PENDING\n this.resetSubgraph();\n\n // Merge the alternative's data with the original input\n const mergedInput = { ...input, ...alternative } as Input;\n\n // Run the subgraph with merged input\n const results = await this.task.subGraph.run<Output>(mergedInput, {\n parentSignal: this.abortController?.signal,\n outputCache: this.outputCache,\n registry: this.registry,\n });\n\n const mergedOutput = this.task.subGraph.mergeExecuteOutputsToRunOutput(\n results,\n this.task.compoundMerge\n ) as Output;\n\n await this.handleProgress(\n 100,\n `Data alternative ${attemptNumber}/${totalAttempts} succeeded`\n );\n\n // Apply reactive post-processing\n return (await this.executeTaskReactive(input, mergedOutput)) as Output;\n } catch (error) {\n // Aborts (non-timeout) are not retryable — propagate immediately\n if (error instanceof TaskAbortedError && !(error instanceof TaskTimeoutError)) {\n throw error;\n }\n errors.push({ alternative, error: error as Error });\n // Continue to next alternative\n }\n }\n\n // All alternatives failed\n throw this.buildAggregateError(errors, \"data\");\n }\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n /**\n * Resets a single task to PENDING status so it can be re-run.\n */\n private resetTask(task: ITask): void {\n task.status = TaskStatus.PENDING;\n task.progress = 0;\n task.error = undefined;\n task.completedAt = undefined;\n task.startedAt = undefined;\n task.resetInputData();\n }\n\n /**\n * Resets all tasks and dataflows in the subgraph for a fresh run.\n */\n private resetSubgraph(): void {\n for (const task of this.task.subGraph.getTasks()) {\n this.resetTask(task);\n }\n for (const dataflow of this.task.subGraph.getDataflows()) {\n dataflow.reset();\n }\n }\n\n /**\n * Builds a descriptive error from all collected failures.\n */\n private buildAggregateError(\n errors: { error: Error; [key: string]: unknown }[],\n mode: \"task\" | \"data\"\n ): TaskFailedError {\n const label = mode === \"task\" ? \"alternative\" : \"data alternative\";\n const details = errors\n .map((e, i) => {\n const prefix = e.error instanceof TaskTimeoutError ? \"[timeout] \" : \"\";\n return ` ${label} ${i + 1}: ${prefix}${e.error.message}`;\n })\n .join(\"\\n\");\n return new TaskFailedError(`All ${errors.length} ${label}s failed:\\n${details}`);\n }\n}\n",
|
|
29
29
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { DataPortSchema, PropertySchema } from \"@workglow/util\";\nimport { TaskGraph } from \"../task-graph/TaskGraph\";\nimport { GraphAsTask, GraphAsTaskConfig, graphAsTaskConfigSchema } from \"./GraphAsTask\";\nimport type { IExecuteContext } from \"./ITask\";\nimport { IteratorTaskRunner } from \"./IteratorTaskRunner\";\nimport type { StreamEvent, StreamFinish } from \"./StreamTypes\";\nimport { TaskConfigurationError } from \"./TaskError\";\nimport type { TaskInput, TaskOutput, TaskTypeName } from \"./TaskTypes\";\n\n/**\n * Standard iteration context schema for IteratorTask subclasses (Map, Reduce).\n * Properties are marked with \"x-ui-iteration\": true so the builder\n * knows to hide them from parent-level display.\n */\nexport const ITERATOR_CONTEXT_SCHEMA: DataPortSchema = {\n type: \"object\",\n properties: {\n _iterationIndex: {\n type: \"integer\",\n minimum: 0,\n title: \"Iteration Index\",\n description: \"Current iteration index (0-based)\",\n \"x-ui-iteration\": true,\n },\n _iterationCount: {\n type: \"integer\",\n minimum: 0,\n title: \"Iteration Count\",\n description: \"Total number of iterations\",\n \"x-ui-iteration\": true,\n },\n },\n};\n\n/**\n * Execution mode for iterator tasks.\n * - `parallel`: Execute all iterations concurrently (logical mode)\n * - `parallel-limited`: Execute with a concurrency limit\n */\nexport type ExecutionMode = \"parallel\" | \"parallel-limited\";\n\n/**\n * Input mode for a property in the iteration input schema.\n * - \"array\": Property must be an array (will be iterated)\n * - \"scalar\": Property must be a scalar (constant for all iterations)\n * - \"flexible\": Property accepts both array and scalar (T | T[])\n */\nexport type IterationInputMode = \"array\" | \"scalar\" | \"flexible\";\n\n/**\n * Configuration for a single property in the iteration input schema.\n */\nexport interface IterationPropertyConfig {\n /** The base schema for the property (without array wrapping) */\n readonly baseSchema: PropertySchema;\n /** The input mode for this property */\n readonly mode: IterationInputMode;\n}\n\nexport const iteratorTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...graphAsTaskConfigSchema[\"properties\"],\n concurrencyLimit: { type: \"integer\", minimum: 1 },\n batchSize: { type: \"integer\", minimum: 1 },\n iterationInputConfig: { type: \"object\", additionalProperties: true },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\n/**\n * Configuration type for IteratorTask.\n * Extends GraphAsTaskConfig with iterator-specific options.\n */\nexport type IteratorTaskConfig = GraphAsTaskConfig & {\n /**\n * Maximum number of concurrent iteration workers\n * @default undefined (unlimited)\n */\n readonly concurrencyLimit?: number;\n\n /**\n * Number of items per batch. When set, iteration indices are grouped into batches.\n * @default undefined\n */\n readonly batchSize?: number;\n\n /**\n * User-defined iteration input schema configuration.\n */\n readonly iterationInputConfig?: Record<string, IterationPropertyConfig>;\n};\n\n/**\n * Result of detecting the iterator port from the input schema.\n */\ninterface IteratorPortInfo {\n readonly portName: string;\n readonly itemSchema: DataPortSchema;\n}\n\n/**\n * Result of analyzing input for iteration.\n */\nexport interface IterationAnalysisResult {\n /** The number of iterations to perform */\n readonly iterationCount: number;\n /** Names of properties that are arrays (to be iterated) */\n readonly arrayPorts: string[];\n /** Names of properties that are scalars (passed as constants) */\n readonly scalarPorts: string[];\n /** Gets the input for a specific iteration index */\n getIterationInput(index: number): Record<string, unknown>;\n}\n\nfunction isArrayVariant(schema: unknown): boolean {\n if (!schema || typeof schema !== \"object\") return false;\n const record = schema as Record<string, unknown>;\n return record.type === \"array\" || record.items !== undefined;\n}\n\nfunction getExplicitIterationFlag(schema: DataPortSchema | undefined): boolean | undefined {\n if (!schema || typeof schema !== \"object\") return undefined;\n const record = schema as Record<string, unknown>;\n const flag = record[\"x-ui-iteration\"];\n if (flag === true) return true;\n if (flag === false) return false;\n return undefined;\n}\n\nfunction inferIterationFromSchema(schema: DataPortSchema | undefined): boolean | undefined {\n if (!schema || typeof schema !== \"object\") return undefined;\n\n const record = schema as Record<string, unknown>;\n\n if (record.type === \"array\" || record.items !== undefined) {\n return true;\n }\n\n const variants = (record.oneOf ?? record.anyOf) as unknown[] | undefined;\n if (!Array.isArray(variants) || variants.length === 0) {\n // Schema does not clearly indicate array/non-array - defer to runtime\n if (record.type !== undefined) {\n return false;\n }\n return undefined;\n }\n\n let hasArrayVariant = false;\n let hasNonArrayVariant = false;\n\n for (const variant of variants) {\n if (isArrayVariant(variant)) {\n hasArrayVariant = true;\n } else {\n hasNonArrayVariant = true;\n }\n }\n\n if (hasArrayVariant && hasNonArrayVariant) return undefined;\n if (hasArrayVariant) return true;\n return false;\n}\n\n/**\n * Creates a union type schema (T | T[]) for flexible iteration input.\n */\nexport function createFlexibleSchema(baseSchema: PropertySchema): PropertySchema {\n return {\n anyOf: [baseSchema, { type: \"array\", items: baseSchema }],\n } as PropertySchema;\n}\n\n/**\n * Creates an array schema from a base schema.\n */\nexport function createArraySchema(baseSchema: PropertySchema): PropertySchema {\n return {\n type: \"array\",\n items: baseSchema,\n } as PropertySchema;\n}\n\n/**\n * Extracts the base (scalar) schema from a potentially wrapped schema.\n */\nexport function extractBaseSchema(schema: PropertySchema): PropertySchema {\n const schemaType = (schema as Record<string, unknown>).type;\n if (schemaType === \"array\" && (schema as Record<string, unknown>).items) {\n return (schema as Record<string, unknown>).items as PropertySchema;\n }\n\n const variants =\n (schema as Record<string, unknown>).oneOf ?? (schema as Record<string, unknown>).anyOf;\n if (Array.isArray(variants)) {\n for (const variant of variants) {\n if (typeof variant === \"object\") {\n const variantType = (variant as Record<string, unknown>).type;\n if (variantType !== \"array\") {\n return variant as PropertySchema;\n }\n }\n }\n for (const variant of variants) {\n if (typeof variant === \"object\") {\n const variantType = (variant as Record<string, unknown>).type;\n if (variantType === \"array\" && (variant as Record<string, unknown>).items) {\n return (variant as Record<string, unknown>).items as PropertySchema;\n }\n }\n }\n }\n\n return schema;\n}\n\n/**\n * Determines if a schema accepts arrays (is array type or has array in union).\n */\nexport function schemaAcceptsArray(schema: DataPortSchema): boolean {\n if (typeof schema === \"boolean\") return false;\n\n const schemaType = (schema as Record<string, unknown>).type;\n if (schemaType === \"array\") return true;\n\n const variants = (schema.oneOf ?? schema.anyOf) as DataPortSchema[] | undefined;\n if (Array.isArray(variants)) {\n return variants.some((variant) => isArrayVariant(variant));\n }\n\n return false;\n}\n\n/**\n * Base class for iterator tasks that process collections of items.\n */\nexport abstract class IteratorTask<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends IteratorTaskConfig = IteratorTaskConfig,\n> extends GraphAsTask<Input, Output, Config> {\n public static type: TaskTypeName = \"IteratorTask\";\n public static category: string = \"Flow Control\";\n public static title: string = \"Iterator\";\n public static description: string = \"Base class for loop-type tasks\";\n\n /** This task has dynamic schemas based on the inner workflow */\n public static hasDynamicSchemas: boolean = true;\n\n public static configSchema(): DataPortSchema {\n return iteratorTaskConfigSchema;\n }\n\n /**\n * Returns the schema for iteration-context inputs that will be\n * injected into the subgraph at runtime.\n */\n public static getIterationContextSchema(): DataPortSchema {\n return ITERATOR_CONTEXT_SCHEMA;\n }\n\n /** Cached iterator port info from schema analysis. */\n protected _iteratorPortInfo: IteratorPortInfo | undefined;\n\n /** Cached computed iteration input schema. */\n protected _iterationInputSchema: DataPortSchema | undefined;\n\n constructor(input: Partial<Input> = {}, config: Partial<Config> = {}) {\n super(input, config as Config);\n }\n\n // ========================================================================\n // TaskRunner Override\n // ========================================================================\n\n declare _runner: IteratorTaskRunner<Input, Output, Config>;\n\n override get runner(): IteratorTaskRunner<Input, Output, Config> {\n if (!this._runner) {\n this._runner = new IteratorTaskRunner<Input, Output, Config>(this);\n }\n return this._runner;\n }\n\n /**\n * IteratorTask does not support streaming pass-through because its output\n * is an aggregation of multiple iterations (arrays for MapTask, accumulated\n * value for ReduceTask). The inherited GraphAsTask.executeStream is\n * overridden to just emit a finish event (no streaming).\n */\n async *executeStream(\n input: Input,\n _context: IExecuteContext\n ): AsyncIterable<StreamEvent<Output>> {\n yield { type: \"finish\", data: input as unknown as Output } as StreamFinish<Output>;\n }\n\n // ========================================================================\n // Graph hooks\n // ========================================================================\n\n override set subGraph(subGraph: TaskGraph) {\n super.subGraph = subGraph;\n this.invalidateIterationInputSchema();\n this.events.emit(\"regenerate\");\n }\n\n override get subGraph(): TaskGraph {\n return super.subGraph;\n }\n\n public override regenerateGraph(): void {\n this.invalidateIterationInputSchema();\n super.regenerateGraph();\n }\n\n // ========================================================================\n // Runner hooks\n // ========================================================================\n\n /**\n * Whether results should be ordered by iteration index.\n * MapTask overrides this to use its `preserveOrder` config.\n */\n public preserveIterationOrder(): boolean {\n return true;\n }\n\n /**\n * Whether this iterator runs in reduce mode.\n */\n public isReduceTask(): boolean {\n return false;\n }\n\n /**\n * Initial accumulator for reduce mode.\n */\n public getInitialAccumulator(): Output {\n return {} as Output;\n }\n\n /**\n * Builds the per-iteration subgraph input.\n */\n public buildIterationRunInput(\n analysis: IterationAnalysisResult,\n index: number,\n iterationCount: number,\n extraInput: Record<string, unknown> = {}\n ): Record<string, unknown> {\n return {\n ...analysis.getIterationInput(index),\n ...extraInput,\n _iterationIndex: index,\n _iterationCount: iterationCount,\n };\n }\n\n /**\n * Updates the accumulator with one iteration result in reduce mode.\n */\n public mergeIterationIntoAccumulator(\n accumulator: Output,\n iterationResult: TaskOutput | undefined,\n _index: number\n ): Output {\n return (iterationResult ?? accumulator) as Output;\n }\n\n /**\n * Returns the result when there are no items to iterate.\n */\n public getEmptyResult(): Output {\n return {} as Output;\n }\n\n /**\n * Collects and merges results from all iterations.\n */\n public collectResults(results: TaskOutput[]): Output {\n if (results.length === 0) {\n return {} as Output;\n }\n\n const merged: Record<string, unknown[]> = {};\n\n for (const result of results) {\n if (!result || typeof result !== \"object\") continue;\n\n for (const [key, value] of Object.entries(result as Record<string, unknown>)) {\n if (!merged[key]) {\n merged[key] = [];\n }\n merged[key].push(value);\n }\n }\n\n return merged as Output;\n }\n\n // ========================================================================\n // Execution Mode Configuration\n // ========================================================================\n\n public get concurrencyLimit(): number | undefined {\n return this.config.concurrencyLimit;\n }\n\n public get batchSize(): number | undefined {\n return this.config.batchSize;\n }\n\n // ========================================================================\n // Iteration Input Schema Management\n // ========================================================================\n\n public get iterationInputConfig(): Record<string, IterationPropertyConfig> | undefined {\n return this.config.iterationInputConfig;\n }\n\n protected buildDefaultIterationInputSchema(): DataPortSchema {\n const innerSchema = this.getInnerInputSchema();\n if (!innerSchema || typeof innerSchema === \"boolean\") {\n return { type: \"object\", properties: {}, additionalProperties: true };\n }\n\n const properties: Record<string, PropertySchema> = {};\n const innerProps = innerSchema.properties || {};\n\n for (const [key, propSchema] of Object.entries(innerProps)) {\n if (typeof propSchema === \"boolean\") continue;\n\n if ((propSchema as Record<string, unknown>)[\"x-ui-iteration\"]) {\n continue;\n }\n\n const baseSchema = propSchema as PropertySchema;\n properties[key] = createFlexibleSchema(baseSchema);\n }\n\n return {\n type: \"object\",\n properties,\n additionalProperties: innerSchema.additionalProperties ?? true,\n } as DataPortSchema;\n }\n\n protected buildConfiguredIterationInputSchema(): DataPortSchema {\n const innerSchema = this.getInnerInputSchema();\n if (!innerSchema || typeof innerSchema === \"boolean\") {\n return { type: \"object\", properties: {}, additionalProperties: true };\n }\n\n const config = this.iterationInputConfig || {};\n const properties: Record<string, PropertySchema> = {};\n const innerProps = innerSchema.properties || {};\n\n for (const [key, propSchema] of Object.entries(innerProps)) {\n if (typeof propSchema === \"boolean\") continue;\n\n if ((propSchema as Record<string, unknown>)[\"x-ui-iteration\"]) {\n continue;\n }\n\n const baseSchema = propSchema as PropertySchema;\n const propConfig = config[key];\n\n if (!propConfig) {\n properties[key] = createFlexibleSchema(baseSchema);\n continue;\n }\n\n switch (propConfig.mode) {\n case \"array\":\n properties[key] = createArraySchema(propConfig.baseSchema);\n break;\n case \"scalar\":\n properties[key] = propConfig.baseSchema;\n break;\n case \"flexible\":\n default:\n properties[key] = createFlexibleSchema(propConfig.baseSchema);\n break;\n }\n }\n\n return {\n type: \"object\",\n properties,\n additionalProperties: innerSchema.additionalProperties ?? true,\n } as DataPortSchema;\n }\n\n /**\n * Derives the schema accepted by each iteration of the inner workflow.\n * For root tasks (no incoming edges) all input properties are collected.\n * For non-root tasks, only REQUIRED properties that are not satisfied by\n * any internal dataflow are added — this ensures that required inputs are\n * included in the iterator's input schema without pulling in every optional\n * downstream property.\n */\n protected getInnerInputSchema(): DataPortSchema | undefined {\n if (!this.hasChildren()) return undefined;\n\n const tasks = this.subGraph.getTasks();\n if (tasks.length === 0) return undefined;\n\n const startingNodes = tasks.filter(\n (task) => this.subGraph.getSourceDataflows(task.id).length === 0\n );\n const sources = startingNodes.length > 0 ? startingNodes : tasks;\n\n const properties: Record<string, DataPortSchema> = {};\n const required: string[] = [];\n let additionalProperties = false;\n\n // Collect all properties from root tasks (original behavior)\n for (const task of sources) {\n const inputSchema = task.inputSchema();\n if (typeof inputSchema === \"boolean\") {\n if (inputSchema === true) {\n additionalProperties = true;\n }\n continue;\n }\n\n additionalProperties = additionalProperties || inputSchema.additionalProperties === true;\n\n for (const [key, prop] of Object.entries(inputSchema.properties || {})) {\n if (typeof prop === \"boolean\") continue;\n if (!properties[key]) {\n properties[key] = prop as DataPortSchema;\n }\n }\n\n for (const key of inputSchema.required || []) {\n if (!required.includes(key)) {\n required.push(key);\n }\n }\n }\n\n // For non-root tasks, collect only REQUIRED properties not satisfied by dataflows.\n // This handles cases like: map().fetch().structuralParser() where structuralParser\n // requires \"title\" but fetch doesn't output it — title must come from the map input.\n const sourceIds = new Set(sources.map((t) => t.id));\n for (const task of tasks) {\n if (sourceIds.has(task.id)) continue;\n\n const inputSchema = task.inputSchema();\n if (typeof inputSchema === \"boolean\") continue;\n\n const requiredKeys = new Set<string>((inputSchema.required as string[] | undefined) || []);\n if (requiredKeys.size === 0) continue;\n\n const connectedPorts = new Set(\n this.subGraph.getSourceDataflows(task.id).map((df) => df.targetTaskPortId)\n );\n\n for (const key of requiredKeys) {\n // Skip if already connected via dataflow or already collected from a root task\n if (connectedPorts.has(key)) continue;\n if (properties[key]) continue;\n\n // Skip if the task already has a default value for this property\n // (e.g., .textEmbedding({ model }) stores model in task.defaults)\n if (task.defaults && task.defaults[key] !== undefined) continue;\n\n const prop = (inputSchema.properties || {})[key];\n if (!prop || typeof prop === \"boolean\") continue;\n\n properties[key] = prop as DataPortSchema;\n if (!required.includes(key)) {\n required.push(key);\n }\n }\n }\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties,\n } as DataPortSchema;\n }\n\n public getIterationInputSchema(): DataPortSchema {\n if (this._iterationInputSchema) {\n return this._iterationInputSchema;\n }\n\n this._iterationInputSchema = this.iterationInputConfig\n ? this.buildConfiguredIterationInputSchema()\n : this.buildDefaultIterationInputSchema();\n\n return this._iterationInputSchema;\n }\n\n public setIterationInputSchema(schema: DataPortSchema): void {\n this._iterationInputSchema = schema;\n this._inputSchemaNode = undefined;\n this.events.emit(\"regenerate\");\n }\n\n public setPropertyInputMode(\n propertyName: string,\n mode: IterationInputMode,\n baseSchema?: PropertySchema\n ): void {\n const currentSchema = this.getIterationInputSchema();\n if (typeof currentSchema === \"boolean\") return;\n\n const currentProps = (currentSchema.properties || {}) as Record<string, PropertySchema>;\n const existingProp = currentProps[propertyName];\n const base: PropertySchema =\n baseSchema ?? (existingProp ? extractBaseSchema(existingProp) : { type: \"string\" });\n\n let newPropSchema: PropertySchema;\n switch (mode) {\n case \"array\":\n newPropSchema = createArraySchema(base);\n break;\n case \"scalar\":\n newPropSchema = base;\n break;\n case \"flexible\":\n default:\n newPropSchema = createFlexibleSchema(base);\n break;\n }\n\n this._iterationInputSchema = {\n ...currentSchema,\n properties: {\n ...currentProps,\n [propertyName]: newPropSchema,\n },\n } as DataPortSchema;\n\n this._inputSchemaNode = undefined;\n this.events.emit(\"regenerate\");\n }\n\n public invalidateIterationInputSchema(): void {\n this._iterationInputSchema = undefined;\n this._iteratorPortInfo = undefined;\n this._inputSchemaNode = undefined;\n }\n\n // ========================================================================\n // Iteration analysis\n // ========================================================================\n\n /**\n * Analyzes input to determine which ports are iterated vs scalar.\n * Precedence:\n * 1) explicit x-ui-iteration annotation\n * 2) schema inference where deterministic\n * 3) runtime value fallback (Array.isArray)\n */\n public analyzeIterationInput(input: Input): IterationAnalysisResult {\n const inputData = input as Record<string, unknown>;\n const schema = this.hasChildren() ? this.getIterationInputSchema() : this.inputSchema();\n const schemaProps: Record<string, DataPortSchema> =\n typeof schema === \"object\" && schema.properties\n ? (schema.properties as Record<string, DataPortSchema>)\n : {};\n\n const keys = new Set([...Object.keys(schemaProps), ...Object.keys(inputData)]);\n\n const arrayPorts: string[] = [];\n const scalarPorts: string[] = [];\n const iteratedValues: Record<string, unknown[]> = {};\n const arrayLengths: number[] = [];\n\n for (const key of keys) {\n if (key.startsWith(\"_iteration\")) continue;\n\n const value = inputData[key];\n const portSchema = schemaProps[key];\n\n let shouldIterate: boolean;\n\n const explicitFlag = getExplicitIterationFlag(portSchema);\n if (explicitFlag !== undefined) {\n shouldIterate = explicitFlag;\n } else {\n const schemaInference = inferIterationFromSchema(portSchema);\n shouldIterate = schemaInference ?? Array.isArray(value);\n }\n\n if (!shouldIterate) {\n scalarPorts.push(key);\n continue;\n }\n\n if (!Array.isArray(value)) {\n throw new TaskConfigurationError(\n `${this.type}: Input '${key}' is configured for iteration but value is not an array.`\n );\n }\n\n iteratedValues[key] = value;\n arrayPorts.push(key);\n arrayLengths.push(value.length);\n }\n\n if (arrayPorts.length === 0) {\n throw new TaskConfigurationError(\n `${this.type}: At least one array input is required for iteration. ` +\n `Mark a port with x-ui-iteration=true, provide array-typed schema, or pass array values at runtime.`\n );\n }\n\n const uniqueLengths = new Set(arrayLengths);\n if (uniqueLengths.size > 1) {\n const lengthInfo = arrayPorts\n .map((port, index) => `${port}=${arrayLengths[index]}`)\n .join(\", \");\n throw new TaskConfigurationError(\n `${this.type}: All iterated array inputs must have the same length (zip semantics). ` +\n `Found different lengths: ${lengthInfo}`\n );\n }\n\n const iterationCount = arrayLengths[0] ?? 0;\n\n const getIterationInput = (index: number): Record<string, unknown> => {\n const iterInput: Record<string, unknown> = {};\n\n for (const key of arrayPorts) {\n iterInput[key] = iteratedValues[key][index];\n }\n\n for (const key of scalarPorts) {\n if (key in inputData) {\n iterInput[key] = inputData[key];\n }\n }\n\n return iterInput;\n };\n\n return {\n iterationCount,\n arrayPorts,\n scalarPorts,\n getIterationInput,\n };\n }\n\n // ========================================================================\n // Schema Methods\n // ========================================================================\n\n public getIterationContextSchema(): DataPortSchema {\n return (this.constructor as typeof IteratorTask).getIterationContextSchema();\n }\n\n public inputSchema(): DataPortSchema {\n if (this.hasChildren()) {\n return this.getIterationInputSchema();\n }\n return (this.constructor as typeof IteratorTask).inputSchema();\n }\n\n public outputSchema(): DataPortSchema {\n if (!this.hasChildren()) {\n return (this.constructor as typeof IteratorTask).outputSchema();\n }\n\n return this.getWrappedOutputSchema();\n }\n\n protected getWrappedOutputSchema(): DataPortSchema {\n if (!this.hasChildren()) {\n return { type: \"object\", properties: {}, additionalProperties: false };\n }\n\n const endingNodes = this.subGraph\n .getTasks()\n .filter((task) => this.subGraph.getTargetDataflows(task.id).length === 0);\n\n if (endingNodes.length === 0) {\n return { type: \"object\", properties: {}, additionalProperties: false };\n }\n\n const properties: Record<string, unknown> = {};\n\n for (const task of endingNodes) {\n const taskOutputSchema = task.outputSchema();\n if (typeof taskOutputSchema === \"boolean\") continue;\n\n for (const [key, schema] of Object.entries(taskOutputSchema.properties || {})) {\n properties[key] = {\n type: \"array\",\n items: schema,\n };\n }\n }\n\n return {\n type: \"object\",\n properties,\n additionalProperties: false,\n } as DataPortSchema;\n }\n}\n",
|
|
30
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { uuid4 } from \"@workglow/util\";\nimport { Dataflow } from \"../task-graph/Dataflow\";\nimport { TaskGraph } from \"../task-graph/TaskGraph\";\nimport { GraphAsTaskRunner } from \"./GraphAsTaskRunner\";\nimport type { ITaskConstructor } from \"./ITask\";\nimport type { IterationAnalysisResult, IteratorTask, IteratorTaskConfig } from \"./IteratorTask\";\nimport type { TaskInput, TaskOutput } from \"./TaskTypes\";\n\n/**\n * Runner for IteratorTask that executes a single subgraph repeatedly with\n * per-iteration inputs. The task defines iteration analysis/collection hooks,\n * while this runner owns scheduling and execution orchestration.\n */\nexport class IteratorTaskRunner<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends IteratorTaskConfig = IteratorTaskConfig,\n> extends GraphAsTaskRunner<Input, Output, Config> {\n declare task: IteratorTask<Input, Output, Config>;\n\n /**\n * For iterator tasks, reactive runs use full execution for correctness.\n */\n\n protected override async executeTask(input: Input): Promise<Output | undefined> {\n const analysis = this.task.analyzeIterationInput(input);\n\n if (analysis.iterationCount === 0) {\n const emptyResult = this.task.getEmptyResult();\n return this.executeTaskReactive(input, emptyResult as Output);\n }\n\n const result = this.task.isReduceTask()\n ? await this.executeReduceIterations(analysis)\n : await this.executeCollectIterations(analysis);\n\n return this.executeTaskReactive(input, result as Output);\n }\n\n /**\n * Iterator tasks should only run the task's reactive hook here.\n */\n public override async executeTaskReactive(input: Input, output: Output): Promise<Output> {\n const reactiveResult = await this.task.executeReactive(input, output, { own: this.own });\n return Object.assign({}, output, reactiveResult ?? {}) as Output;\n }\n\n protected async executeCollectIterations(analysis: IterationAnalysisResult): Promise<Output> {\n const iterationCount = analysis.iterationCount;\n const preserveOrder = this.task.preserveIterationOrder();\n\n const batchSize =\n this.task.batchSize !== undefined && this.task.batchSize > 0\n ? this.task.batchSize\n : iterationCount;\n\n const requestedConcurrency = this.task.concurrencyLimit ?? iterationCount;\n const concurrency = Math.max(1, Math.min(requestedConcurrency, iterationCount));\n\n const orderedResults: Array<TaskOutput | undefined> = preserveOrder\n ? new Array(iterationCount)\n : [];\n const completionOrderResults: TaskOutput[] = [];\n\n let completedCount = 0;\n\n for (let batchStart = 0; batchStart < iterationCount; batchStart += batchSize) {\n if (this.abortController?.signal.aborted) {\n break;\n }\n\n const batchEnd = Math.min(batchStart + batchSize, iterationCount);\n const batchIndices = Array.from({ length: batchEnd - batchStart }, (_, i) => batchStart + i);\n\n const batchResults = await this.executeBatch(\n batchIndices,\n analysis,\n iterationCount,\n concurrency,\n async () => {\n completedCount++;\n const progress = Math.round((completedCount / iterationCount) * 100);\n await this.handleProgress(\n progress,\n `Completed ${completedCount}/${iterationCount} iterations`\n );\n }\n );\n\n for (const { index, result } of batchResults) {\n if (result === undefined) continue;\n\n if (preserveOrder) {\n orderedResults[index] = result;\n } else {\n completionOrderResults.push(result);\n }\n }\n }\n\n const collected = preserveOrder\n ? orderedResults.filter((result): result is TaskOutput => result !== undefined)\n : completionOrderResults;\n\n return this.task.collectResults(collected);\n }\n\n protected async executeReduceIterations(analysis: IterationAnalysisResult): Promise<Output> {\n const iterationCount = analysis.iterationCount;\n let accumulator = this.task.getInitialAccumulator();\n\n for (let index = 0; index < iterationCount; index++) {\n if (this.abortController?.signal.aborted) {\n break;\n }\n\n const iterationInput = this.task.buildIterationRunInput(analysis, index, iterationCount, {\n accumulator,\n });\n\n const iterationResult = await this.executeSubgraphIteration(iterationInput);\n accumulator = this.task.mergeIterationIntoAccumulator(accumulator, iterationResult, index);\n\n const progress = Math.round(((index + 1) / iterationCount) * 100);\n await this.handleProgress(progress, `Completed ${index + 1}/${iterationCount} iterations`);\n }\n\n return accumulator;\n }\n\n protected async executeBatch(\n indices: number[],\n analysis: IterationAnalysisResult,\n iterationCount: number,\n concurrency: number,\n onItemComplete?: () => Promise<void>\n ): Promise<Array<{ index: number; result: TaskOutput | undefined }>> {\n const results: Array<{ index: number; result: TaskOutput | undefined }> = [];\n let cursor = 0;\n\n const workerCount = Math.max(1, Math.min(concurrency, indices.length));\n\n const workers = Array.from({ length: workerCount }, async () => {\n while (true) {\n if (this.abortController?.signal.aborted) {\n return;\n }\n\n const position = cursor;\n cursor += 1;\n\n if (position >= indices.length) {\n return;\n }\n\n const index = indices[position];\n const iterationInput = this.task.buildIterationRunInput(analysis, index, iterationCount);\n const result = await this.executeSubgraphIteration(iterationInput);\n results.push({ index, result });\n await onItemComplete?.();\n }\n });\n\n await Promise.all(workers);\n return results;\n }\n\n /**\n * Clones a TaskGraph by reconstructing each task from its constructor,\n * defaults, and config. This preserves non-serializable config such as\n * function references (e.g. WhileTask condition functions).\n */\n private cloneGraph(graph: TaskGraph): TaskGraph {\n const clone = new TaskGraph();\n const idMap = new Map<unknown, string>();\n for (const task of graph.getTasks()) {\n const ctor = task.constructor as ITaskConstructor<any, any, any>;\n const newId = uuid4();\n idMap.set(task.config.id, newId);\n const clonedConfig = { ...task.config, id: newId };\n const newTask = new ctor(task.defaults, clonedConfig, task.runConfig);\n if (task.hasChildren()) {\n newTask.subGraph = this.cloneGraph(task.subGraph);\n }\n clone.addTask(newTask);\n }\n for (const df of graph.getDataflows()) {\n clone.addDataflow(\n new Dataflow(\n idMap.get(df.sourceTaskId) ?? df.sourceTaskId,\n df.sourceTaskPortId,\n idMap.get(df.targetTaskId) ?? df.targetTaskId,\n df.targetTaskPortId\n )\n );\n }\n return clone;\n }\n\n protected async executeSubgraphIteration(\n input: Record<string, unknown>\n ): Promise<TaskOutput | undefined> {\n if (this.abortController?.signal.aborted) {\n return undefined;\n }\n\n const graphClone = this.cloneGraph(this.task.subGraph);\n\n const results = await graphClone.run<TaskOutput>(input as TaskInput, {\n parentSignal: this.abortController?.signal,\n outputCache: this.outputCache,\n registry: this.registry,\n });\n\n if (results.length === 0) {\n return undefined;\n }\n\n return graphClone.mergeExecuteOutputsToRunOutput(\n results,\n this.task.compoundMerge\n ) as TaskOutput;\n }\n}\n",
|
|
30
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { uuid4 } from \"@workglow/util\";\nimport { Dataflow } from \"../task-graph/Dataflow\";\nimport { TaskGraph } from \"../task-graph/TaskGraph\";\nimport { GraphAsTaskRunner } from \"./GraphAsTaskRunner\";\nimport type { ITask, ITaskConstructor } from \"./ITask\";\nimport type { IterationAnalysisResult, IteratorTask, IteratorTaskConfig } from \"./IteratorTask\";\nimport type { TaskInput, TaskOutput } from \"./TaskTypes\";\n\n/**\n * Runner for IteratorTask that executes a single subgraph repeatedly with\n * per-iteration inputs. The task defines iteration analysis/collection hooks,\n * while this runner owns scheduling and execution orchestration.\n */\nexport class IteratorTaskRunner<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends IteratorTaskConfig = IteratorTaskConfig,\n> extends GraphAsTaskRunner<Input, Output, Config> {\n declare task: IteratorTask<Input, Output, Config>;\n\n /** When true, {@link executeSubgraphIteration} folds inner progress into parent MapTask %. */\n private aggregatingParentMapProgress = false;\n private mapPartialProgress: number[] = [];\n private mapPartialIterationCount = 0;\n\n /**\n * For iterator tasks, reactive runs use full execution for correctness.\n */\n\n protected override async executeTask(input: Input): Promise<Output | undefined> {\n const analysis = this.task.analyzeIterationInput(input);\n\n if (analysis.iterationCount === 0) {\n const emptyResult = this.task.getEmptyResult();\n return this.executeTaskReactive(input, emptyResult as Output);\n }\n\n const result = this.task.isReduceTask()\n ? await this.executeReduceIterations(analysis)\n : await this.executeCollectIterations(analysis);\n\n return this.executeTaskReactive(input, result as Output);\n }\n\n /**\n * Iterator tasks should only run the task's reactive hook here.\n */\n public override async executeTaskReactive(input: Input, output: Output): Promise<Output> {\n const reactiveResult = await this.task.executeReactive(input, output, { own: this.own });\n return Object.assign({}, output, reactiveResult ?? {}) as Output;\n }\n\n protected async executeCollectIterations(analysis: IterationAnalysisResult): Promise<Output> {\n const iterationCount = analysis.iterationCount;\n const preserveOrder = this.task.preserveIterationOrder();\n\n const batchSize =\n this.task.batchSize !== undefined && this.task.batchSize > 0\n ? this.task.batchSize\n : iterationCount;\n\n const requestedConcurrency = this.task.concurrencyLimit ?? iterationCount;\n const concurrency = Math.max(1, Math.min(requestedConcurrency, iterationCount));\n\n const orderedResults: Array<TaskOutput | undefined> = preserveOrder\n ? new Array(iterationCount)\n : [];\n const completionOrderResults: TaskOutput[] = [];\n\n this.aggregatingParentMapProgress = true;\n this.mapPartialIterationCount = iterationCount;\n this.mapPartialProgress = new Array(iterationCount).fill(0);\n\n try {\n for (let batchStart = 0; batchStart < iterationCount; batchStart += batchSize) {\n if (this.abortController?.signal.aborted) {\n break;\n }\n\n const batchEnd = Math.min(batchStart + batchSize, iterationCount);\n const batchIndices = Array.from(\n { length: batchEnd - batchStart },\n (_, i) => batchStart + i\n );\n\n const batchResults = await this.executeBatch(\n batchIndices,\n analysis,\n iterationCount,\n concurrency,\n undefined\n );\n\n for (const { index, result } of batchResults) {\n if (result === undefined) continue;\n\n if (preserveOrder) {\n orderedResults[index] = result;\n } else {\n completionOrderResults.push(result);\n }\n }\n }\n\n const collected = preserveOrder\n ? orderedResults.filter((result): result is TaskOutput => result !== undefined)\n : completionOrderResults;\n\n return this.task.collectResults(collected);\n } finally {\n this.aggregatingParentMapProgress = false;\n }\n }\n\n /**\n * Updates parent MapTask / workflow progress from per-iteration partial completion (0–100 each).\n */\n private emitMapParentProgressFromPartials(childMessage?: string): void {\n const n = this.mapPartialIterationCount;\n if (n <= 0) return;\n const sum = this.mapPartialProgress.reduce((a, b) => a + b, 0);\n const overall = Math.round(sum / n);\n const done = this.mapPartialProgress.filter((v) => v >= 100).length;\n const base = `Map ${done}/${n}`;\n const msg = childMessage ? `${base} — ${childMessage}` : `${base} iterations`;\n void this.handleProgress(overall, msg);\n }\n\n protected async executeReduceIterations(analysis: IterationAnalysisResult): Promise<Output> {\n const iterationCount = analysis.iterationCount;\n let accumulator = this.task.getInitialAccumulator();\n\n for (let index = 0; index < iterationCount; index++) {\n if (this.abortController?.signal.aborted) {\n break;\n }\n\n const iterationInput = this.task.buildIterationRunInput(analysis, index, iterationCount, {\n accumulator,\n });\n\n const iterationResult = await this.executeSubgraphIteration(\n iterationInput,\n index,\n iterationCount\n );\n accumulator = this.task.mergeIterationIntoAccumulator(accumulator, iterationResult, index);\n\n const progress = Math.round(((index + 1) / iterationCount) * 100);\n await this.handleProgress(progress, `Completed ${index + 1}/${iterationCount} iterations`);\n }\n\n return accumulator;\n }\n\n protected async executeBatch(\n indices: number[],\n analysis: IterationAnalysisResult,\n iterationCount: number,\n concurrency: number,\n onItemComplete?: () => Promise<void>\n ): Promise<Array<{ index: number; result: TaskOutput | undefined }>> {\n const results: Array<{ index: number; result: TaskOutput | undefined }> = [];\n let cursor = 0;\n\n const workerCount = Math.max(1, Math.min(concurrency, indices.length));\n\n const workers = Array.from({ length: workerCount }, async () => {\n while (true) {\n if (this.abortController?.signal.aborted) {\n return;\n }\n\n const position = cursor;\n cursor += 1;\n\n if (position >= indices.length) {\n return;\n }\n\n const index = indices[position];\n const iterationInput = this.task.buildIterationRunInput(analysis, index, iterationCount);\n const result = await this.executeSubgraphIteration(iterationInput, index, iterationCount);\n results.push({ index, result });\n await onItemComplete?.();\n }\n });\n\n await Promise.all(workers);\n return results;\n }\n\n /**\n * Clones a TaskGraph by reconstructing each task from its constructor,\n * defaults, and config. This preserves non-serializable config such as\n * function references (e.g. WhileTask condition functions).\n */\n private cloneGraph(graph: TaskGraph): TaskGraph {\n const clone = new TaskGraph();\n const idMap = new Map<unknown, string>();\n for (const task of graph.getTasks()) {\n const ctor = task.constructor as ITaskConstructor<any, any, any>;\n const newId = uuid4();\n idMap.set(task.config.id, newId);\n const clonedConfig = { ...task.config, id: newId };\n const newTask = new ctor(task.defaults, clonedConfig, task.runConfig);\n if (task.hasChildren()) {\n newTask.subGraph = this.cloneGraph(task.subGraph);\n }\n clone.addTask(newTask);\n }\n for (const df of graph.getDataflows()) {\n clone.addDataflow(\n new Dataflow(\n idMap.get(df.sourceTaskId) ?? df.sourceTaskId,\n df.sourceTaskPortId,\n idMap.get(df.targetTaskId) ?? df.targetTaskId,\n df.targetTaskPortId\n )\n );\n }\n return clone;\n }\n\n protected async executeSubgraphIteration(\n input: Record<string, unknown>,\n index: number,\n iterationCount: number\n ): Promise<TaskOutput | undefined> {\n if (this.abortController?.signal.aborted) {\n return undefined;\n }\n\n const graphClone = this.cloneGraph(this.task.subGraph);\n\n this.task.emit(\"iteration_start\", index, iterationCount);\n\n /**\n * Per-task `progress` (0–100), not {@link TaskGraph}'s `graph_progress`, which averages\n * `task.progress` across nodes when `getTasks().length > 1` (e.g. one task at 100% and\n * three at 0% becomes 25% — wrong for iteration sub-rows).\n */\n const taskProgressUnsubs: Array<{ task: ITask; fn: (p: number, m?: string) => void }> = [];\n for (const t of graphClone.getTasks()) {\n const fn = (p: number, message?: string): void => {\n this.task.emit(\"iteration_progress\", index, iterationCount, p, message);\n if (this.aggregatingParentMapProgress && this.mapPartialIterationCount > 0) {\n this.mapPartialProgress[index] = Math.max(this.mapPartialProgress[index] ?? 0, p);\n this.emitMapParentProgressFromPartials(message);\n }\n };\n t.events.on(\"progress\", fn);\n taskProgressUnsubs.push({ task: t, fn });\n }\n\n try {\n const results = await graphClone.run<TaskOutput>(input as TaskInput, {\n parentSignal: this.abortController?.signal,\n outputCache: this.outputCache,\n registry: this.registry,\n });\n\n if (results.length === 0) {\n return undefined;\n }\n\n return graphClone.mergeExecuteOutputsToRunOutput(\n results,\n this.task.compoundMerge\n ) as TaskOutput;\n } finally {\n for (const { task, fn } of taskProgressUnsubs) {\n task.events.off(\"progress\", fn);\n }\n if (this.aggregatingParentMapProgress && this.mapPartialIterationCount > 0) {\n this.mapPartialProgress[index] = 100;\n this.emitMapParentProgressFromPartials();\n }\n this.task.emit(\"iteration_complete\", index, iterationCount);\n }\n }\n}\n",
|
|
31
31
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { DataPortSchema } from \"@workglow/util\";\nimport { CreateEndLoopWorkflow, CreateLoopWorkflow, Workflow } from \"../task-graph/Workflow\";\nimport { evaluateCondition, getNestedValue } from \"./ConditionUtils\";\nimport { GraphAsTask, GraphAsTaskConfig, graphAsTaskConfigSchema } from \"./GraphAsTask\";\nimport type { IExecuteContext } from \"./ITask\";\nimport type { StreamEvent, StreamFinish } from \"./StreamTypes\";\nimport { TaskConfigurationError } from \"./TaskError\";\nimport type { TaskInput, TaskOutput, TaskTypeName } from \"./TaskTypes\";\nimport { WhileTaskRunner } from \"./WhileTaskRunner\";\n\n/**\n * WhileTask context schema - only has index since count is unknown ahead of time.\n * Properties are marked with \"x-ui-iteration\": true so the builder\n * knows to hide them from parent-level display.\n */\nexport const WHILE_CONTEXT_SCHEMA: DataPortSchema = {\n type: \"object\",\n properties: {\n _iterationIndex: {\n type: \"integer\",\n minimum: 0,\n title: \"Iteration Number\",\n description: \"Current iteration number (0-based)\",\n \"x-ui-iteration\": true,\n },\n },\n};\n\n/**\n * Condition function type for WhileTask.\n * Receives the current output and iteration count, returns whether to continue looping.\n *\n * @param output - The output from the last iteration\n * @param iteration - The current iteration number (0-based)\n * @returns true to continue looping, false to stop\n */\nexport type WhileConditionFn<Output> = (output: Output, iteration: number) => boolean;\n\nexport const whileTaskConfigSchema = {\n type: \"object\",\n properties: {\n ...graphAsTaskConfigSchema[\"properties\"],\n condition: {},\n maxIterations: { type: \"integer\", minimum: 1 },\n chainIterations: { type: \"boolean\" },\n conditionField: { type: \"string\" },\n conditionOperator: { type: \"string\" },\n conditionValue: { type: \"string\" },\n iterationInputConfig: { type: \"object\", additionalProperties: true },\n },\n additionalProperties: false,\n} as const satisfies DataPortSchema;\n\n/**\n * Configuration for WhileTask.\n */\nexport type WhileTaskConfig<Output extends TaskOutput = TaskOutput> = GraphAsTaskConfig & {\n /**\n * Condition function that determines whether to continue looping.\n * Called after each iteration with the current output and iteration count.\n * Returns true to continue, false to stop.\n */\n readonly condition?: WhileConditionFn<Output>;\n\n /**\n * Maximum number of iterations to prevent infinite loops.\n * @default 100\n */\n readonly maxIterations?: number;\n\n /**\n * Whether to pass the output of each iteration as input to the next.\n * When true, output from iteration N becomes input to iteration N+1.\n * @default true\n */\n readonly chainIterations?: boolean;\n\n /** Output field to evaluate for the loop condition. */\n readonly conditionField?: string;\n\n /** Comparison operator for the loop condition. */\n readonly conditionOperator?: string;\n\n /** Value to compare against for the loop condition. */\n readonly conditionValue?: string;\n\n /** Per-property iteration input configuration (scalar/array/flexible). */\n readonly iterationInputConfig?: Record<string, { mode: string; baseSchema?: unknown }>;\n};\n\n/**\n * WhileTask loops until a condition function returns false.\n *\n * This task is useful for:\n * - Iterative refinement processes\n * - Polling until a condition is met\n * - Convergence algorithms\n * - Retry logic with conditions\n *\n * ## Features\n *\n * - Loops until condition returns false\n * - Configurable maximum iterations (safety limit)\n * - Passes output from each iteration to the next\n * - Access to iteration count in condition function\n *\n * ## Usage\n *\n * ```typescript\n * // Refine until quality threshold\n * workflow\n * .while({\n * condition: (output, iteration) => output.quality < 0.9 && iteration < 10,\n * maxIterations: 20\n * })\n * .refineResult()\n * .evaluateQuality()\n * .endWhile()\n *\n * // Retry until success\n * workflow\n * .while({\n * condition: (output) => !output.success,\n * maxIterations: 5\n * })\n * .attemptOperation()\n * .endWhile()\n * ```\n *\n * @template Input - The input type for the while task\n * @template Output - The output type for the while task\n * @template Config - The configuration type\n */\nexport class WhileTask<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends WhileTaskConfig<Output> = WhileTaskConfig<Output>,\n> extends GraphAsTask<Input, Output, Config> {\n public static type: TaskTypeName = \"WhileTask\";\n public static category: string = \"Flow Control\";\n public static title: string = \"While Loop\";\n public static description: string = \"Loops until a condition function returns false\";\n\n /** This task has dynamic schemas based on the inner workflow */\n public static hasDynamicSchemas: boolean = true;\n\n public static configSchema(): DataPortSchema {\n return whileTaskConfigSchema;\n }\n\n /**\n * Returns the schema for iteration-context inputs that will be\n * injected into the subgraph InputTask at runtime.\n *\n * WhileTask only provides _iterationIndex since the total count\n * is unknown ahead of time.\n */\n public static getIterationContextSchema(): DataPortSchema {\n return WHILE_CONTEXT_SCHEMA;\n }\n\n /**\n * Current iteration count during execution.\n */\n protected _currentIteration: number = 0;\n\n constructor(input: Partial<Input> = {}, config: Partial<Config> = {}) {\n super(input, config as Config);\n }\n\n // ========================================================================\n // TaskRunner Override\n // ========================================================================\n\n declare _runner: WhileTaskRunner<Input, Output, Config>;\n\n override get runner(): WhileTaskRunner<Input, Output, Config> {\n if (!this._runner) {\n this._runner = new WhileTaskRunner<Input, Output, Config>(this);\n }\n return this._runner;\n }\n\n // ========================================================================\n // Configuration Accessors\n // ========================================================================\n\n /**\n * Gets the condition function.\n */\n public get condition(): WhileConditionFn<Output> | undefined {\n return this.config.condition;\n }\n\n /**\n * Gets the maximum iterations limit.\n */\n public get maxIterations(): number {\n return this.config.maxIterations ?? 100;\n }\n\n /**\n * Whether to chain iteration outputs to inputs.\n */\n public get chainIterations(): boolean {\n return this.config.chainIterations ?? true;\n }\n\n /**\n * Gets the current iteration count.\n */\n public get currentIteration(): number {\n return this._currentIteration;\n }\n\n // ========================================================================\n // Execution\n // ========================================================================\n\n /**\n * Execute the while loop.\n */\n /**\n * Builds a condition function from the serialized condition fields in config.\n */\n private buildConditionFromConfig(): WhileConditionFn<Output> | undefined {\n const { conditionOperator, conditionField, conditionValue } = this.config;\n\n if (!conditionOperator) {\n return undefined;\n }\n\n return (output: Output) => {\n const fieldValue = conditionField\n ? getNestedValue(output as Record<string, unknown>, conditionField)\n : output;\n return evaluateCondition(fieldValue, conditionOperator as any, conditionValue ?? \"\");\n };\n }\n\n /**\n * Analyzes the iterationInputConfig from whileConfig to decompose\n * array inputs into per-iteration scalar values.\n *\n * Returns null if no iterationInputConfig is present (normal while behavior).\n */\n private analyzeArrayInputs(input: Input): {\n arrayPorts: string[];\n scalarPorts: string[];\n iteratedValues: Record<string, unknown[]>;\n iterationCount: number;\n } | null {\n if (!this.config.iterationInputConfig) {\n return null;\n }\n\n const inputData = input as Record<string, unknown>;\n const config = this.config.iterationInputConfig!;\n\n const arrayPorts: string[] = [];\n const scalarPorts: string[] = [];\n const iteratedValues: Record<string, unknown[]> = {};\n const arrayLengths: number[] = [];\n\n for (const [key, propConfig] of Object.entries(config)) {\n const value = inputData[key];\n\n if (propConfig.mode === \"array\") {\n if (!Array.isArray(value)) {\n // Skip non-array values for array-mode ports\n scalarPorts.push(key);\n continue;\n }\n iteratedValues[key] = value;\n arrayPorts.push(key);\n arrayLengths.push(value.length);\n } else {\n scalarPorts.push(key);\n }\n }\n\n // Also include any input keys not in the config as scalars\n for (const key of Object.keys(inputData)) {\n if (!config[key] && !key.startsWith(\"_iteration\")) {\n scalarPorts.push(key);\n }\n }\n\n if (arrayPorts.length === 0) {\n return null;\n }\n\n // All array ports must have the same length (zip semantics)\n const uniqueLengths = new Set(arrayLengths);\n if (uniqueLengths.size > 1) {\n const lengthInfo = arrayPorts\n .map((port, index) => `${port}=${arrayLengths[index]}`)\n .join(\", \");\n throw new TaskConfigurationError(\n `${this.type}: All iterated array inputs must have the same length. ` +\n `Found different lengths: ${lengthInfo}`\n );\n }\n\n return {\n arrayPorts,\n scalarPorts,\n iteratedValues,\n iterationCount: arrayLengths[0] ?? 0,\n };\n }\n\n /**\n * Builds per-iteration input by picking the i-th element from each array port\n * and passing scalar ports through unchanged.\n */\n private buildIterationInput(\n input: Input,\n analysis: {\n arrayPorts: string[];\n scalarPorts: string[];\n iteratedValues: Record<string, unknown[]>;\n },\n index: number\n ): Input {\n const inputData = input as Record<string, unknown>;\n const iterInput: Record<string, unknown> = {};\n\n for (const key of analysis.arrayPorts) {\n iterInput[key] = analysis.iteratedValues[key][index];\n }\n\n for (const key of analysis.scalarPorts) {\n if (key in inputData) {\n iterInput[key] = inputData[key];\n }\n }\n\n return iterInput as Input;\n }\n\n public async execute(input: Input, context: IExecuteContext): Promise<Output | undefined> {\n if (!this.hasChildren()) {\n throw new TaskConfigurationError(`${this.type}: No subgraph set for while loop`);\n }\n\n // Use provided condition or auto-build from serialized whileConfig\n const condition = this.condition ?? this.buildConditionFromConfig();\n\n if (!condition) {\n throw new TaskConfigurationError(`${this.type}: No condition function provided`);\n }\n\n // Check for array decomposition via iterationInputConfig\n const arrayAnalysis = this.analyzeArrayInputs(input);\n\n this._currentIteration = 0;\n let currentInput: Input = { ...input };\n let currentOutput: Output = {} as Output;\n\n // Determine effective max iterations (respect array length if decomposing)\n const effectiveMax = arrayAnalysis\n ? Math.min(this.maxIterations, arrayAnalysis.iterationCount)\n : this.maxIterations;\n\n // Execute iterations until condition returns false or max iterations reached\n while (this._currentIteration < effectiveMax) {\n if (context.signal?.aborted) {\n break;\n }\n\n // Build the input for this iteration\n let iterationInput: Input;\n if (arrayAnalysis) {\n // Decompose array inputs into per-iteration scalars\n iterationInput = {\n ...this.buildIterationInput(currentInput, arrayAnalysis, this._currentIteration),\n _iterationIndex: this._currentIteration,\n } as Input;\n } else {\n iterationInput = {\n ...currentInput,\n _iterationIndex: this._currentIteration,\n } as Input;\n }\n\n // Run the subgraph (it resets itself on each run)\n const results = await this.subGraph.run<Output>(iterationInput, {\n parentSignal: context.signal,\n });\n\n // Merge results\n currentOutput = this.subGraph.mergeExecuteOutputsToRunOutput(\n results,\n this.compoundMerge\n ) as Output;\n\n // Check condition\n if (!condition(currentOutput, this._currentIteration)) {\n break;\n }\n\n // Chain output to input for next iteration if enabled\n if (this.chainIterations) {\n currentInput = { ...currentInput, ...currentOutput } as Input;\n }\n\n this._currentIteration++;\n\n // Update progress — cap at 99 since the loop may stop before effectiveMax\n const progress = Math.min(Math.round((this._currentIteration / effectiveMax) * 100), 99);\n await context.updateProgress(\n progress,\n `Completed ${this._currentIteration}/${effectiveMax} iterations`\n );\n }\n\n return currentOutput;\n }\n\n /**\n * Streaming execution for WhileTask: runs all iterations except the last\n * normally (materializing), then streams the final iteration's events.\n * This provides streaming output for the final result while still\n * supporting iteration chaining.\n */\n async *executeStream(input: Input, context: IExecuteContext): AsyncIterable<StreamEvent<Output>> {\n if (!this.hasChildren()) {\n throw new TaskConfigurationError(`${this.type}: No subgraph set for while loop`);\n }\n\n const condition = this.condition ?? this.buildConditionFromConfig();\n if (!condition) {\n throw new TaskConfigurationError(`${this.type}: No condition function provided`);\n }\n\n const arrayAnalysis = this.analyzeArrayInputs(input);\n this._currentIteration = 0;\n let currentInput: Input = { ...input };\n let currentOutput: Output = {} as Output;\n\n const effectiveMax = arrayAnalysis\n ? Math.min(this.maxIterations, arrayAnalysis.iterationCount)\n : this.maxIterations;\n\n while (this._currentIteration < effectiveMax) {\n if (context.signal?.aborted) break;\n\n let iterationInput: Input;\n if (arrayAnalysis) {\n iterationInput = {\n ...this.buildIterationInput(currentInput, arrayAnalysis, this._currentIteration),\n _iterationIndex: this._currentIteration,\n } as Input;\n } else {\n iterationInput = {\n ...currentInput,\n _iterationIndex: this._currentIteration,\n } as Input;\n }\n\n // Check if the NEXT iteration would be the potential last: we always\n // run non-streaming first, then decide after the condition check.\n const results = await this.subGraph.run<Output>(iterationInput, {\n parentSignal: context.signal,\n });\n\n currentOutput = this.subGraph.mergeExecuteOutputsToRunOutput(\n results,\n this.compoundMerge\n ) as Output;\n\n if (!condition(currentOutput, this._currentIteration)) {\n // This was the final iteration -- but we already ran it non-streaming.\n // Emit the finish event with the collected output.\n break;\n }\n\n if (this.chainIterations) {\n currentInput = { ...currentInput, ...currentOutput } as Input;\n }\n\n this._currentIteration++;\n\n const progress = Math.min(Math.round((this._currentIteration / effectiveMax) * 100), 99);\n await context.updateProgress(\n progress,\n `Completed ${this._currentIteration}/${effectiveMax} iterations`\n );\n }\n\n yield { type: \"finish\", data: currentOutput } as StreamFinish<Output>;\n }\n\n // ========================================================================\n // Schema Methods\n // ========================================================================\n\n /**\n * Instance method to get the iteration context schema.\n * Can be overridden by subclasses to customize iteration context.\n */\n public getIterationContextSchema(): DataPortSchema {\n return (this.constructor as typeof WhileTask).getIterationContextSchema();\n }\n\n /**\n * When chainIterations is true, the output schema from the previous\n * iteration becomes part of the input schema for the next iteration.\n * These chained properties should be marked with \"x-ui-iteration\": true.\n *\n * @returns Schema with chained output properties marked for iteration, or undefined if not chaining\n */\n public getChainedOutputSchema(): DataPortSchema | undefined {\n if (!this.chainIterations) return undefined;\n\n const outputSchema = this.outputSchema();\n if (typeof outputSchema === \"boolean\") return undefined;\n\n // Clone and mark all properties with x-ui-iteration\n const properties: Record<string, DataPortSchema> = {};\n if (outputSchema.properties && typeof outputSchema.properties === \"object\") {\n for (const [key, schema] of Object.entries(outputSchema.properties)) {\n // Skip the _iterations meta field\n if (key === \"_iterations\") continue;\n if (typeof schema === \"object\" && schema !== null) {\n properties[key] = { ...schema, \"x-ui-iteration\": true } as DataPortSchema;\n }\n }\n }\n\n if (Object.keys(properties).length === 0) return undefined;\n\n return { type: \"object\", properties } as DataPortSchema;\n }\n\n /**\n * Instance input schema override.\n * When iterationInputConfig is present, wraps array-mode ports in array schemas\n * so that the dataflow compatibility check accepts array values.\n */\n public override inputSchema(): DataPortSchema {\n if (!this.hasChildren()) {\n return (this.constructor as typeof WhileTask).inputSchema();\n }\n\n // Get the base schema from the subgraph (GraphAsTask behavior)\n const baseSchema = super.inputSchema();\n if (typeof baseSchema === \"boolean\") return baseSchema;\n\n if (!this.config.iterationInputConfig) {\n return baseSchema;\n }\n\n // Wrap array-mode ports in anyOf (scalar | array) schemas.\n // Using anyOf instead of plain type:\"array\" to avoid addInput's array-merge behavior\n // which would prepend an undefined element when runInputData starts empty.\n const properties = { ...(baseSchema.properties || {}) } as Record<string, DataPortSchema>;\n for (const [key, propConfig] of Object.entries(this.config.iterationInputConfig)) {\n if (propConfig.mode === \"array\" && properties[key]) {\n const scalarSchema = properties[key] as DataPortSchema;\n properties[key] = {\n anyOf: [scalarSchema, { type: \"array\", items: scalarSchema }],\n } as unknown as DataPortSchema;\n }\n }\n\n return {\n ...baseSchema,\n properties,\n } as DataPortSchema;\n }\n\n /**\n * Static input schema for WhileTask.\n */\n public static inputSchema(): DataPortSchema {\n return {\n type: \"object\",\n properties: {},\n additionalProperties: true,\n } as const satisfies DataPortSchema;\n }\n\n /**\n * Static output schema for WhileTask.\n */\n public static outputSchema(): DataPortSchema {\n return {\n type: \"object\",\n properties: {\n _iterations: {\n type: \"number\",\n title: \"Iterations\",\n description: \"Number of iterations executed\",\n },\n },\n additionalProperties: true,\n } as const satisfies DataPortSchema;\n }\n\n /**\n * Instance output schema - returns final iteration output schema.\n */\n public override outputSchema(): DataPortSchema {\n if (!this.hasChildren()) {\n return (this.constructor as typeof WhileTask).outputSchema();\n }\n\n // Get ending nodes from subgraph\n const tasks = this.subGraph.getTasks();\n const endingNodes = tasks.filter(\n (task) => this.subGraph.getTargetDataflows(task.id).length === 0\n );\n\n if (endingNodes.length === 0) {\n return (this.constructor as typeof WhileTask).outputSchema();\n }\n\n const properties: Record<string, unknown> = {\n _iterations: {\n type: \"number\",\n title: \"Iterations\",\n description: \"Number of iterations executed\",\n },\n };\n\n // Merge output schemas from ending nodes\n for (const task of endingNodes) {\n const taskOutputSchema = task.outputSchema();\n if (typeof taskOutputSchema === \"boolean\") continue;\n\n const taskProperties = taskOutputSchema.properties || {};\n for (const [key, schema] of Object.entries(taskProperties)) {\n if (!properties[key]) {\n properties[key] = schema;\n }\n }\n }\n\n return {\n type: \"object\",\n properties,\n additionalProperties: false,\n } as DataPortSchema;\n }\n}\n\n// ============================================================================\n// Workflow Prototype Extensions\n// ============================================================================\n\ndeclare module \"../task-graph/Workflow\" {\n interface Workflow {\n /**\n * Starts a while loop that continues until a condition is false.\n * Use .endWhile() to close the loop and return to the parent workflow.\n *\n * @param config - Configuration for the while loop (must include condition)\n * @returns A Workflow in loop builder mode for defining the loop body\n *\n * @example\n * ```typescript\n * workflow\n * .while({\n * condition: (output, iteration) => output.quality < 0.9,\n * maxIterations: 10\n * })\n * .refineResult()\n * .endWhile()\n * ```\n */\n while: CreateLoopWorkflow<TaskInput, TaskOutput, WhileTaskConfig<any>>;\n\n /**\n * Ends the while loop and returns to the parent workflow.\n * Only callable on workflows in loop builder mode.\n *\n * @returns The parent workflow\n */\n endWhile(): Workflow;\n }\n}\n\nWorkflow.prototype.while = CreateLoopWorkflow(WhileTask);\n\nWorkflow.prototype.endWhile = CreateEndLoopWorkflow(\"endWhile\");\n",
|
|
32
32
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { GraphAsTaskRunner } from \"./GraphAsTaskRunner\";\nimport type { TaskInput, TaskOutput } from \"./TaskTypes\";\nimport type { WhileTask, WhileTaskConfig } from \"./WhileTask\";\n\n/**\n * Runner for WhileTask that delegates to the task's execute() method\n * instead of directly running the subgraph once (which is what\n * GraphAsTaskRunner does by default).\n *\n * This follows the same pattern as IteratorTaskRunner.\n */\nexport class WhileTaskRunner<\n Input extends TaskInput = TaskInput,\n Output extends TaskOutput = TaskOutput,\n Config extends WhileTaskConfig<Output> = WhileTaskConfig<Output>,\n> extends GraphAsTaskRunner<Input, Output, Config> {\n declare task: WhileTask<Input, Output, Config>;\n\n /**\n * Override executeTask to call the task's execute() method which\n * contains the while-loop logic, rather than the default\n * GraphAsTaskRunner behavior of running the subgraph once.\n */\n protected override async executeTask(input: Input): Promise<Output | undefined> {\n const result = await this.task.execute(input, {\n signal: this.abortController!.signal,\n updateProgress: this.handleProgress.bind(this),\n own: this.own,\n registry: this.registry,\n });\n\n return result;\n }\n\n /**\n * For WhileTask, reactive runs use the task's reactive hook only.\n */\n public override async executeTaskReactive(input: Input, output: Output): Promise<Output> {\n const reactiveResult = await this.task.executeReactive(input, output, { own: this.own });\n return Object.assign({}, output, reactiveResult ?? {}) as Output;\n }\n}\n",
|
|
33
33
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n *\n * Shared iteration schema helpers used by IteratorTask/WhileTask and the builder.\n * Re-exports context schemas and adds pure schema functions that operate on DataPortSchema.\n */\n\nimport type { DataPortSchema, PropertySchema } from \"@workglow/util\";\n\nimport {\n createArraySchema,\n createFlexibleSchema,\n extractBaseSchema,\n ITERATOR_CONTEXT_SCHEMA,\n type ExecutionMode,\n type IterationInputMode,\n type IterationPropertyConfig,\n} from \"./IteratorTask\";\nimport { WHILE_CONTEXT_SCHEMA } from \"./WhileTask\";\n\nexport {\n createArraySchema,\n createFlexibleSchema,\n extractBaseSchema,\n ITERATOR_CONTEXT_SCHEMA,\n WHILE_CONTEXT_SCHEMA,\n type ExecutionMode,\n type IterationInputMode,\n type IterationPropertyConfig,\n};\n\n/** Config for buildIterationInputSchema: mode and optional baseSchema (defaults to extracted from inner). */\nexport type IterationInputConfig = Record<\n string,\n { mode: IterationInputMode; baseSchema?: PropertySchema }\n>;\n\n/**\n * Determines if a schema is a flexible type (T | T[]).\n */\nexport function isFlexibleSchema(schema: DataPortSchema): boolean {\n if (typeof schema === \"boolean\") return false;\n\n const variants =\n (schema as Record<string, unknown>).oneOf ?? (schema as Record<string, unknown>).anyOf;\n const arr = Array.isArray(variants) ? (variants as DataPortSchema[]) : undefined;\n if (!arr || arr.length !== 2) return false;\n\n let hasScalar = false;\n let hasArray = false;\n\n for (const variant of arr) {\n if (typeof variant !== \"object\") continue;\n const v = variant as Record<string, unknown>;\n if (v.type === \"array\" || \"items\" in v) {\n hasArray = true;\n } else {\n hasScalar = true;\n }\n }\n\n return hasScalar && hasArray;\n}\n\n/**\n * Determines if a schema is strictly an array type.\n */\nexport function isStrictArraySchema(schema: DataPortSchema): boolean {\n if (typeof schema === \"boolean\") return false;\n const s = schema as Record<string, unknown>;\n return s.type === \"array\" && !isFlexibleSchema(schema);\n}\n\n/**\n * Gets the input mode for a schema property.\n */\nexport function getInputModeFromSchema(schema: DataPortSchema): IterationInputMode {\n if (isFlexibleSchema(schema)) return \"flexible\";\n if (isStrictArraySchema(schema)) return \"array\";\n return \"scalar\";\n}\n\n/**\n * Get the appropriate iteration context schema for a given task type.\n */\nexport function getIterationContextSchemaForType(taskType: string): DataPortSchema | undefined {\n if (taskType === \"MapTask\" || taskType === \"ReduceTask\") {\n return ITERATOR_CONTEXT_SCHEMA;\n }\n if (taskType === \"WhileTask\") {\n return WHILE_CONTEXT_SCHEMA;\n }\n return undefined;\n}\n\n/**\n * Merge iteration context schema into an existing InputNode schema.\n */\nexport function addIterationContextToSchema(\n existingSchema: DataPortSchema | undefined,\n parentTaskType: string\n): DataPortSchema {\n const contextSchema = getIterationContextSchemaForType(parentTaskType);\n if (!contextSchema) {\n return existingSchema ?? { type: \"object\", properties: {} };\n }\n\n const baseProperties =\n existingSchema &&\n typeof existingSchema !== \"boolean\" &&\n (existingSchema as Record<string, unknown>).properties &&\n typeof (existingSchema as Record<string, unknown>).properties !== \"boolean\"\n ? ((existingSchema as Record<string, unknown>).properties as Record<string, DataPortSchema>)\n : {};\n\n const contextProperties =\n typeof contextSchema !== \"boolean\" &&\n (contextSchema as Record<string, unknown>).properties &&\n typeof (contextSchema as Record<string, unknown>).properties !== \"boolean\"\n ? ((contextSchema as Record<string, unknown>).properties as Record<string, DataPortSchema>)\n : {};\n\n return {\n type: \"object\",\n properties: {\n ...baseProperties,\n ...contextProperties,\n },\n };\n}\n\n/**\n * Check if a schema property is an iteration-injected input.\n */\nexport function isIterationProperty(schema: PropertySchema): boolean {\n if (!schema || typeof schema === \"boolean\") return false;\n return (schema as Record<string, unknown>)[\"x-ui-iteration\"] === true;\n}\n\n/**\n * Filter out iteration properties from a schema (for parent display).\n */\nexport function filterIterationProperties(schema?: DataPortSchema): DataPortSchema | undefined {\n if (!schema || typeof schema === \"boolean\") return schema;\n const props = (schema as Record<string, unknown>).properties;\n if (!props || typeof props === \"boolean\") return schema;\n\n const filteredProps: Record<string, DataPortSchema> = {};\n for (const [key, propSchema] of Object.entries(props as Record<string, DataPortSchema>)) {\n if (!isIterationProperty(propSchema)) {\n filteredProps[key] = propSchema;\n }\n }\n\n if (Object.keys(filteredProps).length === 0) {\n return { type: \"object\", properties: {} };\n }\n\n return { ...schema, properties: filteredProps } as DataPortSchema;\n}\n\n/**\n * Extract only iteration properties from a schema.\n */\nexport function extractIterationProperties(schema?: DataPortSchema): DataPortSchema | undefined {\n if (!schema || typeof schema === \"boolean\") return undefined;\n const props = (schema as Record<string, unknown>).properties;\n if (!props || typeof props === \"boolean\") return undefined;\n\n const iterProps: Record<string, DataPortSchema> = {};\n for (const [key, propSchema] of Object.entries(props as Record<string, DataPortSchema>)) {\n if (isIterationProperty(propSchema)) {\n iterProps[key] = propSchema;\n }\n }\n\n if (Object.keys(iterProps).length === 0) return undefined;\n\n return { type: \"object\", properties: iterProps };\n}\n\n/**\n * Remove iteration properties from a schema (alias for filterIterationProperties).\n */\nexport function removeIterationProperties(schema?: DataPortSchema): DataPortSchema | undefined {\n return filterIterationProperties(schema);\n}\n\n/**\n * Merge chained output properties into input schema; marks output properties with \"x-ui-iteration\": true.\n */\nexport function mergeChainedOutputToInput(\n inputSchema: DataPortSchema | undefined,\n outputSchema: DataPortSchema | undefined\n): DataPortSchema {\n const baseSchema = filterIterationProperties(inputSchema) ?? {\n type: \"object\" as const,\n properties: {},\n };\n\n if (!outputSchema || typeof outputSchema === \"boolean\") {\n return baseSchema;\n }\n const outProps = (outputSchema as Record<string, unknown>).properties;\n if (!outProps || typeof outProps === \"boolean\") {\n return baseSchema;\n }\n\n const baseProps =\n typeof baseSchema !== \"boolean\" &&\n (baseSchema as Record<string, unknown>).properties &&\n typeof (baseSchema as Record<string, unknown>).properties !== \"boolean\"\n ? ((baseSchema as Record<string, unknown>).properties as Record<string, DataPortSchema>)\n : {};\n\n const mergedProperties: Record<string, DataPortSchema> = { ...baseProps };\n\n for (const [key, propSchema] of Object.entries(outProps as Record<string, DataPortSchema>)) {\n if (typeof propSchema === \"object\" && propSchema !== null) {\n mergedProperties[key] = { ...propSchema, \"x-ui-iteration\": true } as DataPortSchema;\n }\n }\n\n return {\n type: \"object\",\n properties: mergedProperties,\n };\n}\n\n/**\n * Builds the iteration input schema from the inner schema and optional iteration input configuration.\n */\nexport function buildIterationInputSchema(\n innerSchema: DataPortSchema | undefined,\n config?: IterationInputConfig\n): DataPortSchema {\n if (!innerSchema || typeof innerSchema === \"boolean\") {\n return { type: \"object\", properties: {} };\n }\n\n const innerProps = (innerSchema as Record<string, unknown>).properties;\n if (!innerProps || typeof innerProps === \"boolean\") {\n return { type: \"object\", properties: {} };\n }\n\n const properties: Record<string, PropertySchema> = {};\n const propsRecord = innerProps as Record<string, PropertySchema>;\n\n for (const [key, propSchema] of Object.entries(propsRecord)) {\n if (typeof propSchema === \"boolean\") continue;\n\n if ((propSchema as Record<string, unknown>)[\"x-ui-iteration\"]) {\n continue;\n }\n\n const originalProps = propSchema as Record<string, unknown>;\n const metadata: Record<string, unknown> = {};\n for (const metaKey of Object.keys(originalProps)) {\n if (metaKey === \"title\" || metaKey === \"description\" || metaKey.startsWith(\"x-\")) {\n metadata[metaKey] = originalProps[metaKey];\n }\n }\n\n const baseSchema = extractBaseSchema(propSchema);\n const propConfig = config?.[key];\n const mode = propConfig?.mode ?? \"flexible\";\n const base = propConfig?.baseSchema ?? baseSchema;\n\n let wrappedSchema: PropertySchema;\n switch (mode) {\n case \"array\":\n wrappedSchema = createArraySchema(base);\n break;\n case \"scalar\":\n wrappedSchema = base;\n break;\n case \"flexible\":\n default:\n wrappedSchema = createFlexibleSchema(base);\n break;\n }\n\n // Apply preserved metadata onto the wrapped schema\n if (Object.keys(metadata).length > 0 && typeof wrappedSchema === \"object\") {\n properties[key] = { ...metadata, ...wrappedSchema } as PropertySchema;\n } else {\n properties[key] = wrappedSchema;\n }\n }\n\n return {\n type: \"object\",\n properties,\n };\n}\n\n/**\n * Find array-typed ports from an input schema.\n */\nexport function findArrayPorts(schema: DataPortSchema | undefined): string[] {\n if (!schema || typeof schema === \"boolean\") return [];\n const props = (schema as Record<string, unknown>).properties;\n if (!props || typeof props === \"boolean\") return [];\n\n const arrayPorts: string[] = [];\n const propsRecord = props as Record<string, DataPortSchema>;\n\n for (const [key, propSchema] of Object.entries(propsRecord)) {\n if (typeof propSchema === \"boolean\") continue;\n if ((propSchema as Record<string, unknown>).type === \"array\") {\n arrayPorts.push(key);\n }\n }\n\n return arrayPorts;\n}\n\n/**\n * Wrap a schema's properties in arrays for iteration output.\n */\nexport function wrapSchemaInArray(schema: DataPortSchema | undefined): DataPortSchema | undefined {\n if (!schema || typeof schema === \"boolean\") return schema;\n const props = (schema as Record<string, unknown>).properties;\n if (!props || typeof props === \"boolean\") return schema;\n\n const propsRecord = props as Record<string, DataPortSchema>;\n const wrappedProperties: Record<string, DataPortSchema> = {};\n\n for (const [key, propSchema] of Object.entries(propsRecord)) {\n wrappedProperties[key] = {\n type: \"array\",\n items: propSchema,\n } as DataPortSchema;\n }\n\n return {\n type: \"object\",\n properties: wrappedProperties,\n };\n}\n",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { BaseTabularStorage } from \"@workglow/storage\";\nimport { DataPortSchemaObject, type ServiceRegistry } from \"@workglow/util\";\nimport { TaskGraph } from \"../task-graph/TaskGraph\";\nimport { createGraphFromGraphJSON } from \"../task/TaskJSON\";\nimport { TaskGraphRepository } from \"./TaskGraphRepository\";\n\nexport const TaskGraphSchema = {\n type: \"object\",\n properties: {\n key: { type: \"string\" },\n value: { type: \"string\" },\n },\n additionalProperties: false,\n} satisfies DataPortSchemaObject;\n\nexport const TaskGraphPrimaryKeyNames = [\"key\"] as const;\n\n/**\n * Options for the TaskGraphRepository\n */\nexport type TaskGraphRepositoryStorage = BaseTabularStorage<\n typeof TaskGraphSchema,\n typeof TaskGraphPrimaryKeyNames\n>;\ntype TaskGraphRepositoryOptions = {\n tabularRepository: TaskGraphRepositoryStorage;\n registry?: ServiceRegistry;\n};\n\n/**\n * Repository class for managing task graphs persistence and retrieval.\n * Provides functionality to save, load, and manipulate task graphs with their associated tasks and data flows.\n */\nexport class TaskGraphTabularRepository extends TaskGraphRepository {\n /**\n * The type of the repository\n */\n public type = \"TaskGraphTabularRepository\";\n\n /**\n * The tabular repository for the task graphs\n */\n tabularRepository: TaskGraphRepositoryStorage;\n\n /**\n * Optional service registry for DI-based task constructor lookups\n */\n readonly registry: ServiceRegistry | undefined;\n\n /**\n * Constructor for the TaskGraphRepository\n * @param options The options for the repository\n */\n constructor({ tabularRepository, registry }: TaskGraphRepositoryOptions) {\n super();\n this.tabularRepository = tabularRepository;\n this.registry = registry;\n }\n\n /**\n * Sets up the database for the repository.\n * Must be called before using any other methods.\n */\n async setupDatabase(): Promise<void> {\n await this.tabularRepository.setupDatabase?.();\n }\n\n /**\n * Saves a task graph to persistent storage\n * @param key The unique identifier for the task graph\n * @param output The task graph to save\n * @emits graph_saved when the operation completes\n */\n async saveTaskGraph(key: string, output: TaskGraph): Promise<void> {\n const value = JSON.stringify(output.toJSON());\n await this.tabularRepository.put({ key, value });\n this.emit(\"graph_saved\", key);\n }\n\n /**\n * Retrieves a task graph from persistent storage\n * @param key The unique identifier of the task graph to retrieve\n * @returns The retrieved task graph, or undefined if not found\n * @emits graph_retrieved when the operation completes successfully\n */\n async getTaskGraph(key: string): Promise<TaskGraph | undefined> {\n const result = await this.tabularRepository.get({ key });\n const value = result?.value;\n if (!value) {\n return undefined;\n }\n const jsonObj = JSON.parse(value);\n const graph = createGraphFromGraphJSON(jsonObj, this.registry);\n\n this.emit(\"graph_retrieved\", key);\n return graph;\n }\n\n /**\n * Clears all task graphs from the repository\n * @emits graph_cleared when the operation completes\n */\n async clear(): Promise<void> {\n await this.tabularRepository.deleteAll();\n this.emit(\"graph_cleared\");\n }\n\n /**\n * Returns the number of task graphs stored in the repository\n * @returns The count of stored task graphs\n */\n async size(): Promise<number> {\n return await this.tabularRepository.size();\n }\n}\n",
|
|
43
43
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { type BaseTabularStorage } from \"@workglow/storage\";\nimport { compress, DataPortSchemaObject, decompress, makeFingerprint } from \"@workglow/util\";\nimport { TaskInput, TaskOutput } from \"../task/TaskTypes\";\nimport { TaskOutputRepository } from \"./TaskOutputRepository\";\n\nexport type TaskOutputPrimaryKey = {\n key: string;\n taskType: string;\n};\n\nexport const TaskOutputSchema = {\n type: \"object\",\n properties: {\n key: { type: \"string\" },\n taskType: { type: \"string\" },\n value: { type: \"string\", contentEncoding: \"blob\" },\n createdAt: { type: \"string\", format: \"date-time\" },\n },\n additionalProperties: false,\n} satisfies DataPortSchemaObject;\n\nexport const TaskOutputPrimaryKeyNames = [\"key\", \"taskType\"] as const;\n\nexport type TaskOutputRepositoryStorage = BaseTabularStorage<\n typeof TaskOutputSchema,\n typeof TaskOutputPrimaryKeyNames\n>;\n\nexport type TaskOutputRepositoryOptions = {\n tabularRepository: TaskOutputRepositoryStorage;\n outputCompression?: boolean;\n};\n\n/**\n * Abstract class for managing task outputs in a repository\n * Provides methods for saving, retrieving, and clearing task outputs\n */\nexport class TaskOutputTabularRepository extends TaskOutputRepository {\n /**\n * The tabular repository for the task outputs\n */\n tabularRepository: TaskOutputRepositoryStorage;\n\n /**\n * Constructor for the TaskOutputTabularRepository\n * @param options The options for the repository\n */\n constructor({ tabularRepository, outputCompression = true }: TaskOutputRepositoryOptions) {\n super({ outputCompression });\n this.tabularRepository = tabularRepository;\n this.outputCompression = outputCompression;\n }\n\n /**\n * Sets up the database for the repository.\n * Must be called before using any other methods.\n */\n async setupDatabase(): Promise<void> {\n await this.tabularRepository.setupDatabase?.();\n }\n\n public async keyFromInputs(inputs: TaskInput): Promise<string> {\n return await makeFingerprint(inputs);\n }\n\n /**\n * Saves a task output to the repository\n * @param taskType The type of task to save the output for\n * @param inputs The input parameters for the task\n * @param output The task output to save\n */\n async saveOutput(\n taskType: string,\n inputs: TaskInput,\n output: TaskOutput,\n createdAt = new Date() // for testing purposes\n ): Promise<void> {\n const key = await this.keyFromInputs(inputs);\n const value = JSON.stringify(output);\n if (this.outputCompression) {\n const compressedValue = await compress(value);\n await this.tabularRepository.put({\n taskType,\n key,\n // contentEncoding: \"blob\" allows Uint8Array despite schema type being \"string\"\n value: compressedValue as unknown as string,\n createdAt: createdAt.toISOString(),\n });\n } else {\n const valueBuffer = Buffer.from(value);\n await this.tabularRepository.put({\n taskType,\n key,\n // contentEncoding: \"blob\" allows Buffer/Uint8Array despite schema type being \"string\"\n value: valueBuffer as unknown as string,\n createdAt: createdAt.toISOString(),\n });\n }\n this.emit(\"output_saved\", taskType);\n }\n\n /**\n * Retrieves a task output from the repository\n * @param taskType The type of task to retrieve the output for\n * @param inputs The input parameters for the task\n * @returns The retrieved task output, or undefined if not found\n */\n async getOutput(taskType: string, inputs: TaskInput): Promise<TaskOutput | undefined> {\n const key = await this.keyFromInputs(inputs);\n const output = await this.tabularRepository.get({ key, taskType });\n this.emit(\"output_retrieved\", taskType);\n if (output?.value) {\n if (this.outputCompression) {\n // Coerce JSON-serialized binary (from filesystem JSON store) back to Uint8Array\n const raw: unknown = output.value as unknown;\n const bytes: Uint8Array =\n raw instanceof Uint8Array\n ? raw\n : Array.isArray(raw)\n ? new Uint8Array(raw as number[])\n : raw && typeof raw === \"object\"\n ? new Uint8Array(\n Object.keys(raw as Record<string, number>)\n .filter((k) => /^\\d+$/.test(k))\n .sort((a, b) => Number(a) - Number(b))\n .map((k) => (raw as Record<string, number>)[k])\n )\n : new Uint8Array();\n const decompressedValue = await decompress(bytes);\n const value = JSON.parse(decompressedValue) as TaskOutput;\n return value as TaskOutput;\n } else {\n const stringValue = output.value.toString();\n const value = JSON.parse(stringValue) as TaskOutput;\n return value as TaskOutput;\n }\n } else {\n return undefined;\n }\n }\n\n /**\n * Clears all task outputs from the repository\n * @emits output_cleared when the operation completes\n */\n async clear(): Promise<void> {\n await this.tabularRepository.deleteAll();\n this.emit(\"output_cleared\");\n }\n\n /**\n * Returns the number of task outputs stored in the repository\n * @returns The count of stored task outputs\n */\n async size(): Promise<number> {\n return await this.tabularRepository.size();\n }\n\n /**\n * Clear all task outputs from the repository that are older than the given date\n * @param olderThanInMs The time in milliseconds to clear task outputs older than\n */\n async clearOlderThan(olderThanInMs: number): Promise<void> {\n const date = new Date(Date.now() - olderThanInMs).toISOString();\n await this.tabularRepository.deleteSearch({ createdAt: { value: date, operator: \"<\" } });\n this.emit(\"output_pruned\");\n }\n}\n"
|
|
44
44
|
],
|
|
45
|
-
"mappings": "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",
|
|
46
|
-
"debugId": "
|
|
45
|
+
"mappings": "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",
|
|
46
|
+
"debugId": "31149EAB579F695264756E2164756E21",
|
|
47
47
|
"names": []
|
|
48
48
|
}
|