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.
Files changed (242) hide show
  1. package/.claude/commands/subtask-planning/prp-base-create.md +120 -0
  2. package/.claude/commands/subtask-planning/prp-base-execute.md +65 -0
  3. package/.claude/commands/task-breakdown.md +94 -0
  4. package/.claude/system_prompts/task-breakdown.md +1 -0
  5. package/CHANGELOG.md +188 -0
  6. package/PRD.md +543 -0
  7. package/README.md +99 -5
  8. package/examples/README.md +15 -1
  9. package/examples/examples/11-reparenting-workflows.ts +269 -0
  10. package/examples/index.ts +4 -0
  11. package/package-lock.json +2398 -0
  12. package/package.json +3 -1
  13. package/plan/001_d3bb02af4886/TEST_RESULTS.md +259 -0
  14. package/plan/001_d3bb02af4886/bug_fix_tasks.json +484 -0
  15. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +488 -0
  16. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +581 -0
  17. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +687 -0
  18. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +492 -0
  19. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +932 -0
  20. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +1109 -0
  21. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +802 -0
  22. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +603 -0
  23. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +564 -0
  24. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +518 -0
  25. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +1252 -0
  26. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +364 -0
  27. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +114 -0
  28. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +205 -0
  29. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +199 -0
  30. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +134 -0
  31. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +495 -0
  32. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +435 -0
  33. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +506 -0
  34. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +612 -0
  35. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +558 -0
  36. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +788 -0
  37. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +460 -0
  38. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +454 -0
  39. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +520 -0
  40. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +417 -0
  41. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +760 -0
  42. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +245 -0
  43. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +792 -0
  44. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +535 -0
  45. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +190 -0
  46. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +654 -0
  47. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +227 -0
  48. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +345 -0
  49. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +193 -0
  50. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +1323 -0
  51. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +1011 -0
  52. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +927 -0
  53. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +505 -0
  54. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +401 -0
  55. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +142 -0
  56. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +112 -0
  57. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +159 -0
  58. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +549 -0
  59. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +368 -0
  60. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +172 -0
  61. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +175 -0
  62. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +696 -0
  63. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +860 -0
  64. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +1066 -0
  65. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +1103 -0
  66. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +789 -0
  67. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +1098 -0
  68. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +1037 -0
  69. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +916 -0
  70. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +1045 -0
  71. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +890 -0
  72. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +822 -0
  73. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +668 -0
  74. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +706 -0
  75. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +265 -0
  76. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +655 -0
  77. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +1103 -0
  78. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +426 -0
  79. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +506 -0
  80. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +114 -0
  81. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +316 -0
  82. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +754 -0
  83. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +612 -0
  84. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +719 -0
  85. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +215 -0
  86. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +765 -0
  87. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +718 -0
  88. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +149 -0
  89. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +470 -0
  90. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +332 -0
  91. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +167 -0
  92. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +265 -0
  93. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +273 -0
  94. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +760 -0
  95. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +434 -0
  96. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +717 -0
  97. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +472 -0
  98. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +125 -0
  99. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +301 -0
  100. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +1170 -0
  101. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +940 -0
  102. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +151 -0
  103. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +650 -0
  104. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +259 -0
  105. package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +457 -0
  106. package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +346 -0
  107. package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +311 -0
  108. package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +1565 -0
  109. package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +288 -0
  110. package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +741 -0
  111. package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +652 -0
  112. package/plan/001_d3bb02af4886/docs/PRP/PRP.md +527 -0
  113. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +415 -0
  114. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +378 -0
  115. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +713 -0
  116. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +370 -0
  117. package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +499 -0
  118. package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +230 -0
  119. package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +1134 -0
  120. package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +179 -0
  121. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +629 -0
  122. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +214 -0
  123. package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +629 -0
  124. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +529 -0
  125. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +142 -0
  126. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +304 -0
  127. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +558 -0
  128. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +256 -0
  129. package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +346 -0
  130. package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +415 -0
  131. package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +489 -0
  132. package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +218 -0
  133. package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +380 -0
  134. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +1923 -0
  135. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +319 -0
  136. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +115 -0
  137. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +134 -0
  138. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +153 -0
  139. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +132 -0
  140. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +716 -0
  141. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +186 -0
  142. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +604 -0
  143. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +213 -0
  144. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +30 -0
  145. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +56 -0
  146. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +53 -0
  147. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +49 -0
  148. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +958 -0
  149. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +339 -0
  150. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +305 -0
  151. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +433 -0
  152. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +1574 -0
  153. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +1014 -0
  154. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +376 -0
  155. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +1507 -0
  156. package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +949 -0
  157. package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +619 -0
  158. package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +723 -0
  159. package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-security-guide.md +56 -0
  160. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +460 -0
  161. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +324 -0
  162. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +175 -0
  163. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +499 -0
  164. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +163 -0
  165. package/plan/bugfix/BUG_FIX_SUMMARY.md +961 -0
  166. package/src/__tests__/adversarial/attachChild-performance.test.ts +216 -0
  167. package/src/__tests__/adversarial/circular-reference.test.ts +101 -0
  168. package/src/__tests__/adversarial/complex-circular-reference.test.ts +139 -0
  169. package/src/__tests__/adversarial/concurrent-task-failures.test.ts +571 -0
  170. package/src/__tests__/adversarial/deep-analysis.test.ts +729 -0
  171. package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +213 -0
  172. package/src/__tests__/adversarial/e2e-prd-validation.test.ts +448 -0
  173. package/src/__tests__/adversarial/edge-case.test.ts +703 -0
  174. package/src/__tests__/adversarial/error-merge-strategy.test.ts +760 -0
  175. package/src/__tests__/adversarial/incremental-performance.test.ts +140 -0
  176. package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +457 -0
  177. package/src/__tests__/adversarial/observer-propagation.test.ts +487 -0
  178. package/src/__tests__/adversarial/parent-validation.test.ts +143 -0
  179. package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +611 -0
  180. package/src/__tests__/adversarial/prd-compliance.test.ts +731 -0
  181. package/src/__tests__/compatibility/backward-compatibility.test.ts +1572 -0
  182. package/src/__tests__/helpers/index.ts +18 -0
  183. package/src/__tests__/helpers/tree-verification.ts +257 -0
  184. package/src/__tests__/integration/bidirectional-consistency.test.ts +847 -0
  185. package/src/__tests__/integration/observer-logging.test.ts +643 -0
  186. package/src/__tests__/integration/tree-mirroring.test.ts +37 -0
  187. package/src/__tests__/integration/workflow-reparenting.test.ts +303 -0
  188. package/src/__tests__/unit/context.test.ts +79 -0
  189. package/src/__tests__/unit/logger.test.ts +293 -0
  190. package/src/__tests__/unit/observable.test.ts +321 -0
  191. package/src/__tests__/unit/tree-debugger-incremental.test.ts +170 -0
  192. package/src/__tests__/unit/utils/workflow-error-utils.test.ts +209 -0
  193. package/src/__tests__/unit/workflow-detachChild.test.ts +100 -0
  194. package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +153 -0
  195. package/src/__tests__/unit/workflow-isDescendantOf.test.ts +180 -0
  196. package/src/__tests__/unit/workflow.test.ts +277 -1
  197. package/src/core/agent.ts +21 -1
  198. package/src/core/logger.ts +27 -2
  199. package/src/core/workflow-context.ts +6 -4
  200. package/src/core/workflow.ts +252 -14
  201. package/src/debugger/tree-debugger.ts +52 -7
  202. package/src/decorators/task.ts +65 -2
  203. package/src/index.ts +4 -2
  204. package/src/types/decorators.ts +8 -1
  205. package/src/types/events.ts +1 -0
  206. package/src/utils/index.ts +1 -0
  207. package/src/utils/observable.ts +32 -3
  208. package/src/utils/workflow-error-utils.ts +56 -0
  209. package/tsconfig.json +1 -1
  210. package/llms_full.txt +0 -5890
  211. package/tasks.json +0 -0
  212. /package/plan/{backlog.json → 001_d3bb02af4886/backlog.json} +0 -0
  213. /package/plan/{P1P2/PRP.md → 001_d3bb02af4886/docs/PRP/P1P2-PRP.md} +0 -0
  214. /package/plan/{P3P4/PRP.md → 001_d3bb02af4886/docs/PRP/P3P4-PRP.md} +0 -0
  215. /package/plan/{P4P5/PRP.md → 001_d3bb02af4886/docs/PRP/P4P5-PRP.md} +0 -0
  216. /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/external_deps.md +0 -0
  217. /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/system_context.md +0 -0
  218. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_BEST_PRACTICES.md +0 -0
  219. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_CODE_PATTERNS.md +0 -0
  220. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_INTEGRATION_GUIDE.md +0 -0
  221. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_RESEARCH_INDEX.md +0 -0
  222. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_INDEX.md +0 -0
  223. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_RESEARCH_REPORT.md +0 -0
  224. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/RESEARCH_SUMMARY.md +0 -0
  225. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/anthropic-sdk.md +0 -0
  226. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/async-local-storage.md +0 -0
  227. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-code-patterns.md +0 -0
  228. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-decision-matrix.md +0 -0
  229. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-implementation-guide.md +0 -0
  230. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-integration-guide.md +0 -0
  231. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-patterns.md +0 -0
  232. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-quick-reference.md +0 -0
  233. /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/zod-schema.md +0 -0
  234. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/caching-lru.md +0 -0
  235. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/introspection-tools.md +0 -0
  236. /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/reflection-patterns.md +0 -0
  237. /package/plan/{P4P5/research → 001_d3bb02af4886/docs/research/P4P5}/RESEARCH_SUMMARY.md +0 -0
  238. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/INTROSPECTION_RESEARCH_SUMMARY.md +0 -0
  239. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/README-INTROSPECTION.md +0 -0
  240. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/agent-introspection-patterns.md +0 -0
  241. /package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-tool-examples.md +0 -0
  242. /package/{PRPs/PRDs/001-hierarchical-workflow-engine.md → plan/001_d3bb02af4886/prd_snapshot.md} +0 -0
