groundswell 0.0.1 → 0.0.3
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/CHANGELOG.md +188 -0
- package/README.md +99 -5
- package/dist/__tests__/adversarial/attachChild-performance.test.d.ts +16 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.js +187 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.js.map +1 -0
- package/dist/__tests__/adversarial/circular-reference.test.d.ts +13 -0
- package/dist/__tests__/adversarial/circular-reference.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/circular-reference.test.js +92 -0
- package/dist/__tests__/adversarial/circular-reference.test.js.map +1 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts +16 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.js +127 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.js.map +1 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts +21 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js +667 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js.map +1 -0
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts +6 -0
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/deep-analysis.test.js +877 -0
- package/dist/__tests__/adversarial/deep-analysis.test.js.map +1 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts +13 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js +186 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js.map +1 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts +6 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js +626 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js.map +1 -0
- package/dist/__tests__/adversarial/edge-case.test.d.ts +6 -0
- package/dist/__tests__/adversarial/edge-case.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/edge-case.test.js +857 -0
- package/dist/__tests__/adversarial/edge-case.test.js.map +1 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts +20 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.js +907 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.js.map +1 -0
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts +2 -0
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/incremental-performance.test.js +113 -0
- package/dist/__tests__/adversarial/incremental-performance.test.js.map +1 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts +22 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js +383 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js.map +1 -0
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts +21 -0
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/observer-propagation.test.js +404 -0
- package/dist/__tests__/adversarial/observer-propagation.test.js.map +1 -0
- package/dist/__tests__/adversarial/parent-validation.test.d.ts +13 -0
- package/dist/__tests__/adversarial/parent-validation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/parent-validation.test.js +128 -0
- package/dist/__tests__/adversarial/parent-validation.test.js.map +1 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts +20 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js +482 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js.map +1 -0
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts +6 -0
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/prd-compliance.test.js +886 -0
- package/dist/__tests__/adversarial/prd-compliance.test.js.map +1 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts +22 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts.map +1 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.js +1843 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.js.map +1 -0
- package/dist/__tests__/helpers/index.d.ts +10 -0
- package/dist/__tests__/helpers/index.d.ts.map +1 -0
- package/dist/__tests__/helpers/index.js +10 -0
- package/dist/__tests__/helpers/index.js.map +1 -0
- package/dist/__tests__/helpers/tree-verification.d.ts +90 -0
- package/dist/__tests__/helpers/tree-verification.d.ts.map +1 -0
- package/dist/__tests__/helpers/tree-verification.js +202 -0
- package/dist/__tests__/helpers/tree-verification.js.map +1 -0
- package/dist/__tests__/integration/agent-workflow.test.d.ts +2 -0
- package/dist/__tests__/integration/agent-workflow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/agent-workflow.test.js +256 -0
- package/dist/__tests__/integration/agent-workflow.test.js.map +1 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts +14 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.js +668 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.js.map +1 -0
- package/dist/__tests__/integration/observer-logging.test.d.ts +2 -0
- package/dist/__tests__/integration/observer-logging.test.d.ts.map +1 -0
- package/dist/__tests__/integration/observer-logging.test.js +517 -0
- package/dist/__tests__/integration/observer-logging.test.js.map +1 -0
- package/dist/__tests__/integration/tree-mirroring.test.d.ts +2 -0
- package/dist/__tests__/integration/tree-mirroring.test.d.ts.map +1 -0
- package/dist/__tests__/integration/tree-mirroring.test.js +117 -0
- package/dist/__tests__/integration/tree-mirroring.test.js.map +1 -0
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts +12 -0
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts.map +1 -0
- package/dist/__tests__/integration/workflow-reparenting.test.js +239 -0
- package/dist/__tests__/integration/workflow-reparenting.test.js.map +1 -0
- package/dist/__tests__/unit/agent.test.d.ts +2 -0
- package/dist/__tests__/unit/agent.test.d.ts.map +1 -0
- package/dist/__tests__/unit/agent.test.js +143 -0
- package/dist/__tests__/unit/agent.test.js.map +1 -0
- package/dist/__tests__/unit/cache-key.test.d.ts +5 -0
- package/dist/__tests__/unit/cache-key.test.d.ts.map +1 -0
- package/dist/__tests__/unit/cache-key.test.js +145 -0
- package/dist/__tests__/unit/cache-key.test.js.map +1 -0
- package/dist/__tests__/unit/cache.test.d.ts +5 -0
- package/dist/__tests__/unit/cache.test.d.ts.map +1 -0
- package/dist/__tests__/unit/cache.test.js +132 -0
- package/dist/__tests__/unit/cache.test.js.map +1 -0
- package/dist/__tests__/unit/context.test.d.ts +2 -0
- package/dist/__tests__/unit/context.test.d.ts.map +1 -0
- package/dist/__tests__/unit/context.test.js +220 -0
- package/dist/__tests__/unit/context.test.js.map +1 -0
- package/dist/__tests__/unit/decorators.test.d.ts +2 -0
- package/dist/__tests__/unit/decorators.test.d.ts.map +1 -0
- package/dist/__tests__/unit/decorators.test.js +162 -0
- package/dist/__tests__/unit/decorators.test.js.map +1 -0
- package/dist/__tests__/unit/introspection-tools.test.d.ts +5 -0
- package/dist/__tests__/unit/introspection-tools.test.d.ts.map +1 -0
- package/dist/__tests__/unit/introspection-tools.test.js +191 -0
- package/dist/__tests__/unit/introspection-tools.test.js.map +1 -0
- package/dist/__tests__/unit/logger.test.d.ts +2 -0
- package/dist/__tests__/unit/logger.test.d.ts.map +1 -0
- package/dist/__tests__/unit/logger.test.js +241 -0
- package/dist/__tests__/unit/logger.test.js.map +1 -0
- package/dist/__tests__/unit/observable.test.d.ts +2 -0
- package/dist/__tests__/unit/observable.test.d.ts.map +1 -0
- package/dist/__tests__/unit/observable.test.js +251 -0
- package/dist/__tests__/unit/observable.test.js.map +1 -0
- package/dist/__tests__/unit/prompt.test.d.ts +2 -0
- package/dist/__tests__/unit/prompt.test.d.ts.map +1 -0
- package/dist/__tests__/unit/prompt.test.js +113 -0
- package/dist/__tests__/unit/prompt.test.js.map +1 -0
- package/dist/__tests__/unit/reflection.test.d.ts +5 -0
- package/dist/__tests__/unit/reflection.test.d.ts.map +1 -0
- package/dist/__tests__/unit/reflection.test.js +160 -0
- package/dist/__tests__/unit/reflection.test.js.map +1 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts +2 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.js +136 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.js.map +1 -0
- package/dist/__tests__/unit/tree-debugger.test.d.ts +2 -0
- package/dist/__tests__/unit/tree-debugger.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tree-debugger.test.js +69 -0
- package/dist/__tests__/unit/tree-debugger.test.js.map +1 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts +2 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts.map +1 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js +154 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-detachChild.test.js +76 -0
- package/dist/__tests__/unit/workflow-detachChild.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js +122 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js +140 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js.map +1 -0
- package/dist/__tests__/unit/workflow.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow.test.js +330 -0
- package/dist/__tests__/unit/workflow.test.js.map +1 -0
- package/dist/cache/cache-key.d.ts +66 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +195 -0
- package/dist/cache/cache-key.js.map +1 -0
- package/dist/cache/cache.d.ts +104 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +179 -0
- package/dist/cache/cache.js.map +1 -0
- package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/agent.d.ts +112 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +426 -0
- package/dist/core/agent.js.map +1 -0
- package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +80 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/event-tree.d.ts +72 -0
- package/dist/core/event-tree.d.ts.map +1 -0
- package/dist/core/event-tree.js +211 -0
- package/dist/core/event-tree.js.map +1 -0
- package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +110 -0
- package/dist/core/factory.js.map +1 -0
- package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +50 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +91 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp-handler.d.ts +69 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +143 -0
- package/dist/core/mcp-handler.js.map +1 -0
- package/dist/core/prompt.d.ts +80 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +120 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/workflow-context.d.ts +57 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +263 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +241 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +464 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/debugger/index.d.ts +2 -0
- package/dist/debugger/index.d.ts.map +1 -0
- package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
- package/dist/debugger/index.js.map +1 -0
- package/dist/debugger/tree-debugger.d.ts +71 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +198 -0
- package/dist/debugger/tree-debugger.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/observed-state.d.ts +32 -0
- package/dist/decorators/observed-state.d.ts.map +1 -0
- package/dist/decorators/observed-state.js +79 -0
- package/dist/decorators/observed-state.js.map +1 -0
- package/dist/decorators/step.d.ts +15 -0
- package/dist/decorators/step.d.ts.map +1 -0
- package/dist/decorators/step.js +110 -0
- package/dist/decorators/step.js.map +1 -0
- package/dist/decorators/task.d.ts +50 -0
- package/dist/decorators/task.d.ts.map +1 -0
- package/dist/decorators/task.js +118 -0
- package/dist/decorators/task.js.map +1 -0
- package/dist/examples/index.d.ts +3 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/{src/examples/index.ts → dist/examples/index.js} +1 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/tdd-orchestrator.d.ts +15 -0
- package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
- package/dist/examples/tdd-orchestrator.js +121 -0
- package/dist/examples/tdd-orchestrator.js.map +1 -0
- package/dist/examples/test-cycle-workflow.d.ts +14 -0
- package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
- package/dist/examples/test-cycle-workflow.js +116 -0
- package/dist/examples/test-cycle-workflow.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/reflection/index.d.ts +5 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
- package/dist/reflection/index.js.map +1 -0
- package/dist/reflection/reflection.d.ts +84 -0
- package/dist/reflection/reflection.d.ts.map +1 -0
- package/dist/reflection/reflection.js +329 -0
- package/dist/reflection/reflection.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/introspection.d.ts +165 -0
- package/dist/tools/introspection.d.ts.map +1 -0
- package/dist/tools/introspection.js +324 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/types/agent.d.ts +66 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +31 -0
- package/dist/types/decorators.d.ts.map +1 -0
- package/dist/types/decorators.js +2 -0
- package/dist/types/decorators.js.map +1 -0
- package/dist/types/error-strategy.d.ts +13 -0
- package/dist/types/error-strategy.d.ts.map +1 -0
- package/dist/types/error-strategy.js +2 -0
- package/dist/types/error-strategy.js.map +1 -0
- package/dist/types/error.d.ts +20 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +2 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/events.d.ts +87 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logging.d.ts +24 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/observer.d.ts +18 -0
- package/dist/types/observer.d.ts.map +1 -0
- package/dist/types/observer.js +2 -0
- package/dist/types/observer.js.map +1 -0
- package/dist/types/prompt.d.ts +31 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +6 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/reflection.d.ts +96 -0
- package/dist/types/reflection.d.ts.map +1 -0
- package/dist/types/reflection.js +24 -0
- package/dist/types/reflection.js.map +1 -0
- package/dist/types/sdk-primitives.d.ts +118 -0
- package/dist/types/sdk-primitives.d.ts.map +1 -0
- package/dist/types/sdk-primitives.js +6 -0
- package/dist/types/sdk-primitives.js.map +1 -0
- package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
- package/dist/types/snapshot.d.ts.map +1 -0
- package/dist/types/snapshot.js +2 -0
- package/dist/types/snapshot.js.map +1 -0
- package/dist/types/workflow-context.d.ts +139 -0
- package/dist/types/workflow-context.d.ts.map +1 -0
- package/dist/types/workflow-context.js +8 -0
- package/dist/types/workflow-context.js.map +1 -0
- package/dist/types/workflow.d.ts +30 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/id.d.ts +6 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +12 -0
- package/dist/utils/id.js.map +1 -0
- package/{src/utils/index.ts → dist/utils/index.d.ts} +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/observable.d.ts +54 -0
- package/dist/utils/observable.d.ts.map +1 -0
- package/dist/utils/observable.js +82 -0
- package/dist/utils/observable.js.map +1 -0
- package/dist/utils/workflow-error-utils.d.ts +22 -0
- package/dist/utils/workflow-error-utils.d.ts.map +1 -0
- package/dist/utils/workflow-error-utils.js +45 -0
- package/dist/utils/workflow-error-utils.js.map +1 -0
- package/package.json +7 -2
- package/.claude/settings.local.json +0 -9
- package/.claude/system_prompts/task-breakdown.md +0 -100
- package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
- package/PRPs/PRDs/001-hierarchical-workflow-engine.md +0 -543
- package/PRPs/PRDs/002-agent-prompt.md +0 -390
- package/PRPs/PRDs/003-agent-prompt.md +0 -943
- package/PRPs/PRDs/004-agent-prompt.md +0 -1136
- package/PRPs/PRDs/tasks-001.json +0 -492
- package/PRPs/README.md +0 -83
- package/PRPs/templates/prp_base.md +0 -222
- package/docs/agent.md +0 -422
- package/docs/prompt.md +0 -419
- package/docs/workflow.md +0 -600
- package/examples/README.md +0 -244
- package/examples/examples/01-basic-workflow.ts +0 -100
- package/examples/examples/02-decorator-options.ts +0 -217
- package/examples/examples/03-parent-child.ts +0 -241
- package/examples/examples/04-observers-debugger.ts +0 -340
- package/examples/examples/05-error-handling.ts +0 -387
- package/examples/examples/06-concurrent-tasks.ts +0 -352
- package/examples/examples/07-agent-loops.ts +0 -432
- package/examples/examples/08-sdk-features.ts +0 -667
- package/examples/examples/09-reflection.ts +0 -573
- package/examples/examples/10-introspection.ts +0 -550
- package/examples/index.ts +0 -143
- package/examples/utils/helpers.ts +0 -57
- package/llms_full.txt +0 -5890
- package/plan/P1P2/PRP.md +0 -527
- package/plan/P1P2/research/LRU_CACHE_BEST_PRACTICES.md +0 -1929
- package/plan/P1P2/research/LRU_CACHE_CODE_PATTERNS.md +0 -857
- package/plan/P1P2/research/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
- package/plan/P1P2/research/LRU_CACHE_RESEARCH_INDEX.md +0 -424
- package/plan/P1P2/research/REFLECTION_INDEX.md +0 -291
- package/plan/P1P2/research/REFLECTION_RESEARCH_REPORT.md +0 -1342
- package/plan/P1P2/research/RESEARCH_SUMMARY.md +0 -342
- package/plan/P1P2/research/anthropic-sdk.md +0 -174
- package/plan/P1P2/research/async-local-storage.md +0 -200
- package/plan/P1P2/research/reflection-code-patterns.md +0 -1205
- package/plan/P1P2/research/reflection-decision-matrix.md +0 -421
- package/plan/P1P2/research/reflection-implementation-guide.md +0 -1341
- package/plan/P1P2/research/reflection-integration-guide.md +0 -834
- package/plan/P1P2/research/reflection-patterns.md +0 -1468
- package/plan/P1P2/research/reflection-quick-reference.md +0 -558
- package/plan/P1P2/research/zod-schema.md +0 -152
- package/plan/P3P4/PRP.md +0 -1388
- package/plan/P3P4/research/caching-lru.md +0 -116
- package/plan/P3P4/research/introspection-tools.md +0 -177
- package/plan/P3P4/research/reflection-patterns.md +0 -117
- package/plan/P4P5/PRP.md +0 -1136
- package/plan/P4P5/research/RESEARCH_SUMMARY.md +0 -151
- package/plan/architecture/external_deps.md +0 -358
- package/plan/architecture/system_context.md +0 -242
- package/plan/backlog.json +0 -867
- package/plan/research/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
- package/plan/research/README-INTROSPECTION.md +0 -352
- package/plan/research/agent-introspection-patterns.md +0 -1085
- package/plan/research/introspection-security-guide.md +0 -928
- package/plan/research/introspection-tool-examples.md +0 -875
- package/scripts/generate-llms-full.ts +0 -206
- package/src/__tests__/integration/agent-workflow.test.ts +0 -256
- package/src/__tests__/integration/tree-mirroring.test.ts +0 -114
- package/src/__tests__/unit/agent.test.ts +0 -169
- package/src/__tests__/unit/cache-key.test.ts +0 -182
- package/src/__tests__/unit/cache.test.ts +0 -172
- package/src/__tests__/unit/context.test.ts +0 -138
- package/src/__tests__/unit/decorators.test.ts +0 -100
- package/src/__tests__/unit/introspection-tools.test.ts +0 -277
- package/src/__tests__/unit/prompt.test.ts +0 -135
- package/src/__tests__/unit/reflection.test.ts +0 -210
- package/src/__tests__/unit/tree-debugger.test.ts +0 -85
- package/src/__tests__/unit/workflow.test.ts +0 -81
- package/src/cache/cache-key.ts +0 -244
- package/src/cache/cache.ts +0 -236
- package/src/core/agent.ts +0 -573
- package/src/core/event-tree.ts +0 -260
- package/src/core/logger.ts +0 -87
- package/src/core/mcp-handler.ts +0 -184
- package/src/core/prompt.ts +0 -150
- package/src/core/workflow-context.ts +0 -349
- package/src/core/workflow.ts +0 -302
- package/src/debugger/tree-debugger.ts +0 -210
- package/src/decorators/observed-state.ts +0 -95
- package/src/decorators/step.ts +0 -139
- package/src/decorators/task.ts +0 -96
- package/src/examples/tdd-orchestrator.ts +0 -65
- package/src/examples/test-cycle-workflow.ts +0 -64
- package/src/index.ts +0 -140
- package/src/reflection/reflection.ts +0 -407
- package/src/tools/index.ts +0 -36
- package/src/tools/introspection.ts +0 -464
- package/src/types/agent.ts +0 -90
- package/src/types/decorators.ts +0 -25
- package/src/types/error-strategy.ts +0 -13
- package/src/types/error.ts +0 -20
- package/src/types/events.ts +0 -74
- package/src/types/index.ts +0 -55
- package/src/types/logging.ts +0 -24
- package/src/types/observer.ts +0 -18
- package/src/types/prompt.ts +0 -40
- package/src/types/reflection.ts +0 -117
- package/src/types/sdk-primitives.ts +0 -128
- package/src/types/workflow-context.ts +0 -163
- package/src/types/workflow.ts +0 -37
- package/src/utils/id.ts +0 -11
- package/src/utils/observable.ts +0 -77
- package/tasks.json +0 -0
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -16
package/docs/workflow.md
DELETED
|
@@ -1,600 +0,0 @@
|
|
|
1
|
-
# Workflows
|
|
2
|
-
|
|
3
|
-
Workflows are hierarchical task containers with built-in logging, state observation, and event emission.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [Basic Usage](#basic-usage)
|
|
8
|
-
- [Functional Pattern](#functional-pattern)
|
|
9
|
-
- [Decorators](#decorators)
|
|
10
|
-
- [Parent-Child Workflows](#parent-child-workflows)
|
|
11
|
-
- [Observers](#observers)
|
|
12
|
-
- [Tree Debugger](#tree-debugger)
|
|
13
|
-
- [Error Handling](#error-handling)
|
|
14
|
-
- [Concurrent Execution](#concurrent-execution)
|
|
15
|
-
- [API Reference](#api-reference)
|
|
16
|
-
|
|
17
|
-
## Basic Usage
|
|
18
|
-
|
|
19
|
-
Extend `Workflow` and implement `run()`:
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
import { Workflow } from 'groundswell';
|
|
23
|
-
|
|
24
|
-
class DataProcessor extends Workflow {
|
|
25
|
-
async run(): Promise<string[]> {
|
|
26
|
-
this.setStatus('running');
|
|
27
|
-
this.logger.info('Processing started');
|
|
28
|
-
|
|
29
|
-
const result = await this.processData();
|
|
30
|
-
|
|
31
|
-
this.setStatus('completed');
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
private async processData(): Promise<string[]> {
|
|
36
|
-
return ['item1', 'item2'];
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const workflow = new DataProcessor('MyProcessor');
|
|
41
|
-
const result = await workflow.run();
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Workflow Status
|
|
45
|
-
|
|
46
|
-
```
|
|
47
|
-
idle -> running -> completed
|
|
48
|
-
-> failed
|
|
49
|
-
-> cancelled
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
| Status | Description |
|
|
53
|
-
|--------|-------------|
|
|
54
|
-
| `idle` | Created but not started |
|
|
55
|
-
| `running` | Currently executing |
|
|
56
|
-
| `completed` | Finished successfully |
|
|
57
|
-
| `failed` | Terminated with error |
|
|
58
|
-
| `cancelled` | Manually cancelled |
|
|
59
|
-
|
|
60
|
-
### Logger
|
|
61
|
-
|
|
62
|
-
Every workflow has a built-in logger:
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
this.logger.debug('Debug message', { data });
|
|
66
|
-
this.logger.info('Info message');
|
|
67
|
-
this.logger.warn('Warning message');
|
|
68
|
-
this.logger.error('Error message', { error });
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Functional Pattern
|
|
72
|
-
|
|
73
|
-
Create workflows without subclassing:
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
import { createWorkflow } from 'groundswell';
|
|
77
|
-
|
|
78
|
-
const workflow = createWorkflow(
|
|
79
|
-
{ name: 'DataPipeline', enableReflection: true },
|
|
80
|
-
async (ctx) => {
|
|
81
|
-
const loaded = await ctx.step('load', async () => {
|
|
82
|
-
return fetchData();
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
const processed = await ctx.step('process', async () => {
|
|
86
|
-
return transform(loaded);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
await ctx.step('save', async () => {
|
|
90
|
-
return persist(processed);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
return processed;
|
|
94
|
-
}
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
const result = await workflow.run();
|
|
98
|
-
console.log(result.data); // The actual result
|
|
99
|
-
console.log(result.duration); // Execution time in ms
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### WorkflowContext
|
|
103
|
-
|
|
104
|
-
The context provides methods for composing workflows:
|
|
105
|
-
|
|
106
|
-
| Method | Description |
|
|
107
|
-
|--------|-------------|
|
|
108
|
-
| `step(name, fn)` | Execute a named step with event tracking |
|
|
109
|
-
| `spawnWorkflow(workflow)` | Spawn and attach a child workflow |
|
|
110
|
-
| `replaceLastPromptResult(prompt, agent)` | Replace last prompt result without tree branching |
|
|
111
|
-
|
|
112
|
-
## Decorators
|
|
113
|
-
|
|
114
|
-
### @Step
|
|
115
|
-
|
|
116
|
-
Wraps methods with event emission and error handling.
|
|
117
|
-
|
|
118
|
-
```typescript
|
|
119
|
-
import { Step } from 'groundswell';
|
|
120
|
-
|
|
121
|
-
class MyWorkflow extends Workflow {
|
|
122
|
-
// Default - emits stepStart/stepEnd events
|
|
123
|
-
@Step()
|
|
124
|
-
async basicStep(): Promise<void> {}
|
|
125
|
-
|
|
126
|
-
// Custom name
|
|
127
|
-
@Step({ name: 'CustomStepName' })
|
|
128
|
-
async namedStep(): Promise<void> {}
|
|
129
|
-
|
|
130
|
-
// Capture state after completion
|
|
131
|
-
@Step({ snapshotState: true })
|
|
132
|
-
async snapshotStep(): Promise<void> {}
|
|
133
|
-
|
|
134
|
-
// Track execution duration
|
|
135
|
-
@Step({ trackTiming: true })
|
|
136
|
-
async timedStep(): Promise<void> {}
|
|
137
|
-
|
|
138
|
-
// Log start/end messages
|
|
139
|
-
@Step({ logStart: true, logFinish: true })
|
|
140
|
-
async loggedStep(): Promise<void> {}
|
|
141
|
-
|
|
142
|
-
// All options
|
|
143
|
-
@Step({
|
|
144
|
-
name: 'FullStep',
|
|
145
|
-
snapshotState: true,
|
|
146
|
-
trackTiming: true,
|
|
147
|
-
logStart: true,
|
|
148
|
-
logFinish: true,
|
|
149
|
-
})
|
|
150
|
-
async fullStep(): Promise<void> {}
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
**Options:**
|
|
155
|
-
|
|
156
|
-
| Option | Type | Description |
|
|
157
|
-
|--------|------|-------------|
|
|
158
|
-
| `name` | `string` | Custom step name (defaults to method name) |
|
|
159
|
-
| `snapshotState` | `boolean` | Capture state snapshot after step completion |
|
|
160
|
-
| `trackTiming` | `boolean` | Track and emit step duration |
|
|
161
|
-
| `logStart` | `boolean` | Log message when step starts |
|
|
162
|
-
| `logFinish` | `boolean` | Log message when step completes |
|
|
163
|
-
|
|
164
|
-
### @Task
|
|
165
|
-
|
|
166
|
-
Wraps methods that return child workflows.
|
|
167
|
-
|
|
168
|
-
```typescript
|
|
169
|
-
import { Task } from 'groundswell';
|
|
170
|
-
|
|
171
|
-
class ParentWorkflow extends Workflow {
|
|
172
|
-
// Basic - attaches returned workflow as child
|
|
173
|
-
@Task()
|
|
174
|
-
async createChild(): Promise<ChildWorkflow> {
|
|
175
|
-
return new ChildWorkflow('Child', this);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Custom name
|
|
179
|
-
@Task({ name: 'SpawnWorker' })
|
|
180
|
-
async spawnWorker(): Promise<WorkerWorkflow> {
|
|
181
|
-
return new WorkerWorkflow('Worker', this);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Concurrent - runs all returned workflows in parallel
|
|
185
|
-
@Task({ concurrent: true })
|
|
186
|
-
async createWorkers(): Promise<WorkerWorkflow[]> {
|
|
187
|
-
return [
|
|
188
|
-
new WorkerWorkflow('W1', this),
|
|
189
|
-
new WorkerWorkflow('W2', this),
|
|
190
|
-
new WorkerWorkflow('W3', this),
|
|
191
|
-
];
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
async run(): Promise<void> {
|
|
195
|
-
const child = await this.createChild();
|
|
196
|
-
await child.run();
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
**Options:**
|
|
202
|
-
|
|
203
|
-
| Option | Type | Description |
|
|
204
|
-
|--------|------|-------------|
|
|
205
|
-
| `name` | `string` | Custom task name |
|
|
206
|
-
| `concurrent` | `boolean` | Run returned workflows in parallel |
|
|
207
|
-
|
|
208
|
-
### @ObservedState
|
|
209
|
-
|
|
210
|
-
Marks fields for inclusion in state snapshots.
|
|
211
|
-
|
|
212
|
-
```typescript
|
|
213
|
-
import { ObservedState, getObservedState } from 'groundswell';
|
|
214
|
-
|
|
215
|
-
class MyWorkflow extends Workflow {
|
|
216
|
-
// Included in snapshots
|
|
217
|
-
@ObservedState()
|
|
218
|
-
progress = 0;
|
|
219
|
-
|
|
220
|
-
// Shown as '***' in snapshots
|
|
221
|
-
@ObservedState({ redact: true })
|
|
222
|
-
apiKey = 'secret';
|
|
223
|
-
|
|
224
|
-
// Excluded from snapshots
|
|
225
|
-
@ObservedState({ hidden: true })
|
|
226
|
-
internalState = {};
|
|
227
|
-
|
|
228
|
-
async run(): Promise<void> {
|
|
229
|
-
this.progress = 50;
|
|
230
|
-
|
|
231
|
-
// Get current state snapshot
|
|
232
|
-
const state = getObservedState(this);
|
|
233
|
-
// { progress: 50, apiKey: '***' }
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
**Options:**
|
|
239
|
-
|
|
240
|
-
| Option | Type | Description |
|
|
241
|
-
|--------|------|-------------|
|
|
242
|
-
| `hidden` | `boolean` | Exclude field from snapshots entirely |
|
|
243
|
-
| `redact` | `boolean` | Show value as `'***'` in snapshots |
|
|
244
|
-
|
|
245
|
-
## Parent-Child Workflows
|
|
246
|
-
|
|
247
|
-
Workflows form a hierarchy. Pass the parent to the constructor:
|
|
248
|
-
|
|
249
|
-
```typescript
|
|
250
|
-
class ChildWorkflow extends Workflow {
|
|
251
|
-
async run(): Promise<void> {
|
|
252
|
-
this.setStatus('running');
|
|
253
|
-
this.logger.info('Child executing');
|
|
254
|
-
this.setStatus('completed');
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
class ParentWorkflow extends Workflow {
|
|
259
|
-
@Task()
|
|
260
|
-
async spawnChild(): Promise<ChildWorkflow> {
|
|
261
|
-
return new ChildWorkflow('Child', this); // 'this' is parent
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
async run(): Promise<void> {
|
|
265
|
-
this.setStatus('running');
|
|
266
|
-
|
|
267
|
-
const child = await this.spawnChild();
|
|
268
|
-
await child.run();
|
|
269
|
-
|
|
270
|
-
// Access children
|
|
271
|
-
console.log(this.children.length); // 1
|
|
272
|
-
|
|
273
|
-
this.setStatus('completed');
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
Events from children propagate to observers on the root workflow.
|
|
279
|
-
|
|
280
|
-
## Observers
|
|
281
|
-
|
|
282
|
-
Attach observers to the root workflow to receive all events:
|
|
283
|
-
|
|
284
|
-
```typescript
|
|
285
|
-
import { WorkflowObserver, LogEntry, WorkflowEvent, WorkflowNode } from 'groundswell';
|
|
286
|
-
|
|
287
|
-
const observer: WorkflowObserver = {
|
|
288
|
-
onLog(entry: LogEntry): void {
|
|
289
|
-
console.log(`[${entry.level}] ${entry.message}`);
|
|
290
|
-
},
|
|
291
|
-
|
|
292
|
-
onEvent(event: WorkflowEvent): void {
|
|
293
|
-
console.log(`Event: ${event.type}`);
|
|
294
|
-
},
|
|
295
|
-
|
|
296
|
-
onStateUpdated(node: WorkflowNode): void {
|
|
297
|
-
console.log(`State updated: ${node.name}`);
|
|
298
|
-
},
|
|
299
|
-
|
|
300
|
-
onTreeChanged(root: WorkflowNode): void {
|
|
301
|
-
console.log('Tree structure changed');
|
|
302
|
-
},
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
const workflow = new MyWorkflow('Root');
|
|
306
|
-
workflow.addObserver(observer);
|
|
307
|
-
await workflow.run();
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### Event Types
|
|
311
|
-
|
|
312
|
-
| Type | Description |
|
|
313
|
-
|------|-------------|
|
|
314
|
-
| `stepStart` | Step execution started |
|
|
315
|
-
| `stepEnd` | Step completed, includes `duration` |
|
|
316
|
-
| `taskStart` | Task execution started |
|
|
317
|
-
| `taskEnd` | Task completed |
|
|
318
|
-
| `childAttached` | Child workflow attached |
|
|
319
|
-
| `stateSnapshot` | State snapshot captured |
|
|
320
|
-
| `error` | Error occurred |
|
|
321
|
-
| `treeUpdated` | Tree structure changed |
|
|
322
|
-
|
|
323
|
-
## Tree Debugger
|
|
324
|
-
|
|
325
|
-
Visualize workflow execution:
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
import { WorkflowTreeDebugger } from 'groundswell';
|
|
329
|
-
|
|
330
|
-
const workflow = new ParentWorkflow('Root');
|
|
331
|
-
const debugger_ = new WorkflowTreeDebugger(workflow);
|
|
332
|
-
|
|
333
|
-
await workflow.run();
|
|
334
|
-
|
|
335
|
-
// ASCII tree
|
|
336
|
-
console.log(debugger_.toTreeString());
|
|
337
|
-
// Root [completed]
|
|
338
|
-
// Child-1 [completed]
|
|
339
|
-
// Child-2 [completed]
|
|
340
|
-
|
|
341
|
-
// Formatted logs
|
|
342
|
-
console.log(debugger_.toLogString());
|
|
343
|
-
|
|
344
|
-
// Statistics
|
|
345
|
-
console.log(debugger_.getStats());
|
|
346
|
-
// { totalNodes: 3, byStatus: { completed: 3 }, totalLogs: 10, totalEvents: 15 }
|
|
347
|
-
|
|
348
|
-
// Find node by ID
|
|
349
|
-
const node = debugger_.getNode(workflow.id);
|
|
350
|
-
|
|
351
|
-
// Subscribe to events
|
|
352
|
-
debugger_.events.subscribe({
|
|
353
|
-
next: (event) => console.log(event.type),
|
|
354
|
-
});
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
### Status Symbols
|
|
358
|
-
|
|
359
|
-
| Symbol | Status |
|
|
360
|
-
|--------|--------|
|
|
361
|
-
| o | idle |
|
|
362
|
-
| - | running |
|
|
363
|
-
| + | completed |
|
|
364
|
-
| x | failed |
|
|
365
|
-
| / | cancelled |
|
|
366
|
-
|
|
367
|
-
## Error Handling
|
|
368
|
-
|
|
369
|
-
Errors in `@Step` methods are wrapped in `WorkflowError` with full context:
|
|
370
|
-
|
|
371
|
-
```typescript
|
|
372
|
-
import { WorkflowError } from 'groundswell';
|
|
373
|
-
|
|
374
|
-
class MyWorkflow extends Workflow {
|
|
375
|
-
@ObservedState()
|
|
376
|
-
currentItem = '';
|
|
377
|
-
|
|
378
|
-
@Step({ snapshotState: true })
|
|
379
|
-
async process(): Promise<void> {
|
|
380
|
-
this.currentItem = 'item-1';
|
|
381
|
-
throw new Error('Processing failed');
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
async run(): Promise<void> {
|
|
385
|
-
try {
|
|
386
|
-
await this.process();
|
|
387
|
-
} catch (error) {
|
|
388
|
-
const wfError = error as WorkflowError;
|
|
389
|
-
|
|
390
|
-
console.log(wfError.message); // 'Processing failed'
|
|
391
|
-
console.log(wfError.workflowId); // workflow ID
|
|
392
|
-
console.log(wfError.state); // { currentItem: 'item-1' }
|
|
393
|
-
console.log(wfError.logs); // logs up to error
|
|
394
|
-
console.log(wfError.stack); // stack trace
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
### Retry Pattern
|
|
401
|
-
|
|
402
|
-
```typescript
|
|
403
|
-
class RetryWorkflow extends Workflow {
|
|
404
|
-
@ObservedState()
|
|
405
|
-
attempt = 0;
|
|
406
|
-
|
|
407
|
-
@Step()
|
|
408
|
-
async unreliableOperation(): Promise<void> {
|
|
409
|
-
this.attempt++;
|
|
410
|
-
if (this.attempt < 3) {
|
|
411
|
-
throw new Error('Temporary failure');
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
async run(): Promise<void> {
|
|
416
|
-
const maxAttempts = 3;
|
|
417
|
-
|
|
418
|
-
while (this.attempt < maxAttempts) {
|
|
419
|
-
try {
|
|
420
|
-
await this.unreliableOperation();
|
|
421
|
-
break;
|
|
422
|
-
} catch (error) {
|
|
423
|
-
if (this.attempt >= maxAttempts) throw error;
|
|
424
|
-
await this.delay(1000 * this.attempt); // backoff
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
private delay(ms: number): Promise<void> {
|
|
430
|
-
return new Promise(r => setTimeout(r, ms));
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
### Error Isolation
|
|
436
|
-
|
|
437
|
-
Parent workflows can catch and handle child errors:
|
|
438
|
-
|
|
439
|
-
```typescript
|
|
440
|
-
class ResilientParent extends Workflow {
|
|
441
|
-
async run(): Promise<void> {
|
|
442
|
-
for (const config of this.childConfigs) {
|
|
443
|
-
const child = new ChildWorkflow(config, this);
|
|
444
|
-
|
|
445
|
-
try {
|
|
446
|
-
await child.run();
|
|
447
|
-
} catch (error) {
|
|
448
|
-
this.logger.warn(`Child failed: ${error.message}`);
|
|
449
|
-
// Continue with other children
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
## Concurrent Execution
|
|
457
|
-
|
|
458
|
-
### Sequential (default)
|
|
459
|
-
|
|
460
|
-
```typescript
|
|
461
|
-
for (const item of items) {
|
|
462
|
-
const worker = await this.createWorker(item);
|
|
463
|
-
await worker.run(); // waits for each
|
|
464
|
-
}
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
### Parallel with @Task
|
|
468
|
-
|
|
469
|
-
```typescript
|
|
470
|
-
@Task({ concurrent: true })
|
|
471
|
-
async createWorkers(): Promise<Worker[]> {
|
|
472
|
-
return items.map(item => new Worker(item, this));
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
// All workers run in parallel when method completes
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
### Manual Parallel
|
|
479
|
-
|
|
480
|
-
```typescript
|
|
481
|
-
const workers = await Promise.all(
|
|
482
|
-
items.map(item => this.createWorker(item))
|
|
483
|
-
);
|
|
484
|
-
|
|
485
|
-
const results = await Promise.all(
|
|
486
|
-
workers.map(w => w.run())
|
|
487
|
-
);
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
### Fan-Out / Fan-In
|
|
491
|
-
|
|
492
|
-
```typescript
|
|
493
|
-
class Pipeline extends Workflow {
|
|
494
|
-
@Step()
|
|
495
|
-
async fanOut(): Promise<string[]> {
|
|
496
|
-
const workers = this.items.map(
|
|
497
|
-
item => new Worker(item, this)
|
|
498
|
-
);
|
|
499
|
-
|
|
500
|
-
// Run all in parallel
|
|
501
|
-
return Promise.all(workers.map(w => w.run()));
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
@Step()
|
|
505
|
-
async fanIn(results: string[]): Promise<void> {
|
|
506
|
-
this.aggregatedResult = results.join(',');
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
async run(): Promise<void> {
|
|
510
|
-
const results = await this.fanOut();
|
|
511
|
-
await this.fanIn(results);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
```
|
|
515
|
-
|
|
516
|
-
## API Reference
|
|
517
|
-
|
|
518
|
-
### Workflow Class
|
|
519
|
-
|
|
520
|
-
```typescript
|
|
521
|
-
class Workflow<T = unknown> {
|
|
522
|
-
readonly id: string;
|
|
523
|
-
parent: Workflow | null;
|
|
524
|
-
children: Workflow[];
|
|
525
|
-
status: WorkflowStatus;
|
|
526
|
-
|
|
527
|
-
constructor(name?: string, parent?: Workflow);
|
|
528
|
-
constructor(config: WorkflowConfig, executor: WorkflowExecutor<T>);
|
|
529
|
-
|
|
530
|
-
run(...args: unknown[]): Promise<T | WorkflowResult<T>>;
|
|
531
|
-
|
|
532
|
-
protected setStatus(status: WorkflowStatus): void;
|
|
533
|
-
protected readonly logger: WorkflowLogger;
|
|
534
|
-
|
|
535
|
-
addObserver(observer: WorkflowObserver): void;
|
|
536
|
-
removeObserver(observer: WorkflowObserver): void;
|
|
537
|
-
attachChild(child: Workflow): void;
|
|
538
|
-
snapshotState(): void;
|
|
539
|
-
getNode(): WorkflowNode;
|
|
540
|
-
emitEvent(event: WorkflowEvent): void;
|
|
541
|
-
}
|
|
542
|
-
```
|
|
543
|
-
|
|
544
|
-
### Types
|
|
545
|
-
|
|
546
|
-
```typescript
|
|
547
|
-
type WorkflowStatus = 'idle' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
548
|
-
|
|
549
|
-
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
550
|
-
|
|
551
|
-
interface WorkflowConfig {
|
|
552
|
-
name?: string;
|
|
553
|
-
enableReflection?: boolean;
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
interface WorkflowResult<T> {
|
|
557
|
-
data: T;
|
|
558
|
-
node: WorkflowNode;
|
|
559
|
-
duration: number;
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
interface LogEntry {
|
|
563
|
-
id: string;
|
|
564
|
-
workflowId: string;
|
|
565
|
-
timestamp: number;
|
|
566
|
-
level: LogLevel;
|
|
567
|
-
message: string;
|
|
568
|
-
data?: unknown;
|
|
569
|
-
parentLogId?: string;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
interface WorkflowError {
|
|
573
|
-
message: string;
|
|
574
|
-
original: unknown;
|
|
575
|
-
workflowId: string;
|
|
576
|
-
stack?: string;
|
|
577
|
-
state: Record<string, unknown>;
|
|
578
|
-
logs: LogEntry[];
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
interface WorkflowNode {
|
|
582
|
-
id: string;
|
|
583
|
-
name: string;
|
|
584
|
-
parent: WorkflowNode | null;
|
|
585
|
-
children: WorkflowNode[];
|
|
586
|
-
status: WorkflowStatus;
|
|
587
|
-
logs: LogEntry[];
|
|
588
|
-
events: WorkflowEvent[];
|
|
589
|
-
stateSnapshot: Record<string, unknown> | null;
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
interface WorkflowObserver {
|
|
593
|
-
onLog(entry: LogEntry): void;
|
|
594
|
-
onEvent(event: WorkflowEvent): void;
|
|
595
|
-
onStateUpdated(node: WorkflowNode): void;
|
|
596
|
-
onTreeChanged(root: WorkflowNode): void;
|
|
597
|
-
}
|
|
598
|
-
```
|
|
599
|
-
|
|
600
|
-
See [examples/07-agent-loops.ts](../examples/examples/07-agent-loops.ts) for workflow usage with agents.
|