groundswell 0.0.2 → 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/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/{src/__tests__/helpers/index.ts → dist/__tests__/helpers/index.js} +2 -10
- 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} +1 -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 +5 -2
- package/.claude/commands/subtask-planning/prp-base-create.md +0 -120
- package/.claude/commands/subtask-planning/prp-base-execute.md +0 -65
- package/.claude/commands/task-breakdown.md +0 -94
- package/.claude/settings.local.json +0 -9
- package/.claude/system_prompts/task-breakdown.md +0 -101
- package/PRD.md +0 -543
- package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
- 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 -258
- 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/examples/11-reparenting-workflows.ts +0 -269
- package/examples/index.ts +0 -147
- package/examples/utils/helpers.ts +0 -57
- package/package-lock.json +0 -2398
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +0 -259
- package/plan/001_d3bb02af4886/backlog.json +0 -867
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +0 -484
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +0 -488
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +0 -581
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +0 -687
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +0 -492
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +0 -932
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +0 -1109
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +0 -802
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +0 -603
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +0 -564
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +0 -518
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +0 -1252
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +0 -364
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +0 -205
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +0 -199
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +0 -134
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +0 -495
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +0 -435
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +0 -558
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +0 -788
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +0 -460
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +0 -454
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +0 -520
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +0 -417
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +0 -245
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +0 -792
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +0 -535
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +0 -190
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +0 -654
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +0 -227
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +0 -345
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +0 -193
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +0 -1323
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +0 -1011
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +0 -927
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +0 -505
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +0 -401
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +0 -142
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +0 -112
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +0 -159
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +0 -549
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +0 -368
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +0 -172
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +0 -175
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +0 -696
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +0 -860
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +0 -1066
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +0 -789
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +0 -1098
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +0 -1037
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +0 -916
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +0 -1045
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +0 -890
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +0 -822
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +0 -668
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +0 -706
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +0 -655
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +0 -426
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +0 -316
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +0 -754
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +0 -719
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +0 -215
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +0 -765
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +0 -718
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +0 -149
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +0 -470
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +0 -332
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +0 -167
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +0 -273
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +0 -434
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +0 -717
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +0 -472
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +0 -125
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +0 -301
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +0 -1170
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +0 -940
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +0 -151
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +0 -650
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +0 -259
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +0 -457
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +0 -346
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +0 -311
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +0 -1565
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +0 -288
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +0 -741
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +0 -652
- package/plan/001_d3bb02af4886/docs/PRP/P1P2-PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/P3P4-PRP.md +0 -1388
- package/plan/001_d3bb02af4886/docs/PRP/P4P5-PRP.md +0 -1136
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +0 -415
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +0 -378
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +0 -713
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +0 -370
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +0 -499
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +0 -230
- package/plan/001_d3bb02af4886/docs/architecture/external_deps.md +0 -358
- package/plan/001_d3bb02af4886/docs/architecture/system_context.md +0 -242
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +0 -1134
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +0 -179
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +0 -214
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +0 -529
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +0 -142
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +0 -304
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +0 -558
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +0 -256
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +0 -346
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +0 -415
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +0 -489
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +0 -218
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +0 -380
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +0 -1923
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +0 -319
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +0 -115
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +0 -134
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +0 -153
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +0 -132
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +0 -716
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +0 -186
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +0 -604
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +0 -213
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +0 -30
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +0 -56
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +0 -53
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +0 -49
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +0 -958
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +0 -339
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +0 -305
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +0 -433
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +0 -1574
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +0 -1014
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_BEST_PRACTICES.md +0 -1929
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_CODE_PATTERNS.md +0 -857
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_RESEARCH_INDEX.md +0 -424
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_INDEX.md +0 -291
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_RESEARCH_REPORT.md +0 -1342
- package/plan/001_d3bb02af4886/docs/research/P1P2/RESEARCH_SUMMARY.md +0 -342
- package/plan/001_d3bb02af4886/docs/research/P1P2/anthropic-sdk.md +0 -174
- package/plan/001_d3bb02af4886/docs/research/P1P2/async-local-storage.md +0 -200
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-code-patterns.md +0 -1205
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-decision-matrix.md +0 -421
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-implementation-guide.md +0 -1341
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-integration-guide.md +0 -834
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-patterns.md +0 -1468
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-quick-reference.md +0 -558
- package/plan/001_d3bb02af4886/docs/research/P1P2/zod-schema.md +0 -152
- package/plan/001_d3bb02af4886/docs/research/P3P4/caching-lru.md +0 -116
- package/plan/001_d3bb02af4886/docs/research/P3P4/introspection-tools.md +0 -177
- package/plan/001_d3bb02af4886/docs/research/P3P4/reflection-patterns.md +0 -117
- package/plan/001_d3bb02af4886/docs/research/P4P5/RESEARCH_SUMMARY.md +0 -151
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +0 -376
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +0 -1507
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +0 -949
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +0 -619
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +0 -723
- package/plan/001_d3bb02af4886/docs/research/general/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
- package/plan/001_d3bb02af4886/docs/research/general/README-INTROSPECTION.md +0 -352
- package/plan/001_d3bb02af4886/docs/research/general/agent-introspection-patterns.md +0 -1085
- package/plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md +0 -984
- package/plan/001_d3bb02af4886/docs/research/general/introspection-tool-examples.md +0 -875
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +0 -460
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +0 -324
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +0 -175
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +0 -499
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +0 -163
- package/plan/001_d3bb02af4886/prd_snapshot.md +0 -543
- package/plan/bugfix/BUG_FIX_SUMMARY.md +0 -961
- package/scripts/generate-llms-full.ts +0 -206
- package/src/__tests__/adversarial/attachChild-performance.test.ts +0 -216
- package/src/__tests__/adversarial/circular-reference.test.ts +0 -101
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +0 -139
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +0 -571
- package/src/__tests__/adversarial/deep-analysis.test.ts +0 -729
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +0 -213
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +0 -448
- package/src/__tests__/adversarial/edge-case.test.ts +0 -703
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +0 -760
- package/src/__tests__/adversarial/incremental-performance.test.ts +0 -140
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +0 -457
- package/src/__tests__/adversarial/observer-propagation.test.ts +0 -487
- package/src/__tests__/adversarial/parent-validation.test.ts +0 -143
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +0 -611
- package/src/__tests__/adversarial/prd-compliance.test.ts +0 -731
- package/src/__tests__/compatibility/backward-compatibility.test.ts +0 -1572
- package/src/__tests__/helpers/tree-verification.ts +0 -257
- package/src/__tests__/integration/agent-workflow.test.ts +0 -256
- package/src/__tests__/integration/bidirectional-consistency.test.ts +0 -847
- package/src/__tests__/integration/observer-logging.test.ts +0 -643
- package/src/__tests__/integration/tree-mirroring.test.ts +0 -151
- package/src/__tests__/integration/workflow-reparenting.test.ts +0 -303
- 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 -217
- package/src/__tests__/unit/decorators.test.ts +0 -100
- package/src/__tests__/unit/introspection-tools.test.ts +0 -277
- package/src/__tests__/unit/logger.test.ts +0 -293
- package/src/__tests__/unit/observable.test.ts +0 -321
- package/src/__tests__/unit/prompt.test.ts +0 -135
- package/src/__tests__/unit/reflection.test.ts +0 -210
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +0 -170
- package/src/__tests__/unit/tree-debugger.test.ts +0 -85
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +0 -209
- package/src/__tests__/unit/workflow-detachChild.test.ts +0 -100
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +0 -153
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +0 -180
- package/src/__tests__/unit/workflow.test.ts +0 -357
- package/src/cache/cache-key.ts +0 -244
- package/src/cache/cache.ts +0 -236
- package/src/core/agent.ts +0 -593
- package/src/core/event-tree.ts +0 -260
- package/src/core/logger.ts +0 -112
- package/src/core/mcp-handler.ts +0 -184
- package/src/core/prompt.ts +0 -150
- package/src/core/workflow-context.ts +0 -351
- package/src/core/workflow.ts +0 -540
- package/src/debugger/tree-debugger.ts +0 -255
- package/src/decorators/observed-state.ts +0 -95
- package/src/decorators/step.ts +0 -139
- package/src/decorators/task.ts +0 -159
- package/src/examples/tdd-orchestrator.ts +0 -65
- package/src/examples/test-cycle-workflow.ts +0 -64
- package/src/index.ts +0 -142
- 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 -32
- package/src/types/error-strategy.ts +0 -13
- package/src/types/error.ts +0 -20
- package/src/types/events.ts +0 -75
- 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 -106
- package/src/utils/workflow-error-utils.ts +0 -56
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -16
|
@@ -0,0 +1,907 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ErrorMergeStrategy Functionality Test Suite
|
|
3
|
+
*
|
|
4
|
+
* Tests the ErrorMergeStrategy feature for concurrent task error aggregation.
|
|
5
|
+
*
|
|
6
|
+
* Validates:
|
|
7
|
+
* - Default behavior (disabled) - first error wins
|
|
8
|
+
* - Enabled with default merge - uses mergeWorkflowErrors
|
|
9
|
+
* - Enabled with custom combine - user-provided merger
|
|
10
|
+
* - Edge cases - single failure, all failing, mixed scenarios
|
|
11
|
+
* - Event emission - individual and merged error events
|
|
12
|
+
* - Completion verification - all workflows complete
|
|
13
|
+
*
|
|
14
|
+
* Related:
|
|
15
|
+
* - P1.M2.T2.S2: Error aggregation logic implementation
|
|
16
|
+
* - P1.M2.T2.S3: Default error merger utility
|
|
17
|
+
* - Bug: 001_e8e04329daf3 - Concurrent task error handling
|
|
18
|
+
*/
|
|
19
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
20
|
+
var useValue = arguments.length > 2;
|
|
21
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
22
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
23
|
+
}
|
|
24
|
+
return useValue ? value : void 0;
|
|
25
|
+
};
|
|
26
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
27
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
28
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
29
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
30
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
31
|
+
var _, done = false;
|
|
32
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
33
|
+
var context = {};
|
|
34
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
35
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
36
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
37
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
38
|
+
if (kind === "accessor") {
|
|
39
|
+
if (result === void 0) continue;
|
|
40
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
41
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
42
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
43
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
44
|
+
}
|
|
45
|
+
else if (_ = accept(result)) {
|
|
46
|
+
if (kind === "field") initializers.unshift(_);
|
|
47
|
+
else descriptor[key] = _;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
51
|
+
done = true;
|
|
52
|
+
};
|
|
53
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
54
|
+
import { Workflow, Task, Step } from '../../index.js';
|
|
55
|
+
describe('@Task decorator ErrorMergeStrategy', () => {
|
|
56
|
+
/**
|
|
57
|
+
* Helper to create a child workflow that may fail
|
|
58
|
+
* Pattern from: src/__tests__/adversarial/concurrent-task-failures.test.ts (lines 30-52)
|
|
59
|
+
*/
|
|
60
|
+
function createChildWorkflow(parent, name, shouldFail = false) {
|
|
61
|
+
return new ((() => {
|
|
62
|
+
let _classSuper = Workflow;
|
|
63
|
+
let _instanceExtraInitializers = [];
|
|
64
|
+
let _executeStep_decorators;
|
|
65
|
+
return class extends _classSuper {
|
|
66
|
+
static {
|
|
67
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
68
|
+
_executeStep_decorators = [Step()];
|
|
69
|
+
__esDecorate(this, null, _executeStep_decorators, { kind: "method", name: "executeStep", static: false, private: false, access: { has: obj => "executeStep" in obj, get: obj => obj.executeStep }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
70
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
71
|
+
}
|
|
72
|
+
constructor(n, p) {
|
|
73
|
+
super(n, p);
|
|
74
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
75
|
+
}
|
|
76
|
+
async executeStep() {
|
|
77
|
+
if (shouldFail) {
|
|
78
|
+
throw new Error(`${name} failed`);
|
|
79
|
+
}
|
|
80
|
+
return `${name} succeeded`;
|
|
81
|
+
}
|
|
82
|
+
async run() {
|
|
83
|
+
return this.executeStep();
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
})())(name, parent);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Helper to setup event observer for event collection
|
|
90
|
+
* Pattern from: src/__tests__/adversarial/concurrent-task-failures.test.ts (lines 58-67)
|
|
91
|
+
*/
|
|
92
|
+
function setupEventObserver(workflow) {
|
|
93
|
+
const events = [];
|
|
94
|
+
workflow.addObserver({
|
|
95
|
+
onLog: () => { },
|
|
96
|
+
onEvent: (e) => events.push(e),
|
|
97
|
+
onStateUpdated: () => { },
|
|
98
|
+
onTreeChanged: () => { },
|
|
99
|
+
});
|
|
100
|
+
return events;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Helper to create a mock WorkflowError for custom combine() tests
|
|
104
|
+
* Pattern from: src/__tests__/unit/utils/workflow-error-utils.test.ts (lines 7-25)
|
|
105
|
+
*/
|
|
106
|
+
function createMockWorkflowError(overrides) {
|
|
107
|
+
return {
|
|
108
|
+
message: 'Test error',
|
|
109
|
+
original: new Error('Original error'),
|
|
110
|
+
workflowId: 'wf-test-123',
|
|
111
|
+
stack: 'Error: Test error\n at test.ts:10:15',
|
|
112
|
+
state: { key: 'value' },
|
|
113
|
+
logs: [
|
|
114
|
+
{
|
|
115
|
+
id: 'log-1',
|
|
116
|
+
workflowId: 'wf-test-123',
|
|
117
|
+
timestamp: Date.now(),
|
|
118
|
+
level: 'error',
|
|
119
|
+
message: 'Test log message',
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
...overrides,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
describe('Default behavior (errorMergeStrategy disabled)', () => {
|
|
126
|
+
it('should throw first error when errorMergeStrategy not provided', async () => {
|
|
127
|
+
// ARRANGE: Create parent with concurrent tasks, no error merge strategy
|
|
128
|
+
let ParentWorkflow = (() => {
|
|
129
|
+
let _classSuper = Workflow;
|
|
130
|
+
let _instanceExtraInitializers = [];
|
|
131
|
+
let _spawnChildren_decorators;
|
|
132
|
+
return class ParentWorkflow extends _classSuper {
|
|
133
|
+
static {
|
|
134
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
135
|
+
_spawnChildren_decorators = [Task({ concurrent: true })];
|
|
136
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
137
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
138
|
+
}
|
|
139
|
+
async spawnChildren() {
|
|
140
|
+
return [
|
|
141
|
+
createChildWorkflow(this, 'Child-0', false),
|
|
142
|
+
createChildWorkflow(this, 'Child-1', true), // Will fail
|
|
143
|
+
createChildWorkflow(this, 'Child-2', false),
|
|
144
|
+
];
|
|
145
|
+
}
|
|
146
|
+
async run() {
|
|
147
|
+
try {
|
|
148
|
+
await this.spawnChildren();
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// Expected - capture error for validation
|
|
152
|
+
return err;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
constructor() {
|
|
156
|
+
super(...arguments);
|
|
157
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
})();
|
|
161
|
+
const parent = new ParentWorkflow('Parent');
|
|
162
|
+
const events = setupEventObserver(parent);
|
|
163
|
+
// ACT: Run parent workflow
|
|
164
|
+
const thrownError = await parent.run();
|
|
165
|
+
// ASSERT: All children completed (Promise.allSettled behavior)
|
|
166
|
+
expect(parent.children.length).toBe(3);
|
|
167
|
+
// ASSERT: Error was thrown (first error wins)
|
|
168
|
+
expect(thrownError).toBeDefined();
|
|
169
|
+
expect(thrownError.message).toContain('Child-1 failed');
|
|
170
|
+
// ASSERT: No additional error event from @Task (only individual workflow errors)
|
|
171
|
+
const errorEvents = events.filter((e) => e.type === 'error');
|
|
172
|
+
expect(errorEvents.length).toBe(1); // Only Child-1's error event
|
|
173
|
+
});
|
|
174
|
+
it('should throw first error when errorMergeStrategy.enabled=false', async () => {
|
|
175
|
+
// ARRANGE: Create parent with explicit enabled=false
|
|
176
|
+
let ParentWorkflow = (() => {
|
|
177
|
+
let _classSuper = Workflow;
|
|
178
|
+
let _instanceExtraInitializers = [];
|
|
179
|
+
let _spawnChildren_decorators;
|
|
180
|
+
return class ParentWorkflow extends _classSuper {
|
|
181
|
+
static {
|
|
182
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
183
|
+
_spawnChildren_decorators = [Task({
|
|
184
|
+
concurrent: true,
|
|
185
|
+
errorMergeStrategy: { enabled: false }, // Explicitly disabled
|
|
186
|
+
})];
|
|
187
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
188
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
189
|
+
}
|
|
190
|
+
async spawnChildren() {
|
|
191
|
+
return [
|
|
192
|
+
createChildWorkflow(this, 'Alpha', false),
|
|
193
|
+
createChildWorkflow(this, 'Beta', true),
|
|
194
|
+
createChildWorkflow(this, 'Gamma', true),
|
|
195
|
+
];
|
|
196
|
+
}
|
|
197
|
+
async run() {
|
|
198
|
+
try {
|
|
199
|
+
await this.spawnChildren();
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return err;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
constructor() {
|
|
206
|
+
super(...arguments);
|
|
207
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
})();
|
|
211
|
+
const parent = new ParentWorkflow('Parent');
|
|
212
|
+
const events = setupEventObserver(parent);
|
|
213
|
+
const thrownError = await parent.run();
|
|
214
|
+
// ASSERT: All children completed
|
|
215
|
+
expect(parent.children.length).toBe(3);
|
|
216
|
+
// ASSERT: First error thrown (not aggregated)
|
|
217
|
+
expect(thrownError).toBeDefined();
|
|
218
|
+
const errorMsg = thrownError.message;
|
|
219
|
+
expect(errorMsg).toMatch(/Alpha failed|Beta failed|Gamma failed/);
|
|
220
|
+
// ASSERT: Only individual error events (no merge event)
|
|
221
|
+
const errorEvents = events.filter((e) => e.type === 'error');
|
|
222
|
+
expect(errorEvents.length).toBe(2); // Beta and Gamma errors only
|
|
223
|
+
// ASSERT: Error message does not contain aggregated format
|
|
224
|
+
expect(errorMsg).not.toContain('concurrent child workflows failed');
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe('Enabled with default error merge', () => {
|
|
228
|
+
it('should merge all errors when errorMergeStrategy.enabled=true', async () => {
|
|
229
|
+
// ARRANGE: Create parent with error merge enabled
|
|
230
|
+
let ParentWorkflow = (() => {
|
|
231
|
+
let _classSuper = Workflow;
|
|
232
|
+
let _instanceExtraInitializers = [];
|
|
233
|
+
let _spawnChildren_decorators;
|
|
234
|
+
return class ParentWorkflow extends _classSuper {
|
|
235
|
+
static {
|
|
236
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
237
|
+
_spawnChildren_decorators = [Task({
|
|
238
|
+
concurrent: true,
|
|
239
|
+
errorMergeStrategy: { enabled: true }, // No combine() - use default
|
|
240
|
+
})];
|
|
241
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
242
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
243
|
+
}
|
|
244
|
+
async spawnChildren() {
|
|
245
|
+
return [
|
|
246
|
+
createChildWorkflow(this, 'Alpha', false),
|
|
247
|
+
createChildWorkflow(this, 'Beta', true), // Will fail
|
|
248
|
+
createChildWorkflow(this, 'Gamma', false),
|
|
249
|
+
createChildWorkflow(this, 'Delta', true), // Will fail
|
|
250
|
+
createChildWorkflow(this, 'Epsilon', false),
|
|
251
|
+
];
|
|
252
|
+
}
|
|
253
|
+
async run() {
|
|
254
|
+
try {
|
|
255
|
+
await this.spawnChildren();
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
return err;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
constructor() {
|
|
262
|
+
super(...arguments);
|
|
263
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
})();
|
|
267
|
+
const parent = new ParentWorkflow('Parent');
|
|
268
|
+
const events = setupEventObserver(parent);
|
|
269
|
+
// ACT
|
|
270
|
+
const thrownError = await parent.run();
|
|
271
|
+
// ASSERT: All children completed
|
|
272
|
+
expect(parent.children.length).toBe(5);
|
|
273
|
+
// ASSERT: Merged error thrown
|
|
274
|
+
expect(thrownError).toBeDefined();
|
|
275
|
+
const error = thrownError;
|
|
276
|
+
// ASSERT: Message includes count and task name
|
|
277
|
+
expect(error.message).toBe("2 of 5 concurrent child workflows failed in task 'spawnChildren'");
|
|
278
|
+
// ASSERT: Metadata in original field
|
|
279
|
+
const metadata = error.original;
|
|
280
|
+
expect(metadata.name).toBe('WorkflowAggregateError');
|
|
281
|
+
expect(metadata.totalChildren).toBe(5);
|
|
282
|
+
expect(metadata.failedChildren).toBe(2);
|
|
283
|
+
expect(metadata.failedWorkflowIds).toHaveLength(2);
|
|
284
|
+
expect(metadata.errors).toHaveLength(2);
|
|
285
|
+
// ASSERT: Logs aggregated from all errors (empty array if child workflows don't log)
|
|
286
|
+
expect(error.logs).toBeDefined();
|
|
287
|
+
expect(Array.isArray(error.logs)).toBe(true);
|
|
288
|
+
// Note: Logs are empty here because createChildWorkflow doesn't log
|
|
289
|
+
// The "should aggregate all logs from all failed workflows" test specifically tests log aggregation
|
|
290
|
+
// ASSERT: Error event emitted with merged error
|
|
291
|
+
const errorEvents = events.filter((e) => e.type === 'error');
|
|
292
|
+
expect(errorEvents.length).toBeGreaterThanOrEqual(3); // 2 individual + 1 merged
|
|
293
|
+
// Find the merged error event (has different message format)
|
|
294
|
+
const mergedErrorEvent = errorEvents.find((e) => {
|
|
295
|
+
if (e.type === 'error') {
|
|
296
|
+
return e.error.message.includes('2 of 5 concurrent');
|
|
297
|
+
}
|
|
298
|
+
return false;
|
|
299
|
+
});
|
|
300
|
+
expect(mergedErrorEvent).toBeDefined();
|
|
301
|
+
});
|
|
302
|
+
it('should create aggregated error message with counts and task name', async () => {
|
|
303
|
+
// ARRANGE: Test various counts
|
|
304
|
+
let ParentWorkflow = (() => {
|
|
305
|
+
let _classSuper = Workflow;
|
|
306
|
+
let _instanceExtraInitializers = [];
|
|
307
|
+
let _spawnChildren_decorators;
|
|
308
|
+
return class ParentWorkflow extends _classSuper {
|
|
309
|
+
static {
|
|
310
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
311
|
+
_spawnChildren_decorators = [Task({
|
|
312
|
+
concurrent: true,
|
|
313
|
+
errorMergeStrategy: { enabled: true },
|
|
314
|
+
})];
|
|
315
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
316
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
317
|
+
}
|
|
318
|
+
async spawnChildren() {
|
|
319
|
+
return [
|
|
320
|
+
createChildWorkflow(this, 'Success1', false),
|
|
321
|
+
createChildWorkflow(this, 'Fail1', true),
|
|
322
|
+
createChildWorkflow(this, 'Success2', false),
|
|
323
|
+
createChildWorkflow(this, 'Fail2', true),
|
|
324
|
+
createChildWorkflow(this, 'Fail3', true),
|
|
325
|
+
];
|
|
326
|
+
}
|
|
327
|
+
async run() {
|
|
328
|
+
try {
|
|
329
|
+
await this.spawnChildren();
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
return err;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
constructor() {
|
|
336
|
+
super(...arguments);
|
|
337
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
})();
|
|
341
|
+
const parent = new ParentWorkflow('Parent');
|
|
342
|
+
const thrownError = await parent.run();
|
|
343
|
+
// ASSERT: Message format "${X} of ${Y} concurrent child workflows failed in task '${taskName}'"
|
|
344
|
+
expect(thrownError.message).toBe("3 of 5 concurrent child workflows failed in task 'spawnChildren'");
|
|
345
|
+
expect(thrownError.message).toMatch(/\d+ of \d+ concurrent child workflows failed/);
|
|
346
|
+
expect(thrownError.message).toContain("task 'spawnChildren'");
|
|
347
|
+
});
|
|
348
|
+
it('should aggregate all logs from all failed workflows', async () => {
|
|
349
|
+
// ARRANGE: Create workflows that log before failing
|
|
350
|
+
let LoggingWorkflow = (() => {
|
|
351
|
+
let _classSuper = Workflow;
|
|
352
|
+
let _instanceExtraInitializers = [];
|
|
353
|
+
let _executeStep_decorators;
|
|
354
|
+
return class LoggingWorkflow extends _classSuper {
|
|
355
|
+
static {
|
|
356
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
357
|
+
_executeStep_decorators = [Step()];
|
|
358
|
+
__esDecorate(this, null, _executeStep_decorators, { kind: "method", name: "executeStep", static: false, private: false, access: { has: obj => "executeStep" in obj, get: obj => obj.executeStep }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
359
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
360
|
+
}
|
|
361
|
+
shouldFail = __runInitializers(this, _instanceExtraInitializers);
|
|
362
|
+
constructor(name, parent, shouldFail) {
|
|
363
|
+
super(name, parent);
|
|
364
|
+
this.shouldFail = shouldFail;
|
|
365
|
+
}
|
|
366
|
+
async executeStep() {
|
|
367
|
+
this.logger.info(`${this.node.name} starting`);
|
|
368
|
+
if (this.shouldFail) {
|
|
369
|
+
this.logger.error(`${this.node.name} failing`);
|
|
370
|
+
throw new Error(`${this.node.name} failed`);
|
|
371
|
+
}
|
|
372
|
+
this.logger.info(`${this.node.name} completed`);
|
|
373
|
+
}
|
|
374
|
+
async run() {
|
|
375
|
+
return this.executeStep();
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
})();
|
|
379
|
+
let ParentWorkflow = (() => {
|
|
380
|
+
let _classSuper = Workflow;
|
|
381
|
+
let _instanceExtraInitializers = [];
|
|
382
|
+
let _spawnChildren_decorators;
|
|
383
|
+
return class ParentWorkflow extends _classSuper {
|
|
384
|
+
static {
|
|
385
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
386
|
+
_spawnChildren_decorators = [Task({
|
|
387
|
+
concurrent: true,
|
|
388
|
+
errorMergeStrategy: { enabled: true },
|
|
389
|
+
})];
|
|
390
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
391
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
392
|
+
}
|
|
393
|
+
async spawnChildren() {
|
|
394
|
+
return [
|
|
395
|
+
new LoggingWorkflow('Workflow-1', this, true),
|
|
396
|
+
new LoggingWorkflow('Workflow-2', this, true),
|
|
397
|
+
new LoggingWorkflow('Workflow-3', this, false),
|
|
398
|
+
];
|
|
399
|
+
}
|
|
400
|
+
async run() {
|
|
401
|
+
try {
|
|
402
|
+
await this.spawnChildren();
|
|
403
|
+
}
|
|
404
|
+
catch (err) {
|
|
405
|
+
return err;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
constructor() {
|
|
409
|
+
super(...arguments);
|
|
410
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
})();
|
|
414
|
+
const parent = new ParentWorkflow('Parent');
|
|
415
|
+
const thrownError = (await parent.run());
|
|
416
|
+
// ASSERT: Logs from both failed workflows aggregated
|
|
417
|
+
expect(thrownError.logs).toBeDefined();
|
|
418
|
+
const logMessages = thrownError.logs.map((l) => l.message);
|
|
419
|
+
// Should have logs from both failing workflows
|
|
420
|
+
expect(logMessages.some((m) => m.includes('Workflow-1'))).toBe(true);
|
|
421
|
+
expect(logMessages.some((m) => m.includes('Workflow-2'))).toBe(true);
|
|
422
|
+
});
|
|
423
|
+
it('should include metadata in original field', async () => {
|
|
424
|
+
// ARRANGE: Test metadata structure
|
|
425
|
+
let ParentWorkflow = (() => {
|
|
426
|
+
let _classSuper = Workflow;
|
|
427
|
+
let _instanceExtraInitializers = [];
|
|
428
|
+
let _spawnChildren_decorators;
|
|
429
|
+
return class ParentWorkflow extends _classSuper {
|
|
430
|
+
static {
|
|
431
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
432
|
+
_spawnChildren_decorators = [Task({
|
|
433
|
+
concurrent: true,
|
|
434
|
+
errorMergeStrategy: { enabled: true },
|
|
435
|
+
})];
|
|
436
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
437
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
438
|
+
}
|
|
439
|
+
async spawnChildren() {
|
|
440
|
+
return [
|
|
441
|
+
createChildWorkflow(this, 'W1', true),
|
|
442
|
+
createChildWorkflow(this, 'W2', true),
|
|
443
|
+
createChildWorkflow(this, 'W3', true),
|
|
444
|
+
];
|
|
445
|
+
}
|
|
446
|
+
async run() {
|
|
447
|
+
try {
|
|
448
|
+
await this.spawnChildren();
|
|
449
|
+
}
|
|
450
|
+
catch (err) {
|
|
451
|
+
return err;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
constructor() {
|
|
455
|
+
super(...arguments);
|
|
456
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
})();
|
|
460
|
+
const parent = new ParentWorkflow('Parent');
|
|
461
|
+
const thrownError = (await parent.run());
|
|
462
|
+
// ASSERT: Metadata structure is correct
|
|
463
|
+
const metadata = thrownError.original;
|
|
464
|
+
expect(metadata.name).toBe('WorkflowAggregateError');
|
|
465
|
+
expect(metadata.message).toContain('concurrent child workflows failed');
|
|
466
|
+
expect(metadata.errors).toHaveLength(3);
|
|
467
|
+
expect(metadata.totalChildren).toBe(3);
|
|
468
|
+
expect(metadata.failedChildren).toBe(3);
|
|
469
|
+
expect(metadata.failedWorkflowIds).toHaveLength(3);
|
|
470
|
+
// ASSERT: Each error in metadata has workflowId
|
|
471
|
+
metadata.failedWorkflowIds.forEach((id) => {
|
|
472
|
+
expect(id).toBeDefined();
|
|
473
|
+
expect(typeof id).toBe('string');
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
describe('Enabled with custom combine function', () => {
|
|
478
|
+
it('should call custom combine function when provided', async () => {
|
|
479
|
+
// ARRANGE: Create spy for combine function
|
|
480
|
+
const combineSpy = vi.fn((errors) => ({
|
|
481
|
+
message: `Custom merge: ${errors.length} errors`,
|
|
482
|
+
original: errors,
|
|
483
|
+
workflowId: 'custom-parent',
|
|
484
|
+
logs: errors.flatMap((e) => e.logs),
|
|
485
|
+
stack: errors[0]?.stack,
|
|
486
|
+
state: errors[0]?.state || {},
|
|
487
|
+
}));
|
|
488
|
+
let ParentWorkflow = (() => {
|
|
489
|
+
let _classSuper = Workflow;
|
|
490
|
+
let _instanceExtraInitializers = [];
|
|
491
|
+
let _spawnChildren_decorators;
|
|
492
|
+
return class ParentWorkflow extends _classSuper {
|
|
493
|
+
static {
|
|
494
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
495
|
+
_spawnChildren_decorators = [Task({
|
|
496
|
+
concurrent: true,
|
|
497
|
+
errorMergeStrategy: {
|
|
498
|
+
enabled: true,
|
|
499
|
+
combine: combineSpy, // Custom combine function
|
|
500
|
+
},
|
|
501
|
+
})];
|
|
502
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
503
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
504
|
+
}
|
|
505
|
+
async spawnChildren() {
|
|
506
|
+
return [
|
|
507
|
+
createChildWorkflow(this, 'Alpha', true),
|
|
508
|
+
createChildWorkflow(this, 'Beta', true),
|
|
509
|
+
createChildWorkflow(this, 'Gamma', false),
|
|
510
|
+
];
|
|
511
|
+
}
|
|
512
|
+
async run() {
|
|
513
|
+
try {
|
|
514
|
+
await this.spawnChildren();
|
|
515
|
+
}
|
|
516
|
+
catch (err) {
|
|
517
|
+
return err;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
constructor() {
|
|
521
|
+
super(...arguments);
|
|
522
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
})();
|
|
526
|
+
const parent = new ParentWorkflow('Parent');
|
|
527
|
+
// ACT
|
|
528
|
+
await parent.run();
|
|
529
|
+
// ASSERT: Custom combine function was called
|
|
530
|
+
expect(combineSpy).toHaveBeenCalledTimes(1);
|
|
531
|
+
// ASSERT: Called with array of WorkflowError objects
|
|
532
|
+
const calls = combineSpy.mock.calls;
|
|
533
|
+
expect(calls).toHaveLength(1);
|
|
534
|
+
const errorsArg = calls[0][0];
|
|
535
|
+
expect(Array.isArray(errorsArg)).toBe(true);
|
|
536
|
+
expect(errorsArg).toHaveLength(2); // Alpha and Beta failed
|
|
537
|
+
});
|
|
538
|
+
it('should use custom merge result from combine function', async () => {
|
|
539
|
+
// ARRANGE: Custom combine that returns specific format
|
|
540
|
+
const customMerger = (errors) => ({
|
|
541
|
+
message: `MERGED: ${errors.map((e) => e.message).join(' | ')}`,
|
|
542
|
+
original: {
|
|
543
|
+
customField: 'custom-value',
|
|
544
|
+
errors,
|
|
545
|
+
},
|
|
546
|
+
workflowId: 'merged-workflow',
|
|
547
|
+
logs: errors.flatMap((e) => e.logs),
|
|
548
|
+
stack: errors[0]?.stack,
|
|
549
|
+
state: errors[0]?.state || {},
|
|
550
|
+
});
|
|
551
|
+
let ParentWorkflow = (() => {
|
|
552
|
+
let _classSuper = Workflow;
|
|
553
|
+
let _instanceExtraInitializers = [];
|
|
554
|
+
let _spawnChildren_decorators;
|
|
555
|
+
return class ParentWorkflow extends _classSuper {
|
|
556
|
+
static {
|
|
557
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
558
|
+
_spawnChildren_decorators = [Task({
|
|
559
|
+
concurrent: true,
|
|
560
|
+
errorMergeStrategy: {
|
|
561
|
+
enabled: true,
|
|
562
|
+
combine: customMerger,
|
|
563
|
+
},
|
|
564
|
+
})];
|
|
565
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
566
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
567
|
+
}
|
|
568
|
+
async spawnChildren() {
|
|
569
|
+
return [
|
|
570
|
+
createChildWorkflow(this, 'First', true),
|
|
571
|
+
createChildWorkflow(this, 'Second', true),
|
|
572
|
+
];
|
|
573
|
+
}
|
|
574
|
+
async run() {
|
|
575
|
+
try {
|
|
576
|
+
await this.spawnChildren();
|
|
577
|
+
}
|
|
578
|
+
catch (err) {
|
|
579
|
+
return err;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
constructor() {
|
|
583
|
+
super(...arguments);
|
|
584
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
585
|
+
}
|
|
586
|
+
};
|
|
587
|
+
})();
|
|
588
|
+
const parent = new ParentWorkflow('Parent');
|
|
589
|
+
const thrownError = (await parent.run());
|
|
590
|
+
// ASSERT: Custom merge result used
|
|
591
|
+
expect(thrownError.message).toBe('MERGED: First failed | Second failed');
|
|
592
|
+
expect(thrownError.workflowId).toBe('merged-workflow');
|
|
593
|
+
// ASSERT: Custom fields preserved
|
|
594
|
+
const customMetadata = thrownError.original;
|
|
595
|
+
expect(customMetadata.customField).toBe('custom-value');
|
|
596
|
+
});
|
|
597
|
+
it('should pass all errors to custom combine function', async () => {
|
|
598
|
+
// ARRANGE: Track which errors were passed
|
|
599
|
+
let receivedErrors = [];
|
|
600
|
+
const trackingMerger = (errors) => {
|
|
601
|
+
receivedErrors = errors;
|
|
602
|
+
return createMockWorkflowError({
|
|
603
|
+
message: `Tracked ${errors.length} errors`,
|
|
604
|
+
});
|
|
605
|
+
};
|
|
606
|
+
let ParentWorkflow = (() => {
|
|
607
|
+
let _classSuper = Workflow;
|
|
608
|
+
let _instanceExtraInitializers = [];
|
|
609
|
+
let _spawnChildren_decorators;
|
|
610
|
+
return class ParentWorkflow extends _classSuper {
|
|
611
|
+
static {
|
|
612
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
613
|
+
_spawnChildren_decorators = [Task({
|
|
614
|
+
concurrent: true,
|
|
615
|
+
errorMergeStrategy: {
|
|
616
|
+
enabled: true,
|
|
617
|
+
combine: trackingMerger,
|
|
618
|
+
},
|
|
619
|
+
})];
|
|
620
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
621
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
622
|
+
}
|
|
623
|
+
async spawnChildren() {
|
|
624
|
+
return [
|
|
625
|
+
createChildWorkflow(this, 'A', true),
|
|
626
|
+
createChildWorkflow(this, 'B', true),
|
|
627
|
+
createChildWorkflow(this, 'C', true),
|
|
628
|
+
createChildWorkflow(this, 'D', false),
|
|
629
|
+
];
|
|
630
|
+
}
|
|
631
|
+
async run() {
|
|
632
|
+
try {
|
|
633
|
+
await this.spawnChildren();
|
|
634
|
+
}
|
|
635
|
+
catch (err) {
|
|
636
|
+
return err;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
constructor() {
|
|
640
|
+
super(...arguments);
|
|
641
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
})();
|
|
645
|
+
const parent = new ParentWorkflow('Parent');
|
|
646
|
+
await parent.run();
|
|
647
|
+
// ASSERT: All failed errors passed to combine
|
|
648
|
+
expect(receivedErrors).toHaveLength(3);
|
|
649
|
+
const errorMessages = receivedErrors.map((e) => e.message);
|
|
650
|
+
expect(errorMessages).toContain('A failed');
|
|
651
|
+
expect(errorMessages).toContain('B failed');
|
|
652
|
+
expect(errorMessages).toContain('C failed');
|
|
653
|
+
});
|
|
654
|
+
});
|
|
655
|
+
describe('Edge cases and error scenarios', () => {
|
|
656
|
+
it('should handle single failure with merge enabled', async () => {
|
|
657
|
+
let ParentWorkflow = (() => {
|
|
658
|
+
let _classSuper = Workflow;
|
|
659
|
+
let _instanceExtraInitializers = [];
|
|
660
|
+
let _spawnChildren_decorators;
|
|
661
|
+
return class ParentWorkflow extends _classSuper {
|
|
662
|
+
static {
|
|
663
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
664
|
+
_spawnChildren_decorators = [Task({
|
|
665
|
+
concurrent: true,
|
|
666
|
+
errorMergeStrategy: { enabled: true },
|
|
667
|
+
})];
|
|
668
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
669
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
670
|
+
}
|
|
671
|
+
async spawnChildren() {
|
|
672
|
+
return [createChildWorkflow(this, 'OnlyChild', true)];
|
|
673
|
+
}
|
|
674
|
+
async run() {
|
|
675
|
+
try {
|
|
676
|
+
await this.spawnChildren();
|
|
677
|
+
}
|
|
678
|
+
catch (err) {
|
|
679
|
+
return err;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
constructor() {
|
|
683
|
+
super(...arguments);
|
|
684
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
})();
|
|
688
|
+
const parent = new ParentWorkflow('Parent');
|
|
689
|
+
const thrownError = (await parent.run());
|
|
690
|
+
// ASSERT: Message format correct for single failure
|
|
691
|
+
expect(thrownError.message).toBe("1 of 1 concurrent child workflows failed in task 'spawnChildren'");
|
|
692
|
+
});
|
|
693
|
+
it('should handle all workflows failing with merge enabled', async () => {
|
|
694
|
+
let ParentWorkflow = (() => {
|
|
695
|
+
let _classSuper = Workflow;
|
|
696
|
+
let _instanceExtraInitializers = [];
|
|
697
|
+
let _spawnChildren_decorators;
|
|
698
|
+
return class ParentWorkflow extends _classSuper {
|
|
699
|
+
static {
|
|
700
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
701
|
+
_spawnChildren_decorators = [Task({
|
|
702
|
+
concurrent: true,
|
|
703
|
+
errorMergeStrategy: { enabled: true },
|
|
704
|
+
})];
|
|
705
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
706
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
707
|
+
}
|
|
708
|
+
async spawnChildren() {
|
|
709
|
+
return [
|
|
710
|
+
createChildWorkflow(this, 'W1', true),
|
|
711
|
+
createChildWorkflow(this, 'W2', true),
|
|
712
|
+
createChildWorkflow(this, 'W3', true),
|
|
713
|
+
createChildWorkflow(this, 'W4', true),
|
|
714
|
+
];
|
|
715
|
+
}
|
|
716
|
+
async run() {
|
|
717
|
+
try {
|
|
718
|
+
await this.spawnChildren();
|
|
719
|
+
}
|
|
720
|
+
catch (err) {
|
|
721
|
+
return err;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
constructor() {
|
|
725
|
+
super(...arguments);
|
|
726
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
727
|
+
}
|
|
728
|
+
};
|
|
729
|
+
})();
|
|
730
|
+
const parent = new ParentWorkflow('Parent');
|
|
731
|
+
const thrownError = (await parent.run());
|
|
732
|
+
// ASSERT: All failures counted
|
|
733
|
+
expect(thrownError.message).toBe("4 of 4 concurrent child workflows failed in task 'spawnChildren'");
|
|
734
|
+
// ASSERT: All workflows completed
|
|
735
|
+
expect(parent.children.length).toBe(4);
|
|
736
|
+
});
|
|
737
|
+
it('should handle mixed success/failure with merge enabled', async () => {
|
|
738
|
+
let ParentWorkflow = (() => {
|
|
739
|
+
let _classSuper = Workflow;
|
|
740
|
+
let _instanceExtraInitializers = [];
|
|
741
|
+
let _spawnChildren_decorators;
|
|
742
|
+
return class ParentWorkflow extends _classSuper {
|
|
743
|
+
static {
|
|
744
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
745
|
+
_spawnChildren_decorators = [Task({
|
|
746
|
+
concurrent: true,
|
|
747
|
+
errorMergeStrategy: { enabled: true },
|
|
748
|
+
})];
|
|
749
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
750
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
751
|
+
}
|
|
752
|
+
async spawnChildren() {
|
|
753
|
+
return [
|
|
754
|
+
createChildWorkflow(this, 'Success1', false),
|
|
755
|
+
createChildWorkflow(this, 'Fail1', true),
|
|
756
|
+
createChildWorkflow(this, 'Success2', false),
|
|
757
|
+
createChildWorkflow(this, 'Fail2', true),
|
|
758
|
+
createChildWorkflow(this, 'Success3', false),
|
|
759
|
+
];
|
|
760
|
+
}
|
|
761
|
+
async run() {
|
|
762
|
+
try {
|
|
763
|
+
await this.spawnChildren();
|
|
764
|
+
}
|
|
765
|
+
catch (err) {
|
|
766
|
+
return err;
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
constructor() {
|
|
770
|
+
super(...arguments);
|
|
771
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
772
|
+
}
|
|
773
|
+
};
|
|
774
|
+
})();
|
|
775
|
+
const parent = new ParentWorkflow('Parent');
|
|
776
|
+
const thrownError = (await parent.run());
|
|
777
|
+
// ASSERT: Only failed children counted in message
|
|
778
|
+
expect(thrownError.message).toBe("2 of 5 concurrent child workflows failed in task 'spawnChildren'");
|
|
779
|
+
// ASSERT: All workflows completed
|
|
780
|
+
expect(parent.children.length).toBe(5);
|
|
781
|
+
// ASSERT: Metadata correct
|
|
782
|
+
const metadata = thrownError.original;
|
|
783
|
+
expect(metadata.failedChildren).toBe(2);
|
|
784
|
+
expect(metadata.totalChildren).toBe(5);
|
|
785
|
+
});
|
|
786
|
+
it('should complete all workflows even when errors occur', async () => {
|
|
787
|
+
const completedWorkflows = new Set();
|
|
788
|
+
let ParentWorkflow = (() => {
|
|
789
|
+
let _classSuper = Workflow;
|
|
790
|
+
let _instanceExtraInitializers = [];
|
|
791
|
+
let _spawnChildren_decorators;
|
|
792
|
+
return class ParentWorkflow extends _classSuper {
|
|
793
|
+
static {
|
|
794
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
795
|
+
_spawnChildren_decorators = [Task({
|
|
796
|
+
concurrent: true,
|
|
797
|
+
errorMergeStrategy: { enabled: true },
|
|
798
|
+
})];
|
|
799
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
800
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
801
|
+
}
|
|
802
|
+
async spawnChildren() {
|
|
803
|
+
const children = [
|
|
804
|
+
createChildWorkflow(this, 'Success1', false),
|
|
805
|
+
createChildWorkflow(this, 'Fail1', true),
|
|
806
|
+
createChildWorkflow(this, 'Success2', false),
|
|
807
|
+
createChildWorkflow(this, 'Fail2', true),
|
|
808
|
+
];
|
|
809
|
+
// Track completion
|
|
810
|
+
children.forEach((child) => {
|
|
811
|
+
child.run().then(() => completedWorkflows.add(child.id), () => completedWorkflows.add(child.id));
|
|
812
|
+
});
|
|
813
|
+
return children;
|
|
814
|
+
}
|
|
815
|
+
async run() {
|
|
816
|
+
try {
|
|
817
|
+
await this.spawnChildren();
|
|
818
|
+
}
|
|
819
|
+
catch (err) {
|
|
820
|
+
// Expected
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
constructor() {
|
|
824
|
+
super(...arguments);
|
|
825
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
826
|
+
}
|
|
827
|
+
};
|
|
828
|
+
})();
|
|
829
|
+
const parent = new ParentWorkflow('Parent');
|
|
830
|
+
await parent.run();
|
|
831
|
+
// ASSERT: All workflows completed (no orphans)
|
|
832
|
+
expect(completedWorkflows.size).toBe(4);
|
|
833
|
+
expect(parent.children.length).toBe(4);
|
|
834
|
+
});
|
|
835
|
+
it('should emit error event with merged error', async () => {
|
|
836
|
+
let ParentWorkflow = (() => {
|
|
837
|
+
let _classSuper = Workflow;
|
|
838
|
+
let _instanceExtraInitializers = [];
|
|
839
|
+
let _spawnChildren_decorators;
|
|
840
|
+
return class ParentWorkflow extends _classSuper {
|
|
841
|
+
static {
|
|
842
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
843
|
+
_spawnChildren_decorators = [Task({
|
|
844
|
+
concurrent: true,
|
|
845
|
+
errorMergeStrategy: { enabled: true },
|
|
846
|
+
})];
|
|
847
|
+
__esDecorate(this, null, _spawnChildren_decorators, { kind: "method", name: "spawnChildren", static: false, private: false, access: { has: obj => "spawnChildren" in obj, get: obj => obj.spawnChildren }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
848
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
849
|
+
}
|
|
850
|
+
async spawnChildren() {
|
|
851
|
+
return [
|
|
852
|
+
createChildWorkflow(this, 'OK', false),
|
|
853
|
+
createChildWorkflow(this, 'Bad1', true),
|
|
854
|
+
createChildWorkflow(this, 'Bad2', true),
|
|
855
|
+
];
|
|
856
|
+
}
|
|
857
|
+
async run() {
|
|
858
|
+
try {
|
|
859
|
+
await this.spawnChildren();
|
|
860
|
+
}
|
|
861
|
+
catch (err) {
|
|
862
|
+
return err;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
constructor() {
|
|
866
|
+
super(...arguments);
|
|
867
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
868
|
+
}
|
|
869
|
+
};
|
|
870
|
+
})();
|
|
871
|
+
const parent = new ParentWorkflow('Parent');
|
|
872
|
+
const events = setupEventObserver(parent);
|
|
873
|
+
await parent.run();
|
|
874
|
+
// ASSERT: Error events emitted for individual failures
|
|
875
|
+
const individualErrorEvents = events.filter((e) => {
|
|
876
|
+
if (e.type === 'error') {
|
|
877
|
+
return e.error.message === 'Bad1 failed' || e.error.message === 'Bad2 failed';
|
|
878
|
+
}
|
|
879
|
+
return false;
|
|
880
|
+
});
|
|
881
|
+
expect(individualErrorEvents.length).toBeGreaterThanOrEqual(2);
|
|
882
|
+
// ASSERT: Additional merged error event emitted
|
|
883
|
+
const mergedErrorEvent = events.find((e) => {
|
|
884
|
+
if (e.type === 'error') {
|
|
885
|
+
return e.error.message.includes('concurrent child workflows failed');
|
|
886
|
+
}
|
|
887
|
+
return false;
|
|
888
|
+
});
|
|
889
|
+
expect(mergedErrorEvent).toBeDefined();
|
|
890
|
+
// ASSERT: Merged error has correct structure
|
|
891
|
+
if (mergedErrorEvent && mergedErrorEvent.type === 'error') {
|
|
892
|
+
expect(mergedErrorEvent.error.message).toContain('2 of 3');
|
|
893
|
+
expect(mergedErrorEvent.error.workflowId).toBeDefined();
|
|
894
|
+
expect(Array.isArray(mergedErrorEvent.error.logs)).toBe(true);
|
|
895
|
+
}
|
|
896
|
+
});
|
|
897
|
+
});
|
|
898
|
+
describe.skip('maxMergeDepth validation', () => {
|
|
899
|
+
// NOTE: maxMergeDepth is defined in ErrorMergeStrategy interface
|
|
900
|
+
// but not currently implemented in src/decorators/task.ts
|
|
901
|
+
// These tests should be implemented when maxMergeDepth is added
|
|
902
|
+
it('should respect maxMergeDepth when merging nested errors');
|
|
903
|
+
it('should handle maxMergeDepth=0 (no merging)');
|
|
904
|
+
it('should handle maxMergeDepth=1 (single level merging)');
|
|
905
|
+
});
|
|
906
|
+
});
|
|
907
|
+
//# sourceMappingURL=error-merge-strategy.test.js.map
|