@@ -0,0 +1,723 @@
1
+ # TypeScript Error Handling Best Practices Research
2
+
3
+ ## Executive Summary
4
+
5
+ This document compiles research findings on TypeScript error handling best practices, with specific focus on:
6
+ 1. Error state capture patterns in async/try-catch contexts
7
+ 2. Proper object state capture in error handlers
8
+ 3. Error enrichment patterns in TypeScript
9
+ 4. Common gotchas when using 'this' in catch blocks
10
+ 5. WeakMap-based state capture considerations
11
+
12
+ ---
13
+
14
+ ## 1. Error State Capture Patterns in Async/Try-Catch Contexts
15
+
16
+ ### Key Resources
17
+
18
+ 1. **[A guide to async/await in TypeScript](https://blog.logrocket.com/async-await-typescript/)** - LogRocket Blog (Updated January 2025)
19
+ - **Section: Error handling with try/catch**
20
+ - **Section: Error handling using higher-order functions**
21
+ - Comprehensive coverage of async/await error handling patterns
22
+
23
+ 2. **[TypeScript Error Handling: Tips and Best Practices](https://hupp.tech/blog/typescript/typescript-error-handling-tips-and-best-practices/)** - Hupp Technologies (April 7, 2025)
24
+ - **Section: Use try…catch Blocks Wisely**
25
+ - Modern TypeScript error handling approaches
26
+
27
+ 3. **[Control flow and error handling - JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Control_flow_and_error_handling)** - MDN Web Docs
28
+ - **Section: try...catch statements**
29
+ - Official documentation on error handling constructs
30
+
31
+ ### Best Practices for State Capture in Async Contexts
32
+
33
+ #### 1.1 Local Error Handling Pattern
34
+
35
+ ```typescript
36
+ async function fetchData(url: string): Promise<void> {
37
+ try {
38
+ const response = await fetch(url);
39
+ if (!response.ok) {
40
+ throw new Error(`HTTP Error: ${response.status}`);
41
+ }
42
+ const data = await response.json();
43
+ console.log(data);
44
+ } catch (error) {
45
+ console.error('Error fetching data:', error);
46
+ // State is captured locally in the error handler
47
+ }
48
+ }
49
+ ```
50
+
51
+ **Key Principles:**
52
+ - Handle errors locally within the function where they occur
53
+ - Allow functions to fail gracefully without crashing the application
54
+ - Capture context-specific state in the catch block
55
+
56
+ #### 1.2 Higher-Order Function Pattern for State Capture
57
+
58
+ ```typescript
59
+ // Wrapper function that preserves state context
60
+ function handleAsyncErrors<T extends (...args: any[]) => Promise<any>>(
61
+ asyncFn: T,
62
+ ...args: Parameters<T>
63
+ ): Promise<ReturnType<T> | null> {
64
+ try {
65
+ return await asyncFn(...args);
66
+ } catch (error) {
67
+ console.error(`Error in ${asyncFn.name}:`, error);
68
+ return null;
69
+ }
70
+ }
71
+
72
+ // Usage preserves state context
73
+ const safeFetchEmployees = (url: string) => handleAsyncErrors(fetchEmployees, url);
74
+ ```
75
+
76
+ **Benefits:**
77
+ - Centralizes error handling logic
78
+ - Preserves state context through closure
79
+ - Reduces code duplication
80
+ - Maintains type safety
81
+
82
+ #### 1.3 State Preservation in Sequential Operations
83
+
84
+ ```typescript
85
+ const runAsyncFunctions = async () => {
86
+ try {
87
+ const employees = await fetchAllEmployees(baseApi);
88
+ // State is preserved between operations
89
+ Promise.all(
90
+ employees.map(async user => {
91
+ const userName = await fetchEmployee(userApi, user.id);
92
+ const emails = generateEmail(userName.name);
93
+ return emails;
94
+ })
95
+ );
96
+ } catch (error) {
97
+ console.log(error);
98
+ // Error has access to all state in the try block's scope
99
+ }
100
+ };
101
+ ```
102
+
103
+ ---
104
+
105
+ ## 2. Object State Capture in Error Handlers
106
+
107
+ ### Key Resources
108
+
109
+ 1. **[Custom errors, extending Error](https://javascript.info/custom-errors)** - JavaScript.info
110
+ - **Section: Extending Error**
111
+ - **Section: Further inheritance**
112
+ - Comprehensive guide on custom error classes with state
113
+
114
+ 2. **[Error - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** - MDN Web Docs
115
+ - **Section: Custom error types**
116
+ - **Section: Differentiate between similar errors**
117
+ - Official documentation on error object patterns
118
+
119
+ ### Best Practices for Capturing Object State
120
+
121
+ #### 2.1 Custom Error Classes with State
122
+
123
+ ```typescript
124
+ class ValidationError extends Error {
125
+ constructor(message: string) {
126
+ super(message);
127
+ this.name = 'ValidationError';
128
+ }
129
+ }
130
+
131
+ class PropertyRequiredError extends ValidationError {
132
+ constructor(property: string) {
133
+ super("No property: " + property);
134
+ this.name = 'PropertyRequiredError';
135
+ this.property = property; // State captured in error object
136
+ }
137
+ }
138
+
139
+ // Usage
140
+ try {
141
+ if (!user.age) {
142
+ throw new PropertyRequiredError("age"); // State captured at throw site
143
+ }
144
+ } catch (err) {
145
+ if (err instanceof PropertyRequiredError) {
146
+ console.error("Invalid data:", err.message);
147
+ console.error("Missing property:", err.property); // Access captured state
148
+ }
149
+ }
150
+ ```
151
+
152
+ #### 2.2 Error Enrichment with Context
153
+
154
+ ```typescript
155
+ class ContextualError extends Error {
156
+ public context: Record<string, any>;
157
+
158
+ constructor(message: string, context: Record<string, any>) {
159
+ super(message);
160
+ this.name = 'ContextualError';
161
+ this.context = context; // Capture arbitrary state
162
+ }
163
+ }
164
+
165
+ // Usage
166
+ try {
167
+ performOperation();
168
+ } catch (error) {
169
+ throw new ContextualError('Operation failed', {
170
+ originalError: error,
171
+ userId: user.id,
172
+ timestamp: Date.now(),
173
+ operationState: { /* ... */ }
174
+ });
175
+ }
176
+ ```
177
+
178
+ #### 2.3 Using the 'cause' Property (Modern Approach)
179
+
180
+ ```typescript
181
+ // Error cause chain
182
+ try {
183
+ doFailSomeWay();
184
+ } catch (err) {
185
+ throw new Error("Failed in some way", { cause: err });
186
+ }
187
+
188
+ try {
189
+ doFailAnotherWay();
190
+ } catch (err) {
191
+ throw new Error("Failed in another way", { cause: err });
192
+ }
193
+
194
+ // Accessing the cause chain
195
+ try {
196
+ doWork();
197
+ } catch (err) {
198
+ switch (err.message) {
199
+ case "Failed in some way":
200
+ handleFailSomeWay(err.cause);
201
+ break;
202
+ case "Failed in another way":
203
+ handleFailAnotherWay(err.cause);
204
+ break;
205
+ }
206
+ }
207
+ ```
208
+
209
+ ---
210
+
211
+ ## 3. Error Enrichment Patterns in TypeScript
212
+
213
+ ### Key Resources
214
+
215
+ 1. **[Handling errors like a pro in TypeScript](https://engineering.udacity.com/handling-errors-like-a-pro-in-typescript-d7a314ad4991)** - Udacity Engineering
216
+ - Focus on functional error handling with Result Pattern
217
+ - Transform error handling from exceptions to predictable patterns
218
+
219
+ 2. **[Error Handling in TypeScript: Best Practices](https://medium.com/@arreyetta/error-handling-in-typescript-best-practices-80cdfe6d06db)** - Medium
220
+ - Custom error types and type-safe error objects
221
+ - Safe and predictable error handling approaches
222
+
223
+ 3. **[The 5 Commandments of Clean Error Handling in TypeScript](https://backstage.orus.eu/the-5-commandments-of-clean-error-handling-in-typescript/)**
224
+ - Make sure Errors are Errors (extend Error class)
225
+ - Don't lose your stack trace
226
+ - Use constant error messages
227
+ - Provide the right amount of context
228
+
229
+ ### Error Enrichment Techniques
230
+
231
+ #### 3.1 Base Error Class Pattern
232
+
233
+ ```typescript
234
+ class MyError extends Error {
235
+ constructor(message: string) {
236
+ super(message);
237
+ this.name = this.constructor.name; // Automatic name assignment
238
+ }
239
+ }
240
+
241
+ class ValidationError extends MyError {
242
+ constructor(message: string) {
243
+ super(message);
244
+ // Name automatically set to 'ValidationError'
245
+ }
246
+ }
247
+ ```
248
+
249
+ #### 3.2 Wrapper Exception Pattern
250
+
251
+ ```typescript
252
+ class ReadError extends Error {
253
+ constructor(message: string, cause: Error) {
254
+ super(message);
255
+ this.cause = cause;
256
+ this.name = 'ReadError';
257
+ }
258
+ }
259
+
260
+ function readUser(json: string) {
261
+ let user;
262
+
263
+ try {
264
+ user = JSON.parse(json);
265
+ } catch (err) {
266
+ if (err instanceof SyntaxError) {
267
+ throw new ReadError("Syntax Error", err); // Wrap low-level error
268
+ } else {
269
+ throw err;
270
+ }
271
+ }
272
+
273
+ try {
274
+ validateUser(user);
275
+ } catch (err) {
276
+ if (err instanceof ValidationError) {
277
+ throw new ReadError("Validation Error", err); // Wrap and enrich
278
+ } else {
279
+ throw err;
280
+ }
281
+ }
282
+ }
283
+ ```
284
+
285
+ #### 3.3 Result Type Pattern (Functional Approach)
286
+
287
+ ```typescript
288
+ type Result<T, E = Error> =
289
+ | { success: true; data: T }
290
+ | { success: false; error: E };
291
+
292
+ function performTask(): Result<number, string> {
293
+ if (Math.random() > 0.5) {
294
+ return { success: true, data: 42 };
295
+ } else {
296
+ return { success: false, error: 'Task failed' };
297
+ }
298
+ }
299
+
300
+ // Usage
301
+ const result = performTask();
302
+ if (result.success) {
303
+ console.log('Data:', result.data);
304
+ } else {
305
+ console.error('Error:', result.error);
306
+ }
307
+ ```
308
+
309
+ #### 3.4 Union Types for Error Responses
310
+
311
+ ```typescript
312
+ type Result<T> = { success: true; data: T } | { success: false; error: string };
313
+
314
+ function performTask(): Result<number> {
315
+ if (Math.random() > 0.5) {
316
+ return { success: true, data: 42 };
317
+ } else {
318
+ return { success: false, error: 'Task failed' };
319
+ }
320
+ }
321
+
322
+ const result = performTask();
323
+ if (result.success) {
324
+ console.log('Data:', result.data);
325
+ } else {
326
+ console.error('Error:', result.error);
327
+ }
328
+ ```
329
+
330
+ ---
331
+
332
+ ## 4. Common Gotchas with 'this' in Catch Blocks
333
+
334
+ ### Key Resources
335
+
336
+ 1. **[Can you bind 'this' in an arrow function?](https://stackoverflow.com/questions/33308121/can-you-bind-this-in-an-arrow-function)** - Stack Overflow
337
+ - Cannot rebind `this` in an arrow function
338
+ - Always defined as the context in which it was defined
339
+
340
+ 2. **[Arrow function expressions - JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)** - MDN Web Docs
341
+ - **Section: Lexical this**
342
+ - Arrow functions have semantic differences and deliberate limitations
343
+
344
+ 3. **[Access "this" in a Promise's Catch Block](https://www.pluralsight.com/resources/blog/guides/access-this-in-a-promises-catch-block)** - Pluralsight
345
+ - Using arrow functions to access `this` in catch blocks
346
+ - Context preservation patterns
347
+
348
+ ### Common Pitfalls and Solutions
349
+
350
+ #### 4.1 Traditional Function in Catch Block (Problematic)
351
+
352
+ ```typescript
353
+ class MyClass {
354
+ private value: number = 42;
355
+
356
+ async methodWithError() {
357
+ try {
358
+ await someAsyncOperation();
359
+ } catch (error) {
360
+ // PROBLEM: 'this' may not be what you expect
361
+ function handleError() {
362
+ console.log(this.value); // undefined or wrong context
363
+ }
364
+ handleError();
365
+ }
366
+ }
367
+ }
368
+ ```
369
+
370
+ #### 4.2 Arrow Function Solution (Lexical this)
371
+
372
+ ```typescript
373
+ class MyClass {
374
+ private value: number = 42;
375
+
376
+ async methodWithError() {
377
+ try {
378
+ await someAsyncOperation();
379
+ } catch (error) {
380
+ // SOLUTION: Arrow function preserves lexical 'this'
381
+ const handleError = () => {
382
+ console.log(this.value); // 42 - correct context
383
+ };
384
+ handleError();
385
+ }
386
+ }
387
+ }
388
+ ```
389
+
390
+ #### 4.3 Promise Catch with Arrow Function
391
+
392
+ ```typescript
393
+ class MyClass {
394
+ private data: string = "important";
395
+
396
+ methodWithPromise() {
397
+ Promise.resolve()
398
+ .then(() => {
399
+ console.log(this.data); // Works - arrow function preserves 'this'
400
+ })
401
+ .catch((error) => {
402
+ console.error(error); // 'this' is still preserved
403
+ console.log(this.data); // Works - arrow function in catch
404
+ });
405
+ }
406
+ }
407
+ ```
408
+
409
+ #### 4.4 Manual Binding Alternative
410
+
411
+ ```typescript
412
+ class MyClass {
413
+ private value: number = 42;
414
+
415
+ async methodWithError() {
416
+ try {
417
+ await someAsyncOperation();
418
+ } catch (error) {
419
+ // ALTERNATIVE: Manually bind 'this'
420
+ function handleError(this: MyClass) {
421
+ console.log(this.value); // 42 - explicit binding
422
+ }
423
+ handleError.call(this);
424
+ }
425
+ }
426
+ }
427
+ ```
428
+
429
+ #### 4.5 Async Method Context Preservation
430
+
431
+ ```typescript
432
+ class Service {
433
+ private serviceName: string = "MyService";
434
+
435
+ async execute() {
436
+ try {
437
+ await this riskyOperation();
438
+ } catch (error) {
439
+ // 'this' is preserved in async method catch blocks
440
+ console.error(`Error in ${this.serviceName}:`, error);
441
+ this.logError(error); // 'this' works correctly
442
+ }
443
+ }
444
+
445
+ private async riskyOperation() {
446
+ // ...
447
+ }
448
+
449
+ private logError(error: any) {
450
+ // ...
451
+ }
452
+ }
453
+ ```
454
+
455
+ ### Key Takeaways for 'this' in Error Handlers
456
+
457
+ 1. **Arrow functions preserve lexical `this`** - They inherit `this` from their surrounding scope
458
+ 2. **Traditional functions create new `this` context** - They have their own dynamic `this` binding
459
+ 3. **Async methods preserve `this`** - The async/await pattern maintains class instance context
460
+ 4. **Arrow functions cannot be rebound** - Using `.bind()`, `.call()`, or `.apply()` has no effect
461
+ 5. **Prefer arrow functions in catch blocks** - When you need access to class instance state
462
+
463
+ ---
464
+
465
+ ## 5. WeakMap-Based State Capture Considerations
466
+
467
+ ### Key Resources
468
+
469
+ 1. **[WeakMap - JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)** - MDN Web Docs
470
+ - **Section: Description**
471
+ - Keys must be objects (not primitives)
472
+ - Holds weak references to keys
473
+ - Allows garbage collection when keys are no longer referenced
474
+
475
+ 2. **Gradual typing research papers** - WeakMap mentioned as primitive for ES6
476
+ - Helps "sidestep problems" in gradual typing scenarios
477
+ - Useful for handling type system limitations
478
+
479
+ ### WeakMap Characteristics for State Capture
480
+
481
+ ```typescript
482
+ // WeakMap for state capture
483
+ const observedState = new WeakMap<object, any>();
484
+
485
+ function captureState(obj: object, state: any) {
486
+ observedState.set(obj, state);
487
+ }
488
+
489
+ function getObservedState(obj: object): any | undefined {
490
+ return observedState.get(obj);
491
+ }
492
+ ```
493
+
494
+ ### Benefits of WeakMap for Error State Capture
495
+
496
+ 1. **Automatic Memory Management**
497
+ - Objects can be garbage collected when no longer referenced
498
+ - Prevents memory leaks in long-running applications
499
+ - Ideal for temporary error state associations
500
+
501
+ 2. **Privacy**
502
+ - WeakMap entries are not enumerable
503
+ - Provides true private data storage
504
+ - Cannot be accessed through reflection
505
+
506
+ 3. **No Memory Leak Risk**
507
+ - Unlike regular Map, WeakMap doesn't prevent garbage collection
508
+ - Safe to use for associating error metadata with objects
509
+
510
+ ### Common Use Cases
511
+
512
+ ```typescript
513
+ // 1. Caching computed error state
514
+ const errorCache = new WeakMap<object, ErrorState>();
515
+
516
+ function getErrorState(obj: object): ErrorState {
517
+ let state = errorCache.get(obj);
518
+ if (!state) {
519
+ state = computeErrorState(obj);
520
+ errorCache.set(obj, state);
521
+ }
522
+ return state;
523
+ }
524
+
525
+ // 2. DOM node metadata storage
526
+ const nodeErrors = new WeakMap<Element, ErrorInfo>();
527
+
528
+ function trackNodeError(element: Element, error: Error) {
529
+ nodeErrors.set(element, {
530
+ message: error.message,
531
+ timestamp: Date.now(),
532
+ stack: error.stack
533
+ });
534
+ }
535
+
536
+ // 3. Instance-private error data
537
+ class MyClass {
538
+ private errors = new WeakMap<object, ErrorDetails>();
539
+
540
+ addError(target: object, details: ErrorDetails) {
541
+ this.errors.set(target, details);
542
+ }
543
+ }
544
+ ```
545
+
546
+ ### Potential Gotchas
547
+
548
+ 1. **Keys must be objects** - Primitives cannot be used as WeakMap keys
549
+ 2. **No size property** - Cannot determine how many entries exist
550
+ 3. **Not iterable** - Cannot use for...of or spread operator
551
+ 4. **No clear() method** - Must manually remove entries
552
+ 5. **Weak references** - Entries can disappear unexpectedly during garbage collection
553
+
554
+ ### Best Practices for WeakMap in Error Handling
555
+
556
+ ```typescript
557
+ // GOOD: WeakMap for temporary error state
558
+ class ErrorTracker {
559
+ private state = new WeakMap<object, ErrorContext>();
560
+
561
+ capture(obj: object, context: ErrorContext) {
562
+ this.state.set(obj, context);
563
+ }
564
+
565
+ getError(obj: object): ErrorContext | undefined {
566
+ return this.state.get(obj);
567
+ }
568
+ }
569
+
570
+ // GOOD: Automatic cleanup when objects are garbage collected
571
+ const errorMetadata = new WeakMap<object, ErrorMetadata>();
572
+
573
+ function attachErrorMetadata(obj: object, metadata: ErrorMetadata) {
574
+ // Metadata automatically cleaned up when obj is garbage collected
575
+ errorMetadata.set(obj, metadata);
576
+ }
577
+
578
+ // AVOID: Using WeakMap when you need persistent state
579
+ // Use regular Map instead if state must persist
580
+ ```
581
+
582
+ ---
583
+
584
+ ## 6. Production-Ready Error Handling Patterns
585
+
586
+ ### Key Resources
587
+
588
+ 1. **[TypeScript Error Handling: Tips and Best Practices](https://hupp.tech/blog/typescript/typescript-error-handling-tips-and-best-practices/)** - Hupp Technologies
589
+ - **Section: Implement Centralized Error Handling**
590
+ - **Section: Integrate Error Monitoring Tools**
591
+
592
+ ### Centralized Error Handling
593
+
594
+ ```typescript
595
+ // Express middleware example
596
+ import express, { Request, Response, NextFunction } from 'express';
597
+
598
+ const app = express();
599
+
600
+ app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
601
+ console.error('Error:', err.message);
602
+ res.status(500).json({ error: err.message });
603
+ });
604
+ ```
605
+
606
+ ### Error Monitoring Integration
607
+
608
+ ```typescript
609
+ import * as Sentry from '@sentry/node';
610
+
611
+ Sentry.init({ dsn: 'your-dsn' });
612
+
613
+ try {
614
+ // Risky operation
615
+ } catch (error) {
616
+ Sentry.captureException(error);
617
+ console.error('Error captured:', error);
618
+ }
619
+ ```
620
+
621
+ ### Exhaustive Error Handling with 'never'
622
+
623
+ ```typescript
624
+ type AppError = ValidationError | SyntaxError;
625
+
626
+ function handleAppError(error: AppError): void {
627
+ switch (error.name) {
628
+ case 'ValidationError':
629
+ console.error('Validation error:', error.message);
630
+ break;
631
+ case 'SyntaxError':
632
+ console.error('Syntax error:', error.message);
633
+ break;
634
+ default:
635
+ const exhaustiveCheck: never = error;
636
+ throw new Error(`Unhandled error: ${exhaustiveCheck}`);
637
+ }
638
+ }
639
+ ```
640
+
641
+ ---
642
+
643
+ ## 7. Summary of Key Findings
644
+
645
+ ### Error State Capture Patterns
646
+ - **Local error handling** in async functions preserves state context
647
+ - **Higher-order functions** provide centralized state preservation
648
+ - **Sequential operations** maintain state through try-catch scope
649
+ - **WeakMap** offers automatic cleanup for temporary error state
650
+
651
+ ### Object State Capture Best Practices
652
+ - **Custom error classes** capture state at throw site
653
+ - **Error enrichment** via context properties and cause chains
654
+ - **Wrapper exceptions** transform low-level errors into high-level ones
655
+ - **Result types** provide functional alternative to exceptions
656
+
657
+ ### 'this' Context in Catch Blocks
658
+ - **Arrow functions** preserve lexical `this` binding
659
+ - **Traditional functions** create new `this` context (gotcha!)
660
+ - **Async methods** maintain class instance context
661
+ - **Manual binding** available via `.call()` or `.apply()`
662
+
663
+ ### WeakMap Considerations
664
+ - **Automatic garbage collection** prevents memory leaks
665
+ - **Object-only keys** restrict usage patterns
666
+ - **Non-enumerable** entries provide privacy
667
+ - **No iteration methods** limit debugging capabilities
668
+ - **Ideal for temporary error metadata** associations
669
+
670
+ ### Modern TypeScript Patterns (2025)
671
+ - **Result/Either pattern** gaining popularity as alternative to try-catch
672
+ - **Union types** for explicit error handling
673
+ - **never type** for exhaustive error checking
674
+ - **Error cause property** for error chaining
675
+ - **Functional error handling** complementing traditional exceptions
676
+
677
+ ---
678
+
679
+ ## 8. Actionable Recommendations
680
+
681
+ 1. **Use arrow functions in catch blocks** when you need access to class instance state
682
+ 2. **Implement custom error classes** to capture context-specific state
683
+ 3. **Consider WeakMap** for temporary error state that should be garbage collected
684
+ 4. **Use the cause property** for error enrichment and chaining
685
+ 5. **Implement centralized error handling** to reduce code duplication
686
+ 6. **Integrate error monitoring** tools for production debugging
687
+ 7. **Consider Result types** for functional error handling patterns
688
+ 8. **Use never type** to ensure exhaustive error handling
689
+
690
+ ---
691
+
692
+ ## Sources
693
+
694
+ ### Primary Documentation
695
+ - [Error - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)
696
+ - [Control flow and error handling - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Control_flow_and_error_handling)
697
+ - [Custom errors, extending Error - JavaScript.info](https://javascript.info/custom-errors)
698
+ - [Arrow function expressions - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)
699
+
700
+ ### TypeScript-Specific Resources
701
+ - [TypeScript Error Handling: Tips and Best Practices - Hupp Technologies](https://hupp.tech/blog/typescript/typescript-error-handling-tips-and-best-practices/)
702
+ - [A guide to async/await in TypeScript - LogRocket Blog](https://blog.logrocket.com/async-await-typescript/)
703
+ - [How to use a try-catch block in TypeScript - Convex](https://www.convex.dev/typescript/best-practices/error-handling-debugging/typescript-try-catch)
704
+
705
+ ### Error Enrichment Patterns
706
+ - [Handling errors like a pro in TypeScript - Udacity Engineering](https://engineering.udacity.com/handling-errors-like-a-pro-in-typescript-d7a314ad4991)
707
+ - [Error Handling in TypeScript: Best Practices - Medium](https://medium.com/@arreyetta/error-handling-in-typescript-best-practices-80cdfe6d06db)
708
+ - [The 5 Commandments of Clean Error Handling in TypeScript](https://backstage.orus.eu/the-5-commandments-of-clean-error-handling-in-typescript/)
709
+
710
+ ### 'this' Context Resources
711
+ - [Can you bind 'this' in an arrow function? - Stack Overflow](https://stackoverflow.com/questions/33308121/can-you-bind-this-in-an-arrow-function)
712
+ - [Access "this" in a Promise's Catch Block - Pluralsight](https://www.pluralsight.com/resources/blog/guides/access-this-in-a-promises-catch-block)
713
+ - [this - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)
714
+
715
+ ### Modern Patterns (2024-2025)
716
+ - [I Stopped Using Try-Catch in TypeScript and You Should Too - UserJot](https://userjot.com/blog/typescript-error-handling-return-vs-throw)
717
+ - [No more Try/Catch: a better way to handle errors in TypeScript - Dev.to](https://dev.to/noah-00/no-more-trycatch-a-better-way-to-handle-errors-in-typescript-5hbd)
718
+ - [Async/Await and Error Handling - JavaScript Plain English](https://javascript.plainenglish.io/should-you-use-try-catch-with-async-await-let-me-clear-this-up-78a13aa10568)
719
+
720
+ ---
721
+
722
+ *Research compiled on January 10, 2026*
723
+ *Focus: TypeScript error handling best practices for async contexts, state capture, and WeakMap usage*