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,543 +0,0 @@
|
|
|
1
|
-
# **📘 PRODUCT REQUIREMENTS DOCUMENT (PRD)**
|
|
2
|
-
|
|
3
|
-
### **Hierarchical Workflow Engine with Full Observability & Tree Debugging**
|
|
4
|
-
|
|
5
|
-
Version: **1.0**
|
|
6
|
-
Status: **Implementation-ready**
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# **1. Overview**
|
|
11
|
-
|
|
12
|
-
This PRD defines a TypeScript workflow orchestration engine that provides:
|
|
13
|
-
|
|
14
|
-
* Hierarchical workflows with sequential + concurrent steps.
|
|
15
|
-
* Automatic parent/child attachment.
|
|
16
|
-
* High-resolution observability (logs, events, snapshots).
|
|
17
|
-
* Error introspection with full child state visibility.
|
|
18
|
-
* Restart logic handled at correct parent level.
|
|
19
|
-
* Real-time tree debugger API for terminal visualization.
|
|
20
|
-
|
|
21
|
-
All logs & events must form a **perfect 1:1 tree mirror** of the workflow execution tree in memory.
|
|
22
|
-
|
|
23
|
-
This PRD includes:
|
|
24
|
-
|
|
25
|
-
✔️ Full data model
|
|
26
|
-
✔️ All TypeScript interfaces
|
|
27
|
-
✔️ Decorator specs
|
|
28
|
-
✔️ Workflow base class skeleton
|
|
29
|
-
✔️ Logger implementation skeleton
|
|
30
|
-
✔️ Observer/event system skeleton
|
|
31
|
-
✔️ Snapshot system spec
|
|
32
|
-
✔️ Error/restart semantics
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
# **2. Architecture**
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
Workflow
|
|
40
|
-
├─ Steps (decorated methods)
|
|
41
|
-
├─ Tasks (decorated methods)
|
|
42
|
-
├─ Observed state (decorated fields)
|
|
43
|
-
├─ Children (other workflows)
|
|
44
|
-
├─ Logs
|
|
45
|
-
└─ Events
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
The tree debugger subscribes to a root workflow and receives real-time events.
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
# **3. Core Data Model (Interfaces)**
|
|
53
|
-
|
|
54
|
-
## **3.1 WorkflowNode**
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
export interface WorkflowNode {
|
|
58
|
-
id: string;
|
|
59
|
-
name: string;
|
|
60
|
-
|
|
61
|
-
parent: WorkflowNode | null;
|
|
62
|
-
children: WorkflowNode[];
|
|
63
|
-
|
|
64
|
-
status: WorkflowStatus;
|
|
65
|
-
|
|
66
|
-
logs: LogEntry[];
|
|
67
|
-
events: WorkflowEvent[];
|
|
68
|
-
|
|
69
|
-
// optional state snapshot
|
|
70
|
-
stateSnapshot: SerializedWorkflowState | null;
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## **3.2 WorkflowStatus**
|
|
75
|
-
|
|
76
|
-
```ts
|
|
77
|
-
export type WorkflowStatus =
|
|
78
|
-
| 'idle'
|
|
79
|
-
| 'running'
|
|
80
|
-
| 'completed'
|
|
81
|
-
| 'failed'
|
|
82
|
-
| 'cancelled';
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
# **4. Logging & Events Model**
|
|
88
|
-
|
|
89
|
-
## **4.1 LogEntry**
|
|
90
|
-
|
|
91
|
-
```ts
|
|
92
|
-
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
93
|
-
|
|
94
|
-
export interface LogEntry {
|
|
95
|
-
id: string;
|
|
96
|
-
workflowId: string;
|
|
97
|
-
timestamp: number;
|
|
98
|
-
level: LogLevel;
|
|
99
|
-
message: string;
|
|
100
|
-
data?: unknown;
|
|
101
|
-
parentLogId?: string;
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## **4.2 WorkflowEvent**
|
|
106
|
-
|
|
107
|
-
```ts
|
|
108
|
-
export type WorkflowEvent =
|
|
109
|
-
| { type: 'childAttached'; parentId: string; child: WorkflowNode }
|
|
110
|
-
| { type: 'stateSnapshot'; node: WorkflowNode }
|
|
111
|
-
| { type: 'stepStart'; node: WorkflowNode; step: string }
|
|
112
|
-
| { type: 'stepEnd'; node: WorkflowNode; step: string; duration: number }
|
|
113
|
-
| { type: 'error'; node: WorkflowNode; error: WorkflowError }
|
|
114
|
-
| { type: 'taskStart'; node: WorkflowNode; task: string }
|
|
115
|
-
| { type: 'taskEnd'; node: WorkflowNode; task: string }
|
|
116
|
-
| { type: 'treeUpdated'; root: WorkflowNode };
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
# **5. Error Model**
|
|
122
|
-
|
|
123
|
-
## **5.1 WorkflowError**
|
|
124
|
-
|
|
125
|
-
```ts
|
|
126
|
-
export interface WorkflowError {
|
|
127
|
-
message: string;
|
|
128
|
-
original: unknown;
|
|
129
|
-
workflowId: string;
|
|
130
|
-
stack?: string;
|
|
131
|
-
|
|
132
|
-
state: SerializedWorkflowState; // a snapshot
|
|
133
|
-
logs: LogEntry[]; // logs from this node only
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
# **6. Snapshot System**
|
|
140
|
-
|
|
141
|
-
## **6.1 State Snapshot**
|
|
142
|
-
|
|
143
|
-
```ts
|
|
144
|
-
export type SerializedWorkflowState = Record<string, unknown>;
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
## **6.2 ObservedState Metadata**
|
|
148
|
-
|
|
149
|
-
```ts
|
|
150
|
-
export interface StateFieldMetadata {
|
|
151
|
-
hidden?: boolean; // not shown in debugger
|
|
152
|
-
redact?: boolean; // shown as "***"
|
|
153
|
-
}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
# **7. Observers**
|
|
159
|
-
|
|
160
|
-
## **7.1 WorkflowObserver**
|
|
161
|
-
|
|
162
|
-
```ts
|
|
163
|
-
export interface WorkflowObserver {
|
|
164
|
-
onLog(entry: LogEntry): void;
|
|
165
|
-
onEvent(event: WorkflowEvent): void;
|
|
166
|
-
onStateUpdated(node: WorkflowNode): void;
|
|
167
|
-
onTreeChanged(root: WorkflowNode): void;
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
Observers attach to the **root workflow** and receive all events.
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
# **8. Decorators (Complete Technical Specification)**
|
|
176
|
-
|
|
177
|
-
## **8.1 @Step() Decorator**
|
|
178
|
-
|
|
179
|
-
```ts
|
|
180
|
-
export interface StepOptions {
|
|
181
|
-
name?: string;
|
|
182
|
-
snapshotState?: boolean;
|
|
183
|
-
trackTiming?: boolean;
|
|
184
|
-
logStart?: boolean;
|
|
185
|
-
logFinish?: boolean;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
export function Step(options: StepOptions = {}): MethodDecorator;
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
**Responsibilities:**
|
|
192
|
-
|
|
193
|
-
* Emit `stepStart` + `stepEnd`.
|
|
194
|
-
* Optionally snapshot state.
|
|
195
|
-
* Catch and wrap errors into `WorkflowError`.
|
|
196
|
-
|
|
197
|
-
---
|
|
198
|
-
|
|
199
|
-
## **8.2 @Task() Decorator**
|
|
200
|
-
|
|
201
|
-
```ts
|
|
202
|
-
export interface TaskOptions {
|
|
203
|
-
name?: string;
|
|
204
|
-
concurrent?: boolean;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export function Task(options: TaskOptions = {}): MethodDecorator;
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
**Responsibilities:**
|
|
211
|
-
|
|
212
|
-
* Emit `taskStart` + `taskEnd`
|
|
213
|
-
* Attach returned workflow(s) as children.
|
|
214
|
-
* Enforce concurrency rules.
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## **8.3 @ObservedState Decorator**
|
|
219
|
-
|
|
220
|
-
```ts
|
|
221
|
-
export function ObservedState(meta: StateFieldMetadata = {}): PropertyDecorator;
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
Fields marked with this decorator are included in snapshots.
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
# **9. Restart Semantics**
|
|
229
|
-
|
|
230
|
-
* Descendant workflows never request restart upward.
|
|
231
|
-
* A parent step decides whether restart is needed by analyzing:
|
|
232
|
-
|
|
233
|
-
* all captured `WorkflowError`s
|
|
234
|
-
* descendant state snapshots
|
|
235
|
-
* logs from failing nodes
|
|
236
|
-
* Parent step may:
|
|
237
|
-
|
|
238
|
-
1. Retry the step
|
|
239
|
-
2. Abort the workflow
|
|
240
|
-
3. Rebuild the plan and continue
|
|
241
|
-
|
|
242
|
-
Restartability is **opt-in** at the step method level; not global.
|
|
243
|
-
|
|
244
|
-
---
|
|
245
|
-
|
|
246
|
-
# **10. Optional Multi-Error Merging**
|
|
247
|
-
|
|
248
|
-
```ts
|
|
249
|
-
export interface ErrorMergeStrategy {
|
|
250
|
-
enabled: boolean;
|
|
251
|
-
maxMergeDepth?: number;
|
|
252
|
-
combine?(errors: WorkflowError[]): WorkflowError;
|
|
253
|
-
}
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
Default: **disabled** → first error wins (race is preserved).
|
|
257
|
-
|
|
258
|
-
---
|
|
259
|
-
|
|
260
|
-
# **11. Tree Debugger API**
|
|
261
|
-
|
|
262
|
-
## **11.1 Tree Debugger Interface**
|
|
263
|
-
|
|
264
|
-
```ts
|
|
265
|
-
export interface WorkflowTreeDebugger {
|
|
266
|
-
getTree(): WorkflowNode;
|
|
267
|
-
getNode(id: string): WorkflowNode | undefined;
|
|
268
|
-
|
|
269
|
-
events: Observable<WorkflowEvent>;
|
|
270
|
-
|
|
271
|
-
toTreeString(node?: WorkflowNode): string;
|
|
272
|
-
toLogString(node?: WorkflowNode): string;
|
|
273
|
-
}
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
This is consumed by the terminal UI.
|
|
277
|
-
|
|
278
|
-
---
|
|
279
|
-
|
|
280
|
-
# **12. Base Classes (Class Skeletons)**
|
|
281
|
-
|
|
282
|
-
Below are implementation-ready class skeletons with exact method signatures.
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
# **12.1 WorkflowLogger Skeleton**
|
|
287
|
-
|
|
288
|
-
```ts
|
|
289
|
-
export class WorkflowLogger {
|
|
290
|
-
constructor(private readonly node: WorkflowNode,
|
|
291
|
-
private readonly observers: WorkflowObserver[]) {}
|
|
292
|
-
|
|
293
|
-
private emit(entry: LogEntry) {
|
|
294
|
-
this.node.logs.push(entry);
|
|
295
|
-
for (const obs of this.observers) obs.onLog(entry);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
debug(message: string, data?: unknown) { /* ... */ }
|
|
299
|
-
info(message: string, data?: unknown) { /* ... */ }
|
|
300
|
-
warn(message: string, data?: unknown) { /* ... */ }
|
|
301
|
-
error(message: string, data?: unknown) { /* ... */ }
|
|
302
|
-
|
|
303
|
-
child(meta: Partial<LogEntry>): WorkflowLogger {
|
|
304
|
-
return new WorkflowLogger(this.node, this.observers);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
---
|
|
310
|
-
|
|
311
|
-
# **12.2 Workflow Base Class Skeleton**
|
|
312
|
-
|
|
313
|
-
```ts
|
|
314
|
-
export abstract class Workflow {
|
|
315
|
-
public readonly id: string;
|
|
316
|
-
public parent: Workflow | null = null;
|
|
317
|
-
public children: Workflow[] = [];
|
|
318
|
-
public status: WorkflowStatus = 'idle';
|
|
319
|
-
|
|
320
|
-
protected readonly logger: WorkflowLogger;
|
|
321
|
-
protected readonly node: WorkflowNode;
|
|
322
|
-
|
|
323
|
-
constructor(name?: string, parent?: Workflow) {
|
|
324
|
-
this.id = generateId();
|
|
325
|
-
this.parent = parent || null;
|
|
326
|
-
|
|
327
|
-
this.node = {
|
|
328
|
-
id: this.id,
|
|
329
|
-
name: name ?? this.constructor.name,
|
|
330
|
-
parent: parent?.node ?? null,
|
|
331
|
-
children: [],
|
|
332
|
-
logs: [],
|
|
333
|
-
events: [],
|
|
334
|
-
status: 'idle',
|
|
335
|
-
stateSnapshot: null,
|
|
336
|
-
};
|
|
337
|
-
|
|
338
|
-
this.logger = new WorkflowLogger(this.node, this.getRootObservers());
|
|
339
|
-
if (parent) parent.attachChild(this);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
private getRootObservers(): WorkflowObserver[] {
|
|
343
|
-
return this.parent ? this.parent.getRootObservers() : [];
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
attachChild(child: Workflow) {
|
|
347
|
-
this.children.push(child);
|
|
348
|
-
this.node.children.push(child.node);
|
|
349
|
-
this.emitEvent({ type: 'childAttached', parentId: this.id, child: child.node });
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
protected emitEvent(event: WorkflowEvent) {
|
|
353
|
-
this.node.events.push(event);
|
|
354
|
-
for (const obs of this.getRootObservers()) {
|
|
355
|
-
obs.onEvent(event);
|
|
356
|
-
if (event.type === 'treeUpdated') obs.onTreeChanged(this.node);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
snapshotState() {
|
|
361
|
-
const snapshot = createStateSnapshot(this);
|
|
362
|
-
this.node.stateSnapshot = snapshot;
|
|
363
|
-
for (const obs of this.getRootObservers()) obs.onStateUpdated(this.node);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
abstract run(...args: any[]): Promise<any>;
|
|
367
|
-
}
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
# **12.3 Decorator Skeletons**
|
|
373
|
-
|
|
374
|
-
These are implementation-level scaffolds.
|
|
375
|
-
|
|
376
|
-
### **@ObservedState**
|
|
377
|
-
|
|
378
|
-
```ts
|
|
379
|
-
const OBSERVED_STATE_FIELDS = new WeakMap<object, Map<string, StateFieldMetadata>>();
|
|
380
|
-
|
|
381
|
-
export function ObservedState(meta: StateFieldMetadata = {}): PropertyDecorator {
|
|
382
|
-
return (target, propertyKey) => {
|
|
383
|
-
let map = OBSERVED_STATE_FIELDS.get(target);
|
|
384
|
-
if (!map) {
|
|
385
|
-
map = new Map();
|
|
386
|
-
OBSERVED_STATE_FIELDS.set(target, map);
|
|
387
|
-
}
|
|
388
|
-
map.set(propertyKey.toString(), meta);
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
export function getObservedState(obj: any): SerializedWorkflowState {
|
|
393
|
-
const map = OBSERVED_STATE_FIELDS.get(Object.getPrototypeOf(obj));
|
|
394
|
-
if (!map) return {};
|
|
395
|
-
const result: SerializedWorkflowState = {};
|
|
396
|
-
for (const [key, meta] of map) {
|
|
397
|
-
let v = (obj as any)[key];
|
|
398
|
-
if (meta.redact) v = '***';
|
|
399
|
-
if (!meta.hidden) result[key] = v;
|
|
400
|
-
}
|
|
401
|
-
return result;
|
|
402
|
-
}
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
---
|
|
406
|
-
|
|
407
|
-
### **@Step**
|
|
408
|
-
|
|
409
|
-
```ts
|
|
410
|
-
export function Step(opts: StepOptions = {}): MethodDecorator {
|
|
411
|
-
return (target, prop, descriptor: PropertyDescriptor) => {
|
|
412
|
-
const original = descriptor.value;
|
|
413
|
-
|
|
414
|
-
descriptor.value = async function (...args: any[]) {
|
|
415
|
-
const wf = this as Workflow;
|
|
416
|
-
const stepName = opts.name ?? String(prop);
|
|
417
|
-
|
|
418
|
-
if (opts.logStart) wf.logger.info(`STEP START: ${stepName}`);
|
|
419
|
-
|
|
420
|
-
wf.emitEvent({ type: 'stepStart', node: wf.node, step: stepName });
|
|
421
|
-
|
|
422
|
-
let start = Date.now();
|
|
423
|
-
try {
|
|
424
|
-
const result = await original.apply(this, args);
|
|
425
|
-
|
|
426
|
-
if (opts.snapshotState) wf.snapshotState();
|
|
427
|
-
if (opts.trackTiming) {
|
|
428
|
-
const duration = Date.now() - start;
|
|
429
|
-
wf.emitEvent({ type: 'stepEnd', node: wf.node, step: stepName, duration });
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
if (opts.logFinish) wf.logger.info(`STEP END: ${stepName}`);
|
|
433
|
-
return result;
|
|
434
|
-
|
|
435
|
-
} catch (err: any) {
|
|
436
|
-
const snap = getObservedState(wf);
|
|
437
|
-
const wfError: WorkflowError = {
|
|
438
|
-
message: err?.message ?? 'error',
|
|
439
|
-
original: err,
|
|
440
|
-
workflowId: wf.id,
|
|
441
|
-
stack: err?.stack,
|
|
442
|
-
state: snap,
|
|
443
|
-
logs: [...wf.node.logs],
|
|
444
|
-
};
|
|
445
|
-
|
|
446
|
-
wf.emitEvent({ type: 'error', node: wf.node, error: wfError });
|
|
447
|
-
|
|
448
|
-
throw wfError;
|
|
449
|
-
}
|
|
450
|
-
};
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
---
|
|
456
|
-
|
|
457
|
-
### **@Task**
|
|
458
|
-
|
|
459
|
-
```ts
|
|
460
|
-
export function Task(opts: TaskOptions = {}): MethodDecorator {
|
|
461
|
-
return (target, prop, descriptor: PropertyDescriptor) => {
|
|
462
|
-
const original = descriptor.value;
|
|
463
|
-
|
|
464
|
-
descriptor.value = async function (...args: any[]) {
|
|
465
|
-
const wf = this as Workflow;
|
|
466
|
-
const taskName = opts.name ?? String(prop);
|
|
467
|
-
|
|
468
|
-
wf.emitEvent({ type: 'taskStart', node: wf.node, task: taskName });
|
|
469
|
-
|
|
470
|
-
const result = await original.apply(this, args);
|
|
471
|
-
|
|
472
|
-
// must return Workflow or Workflow[]
|
|
473
|
-
const workflows = Array.isArray(result) ? result : [result];
|
|
474
|
-
for (const child of workflows) {
|
|
475
|
-
if (!(child instanceof Workflow)) {
|
|
476
|
-
throw new Error(`@Task method "${taskName}" did not return a Workflow.`);
|
|
477
|
-
}
|
|
478
|
-
child.parent = wf;
|
|
479
|
-
wf.attachChild(child);
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
wf.emitEvent({ type: 'taskEnd', node: wf.node, task: taskName });
|
|
483
|
-
|
|
484
|
-
return result;
|
|
485
|
-
};
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
---
|
|
491
|
-
|
|
492
|
-
# **13. Example Workflow Using the System**
|
|
493
|
-
|
|
494
|
-
```ts
|
|
495
|
-
class TestCycleWorkflow extends Workflow {
|
|
496
|
-
@ObservedState() currentTest!: string;
|
|
497
|
-
|
|
498
|
-
@Step({ snapshotState: true })
|
|
499
|
-
async generateTest() { /* ... */ }
|
|
500
|
-
|
|
501
|
-
@Step()
|
|
502
|
-
async runTest() { /* ... may throw ... */ }
|
|
503
|
-
|
|
504
|
-
@Step()
|
|
505
|
-
async updateImplementation() { /* ... */ }
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
class TDDOrchestrator extends Workflow {
|
|
509
|
-
@Step({ logStart: true })
|
|
510
|
-
async setupEnvironment() { /* ... */ }
|
|
511
|
-
|
|
512
|
-
@Task()
|
|
513
|
-
async runCycle() {
|
|
514
|
-
return new TestCycleWorkflow('Cycle', this);
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
async run() {
|
|
518
|
-
try {
|
|
519
|
-
await this.setupEnvironment();
|
|
520
|
-
await this.runCycle();
|
|
521
|
-
} catch (err) {
|
|
522
|
-
/* analyze & restart logic here */
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
```
|
|
527
|
-
|
|
528
|
-
---
|
|
529
|
-
|
|
530
|
-
# **14. Acceptance Criteria (Updated)**
|
|
531
|
-
|
|
532
|
-
This PRD now includes:
|
|
533
|
-
|
|
534
|
-
* explicit interfaces
|
|
535
|
-
* complete decorators
|
|
536
|
-
* class skeletons
|
|
537
|
-
* logger skeleton
|
|
538
|
-
* observer system
|
|
539
|
-
* real-time debugger interface
|
|
540
|
-
* error/restart models
|
|
541
|
-
* snapshot system
|
|
542
|
-
|
|
543
|
-
A senior engineer should be able to implement the full engine from this PRD.
|