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,151 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
TDDOrchestrator,
|
|
4
|
-
WorkflowTreeDebugger,
|
|
5
|
-
WorkflowEvent,
|
|
6
|
-
WorkflowObserver,
|
|
7
|
-
} from '../../index.js';
|
|
8
|
-
|
|
9
|
-
describe('Tree Mirroring Integration', () => {
|
|
10
|
-
it('should create 1:1 tree mirror of workflow execution', async () => {
|
|
11
|
-
const orchestrator = new TDDOrchestrator('TDDOrchestrator');
|
|
12
|
-
(orchestrator as any).maxCycles = 1; // Limit to one cycle for test
|
|
13
|
-
|
|
14
|
-
const debugger_ = new WorkflowTreeDebugger(orchestrator);
|
|
15
|
-
const events: WorkflowEvent[] = [];
|
|
16
|
-
|
|
17
|
-
debugger_.events.subscribe({
|
|
18
|
-
next: (event) => events.push(event),
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
await orchestrator.run();
|
|
23
|
-
} catch {
|
|
24
|
-
// May fail due to random test failures, that's ok
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Verify tree structure
|
|
28
|
-
const tree = debugger_.getTree();
|
|
29
|
-
expect(tree.name).toBe('TDDOrchestrator');
|
|
30
|
-
|
|
31
|
-
// Should have at least one child (the cycle)
|
|
32
|
-
expect(tree.children.length).toBeGreaterThanOrEqual(1);
|
|
33
|
-
|
|
34
|
-
// Child should be named Cycle-N
|
|
35
|
-
const cycleChild = tree.children.find((c) => c.name.startsWith('Cycle-'));
|
|
36
|
-
expect(cycleChild).toBeDefined();
|
|
37
|
-
|
|
38
|
-
// Verify events were captured
|
|
39
|
-
expect(events.some((e) => e.type === 'stepStart')).toBe(true);
|
|
40
|
-
expect(events.some((e) => e.type === 'taskStart')).toBe(true);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should propagate events to root observer', async () => {
|
|
44
|
-
const orchestrator = new TDDOrchestrator('Root');
|
|
45
|
-
(orchestrator as any).maxCycles = 1;
|
|
46
|
-
|
|
47
|
-
const allEvents: WorkflowEvent[] = [];
|
|
48
|
-
const allLogs: any[] = [];
|
|
49
|
-
|
|
50
|
-
const observer: WorkflowObserver = {
|
|
51
|
-
onLog: (entry) => allLogs.push(entry),
|
|
52
|
-
onEvent: (event) => allEvents.push(event),
|
|
53
|
-
onStateUpdated: () => {},
|
|
54
|
-
onTreeChanged: () => {},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
orchestrator.addObserver(observer);
|
|
58
|
-
|
|
59
|
-
try {
|
|
60
|
-
await orchestrator.run();
|
|
61
|
-
} catch {
|
|
62
|
-
// May fail
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Events from child workflows should reach root
|
|
66
|
-
expect(allLogs.length).toBeGreaterThan(0);
|
|
67
|
-
expect(allEvents.length).toBeGreaterThan(0);
|
|
68
|
-
|
|
69
|
-
// Should have events from both parent and child
|
|
70
|
-
const parentEvents = allEvents.filter(
|
|
71
|
-
(e) => 'node' in e && e.node.name === 'Root'
|
|
72
|
-
);
|
|
73
|
-
const childEvents = allEvents.filter(
|
|
74
|
-
(e) => 'node' in e && e.node.name.startsWith('Cycle-')
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
expect(parentEvents.length).toBeGreaterThan(0);
|
|
78
|
-
expect(childEvents.length).toBeGreaterThan(0);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('should include state snapshot on error', async () => {
|
|
82
|
-
const orchestrator = new TDDOrchestrator('ErrorTest');
|
|
83
|
-
(orchestrator as any).maxCycles = 1;
|
|
84
|
-
|
|
85
|
-
const errorEvents: WorkflowEvent[] = [];
|
|
86
|
-
|
|
87
|
-
orchestrator.addObserver({
|
|
88
|
-
onLog: () => {},
|
|
89
|
-
onEvent: (event) => {
|
|
90
|
-
if (event.type === 'error') {
|
|
91
|
-
errorEvents.push(event);
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
onStateUpdated: () => {},
|
|
95
|
-
onTreeChanged: () => {},
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
try {
|
|
99
|
-
await orchestrator.run();
|
|
100
|
-
} catch {
|
|
101
|
-
// Expected
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// If there was an error, it should have state
|
|
105
|
-
if (errorEvents.length > 0) {
|
|
106
|
-
const errEvent = errorEvents[0];
|
|
107
|
-
if (errEvent.type === 'error') {
|
|
108
|
-
expect(errEvent.error.state).toBeDefined();
|
|
109
|
-
expect(errEvent.error.logs).toBeDefined();
|
|
110
|
-
expect(errEvent.error.workflowId).toBeDefined();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('should propagate treeUpdated events to root observers', () => {
|
|
116
|
-
// ARRANGE: Create parent-child workflow tree
|
|
117
|
-
const parent = new TDDOrchestrator('Parent');
|
|
118
|
-
const child = new TDDOrchestrator('Child', parent);
|
|
119
|
-
|
|
120
|
-
// ARRANGE: Set up observer with collection arrays
|
|
121
|
-
const events: WorkflowEvent[] = [];
|
|
122
|
-
const treeChangedCalls: any[] = [];
|
|
123
|
-
|
|
124
|
-
// ARRANGE: Create inline observer
|
|
125
|
-
const observer: WorkflowObserver = {
|
|
126
|
-
onLog: () => {}, // Empty - not testing logs
|
|
127
|
-
onEvent: (event) => events.push(event), // Capture events
|
|
128
|
-
onStateUpdated: () => {}, // Empty - not testing state updates
|
|
129
|
-
onTreeChanged: (root) => treeChangedCalls.push(root), // Capture tree changes
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
// ARRANGE: Attach observer to ROOT (parent, not child)
|
|
133
|
-
parent.addObserver(observer);
|
|
134
|
-
|
|
135
|
-
// ACT: Trigger status change on CHILD workflow
|
|
136
|
-
child.setStatus('completed');
|
|
137
|
-
|
|
138
|
-
// ASSERT: Verify treeUpdated event was received via onEvent
|
|
139
|
-
const treeUpdatedEvent = events.find((e) => e.type === 'treeUpdated');
|
|
140
|
-
expect(treeUpdatedEvent).toBeDefined();
|
|
141
|
-
|
|
142
|
-
// ASSERT: Type guard for discriminated union + verify root node
|
|
143
|
-
if (treeUpdatedEvent && treeUpdatedEvent.type === 'treeUpdated') {
|
|
144
|
-
expect(treeUpdatedEvent.root).toBe(parent.getNode());
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// ASSERT: Verify onTreeChanged callback was invoked
|
|
148
|
-
expect(treeChangedCalls).toHaveLength(1);
|
|
149
|
-
expect(treeChangedCalls[0]).toBe(parent.getNode());
|
|
150
|
-
});
|
|
151
|
-
});
|
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration Test: Reparenting Observer Propagation
|
|
3
|
-
*
|
|
4
|
-
* Validates that observer propagation correctly updates when a child
|
|
5
|
-
* workflow is reparented from one parent to another.
|
|
6
|
-
*
|
|
7
|
-
* Pattern 7 (from bug_fix_tasks.json):
|
|
8
|
-
* "Observer propagation should update after reparenting.
|
|
9
|
-
* Events from child should only reach new parent's observers."
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { describe, it, expect } from 'vitest';
|
|
13
|
-
import {
|
|
14
|
-
Workflow,
|
|
15
|
-
WorkflowObserver,
|
|
16
|
-
WorkflowEvent,
|
|
17
|
-
WorkflowTreeDebugger,
|
|
18
|
-
} from '../../index.js';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* SimpleWorkflow class for testing
|
|
22
|
-
* Pattern from: src/__tests__/unit/workflow.test.ts:4-11
|
|
23
|
-
*/
|
|
24
|
-
class SimpleWorkflow extends Workflow {
|
|
25
|
-
async run(): Promise<string> {
|
|
26
|
-
this.setStatus('running');
|
|
27
|
-
this.setStatus('completed');
|
|
28
|
-
return 'done';
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
describe('Integration: Reparenting Observer Propagation', () => {
|
|
33
|
-
it('should update observer propagation after reparenting', () => {
|
|
34
|
-
// ============================================================
|
|
35
|
-
// PHASE 1: Setup - Create parent1, parent2, and child
|
|
36
|
-
// ============================================================
|
|
37
|
-
// ARRANGE: Create two root workflows (both have parent = null)
|
|
38
|
-
const parent1 = new SimpleWorkflow('Parent1');
|
|
39
|
-
const parent2 = new SimpleWorkflow('Parent2');
|
|
40
|
-
|
|
41
|
-
// ARRANGE: Create child attached to parent1 (via constructor)
|
|
42
|
-
const child = new SimpleWorkflow('Child', parent1);
|
|
43
|
-
|
|
44
|
-
// ASSERT: Verify initial state
|
|
45
|
-
expect(child.parent).toBe(parent1);
|
|
46
|
-
expect(parent1.children).toContain(child);
|
|
47
|
-
expect(parent2.children).not.toContain(child);
|
|
48
|
-
|
|
49
|
-
// ============================================================
|
|
50
|
-
// PHASE 2: Verify parent1 observer receives events
|
|
51
|
-
// ============================================================
|
|
52
|
-
// ARRANGE: Create observer for parent1
|
|
53
|
-
const parent1Events: WorkflowEvent[] = [];
|
|
54
|
-
|
|
55
|
-
const parent1Observer: WorkflowObserver = {
|
|
56
|
-
onLog: () => {}, // Empty - not testing logs
|
|
57
|
-
onEvent: (event) => parent1Events.push(event), // Capture events
|
|
58
|
-
onStateUpdated: () => {}, // Empty - not testing state updates
|
|
59
|
-
onTreeChanged: () => {}, // Empty - not testing tree changes
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
// ACT: Attach observer to parent1 (must be root workflow)
|
|
63
|
-
parent1.addObserver(parent1Observer);
|
|
64
|
-
|
|
65
|
-
// ACT: Child emits event (triggers treeUpdated via setStatus)
|
|
66
|
-
// PATTERN: setStatus() emits treeUpdated event
|
|
67
|
-
parent1Events.length = 0; // Clear any construction events
|
|
68
|
-
child.setStatus('running');
|
|
69
|
-
|
|
70
|
-
// ASSERT: Verify parent1 observer received the event
|
|
71
|
-
const parent1ReceivedEvent = parent1Events.find(
|
|
72
|
-
(e) => e.type === 'treeUpdated'
|
|
73
|
-
);
|
|
74
|
-
expect(parent1ReceivedEvent).toBeDefined();
|
|
75
|
-
|
|
76
|
-
// ============================================================
|
|
77
|
-
// PHASE 3: Reparent child from parent1 to parent2
|
|
78
|
-
// ============================================================
|
|
79
|
-
// ARRANGE: Create observer for parent2
|
|
80
|
-
const parent2Events: WorkflowEvent[] = [];
|
|
81
|
-
|
|
82
|
-
const parent2Observer: WorkflowObserver = {
|
|
83
|
-
onLog: () => {},
|
|
84
|
-
onEvent: (event) => parent2Events.push(event),
|
|
85
|
-
onStateUpdated: () => {},
|
|
86
|
-
onTreeChanged: () => {},
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
// ACT: Reparent using detach + attach pattern
|
|
90
|
-
// CRITICAL: Must detach before attaching to new parent
|
|
91
|
-
parent1.detachChild(child);
|
|
92
|
-
parent2.attachChild(child);
|
|
93
|
-
parent2.addObserver(parent2Observer);
|
|
94
|
-
|
|
95
|
-
// ASSERT: Verify reparenting succeeded
|
|
96
|
-
expect(child.parent).toBe(parent2);
|
|
97
|
-
expect(parent2.children).toContain(child);
|
|
98
|
-
expect(parent1.children).not.toContain(child);
|
|
99
|
-
|
|
100
|
-
// ============================================================
|
|
101
|
-
// PHASE 4: Verify parent2 observer receives events after reparenting
|
|
102
|
-
// ============================================================
|
|
103
|
-
// ACT: Clear events to isolate post-reparenting behavior
|
|
104
|
-
parent1Events.length = 0;
|
|
105
|
-
parent2Events.length = 0;
|
|
106
|
-
|
|
107
|
-
// ACT: Child emits event again
|
|
108
|
-
child.setStatus('completed');
|
|
109
|
-
|
|
110
|
-
// ASSERT: Verify parent2 observer received the event
|
|
111
|
-
const parent2ReceivedEvent = parent2Events.find(
|
|
112
|
-
(e) => e.type === 'treeUpdated'
|
|
113
|
-
);
|
|
114
|
-
expect(parent2ReceivedEvent).toBeDefined();
|
|
115
|
-
|
|
116
|
-
// ============================================================
|
|
117
|
-
// PHASE 5: CRITICAL VALIDATION - parent1 observer does NOT receive events
|
|
118
|
-
// ============================================================
|
|
119
|
-
// ASSERT: Verify parent1 observer did NOT receive the post-reparenting event
|
|
120
|
-
const parent1DidNotReceive = parent1Events.find(
|
|
121
|
-
(e) => e.type === 'treeUpdated'
|
|
122
|
-
);
|
|
123
|
-
expect(parent1DidNotReceive).toBeUndefined();
|
|
124
|
-
|
|
125
|
-
// ASSERT: Verify event count for parent1 is zero
|
|
126
|
-
expect(parent1Events.length).toBe(0);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('should handle multiple reparenting cycles correctly', () => {
|
|
130
|
-
// ARRANGE: Create three potential parents
|
|
131
|
-
const parentA = new SimpleWorkflow('ParentA');
|
|
132
|
-
const parentB = new SimpleWorkflow('ParentB');
|
|
133
|
-
const parentC = new SimpleWorkflow('ParentC');
|
|
134
|
-
|
|
135
|
-
// ARRANGE: Create child and observers for each parent
|
|
136
|
-
const child = new SimpleWorkflow('Child', parentA);
|
|
137
|
-
|
|
138
|
-
const eventsA: WorkflowEvent[] = [];
|
|
139
|
-
const eventsB: WorkflowEvent[] = [];
|
|
140
|
-
const eventsC: WorkflowEvent[] = [];
|
|
141
|
-
|
|
142
|
-
const createObserver = (eventsArray: WorkflowEvent[]): WorkflowObserver => ({
|
|
143
|
-
onLog: () => {},
|
|
144
|
-
onEvent: (e) => eventsArray.push(e),
|
|
145
|
-
onStateUpdated: () => {},
|
|
146
|
-
onTreeChanged: () => {},
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
parentA.addObserver(createObserver(eventsA));
|
|
150
|
-
parentB.addObserver(createObserver(eventsB));
|
|
151
|
-
parentC.addObserver(createObserver(eventsC));
|
|
152
|
-
|
|
153
|
-
// ACT & ASSERT: Cycle 1 - A -> B
|
|
154
|
-
eventsA.length = 0;
|
|
155
|
-
child.setStatus('running');
|
|
156
|
-
expect(eventsA.some((e) => e.type === 'treeUpdated')).toBe(true);
|
|
157
|
-
|
|
158
|
-
parentA.detachChild(child);
|
|
159
|
-
parentB.attachChild(child);
|
|
160
|
-
|
|
161
|
-
eventsA.length = 0;
|
|
162
|
-
eventsB.length = 0;
|
|
163
|
-
child.setStatus('completed');
|
|
164
|
-
expect(eventsB.some((e) => e.type === 'treeUpdated')).toBe(true);
|
|
165
|
-
expect(eventsA.some((e) => e.type === 'treeUpdated')).toBe(false);
|
|
166
|
-
|
|
167
|
-
// ACT & ASSERT: Cycle 2 - B -> C
|
|
168
|
-
parentB.detachChild(child);
|
|
169
|
-
parentC.attachChild(child);
|
|
170
|
-
|
|
171
|
-
eventsB.length = 0;
|
|
172
|
-
eventsC.length = 0;
|
|
173
|
-
child.setStatus('running');
|
|
174
|
-
expect(eventsC.some((e) => e.type === 'treeUpdated')).toBe(true);
|
|
175
|
-
expect(eventsB.some((e) => e.type === 'treeUpdated')).toBe(false);
|
|
176
|
-
|
|
177
|
-
// ACT & ASSERT: Cycle 3 - C -> A (return to original)
|
|
178
|
-
parentC.detachChild(child);
|
|
179
|
-
parentA.attachChild(child);
|
|
180
|
-
|
|
181
|
-
eventsC.length = 0;
|
|
182
|
-
eventsA.length = 0;
|
|
183
|
-
child.setStatus('completed');
|
|
184
|
-
expect(eventsA.some((e) => e.type === 'treeUpdated')).toBe(true);
|
|
185
|
-
expect(eventsC.some((e) => e.type === 'treeUpdated')).toBe(false);
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('should verify tree consistency after reparenting using debugger', () => {
|
|
189
|
-
// ============================================================
|
|
190
|
-
// PHASE 1: Setup - Create parent1, parent2, and child
|
|
191
|
-
// ============================================================
|
|
192
|
-
// ARRANGE: Create two root workflows
|
|
193
|
-
const parent1 = new SimpleWorkflow('Parent1');
|
|
194
|
-
const parent2 = new SimpleWorkflow('Parent2');
|
|
195
|
-
|
|
196
|
-
// ARRANGE: Create child attached to parent1 (via constructor)
|
|
197
|
-
const child = new SimpleWorkflow('Child', parent1);
|
|
198
|
-
|
|
199
|
-
// ARRANGE: Create debugger attached to parent1
|
|
200
|
-
const parent1Debugger = new WorkflowTreeDebugger(parent1);
|
|
201
|
-
|
|
202
|
-
// ASSERT: Verify initial tree structure
|
|
203
|
-
expect(child.parent).toBe(parent1);
|
|
204
|
-
expect(parent1.children).toContain(child);
|
|
205
|
-
expect(parent2.children).not.toContain(child);
|
|
206
|
-
|
|
207
|
-
// ASSERT: Verify debugger sees initial structure
|
|
208
|
-
const initialTree = parent1Debugger.getTree();
|
|
209
|
-
expect(initialTree.name).toBe('Parent1');
|
|
210
|
-
expect(initialTree.children.length).toBe(1);
|
|
211
|
-
expect(initialTree.children[0].name).toBe('Child');
|
|
212
|
-
|
|
213
|
-
// ============================================================
|
|
214
|
-
// PHASE 2: Reparenting operation
|
|
215
|
-
// ============================================================
|
|
216
|
-
// ACT: Reparent child from parent1 to parent2
|
|
217
|
-
parent1.detachChild(child);
|
|
218
|
-
parent2.attachChild(child);
|
|
219
|
-
|
|
220
|
-
// ASSERT: Verify basic reparenting succeeded
|
|
221
|
-
expect(child.parent).toBe(parent2);
|
|
222
|
-
expect(parent2.children).toContain(child);
|
|
223
|
-
expect(parent1.children).not.toContain(child);
|
|
224
|
-
|
|
225
|
-
// ============================================================
|
|
226
|
-
// PHASE 3: Verify workflow tree structure
|
|
227
|
-
// ============================================================
|
|
228
|
-
// ASSERT: Verify child.parent points to new parent
|
|
229
|
-
expect(child.parent).toBe(parent2);
|
|
230
|
-
|
|
231
|
-
// ASSERT: Verify new parent.children includes child
|
|
232
|
-
expect(parent2.children).toContain(child);
|
|
233
|
-
|
|
234
|
-
// ASSERT: Verify old parent.children does NOT include child
|
|
235
|
-
expect(parent1.children).not.toContain(child);
|
|
236
|
-
|
|
237
|
-
// ============================================================
|
|
238
|
-
// PHASE 4: Verify node tree structure using debugger
|
|
239
|
-
// ============================================================
|
|
240
|
-
// NOTE: parent1Debugger is still attached to parent1, so it shows parent1's tree
|
|
241
|
-
// Create debugger for parent2 to see the new tree structure
|
|
242
|
-
const parent2Debugger = new WorkflowTreeDebugger(parent2);
|
|
243
|
-
|
|
244
|
-
// ASSERT: Verify debugger can find child node
|
|
245
|
-
const childNode = parent2Debugger.getNode(child.id);
|
|
246
|
-
expect(childNode).toBeDefined();
|
|
247
|
-
expect(childNode?.name).toBe('Child');
|
|
248
|
-
|
|
249
|
-
// ASSERT: Verify child's node parent is parent2's node (node tree mirrors workflow tree)
|
|
250
|
-
const parent2NodeDirect = parent2.getNode();
|
|
251
|
-
expect(childNode?.parent).toBe(parent2NodeDirect);
|
|
252
|
-
|
|
253
|
-
// ASSERT: Verify parent2's node children includes child's node
|
|
254
|
-
const parent2Node = parent2Debugger.getNode(parent2.id);
|
|
255
|
-
const childNodeDirect = child.getNode();
|
|
256
|
-
expect(parent2Node?.children).toContain(childNodeDirect);
|
|
257
|
-
|
|
258
|
-
// ASSERT: Verify parent1's node children does NOT include child's node
|
|
259
|
-
const parent1Node = parent1Debugger.getNode(parent1.id);
|
|
260
|
-
expect(parent1Node?.children).not.toContain(childNodeDirect);
|
|
261
|
-
|
|
262
|
-
// ============================================================
|
|
263
|
-
// PHASE 5: Visual validation using toTreeString()
|
|
264
|
-
// ============================================================
|
|
265
|
-
// ACT: Get tree string for visual debugging
|
|
266
|
-
const parent2TreeString = parent2Debugger.toTreeString();
|
|
267
|
-
|
|
268
|
-
// ASSERT: Verify tree structure in ASCII representation
|
|
269
|
-
expect(parent2TreeString).toContain('Parent2');
|
|
270
|
-
expect(parent2TreeString).toContain('Child');
|
|
271
|
-
expect(parent2TreeString).toContain('└──'); // Tree connector symbol
|
|
272
|
-
|
|
273
|
-
// ============================================================
|
|
274
|
-
// PHASE 6: Statistical validation
|
|
275
|
-
// ============================================================
|
|
276
|
-
const parent2Stats = parent2Debugger.getStats();
|
|
277
|
-
expect(parent2Stats.totalNodes).toBe(2); // parent2 + child = 2
|
|
278
|
-
|
|
279
|
-
// ============================================================
|
|
280
|
-
// CRITICAL VALIDATION: 1:1 Tree Mirror Invariant
|
|
281
|
-
// ============================================================
|
|
282
|
-
// Verify workflow tree and node tree are perfectly synchronized
|
|
283
|
-
// This is the core invariant that must be maintained
|
|
284
|
-
|
|
285
|
-
// Workflow tree state:
|
|
286
|
-
expect(child.parent).toBe(parent2);
|
|
287
|
-
expect(parent2.children).toEqual([child]);
|
|
288
|
-
expect(parent1.children).toEqual([]);
|
|
289
|
-
|
|
290
|
-
// Node tree state (via getNode() method):
|
|
291
|
-
const childNodeFinal = child.getNode();
|
|
292
|
-
const parent2NodeFinal = parent2.getNode();
|
|
293
|
-
const parent1NodeFinal = parent1.getNode();
|
|
294
|
-
|
|
295
|
-
expect(childNodeFinal.parent).toBe(parent2NodeFinal);
|
|
296
|
-
expect(parent2NodeFinal.children).toEqual([childNodeFinal]);
|
|
297
|
-
expect(parent1NodeFinal.children).toEqual([]);
|
|
298
|
-
|
|
299
|
-
// Cross-verification: debugger lookup matches direct access
|
|
300
|
-
expect(parent2Debugger.getNode(child.id)).toBe(childNodeFinal);
|
|
301
|
-
expect(parent2Debugger.getNode(parent2.id)).toBe(parent2NodeFinal);
|
|
302
|
-
});
|
|
303
|
-
});
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { Agent } from '../../core/agent.js';
|
|
3
|
-
import { MCPHandler } from '../../core/mcp-handler.js';
|
|
4
|
-
|
|
5
|
-
describe('Agent', () => {
|
|
6
|
-
it('should create with unique id', () => {
|
|
7
|
-
const a1 = new Agent();
|
|
8
|
-
const a2 = new Agent();
|
|
9
|
-
expect(a1.id).not.toBe(a2.id);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('should use default name when not provided', () => {
|
|
13
|
-
const agent = new Agent();
|
|
14
|
-
expect(agent.name).toBe('Agent');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('should use custom name when provided', () => {
|
|
18
|
-
const agent = new Agent({ name: 'CustomAgent' });
|
|
19
|
-
expect(agent.name).toBe('CustomAgent');
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('should provide access to MCP handler', () => {
|
|
23
|
-
const agent = new Agent();
|
|
24
|
-
const handler = agent.getMcpHandler();
|
|
25
|
-
expect(handler).toBeInstanceOf(MCPHandler);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should register MCP servers from config', () => {
|
|
29
|
-
const agent = new Agent({
|
|
30
|
-
mcps: [
|
|
31
|
-
{
|
|
32
|
-
name: 'test-mcp',
|
|
33
|
-
transport: 'inprocess',
|
|
34
|
-
tools: [
|
|
35
|
-
{
|
|
36
|
-
name: 'test_tool',
|
|
37
|
-
description: 'A test tool',
|
|
38
|
-
input_schema: { type: 'object', properties: {} },
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
const handler = agent.getMcpHandler();
|
|
46
|
-
expect(handler.getServerNames()).toContain('test-mcp');
|
|
47
|
-
expect(handler.hasTool('test-mcp__test_tool')).toBe(true);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
describe('MCPHandler', () => {
|
|
52
|
-
it('should register and unregister servers', () => {
|
|
53
|
-
const handler = new MCPHandler();
|
|
54
|
-
|
|
55
|
-
handler.registerServer({
|
|
56
|
-
name: 'server1',
|
|
57
|
-
transport: 'inprocess',
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
expect(handler.getServerNames()).toContain('server1');
|
|
61
|
-
|
|
62
|
-
handler.unregisterServer('server1');
|
|
63
|
-
expect(handler.getServerNames()).not.toContain('server1');
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('should throw when registering duplicate server', () => {
|
|
67
|
-
const handler = new MCPHandler();
|
|
68
|
-
|
|
69
|
-
handler.registerServer({
|
|
70
|
-
name: 'server1',
|
|
71
|
-
transport: 'inprocess',
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
expect(() =>
|
|
75
|
-
handler.registerServer({
|
|
76
|
-
name: 'server1',
|
|
77
|
-
transport: 'inprocess',
|
|
78
|
-
})
|
|
79
|
-
).toThrow("MCP server 'server1' is already registered");
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('should convert tools to full names', () => {
|
|
83
|
-
const handler = new MCPHandler();
|
|
84
|
-
|
|
85
|
-
handler.registerServer({
|
|
86
|
-
name: 'myserver',
|
|
87
|
-
transport: 'inprocess',
|
|
88
|
-
tools: [
|
|
89
|
-
{
|
|
90
|
-
name: 'tool1',
|
|
91
|
-
description: 'Tool 1',
|
|
92
|
-
input_schema: { type: 'object', properties: {} },
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
name: 'tool2',
|
|
96
|
-
description: 'Tool 2',
|
|
97
|
-
input_schema: { type: 'object', properties: {} },
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
const tools = handler.getTools();
|
|
103
|
-
expect(tools).toHaveLength(2);
|
|
104
|
-
expect(tools[0].name).toBe('myserver__tool1');
|
|
105
|
-
expect(tools[1].name).toBe('myserver__tool2');
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('should execute registered tool', async () => {
|
|
109
|
-
const handler = new MCPHandler();
|
|
110
|
-
|
|
111
|
-
handler.registerServer({
|
|
112
|
-
name: 'math',
|
|
113
|
-
transport: 'inprocess',
|
|
114
|
-
tools: [
|
|
115
|
-
{
|
|
116
|
-
name: 'add',
|
|
117
|
-
description: 'Add two numbers',
|
|
118
|
-
input_schema: {
|
|
119
|
-
type: 'object',
|
|
120
|
-
properties: {
|
|
121
|
-
a: { type: 'number' },
|
|
122
|
-
b: { type: 'number' },
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
],
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
handler.registerToolExecutor('math', 'add', async (input: unknown) => {
|
|
130
|
-
const { a, b } = input as { a: number; b: number };
|
|
131
|
-
return a + b;
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
const result = await handler.executeTool('math__add', { a: 2, b: 3 });
|
|
135
|
-
expect(result.content).toBe('5');
|
|
136
|
-
expect(result.is_error).toBeUndefined();
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('should return error for unknown tool', async () => {
|
|
140
|
-
const handler = new MCPHandler();
|
|
141
|
-
const result = await handler.executeTool('unknown__tool', {});
|
|
142
|
-
expect(result.is_error).toBe(true);
|
|
143
|
-
expect(result.content).toContain('not found');
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it('should return error when tool throws', async () => {
|
|
147
|
-
const handler = new MCPHandler();
|
|
148
|
-
|
|
149
|
-
handler.registerServer({
|
|
150
|
-
name: 'failing',
|
|
151
|
-
transport: 'inprocess',
|
|
152
|
-
tools: [
|
|
153
|
-
{
|
|
154
|
-
name: 'fail',
|
|
155
|
-
description: 'Always fails',
|
|
156
|
-
input_schema: { type: 'object', properties: {} },
|
|
157
|
-
},
|
|
158
|
-
],
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
handler.registerToolExecutor('failing', 'fail', async () => {
|
|
162
|
-
throw new Error('Tool error');
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
const result = await handler.executeTool('failing__fail', {});
|
|
166
|
-
expect(result.is_error).toBe(true);
|
|
167
|
-
expect(result.content).toContain('Tool error');
|
|
168
|
-
});
|
|
169
|
-
});
|