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,731 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRD Compliance Tests
|
|
3
|
-
* These tests verify that the implementation matches the PRD specifications
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, it, expect } from 'vitest';
|
|
7
|
-
import { Workflow, Step, Task, ObservedState } from '../../index.js';
|
|
8
|
-
import { WorkflowTreeDebugger } from '../../debugger/tree-debugger.js';
|
|
9
|
-
import type { WorkflowEvent, WorkflowError, LogEntry } from '../../types/index.js';
|
|
10
|
-
|
|
11
|
-
describe('PRD Compliance Tests', () => {
|
|
12
|
-
describe('PRD Section 3.1: WorkflowNode Interface', () => {
|
|
13
|
-
it('should have all required WorkflowNode properties', async () => {
|
|
14
|
-
class TestWorkflow extends Workflow {
|
|
15
|
-
async run() {
|
|
16
|
-
return 'done';
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const workflow = new TestWorkflow();
|
|
21
|
-
const node = workflow.getNode();
|
|
22
|
-
|
|
23
|
-
expect(node).toHaveProperty('id');
|
|
24
|
-
expect(node).toHaveProperty('name');
|
|
25
|
-
expect(node).toHaveProperty('parent');
|
|
26
|
-
expect(node).toHaveProperty('children');
|
|
27
|
-
expect(node).toHaveProperty('status');
|
|
28
|
-
expect(node).toHaveProperty('logs');
|
|
29
|
-
expect(node).toHaveProperty('events');
|
|
30
|
-
expect(node).toHaveProperty('stateSnapshot');
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should initialize with correct default values', async () => {
|
|
34
|
-
class TestWorkflow extends Workflow {
|
|
35
|
-
async run() {
|
|
36
|
-
return 'done';
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const workflow = new TestWorkflow();
|
|
41
|
-
const node = workflow.getNode();
|
|
42
|
-
|
|
43
|
-
expect(node.id).toBeDefined();
|
|
44
|
-
expect(node.name).toBe('TestWorkflow');
|
|
45
|
-
expect(node.parent).toBeNull();
|
|
46
|
-
expect(node.children).toEqual([]);
|
|
47
|
-
expect(node.status).toBe('idle');
|
|
48
|
-
expect(node.logs).toEqual([]);
|
|
49
|
-
expect(node.events).toEqual([]);
|
|
50
|
-
expect(node.stateSnapshot).toBeNull();
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe('PRD Section 3.2: WorkflowStatus Type', () => {
|
|
55
|
-
it('should support all 5 status values', async () => {
|
|
56
|
-
const validStatuses = ['idle', 'running', 'completed', 'failed', 'cancelled'];
|
|
57
|
-
|
|
58
|
-
class TestWorkflow extends Workflow {
|
|
59
|
-
async run() {
|
|
60
|
-
for (const status of validStatuses) {
|
|
61
|
-
this.setStatus(status as any);
|
|
62
|
-
expect(this.status).toBe(status);
|
|
63
|
-
expect(this.node.status).toBe(status);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const workflow = new TestWorkflow();
|
|
69
|
-
await workflow.run();
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
describe('PRD Section 4.1: LogEntry Interface', () => {
|
|
74
|
-
it('should create log entries with all required properties', async () => {
|
|
75
|
-
class TestWorkflow extends Workflow {
|
|
76
|
-
async run() {
|
|
77
|
-
this.logger.info('Test message', { key: 'value' });
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const workflow = new TestWorkflow();
|
|
82
|
-
await workflow.run();
|
|
83
|
-
|
|
84
|
-
const log = workflow.node.logs[0];
|
|
85
|
-
expect(log).toHaveProperty('id');
|
|
86
|
-
expect(log).toHaveProperty('workflowId');
|
|
87
|
-
expect(log).toHaveProperty('timestamp');
|
|
88
|
-
expect(log).toHaveProperty('level');
|
|
89
|
-
expect(log).toHaveProperty('message');
|
|
90
|
-
expect(log).toHaveProperty('data');
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('should support all 4 log levels', async () => {
|
|
94
|
-
const levels: Array<'debug' | 'info' | 'warn' | 'error'> = ['debug', 'info', 'warn', 'error'];
|
|
95
|
-
|
|
96
|
-
class TestWorkflow extends Workflow {
|
|
97
|
-
async run() {
|
|
98
|
-
this.logger.debug('debug msg');
|
|
99
|
-
this.logger.info('info msg');
|
|
100
|
-
this.logger.warn('warn msg');
|
|
101
|
-
this.logger.error('error msg');
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const workflow = new TestWorkflow();
|
|
106
|
-
await workflow.run();
|
|
107
|
-
|
|
108
|
-
expect(workflow.node.logs.length).toBe(4);
|
|
109
|
-
workflow.node.logs.forEach((log, i) => {
|
|
110
|
-
expect(log.level).toBe(levels[i]);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
describe('PRD Section 4.2: WorkflowEvent Types', () => {
|
|
116
|
-
it('should emit stepStart event', async () => {
|
|
117
|
-
class TestWorkflow extends Workflow {
|
|
118
|
-
@Step()
|
|
119
|
-
async testStep() {
|
|
120
|
-
return 'done';
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async run() {
|
|
124
|
-
return this.testStep();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const workflow = new TestWorkflow();
|
|
129
|
-
const events: WorkflowEvent[] = [];
|
|
130
|
-
|
|
131
|
-
workflow.addObserver({
|
|
132
|
-
onLog: () => {},
|
|
133
|
-
onEvent: (e) => events.push(e),
|
|
134
|
-
onStateUpdated: () => {},
|
|
135
|
-
onTreeChanged: () => {},
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
await workflow.run();
|
|
139
|
-
|
|
140
|
-
const stepStart = events.find(e => e.type === 'stepStart');
|
|
141
|
-
expect(stepStart).toBeDefined();
|
|
142
|
-
if (stepStart?.type === 'stepStart') {
|
|
143
|
-
expect(stepStart.node).toBeDefined();
|
|
144
|
-
expect(stepStart.step).toBe('testStep');
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('should emit stepEnd event with duration', async () => {
|
|
149
|
-
class TestWorkflow extends Workflow {
|
|
150
|
-
@Step()
|
|
151
|
-
async testStep() {
|
|
152
|
-
return 'done';
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async run() {
|
|
156
|
-
return this.testStep();
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const workflow = new TestWorkflow();
|
|
161
|
-
const events: WorkflowEvent[] = [];
|
|
162
|
-
|
|
163
|
-
workflow.addObserver({
|
|
164
|
-
onLog: () => {},
|
|
165
|
-
onEvent: (e) => events.push(e),
|
|
166
|
-
onStateUpdated: () => {},
|
|
167
|
-
onTreeChanged: () => {},
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
await workflow.run();
|
|
171
|
-
|
|
172
|
-
const stepEnd = events.find(e => e.type === 'stepEnd');
|
|
173
|
-
expect(stepEnd).toBeDefined();
|
|
174
|
-
if (stepEnd?.type === 'stepEnd') {
|
|
175
|
-
expect(stepEnd.node).toBeDefined();
|
|
176
|
-
expect(stepEnd.step).toBe('testStep');
|
|
177
|
-
expect(typeof stepEnd.duration).toBe('number');
|
|
178
|
-
expect(stepEnd.duration).toBeGreaterThanOrEqual(0);
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('should emit taskStart and taskEnd events', async () => {
|
|
183
|
-
class ChildWorkflow extends Workflow {
|
|
184
|
-
async run() {
|
|
185
|
-
return 'child';
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
class ParentWorkflow extends Workflow {
|
|
190
|
-
@Task()
|
|
191
|
-
async spawnChild() {
|
|
192
|
-
return new ChildWorkflow('Child', this);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
async run() {
|
|
196
|
-
return this.spawnChild();
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const workflow = new ParentWorkflow();
|
|
201
|
-
const events: WorkflowEvent[] = [];
|
|
202
|
-
|
|
203
|
-
workflow.addObserver({
|
|
204
|
-
onLog: () => {},
|
|
205
|
-
onEvent: (e) => events.push(e),
|
|
206
|
-
onStateUpdated: () => {},
|
|
207
|
-
onTreeChanged: () => {},
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
await workflow.run();
|
|
211
|
-
|
|
212
|
-
const taskStart = events.find(e => e.type === 'taskStart');
|
|
213
|
-
expect(taskStart).toBeDefined();
|
|
214
|
-
if (taskStart?.type === 'taskStart') {
|
|
215
|
-
expect(taskStart.task).toBe('spawnChild');
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
const taskEnd = events.find(e => e.type === 'taskEnd');
|
|
219
|
-
expect(taskEnd).toBeDefined();
|
|
220
|
-
if (taskEnd?.type === 'taskEnd') {
|
|
221
|
-
expect(taskEnd.task).toBe('spawnChild');
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
describe('PRD Section 5.1: WorkflowError Interface', () => {
|
|
227
|
-
it('should include all required fields in WorkflowError', async () => {
|
|
228
|
-
class TestWorkflow extends Workflow {
|
|
229
|
-
@ObservedState()
|
|
230
|
-
testField = 'test-value';
|
|
231
|
-
|
|
232
|
-
@Step()
|
|
233
|
-
async failingStep() {
|
|
234
|
-
this.logger.info('About to fail');
|
|
235
|
-
throw new Error('Test error');
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
async run() {
|
|
239
|
-
try {
|
|
240
|
-
await this.failingStep();
|
|
241
|
-
} catch (err) {
|
|
242
|
-
// Expected
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const workflow = new TestWorkflow();
|
|
248
|
-
let capturedError: WorkflowError | undefined;
|
|
249
|
-
|
|
250
|
-
workflow.addObserver({
|
|
251
|
-
onLog: () => {},
|
|
252
|
-
onEvent: (e) => {
|
|
253
|
-
if (e.type === 'error') {
|
|
254
|
-
capturedError = e.error;
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
onStateUpdated: () => {},
|
|
258
|
-
onTreeChanged: () => {},
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
await workflow.run();
|
|
262
|
-
|
|
263
|
-
expect(capturedError).toBeDefined();
|
|
264
|
-
expect(capturedError).toHaveProperty('message', 'Test error');
|
|
265
|
-
expect(capturedError).toHaveProperty('original');
|
|
266
|
-
expect(capturedError).toHaveProperty('workflowId');
|
|
267
|
-
expect(capturedError).toHaveProperty('stack');
|
|
268
|
-
expect(capturedError).toHaveProperty('state');
|
|
269
|
-
expect(capturedError).toHaveProperty('logs');
|
|
270
|
-
expect(Array.isArray(capturedError?.logs)).toBe(true);
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
describe('PRD Section 8.1: @Step Decorator Options', () => {
|
|
275
|
-
it('should support custom step name', async () => {
|
|
276
|
-
class TestWorkflow extends Workflow {
|
|
277
|
-
@Step({ name: 'CustomStepName' })
|
|
278
|
-
async someMethod() {
|
|
279
|
-
return 'done';
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
async run() {
|
|
283
|
-
return this.someMethod();
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
const workflow = new TestWorkflow();
|
|
288
|
-
const events: WorkflowEvent[] = [];
|
|
289
|
-
|
|
290
|
-
workflow.addObserver({
|
|
291
|
-
onLog: () => {},
|
|
292
|
-
onEvent: (e) => events.push(e),
|
|
293
|
-
onStateUpdated: () => {},
|
|
294
|
-
onTreeChanged: () => {},
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
await workflow.run();
|
|
298
|
-
|
|
299
|
-
const stepStart = events.find(e => e.type === 'stepStart');
|
|
300
|
-
if (stepStart?.type === 'stepStart') {
|
|
301
|
-
expect(stepStart.step).toBe('CustomStepName');
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
it('should snapshot state when requested', async () => {
|
|
306
|
-
class TestWorkflow extends Workflow {
|
|
307
|
-
@ObservedState()
|
|
308
|
-
counter = 42;
|
|
309
|
-
|
|
310
|
-
@Step({ snapshotState: true })
|
|
311
|
-
async testStep() {
|
|
312
|
-
this.counter = 100;
|
|
313
|
-
return 'done';
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
async run() {
|
|
317
|
-
return this.testStep();
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const workflow = new TestWorkflow();
|
|
322
|
-
await workflow.run();
|
|
323
|
-
|
|
324
|
-
expect(workflow.node.stateSnapshot).not.toBeNull();
|
|
325
|
-
expect(workflow.node.stateSnapshot?.counter).toBe(100);
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
it('should log start when requested', async () => {
|
|
329
|
-
class TestWorkflow extends Workflow {
|
|
330
|
-
@Step({ logStart: true })
|
|
331
|
-
async testStep() {
|
|
332
|
-
return 'done';
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
async run() {
|
|
336
|
-
return this.testStep();
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const workflow = new TestWorkflow();
|
|
341
|
-
await workflow.run();
|
|
342
|
-
|
|
343
|
-
const hasStartLog = workflow.node.logs.some(l => l.message.includes('STEP START'));
|
|
344
|
-
expect(hasStartLog).toBe(true);
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
it('should log finish when requested', async () => {
|
|
348
|
-
class TestWorkflow extends Workflow {
|
|
349
|
-
@Step({ logFinish: true })
|
|
350
|
-
async testStep() {
|
|
351
|
-
return 'done';
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
async run() {
|
|
355
|
-
return this.testStep();
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
const workflow = new TestWorkflow();
|
|
360
|
-
await workflow.run();
|
|
361
|
-
|
|
362
|
-
const hasEndLog = workflow.node.logs.some(l => l.message.includes('STEP END'));
|
|
363
|
-
expect(hasEndLog).toBe(true);
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
describe('PRD Section 8.2: @Task Decorator', () => {
|
|
368
|
-
it('should attach single child workflow', async () => {
|
|
369
|
-
class ChildWorkflow extends Workflow {
|
|
370
|
-
async run() {
|
|
371
|
-
return 'child';
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
class ParentWorkflow extends Workflow {
|
|
376
|
-
@Task()
|
|
377
|
-
async spawnChild() {
|
|
378
|
-
return new ChildWorkflow('Child', this);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
async run() {
|
|
382
|
-
return this.spawnChild();
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
const workflow = new ParentWorkflow();
|
|
387
|
-
await workflow.run();
|
|
388
|
-
|
|
389
|
-
expect(workflow.children.length).toBe(1);
|
|
390
|
-
expect(workflow.children[0].node.name).toBe('Child');
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
it('should attach multiple child workflows', async () => {
|
|
394
|
-
class ChildWorkflow extends Workflow {
|
|
395
|
-
async run() {
|
|
396
|
-
return 'child';
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
class ParentWorkflow extends Workflow {
|
|
401
|
-
@Task()
|
|
402
|
-
async spawnChildren() {
|
|
403
|
-
return [
|
|
404
|
-
new ChildWorkflow('Child1', this),
|
|
405
|
-
new ChildWorkflow('Child2', this),
|
|
406
|
-
new ChildWorkflow('Child3', this),
|
|
407
|
-
];
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
async run() {
|
|
411
|
-
return this.spawnChildren();
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
const workflow = new ParentWorkflow();
|
|
416
|
-
await workflow.run();
|
|
417
|
-
|
|
418
|
-
expect(workflow.children.length).toBe(3);
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
it('should run workflows concurrently when concurrent: true', async () => {
|
|
422
|
-
let executionOrder: string[] = [];
|
|
423
|
-
|
|
424
|
-
class ChildWorkflow extends Workflow {
|
|
425
|
-
constructor(name: string, parent?: Workflow) {
|
|
426
|
-
super(name, parent);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
async run() {
|
|
430
|
-
// Add a small delay
|
|
431
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
432
|
-
executionOrder.push(this.node.name);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
class ParentWorkflow extends Workflow {
|
|
437
|
-
@Task({ concurrent: true })
|
|
438
|
-
async spawnChildren() {
|
|
439
|
-
return [
|
|
440
|
-
new ChildWorkflow('Child1', this),
|
|
441
|
-
new ChildWorkflow('Child2', this),
|
|
442
|
-
new ChildWorkflow('Child3', this),
|
|
443
|
-
];
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
async run() {
|
|
447
|
-
return this.spawnChildren();
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
const workflow = new ParentWorkflow();
|
|
452
|
-
await workflow.run();
|
|
453
|
-
|
|
454
|
-
// All children should have been executed
|
|
455
|
-
expect(executionOrder.length).toBe(3);
|
|
456
|
-
// With concurrent execution, we can't guarantee order, but all should be present
|
|
457
|
-
expect(executionOrder).toContain('Child1');
|
|
458
|
-
expect(executionOrder).toContain('Child2');
|
|
459
|
-
expect(executionOrder).toContain('Child3');
|
|
460
|
-
});
|
|
461
|
-
});
|
|
462
|
-
|
|
463
|
-
describe('PRD Section 8.3: @ObservedState Decorator', () => {
|
|
464
|
-
it('should include marked fields in state snapshots', async () => {
|
|
465
|
-
class TestWorkflow extends Workflow {
|
|
466
|
-
@ObservedState()
|
|
467
|
-
observedField = 'observed';
|
|
468
|
-
|
|
469
|
-
unobservedField = 'not-observed';
|
|
470
|
-
|
|
471
|
-
async run() {
|
|
472
|
-
this.snapshotState();
|
|
473
|
-
return this.node.stateSnapshot;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
const workflow = new TestWorkflow();
|
|
478
|
-
const snapshot = await workflow.run();
|
|
479
|
-
|
|
480
|
-
expect(snapshot).toHaveProperty('observedField', 'observed');
|
|
481
|
-
expect(snapshot).not.toHaveProperty('unobservedField');
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
it('should redact fields with redact: true', async () => {
|
|
485
|
-
class TestWorkflow extends Workflow {
|
|
486
|
-
@ObservedState({ redact: true })
|
|
487
|
-
password = 'secret123';
|
|
488
|
-
|
|
489
|
-
@ObservedState()
|
|
490
|
-
username = 'alice';
|
|
491
|
-
|
|
492
|
-
async run() {
|
|
493
|
-
this.snapshotState();
|
|
494
|
-
return this.node.stateSnapshot;
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
const workflow = new TestWorkflow();
|
|
499
|
-
const snapshot = await workflow.run();
|
|
500
|
-
|
|
501
|
-
expect(snapshot?.password).toBe('***');
|
|
502
|
-
expect(snapshot?.username).toBe('alice');
|
|
503
|
-
});
|
|
504
|
-
|
|
505
|
-
it('should hide fields with hidden: true', async () => {
|
|
506
|
-
class TestWorkflow extends Workflow {
|
|
507
|
-
@ObservedState({ hidden: true })
|
|
508
|
-
internalState = 'internal';
|
|
509
|
-
|
|
510
|
-
@ObservedState()
|
|
511
|
-
publicState = 'public';
|
|
512
|
-
|
|
513
|
-
async run() {
|
|
514
|
-
this.snapshotState();
|
|
515
|
-
return this.node.stateSnapshot;
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
const workflow = new TestWorkflow();
|
|
520
|
-
const snapshot = await workflow.run();
|
|
521
|
-
|
|
522
|
-
expect(snapshot).not.toHaveProperty('internalState');
|
|
523
|
-
expect(snapshot).toHaveProperty('publicState', 'public');
|
|
524
|
-
});
|
|
525
|
-
});
|
|
526
|
-
|
|
527
|
-
describe('PRD Section 11: Tree Debugger API', () => {
|
|
528
|
-
it('should implement getTree() method', async () => {
|
|
529
|
-
class TestWorkflow extends Workflow {
|
|
530
|
-
async run() {
|
|
531
|
-
return 'done';
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
const workflow = new TestWorkflow();
|
|
536
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
537
|
-
|
|
538
|
-
const tree = debuggerInstance.getTree();
|
|
539
|
-
expect(tree).toBeDefined();
|
|
540
|
-
expect(tree.id).toBe(workflow.id);
|
|
541
|
-
});
|
|
542
|
-
|
|
543
|
-
it('should implement getNode(id) method', async () => {
|
|
544
|
-
class ChildWorkflow extends Workflow {
|
|
545
|
-
async run() {
|
|
546
|
-
return 'child';
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
class ParentWorkflow extends Workflow {
|
|
551
|
-
@Task()
|
|
552
|
-
async spawnChild() {
|
|
553
|
-
return new ChildWorkflow('Child', this);
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
async run() {
|
|
557
|
-
return this.spawnChild();
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
const workflow = new ParentWorkflow();
|
|
562
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
563
|
-
|
|
564
|
-
await workflow.run();
|
|
565
|
-
|
|
566
|
-
const childNode = debuggerInstance.getNode(workflow.children[0].id);
|
|
567
|
-
expect(childNode).toBeDefined();
|
|
568
|
-
expect(childNode?.name).toBe('Child');
|
|
569
|
-
});
|
|
570
|
-
|
|
571
|
-
it('should provide events Observable', async () => {
|
|
572
|
-
class TestWorkflow extends Workflow {
|
|
573
|
-
async run() {
|
|
574
|
-
return 'done';
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
const workflow = new TestWorkflow();
|
|
579
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
580
|
-
|
|
581
|
-
expect(debuggerInstance.events).toBeDefined();
|
|
582
|
-
expect(debuggerInstance.events.subscribe).toBeDefined();
|
|
583
|
-
});
|
|
584
|
-
|
|
585
|
-
it('should implement toTreeString() method', async () => {
|
|
586
|
-
class TestWorkflow extends Workflow {
|
|
587
|
-
async run() {
|
|
588
|
-
return 'done';
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
const workflow = new TestWorkflow();
|
|
593
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
594
|
-
|
|
595
|
-
const treeString = debuggerInstance.toTreeString();
|
|
596
|
-
expect(typeof treeString).toBe('string');
|
|
597
|
-
expect(treeString.length).toBeGreaterThan(0);
|
|
598
|
-
});
|
|
599
|
-
|
|
600
|
-
it('should implement toLogString() method', async () => {
|
|
601
|
-
class TestWorkflow extends Workflow {
|
|
602
|
-
async run() {
|
|
603
|
-
this.logger.info('Test log message');
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
const workflow = new TestWorkflow();
|
|
608
|
-
const debuggerInstance = new WorkflowTreeDebugger(workflow);
|
|
609
|
-
|
|
610
|
-
await workflow.run();
|
|
611
|
-
|
|
612
|
-
const logString = debuggerInstance.toLogString();
|
|
613
|
-
expect(typeof logString).toBe('string');
|
|
614
|
-
expect(logString).toContain('Test log message');
|
|
615
|
-
});
|
|
616
|
-
});
|
|
617
|
-
|
|
618
|
-
describe('PRD Section 12.2: Workflow Base Class', () => {
|
|
619
|
-
it('should have id, parent, children, and status properties', async () => {
|
|
620
|
-
class TestWorkflow extends Workflow {
|
|
621
|
-
async run() {
|
|
622
|
-
return 'done';
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
const workflow = new TestWorkflow();
|
|
627
|
-
|
|
628
|
-
expect(workflow.id).toBeDefined();
|
|
629
|
-
expect(workflow.parent).toBeDefined();
|
|
630
|
-
expect(workflow.children).toBeDefined();
|
|
631
|
-
expect(workflow.status).toBeDefined();
|
|
632
|
-
});
|
|
633
|
-
|
|
634
|
-
it('should have attachChild method', async () => {
|
|
635
|
-
class ChildWorkflow extends Workflow {
|
|
636
|
-
async run() {
|
|
637
|
-
return 'child';
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
class ParentWorkflow extends Workflow {
|
|
642
|
-
async run() {
|
|
643
|
-
const child = new ChildWorkflow('Child', this);
|
|
644
|
-
expect(workflow.children.length).toBe(1);
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
const workflow = new ParentWorkflow();
|
|
649
|
-
await workflow.run();
|
|
650
|
-
});
|
|
651
|
-
|
|
652
|
-
it('should have snapshotState method', async () => {
|
|
653
|
-
class TestWorkflow extends Workflow {
|
|
654
|
-
async run() {
|
|
655
|
-
this.snapshotState();
|
|
656
|
-
expect(this.node.stateSnapshot).not.toBeNull();
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
const workflow = new TestWorkflow();
|
|
661
|
-
await workflow.run();
|
|
662
|
-
});
|
|
663
|
-
|
|
664
|
-
it('should have setStatus method', async () => {
|
|
665
|
-
class TestWorkflow extends Workflow {
|
|
666
|
-
async run() {
|
|
667
|
-
this.setStatus('running');
|
|
668
|
-
expect(this.status).toBe('running');
|
|
669
|
-
expect(this.node.status).toBe('running');
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
const workflow = new TestWorkflow();
|
|
674
|
-
await workflow.run();
|
|
675
|
-
});
|
|
676
|
-
});
|
|
677
|
-
|
|
678
|
-
describe('PRD: Perfect 1:1 Tree Mirror Requirement', () => {
|
|
679
|
-
it('should maintain perfect tree structure in logs and events', async () => {
|
|
680
|
-
class ChildWorkflow extends Workflow {
|
|
681
|
-
@Step()
|
|
682
|
-
async childStep() {
|
|
683
|
-
this.logger.info('Child step executed');
|
|
684
|
-
return 'child-step-done';
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
async run() {
|
|
688
|
-
return this.childStep();
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
class ParentWorkflow extends Workflow {
|
|
693
|
-
@Step()
|
|
694
|
-
async parentStep() {
|
|
695
|
-
this.logger.info('Parent step executed');
|
|
696
|
-
return 'parent-step-done';
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
@Task()
|
|
700
|
-
async spawnChild() {
|
|
701
|
-
return new ChildWorkflow('Child', this);
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
async run() {
|
|
705
|
-
await this.parentStep();
|
|
706
|
-
await this.spawnChild();
|
|
707
|
-
await this.children[0].run();
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
const workflow = new ParentWorkflow();
|
|
712
|
-
await workflow.run();
|
|
713
|
-
|
|
714
|
-
// Parent should have 1 child
|
|
715
|
-
expect(workflow.children.length).toBe(1);
|
|
716
|
-
expect(workflow.children[0].node.name).toBe('Child');
|
|
717
|
-
|
|
718
|
-
// Parent logs should exist
|
|
719
|
-
expect(workflow.node.logs.length).toBeGreaterThan(0);
|
|
720
|
-
|
|
721
|
-
// Parent events should exist
|
|
722
|
-
expect(workflow.node.events.length).toBeGreaterThan(0);
|
|
723
|
-
|
|
724
|
-
// Child should have logs
|
|
725
|
-
expect(workflow.children[0].node.logs.length).toBeGreaterThan(0);
|
|
726
|
-
|
|
727
|
-
// Child should have events
|
|
728
|
-
expect(workflow.children[0].node.events.length).toBeGreaterThan(0);
|
|
729
|
-
});
|
|
730
|
-
});
|
|
731
|
-
});
|