@flomatai/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/agent.d.ts +92 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +137 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/cli-utils.d.ts +41 -0
  6. package/dist/cli-utils.d.ts.map +1 -0
  7. package/dist/cli-utils.js +64 -0
  8. package/dist/cli-utils.js.map +1 -0
  9. package/dist/errors.d.ts +52 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +105 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/index.d.ts +29 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +35 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/llm-provider.d.ts +29 -0
  18. package/dist/llm-provider.d.ts.map +1 -0
  19. package/dist/llm-provider.js +44 -0
  20. package/dist/llm-provider.js.map +1 -0
  21. package/dist/logger.d.ts +32 -0
  22. package/dist/logger.d.ts.map +1 -0
  23. package/dist/logger.js +75 -0
  24. package/dist/logger.js.map +1 -0
  25. package/dist/mock-llm.d.ts +70 -0
  26. package/dist/mock-llm.d.ts.map +1 -0
  27. package/dist/mock-llm.js +385 -0
  28. package/dist/mock-llm.js.map +1 -0
  29. package/dist/orchestrator-helpers.d.ts +20 -0
  30. package/dist/orchestrator-helpers.d.ts.map +1 -0
  31. package/dist/orchestrator-helpers.js +38 -0
  32. package/dist/orchestrator-helpers.js.map +1 -0
  33. package/dist/orchestrator.d.ts +124 -0
  34. package/dist/orchestrator.d.ts.map +1 -0
  35. package/dist/orchestrator.js +349 -0
  36. package/dist/orchestrator.js.map +1 -0
  37. package/dist/pipeline-registry.d.ts +120 -0
  38. package/dist/pipeline-registry.d.ts.map +1 -0
  39. package/dist/pipeline-registry.js +171 -0
  40. package/dist/pipeline-registry.js.map +1 -0
  41. package/dist/pipeline.d.ts +122 -0
  42. package/dist/pipeline.d.ts.map +1 -0
  43. package/dist/pipeline.js +152 -0
  44. package/dist/pipeline.js.map +1 -0
  45. package/dist/skill.d.ts +112 -0
  46. package/dist/skill.d.ts.map +1 -0
  47. package/dist/skill.js +12 -0
  48. package/dist/skill.js.map +1 -0
  49. package/dist/skills/io-skill.d.ts +49 -0
  50. package/dist/skills/io-skill.d.ts.map +1 -0
  51. package/dist/skills/io-skill.js +103 -0
  52. package/dist/skills/io-skill.js.map +1 -0
  53. package/dist/skills/llm-skill.d.ts +64 -0
  54. package/dist/skills/llm-skill.d.ts.map +1 -0
  55. package/dist/skills/llm-skill.js +112 -0
  56. package/dist/skills/llm-skill.js.map +1 -0
  57. package/dist/skills/transform-skill.d.ts +27 -0
  58. package/dist/skills/transform-skill.d.ts.map +1 -0
  59. package/dist/skills/transform-skill.js +32 -0
  60. package/dist/skills/transform-skill.js.map +1 -0
  61. package/dist/state/file-store.d.ts +25 -0
  62. package/dist/state/file-store.d.ts.map +1 -0
  63. package/dist/state/file-store.js +92 -0
  64. package/dist/state/file-store.js.map +1 -0
  65. package/dist/state/memory-store.d.ts +24 -0
  66. package/dist/state/memory-store.d.ts.map +1 -0
  67. package/dist/state/memory-store.js +65 -0
  68. package/dist/state/memory-store.js.map +1 -0
  69. package/dist/state/types.d.ts +40 -0
  70. package/dist/state/types.d.ts.map +1 -0
  71. package/dist/state/types.js +8 -0
  72. package/dist/state/types.js.map +1 -0
  73. package/dist/strategies/custom.d.ts +12 -0
  74. package/dist/strategies/custom.d.ts.map +1 -0
  75. package/dist/strategies/custom.js +14 -0
  76. package/dist/strategies/custom.js.map +1 -0
  77. package/dist/strategies/plan-and-execute.d.ts +27 -0
  78. package/dist/strategies/plan-and-execute.d.ts.map +1 -0
  79. package/dist/strategies/plan-and-execute.js +195 -0
  80. package/dist/strategies/plan-and-execute.js.map +1 -0
  81. package/dist/strategies/react.d.ts +27 -0
  82. package/dist/strategies/react.d.ts.map +1 -0
  83. package/dist/strategies/react.js +172 -0
  84. package/dist/strategies/react.js.map +1 -0
  85. package/dist/strategies/router.d.ts +11 -0
  86. package/dist/strategies/router.d.ts.map +1 -0
  87. package/dist/strategies/router.js +70 -0
  88. package/dist/strategies/router.js.map +1 -0
  89. package/dist/strategies/sequential.d.ts +12 -0
  90. package/dist/strategies/sequential.d.ts.map +1 -0
  91. package/dist/strategies/sequential.js +39 -0
  92. package/dist/strategies/sequential.js.map +1 -0
  93. package/dist/strategies/types.d.ts +62 -0
  94. package/dist/strategies/types.d.ts.map +1 -0
  95. package/dist/strategies/types.js +5 -0
  96. package/dist/strategies/types.js.map +1 -0
  97. package/dist/types.d.ts +83 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +5 -0
  100. package/dist/types.js.map +1 -0
  101. package/package.json +28 -0
  102. package/src/agent.ts +243 -0
  103. package/src/cli-utils.ts +73 -0
  104. package/src/errors.ts +146 -0
  105. package/src/index.ts +124 -0
  106. package/src/llm-provider.ts +88 -0
  107. package/src/logger.ts +97 -0
  108. package/src/mock-llm.ts +433 -0
  109. package/src/orchestrator-helpers.ts +40 -0
  110. package/src/orchestrator.ts +522 -0
  111. package/src/pipeline-registry.ts +253 -0
  112. package/src/pipeline.ts +265 -0
  113. package/src/skill.ts +127 -0
  114. package/src/skills/io-skill.ts +133 -0
  115. package/src/skills/llm-skill.ts +207 -0
  116. package/src/skills/transform-skill.ts +61 -0
  117. package/src/state/file-store.ts +119 -0
  118. package/src/state/memory-store.ts +82 -0
  119. package/src/state/types.ts +53 -0
  120. package/src/strategies/custom.ts +24 -0
  121. package/src/strategies/plan-and-execute.ts +268 -0
  122. package/src/strategies/react.ts +239 -0
  123. package/src/strategies/router.ts +101 -0
  124. package/src/strategies/sequential.ts +55 -0
  125. package/src/strategies/types.ts +97 -0
  126. package/src/types.ts +102 -0
  127. package/tsconfig.json +9 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * orchestrator-helpers — convenience factories for common Orchestrator configuration.
