groundswell 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -9
- package/dist/cache/cache-key.d.ts +86 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +204 -0
- package/dist/cache/cache-key.js.map +1 -0
- package/dist/cache/cache.d.ts +104 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +179 -0
- package/dist/cache/cache.js.map +1 -0
- package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/agent.d.ts +203 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +833 -0
- package/dist/core/agent.js.map +1 -0
- package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +80 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/event-tree.d.ts +72 -0
- package/dist/core/event-tree.d.ts.map +1 -0
- package/dist/core/event-tree.js +211 -0
- package/dist/core/event-tree.js.map +1 -0
- package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +110 -0
- package/dist/core/factory.js.map +1 -0
- package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +50 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +91 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp-handler.d.ts +127 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +323 -0
- package/dist/core/mcp-handler.js.map +1 -0
- package/dist/core/prompt.d.ts +80 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +120 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/workflow-context.d.ts +61 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +358 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +543 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +986 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/debugger/event-replayer.d.ts +422 -0
- package/dist/debugger/event-replayer.d.ts.map +1 -0
- package/dist/debugger/event-replayer.js +639 -0
- package/dist/debugger/event-replayer.js.map +1 -0
- package/dist/debugger/index.d.ts +2 -0
- package/dist/debugger/index.d.ts.map +1 -0
- package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
- package/dist/debugger/index.js.map +1 -0
- package/dist/debugger/tree-debugger.d.ts +240 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +620 -0
- package/dist/debugger/tree-debugger.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/observed-state.d.ts +32 -0
- package/dist/decorators/observed-state.d.ts.map +1 -0
- package/dist/decorators/observed-state.js +79 -0
- package/dist/decorators/observed-state.js.map +1 -0
- package/dist/decorators/step.d.ts +15 -0
- package/dist/decorators/step.d.ts.map +1 -0
- package/dist/decorators/step.js +192 -0
- package/dist/decorators/step.js.map +1 -0
- package/dist/decorators/task.d.ts +50 -0
- package/dist/decorators/task.d.ts.map +1 -0
- package/dist/decorators/task.js +118 -0
- package/dist/decorators/task.js.map +1 -0
- package/dist/examples/index.d.ts +3 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/{src/examples/index.ts → dist/examples/index.js} +1 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/tdd-orchestrator.d.ts +15 -0
- package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
- package/dist/examples/tdd-orchestrator.js +121 -0
- package/dist/examples/tdd-orchestrator.js.map +1 -0
- package/dist/examples/test-cycle-workflow.d.ts +14 -0
- package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
- package/dist/examples/test-cycle-workflow.js +116 -0
- package/dist/examples/test-cycle-workflow.js.map +1 -0
- package/dist/harnesses/claude-code-harness.d.ts +391 -0
- package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
- package/dist/harnesses/claude-code-harness.js +1076 -0
- package/dist/harnesses/claude-code-harness.js.map +1 -0
- package/dist/harnesses/harness-registry.d.ts +440 -0
- package/dist/harnesses/harness-registry.d.ts.map +1 -0
- package/dist/harnesses/harness-registry.js +543 -0
- package/dist/harnesses/harness-registry.js.map +1 -0
- package/dist/harnesses/index.d.ts +12 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +11 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/pi-harness.d.ts +219 -0
- package/dist/harnesses/pi-harness.d.ts.map +1 -0
- package/dist/harnesses/pi-harness.js +676 -0
- package/dist/harnesses/pi-harness.js.map +1 -0
- package/dist/harnesses/pi-schema-converter.d.ts +24 -0
- package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
- package/dist/harnesses/pi-schema-converter.js +81 -0
- package/dist/harnesses/pi-schema-converter.js.map +1 -0
- package/dist/harnesses/register-defaults.d.ts +24 -0
- package/dist/harnesses/register-defaults.d.ts.map +1 -0
- package/dist/harnesses/register-defaults.js +40 -0
- package/dist/harnesses/register-defaults.js.map +1 -0
- package/dist/harnesses/session-store.d.ts +201 -0
- package/dist/harnesses/session-store.d.ts.map +1 -0
- package/dist/harnesses/session-store.js +254 -0
- package/dist/harnesses/session-store.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/reflection/index.d.ts +5 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
- package/dist/reflection/index.js.map +1 -0
- package/dist/reflection/reflection.d.ts +84 -0
- package/dist/reflection/reflection.d.ts.map +1 -0
- package/dist/reflection/reflection.js +344 -0
- package/dist/reflection/reflection.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/introspection.d.ts +165 -0
- package/dist/tools/introspection.d.ts.map +1 -0
- package/dist/tools/introspection.js +324 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/types/agent.d.ts +1317 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +423 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +40 -0
- package/dist/types/decorators.d.ts.map +1 -0
- package/dist/types/decorators.js +2 -0
- package/dist/types/decorators.js.map +1 -0
- package/dist/types/error-strategy.d.ts +13 -0
- package/dist/types/error-strategy.d.ts.map +1 -0
- package/dist/types/error-strategy.js +2 -0
- package/dist/types/error-strategy.js.map +1 -0
- package/dist/types/error.d.ts +20 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +2 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/events.d.ts +113 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/harnesses.d.ts +474 -0
- package/dist/types/harnesses.d.ts.map +1 -0
- package/dist/types/harnesses.js +2 -0
- package/dist/types/harnesses.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logging.d.ts +24 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/observer.d.ts +18 -0
- package/dist/types/observer.d.ts.map +1 -0
- package/dist/types/observer.js +2 -0
- package/dist/types/observer.js.map +1 -0
- package/dist/types/prompt.d.ts +31 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +6 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/providers.d.ts +691 -0
- package/dist/types/providers.d.ts.map +1 -0
- package/dist/types/providers.js +14 -0
- package/dist/types/providers.js.map +1 -0
- package/dist/types/reflection.d.ts +96 -0
- package/dist/types/reflection.d.ts.map +1 -0
- package/dist/types/reflection.js +24 -0
- package/dist/types/reflection.js.map +1 -0
- package/dist/types/restart.d.ts +132 -0
- package/dist/types/restart.d.ts.map +1 -0
- package/dist/types/restart.js +2 -0
- package/dist/types/restart.js.map +1 -0
- package/dist/types/sdk-primitives.d.ts +118 -0
- package/dist/types/sdk-primitives.d.ts.map +1 -0
- package/dist/types/sdk-primitives.js +6 -0
- package/dist/types/sdk-primitives.js.map +1 -0
- package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
- package/dist/types/snapshot.d.ts.map +1 -0
- package/dist/types/snapshot.js +2 -0
- package/dist/types/snapshot.js.map +1 -0
- package/dist/types/streaming.d.ts +194 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/streaming.js +67 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/workflow-context.d.ts +275 -0
- package/dist/types/workflow-context.d.ts.map +1 -0
- package/dist/types/workflow-context.js +8 -0
- package/dist/types/workflow-context.js.map +1 -0
- package/dist/types/workflow.d.ts +30 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/agent-validation.d.ts +88 -0
- package/dist/utils/agent-validation.d.ts.map +1 -0
- package/dist/utils/agent-validation.js +87 -0
- package/dist/utils/agent-validation.js.map +1 -0
- package/dist/utils/delay.d.ts +7 -0
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +9 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/harness-config.d.ts +180 -0
- package/dist/utils/harness-config.d.ts.map +1 -0
- package/dist/utils/harness-config.js +311 -0
- package/dist/utils/harness-config.js.map +1 -0
- package/dist/utils/id.d.ts +6 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +12 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/model-spec.d.ts +110 -0
- package/dist/utils/model-spec.d.ts.map +1 -0
- package/dist/utils/model-spec.js +149 -0
- package/dist/utils/model-spec.js.map +1 -0
- package/dist/utils/observable.d.ts +54 -0
- package/dist/utils/observable.d.ts.map +1 -0
- package/dist/utils/observable.js +82 -0
- package/dist/utils/observable.js.map +1 -0
- package/dist/utils/provider-config.d.ts +10 -0
- package/dist/utils/provider-config.d.ts.map +1 -0
- package/dist/utils/provider-config.js +10 -0
- package/dist/utils/provider-config.js.map +1 -0
- package/dist/utils/restart-analysis.d.ts +202 -0
- package/dist/utils/restart-analysis.d.ts.map +1 -0
- package/dist/utils/restart-analysis.js +426 -0
- package/dist/utils/restart-analysis.js.map +1 -0
- package/dist/utils/session-serialization.d.ts +118 -0
- package/dist/utils/session-serialization.d.ts.map +1 -0
- package/dist/utils/session-serialization.js +217 -0
- package/dist/utils/session-serialization.js.map +1 -0
- package/dist/utils/workflow-error-utils.d.ts +22 -0
- package/dist/utils/workflow-error-utils.d.ts.map +1 -0
- package/dist/utils/workflow-error-utils.js +45 -0
- package/dist/utils/workflow-error-utils.js.map +1 -0
- package/package.json +34 -5
- package/.claude/commands/subtask-planning/prp-base-create.md +0 -120
- package/.claude/commands/subtask-planning/prp-base-execute.md +0 -65
- package/.claude/commands/task-breakdown.md +0 -94
- package/.claude/settings.local.json +0 -9
- package/.claude/system_prompts/task-breakdown.md +0 -101
- package/CHANGELOG.md +0 -188
- package/PRD.md +0 -543
- package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
- package/PRPs/PRDs/002-agent-prompt.md +0 -390
- package/PRPs/PRDs/003-agent-prompt.md +0 -943
- package/PRPs/PRDs/004-agent-prompt.md +0 -1136
- package/PRPs/PRDs/tasks-001.json +0 -492
- package/PRPs/README.md +0 -83
- package/PRPs/templates/prp_base.md +0 -222
- package/docs/agent.md +0 -422
- package/docs/prompt.md +0 -419
- package/docs/workflow.md +0 -600
- package/examples/README.md +0 -258
- package/examples/examples/01-basic-workflow.ts +0 -100
- package/examples/examples/02-decorator-options.ts +0 -217
- package/examples/examples/03-parent-child.ts +0 -241
- package/examples/examples/04-observers-debugger.ts +0 -340
- package/examples/examples/05-error-handling.ts +0 -387
- package/examples/examples/06-concurrent-tasks.ts +0 -352
- package/examples/examples/07-agent-loops.ts +0 -432
- package/examples/examples/08-sdk-features.ts +0 -667
- package/examples/examples/09-reflection.ts +0 -573
- package/examples/examples/10-introspection.ts +0 -550
- package/examples/examples/11-reparenting-workflows.ts +0 -269
- package/examples/index.ts +0 -147
- package/examples/utils/helpers.ts +0 -57
- package/package-lock.json +0 -2398
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +0 -259
- package/plan/001_d3bb02af4886/backlog.json +0 -867
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +0 -484
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +0 -488
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +0 -581
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +0 -687
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +0 -492
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +0 -932
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +0 -1109
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +0 -802
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +0 -603
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +0 -564
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +0 -518
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +0 -1252
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +0 -364
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +0 -205
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +0 -199
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +0 -134
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +0 -495
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +0 -435
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +0 -558
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +0 -788
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +0 -460
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +0 -454
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +0 -520
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +0 -417
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +0 -245
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +0 -792
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +0 -535
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +0 -190
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +0 -654
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +0 -227
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +0 -345
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +0 -193
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +0 -1323
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +0 -1011
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +0 -927
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +0 -505
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +0 -401
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +0 -142
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +0 -112
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +0 -159
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +0 -549
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +0 -368
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +0 -172
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +0 -175
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +0 -696
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +0 -860
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +0 -1066
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +0 -789
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +0 -1098
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +0 -1037
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +0 -916
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +0 -1045
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +0 -890
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +0 -822
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +0 -668
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +0 -706
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +0 -655
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +0 -426
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +0 -316
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +0 -754
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +0 -719
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +0 -215
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +0 -765
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +0 -718
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +0 -149
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +0 -470
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +0 -332
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +0 -167
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +0 -273
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +0 -434
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +0 -717
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +0 -472
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +0 -125
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +0 -301
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +0 -1170
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +0 -940
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +0 -151
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +0 -650
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +0 -259
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +0 -457
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +0 -346
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +0 -311
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +0 -1565
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +0 -288
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +0 -741
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +0 -652
- package/plan/001_d3bb02af4886/docs/PRP/P1P2-PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/P3P4-PRP.md +0 -1388
- package/plan/001_d3bb02af4886/docs/PRP/P4P5-PRP.md +0 -1136
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +0 -415
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +0 -378
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +0 -713
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +0 -370
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +0 -499
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +0 -230
- package/plan/001_d3bb02af4886/docs/architecture/external_deps.md +0 -358
- package/plan/001_d3bb02af4886/docs/architecture/system_context.md +0 -242
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +0 -1134
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +0 -179
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +0 -214
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +0 -529
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +0 -142
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +0 -304
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +0 -558
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +0 -256
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +0 -346
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +0 -415
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +0 -489
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +0 -218
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +0 -380
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +0 -1923
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +0 -319
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +0 -115
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +0 -134
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +0 -153
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +0 -132
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +0 -716
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +0 -186
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +0 -604
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +0 -213
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +0 -30
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +0 -56
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +0 -53
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +0 -49
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +0 -958
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +0 -339
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +0 -305
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +0 -433
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +0 -1574
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +0 -1014
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_BEST_PRACTICES.md +0 -1929
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_CODE_PATTERNS.md +0 -857
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_RESEARCH_INDEX.md +0 -424
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_INDEX.md +0 -291
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_RESEARCH_REPORT.md +0 -1342
- package/plan/001_d3bb02af4886/docs/research/P1P2/RESEARCH_SUMMARY.md +0 -342
- package/plan/001_d3bb02af4886/docs/research/P1P2/anthropic-sdk.md +0 -174
- package/plan/001_d3bb02af4886/docs/research/P1P2/async-local-storage.md +0 -200
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-code-patterns.md +0 -1205
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-decision-matrix.md +0 -421
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-implementation-guide.md +0 -1341
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-integration-guide.md +0 -834
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-patterns.md +0 -1468
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-quick-reference.md +0 -558
- package/plan/001_d3bb02af4886/docs/research/P1P2/zod-schema.md +0 -152
- package/plan/001_d3bb02af4886/docs/research/P3P4/caching-lru.md +0 -116
- package/plan/001_d3bb02af4886/docs/research/P3P4/introspection-tools.md +0 -177
- package/plan/001_d3bb02af4886/docs/research/P3P4/reflection-patterns.md +0 -117
- package/plan/001_d3bb02af4886/docs/research/P4P5/RESEARCH_SUMMARY.md +0 -151
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +0 -376
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +0 -1507
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +0 -949
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +0 -619
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +0 -723
- package/plan/001_d3bb02af4886/docs/research/general/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
- package/plan/001_d3bb02af4886/docs/research/general/README-INTROSPECTION.md +0 -352
- package/plan/001_d3bb02af4886/docs/research/general/agent-introspection-patterns.md +0 -1085
- package/plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md +0 -984
- package/plan/001_d3bb02af4886/docs/research/general/introspection-tool-examples.md +0 -875
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +0 -460
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +0 -324
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +0 -175
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +0 -499
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +0 -163
- package/plan/001_d3bb02af4886/prd_snapshot.md +0 -543
- package/plan/bugfix/BUG_FIX_SUMMARY.md +0 -961
- package/scripts/generate-llms-full.ts +0 -206
- package/src/__tests__/adversarial/attachChild-performance.test.ts +0 -216
- package/src/__tests__/adversarial/circular-reference.test.ts +0 -101
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +0 -139
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +0 -571
- package/src/__tests__/adversarial/deep-analysis.test.ts +0 -729
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +0 -213
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +0 -448
- package/src/__tests__/adversarial/edge-case.test.ts +0 -703
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +0 -760
- package/src/__tests__/adversarial/incremental-performance.test.ts +0 -140
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +0 -457
- package/src/__tests__/adversarial/observer-propagation.test.ts +0 -487
- package/src/__tests__/adversarial/parent-validation.test.ts +0 -143
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +0 -611
- package/src/__tests__/adversarial/prd-compliance.test.ts +0 -731
- package/src/__tests__/compatibility/backward-compatibility.test.ts +0 -1572
- package/src/__tests__/helpers/index.ts +0 -18
- package/src/__tests__/helpers/tree-verification.ts +0 -257
- package/src/__tests__/integration/agent-workflow.test.ts +0 -256
- package/src/__tests__/integration/bidirectional-consistency.test.ts +0 -847
- package/src/__tests__/integration/observer-logging.test.ts +0 -643
- package/src/__tests__/integration/tree-mirroring.test.ts +0 -151
- package/src/__tests__/integration/workflow-reparenting.test.ts +0 -303
- package/src/__tests__/unit/agent.test.ts +0 -169
- package/src/__tests__/unit/cache-key.test.ts +0 -182
- package/src/__tests__/unit/cache.test.ts +0 -172
- package/src/__tests__/unit/context.test.ts +0 -217
- package/src/__tests__/unit/decorators.test.ts +0 -100
- package/src/__tests__/unit/introspection-tools.test.ts +0 -277
- package/src/__tests__/unit/logger.test.ts +0 -293
- package/src/__tests__/unit/observable.test.ts +0 -321
- package/src/__tests__/unit/prompt.test.ts +0 -135
- package/src/__tests__/unit/reflection.test.ts +0 -210
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +0 -170
- package/src/__tests__/unit/tree-debugger.test.ts +0 -85
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +0 -209
- package/src/__tests__/unit/workflow-detachChild.test.ts +0 -100
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +0 -153
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +0 -180
- package/src/__tests__/unit/workflow.test.ts +0 -357
- package/src/cache/cache-key.ts +0 -244
- package/src/cache/cache.ts +0 -236
- package/src/core/agent.ts +0 -593
- package/src/core/event-tree.ts +0 -260
- package/src/core/logger.ts +0 -112
- package/src/core/mcp-handler.ts +0 -184
- package/src/core/prompt.ts +0 -150
- package/src/core/workflow-context.ts +0 -351
- package/src/core/workflow.ts +0 -540
- package/src/debugger/tree-debugger.ts +0 -255
- package/src/decorators/observed-state.ts +0 -95
- package/src/decorators/step.ts +0 -139
- package/src/decorators/task.ts +0 -159
- package/src/examples/tdd-orchestrator.ts +0 -65
- package/src/examples/test-cycle-workflow.ts +0 -64
- package/src/index.ts +0 -142
- package/src/reflection/reflection.ts +0 -407
- package/src/tools/index.ts +0 -36
- package/src/tools/introspection.ts +0 -464
- package/src/types/agent.ts +0 -90
- package/src/types/decorators.ts +0 -32
- package/src/types/error-strategy.ts +0 -13
- package/src/types/error.ts +0 -20
- package/src/types/events.ts +0 -75
- package/src/types/index.ts +0 -55
- package/src/types/logging.ts +0 -24
- package/src/types/observer.ts +0 -18
- package/src/types/prompt.ts +0 -40
- package/src/types/reflection.ts +0 -117
- package/src/types/sdk-primitives.ts +0 -128
- package/src/types/workflow-context.ts +0 -163
- package/src/types/workflow.ts +0 -37
- package/src/utils/id.ts +0 -11
- package/src/utils/index.ts +0 -4
- package/src/utils/observable.ts +0 -106
- package/src/utils/workflow-error-utils.ts +0 -56
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -16
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error analysis utilities for step restart decisions
|
|
3
|
+
*
|
|
4
|
+
* Provides pure, side-effect-free functions for analyzing WorkflowError instances
|
|
5
|
+
* to determine if a step should be restarted, with structured restart analysis
|
|
6
|
+
* including reason, suggested action, and success probability estimation.
|
|
7
|
+
*
|
|
8
|
+
* @module restart-analysis
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Transient error codes that typically indicate temporary failures
|
|
12
|
+
*
|
|
13
|
+
* These errors are usually resolved by retrying the operation after a delay.
|
|
14
|
+
* The constant uses const assertion for type safety and better TypeScript inference.
|
|
15
|
+
*
|
|
16
|
+
* **Error Categories:**
|
|
17
|
+
* - `TIMEOUT`: Operation timed out waiting for response
|
|
18
|
+
* - `RATE_LIMIT`: API rate limit exceeded (HTTP 429)
|
|
19
|
+
* - `NETWORK_ERROR`: Network connectivity issues
|
|
20
|
+
* - `SERVICE_UNAVAILABLE`: Service temporarily unavailable (HTTP 503)
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* if (TRANSIENT_ERROR_SET.has('TIMEOUT')) {
|
|
25
|
+
* // This is a transient error, safe to retry
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
const TRANSIENT_ERROR_CODES = [
|
|
30
|
+
'TIMEOUT',
|
|
31
|
+
'RATE_LIMIT',
|
|
32
|
+
'NETWORK_ERROR',
|
|
33
|
+
'SERVICE_UNAVAILABLE',
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Set-based lookup for O(1) transient error code checking
|
|
37
|
+
*
|
|
38
|
+
* Using a Set provides constant-time lookup performance compared to
|
|
39
|
+
* array includes() which is O(n). This is important for hot paths
|
|
40
|
+
* in retry logic.
|
|
41
|
+
*/
|
|
42
|
+
const TRANSIENT_ERROR_SET = new Set(TRANSIENT_ERROR_CODES);
|
|
43
|
+
/**
|
|
44
|
+
* Check if an error is a transient (temporary) error
|
|
45
|
+
*
|
|
46
|
+
* Transient errors are temporary faults that typically resolve themselves
|
|
47
|
+
* quickly without intervention. These are safe to retry with a high
|
|
48
|
+
* probability of success.
|
|
49
|
+
*
|
|
50
|
+
* **Detection Strategy:**
|
|
51
|
+
* 1. Check error.message against transient error codes (most reliable)
|
|
52
|
+
* 2. WorkflowError doesn't have a 'code' property, so message is used as fallback
|
|
53
|
+
*
|
|
54
|
+
* @param error - The WorkflowError to analyze
|
|
55
|
+
* @returns `true` if the error is transient and should be retried
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const error: WorkflowError = {
|
|
60
|
+
* message: 'TIMEOUT',
|
|
61
|
+
* original: new Error('Request timeout'),
|
|
62
|
+
* workflowId: 'wf-123',
|
|
63
|
+
* state: {},
|
|
64
|
+
* logs: []
|
|
65
|
+
* };
|
|
66
|
+
*
|
|
67
|
+
* if (isTransientError(error)) {
|
|
68
|
+
* // Safe to retry with high success probability
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @remarks
|
|
73
|
+
* **Gotcha:** WorkflowError interface doesn't have a 'code' property,
|
|
74
|
+
* so this function uses error.message as fallback. This is consistent
|
|
75
|
+
* with the pattern used in src/decorators/step.ts:48.
|
|
76
|
+
*/
|
|
77
|
+
function isTransientError(error) {
|
|
78
|
+
// GOTCHA: WorkflowError doesn't have 'code' property
|
|
79
|
+
// Use error.message as fallback (consistent with step decorator pattern)
|
|
80
|
+
const errorCode = error.message;
|
|
81
|
+
return TRANSIENT_ERROR_CODES.includes(errorCode);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if an error matches a specific error criterion
|
|
85
|
+
*
|
|
86
|
+
* Handles all three ErrorCriterion variants:
|
|
87
|
+
* 1. **By error code** - Exact string match or regex pattern matching
|
|
88
|
+
* 2. **By recoverable flag** - Match recoverable vs non-recoverable errors
|
|
89
|
+
* 3. **Custom predicate** - Function for complex matching logic
|
|
90
|
+
*
|
|
91
|
+
* **CRITICAL:** Function criteria MUST be checked first at runtime.
|
|
92
|
+
* Functions can have properties in JavaScript, so discriminant checks like
|
|
93
|
+
* `'code' in criterion` will return `true` for functions with a `code` property,
|
|
94
|
+
* breaking type narrowing.
|
|
95
|
+
*
|
|
96
|
+
* @param error - The WorkflowError to check against the criterion
|
|
97
|
+
* @param criterion - The ErrorCriterion to match against
|
|
98
|
+
* @returns `true` if the error matches the criterion
|
|
99
|
+
*
|
|
100
|
+
* @example String code matching
|
|
101
|
+
* ```ts
|
|
102
|
+
* const criterion: ErrorCriterion = { code: 'TIMEOUT' };
|
|
103
|
+
* const error: WorkflowError = { message: 'TIMEOUT', ... };
|
|
104
|
+
* matchesCriterion(error, criterion); // true
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* @example Regex code matching
|
|
108
|
+
* ```ts
|
|
109
|
+
* const criterion: ErrorCriterion = { code: /TIMEOUT|NETWORK_ERROR/ };
|
|
110
|
+
* const error: WorkflowError = { message: 'TIMEOUT', ... };
|
|
111
|
+
* matchesCriterion(error, criterion); // true
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* @example Recoverable flag matching
|
|
115
|
+
* ```ts
|
|
116
|
+
* const criterion: ErrorCriterion = { recoverable: true };
|
|
117
|
+
* const error: WorkflowError = {
|
|
118
|
+
* message: 'Temporary failure',
|
|
119
|
+
* original: { recoverable: true },
|
|
120
|
+
* ...
|
|
121
|
+
* };
|
|
122
|
+
* matchesCriterion(error, criterion); // true
|
|
123
|
+
* ```
|
|
124
|
+
*
|
|
125
|
+
* @example Custom predicate
|
|
126
|
+
* ```ts
|
|
127
|
+
* const criterion: ErrorCriterion = (error) => {
|
|
128
|
+
* return error.message.includes('timeout') ||
|
|
129
|
+
* error.message.includes('network');
|
|
130
|
+
* };
|
|
131
|
+
* matchesCriterion(error, criterion); // true if message contains keywords
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
134
|
+
* @remarks
|
|
135
|
+
* **Runtime Safety Pattern:**
|
|
136
|
+
* ```ts
|
|
137
|
+
* // CORRECT: Check function FIRST
|
|
138
|
+
* if (typeof criterion === 'function') {
|
|
139
|
+
* return criterion(error);
|
|
140
|
+
* }
|
|
141
|
+
* // Now safe to use discriminant checks
|
|
142
|
+
* if ('code' in criterion) { ... }
|
|
143
|
+
* ```
|
|
144
|
+
*
|
|
145
|
+
* **Why this matters:**
|
|
146
|
+
* ```ts
|
|
147
|
+
* const func = () => true;
|
|
148
|
+
* func.code = 'TIMEOUT'; // Functions can have properties!
|
|
149
|
+
* 'code' in func // true! (TypeScript would incorrectly narrow type)
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
function matchesCriterion(error, criterion) {
|
|
153
|
+
// CRITICAL: Check typeof first for function type narrowing
|
|
154
|
+
// Functions can have properties, breaking discriminant checks
|
|
155
|
+
if (typeof criterion === 'function') {
|
|
156
|
+
return criterion(error);
|
|
157
|
+
}
|
|
158
|
+
// Object type checks (type narrowing works after typeof check)
|
|
159
|
+
if ('code' in criterion) {
|
|
160
|
+
// GOTCHA: Use error.message as fallback for error.code
|
|
161
|
+
// WorkflowError doesn't have a code property (step.ts:48 pattern)
|
|
162
|
+
const errorCode = error.message;
|
|
163
|
+
return typeof criterion.code === 'string'
|
|
164
|
+
? errorCode === criterion.code
|
|
165
|
+
: criterion.code.test(errorCode);
|
|
166
|
+
}
|
|
167
|
+
if ('recoverable' in criterion) {
|
|
168
|
+
// Check error.original for recoverable property
|
|
169
|
+
const original = error.original;
|
|
170
|
+
if (original && 'recoverable' in original) {
|
|
171
|
+
return original.recoverable === criterion.recoverable;
|
|
172
|
+
}
|
|
173
|
+
// If no recoverable field, default to true for backward compatibility
|
|
174
|
+
return criterion.recoverable;
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Estimate the probability of success for a retry attempt
|
|
180
|
+
*
|
|
181
|
+
* Returns a value between 0.0 and 1.0 indicating the likelihood that
|
|
182
|
+
* retrying the operation will succeed.
|
|
183
|
+
*
|
|
184
|
+
* **Probability Interpretation:**
|
|
185
|
+
* - `0.0 - 0.3`: Low probability - consider abort or rebuild
|
|
186
|
+
* - `0.4 - 0.6`: Moderate probability - retry with caution
|
|
187
|
+
* - `0.7 - 1.0`: High probability - safe to retry
|
|
188
|
+
*
|
|
189
|
+
* **Estimation Strategy:**
|
|
190
|
+
* 1. Transient errors: 0.8 (high probability - these typically resolve)
|
|
191
|
+
* 2. Permanent errors (auth, validation): 0.0 (no chance - won't fix themselves)
|
|
192
|
+
* 3. Unknown errors: 0.5 (moderate probability - best effort guess)
|
|
193
|
+
*
|
|
194
|
+
* @param error - The WorkflowError to analyze
|
|
195
|
+
* @returns Success probability estimate (0.0 to 1.0)
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* ```ts
|
|
199
|
+
* const timeoutError: WorkflowError = { message: 'TIMEOUT', ... };
|
|
200
|
+
* estimateSuccessProbability(timeoutError); // 0.8 (high)
|
|
201
|
+
*
|
|
202
|
+
* const authError: WorkflowError = { message: 'UNAUTHORIZED', ... };
|
|
203
|
+
* estimateSuccessProbability(authError); // 0.0 (none)
|
|
204
|
+
*
|
|
205
|
+
* const unknownError: WorkflowError = { message: 'UNKNOWN_ERROR', ... };
|
|
206
|
+
* estimateSuccessProbability(unknownError); // 0.5 (moderate)
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
function estimateSuccessProbability(error) {
|
|
210
|
+
// Check if transient error first
|
|
211
|
+
if (isTransientError(error)) {
|
|
212
|
+
return 0.8; // High probability for transient errors
|
|
213
|
+
}
|
|
214
|
+
// Check error message for permanent error patterns
|
|
215
|
+
const msg = error.message.toLowerCase();
|
|
216
|
+
if (msg.includes('unauthorized') ||
|
|
217
|
+
msg.includes('forbidden') ||
|
|
218
|
+
msg.includes('invalid') ||
|
|
219
|
+
msg.includes('authentication') ||
|
|
220
|
+
msg.includes('auth')) {
|
|
221
|
+
return 0.0; // No chance for auth/validation errors
|
|
222
|
+
}
|
|
223
|
+
// Default: moderate probability
|
|
224
|
+
return 0.5;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Analyze a WorkflowError to determine if a step should be restarted
|
|
228
|
+
*
|
|
229
|
+
* This is a pure, side-effect-free function that provides intelligent error
|
|
230
|
+
* analysis for step retry decisions. It returns a structured `RestartAnalysis`
|
|
231
|
+
* object with the restart decision, reasoning, suggested action, and success
|
|
232
|
+
* probability estimation.
|
|
233
|
+
*
|
|
234
|
+
* **Analysis Flow:**
|
|
235
|
+
* 1. Check `error.original?.recoverable` - if `false`, return abort immediately
|
|
236
|
+
* 2. Check if error is transient - if yes, return retry with high probability
|
|
237
|
+
* 3. If `stepOptions.retryOn` provided, iterate through criteria
|
|
238
|
+
* 4. For each criterion, call `matchesCriterion(error, criterion)`
|
|
239
|
+
* 5. If any criterion matches, return restart with analysis
|
|
240
|
+
* 6. Default: return no restart with abort action
|
|
241
|
+
*
|
|
242
|
+
* **Pure Function Guarantee:**
|
|
243
|
+
* - Deterministic: Same input always produces same output
|
|
244
|
+
* - No side effects: Doesn't modify inputs or external state
|
|
245
|
+
* - No external dependencies: Doesn't use Date.now(), Math.random(), etc.
|
|
246
|
+
*
|
|
247
|
+
* @param error - The WorkflowError to analyze
|
|
248
|
+
* @param stepOptions - Optional step configuration with retry criteria
|
|
249
|
+
* @returns Structured restart analysis with decision and reasoning
|
|
250
|
+
*
|
|
251
|
+
* @example Transient error - automatic restart
|
|
252
|
+
* ```ts
|
|
253
|
+
* const error: WorkflowError = {
|
|
254
|
+
* message: 'TIMEOUT',
|
|
255
|
+
* original: new Error('Request timeout'),
|
|
256
|
+
* workflowId: 'wf-123',
|
|
257
|
+
* state: {},
|
|
258
|
+
* logs: []
|
|
259
|
+
* };
|
|
260
|
+
*
|
|
261
|
+
* const analysis = analyzeErrorForRestart(error);
|
|
262
|
+
* // Returns:
|
|
263
|
+
* // {
|
|
264
|
+
* // shouldRestart: true,
|
|
265
|
+
* // reason: 'Transient error detected: TIMEOUT',
|
|
266
|
+
* // suggestedAction: 'retry',
|
|
267
|
+
* // estimatedSuccessProbability: 0.8
|
|
268
|
+
* // }
|
|
269
|
+
* ```
|
|
270
|
+
*
|
|
271
|
+
* @example Non-recoverable error - abort
|
|
272
|
+
* ```ts
|
|
273
|
+
* const error: WorkflowError = {
|
|
274
|
+
* message: 'Invalid configuration',
|
|
275
|
+
* original: { recoverable: false },
|
|
276
|
+
* workflowId: 'wf-123',
|
|
277
|
+
* state: {},
|
|
278
|
+
* logs: []
|
|
279
|
+
* };
|
|
280
|
+
*
|
|
281
|
+
* const analysis = analyzeErrorForRestart(error);
|
|
282
|
+
* // Returns:
|
|
283
|
+
* // {
|
|
284
|
+
* // shouldRestart: false,
|
|
285
|
+
* // reason: 'Error is marked as non-recoverable: Invalid configuration',
|
|
286
|
+
* // suggestedAction: 'abort',
|
|
287
|
+
* // estimatedSuccessProbability: 0.0
|
|
288
|
+
* // }
|
|
289
|
+
* ```
|
|
290
|
+
*
|
|
291
|
+
* @example Custom retry criteria
|
|
292
|
+
* ```ts
|
|
293
|
+
* const error: WorkflowError = {
|
|
294
|
+
* message: 'ETIMEDOUT',
|
|
295
|
+
* original: new Error('Connection timeout'),
|
|
296
|
+
* workflowId: 'wf-123',
|
|
297
|
+
* state: {},
|
|
298
|
+
* logs: []
|
|
299
|
+
* };
|
|
300
|
+
*
|
|
301
|
+
* const stepOptions = {
|
|
302
|
+
* retryOn: [
|
|
303
|
+
* { code: 'ETIMEDOUT' },
|
|
304
|
+
* { code: /NETWORK_ERROR/ },
|
|
305
|
+
* { recoverable: true }
|
|
306
|
+
* ]
|
|
307
|
+
* };
|
|
308
|
+
*
|
|
309
|
+
* const analysis = analyzeErrorForRestart(error, stepOptions);
|
|
310
|
+
* // Returns:
|
|
311
|
+
* // {
|
|
312
|
+
* // shouldRestart: true,
|
|
313
|
+
* // reason: 'Error matches retry criteria: ETIMEDOUT',
|
|
314
|
+
* // suggestedAction: 'retry',
|
|
315
|
+
* // estimatedSuccessProbability: 0.5
|
|
316
|
+
* // }
|
|
317
|
+
* ```
|
|
318
|
+
*
|
|
319
|
+
* @example No matching criteria - default abort
|
|
320
|
+
* ```ts
|
|
321
|
+
* const error: WorkflowError = {
|
|
322
|
+
* message: 'AUTH_FAILED',
|
|
323
|
+
* original: new Error('Authentication failed'),
|
|
324
|
+
* workflowId: 'wf-123',
|
|
325
|
+
* state: {},
|
|
326
|
+
* logs: []
|
|
327
|
+
* };
|
|
328
|
+
*
|
|
329
|
+
* const stepOptions = {
|
|
330
|
+
* retryOn: [{ code: 'TIMEOUT' }]
|
|
331
|
+
* };
|
|
332
|
+
*
|
|
333
|
+
* const analysis = analyzeErrorForRestart(error, stepOptions);
|
|
334
|
+
* // Returns:
|
|
335
|
+
* // {
|
|
336
|
+
* // shouldRestart: false,
|
|
337
|
+
* // reason: 'No matching retry criteria for error: AUTH_FAILED',
|
|
338
|
+
* // suggestedAction: 'abort',
|
|
339
|
+
* // estimatedSuccessProbability: 0.0
|
|
340
|
+
* // }
|
|
341
|
+
* ```
|
|
342
|
+
*
|
|
343
|
+
* @remarks
|
|
344
|
+
* **Integration with @Step Decorator:**
|
|
345
|
+
* This function is designed to be used by the @Step decorator's retry loop
|
|
346
|
+
* (src/decorators/step.ts:115-228) to provide structured analysis for
|
|
347
|
+
* stepRetry events.
|
|
348
|
+
*
|
|
349
|
+
* **ErrorCriterion Pattern:**
|
|
350
|
+
* The function follows the existing pattern in src/decorators/step.ts:40-65
|
|
351
|
+
* for matching criteria against errors.
|
|
352
|
+
*
|
|
353
|
+
* **Gotchas:**
|
|
354
|
+
* - WorkflowError doesn't have a 'code' property - uses message as fallback
|
|
355
|
+
* - Always check `typeof criterion === 'function'` FIRST for type safety
|
|
356
|
+
* - Check error.original?.recoverable for recoverable flag
|
|
357
|
+
*
|
|
358
|
+
* @see {@link RestartAnalysis} - Return type structure
|
|
359
|
+
* @see {@link ErrorCriterion} - Retry criterion types
|
|
360
|
+
* @see {@link WorkflowError} - Input error type
|
|
361
|
+
*/
|
|
362
|
+
export function analyzeErrorForRestart(error, stepOptions) {
|
|
363
|
+
// STEP 1: Check recoverable flag (if available)
|
|
364
|
+
const original = error.original;
|
|
365
|
+
if (original && 'recoverable' in original && !original.recoverable) {
|
|
366
|
+
return {
|
|
367
|
+
shouldRestart: false,
|
|
368
|
+
reason: `Error is marked as non-recoverable: ${error.message}`,
|
|
369
|
+
suggestedAction: 'abort',
|
|
370
|
+
estimatedSuccessProbability: 0.0,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
// STEP 2: Check if transient error
|
|
374
|
+
if (isTransientError(error)) {
|
|
375
|
+
return {
|
|
376
|
+
shouldRestart: true,
|
|
377
|
+
reason: `Transient error detected: ${error.message}`,
|
|
378
|
+
suggestedAction: 'retry',
|
|
379
|
+
estimatedSuccessProbability: 0.8,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
// STEP 3: Check retry criteria if provided
|
|
383
|
+
if (stepOptions?.retryOn && stepOptions.retryOn.length > 0) {
|
|
384
|
+
for (const criterion of stepOptions.retryOn) {
|
|
385
|
+
if (matchesCriterion(error, criterion)) {
|
|
386
|
+
return {
|
|
387
|
+
shouldRestart: true,
|
|
388
|
+
reason: `Error matches retry criteria: ${error.message}`,
|
|
389
|
+
suggestedAction: 'retry',
|
|
390
|
+
estimatedSuccessProbability: estimateSuccessProbability(error),
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// STEP 4: Default: no restart
|
|
396
|
+
return {
|
|
397
|
+
shouldRestart: false,
|
|
398
|
+
reason: `No matching retry criteria for error: ${error.message}`,
|
|
399
|
+
suggestedAction: 'abort',
|
|
400
|
+
estimatedSuccessProbability: 0.0,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Transient error codes constant
|
|
405
|
+
*
|
|
406
|
+
* Exported for testing and external use. Use TRANSIENT_ERROR_SET
|
|
407
|
+
* for O(1) lookup performance.
|
|
408
|
+
*
|
|
409
|
+
* @example
|
|
410
|
+
* ```ts
|
|
411
|
+
* import { TRANSIENT_ERROR_CODES } from './restart-analysis.js';
|
|
412
|
+
*
|
|
413
|
+
* if (TRANSIENT_ERROR_CODES.includes('TIMEOUT')) {
|
|
414
|
+
* // Handle transient error
|
|
415
|
+
* }
|
|
416
|
+
* ```
|
|
417
|
+
*/
|
|
418
|
+
export { TRANSIENT_ERROR_CODES };
|
|
419
|
+
/**
|
|
420
|
+
* Transient error code set for O(1) lookup
|
|
421
|
+
*
|
|
422
|
+
* Exported for testing and external use. Prefer this over
|
|
423
|
+
* TRANSIENT_ERROR_CODES for performance-critical code.
|
|
424
|
+
*/
|
|
425
|
+
export { TRANSIENT_ERROR_SET };
|
|
426
|
+
//# sourceMappingURL=restart-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-analysis.js","sourceRoot":"","sources":["../../src/utils/restart-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session serialization utilities
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
* @remarks
|
|
6
|
+
* Provides safe serialization/deserialization of SessionState objects
|
|
7
|
+
* containing SDK message types with circular reference handling.
|
|
8
|
+
*
|
|
9
|
+
* Handles edge cases including:
|
|
10
|
+
* - Circular references from application code
|
|
11
|
+
* - Non-serializable values (functions, Symbols)
|
|
12
|
+
* - Unknown type fields in SDK messages
|
|
13
|
+
* - Type validation during deserialization
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { serializeSession, deserializeSession } from 'groundswell';
|
|
18
|
+
*
|
|
19
|
+
* const state: SessionState = { history: [], lastResult: null };
|
|
20
|
+
* const json = serializeSession(state);
|
|
21
|
+
* const restored = deserializeSession(json);
|
|
22
|
+
* console.log(restored); // { history: [], lastResult: null }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import type { SessionState } from "../types/providers.js";
|
|
26
|
+
/**
|
|
27
|
+
* Error thrown when session serialization fails
|
|
28
|
+
*
|
|
29
|
+
* @remarks
|
|
30
|
+
* Provides detailed error context for debugging serialization issues.
|
|
31
|
+
* Includes the property path and value that caused the failure.
|
|
32
|
+
*
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
35
|
+
export declare class SessionSerializationError extends Error {
|
|
36
|
+
readonly path: string;
|
|
37
|
+
readonly value: unknown;
|
|
38
|
+
/**
|
|
39
|
+
* Creates a new SessionSerializationError
|
|
40
|
+
*
|
|
41
|
+
* @param message - Human-readable error message
|
|
42
|
+
* @param path - Property path where the error occurred (e.g., "history.0.tool_use_result")
|
|
43
|
+
* @param value - The value that caused the serialization failure
|
|
44
|
+
*/
|
|
45
|
+
constructor(message: string, path: string, value: unknown);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Serialize a SessionState to JSON string
|
|
49
|
+
*
|
|
50
|
+
* @remarks
|
|
51
|
+
* Converts a SessionState object to a JSON string with special handling
|
|
52
|
+
* for non-serializable values and circular references. The resulting JSON
|
|
53
|
+
* is pretty-printed with 2-space indentation for readability.
|
|
54
|
+
*
|
|
55
|
+
* Handles edge cases from SDK message types:
|
|
56
|
+
* - `SDKUserMessage.tool_use_result` (unknown type)
|
|
57
|
+
* - `SDKResultMessage.result` (unknown type)
|
|
58
|
+
* - `SDKResultMessage.structured_output` (unknown type)
|
|
59
|
+
*
|
|
60
|
+
* Throws {@link SessionSerializationError} if serialization fails,
|
|
61
|
+
* with contextual information about the failure.
|
|
62
|
+
*
|
|
63
|
+
* @param state - The session state to serialize
|
|
64
|
+
* @returns JSON string representation of the session
|
|
65
|
+
* @throws {SessionSerializationError} If serialization fails
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* import { serializeSession, deserializeSession } from 'groundswell';
|
|
70
|
+
*
|
|
71
|
+
* const state: SessionState = {
|
|
72
|
+
* history: [],
|
|
73
|
+
* lastResult: null
|
|
74
|
+
* };
|
|
75
|
+
*
|
|
76
|
+
* const json = serializeSession(state);
|
|
77
|
+
* console.log(json); // Pretty-printed JSON string
|
|
78
|
+
*
|
|
79
|
+
* // Round-trip serialization
|
|
80
|
+
* const restored = deserializeSession(json);
|
|
81
|
+
* expect(restored).toEqual(state);
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare function serializeSession(state: SessionState): string;
|
|
85
|
+
/**
|
|
86
|
+
* Reconstruct a SessionState from JSON string
|
|
87
|
+
*
|
|
88
|
+
* @remarks
|
|
89
|
+
* Parses a JSON string and validates that it has the correct SessionState
|
|
90
|
+
* structure. Performs runtime type validation to ensure data integrity
|
|
91
|
+
* and catch corrupted or malformed session data early.
|
|
92
|
+
*
|
|
93
|
+
* Throws {@link SessionSerializationError} if deserialization fails or
|
|
94
|
+
* if the data doesn't match the expected SessionState structure.
|
|
95
|
+
*
|
|
96
|
+
* @param data - JSON string representation of the session
|
|
97
|
+
* @returns Reconstructed SessionState object
|
|
98
|
+
* @throws {SessionSerializationError} If deserialization fails or data is invalid
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* import { serializeSession, deserializeSession } from 'groundswell';
|
|
103
|
+
*
|
|
104
|
+
* const state: SessionState = {
|
|
105
|
+
* history: [],
|
|
106
|
+
* lastResult: null
|
|
107
|
+
* };
|
|
108
|
+
*
|
|
109
|
+
* const json = serializeSession(state);
|
|
110
|
+
* const restored = deserializeSession(json);
|
|
111
|
+
*
|
|
112
|
+
* // Round-trip equality test
|
|
113
|
+
* expect(restored.history).toEqual(state.history);
|
|
114
|
+
* expect(restored.lastResult).toEqual(state.lastResult);
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export declare function deserializeSession(data: string): SessionState;
|
|
118
|
+
//# sourceMappingURL=session-serialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-serialization.d.ts","sourceRoot":"","sources":["../../src/utils/session-serialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;;;GAQG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;aAUhC,IAAI,EAAE,MAAM;aACZ,KAAK,EAAE,OAAO;IAVhC;;;;;;OAMG;gBAED,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO;CAKjC;AAwFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAY5D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAmB7D"}
|