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,643 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { Workflow } from '../../core/workflow';
|
|
3
|
-
import type { WorkflowObserver, WorkflowEvent, LogEntry } from '../../types';
|
|
4
|
-
|
|
5
|
-
describe('Observer Error Logging Integration Tests', () => {
|
|
6
|
-
describe('WorkflowLogger observer onLog error', () => {
|
|
7
|
-
it('should log observer onLog errors to workflow.node.logs', async () => {
|
|
8
|
-
const onLogError = new Error('Observer onLog failed');
|
|
9
|
-
|
|
10
|
-
const throwingObserver: WorkflowObserver = {
|
|
11
|
-
onLog: () => {
|
|
12
|
-
throw onLogError;
|
|
13
|
-
},
|
|
14
|
-
onEvent: () => {},
|
|
15
|
-
onStateUpdated: () => {},
|
|
16
|
-
onTreeChanged: () => {},
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
class TestWorkflow extends Workflow {
|
|
20
|
-
async run() {
|
|
21
|
-
this.logger.info('Test message');
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const workflow = new TestWorkflow();
|
|
26
|
-
workflow.addObserver(throwingObserver);
|
|
27
|
-
await workflow.run();
|
|
28
|
-
|
|
29
|
-
// Should have 2 logs: the original "Test message" and the observer error
|
|
30
|
-
expect(workflow.node.logs.length).toBe(2);
|
|
31
|
-
|
|
32
|
-
// First log is the original message
|
|
33
|
-
expect(workflow.node.logs[0].message).toBe('Test message');
|
|
34
|
-
expect(workflow.node.logs[0].level).toBe('info');
|
|
35
|
-
|
|
36
|
-
// Second log is the observer error
|
|
37
|
-
expect(workflow.node.logs[1].message).toBe('Observer onLog error');
|
|
38
|
-
expect(workflow.node.logs[1].level).toBe('error');
|
|
39
|
-
expect(workflow.node.logs[1].data).toEqual({ error: onLogError });
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('should avoid infinite recursion when observer onLog throws', async () => {
|
|
43
|
-
let callCount = 0;
|
|
44
|
-
const maxCalls = 10; // Safety limit to prevent actual infinite loop
|
|
45
|
-
|
|
46
|
-
const throwingObserver: WorkflowObserver = {
|
|
47
|
-
onLog: () => {
|
|
48
|
-
callCount++;
|
|
49
|
-
if (callCount < maxCalls) {
|
|
50
|
-
throw new Error('Recursive error');
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
onEvent: () => {},
|
|
54
|
-
onStateUpdated: () => {},
|
|
55
|
-
onTreeChanged: () => {},
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
class TestWorkflow extends Workflow {
|
|
59
|
-
async run() {
|
|
60
|
-
this.logger.info('Test message');
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const workflow = new TestWorkflow();
|
|
65
|
-
workflow.addObserver(throwingObserver);
|
|
66
|
-
await workflow.run();
|
|
67
|
-
|
|
68
|
-
// Should only call onLog once (original) + one error log, then stop
|
|
69
|
-
// The error log should NOT trigger another observer notification
|
|
70
|
-
expect(callCount).toBe(1);
|
|
71
|
-
|
|
72
|
-
// Should have 2 logs: original + error
|
|
73
|
-
expect(workflow.node.logs.length).toBe(2);
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
describe('Workflow observer onEvent error', () => {
|
|
78
|
-
it('should log observer onEvent errors via this.logger.error', () => {
|
|
79
|
-
const onEventError = new Error('Observer onEvent failed');
|
|
80
|
-
|
|
81
|
-
const throwingObserver: WorkflowObserver = {
|
|
82
|
-
onLog: () => {},
|
|
83
|
-
onEvent: () => {
|
|
84
|
-
throw onEventError;
|
|
85
|
-
},
|
|
86
|
-
onStateUpdated: () => {},
|
|
87
|
-
onTreeChanged: () => {},
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
class TestWorkflow extends Workflow {
|
|
91
|
-
async run() {
|
|
92
|
-
this.emitEvent({ type: 'testEvent' } as any);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const workflow = new TestWorkflow();
|
|
97
|
-
workflow.addObserver(throwingObserver);
|
|
98
|
-
|
|
99
|
-
workflow.run();
|
|
100
|
-
|
|
101
|
-
// Should have error log entry
|
|
102
|
-
const errorLog = workflow.node.logs.find((log) => log.message === 'Observer onEvent error');
|
|
103
|
-
expect(errorLog).toBeDefined();
|
|
104
|
-
expect(errorLog?.level).toBe('error');
|
|
105
|
-
expect(errorLog?.data).toEqual({
|
|
106
|
-
error: onEventError,
|
|
107
|
-
eventType: 'testEvent',
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('should include event type in error data', () => {
|
|
112
|
-
const throwingObserver: WorkflowObserver = {
|
|
113
|
-
onLog: () => {},
|
|
114
|
-
onEvent: () => {
|
|
115
|
-
throw new Error('Event error');
|
|
116
|
-
},
|
|
117
|
-
onStateUpdated: () => {},
|
|
118
|
-
onTreeChanged: () => {},
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
class TestWorkflow extends Workflow {
|
|
122
|
-
async run() {
|
|
123
|
-
this.emitEvent({ type: 'treeUpdated', root: this.node });
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const workflow = new TestWorkflow();
|
|
128
|
-
workflow.addObserver(throwingObserver);
|
|
129
|
-
|
|
130
|
-
workflow.run();
|
|
131
|
-
|
|
132
|
-
const errorLog = workflow.node.logs.find((log) => log.message === 'Observer onEvent error');
|
|
133
|
-
expect(errorLog?.data).toHaveProperty('eventType', 'treeUpdated');
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
describe('Workflow observer onStateUpdated error', () => {
|
|
138
|
-
it('should log observer onStateUpdated errors via this.logger.error', async () => {
|
|
139
|
-
const onStateUpdatedError = new Error('Observer onStateUpdated failed');
|
|
140
|
-
|
|
141
|
-
const throwingObserver: WorkflowObserver = {
|
|
142
|
-
onLog: () => {},
|
|
143
|
-
onEvent: () => {},
|
|
144
|
-
onStateUpdated: () => {
|
|
145
|
-
throw onStateUpdatedError;
|
|
146
|
-
},
|
|
147
|
-
onTreeChanged: () => {},
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
class TestWorkflow extends Workflow {
|
|
151
|
-
async run() {
|
|
152
|
-
this.snapshotState();
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const workflow = new TestWorkflow();
|
|
157
|
-
workflow.addObserver(throwingObserver);
|
|
158
|
-
await workflow.run();
|
|
159
|
-
|
|
160
|
-
// Should have error log entry
|
|
161
|
-
const errorLog = workflow.node.logs.find(
|
|
162
|
-
(log) => log.message === 'Observer onStateUpdated error'
|
|
163
|
-
);
|
|
164
|
-
expect(errorLog).toBeDefined();
|
|
165
|
-
expect(errorLog?.level).toBe('error');
|
|
166
|
-
expect(errorLog?.data).toEqual({
|
|
167
|
-
error: onStateUpdatedError,
|
|
168
|
-
nodeId: workflow.node.id,
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it('should include node ID in error data', async () => {
|
|
173
|
-
const throwingObserver: WorkflowObserver = {
|
|
174
|
-
onLog: () => {},
|
|
175
|
-
onEvent: () => {},
|
|
176
|
-
onStateUpdated: () => {
|
|
177
|
-
throw new Error('State update error');
|
|
178
|
-
},
|
|
179
|
-
onTreeChanged: () => {},
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
class TestWorkflow extends Workflow {
|
|
183
|
-
async run() {
|
|
184
|
-
this.snapshotState();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const workflow = new TestWorkflow();
|
|
189
|
-
workflow.addObserver(throwingObserver);
|
|
190
|
-
await workflow.run();
|
|
191
|
-
|
|
192
|
-
const errorLog = workflow.node.logs.find(
|
|
193
|
-
(log) => log.message === 'Observer onStateUpdated error'
|
|
194
|
-
);
|
|
195
|
-
expect(errorLog?.data).toHaveProperty('nodeId', workflow.node.id);
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
describe('Validation errors still use console.error', () => {
|
|
200
|
-
it('should use console.error for child already has parent validation', () => {
|
|
201
|
-
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
202
|
-
|
|
203
|
-
const parent = new Workflow('ParentWorkflow');
|
|
204
|
-
const child1 = new Workflow('Child1', parent);
|
|
205
|
-
const child2 = new Workflow('Child2');
|
|
206
|
-
|
|
207
|
-
// Try to attach child1 to child2 (should fail - already has parent)
|
|
208
|
-
expect(() => {
|
|
209
|
-
child2.attachChild(child1);
|
|
210
|
-
}).toThrow();
|
|
211
|
-
|
|
212
|
-
// Should have called console.error for validation
|
|
213
|
-
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
214
|
-
const errorMessage = consoleErrorSpy.mock.calls[0][0] as string;
|
|
215
|
-
expect(errorMessage).toContain('already has a parent');
|
|
216
|
-
|
|
217
|
-
consoleErrorSpy.mockRestore();
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it('should use console.error for circular reference detection', () => {
|
|
221
|
-
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
222
|
-
|
|
223
|
-
const grandparent = new Workflow('Grandparent');
|
|
224
|
-
const parent = new Workflow('Parent', grandparent);
|
|
225
|
-
const child = new Workflow('Child', parent);
|
|
226
|
-
|
|
227
|
-
// Try to attach grandparent as child of child (circular reference)
|
|
228
|
-
expect(() => {
|
|
229
|
-
child.attachChild(grandparent);
|
|
230
|
-
}).toThrow();
|
|
231
|
-
|
|
232
|
-
// Should have called console.error for validation
|
|
233
|
-
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
234
|
-
const errorMessage = consoleErrorSpy.mock.calls[0][0] as string;
|
|
235
|
-
expect(errorMessage).toContain('circular reference');
|
|
236
|
-
|
|
237
|
-
consoleErrorSpy.mockRestore();
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
describe('Error isolation', () => {
|
|
242
|
-
it('should not crash workflow when observer onLog throws', async () => {
|
|
243
|
-
const throwingObserver: WorkflowObserver = {
|
|
244
|
-
onLog: () => {
|
|
245
|
-
throw new Error('Observer onLog error');
|
|
246
|
-
},
|
|
247
|
-
onEvent: () => {},
|
|
248
|
-
onStateUpdated: () => {},
|
|
249
|
-
onTreeChanged: () => {},
|
|
250
|
-
};
|
|
251
|
-
|
|
252
|
-
class TestWorkflow extends Workflow {
|
|
253
|
-
async run() {
|
|
254
|
-
this.logger.info('Message 1');
|
|
255
|
-
this.logger.info('Message 2');
|
|
256
|
-
this.logger.info('Message 3');
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
const workflow = new TestWorkflow();
|
|
261
|
-
workflow.addObserver(throwingObserver);
|
|
262
|
-
|
|
263
|
-
// Should complete without throwing
|
|
264
|
-
await expect(workflow.run()).resolves.toBeUndefined();
|
|
265
|
-
|
|
266
|
-
// All messages should be logged
|
|
267
|
-
expect(workflow.node.logs.length).toBe(6); // 3 messages + 3 error logs
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
it('should not crash workflow when observer onEvent throws', () => {
|
|
271
|
-
const throwingObserver: WorkflowObserver = {
|
|
272
|
-
onLog: () => {},
|
|
273
|
-
onEvent: () => {
|
|
274
|
-
throw new Error('Observer onEvent error');
|
|
275
|
-
},
|
|
276
|
-
onStateUpdated: () => {},
|
|
277
|
-
onTreeChanged: () => {},
|
|
278
|
-
};
|
|
279
|
-
|
|
280
|
-
class TestWorkflow extends Workflow {
|
|
281
|
-
async run() {
|
|
282
|
-
this.emitEvent({ type: 'event1' } as any);
|
|
283
|
-
this.emitEvent({ type: 'event2' } as any);
|
|
284
|
-
this.emitEvent({ type: 'event3' } as any);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
const workflow = new TestWorkflow();
|
|
289
|
-
workflow.addObserver(throwingObserver);
|
|
290
|
-
|
|
291
|
-
// Should complete without throwing
|
|
292
|
-
expect(() => {
|
|
293
|
-
workflow.run();
|
|
294
|
-
}).not.toThrow();
|
|
295
|
-
|
|
296
|
-
// All events should be emitted
|
|
297
|
-
expect(workflow.node.events.length).toBe(3);
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
it('should not crash workflow when observer onStateUpdated throws', async () => {
|
|
301
|
-
const throwingObserver: WorkflowObserver = {
|
|
302
|
-
onLog: () => {},
|
|
303
|
-
onEvent: () => {},
|
|
304
|
-
onStateUpdated: () => {
|
|
305
|
-
throw new Error('Observer onStateUpdated error');
|
|
306
|
-
},
|
|
307
|
-
onTreeChanged: () => {},
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
class TestWorkflow extends Workflow {
|
|
311
|
-
async run() {
|
|
312
|
-
this.snapshotState();
|
|
313
|
-
this.snapshotState();
|
|
314
|
-
this.snapshotState();
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const workflow = new TestWorkflow();
|
|
319
|
-
workflow.addObserver(throwingObserver);
|
|
320
|
-
|
|
321
|
-
// Should complete without throwing
|
|
322
|
-
await expect(workflow.run()).resolves.toBeUndefined();
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
describe('Observer onTreeChanged error', () => {
|
|
327
|
-
it('should log observer onTreeChanged errors (caught as onEvent error)', () => {
|
|
328
|
-
const onTreeChangedError = new Error('Observer onTreeChanged failed');
|
|
329
|
-
|
|
330
|
-
const throwingObserver: WorkflowObserver = {
|
|
331
|
-
onLog: () => {},
|
|
332
|
-
onEvent: () => {},
|
|
333
|
-
onStateUpdated: () => {},
|
|
334
|
-
onTreeChanged: () => {
|
|
335
|
-
throw onTreeChangedError;
|
|
336
|
-
},
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
class TestWorkflow extends Workflow {
|
|
340
|
-
async run() {
|
|
341
|
-
// Trigger treeUpdated event which calls onTreeChanged
|
|
342
|
-
this.emitEvent({ type: 'treeUpdated', root: this.node });
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
const workflow = new TestWorkflow();
|
|
347
|
-
workflow.addObserver(throwingObserver);
|
|
348
|
-
|
|
349
|
-
workflow.run();
|
|
350
|
-
|
|
351
|
-
// Should have error log entry (logged as "Observer onEvent error" since onTreeChanged is in onEvent try-catch)
|
|
352
|
-
const errorLog = workflow.node.logs.find((log) => log.message === 'Observer onEvent error');
|
|
353
|
-
expect(errorLog).toBeDefined();
|
|
354
|
-
expect(errorLog?.level).toBe('error');
|
|
355
|
-
expect(errorLog?.data).toEqual({
|
|
356
|
-
error: onTreeChangedError,
|
|
357
|
-
eventType: 'treeUpdated',
|
|
358
|
-
});
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
it('should log observer onTreeChanged errors for childAttached events', () => {
|
|
362
|
-
const onTreeChangedError = new Error('Tree changed on attach');
|
|
363
|
-
|
|
364
|
-
const throwingObserver: WorkflowObserver = {
|
|
365
|
-
onLog: () => {},
|
|
366
|
-
onEvent: () => {},
|
|
367
|
-
onStateUpdated: () => {},
|
|
368
|
-
onTreeChanged: () => {
|
|
369
|
-
throw onTreeChangedError;
|
|
370
|
-
},
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
const parent = new Workflow('ParentWorkflow');
|
|
374
|
-
const child = new Workflow('ChildWorkflow');
|
|
375
|
-
|
|
376
|
-
parent.addObserver(throwingObserver);
|
|
377
|
-
|
|
378
|
-
// Trigger childAttached event which calls onTreeChanged
|
|
379
|
-
parent.attachChild(child);
|
|
380
|
-
|
|
381
|
-
// Should have error log entry (logged as "Observer onEvent error")
|
|
382
|
-
const errorLog = parent.node.logs.find((log) => log.message === 'Observer onEvent error');
|
|
383
|
-
expect(errorLog).toBeDefined();
|
|
384
|
-
expect(errorLog?.data).toEqual({
|
|
385
|
-
error: onTreeChangedError,
|
|
386
|
-
eventType: 'childAttached',
|
|
387
|
-
});
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
it('should log observer onTreeChanged errors for childDetached events', () => {
|
|
391
|
-
const onTreeChangedError = new Error('Tree changed on detach');
|
|
392
|
-
|
|
393
|
-
const throwingObserver: WorkflowObserver = {
|
|
394
|
-
onLog: () => {},
|
|
395
|
-
onEvent: () => {},
|
|
396
|
-
onStateUpdated: () => {},
|
|
397
|
-
onTreeChanged: () => {
|
|
398
|
-
throw onTreeChangedError;
|
|
399
|
-
},
|
|
400
|
-
};
|
|
401
|
-
|
|
402
|
-
const parent = new Workflow('ParentWorkflow');
|
|
403
|
-
const child = new Workflow('ChildWorkflow', parent);
|
|
404
|
-
|
|
405
|
-
parent.addObserver(throwingObserver);
|
|
406
|
-
|
|
407
|
-
// Clear logs from setup
|
|
408
|
-
parent.node.logs = [];
|
|
409
|
-
|
|
410
|
-
// Trigger childDetached event which calls onTreeChanged
|
|
411
|
-
parent.detachChild(child);
|
|
412
|
-
|
|
413
|
-
// Should have error log entry (logged as "Observer onEvent error")
|
|
414
|
-
const errorLog = parent.node.logs.find((log) => log.message === 'Observer onEvent error');
|
|
415
|
-
expect(errorLog).toBeDefined();
|
|
416
|
-
expect(errorLog?.data).toEqual({
|
|
417
|
-
error: onTreeChangedError,
|
|
418
|
-
eventType: 'childDetached',
|
|
419
|
-
});
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
describe('Console.error negative verification', () => {
|
|
424
|
-
it('should NOT call console.error for observer onLog errors', async () => {
|
|
425
|
-
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
426
|
-
|
|
427
|
-
const throwingObserver: WorkflowObserver = {
|
|
428
|
-
onLog: () => {
|
|
429
|
-
throw new Error('Observer onLog error');
|
|
430
|
-
},
|
|
431
|
-
onEvent: () => {},
|
|
432
|
-
onStateUpdated: () => {},
|
|
433
|
-
onTreeChanged: () => {},
|
|
434
|
-
};
|
|
435
|
-
|
|
436
|
-
class TestWorkflow extends Workflow {
|
|
437
|
-
async run() {
|
|
438
|
-
this.logger.info('Test message');
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
const workflow = new TestWorkflow();
|
|
443
|
-
workflow.addObserver(throwingObserver);
|
|
444
|
-
await workflow.run();
|
|
445
|
-
|
|
446
|
-
// Verify console.error was NOT called for observer error
|
|
447
|
-
expect(consoleErrorSpy).not.toHaveBeenCalled();
|
|
448
|
-
|
|
449
|
-
// Verify error was logged to workflow.node.logs instead
|
|
450
|
-
const errorLog = workflow.node.logs.find((log) => log.message === 'Observer onLog error');
|
|
451
|
-
expect(errorLog).toBeDefined();
|
|
452
|
-
|
|
453
|
-
consoleErrorSpy.mockRestore();
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
it('should NOT call console.error for observer onEvent errors', () => {
|
|
457
|
-
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
458
|
-
|
|
459
|
-
const throwingObserver: WorkflowObserver = {
|
|
460
|
-
onLog: () => {},
|
|
461
|
-
onEvent: () => {
|
|
462
|
-
throw new Error('Observer onEvent error');
|
|
463
|
-
},
|
|
464
|
-
onStateUpdated: () => {},
|
|
465
|
-
onTreeChanged: () => {},
|
|
466
|
-
};
|
|
467
|
-
|
|
468
|
-
class TestWorkflow extends Workflow {
|
|
469
|
-
async run() {
|
|
470
|
-
this.emitEvent({ type: 'testEvent' } as any);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
const workflow = new TestWorkflow();
|
|
475
|
-
workflow.addObserver(throwingObserver);
|
|
476
|
-
workflow.run();
|
|
477
|
-
|
|
478
|
-
// Verify console.error was NOT called for observer error
|
|
479
|
-
expect(consoleErrorSpy).not.toHaveBeenCalled();
|
|
480
|
-
|
|
481
|
-
// Verify error was logged to workflow.node.logs instead
|
|
482
|
-
const errorLog = workflow.node.logs.find((log) => log.message === 'Observer onEvent error');
|
|
483
|
-
expect(errorLog).toBeDefined();
|
|
484
|
-
|
|
485
|
-
consoleErrorSpy.mockRestore();
|
|
486
|
-
});
|
|
487
|
-
|
|
488
|
-
it('should NOT call console.error for observer onStateUpdated errors', async () => {
|
|
489
|
-
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
490
|
-
|
|
491
|
-
const throwingObserver: WorkflowObserver = {
|
|
492
|
-
onLog: () => {},
|
|
493
|
-
onEvent: () => {},
|
|
494
|
-
onStateUpdated: () => {
|
|
495
|
-
throw new Error('Observer onStateUpdated error');
|
|
496
|
-
},
|
|
497
|
-
onTreeChanged: () => {},
|
|
498
|
-
};
|
|
499
|
-
|
|
500
|
-
class TestWorkflow extends Workflow {
|
|
501
|
-
async run() {
|
|
502
|
-
this.snapshotState();
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
const workflow = new TestWorkflow();
|
|
507
|
-
workflow.addObserver(throwingObserver);
|
|
508
|
-
await workflow.run();
|
|
509
|
-
|
|
510
|
-
// Verify console.error was NOT called for observer error
|
|
511
|
-
expect(consoleErrorSpy).not.toHaveBeenCalled();
|
|
512
|
-
|
|
513
|
-
// Verify error was logged to workflow.node.logs instead
|
|
514
|
-
const errorLog = workflow.node.logs.find(
|
|
515
|
-
(log) => log.message === 'Observer onStateUpdated error'
|
|
516
|
-
);
|
|
517
|
-
expect(errorLog).toBeDefined();
|
|
518
|
-
|
|
519
|
-
consoleErrorSpy.mockRestore();
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
it('should NOT call console.error for observer onTreeChanged errors', () => {
|
|
523
|
-
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
524
|
-
|
|
525
|
-
const throwingObserver: WorkflowObserver = {
|
|
526
|
-
onLog: () => {},
|
|
527
|
-
onEvent: () => {},
|
|
528
|
-
onStateUpdated: () => {},
|
|
529
|
-
onTreeChanged: () => {
|
|
530
|
-
throw new Error('Observer onTreeChanged error');
|
|
531
|
-
},
|
|
532
|
-
};
|
|
533
|
-
|
|
534
|
-
const parent = new Workflow('ParentWorkflow');
|
|
535
|
-
const child = new Workflow('ChildWorkflow');
|
|
536
|
-
|
|
537
|
-
parent.addObserver(throwingObserver);
|
|
538
|
-
|
|
539
|
-
// Trigger childAttached which calls onTreeChanged
|
|
540
|
-
parent.attachChild(child);
|
|
541
|
-
|
|
542
|
-
// Verify console.error was NOT called for observer error
|
|
543
|
-
expect(consoleErrorSpy).not.toHaveBeenCalled();
|
|
544
|
-
|
|
545
|
-
// Verify error was logged to workflow.node.logs instead (as onEvent error)
|
|
546
|
-
const errorLog = parent.node.logs.find((log) => log.message === 'Observer onEvent error');
|
|
547
|
-
expect(errorLog).toBeDefined();
|
|
548
|
-
|
|
549
|
-
consoleErrorSpy.mockRestore();
|
|
550
|
-
});
|
|
551
|
-
});
|
|
552
|
-
|
|
553
|
-
describe('Multiple observers', () => {
|
|
554
|
-
it('should continue notifying other observers after one throws', async () => {
|
|
555
|
-
let observer2Called = false;
|
|
556
|
-
let observer3Called = false;
|
|
557
|
-
|
|
558
|
-
const throwingObserver: WorkflowObserver = {
|
|
559
|
-
onLog: () => {
|
|
560
|
-
throw new Error('Observer 1 failed');
|
|
561
|
-
},
|
|
562
|
-
onEvent: () => {},
|
|
563
|
-
onStateUpdated: () => {},
|
|
564
|
-
onTreeChanged: () => {},
|
|
565
|
-
};
|
|
566
|
-
|
|
567
|
-
const workingObserver2: WorkflowObserver = {
|
|
568
|
-
onLog: () => {
|
|
569
|
-
observer2Called = true;
|
|
570
|
-
},
|
|
571
|
-
onEvent: () => {},
|
|
572
|
-
onStateUpdated: () => {},
|
|
573
|
-
onTreeChanged: () => {},
|
|
574
|
-
};
|
|
575
|
-
|
|
576
|
-
const workingObserver3: WorkflowObserver = {
|
|
577
|
-
onLog: () => {
|
|
578
|
-
observer3Called = true;
|
|
579
|
-
},
|
|
580
|
-
onEvent: () => {},
|
|
581
|
-
onStateUpdated: () => {},
|
|
582
|
-
onTreeChanged: () => {},
|
|
583
|
-
};
|
|
584
|
-
|
|
585
|
-
class TestWorkflow extends Workflow {
|
|
586
|
-
async run() {
|
|
587
|
-
this.logger.info('Test message');
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
const workflow = new TestWorkflow();
|
|
592
|
-
workflow.addObserver(throwingObserver);
|
|
593
|
-
workflow.addObserver(workingObserver2);
|
|
594
|
-
workflow.addObserver(workingObserver3);
|
|
595
|
-
|
|
596
|
-
await workflow.run();
|
|
597
|
-
|
|
598
|
-
// Both working observers should have been called
|
|
599
|
-
expect(observer2Called).toBe(true);
|
|
600
|
-
expect(observer3Called).toBe(true);
|
|
601
|
-
|
|
602
|
-
// Should have error log for throwing observer
|
|
603
|
-
const errorLog = workflow.node.logs.find((log) => log.message === 'Observer onLog error');
|
|
604
|
-
expect(errorLog).toBeDefined();
|
|
605
|
-
});
|
|
606
|
-
|
|
607
|
-
it('should log errors for multiple throwing observers', async () => {
|
|
608
|
-
const throwingObserver1: WorkflowObserver = {
|
|
609
|
-
onLog: () => {
|
|
610
|
-
throw new Error('Observer 1 error');
|
|
611
|
-
},
|
|
612
|
-
onEvent: () => {},
|
|
613
|
-
onStateUpdated: () => {},
|
|
614
|
-
onTreeChanged: () => {},
|
|
615
|
-
};
|
|
616
|
-
|
|
617
|
-
const throwingObserver2: WorkflowObserver = {
|
|
618
|
-
onLog: () => {
|
|
619
|
-
throw new Error('Observer 2 error');
|
|
620
|
-
},
|
|
621
|
-
onEvent: () => {},
|
|
622
|
-
onStateUpdated: () => {},
|
|
623
|
-
onTreeChanged: () => {},
|
|
624
|
-
};
|
|
625
|
-
|
|
626
|
-
class TestWorkflow extends Workflow {
|
|
627
|
-
async run() {
|
|
628
|
-
this.logger.info('Test message');
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
const workflow = new TestWorkflow();
|
|
633
|
-
workflow.addObserver(throwingObserver1);
|
|
634
|
-
workflow.addObserver(throwingObserver2);
|
|
635
|
-
|
|
636
|
-
await workflow.run();
|
|
637
|
-
|
|
638
|
-
// Should have error logs for both throwing observers
|
|
639
|
-
const errorLogs = workflow.node.logs.filter((log) => log.message === 'Observer onLog error');
|
|
640
|
-
expect(errorLogs.length).toBe(2);
|
|
641
|
-
});
|
|
642
|
-
});
|
|
643
|
-
});
|