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,319 +0,0 @@
|
|
|
1
|
-
# Cycle Detection Research - Quick Reference for PRP Documents
|
|
2
|
-
|
|
3
|
-
**Last Updated:** 2025-01-11
|
|
4
|
-
**Source:** `/plan/docs/research/CYCLE_DETECTION_PATTERNS.md`
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Key Findings Summary
|
|
9
|
-
|
|
10
|
-
### 1. Recommended Approach: WeakSet-based Detection
|
|
11
|
-
|
|
12
|
-
```typescript
|
|
13
|
-
function detectCycle<T extends object>(
|
|
14
|
-
node: T,
|
|
15
|
-
visited: WeakSet<T> = new WeakSet()
|
|
16
|
-
): void {
|
|
17
|
-
if (visited.has(node)) {
|
|
18
|
-
throw new Error(`Cycle detected at ${getNodeId(node)}`);
|
|
19
|
-
}
|
|
20
|
-
visited.add(node);
|
|
21
|
-
|
|
22
|
-
// Process children...
|
|
23
|
-
if ('children' in node && Array.isArray((node as any).children)) {
|
|
24
|
-
for (const child of (node as any).children) {
|
|
25
|
-
detectCycle(child, visited);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**Why WeakSet?**
|
|
32
|
-
- Memory efficient (automatic garbage collection)
|
|
33
|
-
- O(1) lookup/insertion
|
|
34
|
-
- No manual cleanup needed
|
|
35
|
-
- <5% performance overhead
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
### 2. Security: DoS Prevention Layers
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
interface TraversalOptions {
|
|
43
|
-
maxDepth?: number; // Prevent stack overflow (default: 1000)
|
|
44
|
-
maxNodes?: number; // Prevent memory exhaustion (default: 10000)
|
|
45
|
-
timeoutMs?: number; // Prevent CPU exhaustion (default: 5000ms)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function secureTraverse<T>(root: T, options: TraversalOptions): void {
|
|
49
|
-
const { maxDepth = 1000, maxNodes = 10000, timeoutMs = 5000 } = options;
|
|
50
|
-
const startTime = Date.now();
|
|
51
|
-
const visited = new WeakSet<object>();
|
|
52
|
-
let nodeCount = 0;
|
|
53
|
-
|
|
54
|
-
function traverse(node: any, depth: number): void {
|
|
55
|
-
// Check 1: Timeout
|
|
56
|
-
if (Date.now() - startTime > timeoutMs) {
|
|
57
|
-
throw new Error(`Traversal timeout (${timeoutMs}ms) exceeded`);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Check 2: Depth limit
|
|
61
|
-
if (depth > maxDepth) {
|
|
62
|
-
throw new Error(`Maximum depth (${maxDepth}) exceeded`);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Check 3: Node count limit
|
|
66
|
-
if (nodeCount++ > maxNodes) {
|
|
67
|
-
throw new Error(`Maximum node count (${maxNodes}) exceeded`);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Check 4: Cycle detection
|
|
71
|
-
if (visited.has(node)) {
|
|
72
|
-
throw new Error(`Circular reference detected`);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
visited.add(node);
|
|
76
|
-
|
|
77
|
-
// Process children
|
|
78
|
-
if (node.children) {
|
|
79
|
-
for (const child of node.children) {
|
|
80
|
-
traverse(child, depth + 1);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
traverse(root, 0);
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
### 3. Error Message Best Practices
|
|
92
|
-
|
|
93
|
-
```typescript
|
|
94
|
-
class CycleDetectionError extends Error {
|
|
95
|
-
constructor(
|
|
96
|
-
nodeName: string,
|
|
97
|
-
cyclePath: string[],
|
|
98
|
-
nodeType: string,
|
|
99
|
-
depth: number
|
|
100
|
-
) {
|
|
101
|
-
super(
|
|
102
|
-
`Cycle detected in ${nodeType}:\n` +
|
|
103
|
-
` Problem node: "${nodeName}"\n` +
|
|
104
|
-
` Cycle path: ${cyclePath.join(' → ')}\n` +
|
|
105
|
-
` Depth: ${depth}\n` +
|
|
106
|
-
`\n` +
|
|
107
|
-
`Common causes:\n` +
|
|
108
|
-
` 1. A node was attached as its own parent/ancestor\n` +
|
|
109
|
-
` 2. Multiple nodes form a circular reference chain\n` +
|
|
110
|
-
` 3. Shared children between different parents\n` +
|
|
111
|
-
`\n` +
|
|
112
|
-
`Suggested fixes:\n` +
|
|
113
|
-
` - Verify parent-child relationships during attachment\n` +
|
|
114
|
-
` - Use unique IDs for all nodes\n` +
|
|
115
|
-
` - Add cycle detection in your attachChild() method`
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
this.name = 'CycleDetectionError';
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
### 4. Real-World Examples from Popular Libraries
|
|
126
|
-
|
|
127
|
-
#### estree-walker (AST Traversal)
|
|
128
|
-
- **URL:** https://github.com/Rich-Harris/estree-walker
|
|
129
|
-
- **Pattern:** No explicit cycle detection (ASTs are guaranteed acyclic)
|
|
130
|
-
- **Lesson:** If you can guarantee no cycles at creation time, skip runtime checks
|
|
131
|
-
|
|
132
|
-
#### Vue.js Reactivity System
|
|
133
|
-
- **URL:** https://github.com/vuejs/core
|
|
134
|
-
- **Pattern:** Uses WeakMap for tracking reactive effects
|
|
135
|
-
- **Lesson:** WeakMap for automatic garbage collection
|
|
136
|
-
|
|
137
|
-
#### TypeScript Compiler
|
|
138
|
-
- **URL:** https://github.com/microsoft/TypeScript
|
|
139
|
-
- **Pattern:** Type system prevents circular references
|
|
140
|
-
- **Lesson:** Use type system guarantees when possible
|
|
141
|
-
|
|
142
|
-
#### JSON.stringify (V8)
|
|
143
|
-
- **Pattern:** Detects circular references automatically
|
|
144
|
-
- **Lesson:** Provide custom replacer for graceful handling
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
### 5. Performance Benchmarks (1000 nodes)
|
|
149
|
-
|
|
150
|
-
| Method | Time | Memory | Recommendation |
|
|
151
|
-
|--------|------|--------|----------------|
|
|
152
|
-
| No detection | 1.5ms | N/A | Vulnerable |
|
|
153
|
-
| **WeakSet** | 2.0ms | +5% | **Recommended** |
|
|
154
|
-
| Set (IDs) | 2.8ms | +10% | Good alternative |
|
|
155
|
-
| Map (paths) | 4.5ms | +25% | Debug mode only |
|
|
156
|
-
|
|
157
|
-
**Conclusion:** Proper cycle detection adds <50% overhead
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
### 6. Integration Pattern for Workflow Classes
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
export class Workflow {
|
|
165
|
-
private cycleDetector = new ProductionCycleDetector<Workflow>();
|
|
166
|
-
|
|
167
|
-
public attachChild(child: Workflow): void {
|
|
168
|
-
try {
|
|
169
|
-
// Check for cycles BEFORE attaching
|
|
170
|
-
this.cycleDetector.check(child);
|
|
171
|
-
|
|
172
|
-
// Safe to attach
|
|
173
|
-
this.children.push(child);
|
|
174
|
-
child.parent = this;
|
|
175
|
-
|
|
176
|
-
// Notify observers
|
|
177
|
-
this.emitEvent({
|
|
178
|
-
type: 'childAttached',
|
|
179
|
-
parentId: this.id,
|
|
180
|
-
child: child.node,
|
|
181
|
-
});
|
|
182
|
-
} catch (error) {
|
|
183
|
-
this.cycleDetector.reset();
|
|
184
|
-
throw new Error(`Failed to attach child: ${error.message}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
public getRoot(): Workflow {
|
|
189
|
-
const detector = new ProductionCycleDetector<Workflow>();
|
|
190
|
-
|
|
191
|
-
function findRoot(wf: Workflow): Workflow {
|
|
192
|
-
detector.check(wf);
|
|
193
|
-
return wf.parent ? findRoot(wf.parent) : wf;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
try {
|
|
197
|
-
return findRoot(this);
|
|
198
|
-
} catch (error) {
|
|
199
|
-
throw new Error(`Cycle detected: ${error.message}`);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
### 7. Key Gotchas to Avoid
|
|
208
|
-
|
|
209
|
-
1. **Shared Children:** Same child referenced by multiple parents (use true cycle detection, not just visited check)
|
|
210
|
-
2. **WeakSet Can't Iterate:** Can't reconstruct full path from WeakSet alone (use parallel array tracking)
|
|
211
|
-
3. **Backtracking in Non-Cyclic Graphs:** Must delete from Set when backtracking (WeakSet auto-GCs)
|
|
212
|
-
4. **Primitives Can't Use WeakSet:** Use Set for string/number IDs
|
|
213
|
-
5. **Async Race Conditions:** Multiple traversals can interfere (use local visited sets)
|
|
214
|
-
6. **Mutation During Traversal:** Copy children arrays before iteration
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
### 8. Recommended Implementation Checklist
|
|
219
|
-
|
|
220
|
-
- [ ] Use WeakSet for object tracking (memory efficient)
|
|
221
|
-
- [ ] Add depth limiting (prevent stack overflow)
|
|
222
|
-
- [ ] Add timeout protection (prevent CPU exhaustion)
|
|
223
|
-
- [ ] Add node count limiting (prevent memory exhaustion)
|
|
224
|
-
- [ ] Provide detailed error messages with path information
|
|
225
|
-
- [ ] Reset detector state appropriately
|
|
226
|
-
- [ ] Add unit tests for cycle scenarios
|
|
227
|
-
- [ ] Add monitoring/metrics for production
|
|
228
|
-
- [ ] Document security implications in code comments
|
|
229
|
-
|
|
230
|
-
---
|
|
231
|
-
|
|
232
|
-
### 9. URLs for PRP References
|
|
233
|
-
|
|
234
|
-
#### Documentation
|
|
235
|
-
- MDN WeakSet: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
|
|
236
|
-
- MDN WeakMap: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
|
|
237
|
-
- Floyd's Algorithm: https://en.wikipedia.org/wiki/Cycle_detection
|
|
238
|
-
|
|
239
|
-
#### Libraries
|
|
240
|
-
- estree-walker: https://github.com/Rich-Harris/estree-walker
|
|
241
|
-
- TypeScript: https://github.com/microsoft/TypeScript
|
|
242
|
-
- Vue.js: https://github.com/vuejs/core
|
|
243
|
-
- React: https://github.com/facebook/react
|
|
244
|
-
|
|
245
|
-
#### Security
|
|
246
|
-
- OWASP DoS: https://owasp.org/www-community/attacks/Denial_of_Service
|
|
247
|
-
- CWE-835: https://cwe.mitre.org/data/definitions/835.html
|
|
248
|
-
|
|
249
|
-
#### Tools
|
|
250
|
-
- flatted: https://github.com/WebReflection/flatted
|
|
251
|
-
- json-stringify-safe: https://github.com/moll/json-stringify-safe
|
|
252
|
-
|
|
253
|
-
---
|
|
254
|
-
|
|
255
|
-
### 10. Copy-Paste Ready Implementation
|
|
256
|
-
|
|
257
|
-
```typescript
|
|
258
|
-
/**
|
|
259
|
-
* Production cycle detector
|
|
260
|
-
* Usage: new ProductionCycleDetector().check(node)
|
|
261
|
-
*/
|
|
262
|
-
export class ProductionCycleDetector<T extends object> {
|
|
263
|
-
private visited = new WeakSet<T>();
|
|
264
|
-
private path: T[] = [];
|
|
265
|
-
private readonly maxDepth: number;
|
|
266
|
-
private readonly timeout: number;
|
|
267
|
-
private startTime: number;
|
|
268
|
-
|
|
269
|
-
constructor(options: { maxDepth?: number; timeoutMs?: number } = {}) {
|
|
270
|
-
this.maxDepth = options.maxDepth ?? 1000;
|
|
271
|
-
this.timeout = options.timeoutMs ?? 5000;
|
|
272
|
-
this.startTime = Date.now();
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
check(node: T): void {
|
|
276
|
-
// Timeout check
|
|
277
|
-
if (Date.now() - this.startTime > this.timeout) {
|
|
278
|
-
throw new Error(`Traversal timeout (${this.timeout}ms) exceeded`);
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Depth check
|
|
282
|
-
if (this.path.length > this.maxDepth) {
|
|
283
|
-
throw new Error(`Maximum depth (${this.maxDepth}) exceeded`);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Cycle check
|
|
287
|
-
if (this.visited.has(node)) {
|
|
288
|
-
const pathInfo = this.path.map(n =>
|
|
289
|
-
(n as any).id || (n as any).name || 'unknown'
|
|
290
|
-
).join(' -> ');
|
|
291
|
-
|
|
292
|
-
throw new Error(
|
|
293
|
-
`Cycle detected.\n` +
|
|
294
|
-
`Node type: ${(node as any).constructor.name}\n` +
|
|
295
|
-
`Path: ${pathInfo}\n` +
|
|
296
|
-
`Depth: ${this.path.length}`
|
|
297
|
-
);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
this.visited.add(node);
|
|
301
|
-
this.path.push(node);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
leave(node: T): void {
|
|
305
|
-
const index = this.path.lastIndexOf(node);
|
|
306
|
-
if (index !== -1) this.path.splice(index, 1);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
reset(): void {
|
|
310
|
-
this.visited = new WeakSet();
|
|
311
|
-
this.path = [];
|
|
312
|
-
this.startTime = Date.now();
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
---
|
|
318
|
-
|
|
319
|
-
**For Full Details:** See `/plan/docs/research/CYCLE_DETECTION_PATTERNS.md`
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
# Codebase Context Research: P1.M1.T2.S1
|
|
2
|
-
|
|
3
|
-
## Project Structure
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
/home/dustin/projects/groundswell/
|
|
7
|
-
├── src/
|
|
8
|
-
│ ├── core/
|
|
9
|
-
│ │ └── workflow.ts # Main Workflow class (349 lines)
|
|
10
|
-
│ ├── types/
|
|
11
|
-
│ │ ├── workflow.ts # Workflow type definitions
|
|
12
|
-
│ │ ├── events.ts # Event type definitions
|
|
13
|
-
│ │ └── observer.ts # Observer interface
|
|
14
|
-
│ └── __tests__/
|
|
15
|
-
│ ├── adversarial/
|
|
16
|
-
│ │ └── parent-validation.test.ts # Reference test pattern
|
|
17
|
-
│ ├── unit/
|
|
18
|
-
│ │ └── workflow.test.ts
|
|
19
|
-
│ └── integration/
|
|
20
|
-
├── plan/
|
|
21
|
-
│ └── bugfix/
|
|
22
|
-
│ ├── P1M1T1S1/ # Completed parent validation
|
|
23
|
-
│ │ ├── research/ # Research docs from S1
|
|
24
|
-
│ │ └── PRP.md
|
|
25
|
-
│ └── P1M1T2S1/ # Current work item
|
|
26
|
-
│ └── research/
|
|
27
|
-
├── package.json
|
|
28
|
-
├── tsconfig.json
|
|
29
|
-
└── vitest.config.ts
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Test Framework
|
|
33
|
-
|
|
34
|
-
- **Framework**: Vitest
|
|
35
|
-
- **Config**: `vitest.config.ts`
|
|
36
|
-
- **Test command**: `npm test` (runs `vitest run`)
|
|
37
|
-
- **Watch mode**: `npm run test:watch`
|
|
38
|
-
- **Current status**: 242 tests passing
|
|
39
|
-
|
|
40
|
-
## TypeScript Configuration
|
|
41
|
-
|
|
42
|
-
```json
|
|
43
|
-
{
|
|
44
|
-
"compilerOptions": {
|
|
45
|
-
"target": "ES2022",
|
|
46
|
-
"module": "ES2022",
|
|
47
|
-
"strict": true,
|
|
48
|
-
"outDir": "./dist",
|
|
49
|
-
"rootDir": "./src"
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Build/Test Commands
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
# Run tests
|
|
58
|
-
npm test
|
|
59
|
-
|
|
60
|
-
# Watch mode
|
|
61
|
-
npm run test:watch
|
|
62
|
-
|
|
63
|
-
# Type check
|
|
64
|
-
npm run lint # Runs tsc --noEmit
|
|
65
|
-
|
|
66
|
-
# Build
|
|
67
|
-
npm run build
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## Task Status (from bug_fix_tasks.json)
|
|
71
|
-
|
|
72
|
-
**P1.M1.T1 - Parent Validation - COMPLETED**
|
|
73
|
-
- Parent validation implemented in attachChild()
|
|
74
|
-
- Tests passing
|
|
75
|
-
|
|
76
|
-
**P1.M1.T2 - Circular Reference Detection - IN PROGRESS**
|
|
77
|
-
- S1: Write failing test (CURRENT TASK)
|
|
78
|
-
- S2: Implement isDescendantOf() helper method
|
|
79
|
-
- S3: Integrate circular reference check into attachChild()
|
|
80
|
-
- S4: Verify no regressions
|
|
81
|
-
|
|
82
|
-
## Related Documentation
|
|
83
|
-
|
|
84
|
-
- **Implementation Patterns**: `/plan/docs/bugfix-architecture/implementation_patterns.md`
|
|
85
|
-
- **Bug Analysis**: `/plan/docs/bugfix-architecture/bug_analysis.md`
|
|
86
|
-
- **Cycle Detection Research**: `/plan/docs/research/CYCLE_DETECTION_PATTERNS.md`
|
|
87
|
-
|
|
88
|
-
## Dependencies
|
|
89
|
-
|
|
90
|
-
```json
|
|
91
|
-
{
|
|
92
|
-
"dependencies": {
|
|
93
|
-
"@anthropic-ai/sdk": "^0.71.1",
|
|
94
|
-
"lru-cache": "^10.4.3",
|
|
95
|
-
"zod": "^3.23.0"
|
|
96
|
-
},
|
|
97
|
-
"devDependencies": {
|
|
98
|
-
"typescript": "^5.2.0",
|
|
99
|
-
"tsx": "^4.21.0",
|
|
100
|
-
"vitest": "^1.0.0"
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## Import Patterns
|
|
106
|
-
|
|
107
|
-
```typescript
|
|
108
|
-
// For tests
|
|
109
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
110
|
-
import { Workflow } from '../../index.js';
|
|
111
|
-
|
|
112
|
-
// For implementation
|
|
113
|
-
import { Workflow } from './workflow.js';
|
|
114
|
-
import type { WorkflowEvent, WorkflowNode } from '../types/index.js';
|
|
115
|
-
```
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
# Cycle Detection Research: P1.M1.T2.S1
|
|
2
|
-
|
|
3
|
-
## isDescendantOf() Pattern
|
|
4
|
-
|
|
5
|
-
The key method needed for circular reference detection is `isDescendantOf()`. This checks if a given workflow is an ancestor of the current workflow by traversing the parent chain.
|
|
6
|
-
|
|
7
|
-
### Recommended Implementation Pattern
|
|
8
|
-
|
|
9
|
-
```typescript
|
|
10
|
-
/**
|
|
11
|
-
* Check if this workflow is a descendant of another workflow
|
|
12
|
-
* Used to prevent circular references in attachChild()
|
|
13
|
-
*/
|
|
14
|
-
private isDescendantOf(ancestor: Workflow): boolean {
|
|
15
|
-
const visited = new Set<Workflow>();
|
|
16
|
-
let current: Workflow | null = this.parent;
|
|
17
|
-
|
|
18
|
-
while (current !== null) {
|
|
19
|
-
// Cycle detection during traversal itself (defensive)
|
|
20
|
-
if (visited.has(current)) {
|
|
21
|
-
throw new Error('Circular reference detected in tree structure');
|
|
22
|
-
}
|
|
23
|
-
visited.add(current);
|
|
24
|
-
|
|
25
|
-
if (current === ancestor) {
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
current = current.parent;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Usage in attachChild()
|
|
36
|
-
|
|
37
|
-
```typescript
|
|
38
|
-
public attachChild(child: Workflow): void {
|
|
39
|
-
// ... existing validations ...
|
|
40
|
-
|
|
41
|
-
// Validation: Prevent circular references
|
|
42
|
-
if (this.isDescendantOf(child)) {
|
|
43
|
-
throw new Error(
|
|
44
|
-
`Cannot attach '${child.node.name}' to '${this.node.name}': ` +
|
|
45
|
-
`would create circular reference`
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// ... rest of method ...
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Test Scenarios to Cover
|
|
54
|
-
|
|
55
|
-
### Scenario 1: Immediate Circular Reference
|
|
56
|
-
```typescript
|
|
57
|
-
const parent = new Workflow('Parent');
|
|
58
|
-
const child = new Workflow('Child', parent);
|
|
59
|
-
|
|
60
|
-
// This should throw - child is trying to attach its parent
|
|
61
|
-
expect(() => child.attachChild(parent)).toThrow(/circular|cycle|ancestor/);
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Scenario 2: Ancestor Circular Reference (Multi-level)
|
|
65
|
-
```typescript
|
|
66
|
-
const root = new Workflow('Root');
|
|
67
|
-
const child1 = new Workflow('Child1', root);
|
|
68
|
-
const child2 = new Workflow('Child2', child1);
|
|
69
|
-
|
|
70
|
-
// This should throw - root is an ancestor of child2
|
|
71
|
-
expect(() => child2.attachChild(root)).toThrow(/circular|cycle|ancestor/);
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Error Message Convention
|
|
75
|
-
|
|
76
|
-
From implementation_patterns.md:
|
|
77
|
-
- Error should contain 'circular' OR 'cycle' OR 'ancestor'
|
|
78
|
-
- Pattern from research: `toThrow(/circular|cycle|ancestor/)`
|
|
79
|
-
|
|
80
|
-
## Performance Considerations
|
|
81
|
-
|
|
82
|
-
- **Time Complexity**: O(h) where h is the height of the tree
|
|
83
|
-
- **Space Complexity**: O(h) for the visited Set
|
|
84
|
-
- **DoS Protection**: Consider max depth limit (currently not implemented)
|
|
85
|
-
|
|
86
|
-
## Related Code Patterns
|
|
87
|
-
|
|
88
|
-
### Existing getRoot() Pattern (similar traversal)
|
|
89
|
-
```typescript
|
|
90
|
-
// From workflow.ts - shows similar parent chain traversal pattern
|
|
91
|
-
private getRoot(): Workflow {
|
|
92
|
-
const visited = new Set<Workflow>();
|
|
93
|
-
let current: Workflow | null = this;
|
|
94
|
-
|
|
95
|
-
while (current) {
|
|
96
|
-
if (visited.has(current)) {
|
|
97
|
-
throw new Error('Circular parent-child relationship detected');
|
|
98
|
-
}
|
|
99
|
-
visited.add(current);
|
|
100
|
-
current = current.parent;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return Array.from(visited).pop()!;
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Event Tree Ancestor Pattern
|
|
108
|
-
```typescript
|
|
109
|
-
// From src/core/event-tree.ts - similar ancestor tracking
|
|
110
|
-
public getAncestors(id: string): EventNode[] {
|
|
111
|
-
const ancestors: EventNode[] = [];
|
|
112
|
-
const node = this.nodeIndex.get(id);
|
|
113
|
-
|
|
114
|
-
if (!node || !node.parentId) {
|
|
115
|
-
return ancestors;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
let currentId = node.parentId;
|
|
119
|
-
while (currentId) {
|
|
120
|
-
const parent = this.nodeIndex.get(currentId);
|
|
121
|
-
if (!parent) break;
|
|
122
|
-
ancestors.push(parent);
|
|
123
|
-
currentId = parent.parentId ?? '';
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return ancestors;
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
## Key Sources
|
|
131
|
-
|
|
132
|
-
- **Research Document**: `/home/dustin/projects/groundswell/plan/docs/research/CYCLE_DETECTION_PATTERNS.md`
|
|
133
|
-
- **Quick Reference**: `/home/dustin/projects/groundswell/plan/docs/research/CYCLE_DETECTION_QUICK_REF.md`
|
|
134
|
-
- **Implementation Patterns**: `/home/dustin/projects/groundswell/plan/docs/bugfix-architecture/implementation_patterns.md`
|