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
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WorkflowContextImpl - Implementation of functional workflow context
|
|
3
|
-
*
|
|
4
|
-
* Provides step(), spawnWorkflow(), and automatic context propagation
|
|
5
|
-
* for agents and prompts executed within workflows.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type {
|
|
9
|
-
WorkflowContext,
|
|
10
|
-
EventTreeHandle,
|
|
11
|
-
ReflectionAPI,
|
|
12
|
-
AgentLike,
|
|
13
|
-
PromptLike,
|
|
14
|
-
} from '../types/workflow-context.js';
|
|
15
|
-
import type {
|
|
16
|
-
WorkflowNode,
|
|
17
|
-
WorkflowEvent,
|
|
18
|
-
ReflectionConfig,
|
|
19
|
-
ReflectionContext,
|
|
20
|
-
} from '../types/index.js';
|
|
21
|
-
import { EventTreeHandleImpl, createEventTreeHandle } from './event-tree.js';
|
|
22
|
-
import {
|
|
23
|
-
runInContext,
|
|
24
|
-
type AgentExecutionContext,
|
|
25
|
-
} from './context.js';
|
|
26
|
-
import { generateId } from '../utils/id.js';
|
|
27
|
-
import { ReflectionManager } from '../reflection/reflection.js';
|
|
28
|
-
import { createReflectionConfig } from '../types/index.js';
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Interface for workflow-like objects that can emit events
|
|
32
|
-
*/
|
|
33
|
-
interface WorkflowLike {
|
|
34
|
-
id: string;
|
|
35
|
-
node: WorkflowNode;
|
|
36
|
-
emitEvent(event: WorkflowEvent): void;
|
|
37
|
-
setStatus(status: 'idle' | 'running' | 'completed' | 'failed' | 'cancelled'): void;
|
|
38
|
-
attachChild(child: WorkflowLike): void;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* WorkflowContext implementation
|
|
43
|
-
*/
|
|
44
|
-
export class WorkflowContextImpl implements WorkflowContext {
|
|
45
|
-
public readonly workflowId: string;
|
|
46
|
-
public readonly parentWorkflowId?: string;
|
|
47
|
-
public readonly eventTree: EventTreeHandle;
|
|
48
|
-
public readonly reflection: ReflectionAPI;
|
|
49
|
-
|
|
50
|
-
private workflow: WorkflowLike;
|
|
51
|
-
private eventTreeImpl: EventTreeHandleImpl;
|
|
52
|
-
private reflectionManager: ReflectionManager;
|
|
53
|
-
|
|
54
|
-
constructor(
|
|
55
|
-
workflow: WorkflowLike,
|
|
56
|
-
parentWorkflowId?: string,
|
|
57
|
-
reflectionConfig?: Partial<ReflectionConfig>
|
|
58
|
-
) {
|
|
59
|
-
this.workflowId = workflow.id;
|
|
60
|
-
this.parentWorkflowId = parentWorkflowId;
|
|
61
|
-
this.workflow = workflow;
|
|
62
|
-
|
|
63
|
-
// Create event tree handle
|
|
64
|
-
this.eventTreeImpl = new EventTreeHandleImpl(workflow.node);
|
|
65
|
-
this.eventTree = this.eventTreeImpl;
|
|
66
|
-
|
|
67
|
-
// Create reflection manager with config
|
|
68
|
-
const config = createReflectionConfig(reflectionConfig);
|
|
69
|
-
this.reflectionManager = new ReflectionManager(config);
|
|
70
|
-
this.reflectionManager.setEventEmitter((event) => this.workflow.emitEvent(event));
|
|
71
|
-
this.reflection = this.reflectionManager;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Execute a named step with automatic context propagation and reflection support
|
|
76
|
-
*/
|
|
77
|
-
async step<T>(name: string, fn: () => Promise<T>): Promise<T> {
|
|
78
|
-
const maxAttempts = this.reflectionManager.isEnabled()
|
|
79
|
-
? this.reflectionManager.getMaxAttempts()
|
|
80
|
-
: 1;
|
|
81
|
-
|
|
82
|
-
let lastError: Error | null = null;
|
|
83
|
-
|
|
84
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
85
|
-
const startTime = Date.now();
|
|
86
|
-
|
|
87
|
-
// Create step node
|
|
88
|
-
const stepNode: WorkflowNode = {
|
|
89
|
-
id: generateId(),
|
|
90
|
-
name: attempt > 1 ? `${name} (retry ${attempt - 1})` : name,
|
|
91
|
-
parent: this.workflow.node,
|
|
92
|
-
children: [],
|
|
93
|
-
status: 'running',
|
|
94
|
-
logs: [],
|
|
95
|
-
events: [],
|
|
96
|
-
stateSnapshot: null,
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
// Attach to parent
|
|
100
|
-
this.workflow.node.children.push(stepNode);
|
|
101
|
-
|
|
102
|
-
// Emit step start
|
|
103
|
-
this.workflow.emitEvent({
|
|
104
|
-
type: 'stepStart',
|
|
105
|
-
node: stepNode,
|
|
106
|
-
step: name,
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
// Create execution context for this step
|
|
110
|
-
const executionContext: AgentExecutionContext = {
|
|
111
|
-
workflowNode: stepNode,
|
|
112
|
-
emitEvent: (event: WorkflowEvent) => {
|
|
113
|
-
stepNode.events.push(event);
|
|
114
|
-
this.workflow.emitEvent(event);
|
|
115
|
-
},
|
|
116
|
-
workflowId: this.workflowId,
|
|
117
|
-
parentWorkflowId: this.parentWorkflowId,
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
try {
|
|
121
|
-
// Execute function in context
|
|
122
|
-
const result = await runInContext(executionContext, fn);
|
|
123
|
-
|
|
124
|
-
// Update step node status
|
|
125
|
-
stepNode.status = 'completed';
|
|
126
|
-
|
|
127
|
-
// Emit step end
|
|
128
|
-
const duration = Date.now() - startTime;
|
|
129
|
-
this.workflow.emitEvent({
|
|
130
|
-
type: 'stepEnd',
|
|
131
|
-
node: stepNode,
|
|
132
|
-
step: name,
|
|
133
|
-
duration,
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
// Rebuild event tree
|
|
137
|
-
this.eventTreeImpl.rebuild(this.workflow.node);
|
|
138
|
-
|
|
139
|
-
// If we succeeded after a reflection, mark it as successful
|
|
140
|
-
if (attempt > 1) {
|
|
141
|
-
this.reflectionManager.markLastReflectionSuccessful();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return result;
|
|
145
|
-
} catch (error) {
|
|
146
|
-
lastError = error as Error;
|
|
147
|
-
|
|
148
|
-
// Update step node status
|
|
149
|
-
stepNode.status = 'failed';
|
|
150
|
-
|
|
151
|
-
// Emit error event
|
|
152
|
-
this.workflow.emitEvent({
|
|
153
|
-
type: 'error',
|
|
154
|
-
node: stepNode,
|
|
155
|
-
error: {
|
|
156
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
157
|
-
original: error,
|
|
158
|
-
workflowId: this.workflowId,
|
|
159
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
160
|
-
state: {},
|
|
161
|
-
logs: [],
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
// Rebuild event tree
|
|
166
|
-
this.eventTreeImpl.rebuild(this.workflow.node);
|
|
167
|
-
|
|
168
|
-
// Check if we should try reflection
|
|
169
|
-
if (!this.reflectionManager.isEnabled() || attempt === maxAttempts) {
|
|
170
|
-
throw error;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Try reflection
|
|
174
|
-
const reflectionContext: ReflectionContext = {
|
|
175
|
-
level: 'workflow',
|
|
176
|
-
failedNode: stepNode,
|
|
177
|
-
error: lastError,
|
|
178
|
-
attemptNumber: attempt,
|
|
179
|
-
previousAttempts: this.reflectionManager.getReflectionHistory(),
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
const reflectionResult = await this.reflectionManager.reflect(reflectionContext);
|
|
183
|
-
|
|
184
|
-
if (!reflectionResult.shouldRetry) {
|
|
185
|
-
throw lastError;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Continue to next iteration for retry
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
throw lastError ?? new Error('Max reflection attempts exceeded');
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Spawn a child workflow
|
|
197
|
-
*/
|
|
198
|
-
async spawnWorkflow<T>(workflow: { run(): Promise<T>; id?: string; node?: WorkflowNode }): Promise<T> {
|
|
199
|
-
// If workflow has attachChild-like capability, use it
|
|
200
|
-
if ('node' in workflow && workflow.node) {
|
|
201
|
-
// Set parent reference
|
|
202
|
-
workflow.node.parent = this.workflow.node;
|
|
203
|
-
|
|
204
|
-
// Attach child node
|
|
205
|
-
this.workflow.node.children.push(workflow.node);
|
|
206
|
-
|
|
207
|
-
// Emit child attached event
|
|
208
|
-
this.workflow.emitEvent({
|
|
209
|
-
type: 'childAttached',
|
|
210
|
-
parentId: this.workflowId,
|
|
211
|
-
child: workflow.node,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Run the child workflow
|
|
216
|
-
const result = await workflow.run();
|
|
217
|
-
|
|
218
|
-
// Rebuild event tree
|
|
219
|
-
this.eventTreeImpl.rebuild(this.workflow.node);
|
|
220
|
-
|
|
221
|
-
return result;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Replace the last prompt result with a new one (context revision)
|
|
226
|
-
* The previous prompt node is marked as 'revised' and the new result is attached as sibling
|
|
227
|
-
*/
|
|
228
|
-
async replaceLastPromptResult<T>(
|
|
229
|
-
newPrompt: PromptLike<T>,
|
|
230
|
-
agent: AgentLike
|
|
231
|
-
): Promise<T> {
|
|
232
|
-
// Find the last completed prompt node in the tree
|
|
233
|
-
const children = this.workflow.node.children;
|
|
234
|
-
let lastPromptNodeIndex = -1;
|
|
235
|
-
|
|
236
|
-
for (let i = children.length - 1; i >= 0; i--) {
|
|
237
|
-
const child = children[i];
|
|
238
|
-
if (child.status === 'completed') {
|
|
239
|
-
lastPromptNodeIndex = i;
|
|
240
|
-
break;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Create a revision node to mark the replacement
|
|
245
|
-
const revisionNode: WorkflowNode = {
|
|
246
|
-
id: generateId(),
|
|
247
|
-
name: `revision:${newPrompt.id}`,
|
|
248
|
-
parent: this.workflow.node,
|
|
249
|
-
children: [],
|
|
250
|
-
status: 'running',
|
|
251
|
-
logs: [],
|
|
252
|
-
events: [],
|
|
253
|
-
stateSnapshot: null,
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
// If we found a previous node, mark it as revised
|
|
257
|
-
if (lastPromptNodeIndex >= 0) {
|
|
258
|
-
const previousNode = children[lastPromptNodeIndex];
|
|
259
|
-
// Mark as revised by adding a special status flag in logs
|
|
260
|
-
previousNode.logs.push({
|
|
261
|
-
id: generateId(),
|
|
262
|
-
workflowId: this.workflowId,
|
|
263
|
-
level: 'info',
|
|
264
|
-
message: `Revised by ${revisionNode.id}`,
|
|
265
|
-
timestamp: Date.now(),
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Attach revision node as sibling (at same level)
|
|
270
|
-
this.workflow.node.children.push(revisionNode);
|
|
271
|
-
|
|
272
|
-
// Emit prompt revision event
|
|
273
|
-
this.workflow.emitEvent({
|
|
274
|
-
type: 'stepStart',
|
|
275
|
-
node: revisionNode,
|
|
276
|
-
step: `revision:${newPrompt.id}`,
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
// Create execution context for this revision
|
|
280
|
-
const executionContext: AgentExecutionContext = {
|
|
281
|
-
workflowNode: revisionNode,
|
|
282
|
-
emitEvent: (event: WorkflowEvent) => {
|
|
283
|
-
revisionNode.events.push(event);
|
|
284
|
-
this.workflow.emitEvent(event);
|
|
285
|
-
},
|
|
286
|
-
workflowId: this.workflowId,
|
|
287
|
-
parentWorkflowId: this.parentWorkflowId,
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
try {
|
|
291
|
-
// Execute the new prompt in context
|
|
292
|
-
const result = await runInContext(executionContext, () =>
|
|
293
|
-
agent.prompt(newPrompt)
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
// Update revision node status
|
|
297
|
-
revisionNode.status = 'completed';
|
|
298
|
-
|
|
299
|
-
// Emit completion event
|
|
300
|
-
this.workflow.emitEvent({
|
|
301
|
-
type: 'stepEnd',
|
|
302
|
-
node: revisionNode,
|
|
303
|
-
step: `revision:${newPrompt.id}`,
|
|
304
|
-
duration: 0, // Could track actual duration if needed
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
// Rebuild event tree
|
|
308
|
-
this.eventTreeImpl.rebuild(this.workflow.node);
|
|
309
|
-
|
|
310
|
-
return result;
|
|
311
|
-
} catch (error) {
|
|
312
|
-
// Update revision node status
|
|
313
|
-
revisionNode.status = 'failed';
|
|
314
|
-
|
|
315
|
-
// Emit error event
|
|
316
|
-
this.workflow.emitEvent({
|
|
317
|
-
type: 'error',
|
|
318
|
-
node: revisionNode,
|
|
319
|
-
error: {
|
|
320
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
321
|
-
original: error,
|
|
322
|
-
workflowId: this.workflowId,
|
|
323
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
324
|
-
state: {},
|
|
325
|
-
logs: [],
|
|
326
|
-
},
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
// Rebuild event tree
|
|
330
|
-
this.eventTreeImpl.rebuild(this.workflow.node);
|
|
331
|
-
|
|
332
|
-
throw error;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Create a WorkflowContext for a workflow
|
|
339
|
-
* @param workflow The workflow object
|
|
340
|
-
* @param parentWorkflowId Optional parent workflow ID
|
|
341
|
-
* @param reflectionConfig Optional reflection configuration
|
|
342
|
-
*/
|
|
343
|
-
export function createWorkflowContext(
|
|
344
|
-
workflow: WorkflowLike,
|
|
345
|
-
parentWorkflowId?: string,
|
|
346
|
-
reflectionConfig?: Partial<ReflectionConfig>
|
|
347
|
-
): WorkflowContext {
|
|
348
|
-
return new WorkflowContextImpl(workflow, parentWorkflowId, reflectionConfig);
|
|
349
|
-
}
|
package/src/core/workflow.ts
DELETED
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
WorkflowNode,
|
|
3
|
-
WorkflowStatus,
|
|
4
|
-
WorkflowEvent,
|
|
5
|
-
WorkflowObserver,
|
|
6
|
-
} from '../types/index.js';
|
|
7
|
-
import type { WorkflowContext, WorkflowConfig, WorkflowResult } from '../types/workflow-context.js';
|
|
8
|
-
import { generateId } from '../utils/id.js';
|
|
9
|
-
import { WorkflowLogger } from './logger.js';
|
|
10
|
-
import { getObservedState } from '../decorators/observed-state.js';
|
|
11
|
-
import { createWorkflowContext } from './workflow-context.js';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Executor function type for functional workflows
|
|
15
|
-
*/
|
|
16
|
-
export type WorkflowExecutor<T = unknown> = (ctx: WorkflowContext) => Promise<T>;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Base class for all workflows
|
|
20
|
-
* Supports both class-based (subclass with run()) and functional (executor) patterns
|
|
21
|
-
*
|
|
22
|
-
* @example Class-based pattern:
|
|
23
|
-
* ```ts
|
|
24
|
-
* class MyWorkflow extends Workflow {
|
|
25
|
-
* async run() {
|
|
26
|
-
* this.setStatus('running');
|
|
27
|
-
* // workflow logic
|
|
28
|
-
* this.setStatus('completed');
|
|
29
|
-
* }
|
|
30
|
-
* }
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* @example Functional pattern:
|
|
34
|
-
* ```ts
|
|
35
|
-
* const workflow = new Workflow({ name: 'MyWorkflow' }, async (ctx) => {
|
|
36
|
-
* await ctx.step('step1', async () => {
|
|
37
|
-
* // step logic
|
|
38
|
-
* });
|
|
39
|
-
* });
|
|
40
|
-
* await workflow.run();
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
export class Workflow<T = unknown> {
|
|
44
|
-
/** Unique identifier for this workflow instance */
|
|
45
|
-
public readonly id: string;
|
|
46
|
-
|
|
47
|
-
/** Parent workflow (null for root workflows) */
|
|
48
|
-
public parent: Workflow | null = null;
|
|
49
|
-
|
|
50
|
-
/** Child workflows */
|
|
51
|
-
public children: Workflow[] = [];
|
|
52
|
-
|
|
53
|
-
/** Current execution status */
|
|
54
|
-
public status: WorkflowStatus = 'idle';
|
|
55
|
-
|
|
56
|
-
/** Logger instance for this workflow */
|
|
57
|
-
protected readonly logger: WorkflowLogger;
|
|
58
|
-
|
|
59
|
-
/** The node representation of this workflow */
|
|
60
|
-
protected readonly node: WorkflowNode;
|
|
61
|
-
|
|
62
|
-
/** Observers (only populated on root workflow) */
|
|
63
|
-
private observers: WorkflowObserver[] = [];
|
|
64
|
-
|
|
65
|
-
/** Optional executor function for functional workflows */
|
|
66
|
-
private executor?: WorkflowExecutor<T>;
|
|
67
|
-
|
|
68
|
-
/** Workflow configuration */
|
|
69
|
-
private config: WorkflowConfig;
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Create a new workflow instance
|
|
73
|
-
*
|
|
74
|
-
* @overload Class-based pattern
|
|
75
|
-
* @param name Human-readable name (defaults to class name)
|
|
76
|
-
* @param parent Optional parent workflow
|
|
77
|
-
*
|
|
78
|
-
* @overload Functional pattern
|
|
79
|
-
* @param config Workflow configuration
|
|
80
|
-
* @param executor Executor function
|
|
81
|
-
*/
|
|
82
|
-
constructor(name?: string | WorkflowConfig, parentOrExecutor?: Workflow | WorkflowExecutor<T>) {
|
|
83
|
-
this.id = generateId();
|
|
84
|
-
|
|
85
|
-
// Parse overloaded arguments
|
|
86
|
-
if (typeof name === 'object' && name !== null) {
|
|
87
|
-
// Functional pattern: constructor(config, executor)
|
|
88
|
-
this.config = name;
|
|
89
|
-
this.executor = parentOrExecutor as WorkflowExecutor<T>;
|
|
90
|
-
this.parent = null;
|
|
91
|
-
} else {
|
|
92
|
-
// Class-based pattern: constructor(name, parent)
|
|
93
|
-
this.config = { name: name ?? this.constructor.name };
|
|
94
|
-
this.parent = (parentOrExecutor as Workflow) ?? null;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Create the node representation
|
|
98
|
-
this.node = {
|
|
99
|
-
id: this.id,
|
|
100
|
-
name: this.config.name ?? this.constructor.name,
|
|
101
|
-
parent: this.parent?.node ?? null,
|
|
102
|
-
children: [],
|
|
103
|
-
status: 'idle',
|
|
104
|
-
logs: [],
|
|
105
|
-
events: [],
|
|
106
|
-
stateSnapshot: null,
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
// Create logger with root observers
|
|
110
|
-
this.logger = new WorkflowLogger(this.node, this.getRootObservers());
|
|
111
|
-
|
|
112
|
-
// Attach to parent if provided
|
|
113
|
-
if (this.parent) {
|
|
114
|
-
this.parent.attachChild(this);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Get observers from the root workflow
|
|
120
|
-
* Traverses up the tree to find the root
|
|
121
|
-
*/
|
|
122
|
-
private getRootObservers(): WorkflowObserver[] {
|
|
123
|
-
if (this.parent) {
|
|
124
|
-
return this.parent.getRootObservers();
|
|
125
|
-
}
|
|
126
|
-
return this.observers;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Get the root workflow
|
|
131
|
-
*/
|
|
132
|
-
protected getRoot(): Workflow {
|
|
133
|
-
if (this.parent) {
|
|
134
|
-
return this.parent.getRoot();
|
|
135
|
-
}
|
|
136
|
-
return this;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Add an observer to this workflow (must be root)
|
|
141
|
-
* @throws Error if called on non-root workflow
|
|
142
|
-
*/
|
|
143
|
-
public addObserver(observer: WorkflowObserver): void {
|
|
144
|
-
if (this.parent) {
|
|
145
|
-
throw new Error('Observers can only be added to root workflows');
|
|
146
|
-
}
|
|
147
|
-
this.observers.push(observer);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Remove an observer from this workflow
|
|
152
|
-
*/
|
|
153
|
-
public removeObserver(observer: WorkflowObserver): void {
|
|
154
|
-
const index = this.observers.indexOf(observer);
|
|
155
|
-
if (index !== -1) {
|
|
156
|
-
this.observers.splice(index, 1);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Attach a child workflow
|
|
162
|
-
* Called automatically in constructor when parent is provided
|
|
163
|
-
*/
|
|
164
|
-
public attachChild(child: Workflow): void {
|
|
165
|
-
this.children.push(child);
|
|
166
|
-
this.node.children.push(child.node);
|
|
167
|
-
|
|
168
|
-
// Emit child attached event
|
|
169
|
-
this.emitEvent({
|
|
170
|
-
type: 'childAttached',
|
|
171
|
-
parentId: this.id,
|
|
172
|
-
child: child.node,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Emit an event to all root observers
|
|
178
|
-
*/
|
|
179
|
-
public emitEvent(event: WorkflowEvent): void {
|
|
180
|
-
this.node.events.push(event);
|
|
181
|
-
|
|
182
|
-
const observers = this.getRootObservers();
|
|
183
|
-
for (const obs of observers) {
|
|
184
|
-
try {
|
|
185
|
-
obs.onEvent(event);
|
|
186
|
-
|
|
187
|
-
// Also notify tree changed for tree update events
|
|
188
|
-
if (event.type === 'treeUpdated' || event.type === 'childAttached') {
|
|
189
|
-
obs.onTreeChanged(this.getRoot().node);
|
|
190
|
-
}
|
|
191
|
-
} catch (err) {
|
|
192
|
-
console.error('Observer onEvent error:', err);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Capture and emit a state snapshot
|
|
199
|
-
*/
|
|
200
|
-
public snapshotState(): void {
|
|
201
|
-
const snapshot = getObservedState(this);
|
|
202
|
-
this.node.stateSnapshot = snapshot;
|
|
203
|
-
|
|
204
|
-
// Notify observers
|
|
205
|
-
const observers = this.getRootObservers();
|
|
206
|
-
for (const obs of observers) {
|
|
207
|
-
try {
|
|
208
|
-
obs.onStateUpdated(this.node);
|
|
209
|
-
} catch (err) {
|
|
210
|
-
console.error('Observer onStateUpdated error:', err);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Emit snapshot event
|
|
215
|
-
this.emitEvent({
|
|
216
|
-
type: 'stateSnapshot',
|
|
217
|
-
node: this.node,
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Update workflow status and sync with node
|
|
223
|
-
*/
|
|
224
|
-
public setStatus(status: WorkflowStatus): void {
|
|
225
|
-
this.status = status;
|
|
226
|
-
this.node.status = status;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Get the node representation of this workflow
|
|
231
|
-
*/
|
|
232
|
-
public getNode(): WorkflowNode {
|
|
233
|
-
return this.node;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/**
|
|
237
|
-
* Run the workflow
|
|
238
|
-
*
|
|
239
|
-
* For functional workflows (created with executor), runs the executor function.
|
|
240
|
-
* For class-based workflows (subclasses), this should be overridden.
|
|
241
|
-
*
|
|
242
|
-
* @returns Workflow result
|
|
243
|
-
*/
|
|
244
|
-
public async run(..._args: unknown[]): Promise<T | WorkflowResult<T>> {
|
|
245
|
-
if (this.executor) {
|
|
246
|
-
return this.runFunctional();
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// Class-based workflows must override this method
|
|
250
|
-
throw new Error(
|
|
251
|
-
'Workflow.run() must be overridden in subclass or provide executor in constructor'
|
|
252
|
-
);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Run a functional workflow with context
|
|
257
|
-
*/
|
|
258
|
-
private async runFunctional(): Promise<WorkflowResult<T>> {
|
|
259
|
-
if (!this.executor) {
|
|
260
|
-
throw new Error('No executor provided');
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
const startTime = Date.now();
|
|
264
|
-
this.setStatus('running');
|
|
265
|
-
|
|
266
|
-
// Create workflow context
|
|
267
|
-
const ctx = createWorkflowContext(
|
|
268
|
-
this as unknown as Parameters<typeof createWorkflowContext>[0],
|
|
269
|
-
this.parent?.id,
|
|
270
|
-
this.config.enableReflection ? { enabled: true } : undefined
|
|
271
|
-
);
|
|
272
|
-
|
|
273
|
-
try {
|
|
274
|
-
const result = await this.executor(ctx);
|
|
275
|
-
this.setStatus('completed');
|
|
276
|
-
|
|
277
|
-
return {
|
|
278
|
-
data: result,
|
|
279
|
-
node: this.node,
|
|
280
|
-
duration: Date.now() - startTime,
|
|
281
|
-
};
|
|
282
|
-
} catch (error) {
|
|
283
|
-
this.setStatus('failed');
|
|
284
|
-
|
|
285
|
-
// Emit error event
|
|
286
|
-
this.emitEvent({
|
|
287
|
-
type: 'error',
|
|
288
|
-
node: this.node,
|
|
289
|
-
error: {
|
|
290
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
291
|
-
original: error,
|
|
292
|
-
workflowId: this.id,
|
|
293
|
-
stack: error instanceof Error ? error.stack : undefined,
|
|
294
|
-
state: {},
|
|
295
|
-
logs: [],
|
|
296
|
-
},
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
throw error;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|