groundswell 0.0.2 → 1.0.0
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/LICENSE +21 -0
- package/README.md +26 -9
- package/dist/cache/cache-key.d.ts +86 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +204 -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 +203 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +833 -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 +127 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +323 -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 +61 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +358 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +543 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +986 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/debugger/event-replayer.d.ts +422 -0
- package/dist/debugger/event-replayer.d.ts.map +1 -0
- package/dist/debugger/event-replayer.js +639 -0
- package/dist/debugger/event-replayer.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 +240 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +620 -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 +192 -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/harnesses/claude-code-harness.d.ts +391 -0
- package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
- package/dist/harnesses/claude-code-harness.js +1076 -0
- package/dist/harnesses/claude-code-harness.js.map +1 -0
- package/dist/harnesses/harness-registry.d.ts +440 -0
- package/dist/harnesses/harness-registry.d.ts.map +1 -0
- package/dist/harnesses/harness-registry.js +543 -0
- package/dist/harnesses/harness-registry.js.map +1 -0
- package/dist/harnesses/index.d.ts +12 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +11 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/pi-harness.d.ts +219 -0
- package/dist/harnesses/pi-harness.d.ts.map +1 -0
- package/dist/harnesses/pi-harness.js +676 -0
- package/dist/harnesses/pi-harness.js.map +1 -0
- package/dist/harnesses/pi-schema-converter.d.ts +24 -0
- package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
- package/dist/harnesses/pi-schema-converter.js +81 -0
- package/dist/harnesses/pi-schema-converter.js.map +1 -0
- package/dist/harnesses/register-defaults.d.ts +24 -0
- package/dist/harnesses/register-defaults.d.ts.map +1 -0
- package/dist/harnesses/register-defaults.js +40 -0
- package/dist/harnesses/register-defaults.js.map +1 -0
- package/dist/harnesses/session-store.d.ts +201 -0
- package/dist/harnesses/session-store.d.ts.map +1 -0
- package/dist/harnesses/session-store.js +254 -0
- package/dist/harnesses/session-store.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -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 +344 -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 +1317 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +423 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +40 -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 +113 -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/harnesses.d.ts +474 -0
- package/dist/types/harnesses.d.ts.map +1 -0
- package/dist/types/harnesses.js +2 -0
- package/dist/types/harnesses.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -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/providers.d.ts +691 -0
- package/dist/types/providers.d.ts.map +1 -0
- package/dist/types/providers.js +14 -0
- package/dist/types/providers.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/restart.d.ts +132 -0
- package/dist/types/restart.d.ts.map +1 -0
- package/dist/types/restart.js +2 -0
- package/dist/types/restart.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/streaming.d.ts +194 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/streaming.js +67 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/workflow-context.d.ts +275 -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/agent-validation.d.ts +88 -0
- package/dist/utils/agent-validation.d.ts.map +1 -0
- package/dist/utils/agent-validation.js +87 -0
- package/dist/utils/agent-validation.js.map +1 -0
- package/dist/utils/delay.d.ts +7 -0
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +9 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/harness-config.d.ts +180 -0
- package/dist/utils/harness-config.d.ts.map +1 -0
- package/dist/utils/harness-config.js +311 -0
- package/dist/utils/harness-config.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/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/model-spec.d.ts +110 -0
- package/dist/utils/model-spec.d.ts.map +1 -0
- package/dist/utils/model-spec.js +149 -0
- package/dist/utils/model-spec.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/provider-config.d.ts +10 -0
- package/dist/utils/provider-config.d.ts.map +1 -0
- package/dist/utils/provider-config.js +10 -0
- package/dist/utils/provider-config.js.map +1 -0
- package/dist/utils/restart-analysis.d.ts +202 -0
- package/dist/utils/restart-analysis.d.ts.map +1 -0
- package/dist/utils/restart-analysis.js +426 -0
- package/dist/utils/restart-analysis.js.map +1 -0
- package/dist/utils/session-serialization.d.ts +118 -0
- package/dist/utils/session-serialization.d.ts.map +1 -0
- package/dist/utils/session-serialization.js +217 -0
- package/dist/utils/session-serialization.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 +34 -5
- 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/CHANGELOG.md +0 -188
- 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/index.ts +0 -18
- 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/index.ts +0 -4
- 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,729 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deep Analysis Tests
|
|
3
|
-
* These tests probe deeper into edge cases, error scenarios, and potential bugs
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
7
|
-
import { Workflow, Step, Task, ObservedState } from '../../index.js';
|
|
8
|
-
import { WorkflowTreeDebugger } from '../../debugger/tree-debugger.js';
|
|
9
|
-
|
|
10
|
-
describe('Deep Analysis Tests', () => {
|
|
11
|
-
describe('Observable Edge Cases', () => {
|
|
12
|
-
it('should handle Observable.subscribe with empty observer object', async () => {
|
|
13
|
-
class TestWorkflow extends Workflow {
|
|
14
|
-
async run() {
|
|
15
|
-
this.emitEvent({ type: 'stepStart', node: this.node, step: 'test' });
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const workflow = new TestWorkflow();
|
|
20
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
21
|
-
|
|
22
|
-
// Subscribe with empty observer - should not crash
|
|
23
|
-
debuggerInstance.events.subscribe({});
|
|
24
|
-
|
|
25
|
-
await workflow.run();
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should handle Observable.unsubscribe during event emission', async () => {
|
|
29
|
-
class TestWorkflow extends Workflow {
|
|
30
|
-
async run() {
|
|
31
|
-
for (let i = 0; i < 10; i++) {
|
|
32
|
-
this.emitEvent({ type: 'stepStart', node: this.node, step: `step-${i}` });
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const workflow = new TestWorkflow();
|
|
38
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
39
|
-
|
|
40
|
-
let count = 0;
|
|
41
|
-
const subscription = debuggerInstance.events.subscribe({
|
|
42
|
-
next: () => {
|
|
43
|
-
count++;
|
|
44
|
-
if (count === 5) {
|
|
45
|
-
subscription.unsubscribe();
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
await workflow.run();
|
|
51
|
-
|
|
52
|
-
// Should have received 5 events before unsubscribing
|
|
53
|
-
expect(count).toBe(5);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
describe('WorkflowLogger Edge Cases', () => {
|
|
58
|
-
it('should handle logger.child() with empty parentLogId', async () => {
|
|
59
|
-
class TestWorkflow extends Workflow {
|
|
60
|
-
async run() {
|
|
61
|
-
const childLogger = this.logger.child('');
|
|
62
|
-
childLogger.info('Child log with empty parent');
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const workflow = new TestWorkflow();
|
|
67
|
-
await workflow.run();
|
|
68
|
-
|
|
69
|
-
expect(workflow.node.logs.length).toBe(1);
|
|
70
|
-
// Empty string is passed through as parentLogId
|
|
71
|
-
expect(workflow.node.logs[0].parentLogId).toBeUndefined();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('should handle logger with very long messages', async () => {
|
|
75
|
-
class TestWorkflow extends Workflow {
|
|
76
|
-
async run() {
|
|
77
|
-
const longMessage = 'A'.repeat(10000);
|
|
78
|
-
this.logger.info(longMessage);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const workflow = new TestWorkflow();
|
|
83
|
-
await workflow.run();
|
|
84
|
-
|
|
85
|
-
expect(workflow.node.logs[0].message.length).toBe(10000);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('should handle logger with special characters in data', async () => {
|
|
89
|
-
class TestWorkflow extends Workflow {
|
|
90
|
-
async run() {
|
|
91
|
-
this.logger.info('Test', {
|
|
92
|
-
null: null,
|
|
93
|
-
undefined: undefined,
|
|
94
|
-
circular: { self: null as any },
|
|
95
|
-
function: () => {},
|
|
96
|
-
symbol: Symbol('test'),
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const workflow = new TestWorkflow();
|
|
102
|
-
// Should not throw
|
|
103
|
-
await workflow.run();
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
describe('Step Decorator Edge Cases', () => {
|
|
108
|
-
it('should handle @Step on synchronous method that returns Promise', async () => {
|
|
109
|
-
class TestWorkflow extends Workflow {
|
|
110
|
-
@Step()
|
|
111
|
-
async testStep() {
|
|
112
|
-
return Promise.resolve('done');
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
async run() {
|
|
116
|
-
return this.testStep();
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const workflow = new TestWorkflow();
|
|
121
|
-
const result = await workflow.run();
|
|
122
|
-
expect(result).toBe('done');
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it('should handle @Step that returns undefined', async () => {
|
|
126
|
-
class TestWorkflow extends Workflow {
|
|
127
|
-
@Step()
|
|
128
|
-
async testStep() {
|
|
129
|
-
// No return
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
async run() {
|
|
133
|
-
return this.testStep();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const workflow = new TestWorkflow();
|
|
138
|
-
const result = await workflow.run();
|
|
139
|
-
expect(result).toBeUndefined();
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('should handle @Step that throws non-Error', async () => {
|
|
143
|
-
class TestWorkflow extends Workflow {
|
|
144
|
-
@Step()
|
|
145
|
-
async testStep() {
|
|
146
|
-
throw 'string error';
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
async run() {
|
|
150
|
-
try {
|
|
151
|
-
await this.testStep();
|
|
152
|
-
} catch (err) {
|
|
153
|
-
// Non-Error throws get wrapped with 'Unknown error' message
|
|
154
|
-
// but the original is preserved
|
|
155
|
-
expect((err as any).message).toBe('Unknown error');
|
|
156
|
-
expect((err as any).original).toBe('string error');
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const workflow = new TestWorkflow();
|
|
162
|
-
await workflow.run();
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('should handle @Step that throws null', async () => {
|
|
166
|
-
class TestWorkflow extends Workflow {
|
|
167
|
-
@Step()
|
|
168
|
-
async testStep() {
|
|
169
|
-
throw null;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
async run() {
|
|
173
|
-
try {
|
|
174
|
-
await this.testStep();
|
|
175
|
-
} catch (err) {
|
|
176
|
-
expect(err).not.toBeNull();
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const workflow = new TestWorkflow();
|
|
182
|
-
await workflow.run();
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
describe('Task Decorator Edge Cases', () => {
|
|
187
|
-
it('should handle @Task that returns primitive value', async () => {
|
|
188
|
-
class TestWorkflow extends Workflow {
|
|
189
|
-
@Task()
|
|
190
|
-
async returnsString() {
|
|
191
|
-
return 'not a workflow';
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
async run() {
|
|
195
|
-
return this.returnsString();
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const workflow = new TestWorkflow();
|
|
200
|
-
const result = await workflow.run();
|
|
201
|
-
expect(result).toBe('not a workflow');
|
|
202
|
-
expect(workflow.children.length).toBe(0);
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
it('should handle @Task that returns number', async () => {
|
|
206
|
-
class TestWorkflow extends Workflow {
|
|
207
|
-
@Task()
|
|
208
|
-
async returnsNumber() {
|
|
209
|
-
return 42;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
async run() {
|
|
213
|
-
return this.returnsNumber();
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const workflow = new TestWorkflow();
|
|
218
|
-
const result = await workflow.run();
|
|
219
|
-
expect(result).toBe(42);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it('should handle @Task that returns object with id property (duck typing)', async () => {
|
|
223
|
-
class TestWorkflow extends Workflow {
|
|
224
|
-
@Task()
|
|
225
|
-
async returnsDuck() {
|
|
226
|
-
return { id: 'duck-123', name: 'Duck' };
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
async run() {
|
|
230
|
-
return this.returnsDuck();
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
const workflow = new TestWorkflow();
|
|
235
|
-
const result = await workflow.run();
|
|
236
|
-
// Duck typing - objects with 'id' property get parent attached
|
|
237
|
-
// The returned object is mutated to have a parent property
|
|
238
|
-
expect(result.id).toBe('duck-123');
|
|
239
|
-
expect(result.name).toBe('Duck');
|
|
240
|
-
expect((result as { parent?: unknown }).parent).toBeDefined();
|
|
241
|
-
// Duck typing treats it as a workflow and attaches it
|
|
242
|
-
expect(workflow.children.length).toBe(1);
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
it('should handle @Task with concurrent on single non-workflow', async () => {
|
|
246
|
-
class TestWorkflow extends Workflow {
|
|
247
|
-
@Task({ concurrent: true })
|
|
248
|
-
async returnsString() {
|
|
249
|
-
return 'not a workflow';
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
async run() {
|
|
253
|
-
return this.returnsString();
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
const workflow = new TestWorkflow();
|
|
258
|
-
const result = await workflow.run();
|
|
259
|
-
expect(result).toBe('not a workflow');
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('should handle @Task with concurrent: true but no run method', async () => {
|
|
263
|
-
class ChildWorkflow extends Workflow {
|
|
264
|
-
// No run method - will throw
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
class ParentWorkflow extends Workflow {
|
|
268
|
-
@Task({ concurrent: true })
|
|
269
|
-
async spawnChild() {
|
|
270
|
-
return new ChildWorkflow('Child', this);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
async run() {
|
|
274
|
-
// Child will be attached but running it will throw
|
|
275
|
-
return this.spawnChild();
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
const workflow = new ParentWorkflow();
|
|
280
|
-
await workflow.run();
|
|
281
|
-
|
|
282
|
-
// Child should still be attached
|
|
283
|
-
expect(workflow.children.length).toBe(1);
|
|
284
|
-
});
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
describe('ObservedState Edge Cases', () => {
|
|
288
|
-
it('should handle undefined value in observed state', async () => {
|
|
289
|
-
class TestWorkflow extends Workflow {
|
|
290
|
-
@ObservedState()
|
|
291
|
-
undefinedField: string | undefined = undefined;
|
|
292
|
-
|
|
293
|
-
async run() {
|
|
294
|
-
this.snapshotState();
|
|
295
|
-
return this.node.stateSnapshot;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
const workflow = new TestWorkflow();
|
|
300
|
-
const snapshot = await workflow.run();
|
|
301
|
-
|
|
302
|
-
expect(snapshot?.undefinedField).toBeUndefined();
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
it('should handle circular reference in observed state', async () => {
|
|
306
|
-
class TestWorkflow extends Workflow {
|
|
307
|
-
@ObservedState()
|
|
308
|
-
circular: any = {};
|
|
309
|
-
|
|
310
|
-
async run() {
|
|
311
|
-
this.circular.self = this.circular;
|
|
312
|
-
this.snapshotState();
|
|
313
|
-
return this.node.stateSnapshot;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const workflow = new TestWorkflow();
|
|
318
|
-
// Should not crash
|
|
319
|
-
await workflow.run();
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
it('should handle deeply nested object in observed state', async () => {
|
|
323
|
-
class TestWorkflow extends Workflow {
|
|
324
|
-
@ObservedState()
|
|
325
|
-
nested: any = { level: 1 };
|
|
326
|
-
|
|
327
|
-
async run() {
|
|
328
|
-
for (let i = 2; i <= 100; i++) {
|
|
329
|
-
this.nested = { level: i, child: this.nested };
|
|
330
|
-
}
|
|
331
|
-
this.snapshotState();
|
|
332
|
-
return this.node.stateSnapshot;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
const workflow = new TestWorkflow();
|
|
337
|
-
const snapshot = await workflow.run();
|
|
338
|
-
|
|
339
|
-
expect(snapshot?.nested).toBeDefined();
|
|
340
|
-
});
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
describe('Workflow Construction Edge Cases', () => {
|
|
344
|
-
it('should handle Workflow with no arguments', async () => {
|
|
345
|
-
class TestWorkflow extends Workflow {
|
|
346
|
-
async run() {
|
|
347
|
-
return 'done';
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
const workflow = new TestWorkflow();
|
|
352
|
-
expect(workflow.node.name).toBe('TestWorkflow');
|
|
353
|
-
expect(workflow.parent).toBeNull();
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
it('should handle Workflow with only parent argument', async () => {
|
|
357
|
-
class ChildWorkflow extends Workflow {
|
|
358
|
-
async run() {
|
|
359
|
-
return 'done';
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
class ParentWorkflow extends Workflow {
|
|
364
|
-
async run() {
|
|
365
|
-
const child = new ChildWorkflow(undefined as any, this);
|
|
366
|
-
expect(child.parent).toBe(this);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
const workflow = new ParentWorkflow();
|
|
371
|
-
await workflow.run();
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
it('should handle functional workflow pattern', async () => {
|
|
375
|
-
const workflow = new Workflow({ name: 'FunctionalWorkflow' }, async (ctx) => {
|
|
376
|
-
await ctx.step('test', async () => {
|
|
377
|
-
return 'done';
|
|
378
|
-
});
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
const result = await workflow.run();
|
|
382
|
-
expect(result).toBeDefined();
|
|
383
|
-
});
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
describe('Tree Debugger Edge Cases', () => {
|
|
387
|
-
it('should handle toTreeString on deep hierarchy', async () => {
|
|
388
|
-
// Create a root workflow with deep children
|
|
389
|
-
class RootWorkflow extends Workflow {
|
|
390
|
-
async run() {
|
|
391
|
-
return 'done';
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
const root = new RootWorkflow();
|
|
396
|
-
let lastWorkflow: any = root;
|
|
397
|
-
|
|
398
|
-
// Build deep hierarchy
|
|
399
|
-
for (let i = 0; i < 20; i++) {
|
|
400
|
-
const ChildWorkflow = class extends Workflow {
|
|
401
|
-
async run() {
|
|
402
|
-
return 'done';
|
|
403
|
-
}
|
|
404
|
-
};
|
|
405
|
-
const child = new ChildWorkflow(`Workflow-${i}`, lastWorkflow);
|
|
406
|
-
await child.run();
|
|
407
|
-
lastWorkflow = child;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
// Create debugger on the root
|
|
411
|
-
const debuggerInstance = new WorkflowTreeDebugger(root);
|
|
412
|
-
const treeString = debuggerInstance.toTreeString();
|
|
413
|
-
|
|
414
|
-
expect(treeString.length).toBeGreaterThan(0);
|
|
415
|
-
expect(treeString.split('\n').length).toBeGreaterThan(20);
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
it('should handle toLogString on workflow with no logs', async () => {
|
|
419
|
-
class TestWorkflow extends Workflow {
|
|
420
|
-
async run() {
|
|
421
|
-
// No logs
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
const workflow = new TestWorkflow();
|
|
426
|
-
await workflow.run();
|
|
427
|
-
|
|
428
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
429
|
-
const logString = debuggerInstance.toLogString();
|
|
430
|
-
|
|
431
|
-
expect(typeof logString).toBe('string');
|
|
432
|
-
});
|
|
433
|
-
|
|
434
|
-
it('should handle getNode on non-existent ID', async () => {
|
|
435
|
-
class TestWorkflow extends Workflow {
|
|
436
|
-
async run() {
|
|
437
|
-
return 'done';
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
const workflow = new TestWorkflow();
|
|
442
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
443
|
-
|
|
444
|
-
const node = debuggerInstance.getNode('non-existent-id');
|
|
445
|
-
expect(node).toBeUndefined();
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
it('should handle getStats on complex tree', async () => {
|
|
449
|
-
class ChildWorkflow extends Workflow {
|
|
450
|
-
@Step()
|
|
451
|
-
async step() {
|
|
452
|
-
this.logger.info('Child log');
|
|
453
|
-
return 'done';
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
async run() {
|
|
457
|
-
return this.step();
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
class ParentWorkflow extends Workflow {
|
|
462
|
-
@Task({ concurrent: true })
|
|
463
|
-
async spawnChildren() {
|
|
464
|
-
return [
|
|
465
|
-
new ChildWorkflow('Child1', this),
|
|
466
|
-
new ChildWorkflow('Child2', this),
|
|
467
|
-
new ChildWorkflow('Child3', this),
|
|
468
|
-
];
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
async run() {
|
|
472
|
-
await this.spawnChildren();
|
|
473
|
-
await Promise.all(this.children.map(c => c.run()));
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
const workflow = new ParentWorkflow();
|
|
478
|
-
await workflow.run();
|
|
479
|
-
|
|
480
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
481
|
-
const stats = debuggerInstance.getStats();
|
|
482
|
-
|
|
483
|
-
expect(stats.totalNodes).toBe(4); // 1 parent + 3 children
|
|
484
|
-
expect(stats.totalLogs).toBeGreaterThan(0);
|
|
485
|
-
expect(stats.totalEvents).toBeGreaterThan(0);
|
|
486
|
-
expect(stats.byStatus).toBeDefined();
|
|
487
|
-
});
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
describe('Event Propagation Edge Cases', () => {
|
|
491
|
-
it('should handle events emitted during observer callback', async () => {
|
|
492
|
-
class TestWorkflow extends Workflow {
|
|
493
|
-
async run() {
|
|
494
|
-
let callCount = 0;
|
|
495
|
-
|
|
496
|
-
this.addObserver({
|
|
497
|
-
onLog: () => {},
|
|
498
|
-
onEvent: () => {
|
|
499
|
-
callCount++;
|
|
500
|
-
// Emit another event during callback
|
|
501
|
-
if (callCount === 1) {
|
|
502
|
-
this.emitEvent({ type: 'stepStart', node: this.node, step: 'nested' });
|
|
503
|
-
}
|
|
504
|
-
},
|
|
505
|
-
onStateUpdated: () => {},
|
|
506
|
-
onTreeChanged: () => {},
|
|
507
|
-
});
|
|
508
|
-
|
|
509
|
-
this.emitEvent({ type: 'stepStart', node: this.node, step: 'initial' });
|
|
510
|
-
|
|
511
|
-
expect(callCount).toBeGreaterThanOrEqual(1);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
const workflow = new TestWorkflow();
|
|
516
|
-
await workflow.run();
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
it('should handle multiple observers with different behaviors', async () => {
|
|
520
|
-
class TestWorkflow extends Workflow {
|
|
521
|
-
async run() {
|
|
522
|
-
const results: { [key: string]: number } = {};
|
|
523
|
-
|
|
524
|
-
this.addObserver({
|
|
525
|
-
onLog: () => { results.observer1 = (results.observer1 || 0) + 1; },
|
|
526
|
-
onEvent: () => { results.observer1 = (results.observer1 || 0) + 1; },
|
|
527
|
-
onStateUpdated: () => {},
|
|
528
|
-
onTreeChanged: () => {},
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
this.addObserver({
|
|
532
|
-
onLog: () => { results.observer2 = (results.observer2 || 0) + 1; },
|
|
533
|
-
onEvent: () => { results.observer2 = (results.observer2 || 0) + 1; },
|
|
534
|
-
onStateUpdated: () => {},
|
|
535
|
-
onTreeChanged: () => {},
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
this.emitEvent({ type: 'stepStart', node: this.node, step: 'test' });
|
|
539
|
-
|
|
540
|
-
expect(results.observer1).toBeGreaterThan(0);
|
|
541
|
-
expect(results.observer2).toBeGreaterThan(0);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
const workflow = new TestWorkflow();
|
|
546
|
-
await workflow.run();
|
|
547
|
-
});
|
|
548
|
-
});
|
|
549
|
-
|
|
550
|
-
describe('State Transition Edge Cases', () => {
|
|
551
|
-
it('should handle status changes during execution', async () => {
|
|
552
|
-
class TestWorkflow extends Workflow {
|
|
553
|
-
async run() {
|
|
554
|
-
expect(this.status).toBe('idle');
|
|
555
|
-
this.setStatus('running');
|
|
556
|
-
expect(this.status).toBe('running');
|
|
557
|
-
this.setStatus('completed');
|
|
558
|
-
expect(this.status).toBe('completed');
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
const workflow = new TestWorkflow();
|
|
563
|
-
await workflow.run();
|
|
564
|
-
});
|
|
565
|
-
|
|
566
|
-
it('should handle invalid status values', async () => {
|
|
567
|
-
class TestWorkflow extends Workflow {
|
|
568
|
-
async run() {
|
|
569
|
-
// TypeScript should prevent this at compile time, but let's test runtime
|
|
570
|
-
this.setStatus('invalid' as any);
|
|
571
|
-
// Status should be set (no validation at runtime)
|
|
572
|
-
expect(this.status).toBe('invalid');
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
const workflow = new TestWorkflow();
|
|
577
|
-
await workflow.run();
|
|
578
|
-
});
|
|
579
|
-
});
|
|
580
|
-
|
|
581
|
-
describe('Child Attachment Edge Cases', () => {
|
|
582
|
-
it('should prevent attaching the same child twice', async () => {
|
|
583
|
-
class ChildWorkflow extends Workflow {
|
|
584
|
-
async run() {
|
|
585
|
-
return 'done';
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
class ParentWorkflow extends Workflow {
|
|
590
|
-
async run() {
|
|
591
|
-
const child = new ChildWorkflow('Child', this);
|
|
592
|
-
// Try to attach again
|
|
593
|
-
expect(() => {
|
|
594
|
-
this.attachChild(child);
|
|
595
|
-
}).toThrow('Child already attached');
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
const workflow = new ParentWorkflow();
|
|
600
|
-
await workflow.run();
|
|
601
|
-
});
|
|
602
|
-
|
|
603
|
-
it('should handle child with parent set in constructor', async () => {
|
|
604
|
-
class ChildWorkflow extends Workflow {
|
|
605
|
-
async run() {
|
|
606
|
-
return 'done';
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
class ParentWorkflow extends Workflow {
|
|
611
|
-
async run() {
|
|
612
|
-
const child = new ChildWorkflow('Child', this);
|
|
613
|
-
// Child should already be attached
|
|
614
|
-
expect(this.children.length).toBe(1);
|
|
615
|
-
expect(this.children[0]).toBe(child);
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
const workflow = new ParentWorkflow();
|
|
620
|
-
await workflow.run();
|
|
621
|
-
});
|
|
622
|
-
});
|
|
623
|
-
|
|
624
|
-
describe('Memory and Resource Edge Cases', () => {
|
|
625
|
-
it('should handle rapid workflow creation and destruction', async () => {
|
|
626
|
-
class TestWorkflow extends Workflow {
|
|
627
|
-
async run() {
|
|
628
|
-
return 'done';
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
for (let i = 0; i < 100; i++) {
|
|
633
|
-
const workflow = new TestWorkflow(`Workflow-${i}`);
|
|
634
|
-
await workflow.run();
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
// If we got here without crashing, memory management is reasonable
|
|
638
|
-
expect(true).toBe(true);
|
|
639
|
-
});
|
|
640
|
-
|
|
641
|
-
it('should handle many observers on single workflow', async () => {
|
|
642
|
-
class TestWorkflow extends Workflow {
|
|
643
|
-
async run() {
|
|
644
|
-
this.emitEvent({ type: 'stepStart', node: this.node, step: 'test' });
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
const workflow = new TestWorkflow();
|
|
649
|
-
|
|
650
|
-
// Add 100 observers
|
|
651
|
-
for (let i = 0; i < 100; i++) {
|
|
652
|
-
workflow.addObserver({
|
|
653
|
-
onLog: () => {},
|
|
654
|
-
onEvent: () => {},
|
|
655
|
-
onStateUpdated: () => {},
|
|
656
|
-
onTreeChanged: () => {},
|
|
657
|
-
});
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
await workflow.run();
|
|
661
|
-
|
|
662
|
-
// Should complete without issues
|
|
663
|
-
expect(true).toBe(true);
|
|
664
|
-
});
|
|
665
|
-
});
|
|
666
|
-
|
|
667
|
-
describe('Error Recovery Edge Cases', () => {
|
|
668
|
-
it('should handle error in @Step followed by another @Step', async () => {
|
|
669
|
-
class TestWorkflow extends Workflow {
|
|
670
|
-
@Step()
|
|
671
|
-
async failingStep() {
|
|
672
|
-
throw new Error('Failed');
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
@Step()
|
|
676
|
-
async successStep() {
|
|
677
|
-
return 'success';
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
async run() {
|
|
681
|
-
try {
|
|
682
|
-
await this.failingStep();
|
|
683
|
-
} catch (err) {
|
|
684
|
-
// Expected
|
|
685
|
-
}
|
|
686
|
-
return await this.successStep();
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
const workflow = new TestWorkflow();
|
|
691
|
-
const result = await workflow.run();
|
|
692
|
-
expect(result).toBe('success');
|
|
693
|
-
});
|
|
694
|
-
|
|
695
|
-
it('should handle multiple sequential errors', async () => {
|
|
696
|
-
class TestWorkflow extends Workflow {
|
|
697
|
-
@Step()
|
|
698
|
-
async errorStep1() {
|
|
699
|
-
throw new Error('Error 1');
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
@Step()
|
|
703
|
-
async errorStep2() {
|
|
704
|
-
throw new Error('Error 2');
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
async run() {
|
|
708
|
-
try {
|
|
709
|
-
await this.errorStep1();
|
|
710
|
-
} catch (err) {
|
|
711
|
-
// Expected
|
|
712
|
-
}
|
|
713
|
-
try {
|
|
714
|
-
await this.errorStep2();
|
|
715
|
-
} catch (err) {
|
|
716
|
-
// Expected
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
const workflow = new TestWorkflow();
|
|
722
|
-
await workflow.run();
|
|
723
|
-
|
|
724
|
-
// Should have multiple error events
|
|
725
|
-
const errorEvents = workflow.node.events.filter(e => e.type === 'error');
|
|
726
|
-
expect(errorEvents.length).toBe(2);
|
|
727
|
-
});
|
|
728
|
-
});
|
|
729
|
-
});
|