groundswell 0.0.1 → 0.0.2
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/.claude/commands/subtask-planning/prp-base-create.md +120 -0
- package/.claude/commands/subtask-planning/prp-base-execute.md +65 -0
- package/.claude/commands/task-breakdown.md +94 -0
- package/.claude/system_prompts/task-breakdown.md +1 -0
- package/CHANGELOG.md +188 -0
- package/PRD.md +543 -0
- package/README.md +99 -5
- package/examples/README.md +15 -1
- package/examples/examples/11-reparenting-workflows.ts +269 -0
- package/examples/index.ts +4 -0
- package/package-lock.json +2398 -0
- package/package.json +3 -1
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +259 -0
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +484 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +488 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +581 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +687 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +492 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +932 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +1109 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +802 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +603 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +564 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +518 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +1252 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +364 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +114 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +205 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +199 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +134 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +495 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +435 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +506 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +612 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +558 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +788 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +460 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +454 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +520 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +417 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +760 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +245 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +792 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +535 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +190 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +654 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +227 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +345 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +193 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +1323 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +1011 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +927 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +505 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +401 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +142 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +112 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +159 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +549 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +368 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +172 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +175 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +696 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +860 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +1066 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +1103 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +789 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +1098 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +1037 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +916 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +1045 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +890 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +822 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +668 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +706 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +265 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +655 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +1103 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +426 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +506 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +114 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +316 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +754 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +612 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +719 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +215 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +765 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +718 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +149 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +470 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +332 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +167 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +265 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +273 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +760 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +434 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +717 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +472 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +125 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +301 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +1170 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +940 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +151 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +650 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +259 -0
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +457 -0
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +346 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +311 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +1565 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +288 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +741 -0
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +652 -0
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +527 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +415 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +378 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +713 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +370 -0
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +499 -0
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +230 -0
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +1134 -0
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +179 -0
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +629 -0
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +214 -0
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +629 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +529 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +142 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +304 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +558 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +256 -0
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +346 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +415 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +489 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +218 -0
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +380 -0
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +1923 -0
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +319 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +115 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +134 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +153 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +132 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +716 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +186 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +604 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +213 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +30 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +56 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +53 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +49 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +958 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +339 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +305 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +433 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +1574 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +1014 -0
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +376 -0
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +1507 -0
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +949 -0
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +619 -0
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +723 -0
- package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-security-guide.md +56 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +460 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +324 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +175 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +499 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +163 -0
- package/plan/bugfix/BUG_FIX_SUMMARY.md +961 -0
- package/src/__tests__/adversarial/attachChild-performance.test.ts +216 -0
- package/src/__tests__/adversarial/circular-reference.test.ts +101 -0
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +139 -0
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +571 -0
- package/src/__tests__/adversarial/deep-analysis.test.ts +729 -0
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +213 -0
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +448 -0
- package/src/__tests__/adversarial/edge-case.test.ts +703 -0
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +760 -0
- package/src/__tests__/adversarial/incremental-performance.test.ts +140 -0
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +457 -0
- package/src/__tests__/adversarial/observer-propagation.test.ts +487 -0
- package/src/__tests__/adversarial/parent-validation.test.ts +143 -0
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +611 -0
- package/src/__tests__/adversarial/prd-compliance.test.ts +731 -0
- package/src/__tests__/compatibility/backward-compatibility.test.ts +1572 -0
- package/src/__tests__/helpers/index.ts +18 -0
- package/src/__tests__/helpers/tree-verification.ts +257 -0
- package/src/__tests__/integration/bidirectional-consistency.test.ts +847 -0
- package/src/__tests__/integration/observer-logging.test.ts +643 -0
- package/src/__tests__/integration/tree-mirroring.test.ts +37 -0
- package/src/__tests__/integration/workflow-reparenting.test.ts +303 -0
- package/src/__tests__/unit/context.test.ts +79 -0
- package/src/__tests__/unit/logger.test.ts +293 -0
- package/src/__tests__/unit/observable.test.ts +321 -0
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +170 -0
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +209 -0
- package/src/__tests__/unit/workflow-detachChild.test.ts +100 -0
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +153 -0
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +180 -0
- package/src/__tests__/unit/workflow.test.ts +277 -1
- package/src/core/agent.ts +21 -1
- package/src/core/logger.ts +27 -2
- package/src/core/workflow-context.ts +6 -4
- package/src/core/workflow.ts +252 -14
- package/src/debugger/tree-debugger.ts +52 -7
- package/src/decorators/task.ts +65 -2
- package/src/index.ts +4 -2
- package/src/types/decorators.ts +8 -1
- package/src/types/events.ts +1 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/observable.ts +32 -3
- package/src/utils/workflow-error-utils.ts +56 -0
- package/tsconfig.json +1 -1
- package/llms_full.txt +0 -5890
- package/tasks.json +0 -0
- /package/plan/{backlog.json → 001_d3bb02af4886/backlog.json} +0 -0
- /package/plan/{P1P2/PRP.md → 001_d3bb02af4886/docs/PRP/P1P2-PRP.md} +0 -0
- /package/plan/{P3P4/PRP.md → 001_d3bb02af4886/docs/PRP/P3P4-PRP.md} +0 -0
- /package/plan/{P4P5/PRP.md → 001_d3bb02af4886/docs/PRP/P4P5-PRP.md} +0 -0
- /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/external_deps.md +0 -0
- /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/system_context.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_BEST_PRACTICES.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_CODE_PATTERNS.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_INTEGRATION_GUIDE.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_RESEARCH_INDEX.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_INDEX.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_RESEARCH_REPORT.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/RESEARCH_SUMMARY.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/anthropic-sdk.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/async-local-storage.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-code-patterns.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-decision-matrix.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-implementation-guide.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-integration-guide.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-patterns.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-quick-reference.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/zod-schema.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/caching-lru.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/introspection-tools.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/reflection-patterns.md +0 -0
- /package/plan/{P4P5/research → 001_d3bb02af4886/docs/research/P4P5}/RESEARCH_SUMMARY.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/INTROSPECTION_RESEARCH_SUMMARY.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/README-INTROSPECTION.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/agent-introspection-patterns.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-tool-examples.md +0 -0
- /package/{PRPs/PRDs/001-hierarchical-workflow-engine.md → plan/001_d3bb02af4886/prd_snapshot.md} +0 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
# Promise.allSettled Quick Reference Guide
|
|
2
|
+
|
|
3
|
+
**Purpose:** Quick reference for implementing Promise.allSettled in Groundswell
|
|
4
|
+
**Related Task:** P1.M2.T1 - Replace Promise.all with Promise.allSettled in Concurrent Tasks
|
|
5
|
+
**Full Research:** See `PROMISE_ALLSETTLED_RESEARCH.md` for comprehensive details
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## TL;DR
|
|
10
|
+
|
|
11
|
+
**Promise.allSettled** waits for ALL promises to complete (success or failure), then returns an array of result objects with status and value/reason. It NEVER rejects - always fulfills.
|
|
12
|
+
|
|
13
|
+
**Key Benefits:**
|
|
14
|
+
- ✅ See ALL errors, not just first
|
|
15
|
+
- ✅ Preserve partial results
|
|
16
|
+
- ✅ Better debugging/observability
|
|
17
|
+
- ✅ Enable graceful degradation
|
|
18
|
+
|
|
19
|
+
**When to Use:**
|
|
20
|
+
- Independent operations
|
|
21
|
+
- Partial success has value
|
|
22
|
+
- Need complete error picture
|
|
23
|
+
- Observability is priority
|
|
24
|
+
|
|
25
|
+
**When to Use Promise.all Instead:**
|
|
26
|
+
- All operations must succeed (transactional)
|
|
27
|
+
- Fast failure desired
|
|
28
|
+
- Operations are dependent
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Basic Syntax
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// Promise.allSettled never rejects, always fulfills
|
|
36
|
+
const results = await Promise.allSettled([
|
|
37
|
+
promise1,
|
|
38
|
+
promise2,
|
|
39
|
+
promise3
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
// Result type: PromiseSettledResult<T>[]
|
|
43
|
+
// [
|
|
44
|
+
// { status: 'fulfilled', value: ... },
|
|
45
|
+
// { status: 'rejected', reason: Error(...) },
|
|
46
|
+
// { status: 'fulfilled', value: ... }
|
|
47
|
+
// ]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Type Guards (Required for TypeScript)
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Type guard for fulfilled results
|
|
56
|
+
function isFulfilled<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T> {
|
|
57
|
+
return result.status === 'fulfilled';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Type guard for rejected results
|
|
61
|
+
function isRejected<T>(result: PromiseSettledResult<T>): result is PromiseRejectedResult {
|
|
62
|
+
return result.status === 'rejected';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Usage
|
|
66
|
+
const results = await Promise.allSettled(promises);
|
|
67
|
+
const successes = results.filter(isFulfilled); // Type: PromiseFulfilledResult<T>[]
|
|
68
|
+
const failures = results.filter(isRejected); // Type: PromiseRejectedResult[]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Common Patterns
|
|
74
|
+
|
|
75
|
+
### Pattern 1: Filter Successes and Failures
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
const results = await Promise.allSettled(promises);
|
|
79
|
+
|
|
80
|
+
const successes = results
|
|
81
|
+
.filter(isFulfilled)
|
|
82
|
+
.map(r => r.value);
|
|
83
|
+
|
|
84
|
+
const failures = results
|
|
85
|
+
.filter(isRejected)
|
|
86
|
+
.map(r => r.reason);
|
|
87
|
+
|
|
88
|
+
console.log(`${successes.length} succeeded, ${failures.length} failed`);
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Pattern 2: Throw on Any Failure (Backward Compatible with Promise.all)
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
const results = await Promise.allSettled(promises);
|
|
95
|
+
const failures = results.filter(isRejected);
|
|
96
|
+
|
|
97
|
+
if (failures.length > 0) {
|
|
98
|
+
throw failures[0].reason; // First error wins
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const values = results
|
|
102
|
+
.filter(isFulfilled)
|
|
103
|
+
.map(r => r.value);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Pattern 3: Aggregate All Errors
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const results = await Promise.allSettled(promises);
|
|
110
|
+
const failures = results.filter(isRejected);
|
|
111
|
+
|
|
112
|
+
if (failures.length > 0) {
|
|
113
|
+
const error = new Error(`${failures.length} operations failed`) as AggregateError;
|
|
114
|
+
error.errors = failures.map(f => f.reason);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Pattern 4: Process with Context
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
const operations = [
|
|
123
|
+
{ name: 'users', promise: fetch('/api/users') },
|
|
124
|
+
{ name: 'posts', promise: fetch('/api/posts') },
|
|
125
|
+
{ name: 'comments', promise: fetch('/api/comments') }
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
const results = await Promise.allSettled(operations.map(op => op.promise));
|
|
129
|
+
|
|
130
|
+
const failures = operations
|
|
131
|
+
.map((op, i) => ({ ...op, result: results[i] }))
|
|
132
|
+
.filter(({ result }) => result.status === 'rejected')
|
|
133
|
+
.map(({ name, result }) => ({
|
|
134
|
+
operation: name,
|
|
135
|
+
error: (result as PromiseRejectedResult).reason
|
|
136
|
+
}));
|
|
137
|
+
|
|
138
|
+
console.error('Failed operations:', failures);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Groundswell Implementation
|
|
144
|
+
|
|
145
|
+
### Current Code (src/decorators/task.ts:112)
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// BEFORE: Fail-fast behavior
|
|
149
|
+
await Promise.all(runnable.map((w) => w.run()));
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Recommended Code
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// AFTER: Configurable strategy
|
|
156
|
+
const errorStrategy = opts.errorStrategy || 'fail-fast';
|
|
157
|
+
|
|
158
|
+
if (errorStrategy === 'fail-fast') {
|
|
159
|
+
// Current behavior (backward compatible)
|
|
160
|
+
await Promise.all(runnable.map((w) => w.run()));
|
|
161
|
+
} else {
|
|
162
|
+
// New behavior: Complete-all with error aggregation
|
|
163
|
+
const settledResults = await Promise.allSettled(
|
|
164
|
+
runnable.map((w) => w.run())
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
// Collect errors
|
|
168
|
+
const errors = settledResults
|
|
169
|
+
.map((result, idx) => ({ result, workflow: runnable[idx] }))
|
|
170
|
+
.filter(({ result }) => result.status === 'rejected')
|
|
171
|
+
.map(({ result, workflow }) => ({
|
|
172
|
+
workflowId: workflow.id,
|
|
173
|
+
workflowName: workflow.constructor.name,
|
|
174
|
+
error: (result as PromiseRejectedResult).reason,
|
|
175
|
+
}));
|
|
176
|
+
|
|
177
|
+
// Throw aggregate error if there were failures
|
|
178
|
+
if (errors.length > 0) {
|
|
179
|
+
throw createAggregateError(errors, taskName, wf.id);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Type Definitions
|
|
187
|
+
|
|
188
|
+
### TaskOptions Enhancement
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
// File: src/types/decorators.ts
|
|
192
|
+
export interface TaskOptions {
|
|
193
|
+
name?: string;
|
|
194
|
+
concurrent?: boolean;
|
|
195
|
+
|
|
196
|
+
// NEW: Error handling strategy
|
|
197
|
+
errorStrategy?: 'fail-fast' | 'complete-all';
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Aggregate Error Type
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
// File: src/types/aggregate-error.ts
|
|
205
|
+
export interface WorkflowAggregateError extends Error {
|
|
206
|
+
name: 'WorkflowAggregateError';
|
|
207
|
+
message: string;
|
|
208
|
+
errors: Array<{
|
|
209
|
+
workflowId: string;
|
|
210
|
+
workflowName: string;
|
|
211
|
+
error: unknown;
|
|
212
|
+
}>;
|
|
213
|
+
taskName: string;
|
|
214
|
+
workflowId: string;
|
|
215
|
+
totalChildren: number;
|
|
216
|
+
failedChildren: number;
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Common Pitfalls
|
|
223
|
+
|
|
224
|
+
### ❌ Don't: Access value/reason without checking status
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
results.forEach(r => {
|
|
228
|
+
console.log(r.value); // RUNTIME ERROR if r.status === 'rejected'
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### ✅ Do: Always check status first
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
results.forEach(r => {
|
|
236
|
+
if (r.status === 'fulfilled') {
|
|
237
|
+
console.log(r.value);
|
|
238
|
+
} else {
|
|
239
|
+
console.error(r.reason);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### ❌ Don't: Forget type guards in TypeScript
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
const successes = results.filter(r => r.status === 'fulfilled');
|
|
248
|
+
successes.forEach(s => {
|
|
249
|
+
console.log(s.value); // TYPESCRIPT ERROR
|
|
250
|
+
});
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### ✅ Do: Use type guards for proper narrowing
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
const successes = results.filter(isFulfilled);
|
|
257
|
+
successes.forEach(s => {
|
|
258
|
+
console.log(s.value); // ✅ TypeScript knows value exists
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### ❌ Don't: Try to catch Promise.allSettled itself
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
try {
|
|
266
|
+
const results = await Promise.allSettled(promises);
|
|
267
|
+
} catch (error) {
|
|
268
|
+
// This NEVER executes - Promise.allSettled never rejects
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### ✅ Do: Check results for failures
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
const results = await Promise.allSettled(promises);
|
|
276
|
+
const hasFailures = results.some(r => r.status === 'rejected');
|
|
277
|
+
|
|
278
|
+
if (hasFailures) {
|
|
279
|
+
// Handle errors
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Comparison: Promise.all vs Promise.allSettled
|
|
286
|
+
|
|
287
|
+
| Aspect | Promise.all | Promise.allSettled |
|
|
288
|
+
|--------|-------------|-------------------|
|
|
289
|
+
| **Behavior** | Fail-fast | Complete-all |
|
|
290
|
+
| **Rejects?** | Yes (first error) | No (always fulfills) |
|
|
291
|
+
| **Error Visibility** | First error only | All errors |
|
|
292
|
+
| **Partial Results** | Lost | Preserved |
|
|
293
|
+
| **Performance** | Faster (stops at error) | Slower (waits for all) |
|
|
294
|
+
| **Memory** | Lower | Higher |
|
|
295
|
+
| **Use Case** | Transactional | Independent ops |
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Migration Checklist
|
|
300
|
+
|
|
301
|
+
- [ ] Update TaskOptions interface with `errorStrategy` field
|
|
302
|
+
- [ ] Create WorkflowAggregateError type
|
|
303
|
+
- [ ] Implement type guards (`isFulfilled`, `isRejected`)
|
|
304
|
+
- [ ] Update @Task decorator with Promise.allSettled path
|
|
305
|
+
- [ ] Maintain backward compatibility (default: fail-fast)
|
|
306
|
+
- [ ] Add error aggregation logic
|
|
307
|
+
- [ ] Emit error events for aggregate errors
|
|
308
|
+
- [ ] Add unit tests for complete-all strategy
|
|
309
|
+
- [ ] Add integration tests for concurrent failures
|
|
310
|
+
- [ ] Update documentation with examples
|
|
311
|
+
- [ ] Verify all existing tests still pass
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Testing Examples
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
// Test 1: Fail-fast (default)
|
|
319
|
+
await expect(parent.run()).rejects.toThrow('First error');
|
|
320
|
+
|
|
321
|
+
// Test 2: Complete-all
|
|
322
|
+
const task = new Task({ concurrent: true, errorStrategy: 'complete-all' });
|
|
323
|
+
try {
|
|
324
|
+
await parent.run();
|
|
325
|
+
} catch (error) {
|
|
326
|
+
expect(error.name).toBe('WorkflowAggregateError');
|
|
327
|
+
expect(error.failedChildren).toBe(2);
|
|
328
|
+
expect(error.totalChildren).toBe(3);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Test 3: Partial success
|
|
332
|
+
// Verify successful children completed despite failures
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Performance Considerations
|
|
338
|
+
|
|
339
|
+
**Promise.allSettled** waits for ALL operations to complete, even if some fail early.
|
|
340
|
+
|
|
341
|
+
**Impact:**
|
|
342
|
+
- Slower error detection (must wait for slowest operation)
|
|
343
|
+
- Higher memory usage (stores all results)
|
|
344
|
+
- Better error visibility (see all failures)
|
|
345
|
+
|
|
346
|
+
**Mitigation:**
|
|
347
|
+
- Use batching for large arrays (1000+ promises)
|
|
348
|
+
- Process results in chunks
|
|
349
|
+
- Don't store results if not needed
|
|
350
|
+
- Consider timeouts for individual operations
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## Resources
|
|
355
|
+
|
|
356
|
+
**Full Research Document:**
|
|
357
|
+
`/home/dustin/projects/groundswell/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md`
|
|
358
|
+
|
|
359
|
+
**Related Groundswell Files:**
|
|
360
|
+
- Current Implementation: `src/decorators/task.ts`
|
|
361
|
+
- Type Definitions: `src/types/decorators.ts`
|
|
362
|
+
- Error Strategy: `src/types/error-strategy.ts`
|
|
363
|
+
- Best Practices: `plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md`
|
|
364
|
+
- Error Patterns: `plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md`
|
|
365
|
+
|
|
366
|
+
**External Resources:**
|
|
367
|
+
- MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
|
|
368
|
+
- TC39 Spec: https://tc39.es/ecma262/#sec-promise.allsettled
|
|
369
|
+
- StackOverflow: https://stackoverflow.com/questions/62520818
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
**Version:** 1.0
|
|
374
|
+
**Last Updated:** 2026-01-12
|
|
375
|
+
**Task:** P1.M2.T1
|
|
376
|
+
**Status:** Ready for Implementation
|