groundswell 0.0.1

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 (120) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.claude/system_prompts/task-breakdown.md +100 -0
  3. package/PRPs/001-hierarchical-workflow-engine.md +2438 -0
  4. package/PRPs/PRDs/001-hierarchical-workflow-engine.md +543 -0
  5. package/PRPs/PRDs/002-agent-prompt.md +390 -0
  6. package/PRPs/PRDs/003-agent-prompt.md +943 -0
  7. package/PRPs/PRDs/004-agent-prompt.md +1136 -0
  8. package/PRPs/PRDs/tasks-001.json +492 -0
  9. package/PRPs/README.md +83 -0
  10. package/PRPs/templates/prp_base.md +222 -0
  11. package/README.md +218 -0
  12. package/docs/agent.md +422 -0
  13. package/docs/prompt.md +419 -0
  14. package/docs/workflow.md +600 -0
  15. package/examples/README.md +244 -0
  16. package/examples/examples/01-basic-workflow.ts +100 -0
  17. package/examples/examples/02-decorator-options.ts +217 -0
  18. package/examples/examples/03-parent-child.ts +241 -0
  19. package/examples/examples/04-observers-debugger.ts +340 -0
  20. package/examples/examples/05-error-handling.ts +387 -0
  21. package/examples/examples/06-concurrent-tasks.ts +352 -0
  22. package/examples/examples/07-agent-loops.ts +432 -0
  23. package/examples/examples/08-sdk-features.ts +667 -0
  24. package/examples/examples/09-reflection.ts +573 -0
  25. package/examples/examples/10-introspection.ts +550 -0
  26. package/examples/index.ts +143 -0
  27. package/examples/utils/helpers.ts +57 -0
  28. package/llms_full.txt +5890 -0
  29. package/package.json +63 -0
  30. package/plan/P1P2/PRP.md +527 -0
  31. package/plan/P1P2/research/LRU_CACHE_BEST_PRACTICES.md +1929 -0
  32. package/plan/P1P2/research/LRU_CACHE_CODE_PATTERNS.md +857 -0
  33. package/plan/P1P2/research/LRU_CACHE_INTEGRATION_GUIDE.md +738 -0
  34. package/plan/P1P2/research/LRU_CACHE_RESEARCH_INDEX.md +424 -0
  35. package/plan/P1P2/research/REFLECTION_INDEX.md +291 -0
  36. package/plan/P1P2/research/REFLECTION_RESEARCH_REPORT.md +1342 -0
  37. package/plan/P1P2/research/RESEARCH_SUMMARY.md +342 -0
  38. package/plan/P1P2/research/anthropic-sdk.md +174 -0
  39. package/plan/P1P2/research/async-local-storage.md +200 -0
  40. package/plan/P1P2/research/reflection-code-patterns.md +1205 -0
  41. package/plan/P1P2/research/reflection-decision-matrix.md +421 -0
  42. package/plan/P1P2/research/reflection-implementation-guide.md +1341 -0
  43. package/plan/P1P2/research/reflection-integration-guide.md +834 -0
  44. package/plan/P1P2/research/reflection-patterns.md +1468 -0
  45. package/plan/P1P2/research/reflection-quick-reference.md +558 -0
  46. package/plan/P1P2/research/zod-schema.md +152 -0
  47. package/plan/P3P4/PRP.md +1388 -0
  48. package/plan/P3P4/research/caching-lru.md +116 -0
  49. package/plan/P3P4/research/introspection-tools.md +177 -0
  50. package/plan/P3P4/research/reflection-patterns.md +117 -0
  51. package/plan/P4P5/PRP.md +1136 -0
  52. package/plan/P4P5/research/RESEARCH_SUMMARY.md +151 -0
  53. package/plan/architecture/external_deps.md +358 -0
  54. package/plan/architecture/system_context.md +242 -0
  55. package/plan/backlog.json +867 -0
  56. package/plan/research/INTROSPECTION_RESEARCH_SUMMARY.md +378 -0
  57. package/plan/research/README-INTROSPECTION.md +352 -0
  58. package/plan/research/agent-introspection-patterns.md +1085 -0
  59. package/plan/research/introspection-security-guide.md +928 -0
  60. package/plan/research/introspection-tool-examples.md +875 -0
  61. package/scripts/generate-llms-full.ts +206 -0
  62. package/src/__tests__/integration/agent-workflow.test.ts +256 -0
  63. package/src/__tests__/integration/tree-mirroring.test.ts +114 -0
  64. package/src/__tests__/unit/agent.test.ts +169 -0
  65. package/src/__tests__/unit/cache-key.test.ts +182 -0
  66. package/src/__tests__/unit/cache.test.ts +172 -0
  67. package/src/__tests__/unit/context.test.ts +138 -0
  68. package/src/__tests__/unit/decorators.test.ts +100 -0
  69. package/src/__tests__/unit/introspection-tools.test.ts +277 -0
  70. package/src/__tests__/unit/prompt.test.ts +135 -0
  71. package/src/__tests__/unit/reflection.test.ts +210 -0
  72. package/src/__tests__/unit/tree-debugger.test.ts +85 -0
  73. package/src/__tests__/unit/workflow.test.ts +81 -0
  74. package/src/cache/cache-key.ts +244 -0
  75. package/src/cache/cache.ts +236 -0
  76. package/src/cache/index.ts +8 -0
  77. package/src/core/agent.ts +573 -0
  78. package/src/core/context.ts +119 -0
  79. package/src/core/event-tree.ts +260 -0
  80. package/src/core/factory.ts +123 -0
  81. package/src/core/index.ts +17 -0
  82. package/src/core/logger.ts +87 -0
  83. package/src/core/mcp-handler.ts +184 -0
  84. package/src/core/prompt.ts +150 -0
  85. package/src/core/workflow-context.ts +349 -0
  86. package/src/core/workflow.ts +302 -0
  87. package/src/debugger/index.ts +1 -0
  88. package/src/debugger/tree-debugger.ts +210 -0
  89. package/src/decorators/index.ts +3 -0
  90. package/src/decorators/observed-state.ts +95 -0
  91. package/src/decorators/step.ts +139 -0
  92. package/src/decorators/task.ts +96 -0
  93. package/src/examples/index.ts +2 -0
  94. package/src/examples/tdd-orchestrator.ts +65 -0
  95. package/src/examples/test-cycle-workflow.ts +64 -0
  96. package/src/index.ts +140 -0
  97. package/src/reflection/index.ts +5 -0
  98. package/src/reflection/reflection.ts +407 -0
  99. package/src/tools/index.ts +36 -0
  100. package/src/tools/introspection.ts +464 -0
  101. package/src/types/agent.ts +90 -0
  102. package/src/types/decorators.ts +25 -0
  103. package/src/types/error-strategy.ts +13 -0
  104. package/src/types/error.ts +20 -0
  105. package/src/types/events.ts +74 -0
  106. package/src/types/index.ts +55 -0
  107. package/src/types/logging.ts +24 -0
  108. package/src/types/observer.ts +18 -0
  109. package/src/types/prompt.ts +40 -0
  110. package/src/types/reflection.ts +117 -0
  111. package/src/types/sdk-primitives.ts +128 -0
  112. package/src/types/snapshot.ts +14 -0
  113. package/src/types/workflow-context.ts +163 -0
  114. package/src/types/workflow.ts +37 -0
  115. package/src/utils/id.ts +11 -0
  116. package/src/utils/index.ts +3 -0
  117. package/src/utils/observable.ts +77 -0
  118. package/tasks.json +0 -0
  119. package/tsconfig.json +22 -0
  120. package/vitest.config.ts +16 -0
