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
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowEventReplayer - Reconstruct workflow tree from event history
|
|
3
|
+
*
|
|
4
|
+
* **Purpose**: Enables time-travel debugging by replaying workflow events
|
|
5
|
+
* to reconstruct workflow tree state at any point in execution history.
|
|
6
|
+
*
|
|
7
|
+
* **Phase 1 Scope**: Interface definition only. Implementation will be added
|
|
8
|
+
* in future PRPs (P2.M1.T1.S2 for structural events, P2.M1.T1.S3 for state events).
|
|
9
|
+
*
|
|
10
|
+
* **Architecture**:
|
|
11
|
+
* - Uses Map-based node tracking for O(1) lookups (pattern from WorkflowTreeDebugger)
|
|
12
|
+
* - Processes events sequentially using discriminated union pattern
|
|
13
|
+
* - Maintains tree invariants: single-parent rule, bidirectional references, no cycles
|
|
14
|
+
*
|
|
15
|
+
* **Event Categorization**:
|
|
16
|
+
* - **Structural Events** (modify tree structure): childAttached, childDetached, treeUpdated
|
|
17
|
+
* - **State Events** (update node properties): stateSnapshot, error
|
|
18
|
+
* - **Metadata Events** (logged but don't modify tree): agentPrompt*, toolInvocation, mcpEvent, reflection*, cache*, task*, step*
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const replayer = new WorkflowEventReplayer();
|
|
23
|
+
* const tree = replayer.replay(eventStream);
|
|
24
|
+
* console.log(`Tree has ${tree.children.length} root children`);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class WorkflowEventReplayer {
|
|
28
|
+
/** Node lookup map for O(1) access */
|
|
29
|
+
nodeMap = new Map();
|
|
30
|
+
/** Root node of reconstructed tree */
|
|
31
|
+
root = null;
|
|
32
|
+
/**
|
|
33
|
+
* Replay a sequence of workflow events to reconstruct the workflow tree.
|
|
34
|
+
*
|
|
35
|
+
* **Event Processing Strategy:**
|
|
36
|
+
* - Processes events sequentially in order
|
|
37
|
+
* - Uses try-catch per event to isolate errors
|
|
38
|
+
* - Logs errors and continues processing on failure
|
|
39
|
+
* - Throws only if root cannot be established
|
|
40
|
+
*
|
|
41
|
+
* **Phase 1 - Structural Events** (implemented in P2.M1.T1.S2):
|
|
42
|
+
* - `childAttached`: Add new child node to parent's children array
|
|
43
|
+
* - `childDetached`: Remove child and all descendants from tree
|
|
44
|
+
* - `treeUpdated`: Update root reference to new tree
|
|
45
|
+
*
|
|
46
|
+
* **Phase 2 - State Events** (implemented in P2.M1.T1.S3):
|
|
47
|
+
* - `stateSnapshot`: Update node's stateSnapshot field
|
|
48
|
+
* - `error`: Record error information on node
|
|
49
|
+
* - `stepStart`: Track step execution start
|
|
50
|
+
* - `stepEnd`: Track step execution completion with duration
|
|
51
|
+
* - `taskStart`: Track task execution start
|
|
52
|
+
* - `taskEnd`: Track task execution completion
|
|
53
|
+
*
|
|
54
|
+
* **Phase 3 - Metadata Events** (logged but don't modify tree):
|
|
55
|
+
* - `agentPromptStart/End`, `toolInvocation`, `mcpEvent`, etc.
|
|
56
|
+
*
|
|
57
|
+
* **Tree Invariants Maintained:**
|
|
58
|
+
* - Single-parent rule: Each node has at most one parent
|
|
59
|
+
* - Bidirectional references: parent.children and child.parent are consistent
|
|
60
|
+
* - No circular references: Tree is a Directed Acyclic Graph (DAG)
|
|
61
|
+
*
|
|
62
|
+
* @param events - Array of workflow events in chronological order
|
|
63
|
+
* @returns Root node of the reconstructed workflow tree
|
|
64
|
+
* @throws {Error} If events array is empty
|
|
65
|
+
* @throws {Error} If root cannot be established from events
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const replayer = new WorkflowEventReplayer();
|
|
70
|
+
* const tree = replayer.replay(eventStream);
|
|
71
|
+
* console.log(`Tree has ${tree.children.length} root children`);
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
replay(events) {
|
|
75
|
+
// Validate input
|
|
76
|
+
if (!events || events.length === 0) {
|
|
77
|
+
throw new Error('Events array is empty or null');
|
|
78
|
+
}
|
|
79
|
+
// Initialize state
|
|
80
|
+
this.nodeMap.clear();
|
|
81
|
+
this.root = null;
|
|
82
|
+
// Process events sequentially
|
|
83
|
+
for (const event of events) {
|
|
84
|
+
try {
|
|
85
|
+
switch (event.type) {
|
|
86
|
+
// Structural events (P2.M1.T1.S2)
|
|
87
|
+
case 'childAttached':
|
|
88
|
+
this.handleChildAttached(event);
|
|
89
|
+
break;
|
|
90
|
+
case 'childDetached':
|
|
91
|
+
this.handleChildDetached(event);
|
|
92
|
+
break;
|
|
93
|
+
case 'treeUpdated':
|
|
94
|
+
this.handleTreeUpdated(event);
|
|
95
|
+
break;
|
|
96
|
+
// State events (P2.M1.T1.S3)
|
|
97
|
+
case 'stateSnapshot':
|
|
98
|
+
this.handleStateSnapshot(event);
|
|
99
|
+
break;
|
|
100
|
+
case 'error':
|
|
101
|
+
this.handleErrorEvent(event);
|
|
102
|
+
break;
|
|
103
|
+
case 'stepStart':
|
|
104
|
+
this.handleStepStart(event);
|
|
105
|
+
break;
|
|
106
|
+
case 'stepEnd':
|
|
107
|
+
this.handleStepEnd(event);
|
|
108
|
+
break;
|
|
109
|
+
case 'taskStart':
|
|
110
|
+
this.handleTaskStart(event);
|
|
111
|
+
break;
|
|
112
|
+
case 'taskEnd':
|
|
113
|
+
this.handleTaskEnd(event);
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
// Other metadata events - skip for now
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
// Log error but continue processing subsequent events
|
|
122
|
+
console.error(`Error processing event type '${event.type}':`, error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Verify root was established
|
|
126
|
+
if (!this.root) {
|
|
127
|
+
throw new Error('No root node established from event stream');
|
|
128
|
+
}
|
|
129
|
+
return this.root;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Handle childAttached event - add subtree to tree.
|
|
133
|
+
*
|
|
134
|
+
* **Strategy:**
|
|
135
|
+
* 1. Deep clone event.child to avoid mutating original
|
|
136
|
+
* 2. Find parent node via nodeMap.get(event.parentId)
|
|
137
|
+
* 3. Validate: parent exists, single-parent rule, no circular references
|
|
138
|
+
* 4. Set child.parent = parent
|
|
139
|
+
* 5. Add child to parent.children array
|
|
140
|
+
* 6. Add child and all descendants to nodeMap via buildNodeMap()
|
|
141
|
+
* 7. Establish root if this is the first attachment
|
|
142
|
+
*
|
|
143
|
+
* **Invariants:**
|
|
144
|
+
* - Parent must exist in nodeMap (throw if not)
|
|
145
|
+
* - Child must not already have a different parent (single-parent rule)
|
|
146
|
+
* - No circular references (child must not be ancestor of parent)
|
|
147
|
+
* - Bidirectional links: child.parent = parent AND parent.children includes child
|
|
148
|
+
*
|
|
149
|
+
* **Deep Cloning:** Uses structuredClone() for safe deep copy
|
|
150
|
+
*
|
|
151
|
+
* @param event - ChildAttachedEvent with parentId and child node
|
|
152
|
+
* @throws {Error} If parent node not found
|
|
153
|
+
* @throws {Error} If child already has a parent
|
|
154
|
+
* @throws {Error} If attaching would create circular reference
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```typescript
|
|
158
|
+
* // Event structure
|
|
159
|
+
* { type: 'childAttached', parentId: 'workflow-123', child: { id: 'workflow-456', ... } }
|
|
160
|
+
* // Result: workflow-456 is added as child of workflow-123
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
handleChildAttached(event) {
|
|
164
|
+
// Deep clone child to prevent mutation of event data
|
|
165
|
+
const child = structuredClone(event.child);
|
|
166
|
+
// Find parent
|
|
167
|
+
const parent = this.nodeMap.get(event.parentId);
|
|
168
|
+
if (!parent) {
|
|
169
|
+
throw new Error(`Parent node '${event.parentId}' not found in nodeMap during childAttached event`);
|
|
170
|
+
}
|
|
171
|
+
// Validation 1: Check if child already has a different parent (single-parent rule)
|
|
172
|
+
if (child.parent !== null && child.parent !== parent) {
|
|
173
|
+
throw new Error(`Child '${child.name}' already has a parent. A node can only have one parent.`);
|
|
174
|
+
}
|
|
175
|
+
// Validation 2: Check for circular references
|
|
176
|
+
if (this.isNodeDescendantOf(parent, child)) {
|
|
177
|
+
throw new Error(`Cannot attach '${child.name}' as child of '${parent.name}' - would create circular reference`);
|
|
178
|
+
}
|
|
179
|
+
// Set bidirectional parent-child links
|
|
180
|
+
child.parent = parent;
|
|
181
|
+
parent.children.push(child);
|
|
182
|
+
// Add child and all descendants to nodeMap
|
|
183
|
+
this.buildNodeMap(child);
|
|
184
|
+
// Establish root if this is the first attachment and parent has no parent
|
|
185
|
+
if (this.root === null && parent.parent === null) {
|
|
186
|
+
this.root = parent;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Handle childDetached event - remove subtree from tree.
|
|
191
|
+
*
|
|
192
|
+
* **Strategy:**
|
|
193
|
+
* 1. Find child node via nodeMap.get(event.childId)
|
|
194
|
+
* 2. Find parent node via nodeMap.get(event.parentId)
|
|
195
|
+
* 3. Validate: parent and child exist, child is direct child of parent
|
|
196
|
+
* 4. Remove child from parent.children array
|
|
197
|
+
* 5. Clear child.parent reference
|
|
198
|
+
* 6. Remove child and all descendants from nodeMap via removeSubtreeNodes()
|
|
199
|
+
*
|
|
200
|
+
* **Invariants:**
|
|
201
|
+
* - Both parent and child must exist in nodeMap
|
|
202
|
+
* - Child must be a direct child of parent (not just any descendant)
|
|
203
|
+
*
|
|
204
|
+
* **Error Handling:**
|
|
205
|
+
* - Logs warning and returns early if parent or child not found
|
|
206
|
+
* - Does not throw for missing nodes (replay continues)
|
|
207
|
+
*
|
|
208
|
+
* @param event - ChildDetachedEvent with parentId and childId
|
|
209
|
+
*
|
|
210
|
+
* @example
|
|
211
|
+
* ```typescript
|
|
212
|
+
* // Event structure
|
|
213
|
+
* { type: 'childDetached', parentId: 'workflow-123', childId: 'workflow-456' }
|
|
214
|
+
* // Result: workflow-456 and its descendants are removed from tree
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
handleChildDetached(event) {
|
|
218
|
+
// Find parent and child
|
|
219
|
+
const parent = this.nodeMap.get(event.parentId);
|
|
220
|
+
const child = this.nodeMap.get(event.childId);
|
|
221
|
+
if (!parent) {
|
|
222
|
+
console.warn(`Parent node '${event.parentId}' not found in nodeMap during childDetached event`);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (!child) {
|
|
226
|
+
console.warn(`Child node '${event.childId}' not found in nodeMap during childDetached event`);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
// Validate child is direct child of parent
|
|
230
|
+
const index = parent.children.indexOf(child);
|
|
231
|
+
if (index === -1) {
|
|
232
|
+
console.warn(`Child '${child.name}' is not a direct child of parent '${parent.name}' during childDetached event`);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// Remove from parent's children array
|
|
236
|
+
parent.children.splice(index, 1);
|
|
237
|
+
// Clear child's parent reference
|
|
238
|
+
child.parent = null;
|
|
239
|
+
// Remove child and all descendants from nodeMap
|
|
240
|
+
this.removeSubtreeNodes(event.childId);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Handle treeUpdated event - update root reference.
|
|
244
|
+
*
|
|
245
|
+
* **Strategy:**
|
|
246
|
+
* 1. Verify event.root is a valid WorkflowNode
|
|
247
|
+
* 2. Update this.root = event.root
|
|
248
|
+
* 3. Clear nodeMap
|
|
249
|
+
* 4. Rebuild nodeMap from new root via buildNodeMap()
|
|
250
|
+
*
|
|
251
|
+
* **Use Case:**
|
|
252
|
+
* - Represents a complete tree replacement (not incremental update)
|
|
253
|
+
* - Rare in practice; most updates use childAttached/childDetached
|
|
254
|
+
*
|
|
255
|
+
* @param event - TreeUpdatedEvent with new root node
|
|
256
|
+
* @throws {Error} If event.root is null or undefined
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```typescript
|
|
260
|
+
* // Event structure
|
|
261
|
+
* { type: 'treeUpdated', root: { id: 'workflow-123', children: [], ... } }
|
|
262
|
+
* // Result: this.root points to new tree, nodeMap rebuilt
|
|
263
|
+
* ```
|
|
264
|
+
*/
|
|
265
|
+
handleTreeUpdated(event) {
|
|
266
|
+
if (!event.root) {
|
|
267
|
+
throw new Error('treeUpdated event has null or undefined root');
|
|
268
|
+
}
|
|
269
|
+
this.root = event.root;
|
|
270
|
+
// Clear and rebuild nodeMap from new root
|
|
271
|
+
this.nodeMap.clear();
|
|
272
|
+
this.buildNodeMap(event.root);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Handle stateSnapshot event - update node's state snapshot.
|
|
276
|
+
*
|
|
277
|
+
* **Strategy:**
|
|
278
|
+
* 1. Find node via nodeMap.get(event.node.id)
|
|
279
|
+
* 2. Extract event.node.stateSnapshot (not the entire node!)
|
|
280
|
+
* 3. Assign to node.stateSnapshot (direct assignment, last write wins)
|
|
281
|
+
*
|
|
282
|
+
* **Invariants:**
|
|
283
|
+
* - Node must exist in nodeMap
|
|
284
|
+
* - stateSnapshot can be null (no snapshot captured)
|
|
285
|
+
*
|
|
286
|
+
* **Error Handling:**
|
|
287
|
+
* - Logs warning if node not found (graceful degradation)
|
|
288
|
+
* - Does not throw for missing nodes
|
|
289
|
+
*
|
|
290
|
+
* **Null Handling:**
|
|
291
|
+
* - Allows null stateSnapshot values (valid state)
|
|
292
|
+
* - Don't throw error for null snapshots
|
|
293
|
+
*
|
|
294
|
+
* **Gotcha:** Event contains full node, but we only extract stateSnapshot field
|
|
295
|
+
* to avoid circular reference issues.
|
|
296
|
+
*
|
|
297
|
+
* @param event - StateSnapshotEvent with updated node
|
|
298
|
+
*
|
|
299
|
+
* @example
|
|
300
|
+
* ```typescript
|
|
301
|
+
* // Event structure
|
|
302
|
+
* { type: 'stateSnapshot', node: { id: 'workflow-123', stateSnapshot: { count: 42 }, ... } }
|
|
303
|
+
* // Result: node.stateSnapshot = { count: 42 }
|
|
304
|
+
* ```
|
|
305
|
+
*/
|
|
306
|
+
handleStateSnapshot(event) {
|
|
307
|
+
// Find node in map
|
|
308
|
+
const node = this.nodeMap.get(event.node.id);
|
|
309
|
+
if (!node) {
|
|
310
|
+
// Graceful degradation - log warning and continue
|
|
311
|
+
console.warn(`Node '${event.node.id}' not found in nodeMap during stateSnapshot event. ` +
|
|
312
|
+
`This may indicate out-of-order events or missing structural events.`);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
// Extract just the snapshot data, not the entire node
|
|
316
|
+
// Gotcha: event.node contains full node, but we only need stateSnapshot
|
|
317
|
+
node.stateSnapshot = event.node.stateSnapshot;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Handle error event - record error on node.
|
|
321
|
+
*
|
|
322
|
+
* **Strategy:**
|
|
323
|
+
* 1. Find node via nodeMap.get(event.node.id)
|
|
324
|
+
* 2. Append event to node.events array (accumulation pattern)
|
|
325
|
+
*
|
|
326
|
+
* **Invariants:**
|
|
327
|
+
* - Node must exist in nodeMap
|
|
328
|
+
* - Error includes rich context (state, logs, stack)
|
|
329
|
+
*
|
|
330
|
+
* **Error Handling:**
|
|
331
|
+
* - Logs warning if node not found (graceful degradation)
|
|
332
|
+
* - Does not throw for missing nodes
|
|
333
|
+
*
|
|
334
|
+
* **Accumulation Pattern:**
|
|
335
|
+
* - Multiple errors are accumulated (not overwritten)
|
|
336
|
+
* - All errors preserved in node.events[] array
|
|
337
|
+
* - To find all errors: node.events.filter(e => e.type === 'error')
|
|
338
|
+
*
|
|
339
|
+
* **Gotcha:** WorkflowNode has no dedicated errors[] field.
|
|
340
|
+
* All errors are stored in the events[] array.
|
|
341
|
+
*
|
|
342
|
+
* @param event - ErrorEvent with error details
|
|
343
|
+
*
|
|
344
|
+
* @example
|
|
345
|
+
* ```typescript
|
|
346
|
+
* // Event structure
|
|
347
|
+
* { type: 'error', node: {...}, error: { message: 'Failed', state: {...}, logs: [...] } }
|
|
348
|
+
* // Result: Error event appended to node.events[]
|
|
349
|
+
* ```
|
|
350
|
+
*/
|
|
351
|
+
handleErrorEvent(event) {
|
|
352
|
+
// Find node in map
|
|
353
|
+
const node = this.nodeMap.get(event.node.id);
|
|
354
|
+
if (!node) {
|
|
355
|
+
// Graceful degradation - log warning and continue
|
|
356
|
+
console.warn(`Node '${event.node.id}' not found in nodeMap during error event. ` +
|
|
357
|
+
`This may indicate out-of-order events or missing structural events.`);
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
// Accumulate error in events array (append-only pattern)
|
|
361
|
+
// Gotcha: No dedicated errors[] field - use node.events[]
|
|
362
|
+
node.events.push(event);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Handle stepStart event - track step execution start.
|
|
366
|
+
*
|
|
367
|
+
* **Strategy:**
|
|
368
|
+
* 1. Find node via nodeMap.get(event.node.id)
|
|
369
|
+
* 2. Append event to node.events array for tracking
|
|
370
|
+
*
|
|
371
|
+
* **Invariants:**
|
|
372
|
+
* - Step nodes are created via @Step decorator
|
|
373
|
+
* - Step node may not exist yet if childAttached event hasn't been processed
|
|
374
|
+
*
|
|
375
|
+
* **Error Handling:**
|
|
376
|
+
* - Returns silently if step node not found (childAttached will add it later)
|
|
377
|
+
* - Does not log warning (step nodes are expected to be added separately)
|
|
378
|
+
*
|
|
379
|
+
* **Use Case:**
|
|
380
|
+
* - Tracks step execution for debugging and performance analysis
|
|
381
|
+
* - Metadata only - doesn't modify tree structure
|
|
382
|
+
*
|
|
383
|
+
* @param event - StepStartEvent with step name
|
|
384
|
+
*
|
|
385
|
+
* @example
|
|
386
|
+
* ```typescript
|
|
387
|
+
* // Event structure
|
|
388
|
+
* { type: 'stepStart', node: { id: 'step-123', ... }, step: 'processData' }
|
|
389
|
+
* // Result: Event appended to node.events[]
|
|
390
|
+
* ```
|
|
391
|
+
*/
|
|
392
|
+
handleStepStart(event) {
|
|
393
|
+
// Find node in map
|
|
394
|
+
const node = this.nodeMap.get(event.node.id);
|
|
395
|
+
if (!node) {
|
|
396
|
+
// Step node may not exist yet - childAttached will add it later
|
|
397
|
+
// Don't log warning (expected for step nodes)
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
// Track step start in events array
|
|
401
|
+
node.events.push(event);
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Handle stepEnd event - track step execution completion with duration.
|
|
405
|
+
*
|
|
406
|
+
* **Strategy:**
|
|
407
|
+
* 1. Find node via nodeMap.get(event.node.id)
|
|
408
|
+
* 2. Append event to node.events array for tracking
|
|
409
|
+
* 3. Duration info is in event.duration field
|
|
410
|
+
*
|
|
411
|
+
* **Invariants:**
|
|
412
|
+
* - Step nodes are created via @Step decorator
|
|
413
|
+
* - Step node may not exist yet if childAttached event hasn't been processed
|
|
414
|
+
*
|
|
415
|
+
* **Error Handling:**
|
|
416
|
+
* - Returns silently if step node not found (childAttached will add it later)
|
|
417
|
+
* - Does not log warning (step nodes are expected to be added separately)
|
|
418
|
+
*
|
|
419
|
+
* **Use Case:**
|
|
420
|
+
* - Tracks step execution time for performance analysis
|
|
421
|
+
* - Metadata only - doesn't modify tree structure
|
|
422
|
+
*
|
|
423
|
+
* **Timing Info:**
|
|
424
|
+
* - Duration is in milliseconds
|
|
425
|
+
* - Access via event.duration field
|
|
426
|
+
*
|
|
427
|
+
* @param event - StepEndEvent with step name and duration
|
|
428
|
+
*
|
|
429
|
+
* @example
|
|
430
|
+
* ```typescript
|
|
431
|
+
* // Event structure
|
|
432
|
+
* { type: 'stepEnd', node: { id: 'step-123', ... }, step: 'processData', duration: 1500 }
|
|
433
|
+
* // Result: Event appended to node.events[], duration accessible
|
|
434
|
+
* ```
|
|
435
|
+
*/
|
|
436
|
+
handleStepEnd(event) {
|
|
437
|
+
// Find node in map
|
|
438
|
+
const node = this.nodeMap.get(event.node.id);
|
|
439
|
+
if (!node) {
|
|
440
|
+
// Step node may not exist yet - childAttached will add it later
|
|
441
|
+
// Don't log warning (expected for step nodes)
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
// Track step end with duration in events array
|
|
445
|
+
node.events.push(event);
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Handle taskStart event - track task execution start.
|
|
449
|
+
*
|
|
450
|
+
* **Strategy:**
|
|
451
|
+
* 1. Find node via nodeMap.get(event.node.id)
|
|
452
|
+
* 2. Append event to node.events array for tracking
|
|
453
|
+
*
|
|
454
|
+
* **Invariants:**
|
|
455
|
+
* - Task events reference parent node (not a separate task node)
|
|
456
|
+
* - Parent node should exist in nodeMap
|
|
457
|
+
*
|
|
458
|
+
* **Error Handling:**
|
|
459
|
+
* - Logs warning if node not found (graceful degradation)
|
|
460
|
+
* - Does not throw for missing nodes
|
|
461
|
+
*
|
|
462
|
+
* **Use Case:**
|
|
463
|
+
* - Tracks task execution for debugging
|
|
464
|
+
* - Metadata only - doesn't modify tree structure
|
|
465
|
+
*
|
|
466
|
+
* **Difference from Steps:**
|
|
467
|
+
* - Tasks don't create separate nodes
|
|
468
|
+
* - Task events reference parent node
|
|
469
|
+
* - No duration tracking in task events
|
|
470
|
+
*
|
|
471
|
+
* @param event - TaskStartEvent with task name
|
|
472
|
+
*
|
|
473
|
+
* @example
|
|
474
|
+
* ```typescript
|
|
475
|
+
* // Event structure
|
|
476
|
+
* { type: 'taskStart', node: { id: 'workflow-123', ... }, task: 'cleanup' }
|
|
477
|
+
* // Result: Event appended to node.events[]
|
|
478
|
+
* ```
|
|
479
|
+
*/
|
|
480
|
+
handleTaskStart(event) {
|
|
481
|
+
// Find node in map
|
|
482
|
+
const node = this.nodeMap.get(event.node.id);
|
|
483
|
+
if (!node) {
|
|
484
|
+
// Graceful degradation - log warning and continue
|
|
485
|
+
console.warn(`Node '${event.node.id}' not found in nodeMap during taskStart event. ` +
|
|
486
|
+
`This may indicate out-of-order events or missing structural events.`);
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
// Track task start in events array
|
|
490
|
+
node.events.push(event);
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Handle taskEnd event - track task execution completion.
|
|
494
|
+
*
|
|
495
|
+
* **Strategy:**
|
|
496
|
+
* 1. Find node via nodeMap.get(event.node.id)
|
|
497
|
+
* 2. Append event to node.events array for tracking
|
|
498
|
+
*
|
|
499
|
+
* **Invariants:**
|
|
500
|
+
* - Task events reference parent node (not a separate task node)
|
|
501
|
+
* - Parent node should exist in nodeMap
|
|
502
|
+
*
|
|
503
|
+
* **Error Handling:**
|
|
504
|
+
* - Logs warning if node not found (graceful degradation)
|
|
505
|
+
* - Does not throw for missing nodes
|
|
506
|
+
*
|
|
507
|
+
* **Use Case:**
|
|
508
|
+
* - Tracks task execution for debugging
|
|
509
|
+
* - Metadata only - doesn't modify tree structure
|
|
510
|
+
*
|
|
511
|
+
* **Gotcha:** taskEnd event does NOT have a duration field (unlike stepEnd)
|
|
512
|
+
*
|
|
513
|
+
* @param event - TaskEndEvent with task name
|
|
514
|
+
*
|
|
515
|
+
* @example
|
|
516
|
+
* ```typescript
|
|
517
|
+
* // Event structure
|
|
518
|
+
* { type: 'taskEnd', node: { id: 'workflow-123', ... }, task: 'cleanup' }
|
|
519
|
+
* // Result: Event appended to node.events[]
|
|
520
|
+
* ```
|
|
521
|
+
*/
|
|
522
|
+
handleTaskEnd(event) {
|
|
523
|
+
// Find node in map
|
|
524
|
+
const node = this.nodeMap.get(event.node.id);
|
|
525
|
+
if (!node) {
|
|
526
|
+
// Graceful degradation - log warning and continue
|
|
527
|
+
console.warn(`Node '${event.node.id}' not found in nodeMap during taskEnd event. ` +
|
|
528
|
+
`This may indicate out-of-order events or missing structural events.`);
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
// Track task end in events array
|
|
532
|
+
// Gotcha: No duration field in taskEnd event
|
|
533
|
+
node.events.push(event);
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Build node lookup map recursively (pattern from WorkflowTreeDebugger).
|
|
537
|
+
*
|
|
538
|
+
* **Strategy:**
|
|
539
|
+
* - Depth-first traversal of subtree
|
|
540
|
+
* - Add each node to nodeMap: nodeMap.set(node.id, node)
|
|
541
|
+
* - Recurse for all children
|
|
542
|
+
*
|
|
543
|
+
* **Complexity:** O(k) where k = number of nodes in subtree
|
|
544
|
+
*
|
|
545
|
+
* @param node - Root of subtree to add to nodeMap
|
|
546
|
+
*
|
|
547
|
+
* @example
|
|
548
|
+
* ```typescript
|
|
549
|
+
* // After attaching a child, add it and descendants to map
|
|
550
|
+
* this.buildNodeMap(event.child);
|
|
551
|
+
* // Result: child and all descendants are now in nodeMap
|
|
552
|
+
* ```
|
|
553
|
+
*/
|
|
554
|
+
buildNodeMap(node) {
|
|
555
|
+
this.nodeMap.set(node.id, node);
|
|
556
|
+
for (const child of node.children) {
|
|
557
|
+
this.buildNodeMap(child);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Remove entire subtree from node map using BFS traversal.
|
|
562
|
+
*
|
|
563
|
+
* **Strategy:**
|
|
564
|
+
* - BFS traversal to collect all descendant IDs
|
|
565
|
+
* - Batch delete all collected keys from nodeMap
|
|
566
|
+
* - Iterative (not recursive) to avoid stack overflow on deep trees
|
|
567
|
+
*
|
|
568
|
+
* **Complexity:** O(k) where k = number of nodes in subtree
|
|
569
|
+
*
|
|
570
|
+
* @param nodeId - ID of root node of subtree to remove
|
|
571
|
+
*
|
|
572
|
+
* @example
|
|
573
|
+
* ```typescript
|
|
574
|
+
* // After detaching a child, remove it and descendants from map
|
|
575
|
+
* this.removeSubtreeNodes(event.childId);
|
|
576
|
+
* // Result: child and all descendants removed from nodeMap
|
|
577
|
+
* ```
|
|
578
|
+
*/
|
|
579
|
+
removeSubtreeNodes(nodeId) {
|
|
580
|
+
const node = this.nodeMap.get(nodeId);
|
|
581
|
+
if (!node)
|
|
582
|
+
return; // Already removed or never existed
|
|
583
|
+
// BFS traversal to collect all descendant IDs
|
|
584
|
+
const toRemove = [];
|
|
585
|
+
const queue = [node];
|
|
586
|
+
while (queue.length > 0) {
|
|
587
|
+
const current = queue.shift();
|
|
588
|
+
toRemove.push(current.id);
|
|
589
|
+
// Add children to queue for BFS traversal
|
|
590
|
+
queue.push(...current.children);
|
|
591
|
+
}
|
|
592
|
+
// Batch delete all collected keys (atomic update)
|
|
593
|
+
for (const id of toRemove) {
|
|
594
|
+
this.nodeMap.delete(id);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Check if node is descendant of potential ancestor.
|
|
599
|
+
* Uses cycle detection to prevent infinite loops during traversal.
|
|
600
|
+
*
|
|
601
|
+
* **Strategy:**
|
|
602
|
+
* - Traverse parent chain upward from node
|
|
603
|
+
* - Track visited nodes to detect cycles
|
|
604
|
+
* - Return true if ancestor found in parent chain
|
|
605
|
+
*
|
|
606
|
+
* **Complexity:** O(d) where d = depth of hierarchy
|
|
607
|
+
*
|
|
608
|
+
* @param node - Node to start traversal from
|
|
609
|
+
* @param potentialAncestor - Potential ancestor to search for
|
|
610
|
+
* @returns true if ancestor found in parent chain
|
|
611
|
+
* @throws {Error} If circular reference detected
|
|
612
|
+
*
|
|
613
|
+
* @example
|
|
614
|
+
* ```typescript
|
|
615
|
+
* // Check if attaching would create cycle
|
|
616
|
+
* if (this.isNodeDescendantOf(parent, child)) {
|
|
617
|
+
* throw new Error('Would create circular reference');
|
|
618
|
+
* }
|
|
619
|
+
* ```
|
|
620
|
+
*/
|
|
621
|
+
isNodeDescendantOf(node, potentialAncestor) {
|
|
622
|
+
const visited = new Set();
|
|
623
|
+
let current = node.parent;
|
|
624
|
+
while (current !== null) {
|
|
625
|
+
// Cycle detection
|
|
626
|
+
if (visited.has(current)) {
|
|
627
|
+
throw new Error('Circular parent-child relationship detected');
|
|
628
|
+
}
|
|
629
|
+
visited.add(current);
|
|
630
|
+
// Check if we found the ancestor
|
|
631
|
+
if (current === potentialAncestor) {
|
|
632
|
+
return true;
|
|
633
|
+
}
|
|
634
|
+
current = current.parent;
|
|
635
|
+
}
|
|
636
|
+
return false;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
//# sourceMappingURL=event-replayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-replayer.js","sourceRoot":"","sources":["../../src/debugger/event-replayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/debugger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/debugger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
|