groundswell 0.0.2 → 0.0.3
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/dist/__tests__/adversarial/attachChild-performance.test.d.ts +16 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.js +187 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.js.map +1 -0
- package/dist/__tests__/adversarial/circular-reference.test.d.ts +13 -0
- package/dist/__tests__/adversarial/circular-reference.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/circular-reference.test.js +92 -0
- package/dist/__tests__/adversarial/circular-reference.test.js.map +1 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts +16 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.js +127 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.js.map +1 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts +21 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js +667 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js.map +1 -0
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts +6 -0
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/deep-analysis.test.js +877 -0
- package/dist/__tests__/adversarial/deep-analysis.test.js.map +1 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts +13 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js +186 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js.map +1 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts +6 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js +626 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js.map +1 -0
- package/dist/__tests__/adversarial/edge-case.test.d.ts +6 -0
- package/dist/__tests__/adversarial/edge-case.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/edge-case.test.js +857 -0
- package/dist/__tests__/adversarial/edge-case.test.js.map +1 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts +20 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.js +907 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.js.map +1 -0
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts +2 -0
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/incremental-performance.test.js +113 -0
- package/dist/__tests__/adversarial/incremental-performance.test.js.map +1 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts +22 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js +383 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js.map +1 -0
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts +21 -0
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/observer-propagation.test.js +404 -0
- package/dist/__tests__/adversarial/observer-propagation.test.js.map +1 -0
- package/dist/__tests__/adversarial/parent-validation.test.d.ts +13 -0
- package/dist/__tests__/adversarial/parent-validation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/parent-validation.test.js +128 -0
- package/dist/__tests__/adversarial/parent-validation.test.js.map +1 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts +20 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js +482 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js.map +1 -0
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts +6 -0
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/prd-compliance.test.js +886 -0
- package/dist/__tests__/adversarial/prd-compliance.test.js.map +1 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts +22 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts.map +1 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.js +1843 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.js.map +1 -0
- package/dist/__tests__/helpers/index.d.ts +10 -0
- package/dist/__tests__/helpers/index.d.ts.map +1 -0
- package/{src/__tests__/helpers/index.ts → dist/__tests__/helpers/index.js} +2 -10
- package/dist/__tests__/helpers/index.js.map +1 -0
- package/dist/__tests__/helpers/tree-verification.d.ts +90 -0
- package/dist/__tests__/helpers/tree-verification.d.ts.map +1 -0
- package/dist/__tests__/helpers/tree-verification.js +202 -0
- package/dist/__tests__/helpers/tree-verification.js.map +1 -0
- package/dist/__tests__/integration/agent-workflow.test.d.ts +2 -0
- package/dist/__tests__/integration/agent-workflow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/agent-workflow.test.js +256 -0
- package/dist/__tests__/integration/agent-workflow.test.js.map +1 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts +14 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.js +668 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.js.map +1 -0
- package/dist/__tests__/integration/observer-logging.test.d.ts +2 -0
- package/dist/__tests__/integration/observer-logging.test.d.ts.map +1 -0
- package/dist/__tests__/integration/observer-logging.test.js +517 -0
- package/dist/__tests__/integration/observer-logging.test.js.map +1 -0
- package/dist/__tests__/integration/tree-mirroring.test.d.ts +2 -0
- package/dist/__tests__/integration/tree-mirroring.test.d.ts.map +1 -0
- package/dist/__tests__/integration/tree-mirroring.test.js +117 -0
- package/dist/__tests__/integration/tree-mirroring.test.js.map +1 -0
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts +12 -0
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts.map +1 -0
- package/dist/__tests__/integration/workflow-reparenting.test.js +239 -0
- package/dist/__tests__/integration/workflow-reparenting.test.js.map +1 -0
- package/dist/__tests__/unit/agent.test.d.ts +2 -0
- package/dist/__tests__/unit/agent.test.d.ts.map +1 -0
- package/dist/__tests__/unit/agent.test.js +143 -0
- package/dist/__tests__/unit/agent.test.js.map +1 -0
- package/dist/__tests__/unit/cache-key.test.d.ts +5 -0
- package/dist/__tests__/unit/cache-key.test.d.ts.map +1 -0
- package/dist/__tests__/unit/cache-key.test.js +145 -0
- package/dist/__tests__/unit/cache-key.test.js.map +1 -0
- package/dist/__tests__/unit/cache.test.d.ts +5 -0
- package/dist/__tests__/unit/cache.test.d.ts.map +1 -0
- package/dist/__tests__/unit/cache.test.js +132 -0
- package/dist/__tests__/unit/cache.test.js.map +1 -0
- package/dist/__tests__/unit/context.test.d.ts +2 -0
- package/dist/__tests__/unit/context.test.d.ts.map +1 -0
- package/dist/__tests__/unit/context.test.js +220 -0
- package/dist/__tests__/unit/context.test.js.map +1 -0
- package/dist/__tests__/unit/decorators.test.d.ts +2 -0
- package/dist/__tests__/unit/decorators.test.d.ts.map +1 -0
- package/dist/__tests__/unit/decorators.test.js +162 -0
- package/dist/__tests__/unit/decorators.test.js.map +1 -0
- package/dist/__tests__/unit/introspection-tools.test.d.ts +5 -0
- package/dist/__tests__/unit/introspection-tools.test.d.ts.map +1 -0
- package/dist/__tests__/unit/introspection-tools.test.js +191 -0
- package/dist/__tests__/unit/introspection-tools.test.js.map +1 -0
- package/dist/__tests__/unit/logger.test.d.ts +2 -0
- package/dist/__tests__/unit/logger.test.d.ts.map +1 -0
- package/dist/__tests__/unit/logger.test.js +241 -0
- package/dist/__tests__/unit/logger.test.js.map +1 -0
- package/dist/__tests__/unit/observable.test.d.ts +2 -0
- package/dist/__tests__/unit/observable.test.d.ts.map +1 -0
- package/dist/__tests__/unit/observable.test.js +251 -0
- package/dist/__tests__/unit/observable.test.js.map +1 -0
- package/dist/__tests__/unit/prompt.test.d.ts +2 -0
- package/dist/__tests__/unit/prompt.test.d.ts.map +1 -0
- package/dist/__tests__/unit/prompt.test.js +113 -0
- package/dist/__tests__/unit/prompt.test.js.map +1 -0
- package/dist/__tests__/unit/reflection.test.d.ts +5 -0
- package/dist/__tests__/unit/reflection.test.d.ts.map +1 -0
- package/dist/__tests__/unit/reflection.test.js +160 -0
- package/dist/__tests__/unit/reflection.test.js.map +1 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts +2 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.js +136 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.js.map +1 -0
- package/dist/__tests__/unit/tree-debugger.test.d.ts +2 -0
- package/dist/__tests__/unit/tree-debugger.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tree-debugger.test.js +69 -0
- package/dist/__tests__/unit/tree-debugger.test.js.map +1 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts +2 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts.map +1 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js +154 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-detachChild.test.js +76 -0
- package/dist/__tests__/unit/workflow-detachChild.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js +122 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js +140 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js.map +1 -0
- package/dist/__tests__/unit/workflow.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow.test.js +330 -0
- package/dist/__tests__/unit/workflow.test.js.map +1 -0
- package/dist/cache/cache-key.d.ts +66 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +195 -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 +112 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +426 -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 +69 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +143 -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 +57 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +263 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +241 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +464 -0
- package/dist/core/workflow.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 +71 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +198 -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 +110 -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/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -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 +329 -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 +66 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +31 -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 +87 -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/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -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/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/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/workflow-context.d.ts +139 -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/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/{src/utils/index.ts → dist/utils/index.d.ts} +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.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/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 +5 -2
- 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/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/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/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,792 +0,0 @@
|
|
|
1
|
-
# Product Requirement Prompt (PRP): Implement Public `isDescendantOf` API
|
|
2
|
-
|
|
3
|
-
**Work Item**: P1.M3.T4.S2 - Implement public `isDescendantOf` if approved
|
|
4
|
-
**PRD Reference**: Issue 9 - Steps Not in Tree Structure (Bug Report Note)
|
|
5
|
-
**Implementation Target**: `src/core/workflow.ts:162`
|
|
6
|
-
**S1 Decision**: **APPROVED** - Make public with confidence 9/10
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Goal
|
|
11
|
-
|
|
12
|
-
**Feature Goal**: Change the `isDescendantOf()` method visibility from `private` to `public`, add comprehensive JSDoc documentation with security warning, and ensure the method has appropriate parameter validation.
|
|
13
|
-
|
|
14
|
-
**Deliverable**:
|
|
15
|
-
1. `isDescendantOf()` method changed from `private` to `public` in `src/core/workflow.ts:162`
|
|
16
|
-
2. Comprehensive JSDoc documentation with `@warning` tag for security implications
|
|
17
|
-
3. Optional: Parameter validation for the `ancestor` parameter
|
|
18
|
-
4. Update to security documentation guide
|
|
19
|
-
5. Tests pass (no changes to test logic needed)
|
|
20
|
-
|
|
21
|
-
**Success Definition**:
|
|
22
|
-
- Method is publicly accessible without casting to `any`
|
|
23
|
-
- JSDoc includes `@warning` about topology information disclosure
|
|
24
|
-
- All existing tests pass without modification
|
|
25
|
-
- New tests (if added) verify public accessibility and parameter validation
|
|
26
|
-
|
|
27
|
-
## User Persona
|
|
28
|
-
|
|
29
|
-
**Target User**: Developer using the Groundswell workflow engine who needs to check workflow hierarchy relationships programmatically.
|
|
30
|
-
|
|
31
|
-
**Use Case**: A developer building a workflow-based application needs to validate that a workflow belongs to a specific tree branch before executing an operation.
|
|
32
|
-
|
|
33
|
-
**User Journey**:
|
|
34
|
-
1. User has references to two workflow instances
|
|
35
|
-
2. User calls `childWorkflow.isDescendantOf(rootWorkflow)`
|
|
36
|
-
3. Method returns `true` if child is in root's hierarchy, `false` otherwise
|
|
37
|
-
4. User proceeds with conditional logic based on result
|
|
38
|
-
|
|
39
|
-
**Pain Points Addressed**:
|
|
40
|
-
- Users currently must manually traverse `parent` chain (error-prone, forget cycle detection)
|
|
41
|
-
- Current workaround requires casting to `any` to access private method
|
|
42
|
-
- Inconsistent with other public hierarchy properties (`parent`, `children`)
|
|
43
|
-
|
|
44
|
-
## Why
|
|
45
|
-
|
|
46
|
-
- **API Ergonomics**: `isDescendantOf()` provides cleaner interface than manual tree traversal
|
|
47
|
-
- **User Needs**: Introspection tools and examples show users want hierarchy navigation
|
|
48
|
-
- **No Security Risk**: Does NOT expose new information beyond existing `parent`/`children` properties
|
|
49
|
-
- **Low Implementation Cost**: Change one keyword, add documentation; already battle-tested (25+ tests)
|
|
50
|
-
- **Competitive Differentiator**: No major workflow engine exposes this API publicly
|
|
51
|
-
- **S1 Approval**: Comprehensive research and recommendation supports this change
|
|
52
|
-
|
|
53
|
-
## What
|
|
54
|
-
|
|
55
|
-
### Success Criteria
|
|
56
|
-
|
|
57
|
-
- [ ] `isDescendantOf()` method changed from `private` to `public` at `src/core/workflow.ts:162`
|
|
58
|
-
- [ ] Comprehensive JSDoc documentation added with security `@warning`
|
|
59
|
-
- [ ] All existing tests pass (25+ tests already cover this method indirectly)
|
|
60
|
-
- [ ] No breaking changes to existing functionality
|
|
61
|
-
- [ ] Security documentation updated with `isDescendantOf()` section
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## All Needed Context
|
|
66
|
-
|
|
67
|
-
### Context Completeness Check
|
|
68
|
-
|
|
69
|
-
_This PRP passes the "No Prior Knowledge" test - someone unfamiliar with the codebase would have everything needed to implement this successfully._
|
|
70
|
-
|
|
71
|
-
### Documentation & References
|
|
72
|
-
|
|
73
|
-
```yaml
|
|
74
|
-
# MUST READ - S1 Research Decision (APPROVED)
|
|
75
|
-
- file: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md
|
|
76
|
-
why: Final recommendation to make isDescendantOf public with confidence 9/10
|
|
77
|
-
section: Lines 1-50 (Executive Summary and Decision Matrix)
|
|
78
|
-
critical: Decision is APPROVED with safeguards (JSDoc warning, security docs)
|
|
79
|
-
gotcha: This is a BREAKING API change per Semantic Versioning (requires major version bump)
|
|
80
|
-
|
|
81
|
-
# MUST READ - Current Implementation
|
|
82
|
-
- file: src/core/workflow.ts
|
|
83
|
-
why: The isDescendantOf() implementation at lines 162-180, currently private
|
|
84
|
-
pattern: Private method using iterative traversal with visited Set for cycle detection
|
|
85
|
-
gotcha: No parameter validation currently - relies on TypeScript type system
|
|
86
|
-
|
|
87
|
-
# MUST READ - JSDoc Documentation Patterns
|
|
88
|
-
- file: src/core/workflow.ts
|
|
89
|
-
why: Examples of comprehensive JSDoc patterns for public methods
|
|
90
|
-
pattern: attachChild (lines 224-276), detachChild (lines 318-369)
|
|
91
|
-
gotcha: Codebase uses @throws, @example, detailed descriptions with sections
|
|
92
|
-
critical: No existing @warning tags - this will be first security-warning JSDoc
|
|
93
|
-
|
|
94
|
-
# MUST READ - Security Implications Analysis
|
|
95
|
-
- file: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md
|
|
96
|
-
why: Security assessment showing NO new information exposed
|
|
97
|
-
section: Lines 58-68 (Comparison with Existing Public APIs)
|
|
98
|
-
critical: parent and children already public - isDescendantOf is convenience only
|
|
99
|
-
gotcha: Applications must implement their own access control if exposing workflows via API
|
|
100
|
-
|
|
101
|
-
# MUST READ - Security Guide (to update)
|
|
102
|
-
- file: plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md
|
|
103
|
-
why: Security patterns for introspection and hierarchy exposure
|
|
104
|
-
section: Lines 1-100 (Threat Model and Introspection Attack Vectors)
|
|
105
|
-
critical: Add isDescendantOf() section documenting hierarchy information disclosure
|
|
106
|
-
gotcha: Groundswell has NO built-in authentication/authorization - security is app's responsibility
|
|
107
|
-
|
|
108
|
-
# MUST READ - Parameter Validation Patterns
|
|
109
|
-
- file: src/core/workflow.ts
|
|
110
|
-
why: Patterns for validating parameters in public methods
|
|
111
|
-
pattern: attachChild (lines 277-299) - Array.includes(), reference equality checks
|
|
112
|
-
gotcha: Most validation is implicit via TypeScript types; explicit checks for edge cases
|
|
113
|
-
critical: No instanceof checks - codebase trusts TypeScript types
|
|
114
|
-
|
|
115
|
-
# MUST READ - Testing Patterns
|
|
116
|
-
- file: src/__tests__/adversarial/circular-reference.test.ts
|
|
117
|
-
why: Tests for isDescendantOf behavior (currently cast to 'any' for access)
|
|
118
|
-
pattern: Uses (workflow as any).isDescendantOf() to test private method
|
|
119
|
-
gotcha: After making public, tests can call method directly without casting
|
|
120
|
-
critical: 25+ test cases already cover this method via attachChild circular reference detection
|
|
121
|
-
|
|
122
|
-
# MUST READ - Industry Comparison
|
|
123
|
-
- file: plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md
|
|
124
|
-
why: Groundswell would be UNIQUE in exposing public isDescendantOf API
|
|
125
|
-
section: Lines 450-470 (API Exposure Matrix)
|
|
126
|
-
critical: NO major workflow engine (Airflow, Temporal, Prefect) exposes this publicly
|
|
127
|
-
gotcha: Not an anti-pattern, just different from industry
|
|
128
|
-
|
|
129
|
-
# MUST READ - External JSDoc Best Practices
|
|
130
|
-
- url: https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html
|
|
131
|
-
why: TypeScript's official JSDoc reference
|
|
132
|
-
section: @throws, @example, @warning tags
|
|
133
|
-
|
|
134
|
-
# MUST READ - Semantic Versioning Implications
|
|
135
|
-
- url: https://semver.org/
|
|
136
|
-
why: Making private method public is a MAJOR breaking change
|
|
137
|
-
critical: Requires version bump from X.Y.Z to (X+1).0.0
|
|
138
|
-
gotcha: Even though implementation doesn't change, API surface area increases
|
|
139
|
-
|
|
140
|
-
# REFERENCE - Current Usage Site
|
|
141
|
-
- file: src/core/workflow.ts
|
|
142
|
-
why: Single call site at line 293 in attachChild() method
|
|
143
|
-
pattern: if (this.isDescendantOf(child)) - circular reference detection
|
|
144
|
-
gotcha: This internal usage continues unchanged after visibility change
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### Current Codebase Tree (relevant to isDescendantOf)
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
src/
|
|
151
|
-
├── core/
|
|
152
|
-
│ └── workflow.ts # isDescendantOf at line 162 (private → public)
|
|
153
|
-
│ # attachChild usage at line 293
|
|
154
|
-
│ # public parent/children properties at 49-52
|
|
155
|
-
├── types/
|
|
156
|
-
│ └── workflow.ts # WorkflowNode interface with parent/children
|
|
157
|
-
├── tools/
|
|
158
|
-
│ └── introspection.ts # Public introspection tools (read_ancestor_chain, etc.)
|
|
159
|
-
└── __tests__/
|
|
160
|
-
├── adversarial/
|
|
161
|
-
│ ├── circular-reference.test.ts # Tests for isDescendantOf behavior
|
|
162
|
-
│ ├── complex-circular-reference.test.ts
|
|
163
|
-
│ ├── deep-hierarchy-stress.test.ts
|
|
164
|
-
│ └── attachChild-performance.test.ts
|
|
165
|
-
└── unit/
|
|
166
|
-
└── workflow-detachChild.test.ts # Example of public method test patterns
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### Desired Codebase Tree with files to be added and responsibility of file
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
# NO new files needed - only modifications to existing files
|
|
173
|
-
|
|
174
|
-
# CHANGES:
|
|
175
|
-
src/core/workflow.ts # CHANGE: private → public, add JSDoc
|
|
176
|
-
plan/.../introspection-security-guide.md # CHANGE: Add isDescendantOf section
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### Known Gotchas of Our Codebase
|
|
180
|
-
|
|
181
|
-
```typescript
|
|
182
|
-
// CRITICAL: isDescendantOf is private - changing to public is a BREAKING API change
|
|
183
|
-
// Per Semantic Versioning, this requires a MAJOR version bump (X.0.0 → (X+1).0.0)
|
|
184
|
-
|
|
185
|
-
// CRITICAL: Groundswell has NO built-in authentication or authorization
|
|
186
|
-
// Security is entirely the application's responsibility
|
|
187
|
-
|
|
188
|
-
// CRITICAL: parent and children properties are already PUBLIC
|
|
189
|
-
// isDescendantOf does NOT expose any new information
|
|
190
|
-
|
|
191
|
-
// CRITICAL: No instanceof checks for parameter validation in codebase
|
|
192
|
-
// Codebase relies on TypeScript type system for type safety
|
|
193
|
-
|
|
194
|
-
// CRITICAL: isDescendantOf uses iterative while loop (not recursive)
|
|
195
|
-
// This is intentional for stack safety at extreme depths (1000+ levels)
|
|
196
|
-
|
|
197
|
-
// CRITICAL: Cycle detection uses visited Set pattern
|
|
198
|
-
// Same pattern as getRoot() and getRootObservers()
|
|
199
|
-
|
|
200
|
-
// CRITICAL: @warning JSDoc tag does NOT exist in codebase yet
|
|
201
|
-
// This will be the first usage of @warning for security documentation
|
|
202
|
-
|
|
203
|
-
// CRITICAL: Tests currently use (workflow as any).isDescendantOf()
|
|
204
|
-
// After making public, can call directly - but existing tests still work
|
|
205
|
-
|
|
206
|
-
// CRITICAL: Method returns boolean, NOT throws for non-descendant
|
|
207
|
-
// Only throws Error if circular reference detected during traversal
|
|
208
|
-
|
|
209
|
-
// CRITICAL: JSDoc pattern uses markdown with bold headers
|
|
210
|
-
// See attachChild() for example: **Structural Changes:**, **Invariants Maintained:**
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
## Implementation Blueprint
|
|
216
|
-
|
|
217
|
-
### Data Models and Structure
|
|
218
|
-
|
|
219
|
-
No new data models needed. The `Workflow` class already exists with all necessary structure.
|
|
220
|
-
|
|
221
|
-
### Implementation Tasks (ordered by dependencies)
|
|
222
|
-
|
|
223
|
-
```yaml
|
|
224
|
-
Task 1: MODIFY src/core/workflow.ts - Change Visibility
|
|
225
|
-
- CHANGE: Line 162 from `private isDescendantOf` to `public isDescendantOf`
|
|
226
|
-
- LOCATION: src/core/workflow.ts:162
|
|
227
|
-
- PRESERVE: All existing implementation logic (lines 163-180)
|
|
228
|
-
- NAMING: Keep method name exactly as is (no rename)
|
|
229
|
-
|
|
230
|
-
Task 2: ADD JSDoc Documentation
|
|
231
|
-
- ADD: Comprehensive JSDoc comment BEFORE line 162
|
|
232
|
-
- FOLLOW: Pattern from attachChild() method (lines 224-276)
|
|
233
|
-
- INCLUDE:
|
|
234
|
-
- One-line summary
|
|
235
|
-
- Detailed description paragraph
|
|
236
|
-
- @warning tag about topology information disclosure
|
|
237
|
-
- @param tag for ancestor parameter
|
|
238
|
-
- @returns tag describing boolean return
|
|
239
|
-
- @throws {Error} tag for cycle detection
|
|
240
|
-
- @example tags showing usage patterns
|
|
241
|
-
- PLACEMENT: Lines 152-161 (replace existing private JSDoc)
|
|
242
|
-
|
|
243
|
-
Task 3: CONSIDER Adding Parameter Validation (OPTIONAL)
|
|
244
|
-
- DECISION POINT: Add instanceof check or rely on TypeScript types?
|
|
245
|
-
- IF ADDING: Insert at line 163 (first line of method body)
|
|
246
|
-
- PATTERN: Follow attachChild() validation style
|
|
247
|
-
- EXAMPLE:
|
|
248
|
-
```typescript
|
|
249
|
-
if (!(ancestor instanceof Workflow)) {
|
|
250
|
-
throw new TypeError(`Expected Workflow instance, got ${typeof ancestor}`);
|
|
251
|
-
}
|
|
252
|
-
```
|
|
253
|
-
- NOTE: Codebase typically relies on TypeScript types - this is optional
|
|
254
|
-
|
|
255
|
-
Task 4: MODIFY Security Documentation
|
|
256
|
-
- ADD: New section to plan/.../introspection-security-guide.md
|
|
257
|
-
- LOCATION: After "Threat Model" section, before "Implementation Checklist"
|
|
258
|
-
- TITLE: "### Threat 5: Topology Exposure via isDescendantOf()"
|
|
259
|
-
- INCLUDE: What information is exposed, why risk is LOW, mitigation recommendations
|
|
260
|
-
- PATTERN: Follow existing threat section structure (Threat 1-4)
|
|
261
|
-
|
|
262
|
-
Task 5: VERIFY Tests Pass
|
|
263
|
-
- RUN: Full test suite to ensure no regressions
|
|
264
|
-
- VERIFY: All 25+ existing tests still pass
|
|
265
|
-
- CHECK: circular-reference.test.ts, complex-circular-reference.test.ts, deep-hierarchy-stress.test.ts
|
|
266
|
-
- EXPECTED: All tests pass without modification (private → public is backward compatible)
|
|
267
|
-
|
|
268
|
-
Task 6: CONSIDER Adding Public API Tests (OPTIONAL)
|
|
269
|
-
- CREATE: src/__tests__/unit/workflow-isDescendantOf.test.ts (if desired)
|
|
270
|
-
- IMPLEMENT: Tests that call isDescendantOf() directly without (as any) cast
|
|
271
|
-
- FOLLOW: Pattern from workflow-detachChild.test.ts
|
|
272
|
-
- COVERAGE: Happy path, edge cases (self, null, unrelated workflows)
|
|
273
|
-
- NOTE: Existing tests already cover behavior - new tests would verify public accessibility only
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### Implementation Patterns & Key Details
|
|
277
|
-
|
|
278
|
-
```typescript
|
|
279
|
-
// CRITICAL: JSDoc Pattern for Security-Sensitive Public API
|
|
280
|
-
/**
|
|
281
|
-
* Check if this workflow is a descendant of the given ancestor workflow.
|
|
282
|
-
*
|
|
283
|
-
* Traverses the parent chain upward looking for the ancestor reference.
|
|
284
|
-
* Uses a visited Set to detect cycles during traversal. This method provides
|
|
285
|
-
* a convenient way to check workflow hierarchy relationships without manually
|
|
286
|
-
* traversing the parent chain.
|
|
287
|
-
*
|
|
288
|
-
* @warning This method reveals workflow hierarchy information. If your
|
|
289
|
-
* application exposes workflows via an API, ensure you implement proper
|
|
290
|
-
* access control to prevent unauthorized topology discovery. Note that
|
|
291
|
-
* the `parent` and `children` properties are already public, so this
|
|
292
|
-
* method does not expose any new information beyond what is currently
|
|
293
|
-
* accessible.
|
|
294
|
-
*
|
|
295
|
-
* **Time Complexity**: O(d) where d is the depth of the hierarchy
|
|
296
|
-
* **Space Complexity**: O(d) for the visited Set in worst case (cycle detection)
|
|
297
|
-
*
|
|
298
|
-
* @example Check if a workflow belongs to a specific hierarchy
|
|
299
|
-
* ```typescript
|
|
300
|
-
* const root = new Workflow('root');
|
|
301
|
-
* const child = new Workflow('child', { parent: root });
|
|
302
|
-
*
|
|
303
|
-
* if (child.isDescendantOf(root)) {
|
|
304
|
-
* console.log('Child is in root hierarchy');
|
|
305
|
-
* }
|
|
306
|
-
* ```
|
|
307
|
-
*
|
|
308
|
-
* @example Validate before attaching to prevent circular references
|
|
309
|
-
* ```typescript
|
|
310
|
-
* if (!newChild.isDescendantOf(parent)) {
|
|
311
|
-
* parent.attachChild(newChild);
|
|
312
|
-
* } else {
|
|
313
|
-
* throw new Error('Would create circular reference');
|
|
314
|
-
* }
|
|
315
|
-
* ```
|
|
316
|
-
*
|
|
317
|
-
* @example Check for ancestor relationship in conditional logic
|
|
318
|
-
* ```typescript
|
|
319
|
-
* const isInProductionBranch = workflow.isDescendantOf(productionRoot);
|
|
320
|
-
* if (isInProductionBranch) {
|
|
321
|
-
* // Apply production-specific logic
|
|
322
|
-
* }
|
|
323
|
-
* ```
|
|
324
|
-
*
|
|
325
|
-
* @param ancestor - The potential ancestor workflow to check
|
|
326
|
-
* @returns true if ancestor is found in parent chain, false otherwise
|
|
327
|
-
* @throws {Error} If a cycle is detected during traversal (indicates corrupted tree structure)
|
|
328
|
-
*/
|
|
329
|
-
public isDescendantOf(ancestor: Workflow): boolean {
|
|
330
|
-
// Implementation unchanged (lines 163-180)
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// CRITICAL: Security Documentation Pattern
|
|
334
|
-
// Add to introspection-security-guide.md after Threat 4:
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
### Threat 5: Topology Exposure via isDescendantOf
|
|
338
|
-
|
|
339
|
-
**Attack Scenario:**
|
|
340
|
-
```
|
|
341
|
-
Attacker → Calls workflow.isDescendantOf(suspectWorkflow)
|
|
342
|
-
→ Learns hierarchy relationship between workflows
|
|
343
|
-
→ Maps workflow tree structure
|
|
344
|
-
→ Extracts business intelligence from topology
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
**Risk Level:** LOW (same as current exposure)
|
|
348
|
-
|
|
349
|
-
**Rationale:**
|
|
350
|
-
- `parent` and `children` properties are already public
|
|
351
|
-
- `getNode()` exposes full tree structure
|
|
352
|
-
- `isDescendantOf()` only provides convenience, not new information
|
|
353
|
-
- Attacker can already traverse tree manually
|
|
354
|
-
|
|
355
|
-
**Affected Method:** `Workflow.isDescendantOf()` (newly public)
|
|
356
|
-
|
|
357
|
-
**Mitigation:**
|
|
358
|
-
1. **Application-Level Access Control** - If exposing workflows via API:
|
|
359
|
-
```typescript
|
|
360
|
-
// Validate user has permission to access workflow
|
|
361
|
-
if (!user.canAccessWorkflow(workflowId)) {
|
|
362
|
-
throw new Error('Unauthorized');
|
|
363
|
-
}
|
|
364
|
-
// Only then allow isDescendantOf calls
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
2. **Filter Hierarchy Information** - For unauthenticated users:
|
|
368
|
-
```typescript
|
|
369
|
-
// Return filtered view without hierarchy
|
|
370
|
-
const filteredWorkflow = {
|
|
371
|
-
id: workflow.id,
|
|
372
|
-
name: workflow.name,
|
|
373
|
-
// Omit parent, children, isDescendantOf
|
|
374
|
-
};
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
3. **Audit Topology Access** - Log calls to isDescendantOf:
|
|
378
|
-
```typescript
|
|
379
|
-
auditLog.log({
|
|
380
|
-
timestamp: Date.now(),
|
|
381
|
-
userId: user.id,
|
|
382
|
-
action: 'isDescendantOf',
|
|
383
|
-
workflowId: workflow.id,
|
|
384
|
-
ancestorId: ancestor.id
|
|
385
|
-
});
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
**Recommendation:** Document that applications should implement access control
|
|
389
|
-
if exposing workflows via APIs. The library itself provides no built-in security.
|
|
390
|
-
*/
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
### Integration Points
|
|
394
|
-
|
|
395
|
-
```yaml
|
|
396
|
-
CODE CHANGES:
|
|
397
|
-
- file: src/core/workflow.ts
|
|
398
|
-
line: 152-161 (JSDoc section)
|
|
399
|
-
change: Replace existing private JSDoc with comprehensive public JSDoc
|
|
400
|
-
- file: src/core/workflow.ts
|
|
401
|
-
line: 162
|
|
402
|
-
change: `private isDescendantOf` → `public isDescendantOf`
|
|
403
|
-
|
|
404
|
-
DOCUMENTATION CHANGES:
|
|
405
|
-
- file: plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md
|
|
406
|
-
add: New Threat 5 section for isDescendantOf topology exposure
|
|
407
|
-
location: After Threat 4 (Denial of Service), before Implementation Checklist
|
|
408
|
-
|
|
409
|
-
NO BREAKING CHANGES:
|
|
410
|
-
- All existing code using isDescendantOf internally continues unchanged
|
|
411
|
-
- attachChild() usage at line 293 unaffected
|
|
412
|
-
- All existing tests pass without modification
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
---
|
|
416
|
-
|
|
417
|
-
## Validation Loop
|
|
418
|
-
|
|
419
|
-
### Level 1: Syntax & Style (Immediate Feedback)
|
|
420
|
-
|
|
421
|
-
```bash
|
|
422
|
-
# Run after making changes to workflow.ts
|
|
423
|
-
# From project root
|
|
424
|
-
|
|
425
|
-
# Check TypeScript compilation
|
|
426
|
-
npm run build
|
|
427
|
-
# Expected: No compilation errors
|
|
428
|
-
|
|
429
|
-
# Type checking
|
|
430
|
-
npx tsc --noEmit
|
|
431
|
-
# Expected: No type errors
|
|
432
|
-
|
|
433
|
-
# If using ESLint/prettier (check package.json for scripts)
|
|
434
|
-
npm run lint
|
|
435
|
-
# Expected: No linting errors
|
|
436
|
-
|
|
437
|
-
# Expected: Zero errors. If errors exist, READ output and fix before proceeding.
|
|
438
|
-
```
|
|
439
|
-
|
|
440
|
-
### Level 2: Unit Tests (Component Validation)
|
|
441
|
-
|
|
442
|
-
```bash
|
|
443
|
-
# Test specific functionality
|
|
444
|
-
npm test -- circular-reference
|
|
445
|
-
npm test -- complex-circular-reference
|
|
446
|
-
npm test -- deep-hierarchy-stress
|
|
447
|
-
npm test -- attachChild-performance
|
|
448
|
-
|
|
449
|
-
# Full test suite
|
|
450
|
-
npm test
|
|
451
|
-
|
|
452
|
-
# Expected: All tests pass. isDescendantOf is already tested indirectly via attachChild tests.
|
|
453
|
-
# No test modifications should be needed.
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
### Level 3: Integration Testing (System Validation)
|
|
457
|
-
|
|
458
|
-
```bash
|
|
459
|
-
# Verify public accessibility without casting
|
|
460
|
-
# Create a simple test file:
|
|
461
|
-
cat > test-public-api.test.ts << 'EOF'
|
|
462
|
-
import { describe, it, expect } from 'vitest';
|
|
463
|
-
import { Workflow } from '../src/core/workflow.js';
|
|
464
|
-
|
|
465
|
-
describe('Workflow.isDescendantOf() - Public API', () => {
|
|
466
|
-
it('should be publicly accessible without casting', () => {
|
|
467
|
-
const root = new Workflow('root');
|
|
468
|
-
const child = new Workflow('child', { parent: root });
|
|
469
|
-
|
|
470
|
-
// This should work without (as any) cast
|
|
471
|
-
const result = child.isDescendantOf(root);
|
|
472
|
-
|
|
473
|
-
expect(result).toBe(true);
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
it('should return false for unrelated workflows', () => {
|
|
477
|
-
const tree1 = new Workflow('tree1');
|
|
478
|
-
const tree2 = new Workflow('tree2');
|
|
479
|
-
|
|
480
|
-
const result = tree1.isDescendantOf(tree2);
|
|
481
|
-
|
|
482
|
-
expect(result).toBe(false);
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
it('should return false when checking root against descendant', () => {
|
|
486
|
-
const root = new Workflow('root');
|
|
487
|
-
const child = new Workflow('child', { parent: root });
|
|
488
|
-
|
|
489
|
-
const result = root.isDescendantOf(child);
|
|
490
|
-
|
|
491
|
-
expect(result).toBe(false);
|
|
492
|
-
});
|
|
493
|
-
});
|
|
494
|
-
EOF
|
|
495
|
-
|
|
496
|
-
# Run the test
|
|
497
|
-
npm test test-public-api.test.ts
|
|
498
|
-
|
|
499
|
-
# Expected: All new tests pass, proving public API accessibility
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
### Level 4: Creative & Domain-Specific Validation
|
|
503
|
-
|
|
504
|
-
```bash
|
|
505
|
-
# Manual validation of JSDoc visibility
|
|
506
|
-
|
|
507
|
-
# 1. Generate TypeScript declaration files
|
|
508
|
-
npx tsc --declaration --emitDeclarationOnly
|
|
509
|
-
|
|
510
|
-
# 2. Check the generated .d.ts file
|
|
511
|
-
cat src/core/workflow.d.ts | grep -A 10 "isDescendantOf"
|
|
512
|
-
|
|
513
|
-
# Expected output should show:
|
|
514
|
-
# isDescendantOf(ancestor: Workflow): boolean;
|
|
515
|
-
# (without private keyword)
|
|
516
|
-
|
|
517
|
-
# 3. Verify IDE documentation
|
|
518
|
-
# Open src/core/workflow.ts in VS Code
|
|
519
|
-
# Hover over a workflow instance and verify isDescendantOf appears in autocomplete
|
|
520
|
-
# Call the method and verify JSDoc tooltip shows documentation
|
|
521
|
-
|
|
522
|
-
# 4. Security documentation validation
|
|
523
|
-
cat plan/.../introspection-security-guide.md | grep -A 20 "Threat 5"
|
|
524
|
-
|
|
525
|
-
# Expected: New Threat 5 section present with isDescendantOf documentation
|
|
526
|
-
|
|
527
|
-
# 5. Verify no information disclosure beyond existing APIs
|
|
528
|
-
# (This is conceptual - no automated test)
|
|
529
|
-
# Review that isDescendantOf only returns boolean (true/false)
|
|
530
|
-
# Compare with existing public APIs:
|
|
531
|
-
# - workflow.parent: Returns full Workflow reference
|
|
532
|
-
# - workflow.children: Returns array of Workflow references
|
|
533
|
-
# - workflow.getNode(): Returns WorkflowNode with full tree, logs, events, state
|
|
534
|
-
#
|
|
535
|
-
# Conclusion: isDescendantOf exposes LESS information than existing APIs
|
|
536
|
-
```
|
|
537
|
-
|
|
538
|
-
---
|
|
539
|
-
|
|
540
|
-
## Final Validation Checklist
|
|
541
|
-
|
|
542
|
-
### Technical Validation
|
|
543
|
-
|
|
544
|
-
- [ ] `isDescendantOf()` changed from `private` to `public` at line 162
|
|
545
|
-
- [ ] JSDoc documentation added with `@warning` tag
|
|
546
|
-
- [ ] JSDoc includes `@param`, `@returns`, `@throws`, `@example` tags
|
|
547
|
-
- [ ] TypeScript compilation succeeds: `npm run build`
|
|
548
|
-
- [ ] All tests pass: `npm test`
|
|
549
|
-
- [ ] No breaking changes to existing functionality
|
|
550
|
-
- [ ] Security documentation updated with isDescendantOf section
|
|
551
|
-
|
|
552
|
-
### Feature Validation
|
|
553
|
-
|
|
554
|
-
- [ ] Method is publicly callable without `(as any)` cast
|
|
555
|
-
- [ ] JSDoc `@warning` explains topology information disclosure
|
|
556
|
-
- [ ] JSDoc references that `parent`/`children` are already public
|
|
557
|
-
- [ ] Examples show practical usage patterns
|
|
558
|
-
- [ ] Error handling documented (`@throws` for cycle detection)
|
|
559
|
-
- [ ] Time/space complexity documented (O(d))
|
|
560
|
-
|
|
561
|
-
### Code Quality Validation
|
|
562
|
-
|
|
563
|
-
- [ ] Follows existing JSDoc patterns from `attachChild()` method
|
|
564
|
-
- [ ] Uses markdown formatting consistent with codebase
|
|
565
|
-
- [ ] Implementation logic unchanged (minizes risk)
|
|
566
|
-
- [ ] No new dependencies added
|
|
567
|
-
- [ ] No performance impact (method already tested and optimized)
|
|
568
|
-
|
|
569
|
-
### Documentation & Deployment
|
|
570
|
-
|
|
571
|
-
- [ ] Security guide updated (`introspection-security-guide.md`)
|
|
572
|
-
- [ ] Threat 5 section added with mitigation patterns
|
|
573
|
-
- [ ] References to existing public APIs (`parent`, `children`)
|
|
574
|
-
- [ ] Application-level security responsibility documented
|
|
575
|
-
- [ ] Semantic versioning impact noted (MAJOR version bump required)
|
|
576
|
-
|
|
577
|
-
---
|
|
578
|
-
|
|
579
|
-
## Anti-Patterns to Avoid
|
|
580
|
-
|
|
581
|
-
- **Don't** change the implementation logic - only visibility and documentation
|
|
582
|
-
- **Don't** add unnecessary parameter validation if codebase doesn't use it elsewhere
|
|
583
|
-
- **Don't** forget to document that `parent`/`children` are already public
|
|
584
|
-
- **Don't** use recursive implementation (current iterative is stack-safe)
|
|
585
|
-
- **Don't** skip the `@warning` tag - this is security-sensitive API
|
|
586
|
-
- **Don't** modify existing tests - they should pass without changes
|
|
587
|
-
- **Don't** forget Semantic Versioning implications (MAJOR bump required)
|
|
588
|
-
- **Don't** make the method async - it's synchronous and should stay that way
|
|
589
|
-
- **Don't** add depth limit parameter - S1 research didn't recommend it
|
|
590
|
-
- **Don't** rename the method - keep `isDescendantOf` for consistency
|
|
591
|
-
|
|
592
|
-
---
|
|
593
|
-
|
|
594
|
-
## Appendix: Implementation Reference
|
|
595
|
-
|
|
596
|
-
### Current Implementation (Before Change)
|
|
597
|
-
|
|
598
|
-
```typescript
|
|
599
|
-
// File: src/core/workflow.ts, lines 152-180
|
|
600
|
-
|
|
601
|
-
/**
|
|
602
|
-
* Check if this workflow is a descendant of the given ancestor workflow
|
|
603
|
-
* Traverses the parent chain upward looking for the ancestor reference
|
|
604
|
-
* Uses visited Set to detect cycles during traversal
|
|
605
|
-
*
|
|
606
|
-
* @private
|
|
607
|
-
* @param ancestor - The potential ancestor workflow to check
|
|
608
|
-
* @returns true if ancestor is found in parent chain, false otherwise
|
|
609
|
-
* @throws {Error} If a cycle is detected during traversal
|
|
610
|
-
*/
|
|
611
|
-
private isDescendantOf(ancestor: Workflow): boolean {
|
|
612
|
-
const visited = new Set<Workflow>();
|
|
613
|
-
let current: Workflow | null = this.parent;
|
|
614
|
-
|
|
615
|
-
while (current !== null) {
|
|
616
|
-
if (visited.has(current)) {
|
|
617
|
-
throw new Error('Circular parent-child relationship detected');
|
|
618
|
-
}
|
|
619
|
-
visited.add(current);
|
|
620
|
-
|
|
621
|
-
if (current === ancestor) {
|
|
622
|
-
return true;
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
current = current.parent;
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
return false;
|
|
629
|
-
}
|
|
630
|
-
```
|
|
631
|
-
|
|
632
|
-
### Proposed Implementation (After Change)
|
|
633
|
-
|
|
634
|
-
```typescript
|
|
635
|
-
// File: src/core/workflow.ts, lines 152-190 (proposed)
|
|
636
|
-
|
|
637
|
-
/**
|
|
638
|
-
* Check if this workflow is a descendant of the given ancestor workflow.
|
|
639
|
-
*
|
|
640
|
-
* Traverses the parent chain upward looking for the ancestor reference.
|
|
641
|
-
* Uses a visited Set to detect cycles during traversal. This method provides
|
|
642
|
-
* a convenient way to check workflow hierarchy relationships without manually
|
|
643
|
-
* traversing the parent chain.
|
|
644
|
-
*
|
|
645
|
-
* @warning This method reveals workflow hierarchy information. If your
|
|
646
|
-
* application exposes workflows via an API, ensure you implement proper
|
|
647
|
-
* access control to prevent unauthorized topology discovery. Note that
|
|
648
|
-
* the `parent` and `children` properties are already public, so this
|
|
649
|
-
* method does not expose any new information beyond what is currently
|
|
650
|
-
* accessible.
|
|
651
|
-
*
|
|
652
|
-
* **Time Complexity**: O(d) where d is the depth of the hierarchy
|
|
653
|
-
* **Space Complexity**: O(d) for the visited Set in worst case (cycle detection)
|
|
654
|
-
*
|
|
655
|
-
* @example Check if a workflow belongs to a specific hierarchy
|
|
656
|
-
* ```typescript
|
|
657
|
-
* const root = new Workflow('root');
|
|
658
|
-
* const child = new Workflow('child', { parent: root });
|
|
659
|
-
*
|
|
660
|
-
* if (child.isDescendantOf(root)) {
|
|
661
|
-
* console.log('Child is in root hierarchy');
|
|
662
|
-
* }
|
|
663
|
-
* ```
|
|
664
|
-
*
|
|
665
|
-
* @example Validate before attaching to prevent circular references
|
|
666
|
-
* ```typescript
|
|
667
|
-
* if (!newChild.isDescendantOf(parent)) {
|
|
668
|
-
* parent.attachChild(newChild);
|
|
669
|
-
* } else {
|
|
670
|
-
* throw new Error('Would create circular reference');
|
|
671
|
-
* }
|
|
672
|
-
* ```
|
|
673
|
-
*
|
|
674
|
-
* @example Check for ancestor relationship in conditional logic
|
|
675
|
-
* ```typescript
|
|
676
|
-
* const isInProductionBranch = workflow.isDescendantOf(productionRoot);
|
|
677
|
-
* if (isInProductionBranch) {
|
|
678
|
-
* // Apply production-specific logic
|
|
679
|
-
* }
|
|
680
|
-
* ```
|
|
681
|
-
*
|
|
682
|
-
* @param ancestor - The potential ancestor workflow to check
|
|
683
|
-
* @returns true if ancestor is found in parent chain, false otherwise
|
|
684
|
-
* @throws {Error} If a cycle is detected during traversal (indicates corrupted tree structure)
|
|
685
|
-
*/
|
|
686
|
-
public isDescendantOf(ancestor: Workflow): boolean {
|
|
687
|
-
const visited = new Set<Workflow>();
|
|
688
|
-
let current: Workflow | null = this.parent;
|
|
689
|
-
|
|
690
|
-
while (current !== null) {
|
|
691
|
-
if (visited.has(current)) {
|
|
692
|
-
throw new Error('Circular parent-child relationship detected');
|
|
693
|
-
}
|
|
694
|
-
visited.add(current);
|
|
695
|
-
|
|
696
|
-
if (current === ancestor) {
|
|
697
|
-
return true;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
current = current.parent;
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
return false;
|
|
704
|
-
}
|
|
705
|
-
```
|
|
706
|
-
|
|
707
|
-
### Security Documentation Addition
|
|
708
|
-
|
|
709
|
-
```markdown
|
|
710
|
-
# Add to: plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md
|
|
711
|
-
# Location: After Threat 4 (Denial of Service), before Implementation Checklist
|
|
712
|
-
|
|
713
|
-
### Threat 5: Topology Exposure via isDescendantOf
|
|
714
|
-
|
|
715
|
-
**Attack Scenario:**
|
|
716
|
-
```
|
|
717
|
-
Attacker → Calls workflow.isDescendantOf(suspectWorkflow)
|
|
718
|
-
→ Learns hierarchy relationship between workflows
|
|
719
|
-
→ Maps workflow tree structure
|
|
720
|
-
→ Extracts business intelligence from topology
|
|
721
|
-
```
|
|
722
|
-
|
|
723
|
-
**Risk Level:** LOW (same as current exposure)
|
|
724
|
-
|
|
725
|
-
**Rationale:**
|
|
726
|
-
- `parent` and `children` properties are already public
|
|
727
|
-
- `getNode()` exposes full tree structure
|
|
728
|
-
- `isDescendantOf()` only provides convenience, not new information
|
|
729
|
-
- Attacker can already traverse tree manually
|
|
730
|
-
|
|
731
|
-
**Affected Method:** `Workflow.isDescendantOf()` (newly public)
|
|
732
|
-
|
|
733
|
-
**Mitigation:**
|
|
734
|
-
1. **Application-Level Access Control** - If exposing workflows via API:
|
|
735
|
-
```typescript
|
|
736
|
-
// Validate user has permission to access workflow
|
|
737
|
-
if (!user.canAccessWorkflow(workflowId)) {
|
|
738
|
-
throw new Error('Unauthorized');
|
|
739
|
-
}
|
|
740
|
-
// Only then allow isDescendantOf calls
|
|
741
|
-
```
|
|
742
|
-
|
|
743
|
-
2. **Filter Hierarchy Information** - For unauthenticated users:
|
|
744
|
-
```typescript
|
|
745
|
-
// Return filtered view without hierarchy
|
|
746
|
-
const filteredWorkflow = {
|
|
747
|
-
id: workflow.id,
|
|
748
|
-
name: workflow.name,
|
|
749
|
-
// Omit parent, children, isDescendantOf
|
|
750
|
-
};
|
|
751
|
-
```
|
|
752
|
-
|
|
753
|
-
3. **Audit Topology Access** - Log calls to isDescendantOf:
|
|
754
|
-
```typescript
|
|
755
|
-
auditLog.log({
|
|
756
|
-
timestamp: Date.now(),
|
|
757
|
-
userId: user.id,
|
|
758
|
-
action: 'isDescendantOf',
|
|
759
|
-
workflowId: workflow.id,
|
|
760
|
-
ancestorId: ancestor.id
|
|
761
|
-
});
|
|
762
|
-
```
|
|
763
|
-
|
|
764
|
-
**Recommendation:** Document that applications should implement access control
|
|
765
|
-
if exposing workflows via APIs. The library itself provides no built-in security.
|
|
766
|
-
```
|
|
767
|
-
|
|
768
|
-
---
|
|
769
|
-
|
|
770
|
-
## Confidence Score
|
|
771
|
-
|
|
772
|
-
**One-Pass Implementation Success Likelihood**: **9/10**
|
|
773
|
-
|
|
774
|
-
**Rationale**:
|
|
775
|
-
- S1 research and recommendation are comprehensive and clear
|
|
776
|
-
- Implementation is straightforward (one keyword change + documentation)
|
|
777
|
-
- Existing tests already cover the functionality (25+ test cases)
|
|
778
|
-
- No logic changes required, minimizing risk
|
|
779
|
-
- Clear documentation patterns exist in codebase to follow
|
|
780
|
-
- Security implications are well-understood and documented
|
|
781
|
-
|
|
782
|
-
**Risk Mitigation**:
|
|
783
|
-
- Comprehensive JSDoc with security warning prevents misuse
|
|
784
|
-
- Security documentation update addresses information disclosure
|
|
785
|
-
- All changes are backward compatible (private → public only adds capability)
|
|
786
|
-
- Existing test suite provides safety net
|
|
787
|
-
|
|
788
|
-
---
|
|
789
|
-
|
|
790
|
-
**PRP Version**: 1.0
|
|
791
|
-
**Last Updated**: 2026-01-12
|
|
792
|
-
**Status**: Ready for Implementation
|