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
|
@@ -1,789 +0,0 @@
|
|
|
1
|
-
# TypeScript Error Aggregation Patterns for Promise.allSettled
|
|
2
|
-
|
|
3
|
-
**Research Date:** 2026-01-12
|
|
4
|
-
**Status:** Comprehensive Research Report
|
|
5
|
-
**Target:** P1M2T2S2 - Error Aggregation Implementation
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Executive Summary
|
|
10
|
-
|
|
11
|
-
This document provides comprehensive research on TypeScript error aggregation patterns specifically for Promise.allSettled results. It covers fundamental patterns, type-safe implementations, production-grade strategies, and common pitfalls.
|
|
12
|
-
|
|
13
|
-
**Key Finding:** TypeScript's type system provides excellent support for Promise.allSettled through discriminated unions and type guards, enabling type-safe error aggregation patterns that preserve both success and failure information.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Table of Contents
|
|
18
|
-
|
|
19
|
-
1. [Fundamental Patterns](#1-fundamental-patterns)
|
|
20
|
-
2. [Type-Safe Implementations](#2-type-safe-implementations)
|
|
21
|
-
3. [Production-Grade Patterns](#3-production-grade-patterns)
|
|
22
|
-
4. [Common Pitfalls](#4-common-pitfalls)
|
|
23
|
-
5. [Best Practices](#5-best-practices)
|
|
24
|
-
6. [Code Examples](#6-code-examples)
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 1. Fundamental Patterns
|
|
29
|
-
|
|
30
|
-
### 1.1 Basic Error Collection Pattern
|
|
31
|
-
|
|
32
|
-
The simplest pattern for collecting errors from Promise.allSettled:
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
async function executeWithErrorCollection<T>(
|
|
36
|
-
promises: Promise<T>[]
|
|
37
|
-
): Promise<{ values: T[]; errors: unknown[] }> {
|
|
38
|
-
const results = await Promise.allSettled(promises);
|
|
39
|
-
|
|
40
|
-
const values: T[] = [];
|
|
41
|
-
const errors: unknown[] = [];
|
|
42
|
-
|
|
43
|
-
for (const result of results) {
|
|
44
|
-
if (result.status === 'fulfilled') {
|
|
45
|
-
values.push(result.value);
|
|
46
|
-
} else {
|
|
47
|
-
errors.push(result.reason);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return { values, errors };
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**Key Insights:**
|
|
56
|
-
- Preserves both successful values and errors
|
|
57
|
-
- Returns a structured result for explicit handling
|
|
58
|
-
- Caller decides what to do with errors
|
|
59
|
-
|
|
60
|
-
**Use Cases:**
|
|
61
|
-
- Bulk operations where partial success is acceptable
|
|
62
|
-
- Data synchronization scenarios
|
|
63
|
-
- Batch processing with retry logic
|
|
64
|
-
|
|
65
|
-
### 1.2 Filter Pattern
|
|
66
|
-
|
|
67
|
-
Using array methods to separate successes and failures:
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
async function executeWithFilter<T>(
|
|
71
|
-
promises: Promise<T>[]
|
|
72
|
-
): Promise<{ successes: T[]; failures: unknown[] }> {
|
|
73
|
-
const results = await Promise.allSettled(promises);
|
|
74
|
-
|
|
75
|
-
const successes = results
|
|
76
|
-
.filter((r): r is PromiseFulfilledResult<T> => r.status === 'fulfilled')
|
|
77
|
-
.map(r => r.value);
|
|
78
|
-
|
|
79
|
-
const failures = results
|
|
80
|
-
.filter((r): r is PromiseRejectedResult => r.status === 'rejected')
|
|
81
|
-
.map(r => r.reason);
|
|
82
|
-
|
|
83
|
-
return { successes, failures };
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
**Key Insights:**
|
|
88
|
-
- Uses TypeScript type guards for type narrowing
|
|
89
|
-
- Cleaner separation of concerns
|
|
90
|
-
- More functional programming style
|
|
91
|
-
|
|
92
|
-
**Use Cases:**
|
|
93
|
-
- When you need separate arrays for successes and failures
|
|
94
|
-
- When you want to process successes and failures differently
|
|
95
|
-
- Reporting and analytics scenarios
|
|
96
|
-
|
|
97
|
-
### 1.3 Reduce Pattern
|
|
98
|
-
|
|
99
|
-
Using reduce to accumulate results in a single pass:
|
|
100
|
-
|
|
101
|
-
```typescript
|
|
102
|
-
async function executeWithReduce<T>(
|
|
103
|
-
promises: Promise<T>[]
|
|
104
|
-
): Promise<{ successes: T[]; failures: unknown[]; stats: { total: number; succeeded: number; failed: number } }> {
|
|
105
|
-
const results = await Promise.allSettled(promises);
|
|
106
|
-
|
|
107
|
-
const { successes, failures, stats } = results.reduce<{
|
|
108
|
-
successes: T[];
|
|
109
|
-
failures: unknown[];
|
|
110
|
-
stats: { total: number; succeeded: number; failed: number };
|
|
111
|
-
}>(
|
|
112
|
-
(acc, result) => {
|
|
113
|
-
acc.stats.total++;
|
|
114
|
-
|
|
115
|
-
if (result.status === 'fulfilled') {
|
|
116
|
-
acc.successes.push(result.value);
|
|
117
|
-
acc.stats.succeeded++;
|
|
118
|
-
} else {
|
|
119
|
-
acc.failures.push(result.reason);
|
|
120
|
-
acc.stats.failed++;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return acc;
|
|
124
|
-
},
|
|
125
|
-
{ successes: [], failures: [], stats: { total: 0, succeeded: 0, failed: 0 } }
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
return { successes, failures, stats };
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
**Key Insights:**
|
|
133
|
-
- Single pass through results (more efficient)
|
|
134
|
-
- Builds statistics alongside collection
|
|
135
|
-
- Useful for monitoring and analytics
|
|
136
|
-
|
|
137
|
-
**Use Cases:**
|
|
138
|
-
- When you need statistics along with results
|
|
139
|
-
- Performance-critical scenarios with large arrays
|
|
140
|
-
- Real-time monitoring and reporting
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## 2. Type-Safe Implementations
|
|
145
|
-
|
|
146
|
-
### 2.1 Type Guards for PromiseSettledResult
|
|
147
|
-
|
|
148
|
-
TypeScript requires type guards to properly narrow PromiseSettledResult types:
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
// Type guard for fulfilled results
|
|
152
|
-
function isFulfilled<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T> {
|
|
153
|
-
return result.status === 'fulfilled';
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Type guard for rejected results
|
|
157
|
-
function isRejected<T>(result: PromiseSettledResult<T>): result is PromiseRejectedResult {
|
|
158
|
-
return result.status === 'rejected';
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Usage
|
|
162
|
-
const results = await Promise.allSettled(promises);
|
|
163
|
-
|
|
164
|
-
// Without type guard - TypeScript error
|
|
165
|
-
// results.filter(r => r.status === 'fulfilled').map(r => r.value); // ERROR
|
|
166
|
-
|
|
167
|
-
// With type guard - TypeScript knows value exists
|
|
168
|
-
const successes = results.filter(isFulfilled).map(r => r.value);
|
|
169
|
-
const failures = results.filter(isRejected).map(r => r.reason);
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
**Key Insights:**
|
|
173
|
-
- Type guards are essential for type safety
|
|
174
|
-
- TypeScript cannot narrow types without explicit type predicates
|
|
175
|
-
- Reusable type guards improve code consistency
|
|
176
|
-
|
|
177
|
-
### 2.2 Discriminated Union Pattern
|
|
178
|
-
|
|
179
|
-
Create a custom discriminated union for better type safety:
|
|
180
|
-
|
|
181
|
-
```typescript
|
|
182
|
-
type SettledResult<T, E = Error> =
|
|
183
|
-
| { status: 'fulfilled'; value: T }
|
|
184
|
-
| { status: 'rejected'; error: E };
|
|
185
|
-
|
|
186
|
-
async function executeWithDiscriminatedUnion<T>(
|
|
187
|
-
promises: Promise<T>[]
|
|
188
|
-
): Promise<SettledResult<T, Error>[]> {
|
|
189
|
-
const results = await Promise.allSettled(promises);
|
|
190
|
-
|
|
191
|
-
return results.map(result => {
|
|
192
|
-
if (result.status === 'fulfilled') {
|
|
193
|
-
return { status: 'fulfilled' as const, value: result.value };
|
|
194
|
-
} else {
|
|
195
|
-
const reason = result.reason;
|
|
196
|
-
const error = reason instanceof Error ? reason : new Error(String(reason));
|
|
197
|
-
return { status: 'rejected' as const, error };
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Type-safe usage
|
|
203
|
-
for (const result of await executeWithDiscriminatedUnion(promises)) {
|
|
204
|
-
if (result.status === 'fulfilled') {
|
|
205
|
-
console.log(result.value); // TypeScript knows this is T
|
|
206
|
-
} else {
|
|
207
|
-
console.error(result.error.message); // TypeScript knows this is Error
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
**Key Insights:**
|
|
213
|
-
- Custom discriminated unions provide better type safety
|
|
214
|
-
- Normalizes non-Error rejections to Error objects
|
|
215
|
-
- More explicit and self-documenting than PromiseSettledResult
|
|
216
|
-
|
|
217
|
-
### 2.3 Generic Error Aggregation Type
|
|
218
|
-
|
|
219
|
-
Create a reusable generic type for error aggregation:
|
|
220
|
-
|
|
221
|
-
```typescript
|
|
222
|
-
type ExecutionResult<T, E = Error> = {
|
|
223
|
-
successes: T[];
|
|
224
|
-
failures: Array<{ index: number; error: E }>;
|
|
225
|
-
stats: {
|
|
226
|
-
total: number;
|
|
227
|
-
succeeded: number;
|
|
228
|
-
failed: number;
|
|
229
|
-
errorRate: number;
|
|
230
|
-
};
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
async function executeWithTypedErrors<T, E = Error>(
|
|
234
|
-
promises: Promise<T>[]
|
|
235
|
-
): Promise<ExecutionResult<T, E>> {
|
|
236
|
-
const results = await Promise.allSettled(promises);
|
|
237
|
-
|
|
238
|
-
const successes: T[] = [];
|
|
239
|
-
const failures: Array<{ index: number; error: E }> = [];
|
|
240
|
-
|
|
241
|
-
results.forEach((result, index) => {
|
|
242
|
-
if (result.status === 'fulfilled') {
|
|
243
|
-
successes.push(result.value);
|
|
244
|
-
} else {
|
|
245
|
-
const reason = result.reason;
|
|
246
|
-
const error = reason instanceof Error ? (reason as E) : new Error(String(reason)) as E;
|
|
247
|
-
failures.push({ index, error });
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
const stats = {
|
|
252
|
-
total: results.length,
|
|
253
|
-
succeeded: successes.length,
|
|
254
|
-
failed: failures.length,
|
|
255
|
-
errorRate: failures.length / results.length,
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
return { successes, failures, stats };
|
|
259
|
-
}
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
**Key Insights:**
|
|
263
|
-
- Generic types enable reusability across different scenarios
|
|
264
|
-
- Preserves index information for debugging
|
|
265
|
-
- Includes statistics for monitoring
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
## 3. Production-Grade Patterns
|
|
270
|
-
|
|
271
|
-
### 3.1 Contextual Error Aggregation
|
|
272
|
-
|
|
273
|
-
Associate errors with their source operations:
|
|
274
|
-
|
|
275
|
-
```typescript
|
|
276
|
-
interface Operation<T> {
|
|
277
|
-
id: string;
|
|
278
|
-
name: string;
|
|
279
|
-
promise: Promise<T>;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
interface OperationResult<T, E = Error> {
|
|
283
|
-
operation: { id: string; name: string };
|
|
284
|
-
status: 'fulfilled' | 'rejected';
|
|
285
|
-
value?: T;
|
|
286
|
-
error?: E;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
async function executeWithContext<T>(
|
|
290
|
-
operations: Operation<T>[]
|
|
291
|
-
): Promise<OperationResult<T>[]> {
|
|
292
|
-
const promises = operations.map(op => op.promise);
|
|
293
|
-
const results = await Promise.allSettled(promises);
|
|
294
|
-
|
|
295
|
-
return operations.map((operation, index) => {
|
|
296
|
-
const result = results[index];
|
|
297
|
-
|
|
298
|
-
if (result.status === 'fulfilled') {
|
|
299
|
-
return {
|
|
300
|
-
operation: { id: operation.id, name: operation.name },
|
|
301
|
-
status: 'fulfilled',
|
|
302
|
-
value: result.value,
|
|
303
|
-
};
|
|
304
|
-
} else {
|
|
305
|
-
const reason = result.reason;
|
|
306
|
-
const error = reason instanceof Error ? reason : new Error(String(reason));
|
|
307
|
-
return {
|
|
308
|
-
operation: { id: operation.id, name: operation.name },
|
|
309
|
-
status: 'rejected',
|
|
310
|
-
error,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
**Key Insights:**
|
|
318
|
-
- Preserves operation context (id, name) with results
|
|
319
|
-
- Critical for debugging and logging
|
|
320
|
-
- Enables detailed error reporting
|
|
321
|
-
|
|
322
|
-
**Use Cases:**
|
|
323
|
-
- Batch API calls with different endpoints
|
|
324
|
-
- Multi-step workflows
|
|
325
|
-
- Parallel data processing with different sources
|
|
326
|
-
|
|
327
|
-
### 3.2 Error Rate Thresholding
|
|
328
|
-
|
|
329
|
-
Implement threshold-based error handling:
|
|
330
|
-
|
|
331
|
-
```typescript
|
|
332
|
-
interface ThresholdOptions {
|
|
333
|
-
maxErrorRate: number; // 0.0 to 1.0
|
|
334
|
-
minAbsoluteErrors: number;
|
|
335
|
-
onThresholdExceeded?: (stats: { errorRate: number; failed: number; total: number }) => void;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
async function executeWithThreshold<T>(
|
|
339
|
-
promises: Promise<T>[],
|
|
340
|
-
options: ThresholdOptions
|
|
341
|
-
): Promise<{ successes: T[]; failures: unknown[]; exceededThreshold: boolean }> {
|
|
342
|
-
const results = await Promise.allSettled(promises);
|
|
343
|
-
|
|
344
|
-
const successes = results
|
|
345
|
-
.filter((r): r is PromiseFulfilledResult<T> => r.status === 'fulfilled')
|
|
346
|
-
.map(r => r.value);
|
|
347
|
-
|
|
348
|
-
const failures = results
|
|
349
|
-
.filter((r): r is PromiseRejectedResult => r.status === 'rejected')
|
|
350
|
-
.map(r => r.reason);
|
|
351
|
-
|
|
352
|
-
const errorRate = failures.length / results.length;
|
|
353
|
-
const exceededThreshold =
|
|
354
|
-
failures.length >= options.minAbsoluteErrors ||
|
|
355
|
-
errorRate > options.maxErrorRate;
|
|
356
|
-
|
|
357
|
-
if (exceededThreshold && options.onThresholdExceeded) {
|
|
358
|
-
options.onThresholdExceeded({
|
|
359
|
-
errorRate,
|
|
360
|
-
failed: failures.length,
|
|
361
|
-
total: results.length,
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
return { successes, failures, exceededThreshold };
|
|
366
|
-
}
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
**Key Insights:**
|
|
370
|
-
- Allows some failures without throwing
|
|
371
|
-
- Configurable tolerance levels
|
|
372
|
-
- Useful for graceful degradation
|
|
373
|
-
|
|
374
|
-
**Use Cases:**
|
|
375
|
-
- High-volume operations where some failures are acceptable
|
|
376
|
-
- Cache warming
|
|
377
|
-
- Bulk notifications
|
|
378
|
-
- Data replication
|
|
379
|
-
|
|
380
|
-
### 3.3 Hierarchical Error Aggregation
|
|
381
|
-
|
|
382
|
-
Aggregate errors with hierarchical context:
|
|
383
|
-
|
|
384
|
-
```typescript
|
|
385
|
-
interface HierarchicalError {
|
|
386
|
-
message: string;
|
|
387
|
-
errors: Array<{
|
|
388
|
-
operationId: string;
|
|
389
|
-
operationName: string;
|
|
390
|
-
error: Error;
|
|
391
|
-
timestamp: number;
|
|
392
|
-
}>;
|
|
393
|
-
parentContext?: {
|
|
394
|
-
workflowId: string;
|
|
395
|
-
workflowName: string;
|
|
396
|
-
};
|
|
397
|
-
stats: {
|
|
398
|
-
totalErrors: number;
|
|
399
|
-
errorsByOperation: Record<string, number>;
|
|
400
|
-
errorsByType: Record<string, number>;
|
|
401
|
-
};
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
async function executeWithHierarchicalErrors<T>(
|
|
405
|
-
operations: Array<{ id: string; name: string; promise: Promise<T> }>,
|
|
406
|
-
parentContext?: { workflowId: string; workflowName: string }
|
|
407
|
-
): Promise<{ successes: T[]; aggregatedError?: HierarchicalError }> {
|
|
408
|
-
const results = await Promise.allSettled(operations.map(op => op.promise));
|
|
409
|
-
|
|
410
|
-
const successes: T[] = [];
|
|
411
|
-
const errors: Array<{
|
|
412
|
-
operationId: string;
|
|
413
|
-
operationName: string;
|
|
414
|
-
error: Error;
|
|
415
|
-
timestamp: number;
|
|
416
|
-
}> = [];
|
|
417
|
-
|
|
418
|
-
operations.forEach((op, index) => {
|
|
419
|
-
const result = results[index];
|
|
420
|
-
|
|
421
|
-
if (result.status === 'fulfilled') {
|
|
422
|
-
successes.push(result.value);
|
|
423
|
-
} else {
|
|
424
|
-
const reason = result.reason;
|
|
425
|
-
const error = reason instanceof Error ? reason : new Error(String(reason));
|
|
426
|
-
errors.push({
|
|
427
|
-
operationId: op.id,
|
|
428
|
-
operationName: op.name,
|
|
429
|
-
error,
|
|
430
|
-
timestamp: Date.now(),
|
|
431
|
-
});
|
|
432
|
-
}
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
if (errors.length > 0) {
|
|
436
|
-
const errorsByOperation: Record<string, number> = {};
|
|
437
|
-
const errorsByType: Record<string, number> = {};
|
|
438
|
-
|
|
439
|
-
errors.forEach(err => {
|
|
440
|
-
errorsByOperation[err.operationName] = (errorsByOperation[err.operationName] || 0) + 1;
|
|
441
|
-
const errorType = err.error.constructor.name;
|
|
442
|
-
errorsByType[errorType] = (errorsByType[errorType] || 0) + 1;
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
const aggregatedError: HierarchicalError = {
|
|
446
|
-
message: `${errors.length} operation(s) failed`,
|
|
447
|
-
errors,
|
|
448
|
-
parentContext,
|
|
449
|
-
stats: {
|
|
450
|
-
totalErrors: errors.length,
|
|
451
|
-
errorsByOperation,
|
|
452
|
-
errorsByType,
|
|
453
|
-
},
|
|
454
|
-
};
|
|
455
|
-
|
|
456
|
-
return { successes, aggregatedError };
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
return { successes };
|
|
460
|
-
}
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
**Key Insights:**
|
|
464
|
-
- Maintains full error hierarchy
|
|
465
|
-
- Provides error statistics and categorization
|
|
466
|
-
- Excellent for debugging and monitoring
|
|
467
|
-
|
|
468
|
-
**Use Cases:**
|
|
469
|
-
- Complex workflow engines
|
|
470
|
-
- Distributed systems
|
|
471
|
-
- Microservice orchestration
|
|
472
|
-
|
|
473
|
-
---
|
|
474
|
-
|
|
475
|
-
## 4. Common Pitfalls
|
|
476
|
-
|
|
477
|
-
### 4.1 Forgetting Type Guards
|
|
478
|
-
|
|
479
|
-
**Problem:** Not using type guards causes type narrowing issues.
|
|
480
|
-
|
|
481
|
-
```typescript
|
|
482
|
-
// ❌ WRONG - TypeScript error
|
|
483
|
-
const results = await Promise.allSettled(promises);
|
|
484
|
-
const successes = results.filter(r => r.status === 'fulfilled');
|
|
485
|
-
successes.forEach(s => {
|
|
486
|
-
console.log(s.value); // TypeScript error: value might not exist
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
// ✅ CORRECT - Use type guard
|
|
490
|
-
function isFulfilled<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T> {
|
|
491
|
-
return result.status === 'fulfilled';
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
const results = await Promise.allSettled(promises);
|
|
495
|
-
const successes = results.filter(isFulfilled);
|
|
496
|
-
successes.forEach(s => {
|
|
497
|
-
console.log(s.value); // TypeScript knows value exists
|
|
498
|
-
});
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
### 4.2 Losing Error Context
|
|
502
|
-
|
|
503
|
-
**Problem:** Not capturing which operation failed makes debugging difficult.
|
|
504
|
-
|
|
505
|
-
```typescript
|
|
506
|
-
// ❌ WRONG - Don't know which promise failed
|
|
507
|
-
const results = await Promise.allSettled([
|
|
508
|
-
fetch('/api/users'),
|
|
509
|
-
fetch('/api/posts'),
|
|
510
|
-
fetch('/api/comments')
|
|
511
|
-
]);
|
|
512
|
-
|
|
513
|
-
// ✅ CORRECT - Associate results with operations
|
|
514
|
-
const operations = [
|
|
515
|
-
{ name: 'users', promise: fetch('/api/users') },
|
|
516
|
-
{ name: 'posts', promise: fetch('/api/posts') },
|
|
517
|
-
{ name: 'comments', promise: fetch('/api/comments') }
|
|
518
|
-
];
|
|
519
|
-
|
|
520
|
-
const results = await Promise.allSettled(operations.map(op => op.promise));
|
|
521
|
-
|
|
522
|
-
const failures = operations
|
|
523
|
-
.map((op, i) => ({ ...op, result: results[i] }))
|
|
524
|
-
.filter(({ result }) => result.status === 'rejected')
|
|
525
|
-
.map(({ name, result }) => ({
|
|
526
|
-
operation: name,
|
|
527
|
-
error: (result as PromiseRejectedResult).reason
|
|
528
|
-
}));
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
### 4.3 Not Handling Non-Error Rejections
|
|
532
|
-
|
|
533
|
-
**Problem:** Promises can reject with non-Error values.
|
|
534
|
-
|
|
535
|
-
```typescript
|
|
536
|
-
// Promise.reject can reject with anything
|
|
537
|
-
const results = await Promise.allSettled([
|
|
538
|
-
Promise.reject('string error'),
|
|
539
|
-
Promise.reject(123),
|
|
540
|
-
Promise.reject(null),
|
|
541
|
-
Promise.reject(undefined)
|
|
542
|
-
]);
|
|
543
|
-
|
|
544
|
-
// ✅ CORRECT - Handle non-Error rejections
|
|
545
|
-
const normalizedErrors = results
|
|
546
|
-
.filter(r => r.status === 'rejected')
|
|
547
|
-
.map(r => {
|
|
548
|
-
const reason = (r as PromiseRejectedResult).reason;
|
|
549
|
-
if (reason instanceof Error) {
|
|
550
|
-
return reason;
|
|
551
|
-
}
|
|
552
|
-
return new Error(String(reason ?? 'Unknown error'));
|
|
553
|
-
});
|
|
554
|
-
```
|
|
555
|
-
|
|
556
|
-
### 4.4 Memory Issues with Large Arrays
|
|
557
|
-
|
|
558
|
-
**Problem:** Storing all results can consume significant memory.
|
|
559
|
-
|
|
560
|
-
```typescript
|
|
561
|
-
// ❌ PROBLEMATIC - Stores all results in memory
|
|
562
|
-
const results = await Promise.allSettled(largeArrayOfPromises);
|
|
563
|
-
|
|
564
|
-
// ✅ BETTER - Process results in batches
|
|
565
|
-
async function processBatch<T>(
|
|
566
|
-
promises: Promise<T>[],
|
|
567
|
-
batchSize: number,
|
|
568
|
-
processor: (results: PromiseSettledResult<T>[]) => void
|
|
569
|
-
) {
|
|
570
|
-
for (let i = 0; i < promises.length; i += batchSize) {
|
|
571
|
-
const batch = promises.slice(i, i + batchSize);
|
|
572
|
-
const results = await Promise.allSettled(batch);
|
|
573
|
-
processor(results);
|
|
574
|
-
// Allow GC to clean up batch results
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
```
|
|
578
|
-
|
|
579
|
-
---
|
|
580
|
-
|
|
581
|
-
## 5. Best Practices
|
|
582
|
-
|
|
583
|
-
### 5.1 Always Use Type Guards
|
|
584
|
-
|
|
585
|
-
```typescript
|
|
586
|
-
// Reusable type guards
|
|
587
|
-
export const PromiseSettledHelpers = {
|
|
588
|
-
isFulfilled<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T> {
|
|
589
|
-
return result.status === 'fulfilled';
|
|
590
|
-
},
|
|
591
|
-
|
|
592
|
-
isRejected<T>(result: PromiseSettledResult<T>): result is PromiseRejectedResult {
|
|
593
|
-
return result.status === 'rejected';
|
|
594
|
-
},
|
|
595
|
-
|
|
596
|
-
filterFulfilled<T>(results: PromiseSettledResult<T>[]): T[] {
|
|
597
|
-
return results.filter(this.isFulfilled).map(r => r.value);
|
|
598
|
-
},
|
|
599
|
-
|
|
600
|
-
filterRejected<T>(results: PromiseSettledResult<T>[]): unknown[] {
|
|
601
|
-
return results.filter(this.isRejected).map(r => r.reason);
|
|
602
|
-
},
|
|
603
|
-
};
|
|
604
|
-
```
|
|
605
|
-
|
|
606
|
-
### 5.2 Preserve Operation Context
|
|
607
|
-
|
|
608
|
-
Always associate results with their source operations:
|
|
609
|
-
|
|
610
|
-
```typescript
|
|
611
|
-
interface ContextualResult<T, E = Error> {
|
|
612
|
-
operationId: string;
|
|
613
|
-
operationName: string;
|
|
614
|
-
status: 'fulfilled' | 'rejected';
|
|
615
|
-
value?: T;
|
|
616
|
-
error?: E;
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
async function executeWithContext<T>(
|
|
620
|
-
operations: Array<{ id: string; name: string; promise: Promise<T> }>
|
|
621
|
-
): Promise<ContextualResult<T>[]> {
|
|
622
|
-
// Implementation from section 3.1
|
|
623
|
-
}
|
|
624
|
-
```
|
|
625
|
-
|
|
626
|
-
### 5.3 Normalize Errors
|
|
627
|
-
|
|
628
|
-
Always normalize non-Error rejections to Error objects:
|
|
629
|
-
|
|
630
|
-
```typescript
|
|
631
|
-
function normalizeError(reason: unknown): Error {
|
|
632
|
-
if (reason instanceof Error) {
|
|
633
|
-
return reason;
|
|
634
|
-
}
|
|
635
|
-
if (reason === null || reason === undefined) {
|
|
636
|
-
return new Error('Unknown error');
|
|
637
|
-
}
|
|
638
|
-
return new Error(String(reason));
|
|
639
|
-
}
|
|
640
|
-
```
|
|
641
|
-
|
|
642
|
-
### 5.4 Provide Statistics
|
|
643
|
-
|
|
644
|
-
Include statistics for monitoring and debugging:
|
|
645
|
-
|
|
646
|
-
```typescript
|
|
647
|
-
interface ExecutionStats {
|
|
648
|
-
total: number;
|
|
649
|
-
succeeded: number;
|
|
650
|
-
failed: number;
|
|
651
|
-
errorRate: number;
|
|
652
|
-
duration: number;
|
|
653
|
-
}
|
|
654
|
-
```
|
|
655
|
-
|
|
656
|
-
---
|
|
657
|
-
|
|
658
|
-
## 6. Code Examples
|
|
659
|
-
|
|
660
|
-
### 6.1 Complete Example: Batch API Calls
|
|
661
|
-
|
|
662
|
-
```typescript
|
|
663
|
-
interface ApiCall {
|
|
664
|
-
id: string;
|
|
665
|
-
name: string;
|
|
666
|
-
url: string;
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
interface ApiResult {
|
|
670
|
-
id: string;
|
|
671
|
-
name: string;
|
|
672
|
-
status: number;
|
|
673
|
-
data?: unknown;
|
|
674
|
-
error?: Error;
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
async function batchApiCalls(calls: ApiCall[]): Promise<{
|
|
678
|
-
successes: ApiResult[];
|
|
679
|
-
failures: ApiResult[];
|
|
680
|
-
stats: { total: number; succeeded: number; failed: number; errorRate: number };
|
|
681
|
-
}> {
|
|
682
|
-
const operations = calls.map(call => ({
|
|
683
|
-
id: call.id,
|
|
684
|
-
name: call.name,
|
|
685
|
-
promise: fetch(call.url).then(res => ({
|
|
686
|
-
id: call.id,
|
|
687
|
-
name: call.name,
|
|
688
|
-
status: res.status,
|
|
689
|
-
data: res.ok ? await res.json() : undefined,
|
|
690
|
-
})),
|
|
691
|
-
}));
|
|
692
|
-
|
|
693
|
-
const results = await Promise.allSettled(operations.map(op => op.promise));
|
|
694
|
-
|
|
695
|
-
const successes: ApiResult[] = [];
|
|
696
|
-
const failures: ApiResult[] = [];
|
|
697
|
-
|
|
698
|
-
operations.forEach((op, index) => {
|
|
699
|
-
const result = results[index];
|
|
700
|
-
|
|
701
|
-
if (result.status === 'fulfilled') {
|
|
702
|
-
successes.push(result.value);
|
|
703
|
-
} else {
|
|
704
|
-
failures.push({
|
|
705
|
-
id: op.id,
|
|
706
|
-
name: op.name,
|
|
707
|
-
status: 0,
|
|
708
|
-
error: result.reason instanceof Error ? result.reason : new Error(String(result.reason)),
|
|
709
|
-
});
|
|
710
|
-
}
|
|
711
|
-
});
|
|
712
|
-
|
|
713
|
-
const stats = {
|
|
714
|
-
total: results.length,
|
|
715
|
-
succeeded: successes.length,
|
|
716
|
-
failed: failures.length,
|
|
717
|
-
errorRate: failures.length / results.length,
|
|
718
|
-
};
|
|
719
|
-
|
|
720
|
-
return { successes, failures, stats };
|
|
721
|
-
}
|
|
722
|
-
```
|
|
723
|
-
|
|
724
|
-
### 6.2 Complete Example: Workflow Error Aggregation
|
|
725
|
-
|
|
726
|
-
```typescript
|
|
727
|
-
interface WorkflowError {
|
|
728
|
-
workflowId: string;
|
|
729
|
-
workflowName: string;
|
|
730
|
-
error: Error;
|
|
731
|
-
timestamp: number;
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
interface WorkflowAggregateError extends Error {
|
|
735
|
-
name: 'WorkflowAggregateError';
|
|
736
|
-
message: string;
|
|
737
|
-
errors: WorkflowError[];
|
|
738
|
-
parentWorkflowId: string;
|
|
739
|
-
totalChildren: number;
|
|
740
|
-
failedChildren: number;
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
function createWorkflowAggregateError(
|
|
744
|
-
errors: WorkflowError[],
|
|
745
|
-
parentWorkflowId: string,
|
|
746
|
-
totalChildren: number
|
|
747
|
-
): WorkflowAggregateError {
|
|
748
|
-
const error = new Error(
|
|
749
|
-
`${errors.length} child workflow(s) failed`
|
|
750
|
-
) as WorkflowAggregateError;
|
|
751
|
-
|
|
752
|
-
error.name = 'WorkflowAggregateError';
|
|
753
|
-
error.errors = errors;
|
|
754
|
-
error.parentWorkflowId = parentWorkflowId;
|
|
755
|
-
error.totalChildren = totalChildren;
|
|
756
|
-
error.failedChildren = errors.length;
|
|
757
|
-
|
|
758
|
-
return error;
|
|
759
|
-
}
|
|
760
|
-
```
|
|
761
|
-
|
|
762
|
-
---
|
|
763
|
-
|
|
764
|
-
## References
|
|
765
|
-
|
|
766
|
-
### TypeScript Documentation
|
|
767
|
-
1. TypeScript Handbook: Type Guards - https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates
|
|
768
|
-
2. TypeScript Handbook: Discriminated Unions - https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions
|
|
769
|
-
3. PromiseSettledResult Type - https://www.typescriptlang.org/docs/handbook/2/types-from-types.html#promise-types
|
|
770
|
-
|
|
771
|
-
### MDN Documentation
|
|
772
|
-
4. Promise.allSettled() - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
|
|
773
|
-
5. Using Promises - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises
|
|
774
|
-
|
|
775
|
-
### Community Resources
|
|
776
|
-
6. StackOverflow: TypeScript Promise.allSettled typing - https://stackoverflow.com/questions/60191992
|
|
777
|
-
7. StackOverflow: Type guards for PromiseSettledResult - https://stackoverflow.com/questions/60386810
|
|
778
|
-
|
|
779
|
-
### Groundswell-Specific
|
|
780
|
-
8. Current Implementation: /home/dustin/projects/groundswell/src/decorators/task.ts
|
|
781
|
-
9. Error Strategy Types: /home/dustin/projects/groundswell/src/types/error-strategy.ts
|
|
782
|
-
10. WorkflowError Interface: /home/dustin/projects/groundswell/src/types/error.ts
|
|
783
|
-
|
|
784
|
-
---
|
|
785
|
-
|
|
786
|
-
**Document Version:** 1.0
|
|
787
|
-
**Last Updated:** 2026-01-12
|
|
788
|
-
**Status:** Complete
|
|
789
|
-
**Next Review:** After P1M2T2S2 Implementation
|