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,277 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for introspection tools
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
6
|
-
import {
|
|
7
|
-
INTROSPECTION_TOOLS,
|
|
8
|
-
handleInspectCurrentNode,
|
|
9
|
-
handleReadAncestorChain,
|
|
10
|
-
handleListSiblingsChildren,
|
|
11
|
-
handleInspectPriorOutputs,
|
|
12
|
-
handleInspectCacheStatus,
|
|
13
|
-
handleRequestSpawnWorkflow,
|
|
14
|
-
executeIntrospectionTool,
|
|
15
|
-
} from '../../tools/introspection.js';
|
|
16
|
-
import { runInContext, type AgentExecutionContext } from '../../core/context.js';
|
|
17
|
-
import type { WorkflowNode } from '../../types/index.js';
|
|
18
|
-
import { defaultCache } from '../../cache/cache.js';
|
|
19
|
-
|
|
20
|
-
describe('Introspection Tools', () => {
|
|
21
|
-
describe('INTROSPECTION_TOOLS', () => {
|
|
22
|
-
it('should export 6 tools', () => {
|
|
23
|
-
expect(INTROSPECTION_TOOLS).toHaveLength(6);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('should have valid tool definitions', () => {
|
|
27
|
-
for (const tool of INTROSPECTION_TOOLS) {
|
|
28
|
-
expect(tool.name).toBeDefined();
|
|
29
|
-
expect(tool.description).toBeDefined();
|
|
30
|
-
expect(tool.input_schema).toBeDefined();
|
|
31
|
-
expect(tool.input_schema.type).toBe('object');
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('should include all expected tool names', () => {
|
|
36
|
-
const names = INTROSPECTION_TOOLS.map((t) => t.name);
|
|
37
|
-
expect(names).toContain('inspect_current_node');
|
|
38
|
-
expect(names).toContain('read_ancestor_chain');
|
|
39
|
-
expect(names).toContain('list_siblings_children');
|
|
40
|
-
expect(names).toContain('inspect_prior_outputs');
|
|
41
|
-
expect(names).toContain('inspect_cache_status');
|
|
42
|
-
expect(names).toContain('request_spawn_workflow');
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
describe('handlers', () => {
|
|
47
|
-
const createTestNode = (
|
|
48
|
-
id: string,
|
|
49
|
-
name: string,
|
|
50
|
-
parent: WorkflowNode | null = null
|
|
51
|
-
): WorkflowNode => ({
|
|
52
|
-
id,
|
|
53
|
-
name,
|
|
54
|
-
parent,
|
|
55
|
-
children: [],
|
|
56
|
-
status: 'running',
|
|
57
|
-
logs: [],
|
|
58
|
-
events: [],
|
|
59
|
-
stateSnapshot: null,
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const createContext = (node: WorkflowNode): AgentExecutionContext => ({
|
|
63
|
-
workflowNode: node,
|
|
64
|
-
emitEvent: () => {},
|
|
65
|
-
workflowId: 'test-workflow',
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
describe('handleInspectCurrentNode', () => {
|
|
69
|
-
it('should throw when not in workflow context', async () => {
|
|
70
|
-
await expect(handleInspectCurrentNode()).rejects.toThrow(
|
|
71
|
-
'Not in workflow context'
|
|
72
|
-
);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('should return current node info', async () => {
|
|
76
|
-
const parent = createTestNode('parent-1', 'Parent');
|
|
77
|
-
const node = createTestNode('child-1', 'Child', parent);
|
|
78
|
-
parent.children.push(node);
|
|
79
|
-
|
|
80
|
-
const result = await runInContext(createContext(node), () =>
|
|
81
|
-
handleInspectCurrentNode()
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
expect(result.id).toBe('child-1');
|
|
85
|
-
expect(result.name).toBe('Child');
|
|
86
|
-
expect(result.status).toBe('running');
|
|
87
|
-
expect(result.parentId).toBe('parent-1');
|
|
88
|
-
expect(result.parentName).toBe('Parent');
|
|
89
|
-
expect(result.depth).toBe(1);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('should handle root node (no parent)', async () => {
|
|
93
|
-
const node = createTestNode('root-1', 'Root');
|
|
94
|
-
|
|
95
|
-
const result = await runInContext(createContext(node), () =>
|
|
96
|
-
handleInspectCurrentNode()
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
expect(result.parentId).toBeUndefined();
|
|
100
|
-
expect(result.depth).toBe(0);
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
describe('handleReadAncestorChain', () => {
|
|
105
|
-
it('should throw when not in workflow context', async () => {
|
|
106
|
-
await expect(handleReadAncestorChain({})).rejects.toThrow(
|
|
107
|
-
'Not in workflow context'
|
|
108
|
-
);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('should return ancestor chain', async () => {
|
|
112
|
-
const root = createTestNode('root-1', 'Root');
|
|
113
|
-
const parent = createTestNode('parent-1', 'Parent', root);
|
|
114
|
-
root.children.push(parent);
|
|
115
|
-
const child = createTestNode('child-1', 'Child', parent);
|
|
116
|
-
parent.children.push(child);
|
|
117
|
-
|
|
118
|
-
const result = await runInContext(createContext(child), () =>
|
|
119
|
-
handleReadAncestorChain({})
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
expect(result.ancestors).toHaveLength(2);
|
|
123
|
-
expect(result.ancestors[0].id).toBe('parent-1');
|
|
124
|
-
expect(result.ancestors[1].id).toBe('root-1');
|
|
125
|
-
expect(result.totalDepth).toBe(2);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('should respect maxDepth limit', async () => {
|
|
129
|
-
const root = createTestNode('root-1', 'Root');
|
|
130
|
-
const parent = createTestNode('parent-1', 'Parent', root);
|
|
131
|
-
root.children.push(parent);
|
|
132
|
-
const child = createTestNode('child-1', 'Child', parent);
|
|
133
|
-
parent.children.push(child);
|
|
134
|
-
|
|
135
|
-
const result = await runInContext(createContext(child), () =>
|
|
136
|
-
handleReadAncestorChain({ maxDepth: 1 })
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
expect(result.ancestors).toHaveLength(1);
|
|
140
|
-
expect(result.ancestors[0].id).toBe('parent-1');
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
describe('handleListSiblingsChildren', () => {
|
|
145
|
-
it('should throw when not in workflow context', async () => {
|
|
146
|
-
await expect(
|
|
147
|
-
handleListSiblingsChildren({ type: 'children' })
|
|
148
|
-
).rejects.toThrow('Not in workflow context');
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('should return children', async () => {
|
|
152
|
-
const parent = createTestNode('parent-1', 'Parent');
|
|
153
|
-
const child1 = createTestNode('child-1', 'Child 1', parent);
|
|
154
|
-
const child2 = createTestNode('child-2', 'Child 2', parent);
|
|
155
|
-
parent.children.push(child1, child2);
|
|
156
|
-
|
|
157
|
-
const result = await runInContext(createContext(parent), () =>
|
|
158
|
-
handleListSiblingsChildren({ type: 'children' })
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
expect(result.type).toBe('children');
|
|
162
|
-
expect(result.nodes).toHaveLength(2);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('should return siblings (excluding self)', async () => {
|
|
166
|
-
const parent = createTestNode('parent-1', 'Parent');
|
|
167
|
-
const child1 = createTestNode('child-1', 'Child 1', parent);
|
|
168
|
-
const child2 = createTestNode('child-2', 'Child 2', parent);
|
|
169
|
-
parent.children.push(child1, child2);
|
|
170
|
-
|
|
171
|
-
const result = await runInContext(createContext(child1), () =>
|
|
172
|
-
handleListSiblingsChildren({ type: 'siblings' })
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
expect(result.type).toBe('siblings');
|
|
176
|
-
expect(result.nodes).toHaveLength(1);
|
|
177
|
-
expect(result.nodes[0].id).toBe('child-2');
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
describe('handleInspectPriorOutputs', () => {
|
|
182
|
-
it('should throw when not in workflow context', async () => {
|
|
183
|
-
await expect(handleInspectPriorOutputs({})).rejects.toThrow(
|
|
184
|
-
'Not in workflow context'
|
|
185
|
-
);
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('should return completed sibling outputs', async () => {
|
|
189
|
-
const parent = createTestNode('parent-1', 'Parent');
|
|
190
|
-
const completed = createTestNode('completed-1', 'Completed', parent);
|
|
191
|
-
completed.status = 'completed';
|
|
192
|
-
// Add a valid workflow event for testing
|
|
193
|
-
completed.events.push({
|
|
194
|
-
type: 'stepEnd',
|
|
195
|
-
node: completed,
|
|
196
|
-
step: 'test-step',
|
|
197
|
-
duration: 100,
|
|
198
|
-
} as never); // Cast to avoid strict type checking in tests
|
|
199
|
-
const current = createTestNode('current-1', 'Current', parent);
|
|
200
|
-
parent.children.push(completed, current);
|
|
201
|
-
|
|
202
|
-
const result = await runInContext(createContext(current), () =>
|
|
203
|
-
handleInspectPriorOutputs({})
|
|
204
|
-
);
|
|
205
|
-
|
|
206
|
-
expect(result).toHaveLength(1);
|
|
207
|
-
expect(result[0].nodeId).toBe('completed-1');
|
|
208
|
-
expect(result[0].status).toBe('completed');
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
describe('handleInspectCacheStatus', () => {
|
|
213
|
-
beforeEach(async () => {
|
|
214
|
-
await defaultCache.clear();
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
it('should return false for missing cache key', async () => {
|
|
218
|
-
const result = await handleInspectCacheStatus({
|
|
219
|
-
promptHash: 'nonexistent-key',
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
expect(result.exists).toBe(false);
|
|
223
|
-
expect(result.key).toBe('nonexistent-key');
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it('should return true for existing cache key', async () => {
|
|
227
|
-
await defaultCache.set('test-key', { data: 'test' });
|
|
228
|
-
|
|
229
|
-
const result = await handleInspectCacheStatus({ promptHash: 'test-key' });
|
|
230
|
-
|
|
231
|
-
expect(result.exists).toBe(true);
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
describe('handleRequestSpawnWorkflow', () => {
|
|
236
|
-
it('should throw when not in workflow context', async () => {
|
|
237
|
-
await expect(
|
|
238
|
-
handleRequestSpawnWorkflow({ name: 'Test', description: 'Test workflow' })
|
|
239
|
-
).rejects.toThrow('Not in workflow context');
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
it('should return spawn request', async () => {
|
|
243
|
-
const node = createTestNode('node-1', 'Node');
|
|
244
|
-
|
|
245
|
-
const result = await runInContext(createContext(node), () =>
|
|
246
|
-
handleRequestSpawnWorkflow({
|
|
247
|
-
name: 'NewWorkflow',
|
|
248
|
-
description: 'A new workflow',
|
|
249
|
-
})
|
|
250
|
-
);
|
|
251
|
-
|
|
252
|
-
expect(result.name).toBe('NewWorkflow');
|
|
253
|
-
expect(result.description).toBe('A new workflow');
|
|
254
|
-
expect(result.requestId).toMatch(/^spawn-/);
|
|
255
|
-
expect(result.status).toBe('pending');
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
describe('executeIntrospectionTool', () => {
|
|
261
|
-
it('should execute tool by name', async () => {
|
|
262
|
-
await defaultCache.set('cache-test', 'value');
|
|
263
|
-
|
|
264
|
-
const result = await executeIntrospectionTool('inspect_cache_status', {
|
|
265
|
-
promptHash: 'cache-test',
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
expect(result).toMatchObject({ exists: true, key: 'cache-test' });
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
it('should throw for unknown tool', async () => {
|
|
272
|
-
await expect(
|
|
273
|
-
executeIntrospectionTool('unknown_tool', {})
|
|
274
|
-
).rejects.toThrow('Unknown introspection tool');
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
});
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { Workflow } from '../../core/workflow';
|
|
3
|
-
import type { LogEntry } from '../../types/logging';
|
|
4
|
-
|
|
5
|
-
describe('WorkflowLogger.child()', () => {
|
|
6
|
-
describe('with Partial<LogEntry> containing parentLogId', () => {
|
|
7
|
-
it('should create child logger with parentLogId from Partial<LogEntry>', async () => {
|
|
8
|
-
class TestWorkflow extends Workflow {
|
|
9
|
-
async run() {
|
|
10
|
-
const childLogger = this.logger.child({ parentLogId: 'parent-123' });
|
|
11
|
-
childLogger.info('Child message');
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const workflow = new TestWorkflow();
|
|
16
|
-
await workflow.run();
|
|
17
|
-
|
|
18
|
-
expect(workflow.node.logs.length).toBe(1);
|
|
19
|
-
expect(workflow.node.logs[0].parentLogId).toBe('parent-123');
|
|
20
|
-
expect(workflow.node.logs[0].message).toBe('Child message');
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should handle parentLogId with special characters', async () => {
|
|
24
|
-
class TestWorkflow extends Workflow {
|
|
25
|
-
async run() {
|
|
26
|
-
const childLogger = this.logger.child({ parentLogId: 'parent-with-dashes-and_underscores' });
|
|
27
|
-
childLogger.info('Test');
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const workflow = new TestWorkflow();
|
|
32
|
-
await workflow.run();
|
|
33
|
-
|
|
34
|
-
expect(workflow.node.logs[0].parentLogId).toBe('parent-with-dashes-and_underscores');
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
describe('with Partial<LogEntry> containing id field', () => {
|
|
39
|
-
it('should not use id field as parentLogId', async () => {
|
|
40
|
-
class TestWorkflow extends Workflow {
|
|
41
|
-
async run() {
|
|
42
|
-
// id field should NOT be used as parentLogId
|
|
43
|
-
const childLogger = this.logger.child({ id: 'custom-id' });
|
|
44
|
-
childLogger.info('Test message');
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const workflow = new TestWorkflow();
|
|
49
|
-
await workflow.run();
|
|
50
|
-
|
|
51
|
-
// parentLogId is undefined because implementation only checks input.parentLogId
|
|
52
|
-
expect(workflow.node.logs[0].parentLogId).toBeUndefined();
|
|
53
|
-
expect(workflow.node.logs[0].message).toBe('Test message');
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('should handle both id and parentLogId fields', async () => {
|
|
57
|
-
class TestWorkflow extends Workflow {
|
|
58
|
-
async run() {
|
|
59
|
-
// parentLogId should be used, not id
|
|
60
|
-
const childLogger = this.logger.child({ id: 'custom-id', parentLogId: 'correct-parent' });
|
|
61
|
-
childLogger.info('Test');
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const workflow = new TestWorkflow();
|
|
66
|
-
await workflow.run();
|
|
67
|
-
|
|
68
|
-
expect(workflow.node.logs[0].parentLogId).toBe('correct-parent');
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
describe('with empty Partial<LogEntry>', () => {
|
|
73
|
-
it('should create child logger with undefined parentLogId from empty object', async () => {
|
|
74
|
-
class TestWorkflow extends Workflow {
|
|
75
|
-
async run() {
|
|
76
|
-
const childLogger = this.logger.child({});
|
|
77
|
-
childLogger.info('Child log with empty parent metadata');
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const workflow = new TestWorkflow();
|
|
82
|
-
await workflow.run();
|
|
83
|
-
|
|
84
|
-
expect(workflow.node.logs.length).toBe(1);
|
|
85
|
-
expect(workflow.node.logs[0].parentLogId).toBeUndefined();
|
|
86
|
-
expect(workflow.node.logs[0].message).toBe('Child log with empty parent metadata');
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
describe('with string parameter (backward compatibility)', () => {
|
|
91
|
-
it('should create child logger with parentLogId from string', async () => {
|
|
92
|
-
class TestWorkflow extends Workflow {
|
|
93
|
-
async run() {
|
|
94
|
-
const childLogger = this.logger.child('parent-id-123');
|
|
95
|
-
childLogger.info('Child message');
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const workflow = new TestWorkflow();
|
|
100
|
-
await workflow.run();
|
|
101
|
-
|
|
102
|
-
expect(workflow.node.logs.length).toBe(1);
|
|
103
|
-
expect(workflow.node.logs[0].parentLogId).toBe('parent-id-123');
|
|
104
|
-
expect(workflow.node.logs[0].message).toBe('Child message');
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('should create child logger with parentLogId from string containing parentLogId', async () => {
|
|
108
|
-
class TestWorkflow extends Workflow {
|
|
109
|
-
async run() {
|
|
110
|
-
// String value is used directly as parentLogId
|
|
111
|
-
const childLogger = this.logger.child('log-abc-123');
|
|
112
|
-
childLogger.warn('Warning message');
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const workflow = new TestWorkflow();
|
|
117
|
-
await workflow.run();
|
|
118
|
-
|
|
119
|
-
expect(workflow.node.logs[0].parentLogId).toBe('log-abc-123');
|
|
120
|
-
expect(workflow.node.logs[0].level).toBe('warn');
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
describe('with empty string', () => {
|
|
125
|
-
it('should create child logger with undefined parentLogId from empty string', async () => {
|
|
126
|
-
class TestWorkflow extends Workflow {
|
|
127
|
-
async run() {
|
|
128
|
-
const childLogger = this.logger.child('');
|
|
129
|
-
childLogger.info('Child log with empty parent');
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const workflow = new TestWorkflow();
|
|
134
|
-
await workflow.run();
|
|
135
|
-
|
|
136
|
-
expect(workflow.node.logs.length).toBe(1);
|
|
137
|
-
// Empty string is falsy, so parentLogId becomes undefined in log entry
|
|
138
|
-
expect(workflow.node.logs[0].parentLogId).toBeUndefined();
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
describe('child logger with different log levels', () => {
|
|
143
|
-
it.each([
|
|
144
|
-
{ level: 'debug', method: 'debug' as const },
|
|
145
|
-
{ level: 'info', method: 'info' as const },
|
|
146
|
-
{ level: 'warn', method: 'warn' as const },
|
|
147
|
-
{ level: 'error', method: 'error' as const },
|
|
148
|
-
])('should log at $level level with child logger', async ({ level, method }) => {
|
|
149
|
-
class TestWorkflow extends Workflow {
|
|
150
|
-
async run() {
|
|
151
|
-
const childLogger = this.logger.child({ parentLogId: 'parent-123' });
|
|
152
|
-
childLogger[method](`Test ${level} message`);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
const workflow = new TestWorkflow();
|
|
157
|
-
await workflow.run();
|
|
158
|
-
|
|
159
|
-
expect(workflow.node.logs[0].level).toBe(level);
|
|
160
|
-
expect(workflow.node.logs[0].parentLogId).toBe('parent-123');
|
|
161
|
-
expect(workflow.node.logs[0].message).toBe(`Test ${level} message`);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it('should support logging with data parameter at all levels', async () => {
|
|
165
|
-
class TestWorkflow extends Workflow {
|
|
166
|
-
async run() {
|
|
167
|
-
const childLogger = this.logger.child({ parentLogId: 'parent-data' });
|
|
168
|
-
|
|
169
|
-
childLogger.debug('Debug message', { debugData: true });
|
|
170
|
-
childLogger.info('Info message', { infoData: 123 });
|
|
171
|
-
childLogger.warn('Warn message', { warnData: 'warning' });
|
|
172
|
-
childLogger.error('Error message', { errorData: { code: 500 } });
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const workflow = new TestWorkflow();
|
|
177
|
-
await workflow.run();
|
|
178
|
-
|
|
179
|
-
expect(workflow.node.logs.length).toBe(4);
|
|
180
|
-
expect(workflow.node.logs[0].data).toEqual({ debugData: true });
|
|
181
|
-
expect(workflow.node.logs[1].data).toEqual({ infoData: 123 });
|
|
182
|
-
expect(workflow.node.logs[2].data).toEqual({ warnData: 'warning' });
|
|
183
|
-
expect(workflow.node.logs[3].data).toEqual({ errorData: { code: 500 } });
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
describe('parent-child log hierarchy', () => {
|
|
188
|
-
it('should maintain parent-child relationship in log entries', async () => {
|
|
189
|
-
class TestWorkflow extends Workflow {
|
|
190
|
-
async run() {
|
|
191
|
-
// Log from parent logger
|
|
192
|
-
this.logger.info('Parent message');
|
|
193
|
-
|
|
194
|
-
// Get the parent log entry ID
|
|
195
|
-
const parentLogId = this.node.logs[0].id;
|
|
196
|
-
|
|
197
|
-
// Create child logger with that ID
|
|
198
|
-
const childLogger = this.logger.child({ parentLogId });
|
|
199
|
-
childLogger.info('Child message');
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const workflow = new TestWorkflow();
|
|
204
|
-
await workflow.run();
|
|
205
|
-
|
|
206
|
-
// Verify hierarchy
|
|
207
|
-
expect(workflow.node.logs.length).toBe(2);
|
|
208
|
-
expect(workflow.node.logs[0].parentLogId).toBeUndefined(); // Root log
|
|
209
|
-
expect(workflow.node.logs[1].parentLogId).toBe(workflow.node.logs[0].id); // Child log
|
|
210
|
-
expect(workflow.node.logs[0].message).toBe('Parent message');
|
|
211
|
-
expect(workflow.node.logs[1].message).toBe('Child message');
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it('should support multi-level nesting with child loggers', async () => {
|
|
215
|
-
class TestWorkflow extends Workflow {
|
|
216
|
-
async run() {
|
|
217
|
-
// Root log
|
|
218
|
-
this.logger.info('Root message');
|
|
219
|
-
const rootLogId = this.node.logs[0].id;
|
|
220
|
-
|
|
221
|
-
// First level child
|
|
222
|
-
const child1 = this.logger.child({ parentLogId: rootLogId });
|
|
223
|
-
child1.info('Level 1 child');
|
|
224
|
-
const level1LogId = this.node.logs[1].id;
|
|
225
|
-
|
|
226
|
-
// Second level child
|
|
227
|
-
const child2 = this.logger.child({ parentLogId: level1LogId });
|
|
228
|
-
child2.info('Level 2 child');
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const workflow = new TestWorkflow();
|
|
233
|
-
await workflow.run();
|
|
234
|
-
|
|
235
|
-
expect(workflow.node.logs.length).toBe(3);
|
|
236
|
-
expect(workflow.node.logs[0].parentLogId).toBeUndefined();
|
|
237
|
-
expect(workflow.node.logs[1].parentLogId).toBe(workflow.node.logs[0].id);
|
|
238
|
-
expect(workflow.node.logs[2].parentLogId).toBe(workflow.node.logs[1].id);
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it('should support string-based parent-child hierarchy', async () => {
|
|
242
|
-
class TestWorkflow extends Workflow {
|
|
243
|
-
async run() {
|
|
244
|
-
// Log from parent
|
|
245
|
-
this.logger.info('Parent log');
|
|
246
|
-
const parentLogId = this.node.logs[0].id;
|
|
247
|
-
|
|
248
|
-
// Create child using string parentLogId (backward compatibility)
|
|
249
|
-
const childLogger = this.logger.child(parentLogId);
|
|
250
|
-
childLogger.info('Child log');
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
const workflow = new TestWorkflow();
|
|
255
|
-
await workflow.run();
|
|
256
|
-
|
|
257
|
-
expect(workflow.node.logs.length).toBe(2);
|
|
258
|
-
expect(workflow.node.logs[0].parentLogId).toBeUndefined();
|
|
259
|
-
expect(workflow.node.logs[1].parentLogId).toBe(workflow.node.logs[0].id);
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('should allow multiple child loggers from same parent', async () => {
|
|
263
|
-
class TestWorkflow extends Workflow {
|
|
264
|
-
async run() {
|
|
265
|
-
// Parent log
|
|
266
|
-
this.logger.info('Parent');
|
|
267
|
-
const parentLogId = this.node.logs[0].id;
|
|
268
|
-
|
|
269
|
-
// Multiple children from same parent
|
|
270
|
-
const child1 = this.logger.child({ parentLogId });
|
|
271
|
-
child1.info('First child');
|
|
272
|
-
|
|
273
|
-
const child2 = this.logger.child({ parentLogId });
|
|
274
|
-
child2.info('Second child');
|
|
275
|
-
|
|
276
|
-
const child3 = this.logger.child({ parentLogId });
|
|
277
|
-
child3.info('Third child');
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const workflow = new TestWorkflow();
|
|
282
|
-
await workflow.run();
|
|
283
|
-
|
|
284
|
-
expect(workflow.node.logs.length).toBe(4);
|
|
285
|
-
expect(workflow.node.logs[0].parentLogId).toBeUndefined();
|
|
286
|
-
|
|
287
|
-
// All children should have the same parent
|
|
288
|
-
expect(workflow.node.logs[1].parentLogId).toBe(workflow.node.logs[0].id);
|
|
289
|
-
expect(workflow.node.logs[2].parentLogId).toBe(workflow.node.logs[0].id);
|
|
290
|
-
expect(workflow.node.logs[3].parentLogId).toBe(workflow.node.logs[0].id);
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
|
-
});
|