3
+ *
4
+ * Extracted from the repeated boilerplate found in every example's orchestrator.ts.
5
+ * Import these instead of writing the hooks object by hand.
6
+ */
7
+ import type { OrchestratorHooks } from './orchestrator.js';
8
+ /**
9
+ * Returns the standard console-logging hooks used by all flomatai examples.
10
+ *
11
+ * Output format:
12
+ * ▶ <label> [<runId>]
13
+ * → step-name ... done (42ms)
14
+ * ✓ completed in 1234ms (567 tokens)
15
+ *
16
+ * @param label Short description shown in the beforePipeline line (e.g. 'verlivo-planning').
17
+ * Defaults to 'Pipeline'.
18
+ */
19
+ export declare function createConsoleHooks(label?: string): OrchestratorHooks;
20
+ //# sourceMappingURL=orchestrator-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-helpers.d.ts","sourceRoot":"","sources":["../src/orchestrator-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAmBpE"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * orchestrator-helpers — convenience factories for common Orchestrator configuration.
3
+ *
4
+ * Extracted from the repeated boilerplate found in every example's orchestrator.ts.
5
+ * Import these instead of writing the hooks object by hand.
6
+ */
7
+ /**
8
+ * Returns the standard console-logging hooks used by all flomatai examples.
9
+ *
10
+ * Output format:
11
+ * ▶ <label> [<runId>]
12
+ * → step-name ... done (42ms)
13
+ * ✓ completed in 1234ms (567 tokens)
14
+ *
15
+ * @param label Short description shown in the beforePipeline line (e.g. 'verlivo-planning').
16
+ * Defaults to 'Pipeline'.
17
+ */
18
+ export function createConsoleHooks(label) {
19
+ return {
20
+ beforePipeline: (_pipeline, _input, runId) => {
21
+ console.log(`\n▶ ${label ?? 'Pipeline'} [${runId}]`);
22
+ },
23
+ afterPipeline: (_pipeline, run) => {
24
+ const icon = run.status === 'completed' ? '✓' : '✗';
25
+ console.log(`\n${icon} ${run.status} in ${run.durationMs}ms (${run.tokensUsed} tokens)`);
26
+ },
27
+ beforeStep: (step) => {
28
+ process.stdout.write(` → ${step.name} ... `);
29
+ },
30
+ afterStep: (_step, record) => {
31
+ console.log(`done (${record.durationMs}ms)`);
32
+ },
33
+ onError: (step, error) => {
34
+ console.error(`\n ✗ ${step?.name ?? 'pipeline'}: ${error.message}`);
35
+ },
36
+ };
37
+ }
38
+ //# sourceMappingURL=orchestrator-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-helpers.js","sourceRoot":"","sources":["../src/orchestrator-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO;QACL,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,UAAU,KAAK,KAAK,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,aAAa,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,UAAU,OAAO,GAAG,CAAC,UAAU,UAAU,CAAC,CAAC;QAC3F,CAAC;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,IAAI,IAAI,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Orchestrator — the runtime engine that executes pipelines.
3
+ *
4
+ * Responsibilities:
5
+ * - Validate pipeline input/output
6
+ * - Execute steps in order, passing outputs to inputs
7
+ * - Handle map/filter/reduce/parallel/branch steps
8
+ * - Retry failed steps with exponential backoff
9
+ * - Save checkpoints for resume capability
10
+ * - Record full run history
11
+ * - Fire lifecycle hooks
12
+ * - Manage LLM registry and state store
13
+ */
14
+ import type { LLMRegistry } from './llm-provider.js';
15
+ import type { MCPClientLike } from './skill.js';
16
+ import type { StateStore } from './state/types.js';
17
+ import type { Logger } from './logger.js';
18
+ import type { BuiltPipeline, PipelineStep } from './pipeline.js';
19
+ import type { PipelineRun, StepRecord } from './types.js';
20
+ export interface OrchestratorConfig {
21
+ /**
22
+ * LLM registry. 'default' key is used when no specific LLM is requested.
23
+ * @example { default: anthropic({ model: 'claude-3-5-sonnet' }) }
24
+ */
25
+ llm: LLMRegistry;
26
+ /**
27
+ * MCP client registry. Named MCP clients that skills and agents can access
28
+ * via SkillContext.getMCPClient(key).
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { MCPClient } from '@flomatai/mcp-client';
33
+ * {
34
+ * mcp: {
35
+ * filesystem: new MCPClient({ command: 'npx', args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'] })
36
+ * }
37
+ * }
38
+ * ```
39
+ */
40
+ mcp?: Record<string, MCPClientLike>;
41
+ /**
42
+ * State store for persistence, caching, and run history.
43
+ * @default MemoryStore
44
+ */
45
+ state?: StateStore;
46
+ /**
47
+ * Root logger. Defaults to console logger.
48
+ */
49
+ logger?: Logger;
50
+ /**
51
+ * Lifecycle hooks.
52
+ */
53
+ hooks?: OrchestratorHooks;
54
+ /**
55
+ * Global configuration passed to all skill/agent contexts.
56
+ */
57
+ config?: Record<string, unknown>;
58
+ /**
59
+ * Maximum sub-agent depth for hierarchical agents.
60
+ * @default 5
61
+ */
62
+ maxAgentDepth?: number;
63
+ }
64
+ export interface OrchestratorHooks {
65
+ /** Called before the pipeline starts. */
66
+ beforePipeline?: (pipeline: BuiltPipeline, input: unknown, runId: string) => void | Promise<void>;
67
+ /** Called after the pipeline completes (success or failure). */
68
+ afterPipeline?: (pipeline: BuiltPipeline, run: PipelineRun) => void | Promise<void>;
69
+ /** Called before each step executes. */
70
+ beforeStep?: (step: PipelineStep, input: unknown, runId: string) => void | Promise<void>;
71
+ /** Called after each step completes (success or failure). */
72
+ afterStep?: (step: PipelineStep, record: StepRecord) => void | Promise<void>;
73
+ /** Called on any error. */
74
+ onError?: (step: PipelineStep | null, error: Error, runId: string) => void | Promise<void>;
75
+ }
76
+ export interface RunOptions {
77
+ /** External run ID (auto-generated if not provided). */
78
+ runId?: string;
79
+ /** Override the LLM for this run. */
80
+ llm?: string;
81
+ /** Abort controller for cancellation. */
82
+ abortController?: AbortController;
83
+ /**
84
+ * Resume from a previous run's checkpoints.
85
+ * Provide the runId of the run to resume.
86
+ */
87
+ resumeFromRunId?: string;
88
+ }
89
+ export declare class Orchestrator {
90
+ private readonly llmRegistry;
91
+ private readonly mcpRegistry;
92
+ private readonly state;
93
+ private readonly log;
94
+ private readonly hooks;
95
+ private readonly globalConfig;
96
+ private readonly maxAgentDepth;
97
+ private initialized;
98
+ constructor(config: OrchestratorConfig);
99
+ private ensureInit;
100
+ /**
101
+ * Execute a pipeline with the given input.
102
+ */
103
+ run<TOutput = unknown>(pipeline: BuiltPipeline, input: unknown, options?: RunOptions): Promise<{
104
+ output: TOutput;
105
+ run: PipelineRun;
106
+ }>;
107
+ /**
108
+ * Execute a single pipeline step.
109
+ */
110
+ private executeStep;
111
+ /**
112
+ * Run a map step: execute sub-pipeline for each item.
113
+ */
114
+ private runMap;
115
+ /**
116
+ * Resolve a source field path from the step input.
117
+ */
118
+ private resolveSource;
119
+ /** Get the state store (for external inspection). */
120
+ get stateStore(): StateStore;
121
+ get llm(): LLMRegistry;
122
+ get mcp(): Record<string, MCPClientLike>;
123
+ }
124
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Orchestrator — the runtime engine that executes pipelines.
3
+ *
4
+ * Responsibilities:
5
+ * - Validate pipeline input/output
6
+ * - Execute steps in order, passing outputs to inputs
7
+ * - Handle map/filter/reduce/parallel/branch steps
8
+ * - Retry failed steps with exponential backoff
9
+ * - Save checkpoints for resume capability
10
+ * - Record full run history
11
+ * - Fire lifecycle hooks
12
+ * - Manage LLM registry and state store
13
+ */
14
+ import { randomUUID } from 'crypto';
15
+ import { resolveLLM } from './llm-provider.js';
16
+ import { MemoryStore } from './state/memory-store.js';
17
+ import { logger as defaultLogger } from './logger.js';
18
+ import { PipelineError, StepMaxRetriesError } from './errors.js';
19
+ // ── Orchestrator ──────────────────────────────────────────────────────────────
20
+ export class Orchestrator {
21
+ llmRegistry;
22
+ mcpRegistry;
23
+ state;
24
+ log;
25
+ hooks;
26
+ globalConfig;
27
+ maxAgentDepth;
28
+ initialized = false;
29
+ constructor(config) {
30
+ this.llmRegistry = config.llm;
31
+ this.mcpRegistry = config.mcp ?? {};
32
+ this.state = config.state ?? new MemoryStore();
33
+ this.log = config.logger ?? defaultLogger;
34
+ this.hooks = config.hooks ?? {};
35
+ this.globalConfig = config.config ?? {};
36
+ this.maxAgentDepth = config.maxAgentDepth ?? 5;
37
+ }
38
+ async ensureInit() {
39
+ if (!this.initialized) {
40
+ await this.state.init();
41
+ this.initialized = true;
42
+ }
43
+ }
44
+ /**
45
+ * Execute a pipeline with the given input.
46
+ */
47
+ async run(pipeline, input, options = {}) {
48
+ await this.ensureInit();
49
+ const runId = options.runId ?? randomUUID();
50
+ const abortController = options.abortController ?? new AbortController();
51
+ const events = [];
52
+ const emit = (event, data) => {
53
+ events.push({ event, data });
54
+ this.log.debug(`event:${event}`, data);
55
+ // Accumulate token usage from LLM skill responses
56
+ if (event === 'llm:response') {
57
+ const d = data;
58
+ if (typeof d.tokens === 'number')
59
+ totalTokens += d.tokens;
60
+ }
61
+ };
62
+ const run = {
63
+ id: runId,
64
+ pipelineName: pipeline.name,
65
+ status: 'running',
66
+ input,
67
+ startedAt: new Date().toISOString(),
68
+ tokensUsed: 0,
69
+ steps: [],
70
+ };
71
+ await this.state.saveRun(run);
72
+ await this.hooks.beforePipeline?.(pipeline, input, runId);
73
+ this.log.info(`Pipeline "${pipeline.name}" starting [${runId}]`);
74
+ // Validate pipeline input
75
+ if (pipeline.inputSchema) {
76
+ const result = pipeline.inputSchema.safeParse(input);
77
+ if (!result.success) {
78
+ throw new PipelineError(pipeline.name, `Input validation failed: ${result.error.message}`);
79
+ }
80
+ }
81
+ // Build skill context factory
82
+ const mcpRegistry = this.mcpRegistry;
83
+ const makeSkillCtx = () => ({
84
+ llm: resolveLLM(this.llmRegistry, options.llm ?? 'default'),
85
+ logger: this.log,
86
+ state: this.state,
87
+ emit,
88
+ config: this.globalConfig,
89
+ abortSignal: abortController.signal,
90
+ runId,
91
+ getLLM: (key) => resolveLLM(this.llmRegistry, key),
92
+ getMCPClient: Object.keys(mcpRegistry).length > 0
93
+ ? (key) => {
94
+ const client = mcpRegistry[key];
95
+ if (!client) {
96
+ throw new Error(`MCP client "${key}" not found in registry. ` +
97
+ `Available: ${Object.keys(mcpRegistry).join(', ')}`);
98
+ }
99
+ return client;
100
+ }
101
+ : undefined,
102
+ });
103
+ // Execute steps
104
+ const stepOutputs = {};
105
+ let previousOutput = input;
106
+ let totalTokens = 0; // NOTE: also incremented by emit('llm:response') above
107
+ try {
108
+ for (const step of pipeline.steps) {
109
+ if (abortController.signal.aborted) {
110
+ throw new PipelineError(pipeline.name, 'Pipeline was cancelled', step.name);
111
+ }
112
+ // Resolve step input
113
+ const stepInputCtx = {
114
+ pipelineInput: input,
115
+ stepOutputs,
116
+ previousOutput,
117
+ };
118
+ // Check skip condition
119
+ if (step.skipIf?.(stepInputCtx)) {
120
+ this.log.debug(`Step "${step.name}" skipped`);
121
+ continue;
122
+ }
123
+ const stepInput = step.inputMapper
124
+ ? step.inputMapper(stepInputCtx)
125
+ : previousOutput;
126
+ await this.hooks.beforeStep?.(step, stepInput, runId);
127
+ const stepRecord = {
128
+ name: step.name,
129
+ status: 'running',
130
+ input: stepInput,
131
+ startedAt: new Date().toISOString(),
132
+ tokensUsed: 0,
133
+ attempt: 1,
134
+ };
135
+ run.steps.push(stepRecord);
136
+ // Check for checkpoint (resume)
137
+ if (options.resumeFromRunId && pipeline.checkpointing) {
138
+ const checkpoint = await this.state.getCheckpoint(options.resumeFromRunId, step.name);
139
+ if (checkpoint !== null) {
140
+ this.log.info(`Step "${step.name}" resumed from checkpoint`);
141
+ stepOutputs[step.name] = checkpoint;
142
+ previousOutput = checkpoint;
143
+ stepRecord.status = 'completed';
144
+ stepRecord.output = checkpoint;
145
+ continue;
146
+ }
147
+ }
148
+ // Execute step
149
+ const t0 = Date.now();
150
+ let stepOutput;
151
+ const maxAttempts = (step.skill?.meta.retries ?? 0) + 1;
152
+ let lastError = null;
153
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
154
+ stepRecord.attempt = attempt;
155
+ try {
156
+ stepOutput = await this.executeStep(step, stepInput, makeSkillCtx, runId, abortController.signal, emit);
157
+ lastError = null;
158
+ break;
159
+ }
160
+ catch (err) {
161
+ lastError = err instanceof Error ? err : new Error(String(err));
162
+ if (attempt < maxAttempts) {
163
+ const delay = Math.min(500 * Math.pow(2, attempt - 1), 10_000);
164
+ this.log.warn(`Step "${step.name}" attempt ${attempt}/${maxAttempts} failed: ${lastError.message}. Retrying in ${delay}ms`);
165
+ await this.hooks.onError?.(step, lastError, runId);
166
+ await new Promise((r) => setTimeout(r, delay));
167
+ }
168
+ }
169
+ }
170
+ if (lastError) {
171
+ throw new StepMaxRetriesError(pipeline.name, step.name, maxAttempts, lastError);
172
+ }
173
+ const durationMs = Date.now() - t0;
174
+ stepRecord.status = 'completed';
175
+ stepRecord.output = stepOutput;
176
+ stepRecord.completedAt = new Date().toISOString();
177
+ stepRecord.durationMs = durationMs;
178
+ // Save checkpoint if enabled
179
+ if (pipeline.checkpointing) {
180
+ await this.state.saveCheckpoint(runId, step.name, stepOutput);
181
+ }
182
+ stepOutputs[step.name] = stepOutput;
183
+ previousOutput = stepOutput;
184
+ await this.state.saveRun(run);
185
+ await this.hooks.afterStep?.(step, stepRecord);
186
+ this.log.debug(`Step "${step.name}" completed in ${durationMs}ms`);
187
+ }
188
+ // Validate pipeline output
189
+ let finalOutput = previousOutput;
190
+ if (pipeline.outputSchema) {
191
+ const result = pipeline.outputSchema.safeParse(finalOutput);
192
+ if (!result.success) {
193
+ this.log.warn(`Pipeline "${pipeline.name}" output failed schema validation`, result.error.issues);
194
+ }
195
+ }
196
+ run.status = 'completed';
197
+ run.output = finalOutput;
198
+ run.completedAt = new Date().toISOString();
199
+ run.durationMs = Date.now() - new Date(run.startedAt).getTime();
200
+ run.tokensUsed = totalTokens;
201
+ await this.state.saveRun(run);
202
+ if (pipeline.checkpointing)
203
+ await this.state.clearCheckpoints(runId);
204
+ await this.hooks.afterPipeline?.(pipeline, run);
205
+ this.log.info(`Pipeline "${pipeline.name}" completed in ${run.durationMs}ms [${runId}]`);
206
+ return { output: finalOutput, run };
207
+ }
208
+ catch (err) {
209
+ const error = err instanceof Error ? err : new Error(String(err));
210
+ run.status = 'failed';
211
+ run.error = error.message;
212
+ run.completedAt = new Date().toISOString();
213
+ run.durationMs = Date.now() - new Date(run.startedAt).getTime();
214
+ await this.state.saveRun(run);
215
+ await this.hooks.onError?.(null, error, runId);
216
+ await this.hooks.afterPipeline?.(pipeline, run);
217
+ this.log.error(`Pipeline "${pipeline.name}" failed: ${error.message}`);
218
+ throw error;
219
+ }
220
+ }
221
+ /**
222
+ * Execute a single pipeline step.
223
+ */
224
+ async executeStep(step, input, makeSkillCtx, runId, abortSignal, emit) {
225
+ switch (step.kind) {
226
+ case 'skill': {
227
+ if (!step.skill)
228
+ throw new PipelineError('?', `Step "${step.name}" has no skill`);
229
+ return step.skill.execute(input, makeSkillCtx());
230
+ }
231
+ case 'map': {
232
+ const source = this.resolveSource(step.sourceField, input);
233
+ if (!Array.isArray(source)) {
234
+ throw new PipelineError('?', `Step "${step.name}" map source "${step.sourceField}" is not an array`);
235
+ }
236
+ return this.runMap(step, source, makeSkillCtx, runId, abortSignal, emit);
237
+ }
238
+ case 'filter': {
239
+ const source = this.resolveSource(step.sourceField, input);
240
+ if (!Array.isArray(source))
241
+ return [];
242
+ return source.filter((item, i) => step.predicate?.(item, i) ?? true);
243
+ }
244
+ case 'reduce': {
245
+ const source = this.resolveSource(step.sourceField, input);
246
+ if (!Array.isArray(source))
247
+ return step.initialValue;
248
+ return source.reduce((acc, item, i) => step.reducer?.(acc, item, i) ?? acc, step.initialValue);
249
+ }
250
+ case 'parallel': {
251
+ if (!step.branches)
252
+ return [];
253
+ const results = await Promise.all(step.branches.map((branch) => this.run(branch, input, { runId: `${runId}:${branch.name}`, abortController: { signal: abortSignal } })));
254
+ return results.map((r) => r.output);
255
+ }
256
+ case 'branch': {
257
+ // inputMapper stores the condition function
258
+ const branchKey = step.inputMapper(input);
259
+ const selectedBranch = step.branches?.find((b) => b.name === branchKey);
260
+ if (!selectedBranch) {
261
+ this.log.warn(`Branch "${step.name}": no branch matched key "${branchKey}"`);
262
+ return input;
263
+ }
264
+ const result = await this.run(selectedBranch, input, {
265
+ runId: `${runId}:${selectedBranch.name}`,
266
+ abortController: { signal: abortSignal },
267
+ });
268
+ return result.output;
269
+ }
270
+ default:
271
+ throw new PipelineError('?', `Unknown step kind: "${step.kind}"`);
272
+ }
273
+ }
274
+ /**
275
+ * Run a map step: execute sub-pipeline for each item.
276
+ */
277
+ async runMap(step, items, makeSkillCtx, runId, abortSignal, emit) {
278
+ const concurrency = step.concurrency ?? 1;
279
+ const results = new Array(items.length);
280
+ // Process in batches of `concurrency`
281
+ for (let i = 0; i < items.length; i += concurrency) {
282
+ const batch = items.slice(i, i + concurrency);
283
+ const batchResults = await Promise.all(batch.map(async (item, batchIdx) => {
284
+ const idx = i + batchIdx;
285
+ const maxAttempts = (step.maxItemRetries ?? 0) + 1;
286
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
287
+ try {
288
+ const result = await this.run(step.subPipeline, item, {
289
+ runId: `${runId}:${step.name}[${idx}]`,
290
+ abortController: { signal: abortSignal },
291
+ });
292
+ return { idx, output: result.output, error: null };
293
+ }
294
+ catch (err) {
295
+ const error = err instanceof Error ? err : new Error(String(err));
296
+ if (attempt < maxAttempts) {
297
+ const delay = Math.min(500 * Math.pow(2, attempt - 1), 5_000);
298
+ this.log.warn(`Map item ${idx} attempt ${attempt}/${maxAttempts} failed. Retrying in ${delay}ms`);
299
+ await new Promise((r) => setTimeout(r, delay));
300
+ }
301
+ else {
302
+ if (step.onItemError === 'skip') {
303
+ this.log.warn(`Map item ${idx} failed and was skipped: ${error.message}`);
304
+ return { idx, output: null, error };
305
+ }
306
+ throw error;
307
+ }
308
+ }
309
+ }
310
+ return { idx, output: null, error: null };
311
+ }));
312
+ for (const r of batchResults) {
313
+ results[r.idx] = r.output;
314
+ }
315
+ }
316
+ // Filter out nulls from skipped items
317
+ return step.onItemError === 'skip'
318
+ ? results.filter((r) => r !== null)
319
+ : results;
320
+ }
321
+ /**
322
+ * Resolve a source field path from the step input.
323
+ */
324
+ resolveSource(sourceField, input) {
325
+ if (sourceField === '*')
326
+ return input;
327
+ if (Array.isArray(input))
328
+ return input;
329
+ const parts = sourceField.split('.');
330
+ let current = input;
331
+ for (const part of parts) {
332
+ if (current === null || current === undefined)
333
+ return undefined;
334
+ current = current[part];
335
+ }
336
+ return current;
337
+ }
338
+ /** Get the state store (for external inspection). */
339
+ get stateStore() {
340
+ return this.state;
341
+ }
342
+ get llm() {
343
+ return this.llmRegistry;
344
+ }
345
+ get mcp() {
346
+ return this.mcpRegistry;
347
+ }
348
+ }
349
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}