@@ -0,0 +1,464 @@
1
+ /**
2
+ * Introspection Tools - Standard tools for agents to inspect their workflow hierarchy
3
+ *
4
+ * These tools allow agents to understand their position in the workflow tree,
5
+ * access prior outputs, check cache status, and request dynamic workflow spawning.
6
+ */
7
+
8
+ import type { Tool, WorkflowStatus, WorkflowNode } from '../types/index.js';
9
+ import { getExecutionContext } from '../core/context.js';
10
+ import { defaultCache } from '../cache/index.js';
11
+
12
+ /**
13
+ * Information about the current workflow node
14
+ */
15
+ export interface CurrentNodeInfo {
16
+ id: string;
17
+ name: string;
18
+ status: WorkflowStatus;
19
+ parentId?: string;
20
+ parentName?: string;
21
+ childCount: number;
22
+ depth: number;
23
+ }
24
+
25
+ /**
26
+ * Information about an ancestor node
27
+ */
28
+ export interface AncestorInfo {
29
+ id: string;
30
+ name: string;
31
+ status: WorkflowStatus;
32
+ depth: number;
33
+ }
34
+
35
+ /**
36
+ * Result from reading ancestor chain
37
+ */
38
+ export interface AncestorChainResult {
39
+ ancestors: AncestorInfo[];
40
+ totalDepth: number;
41
+ }
42
+
43
+ /**
44
+ * Information about a sibling or child node
45
+ */
46
+ export interface NodeInfo {
47
+ id: string;
48
+ name: string;
49
+ status: WorkflowStatus;
50
+ }
51
+
52
+ /**
53
+ * Result from listing siblings or children
54
+ */
55
+ export interface SiblingsChildrenResult {
56
+ nodes: NodeInfo[];
57
+ type: 'siblings' | 'children';
58
+ }
59
+
60
+ /**
61
+ * Information about a prior output
62
+ */
63
+ export interface PriorOutputInfo {
64
+ nodeId: string;
65
+ nodeName: string;
66
+ status: WorkflowStatus;
67
+ events: unknown[];
68
+ }
69
+
70
+ /**
71
+ * Result from cache status check
72
+ */
73
+ export interface CacheStatusResult {
74
+ exists: boolean;
75
+ key: string;
76
+ }
77
+
78
+ /**
79
+ * Request to spawn a workflow
80
+ */
81
+ export interface SpawnWorkflowRequest {
82
+ name: string;
83
+ description: string;
84
+ requestId: string;
85
+ status: 'pending';
86
+ }
87
+
88
+ // ============================================================================
89
+ // Tool Definitions (Anthropic Tool format)
90
+ // ============================================================================
91
+
92
+ /**
93
+ * Tool: inspect_current_node
94
+ * Returns information about the current workflow node
95
+ */
96
+ export const inspectCurrentNodeTool: Tool = {
97
+ name: 'inspect_current_node',
98
+ description:
99
+ 'Get information about the current workflow node including ID, name, status, and parent reference',
100
+ input_schema: {
101
+ type: 'object' as const,
102
+ properties: {},
103
+ required: [],
104
+ },
105
+ };
106
+
107
+ /**
108
+ * Tool: read_ancestor_chain
109
+ * Returns all ancestor nodes from current position up to root
110
+ */
111
+ export const readAncestorChainTool: Tool = {
112
+ name: 'read_ancestor_chain',
113
+ description: 'Get all ancestor nodes from current position up to the root workflow',
114
+ input_schema: {
115
+ type: 'object' as const,
116
+ properties: {
117
+ maxDepth: {
118
+ type: 'number',
119
+ description: 'Maximum ancestors to return (default: all)',
120
+ },
121
+ },
122
+ required: [],
123
+ },
124
+ };
125
+
126
+ /**
127
+ * Tool: list_siblings_children
128
+ * Returns sibling or child nodes relative to current position
129
+ */
130
+ export const listSiblingsChildrenTool: Tool = {
131
+ name: 'list_siblings_children',
132
+ description: 'List sibling or child nodes relative to current position',
133
+ input_schema: {
134
+ type: 'object' as const,
135
+ properties: {
136
+ type: {
137
+ type: 'string',
138
+ enum: ['siblings', 'children'],
139
+ description: 'Type of nodes to list',
140
+ },
141
+ },
142
+ required: ['type'],
143
+ },
144
+ };
145
+
146
+ /**
147
+ * Tool: inspect_prior_outputs
148
+ * Returns outputs from prior steps or prompt executions
149
+ */
150
+ export const inspectPriorOutputsTool: Tool = {
151
+ name: 'inspect_prior_outputs',
152
+ description: 'Get outputs from prior steps or prompt executions',
153
+ input_schema: {
154
+ type: 'object' as const,
155
+ properties: {
156
+ nodeId: {
157
+ type: 'string',
158
+ description: 'Specific node ID to inspect (default: most recent)',
159
+ },
160
+ count: {
161
+ type: 'number',
162
+ description: 'Number of prior outputs to return (default: 1)',
163
+ },
164
+ },
165
+ required: [],
166
+ },
167
+ };
168
+
169
+ /**
170
+ * Tool: inspect_cache_status
171
+ * Checks if a prompt response is cached
172
+ */
173
+ export const inspectCacheStatusTool: Tool = {
174
+ name: 'inspect_cache_status',
175
+ description: 'Check if a prompt response is cached',
176
+ input_schema: {
177
+ type: 'object' as const,
178
+ properties: {
179
+ promptHash: {
180
+ type: 'string',
181
+ description: 'Hash of the prompt to check',
182
+ },
183
+ },
184
+ required: ['promptHash'],
185
+ },
186
+ };
187
+
188
+ /**
189
+ * Tool: request_spawn_workflow
190
+ * Requests to spawn a new child workflow dynamically
191
+ */
192
+ export const requestSpawnWorkflowTool: Tool = {
193
+ name: 'request_spawn_workflow',
194
+ description: 'Request to spawn a new child workflow dynamically',
195
+ input_schema: {
196
+ type: 'object' as const,
197
+ properties: {
198
+ name: {
199
+ type: 'string',
200
+ description: 'Name for the new workflow',
201
+ },
202
+ description: {
203
+ type: 'string',
204
+ description: 'Description of what the workflow should do',
205
+ },
206
+ },
207
+ required: ['name', 'description'],
208
+ },
209
+ };
210
+
211
+ // ============================================================================
212
+ // Tool Handlers
213
+ // ============================================================================
214
+
215
+ /**
216
+ * Calculate depth of a node in the tree
217
+ */
218
+ function calculateDepth(node: WorkflowNode): number {
219
+ let depth = 0;
220
+ let current = node.parent;
221
+ while (current) {
222
+ depth++;
223
+ current = current.parent;
224
+ }
225
+ return depth;
226
+ }
227
+
228
+ /**
229
+ * Handler for inspect_current_node
230
+ */
231
+ export async function handleInspectCurrentNode(): Promise<CurrentNodeInfo> {
232
+ const ctx = getExecutionContext();
233
+ if (!ctx) {
234
+ throw new Error('Not in workflow context - cannot inspect current node');
235
+ }
236
+
237
+ const node = ctx.workflowNode;
238
+ const depth = calculateDepth(node);
239
+
240
+ return {
241
+ id: node.id,
242
+ name: node.name,
243
+ status: node.status,
244
+ parentId: node.parent?.id,
245
+ parentName: node.parent?.name,
246
+ childCount: node.children.length,
247
+ depth,
248
+ };
249
+ }
250
+
251
+ /**
252
+ * Handler for read_ancestor_chain
253
+ */
254
+ export async function handleReadAncestorChain(input: {
255
+ maxDepth?: number;
256
+ }): Promise<AncestorChainResult> {
257
+ const ctx = getExecutionContext();
258
+ if (!ctx) {
259
+ throw new Error('Not in workflow context - cannot read ancestor chain');
260
+ }
261
+
262
+ const ancestors: AncestorInfo[] = [];
263
+ let current = ctx.workflowNode.parent;
264
+ let depth = 1;
265
+ const maxDepth = input.maxDepth ?? Infinity;
266
+
267
+ while (current && depth <= maxDepth) {
268
+ ancestors.push({
269
+ id: current.id,
270
+ name: current.name,
271
+ status: current.status,
272
+ depth,
273
+ });
274
+ current = current.parent;
275
+ depth++;
276
+ }
277
+
278
+ return {
279
+ ancestors,
280
+ totalDepth: calculateDepth(ctx.workflowNode),
281
+ };
282
+ }
283
+
284
+ /**
285
+ * Handler for list_siblings_children
286
+ */
287
+ export async function handleListSiblingsChildren(input: {
288
+ type: 'siblings' | 'children';
289
+ }): Promise<SiblingsChildrenResult> {
290
+ const ctx = getExecutionContext();
291
+ if (!ctx) {
292
+ throw new Error('Not in workflow context - cannot list siblings/children');
293
+ }
294
+
295
+ const node = ctx.workflowNode;
296
+ let nodes: WorkflowNode[];
297
+
298
+ if (input.type === 'children') {
299
+ nodes = node.children;
300
+ } else {
301
+ // Get siblings (other children of parent, excluding self)
302
+ nodes = node.parent?.children.filter((n) => n.id !== node.id) ?? [];
303
+ }
304
+
305
+ return {
306
+ type: input.type,
307
+ nodes: nodes.map((n) => ({
308
+ id: n.id,
309
+ name: n.name,
310
+ status: n.status,
311
+ })),
312
+ };
313
+ }
314
+
315
+ /**
316
+ * Handler for inspect_prior_outputs
317
+ */
318
+ export async function handleInspectPriorOutputs(input: {
319
+ nodeId?: string;
320
+ count?: number;
321
+ }): Promise<PriorOutputInfo[]> {
322
+ const ctx = getExecutionContext();
323
+ if (!ctx) {
324
+ throw new Error('Not in workflow context - cannot inspect prior outputs');
325
+ }
326
+
327
+ const count = input.count ?? 1;
328
+ const node = ctx.workflowNode;
329
+
330
+ // Get completed children nodes
331
+ const completedNodes = node.parent?.children
332
+ .filter((n) => n.status === 'completed' && n.id !== node.id)
333
+ .slice(-count) ?? [];
334
+
335
+ // If specific nodeId requested, filter to just that
336
+ if (input.nodeId) {
337
+ const specific = completedNodes.find((n) => n.id === input.nodeId);
338
+ if (!specific) {
339
+ return [];
340
+ }
341
+ return [
342
+ {
343
+ nodeId: specific.id,
344
+ nodeName: specific.name,
345
+ status: specific.status,
346
+ events: specific.events,
347
+ },
348
+ ];
349
+ }
350
+
351
+ return completedNodes.map((n) => ({
352
+ nodeId: n.id,
353
+ nodeName: n.name,
354
+ status: n.status,
355
+ events: n.events,
356
+ }));
357
+ }
358
+
359
+ /**
360
+ * Handler for inspect_cache_status
361
+ */
362
+ export async function handleInspectCacheStatus(input: {
363
+ promptHash: string;
364
+ }): Promise<CacheStatusResult> {
365
+ const exists = defaultCache.has(input.promptHash);
366
+
367
+ return {
368
+ exists,
369
+ key: input.promptHash,
370
+ };
371
+ }
372
+
373
+ /**
374
+ * Handler for request_spawn_workflow
375
+ * Note: This creates a spawn request that must be handled by the workflow orchestrator
376
+ */
377
+ export async function handleRequestSpawnWorkflow(input: {
378
+ name: string;
379
+ description: string;
380
+ }): Promise<SpawnWorkflowRequest> {
381
+ const ctx = getExecutionContext();
382
+ if (!ctx) {
383
+ throw new Error('Not in workflow context - cannot request spawn');
384
+ }
385
+
386
+ // Create a spawn request ID
387
+ const requestId = `spawn-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
388
+
389
+ // Return the request - actual spawning is handled by the orchestrator
390
+ return {
391
+ name: input.name,
392
+ description: input.description,
393
+ requestId,
394
+ status: 'pending',
395
+ };
396
+ }
397
+
398
+ // ============================================================================
399
+ // Tool Bundle and Registration
400
+ // ============================================================================
401
+
402
+ /**
403
+ * All introspection tools bundled together
404
+ */
405
+ export const INTROSPECTION_TOOLS: Tool[] = [
406
+ inspectCurrentNodeTool,
407
+ readAncestorChainTool,
408
+ listSiblingsChildrenTool,
409
+ inspectPriorOutputsTool,
410
+ inspectCacheStatusTool,
411
+ requestSpawnWorkflowTool,
412
+ ];
413
+
414
+ /**
415
+ * Map of tool names to handlers
416
+ */
417
+ export const INTROSPECTION_HANDLERS: Record<
418
+ string,
419
+ (input: unknown) => Promise<unknown>
420
+ > = {
421
+ inspect_current_node: handleInspectCurrentNode,
422
+ read_ancestor_chain: handleReadAncestorChain as (input: unknown) => Promise<unknown>,
423
+ list_siblings_children: handleListSiblingsChildren as (
424
+ input: unknown
425
+ ) => Promise<unknown>,
426
+ inspect_prior_outputs: handleInspectPriorOutputs as (
427
+ input: unknown
428
+ ) => Promise<unknown>,
429
+ inspect_cache_status: handleInspectCacheStatus as (
430
+ input: unknown
431
+ ) => Promise<unknown>,
432
+ request_spawn_workflow: handleRequestSpawnWorkflow as (
433
+ input: unknown
434
+ ) => Promise<unknown>,
435
+ };
436
+
437
+ /**
438
+ * Register all introspection tools with an MCP handler
439
+ * @param handler MCP handler to register tools with
440
+ */
441
+ export function registerIntrospectionTools(handler: {
442
+ registerTool(name: string, executor: (input: unknown) => Promise<unknown>): void;
443
+ }): void {
444
+ for (const [name, executor] of Object.entries(INTROSPECTION_HANDLERS)) {
445
+ handler.registerTool(name, executor);
446
+ }
447
+ }
448
+
449
+ /**
450
+ * Execute an introspection tool by name
451
+ * @param toolName Name of the tool to execute
452
+ * @param input Tool input
453
+ * @returns Tool result
454
+ */
455
+ export async function executeIntrospectionTool(
456
+ toolName: string,
457
+ input: unknown
458
+ ): Promise<unknown> {
459
+ const handler = INTROSPECTION_HANDLERS[toolName];
460
+ if (!handler) {
461
+ throw new Error(`Unknown introspection tool: ${toolName}`);
462
+ }
463
+ return handler(input);
464
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Agent configuration and override types
3
+ * All properties map 1:1 to Anthropic SDK
4
+ */
5
+
6
+ import type { Tool, MCPServer, Skill, AgentHooks } from './sdk-primitives.js';
7
+
8
+ /**
9
+ * Configuration for creating an Agent instance
10
+ * All Anthropic SDK properties pass through unchanged
11
+ */
12
+ export interface AgentConfig {
13
+ /** Human-readable name for the agent */
14
+ name?: string;
15
+
16
+ /** System prompt for the agent */
17
+ system?: string;
18
+
19
+ /** Tools available to the agent */
20
+ tools?: Tool[];
21
+
22
+ /** MCP servers to connect */
23
+ mcps?: MCPServer[];
24
+
25
+ /** Skills to load */
26
+ skills?: Skill[];
27
+
28
+ /** Lifecycle hooks */
29
+ hooks?: AgentHooks;
30
+
31
+ /** Environment variables for agent execution */
32
+ env?: Record<string, string>;
33
+
34
+ /** Enable reflection capability for this agent */
35
+ enableReflection?: boolean;
36
+
37
+ /** Enable caching of prompt responses */
38
+ enableCache?: boolean;
39
+
40
+ /** Model to use (defaults to claude-sonnet-4-20250514) */
41
+ model?: string;
42
+
43
+ /** Maximum tokens for responses */
44
+ maxTokens?: number;
45
+
46
+ /** Temperature for response generation */
47
+ temperature?: number;
48
+ }
49
+
50
+ /**
51
+ * Overrides that can be applied at the prompt level
52
+ * Takes precedence over AgentConfig values
53
+ */
54
+ export interface PromptOverrides {
55
+ /** Override system prompt for this prompt */
56
+ system?: string;
57
+
58
+ /** Override tools for this prompt */
59
+ tools?: Tool[];
60
+
61
+ /** Override MCPs for this prompt */
62
+ mcps?: MCPServer[];
63
+
64
+ /** Override skills for this prompt */
65
+ skills?: Skill[];
66
+
67
+ /** Override hooks for this prompt */
68
+ hooks?: AgentHooks;
69
+
70
+ /** Override environment variables */
71
+ env?: Record<string, string>;
72
+
73
+ /** Override temperature */
74
+ temperature?: number;
75
+
76
+ /** Override max tokens */
77
+ maxTokens?: number;
78
+
79
+ /** Stop sequences to use */
80
+ stop?: string[];
81
+
82
+ /** Disable cache for this prompt */
83
+ disableCache?: boolean;
84
+
85
+ /** Enable reflection for this prompt */
86
+ enableReflection?: boolean;
87
+
88
+ /** Override model for this prompt */
89
+ model?: string;
90
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Configuration options for @Step decorator
3
+ */
4
+ export interface StepOptions {
5
+ /** Custom step name (defaults to method name) */
6
+ name?: string;
7
+ /** If true, capture state snapshot after step completion */
8
+ snapshotState?: boolean;
9
+ /** If true, track and emit step duration */
10
+ trackTiming?: boolean;
11
+ /** If true, log message at step start */
12
+ logStart?: boolean;
13
+ /** If true, log message at step end */
14
+ logFinish?: boolean;
15
+ }
16
+
17
+ /**
18
+ * Configuration options for @Task decorator
19
+ */
20
+ export interface TaskOptions {
21
+ /** Custom task name (defaults to method name) */
22
+ name?: string;
23
+ /** If true, run returned workflows concurrently */
24
+ concurrent?: boolean;
25
+ }
@@ -0,0 +1,13 @@
1
+ import type { WorkflowError } from './error.js';
2
+
3
+ /**
4
+ * Strategy for merging multiple errors from concurrent operations
5
+ */
6
+ export interface ErrorMergeStrategy {
7
+ /** Enable error merging (default: false, first error wins) */
8
+ enabled: boolean;
9
+ /** Maximum depth to merge errors */
10
+ maxMergeDepth?: number;
11
+ /** Custom function to combine multiple errors */
12
+ combine?(errors: WorkflowError[]): WorkflowError;
13
+ }
@@ -0,0 +1,20 @@
1
+ import type { LogEntry } from './logging.js';
2
+ import type { SerializedWorkflowState } from './snapshot.js';
3
+
4
+ /**
5
+ * Rich error object containing workflow context
6
+ */
7
+ export interface WorkflowError {
8
+ /** Error message */
9
+ message: string;
10
+ /** Original thrown error */
11
+ original: unknown;
12
+ /** ID of workflow where error occurred */
13
+ workflowId: string;
14
+ /** Stack trace if available */
15
+ stack?: string;
16
+ /** State snapshot at time of error */
17
+ state: SerializedWorkflowState;
18
+ /** Logs from the failing workflow node */
19
+ logs: LogEntry[];
20
+ }
@@ -0,0 +1,74 @@
1
+ import type { WorkflowNode } from './workflow.js';
2
+ import type { WorkflowError } from './error.js';
3
+ import type { TokenUsage } from './sdk-primitives.js';
4
+
5
+ /**
6
+ * Discriminated union of all workflow events
7
+ */
8
+ export type WorkflowEvent =
9
+ // Core workflow events
10
+ | { type: 'childAttached'; parentId: string; child: WorkflowNode }
11
+ | { type: 'stateSnapshot'; node: WorkflowNode }
12
+ | { type: 'stepStart'; node: WorkflowNode; step: string }
13
+ | { type: 'stepEnd'; node: WorkflowNode; step: string; duration: number }
14
+ | { type: 'error'; node: WorkflowNode; error: WorkflowError }
15
+ | { type: 'taskStart'; node: WorkflowNode; task: string }
16
+ | { type: 'taskEnd'; node: WorkflowNode; task: string }
17
+ | { type: 'treeUpdated'; root: WorkflowNode }
18
+ // Agent/Prompt events
19
+ | {
20
+ type: 'agentPromptStart';
21
+ agentId: string;
22
+ agentName: string;
23
+ promptId: string;
24
+ node: WorkflowNode;
25
+ }
26
+ | {
27
+ type: 'agentPromptEnd';
28
+ agentId: string;
29
+ agentName: string;
30
+ promptId: string;
31
+ node: WorkflowNode;
32
+ duration: number;
33
+ tokenUsage?: TokenUsage;
34
+ }
35
+ // Tool events
36
+ | {
37
+ type: 'toolInvocation';
38
+ toolName: string;
39
+ input: unknown;
40
+ output: unknown;
41
+ duration: number;
42
+ node: WorkflowNode;
43
+ }
44
+ // MCP events
45
+ | {
46
+ type: 'mcpEvent';
47
+ serverName: string;
48
+ event: string;
49
+ payload?: unknown;
50
+ node: WorkflowNode;
51
+ }
52
+ // Reflection events
53
+ | {
54
+ type: 'reflectionStart';
55
+ level: 'workflow' | 'agent' | 'prompt';
56
+ node: WorkflowNode;
57
+ }
58
+ | {
59
+ type: 'reflectionEnd';
60
+ level: 'workflow' | 'agent' | 'prompt';
61
+ success: boolean;
62
+ node: WorkflowNode;
63
+ }
64
+ // Cache events
65
+ | {
66
+ type: 'cacheHit';
67
+ key: string;
68
+ node: WorkflowNode;
69
+ }
70
+ | {
71
+ type: 'cacheMiss';
72
+ key: string;
73
+ node: WorkflowNode;
74
+ };