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.
Files changed (554) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -9
  3. package/dist/cache/cache-key.d.ts +86 -0
  4. package/dist/cache/cache-key.d.ts.map +1 -0
  5. package/dist/cache/cache-key.js +204 -0
  6. package/dist/cache/cache-key.js.map +1 -0
  7. package/dist/cache/cache.d.ts +104 -0
  8. package/dist/cache/cache.d.ts.map +1 -0
  9. package/dist/cache/cache.js +179 -0
  10. package/dist/cache/cache.js.map +1 -0
  11. package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
  12. package/dist/cache/index.d.ts.map +1 -0
  13. package/dist/cache/index.js +6 -0
  14. package/dist/cache/index.js.map +1 -0
  15. package/dist/core/agent.d.ts +203 -0
  16. package/dist/core/agent.d.ts.map +1 -0
  17. package/dist/core/agent.js +833 -0
  18. package/dist/core/agent.js.map +1 -0
  19. package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
  20. package/dist/core/context.d.ts.map +1 -0
  21. package/dist/core/context.js +80 -0
  22. package/dist/core/context.js.map +1 -0
  23. package/dist/core/event-tree.d.ts +72 -0
  24. package/dist/core/event-tree.d.ts.map +1 -0
  25. package/dist/core/event-tree.js +211 -0
  26. package/dist/core/event-tree.js.map +1 -0
  27. package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
  28. package/dist/core/factory.d.ts.map +1 -0
  29. package/dist/core/factory.js +110 -0
  30. package/dist/core/factory.js.map +1 -0
  31. package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +9 -0
  34. package/dist/core/index.js.map +1 -0
  35. package/dist/core/logger.d.ts +50 -0
  36. package/dist/core/logger.d.ts.map +1 -0
  37. package/dist/core/logger.js +91 -0
  38. package/dist/core/logger.js.map +1 -0
  39. package/dist/core/mcp-handler.d.ts +127 -0
  40. package/dist/core/mcp-handler.d.ts.map +1 -0
  41. package/dist/core/mcp-handler.js +323 -0
  42. package/dist/core/mcp-handler.js.map +1 -0
  43. package/dist/core/prompt.d.ts +80 -0
  44. package/dist/core/prompt.d.ts.map +1 -0
  45. package/dist/core/prompt.js +120 -0
  46. package/dist/core/prompt.js.map +1 -0
  47. package/dist/core/workflow-context.d.ts +61 -0
  48. package/dist/core/workflow-context.d.ts.map +1 -0
  49. package/dist/core/workflow-context.js +358 -0
  50. package/dist/core/workflow-context.js.map +1 -0
  51. package/dist/core/workflow.d.ts +543 -0
  52. package/dist/core/workflow.d.ts.map +1 -0
  53. package/dist/core/workflow.js +986 -0
  54. package/dist/core/workflow.js.map +1 -0
  55. package/dist/debugger/event-replayer.d.ts +422 -0
  56. package/dist/debugger/event-replayer.d.ts.map +1 -0
  57. package/dist/debugger/event-replayer.js +639 -0
  58. package/dist/debugger/event-replayer.js.map +1 -0
  59. package/dist/debugger/index.d.ts +2 -0
  60. package/dist/debugger/index.d.ts.map +1 -0
  61. package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
  62. package/dist/debugger/index.js.map +1 -0
  63. package/dist/debugger/tree-debugger.d.ts +240 -0
  64. package/dist/debugger/tree-debugger.d.ts.map +1 -0
  65. package/dist/debugger/tree-debugger.js +620 -0
  66. package/dist/debugger/tree-debugger.js.map +1 -0
  67. package/dist/decorators/index.d.ts +4 -0
  68. package/dist/decorators/index.d.ts.map +1 -0
  69. package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
  70. package/dist/decorators/index.js.map +1 -0
  71. package/dist/decorators/observed-state.d.ts +32 -0
  72. package/dist/decorators/observed-state.d.ts.map +1 -0
  73. package/dist/decorators/observed-state.js +79 -0
  74. package/dist/decorators/observed-state.js.map +1 -0
  75. package/dist/decorators/step.d.ts +15 -0
  76. package/dist/decorators/step.d.ts.map +1 -0
  77. package/dist/decorators/step.js +192 -0
  78. package/dist/decorators/step.js.map +1 -0
  79. package/dist/decorators/task.d.ts +50 -0
  80. package/dist/decorators/task.d.ts.map +1 -0
  81. package/dist/decorators/task.js +118 -0
  82. package/dist/decorators/task.js.map +1 -0
  83. package/dist/examples/index.d.ts +3 -0
  84. package/dist/examples/index.d.ts.map +1 -0
  85. package/{src/examples/index.ts → dist/examples/index.js} +1 -0
  86. package/dist/examples/index.js.map +1 -0
  87. package/dist/examples/tdd-orchestrator.d.ts +15 -0
  88. package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
  89. package/dist/examples/tdd-orchestrator.js +121 -0
  90. package/dist/examples/tdd-orchestrator.js.map +1 -0
  91. package/dist/examples/test-cycle-workflow.d.ts +14 -0
  92. package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
  93. package/dist/examples/test-cycle-workflow.js +116 -0
  94. package/dist/examples/test-cycle-workflow.js.map +1 -0
  95. package/dist/harnesses/claude-code-harness.d.ts +391 -0
  96. package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
  97. package/dist/harnesses/claude-code-harness.js +1076 -0
  98. package/dist/harnesses/claude-code-harness.js.map +1 -0
  99. package/dist/harnesses/harness-registry.d.ts +440 -0
  100. package/dist/harnesses/harness-registry.d.ts.map +1 -0
  101. package/dist/harnesses/harness-registry.js +543 -0
  102. package/dist/harnesses/harness-registry.js.map +1 -0
  103. package/dist/harnesses/index.d.ts +12 -0
  104. package/dist/harnesses/index.d.ts.map +1 -0
  105. package/dist/harnesses/index.js +11 -0
  106. package/dist/harnesses/index.js.map +1 -0
  107. package/dist/harnesses/pi-harness.d.ts +219 -0
  108. package/dist/harnesses/pi-harness.d.ts.map +1 -0
  109. package/dist/harnesses/pi-harness.js +676 -0
  110. package/dist/harnesses/pi-harness.js.map +1 -0
  111. package/dist/harnesses/pi-schema-converter.d.ts +24 -0
  112. package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
  113. package/dist/harnesses/pi-schema-converter.js +81 -0
  114. package/dist/harnesses/pi-schema-converter.js.map +1 -0
  115. package/dist/harnesses/register-defaults.d.ts +24 -0
  116. package/dist/harnesses/register-defaults.d.ts.map +1 -0
  117. package/dist/harnesses/register-defaults.js +40 -0
  118. package/dist/harnesses/register-defaults.js.map +1 -0
  119. package/dist/harnesses/session-store.d.ts +201 -0
  120. package/dist/harnesses/session-store.d.ts.map +1 -0
  121. package/dist/harnesses/session-store.js +254 -0
  122. package/dist/harnesses/session-store.js.map +1 -0
  123. package/dist/index.d.ts +37 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +57 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/reflection/index.d.ts +5 -0
  128. package/dist/reflection/index.d.ts.map +1 -0
  129. package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
  130. package/dist/reflection/index.js.map +1 -0
  131. package/dist/reflection/reflection.d.ts +84 -0
  132. package/dist/reflection/reflection.d.ts.map +1 -0
  133. package/dist/reflection/reflection.js +344 -0
  134. package/dist/reflection/reflection.js.map +1 -0
  135. package/dist/tools/index.d.ts +6 -0
  136. package/dist/tools/index.d.ts.map +1 -0
  137. package/dist/tools/index.js +11 -0
  138. package/dist/tools/index.js.map +1 -0
  139. package/dist/tools/introspection.d.ts +165 -0
  140. package/dist/tools/introspection.d.ts.map +1 -0
  141. package/dist/tools/introspection.js +324 -0
  142. package/dist/tools/introspection.js.map +1 -0
  143. package/dist/types/agent.d.ts +1317 -0
  144. package/dist/types/agent.d.ts.map +1 -0
  145. package/dist/types/agent.js +423 -0
  146. package/dist/types/agent.js.map +1 -0
  147. package/dist/types/decorators.d.ts +40 -0
  148. package/dist/types/decorators.d.ts.map +1 -0
  149. package/dist/types/decorators.js +2 -0
  150. package/dist/types/decorators.js.map +1 -0
  151. package/dist/types/error-strategy.d.ts +13 -0
  152. package/dist/types/error-strategy.d.ts.map +1 -0
  153. package/dist/types/error-strategy.js +2 -0
  154. package/dist/types/error-strategy.js.map +1 -0
  155. package/dist/types/error.d.ts +20 -0
  156. package/dist/types/error.d.ts.map +1 -0
  157. package/dist/types/error.js +2 -0
  158. package/dist/types/error.js.map +1 -0
  159. package/dist/types/events.d.ts +113 -0
  160. package/dist/types/events.d.ts.map +1 -0
  161. package/dist/types/events.js +2 -0
  162. package/dist/types/events.js.map +1 -0
  163. package/dist/types/harnesses.d.ts +474 -0
  164. package/dist/types/harnesses.d.ts.map +1 -0
  165. package/dist/types/harnesses.js +2 -0
  166. package/dist/types/harnesses.js.map +1 -0
  167. package/dist/types/index.d.ts +23 -0
  168. package/dist/types/index.d.ts.map +1 -0
  169. package/dist/types/index.js +8 -0
  170. package/dist/types/index.js.map +1 -0
  171. package/dist/types/logging.d.ts +24 -0
  172. package/dist/types/logging.d.ts.map +1 -0
  173. package/dist/types/logging.js +2 -0
  174. package/dist/types/logging.js.map +1 -0
  175. package/dist/types/observer.d.ts +18 -0
  176. package/dist/types/observer.d.ts.map +1 -0
  177. package/dist/types/observer.js +2 -0
  178. package/dist/types/observer.js.map +1 -0
  179. package/dist/types/prompt.d.ts +31 -0
  180. package/dist/types/prompt.d.ts.map +1 -0
  181. package/dist/types/prompt.js +6 -0
  182. package/dist/types/prompt.js.map +1 -0
  183. package/dist/types/providers.d.ts +691 -0
  184. package/dist/types/providers.d.ts.map +1 -0
  185. package/dist/types/providers.js +14 -0
  186. package/dist/types/providers.js.map +1 -0
  187. package/dist/types/reflection.d.ts +96 -0
  188. package/dist/types/reflection.d.ts.map +1 -0
  189. package/dist/types/reflection.js +24 -0
  190. package/dist/types/reflection.js.map +1 -0
  191. package/dist/types/restart.d.ts +132 -0
  192. package/dist/types/restart.d.ts.map +1 -0
  193. package/dist/types/restart.js +2 -0
  194. package/dist/types/restart.js.map +1 -0
  195. package/dist/types/sdk-primitives.d.ts +118 -0
  196. package/dist/types/sdk-primitives.d.ts.map +1 -0
  197. package/dist/types/sdk-primitives.js +6 -0
  198. package/dist/types/sdk-primitives.js.map +1 -0
  199. package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
  200. package/dist/types/snapshot.d.ts.map +1 -0
  201. package/dist/types/snapshot.js +2 -0
  202. package/dist/types/snapshot.js.map +1 -0
  203. package/dist/types/streaming.d.ts +194 -0
  204. package/dist/types/streaming.d.ts.map +1 -0
  205. package/dist/types/streaming.js +67 -0
  206. package/dist/types/streaming.js.map +1 -0
  207. package/dist/types/workflow-context.d.ts +275 -0
  208. package/dist/types/workflow-context.d.ts.map +1 -0
  209. package/dist/types/workflow-context.js +8 -0
  210. package/dist/types/workflow-context.js.map +1 -0
  211. package/dist/types/workflow.d.ts +30 -0
  212. package/dist/types/workflow.d.ts.map +1 -0
  213. package/dist/types/workflow.js +2 -0
  214. package/dist/types/workflow.js.map +1 -0
  215. package/dist/utils/agent-validation.d.ts +88 -0
  216. package/dist/utils/agent-validation.d.ts.map +1 -0
  217. package/dist/utils/agent-validation.js +87 -0
  218. package/dist/utils/agent-validation.js.map +1 -0
  219. package/dist/utils/delay.d.ts +7 -0
  220. package/dist/utils/delay.d.ts.map +1 -0
  221. package/dist/utils/delay.js +9 -0
  222. package/dist/utils/delay.js.map +1 -0
  223. package/dist/utils/harness-config.d.ts +180 -0
  224. package/dist/utils/harness-config.d.ts.map +1 -0
  225. package/dist/utils/harness-config.js +311 -0
  226. package/dist/utils/harness-config.js.map +1 -0
  227. package/dist/utils/id.d.ts +6 -0
  228. package/dist/utils/id.d.ts.map +1 -0
  229. package/dist/utils/id.js +12 -0
  230. package/dist/utils/id.js.map +1 -0
  231. package/dist/utils/index.d.ts +13 -0
  232. package/dist/utils/index.d.ts.map +1 -0
  233. package/dist/utils/index.js +11 -0
  234. package/dist/utils/index.js.map +1 -0
  235. package/dist/utils/model-spec.d.ts +110 -0
  236. package/dist/utils/model-spec.d.ts.map +1 -0
  237. package/dist/utils/model-spec.js +149 -0
  238. package/dist/utils/model-spec.js.map +1 -0
  239. package/dist/utils/observable.d.ts +54 -0
  240. package/dist/utils/observable.d.ts.map +1 -0
  241. package/dist/utils/observable.js +82 -0
  242. package/dist/utils/observable.js.map +1 -0
  243. package/dist/utils/provider-config.d.ts +10 -0
  244. package/dist/utils/provider-config.d.ts.map +1 -0
  245. package/dist/utils/provider-config.js +10 -0
  246. package/dist/utils/provider-config.js.map +1 -0
  247. package/dist/utils/restart-analysis.d.ts +202 -0
  248. package/dist/utils/restart-analysis.d.ts.map +1 -0
  249. package/dist/utils/restart-analysis.js +426 -0
  250. package/dist/utils/restart-analysis.js.map +1 -0
  251. package/dist/utils/session-serialization.d.ts +118 -0
  252. package/dist/utils/session-serialization.d.ts.map +1 -0
  253. package/dist/utils/session-serialization.js +217 -0
  254. package/dist/utils/session-serialization.js.map +1 -0
  255. package/dist/utils/workflow-error-utils.d.ts +22 -0
  256. package/dist/utils/workflow-error-utils.d.ts.map +1 -0
  257. package/dist/utils/workflow-error-utils.js +45 -0
  258. package/dist/utils/workflow-error-utils.js.map +1 -0
  259. package/package.json +34 -5
  260. package/.claude/commands/subtask-planning/prp-base-create.md +0 -120
  261. package/.claude/commands/subtask-planning/prp-base-execute.md +0 -65
  262. package/.claude/commands/task-breakdown.md +0 -94
  263. package/.claude/settings.local.json +0 -9
  264. package/.claude/system_prompts/task-breakdown.md +0 -101
  265. package/CHANGELOG.md +0 -188
  266. package/PRD.md +0 -543
  267. package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
  268. package/PRPs/PRDs/002-agent-prompt.md +0 -390
  269. package/PRPs/PRDs/003-agent-prompt.md +0 -943
  270. package/PRPs/PRDs/004-agent-prompt.md +0 -1136
  271. package/PRPs/PRDs/tasks-001.json +0 -492
  272. package/PRPs/README.md +0 -83
  273. package/PRPs/templates/prp_base.md +0 -222
  274. package/docs/agent.md +0 -422
  275. package/docs/prompt.md +0 -419
  276. package/docs/workflow.md +0 -600
  277. package/examples/README.md +0 -258
  278. package/examples/examples/01-basic-workflow.ts +0 -100
  279. package/examples/examples/02-decorator-options.ts +0 -217
  280. package/examples/examples/03-parent-child.ts +0 -241
  281. package/examples/examples/04-observers-debugger.ts +0 -340
  282. package/examples/examples/05-error-handling.ts +0 -387
  283. package/examples/examples/06-concurrent-tasks.ts +0 -352
  284. package/examples/examples/07-agent-loops.ts +0 -432
  285. package/examples/examples/08-sdk-features.ts +0 -667
  286. package/examples/examples/09-reflection.ts +0 -573
  287. package/examples/examples/10-introspection.ts +0 -550
  288. package/examples/examples/11-reparenting-workflows.ts +0 -269
  289. package/examples/index.ts +0 -147
  290. package/examples/utils/helpers.ts +0 -57
  291. package/package-lock.json +0 -2398
  292. package/plan/001_d3bb02af4886/TEST_RESULTS.md +0 -259
  293. package/plan/001_d3bb02af4886/backlog.json +0 -867
  294. package/plan/001_d3bb02af4886/bug_fix_tasks.json +0 -484
  295. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +0 -488
  296. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +0 -581
  297. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +0 -687
  298. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +0 -492
  299. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +0 -932
  300. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +0 -1109
  301. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +0 -802
  302. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +0 -603
  303. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +0 -564
  304. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +0 -518
  305. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +0 -1252
  306. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +0 -364
  307. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +0 -114
  308. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +0 -205
  309. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +0 -199
  310. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +0 -134
  311. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +0 -495
  312. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +0 -435
  313. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +0 -506
  314. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +0 -612
  315. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +0 -558
  316. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +0 -788
  317. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +0 -460
  318. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +0 -454
  319. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +0 -520
  320. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +0 -417
  321. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +0 -760
  322. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +0 -245
  323. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +0 -792
  324. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +0 -535
  325. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +0 -190
  326. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +0 -654
  327. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +0 -227
  328. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +0 -345
  329. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +0 -193
  330. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +0 -1323
  331. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +0 -1011
  332. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +0 -927
  333. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +0 -505
  334. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +0 -401
  335. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +0 -142
  336. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +0 -112
  337. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +0 -159
  338. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +0 -549
  339. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +0 -368
  340. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +0 -172
  341. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +0 -175
  342. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +0 -696
  343. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +0 -860
  344. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +0 -1066
  345. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +0 -1103
  346. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +0 -789
  347. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +0 -1098
  348. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +0 -1037
  349. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +0 -916
  350. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +0 -1045
  351. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +0 -890
  352. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +0 -822
  353. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +0 -668
  354. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +0 -706
  355. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +0 -265
  356. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +0 -655
  357. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +0 -1103
  358. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +0 -426
  359. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +0 -506
  360. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +0 -114
  361. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +0 -316
  362. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +0 -754
  363. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +0 -612
  364. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +0 -719
  365. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +0 -215
  366. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +0 -765
  367. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +0 -718
  368. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +0 -149
  369. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +0 -470
  370. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +0 -332
  371. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +0 -167
  372. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +0 -265
  373. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +0 -273
  374. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +0 -760
  375. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +0 -434
  376. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +0 -717
  377. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +0 -472
  378. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +0 -125
  379. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +0 -301
  380. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +0 -1170
  381. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +0 -940
  382. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +0 -151
  383. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +0 -650
  384. package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +0 -259
  385. package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +0 -457
  386. package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +0 -346
  387. package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +0 -311
  388. package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +0 -1565
  389. package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +0 -288
  390. package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +0 -741
  391. package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +0 -652
  392. package/plan/001_d3bb02af4886/docs/PRP/P1P2-PRP.md +0 -527
  393. package/plan/001_d3bb02af4886/docs/PRP/P3P4-PRP.md +0 -1388
  394. package/plan/001_d3bb02af4886/docs/PRP/P4P5-PRP.md +0 -1136
  395. package/plan/001_d3bb02af4886/docs/PRP/PRP.md +0 -527
  396. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +0 -415
  397. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +0 -378
  398. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +0 -713
  399. package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +0 -370
  400. package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +0 -499
  401. package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +0 -230
  402. package/plan/001_d3bb02af4886/docs/architecture/external_deps.md +0 -358
  403. package/plan/001_d3bb02af4886/docs/architecture/system_context.md +0 -242
  404. package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +0 -1134
  405. package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +0 -179
  406. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +0 -629
  407. package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +0 -214
  408. package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +0 -629
  409. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +0 -529
  410. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +0 -142
  411. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +0 -304
  412. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +0 -558
  413. package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +0 -256
  414. package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +0 -346
  415. package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +0 -415
  416. package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +0 -489
  417. package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +0 -218
  418. package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +0 -380
  419. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +0 -1923
  420. package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +0 -319
  421. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +0 -115
  422. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +0 -134
  423. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +0 -153
  424. package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +0 -132
  425. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +0 -716
  426. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +0 -186
  427. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +0 -604
  428. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +0 -213
  429. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +0 -30
  430. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +0 -56
  431. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +0 -53
  432. package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +0 -49
  433. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +0 -958
  434. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +0 -339
  435. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +0 -305
  436. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +0 -433
  437. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +0 -1574
  438. package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +0 -1014
  439. package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_BEST_PRACTICES.md +0 -1929
  440. package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_CODE_PATTERNS.md +0 -857
  441. package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
  442. package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_RESEARCH_INDEX.md +0 -424
  443. package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_INDEX.md +0 -291
  444. package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_RESEARCH_REPORT.md +0 -1342
  445. package/plan/001_d3bb02af4886/docs/research/P1P2/RESEARCH_SUMMARY.md +0 -342
  446. package/plan/001_d3bb02af4886/docs/research/P1P2/anthropic-sdk.md +0 -174
  447. package/plan/001_d3bb02af4886/docs/research/P1P2/async-local-storage.md +0 -200
  448. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-code-patterns.md +0 -1205
  449. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-decision-matrix.md +0 -421
  450. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-implementation-guide.md +0 -1341
  451. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-integration-guide.md +0 -834
  452. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-patterns.md +0 -1468
  453. package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-quick-reference.md +0 -558
  454. package/plan/001_d3bb02af4886/docs/research/P1P2/zod-schema.md +0 -152
  455. package/plan/001_d3bb02af4886/docs/research/P3P4/caching-lru.md +0 -116
  456. package/plan/001_d3bb02af4886/docs/research/P3P4/introspection-tools.md +0 -177
  457. package/plan/001_d3bb02af4886/docs/research/P3P4/reflection-patterns.md +0 -117
  458. package/plan/001_d3bb02af4886/docs/research/P4P5/RESEARCH_SUMMARY.md +0 -151
  459. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +0 -376
  460. package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +0 -1507
  461. package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +0 -949
  462. package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +0 -619
  463. package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +0 -723
  464. package/plan/001_d3bb02af4886/docs/research/general/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
  465. package/plan/001_d3bb02af4886/docs/research/general/README-INTROSPECTION.md +0 -352
  466. package/plan/001_d3bb02af4886/docs/research/general/agent-introspection-patterns.md +0 -1085
  467. package/plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md +0 -984
  468. package/plan/001_d3bb02af4886/docs/research/general/introspection-tool-examples.md +0 -875
  469. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +0 -460
  470. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +0 -324
  471. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +0 -175
  472. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +0 -499
  473. package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +0 -163
  474. package/plan/001_d3bb02af4886/prd_snapshot.md +0 -543
  475. package/plan/bugfix/BUG_FIX_SUMMARY.md +0 -961
  476. package/scripts/generate-llms-full.ts +0 -206
  477. package/src/__tests__/adversarial/attachChild-performance.test.ts +0 -216
  478. package/src/__tests__/adversarial/circular-reference.test.ts +0 -101
  479. package/src/__tests__/adversarial/complex-circular-reference.test.ts +0 -139
  480. package/src/__tests__/adversarial/concurrent-task-failures.test.ts +0 -571
  481. package/src/__tests__/adversarial/deep-analysis.test.ts +0 -729
  482. package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +0 -213
  483. package/src/__tests__/adversarial/e2e-prd-validation.test.ts +0 -448
  484. package/src/__tests__/adversarial/edge-case.test.ts +0 -703
  485. package/src/__tests__/adversarial/error-merge-strategy.test.ts +0 -760
  486. package/src/__tests__/adversarial/incremental-performance.test.ts +0 -140
  487. package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +0 -457
  488. package/src/__tests__/adversarial/observer-propagation.test.ts +0 -487
  489. package/src/__tests__/adversarial/parent-validation.test.ts +0 -143
  490. package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +0 -611
  491. package/src/__tests__/adversarial/prd-compliance.test.ts +0 -731
  492. package/src/__tests__/compatibility/backward-compatibility.test.ts +0 -1572
  493. package/src/__tests__/helpers/index.ts +0 -18
  494. package/src/__tests__/helpers/tree-verification.ts +0 -257
  495. package/src/__tests__/integration/agent-workflow.test.ts +0 -256
  496. package/src/__tests__/integration/bidirectional-consistency.test.ts +0 -847
  497. package/src/__tests__/integration/observer-logging.test.ts +0 -643
  498. package/src/__tests__/integration/tree-mirroring.test.ts +0 -151
  499. package/src/__tests__/integration/workflow-reparenting.test.ts +0 -303
  500. package/src/__tests__/unit/agent.test.ts +0 -169
  501. package/src/__tests__/unit/cache-key.test.ts +0 -182
  502. package/src/__tests__/unit/cache.test.ts +0 -172
  503. package/src/__tests__/unit/context.test.ts +0 -217
  504. package/src/__tests__/unit/decorators.test.ts +0 -100
  505. package/src/__tests__/unit/introspection-tools.test.ts +0 -277
  506. package/src/__tests__/unit/logger.test.ts +0 -293
  507. package/src/__tests__/unit/observable.test.ts +0 -321
  508. package/src/__tests__/unit/prompt.test.ts +0 -135
  509. package/src/__tests__/unit/reflection.test.ts +0 -210
  510. package/src/__tests__/unit/tree-debugger-incremental.test.ts +0 -170
  511. package/src/__tests__/unit/tree-debugger.test.ts +0 -85
  512. package/src/__tests__/unit/utils/workflow-error-utils.test.ts +0 -209
  513. package/src/__tests__/unit/workflow-detachChild.test.ts +0 -100
  514. package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +0 -153
  515. package/src/__tests__/unit/workflow-isDescendantOf.test.ts +0 -180
  516. package/src/__tests__/unit/workflow.test.ts +0 -357
  517. package/src/cache/cache-key.ts +0 -244
  518. package/src/cache/cache.ts +0 -236
  519. package/src/core/agent.ts +0 -593
  520. package/src/core/event-tree.ts +0 -260
  521. package/src/core/logger.ts +0 -112
  522. package/src/core/mcp-handler.ts +0 -184
  523. package/src/core/prompt.ts +0 -150
  524. package/src/core/workflow-context.ts +0 -351
  525. package/src/core/workflow.ts +0 -540
  526. package/src/debugger/tree-debugger.ts +0 -255
  527. package/src/decorators/observed-state.ts +0 -95
  528. package/src/decorators/step.ts +0 -139
  529. package/src/decorators/task.ts +0 -159
  530. package/src/examples/tdd-orchestrator.ts +0 -65
  531. package/src/examples/test-cycle-workflow.ts +0 -64
  532. package/src/index.ts +0 -142
  533. package/src/reflection/reflection.ts +0 -407
  534. package/src/tools/index.ts +0 -36
  535. package/src/tools/introspection.ts +0 -464
  536. package/src/types/agent.ts +0 -90
  537. package/src/types/decorators.ts +0 -32
  538. package/src/types/error-strategy.ts +0 -13
  539. package/src/types/error.ts +0 -20
  540. package/src/types/events.ts +0 -75
  541. package/src/types/index.ts +0 -55
  542. package/src/types/logging.ts +0 -24
  543. package/src/types/observer.ts +0 -18
  544. package/src/types/prompt.ts +0 -40
  545. package/src/types/reflection.ts +0 -117
  546. package/src/types/sdk-primitives.ts +0 -128
  547. package/src/types/workflow-context.ts +0 -163
  548. package/src/types/workflow.ts +0 -37
  549. package/src/utils/id.ts +0 -11
  550. package/src/utils/index.ts +0 -4
  551. package/src/utils/observable.ts +0 -106
  552. package/src/utils/workflow-error-utils.ts +0 -56
  553. package/tsconfig.json +0 -22
  554. package/vitest.config.ts +0 -16
@@ -1,788 +0,0 @@
1
- # External Research: Incremental Tree Mutation Handling
2
-
3
- **Research Date:** 2026-01-12
4
- **Purpose:** P1M3T2S2 - Implement incremental node map updates for WorkflowTreeDebugger
5
- **Focus:** BFS/DFS traversal, Map performance, event dispatching, and tree mutation patterns
6
-
7
- ---
8
-
9
- ## 1. React's Reconciliation & Virtual DOM Patterns
10
-
11
- ### 1.1 Key Concepts from React's Diffing Algorithm
12
-
13
- React's reconciliation algorithm provides excellent patterns for incremental tree updates:
14
-
15
- **O(n) Algorithm for Tree Diffing:**
16
- - React assumes two trees of different elements will produce different trees
17
- - Uses heuristics to reduce O(n³) problem to O(n)
18
- - Key heuristic: If elements have different types, entire subtrees are different
19
-
20
- **Source:** [React Documentation - Reconciliation](https://react.dev/learn/render-and-commit)
21
- - **Section:** "React's Diffing Algorithm"
22
- - **Key Pattern:** Component type comparison for subtree replacement decisions
23
-
24
- ### 1.2 Applicable Patterns for Tree Debugger
25
-
26
- **Pattern 1: Key-based Identification**
27
- ```typescript
28
- // React uses keys to identify nodes across renders
29
- // Similarly, nodeMap uses node.id for O(1) lookups
30
-
31
- // Current implementation (good):
32
- private nodeMap: Map<string, WorkflowNode> = new Map();
33
-
34
- // Pattern: Always use stable identifiers for tree nodes
35
- // Avoid using array indices as identifiers (breaks on insertions/deletions)
36
- ```
37
-
38
- **Pattern 2: Structural Change Detection**
39
- ```typescript
40
- // React detects structural changes by comparing element types
41
- // For tree debugger, detect structural changes by event type:
42
-
43
- onEvent(event: WorkflowEvent): void {
44
- switch (event.type) {
45
- case 'childAttached':
46
- // Incremental: Add only new subtree
47
- this.addSubtreeToMap(event.child);
48
- break;
49
- case 'childDetached':
50
- // Incremental: Remove only detached subtree
51
- this.removeSubtreeFromMap(event.child);
52
- break;
53
- default:
54
- // Non-structural: No map update needed
55
- break;
56
- }
57
- }
58
- ```
59
-
60
- **Pattern 3: Batching Updates**
61
- ```typescript
62
- // React batches multiple state updates
63
- // Apply similar pattern for rapid tree changes:
64
-
65
- private pendingUpdates: Array<() => void> = [];
66
- private updateScheduled = false;
67
-
68
- private scheduleUpdate(fn: () => void) {
69
- this.pendingUpdates.push(fn);
70
- if (!this.updateScheduled) {
71
- this.updateScheduled = true;
72
- Promise.resolve().then(() => {
73
- this.pendingUpdates.forEach(fn => fn());
74
- this.pendingUpdates = [];
75
- this.updateScheduled = false;
76
- });
77
- }
78
- }
79
- ```
80
-
81
- ### 1.3 Virtual DOM Memory Efficiency
82
-
83
- **Insights:**
84
- - Virtual DOM uses object pooling for frequently created objects
85
- - Consider object pooling for WorkflowEvent if many events are created
86
- - Use structural sharing: Only copy changed branches
87
-
88
- ---
89
-
90
- ## 2. JavaScript Map Manipulation & Performance
91
-
92
- ### 2.1 MDN Map Best Practices
93
-
94
- **Source:** [MDN Web Docs - Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)
95
-
96
- **Key Performance Characteristics:**
97
- - **Operations:** `set()`, `get()`, `has()`, `delete()` are O(1) average case
98
- - **Iteration:** `forEach()` and `for...of` are optimized by V8
99
- - **Memory:** Maps have slightly more overhead than Objects, but better for频繁添加/删除
100
-
101
- ### 2.2 V8 Engine Optimizations
102
-
103
- **Source:** [V8 Blog - Map Performance](https://v8.dev/blog/elements-kinds) (Related concepts)
104
-
105
- **Optimization Patterns:**
106
-
107
- **Pattern 1: Preserve Map Reference**
108
- ```typescript
109
- // BAD: Creates new Map frequently
110
- function updateNodeMap(nodes: WorkflowNode[]): Map<string, WorkflowNode> {
111
- const newMap = new Map();
112
- nodes.forEach(node => newMap.set(node.id, node));
113
- return newMap; // Forces garbage collection of old Map
114
- }
115
-
116
- // GOOD: Mutate existing Map
117
- function addNodesToMap(map: Map<string, WorkflowNode>, nodes: WorkflowNode[]): void {
118
- nodes.forEach(node => map.set(node.id, node));
119
- }
120
- ```
121
-
122
- **Pattern 2: Batch Deletions**
123
- ```typescript
124
- // GOOD: Delete multiple keys in single iteration
125
- function removeNodes(map: Map<string, WorkflowNode>, idsToRemove: string[]): void {
126
- for (const id of idsToRemove) {
127
- map.delete(id);
128
- }
129
- // V8 optimizes consecutive deletions
130
- }
131
-
132
- // BETTER: Collect keys first, then delete
133
- function removeSubtree(map: Map<string, WorkflowNode>, rootId: string): void {
134
- const keysToDelete: string[] = [];
135
-
136
- // First pass: collect all keys in subtree
137
- const collectKeys = (node: WorkflowNode) => {
138
- keysToDelete.push(node.id);
139
- node.children.forEach(child => collectKeys(child));
140
- };
141
-
142
- const rootNode = map.get(rootId);
143
- if (rootNode) {
144
- collectKeys(rootNode);
145
- }
146
-
147
- // Second pass: delete all collected keys
148
- for (const key of keysToDelete) {
149
- map.delete(key);
150
- }
151
- }
152
- ```
153
-
154
- **Pattern 3: Use `has()` for Conditional Access**
155
- ```typescript
156
- // GOOD: Check before accessing
157
- if (this.nodeMap.has(nodeId)) {
158
- const node = this.nodeMap.get(nodeId);
159
- // Use node
160
- }
161
-
162
- // ACCEPTABLE: Direct access with undefined check
163
- const node = this.nodeMap.get(nodeId);
164
- if (node) {
165
- // Use node
166
- }
167
- ```
168
-
169
- ### 2.3 Map vs Object for Tree Nodes
170
-
171
- **Use Map when:**
172
- - Keys are not strings/symbols
173
- - Need to iterate in insertion order
174
- - Frequent additions/removals
175
- - Need to know size efficiently
176
-
177
- **Use Object when:**
178
- - Keys are strings/symbols
179
- - Need JSON serialization
180
- - Static set of keys
181
- - Prototype safety concerns
182
-
183
- **Decision:** Map is correct choice for nodeMap due to:
184
- - Frequent additions/removals (childAttached/childDetached)
185
- - O(1) size property
186
- - No prototype pollution concerns
187
-
188
- ---
189
-
190
- ## 3. BFS vs DFS Traversal for Tree Operations
191
-
192
- ### 3.1 Algorithm Comparison
193
-
194
- | Aspect | BFS (Breadth-First) | DFS (Depth-First) |
195
- |--------|---------------------|-------------------|
196
- | **Strategy** | Level-by-level | Go deep, then backtrack |
197
- | **Memory** | O(w) - max width | O(h) - max height |
198
- | **Time** | O(V + E) | O(V + E) |
199
- | **Implementation** | Queue | Stack (or recursion) |
200
- | **Use Case** | Shortest path, level-order | Memory efficient for deep trees |
201
-
202
- ### 3.2 When to Use BFS for Tree Operations
203
-
204
- **Use BFS when:**
205
- 1. **Removing subtrees** - Process parent before children (natural for removal)
206
- 2. **Level-order statistics** - Need to process nodes by depth
207
- 3. **Finding nearest nodes** - Shortest path in unweighted tree
208
- 4. **Wide trees** - When width << height
209
-
210
- **BFS Implementation for Subtree Removal:**
211
- ```typescript
212
- /**
213
- * Remove subtree using BFS traversal
214
- * Good for: Processing parent before children, level-by-level cleanup
215
- */
216
- private removeSubtreeBFS(rootId: string): void {
217
- const queue: string[] = [rootId];
218
- const keysToRemove: string[] = [];
219
-
220
- // Collect all node IDs in subtree
221
- while (queue.length > 0) {
222
- const currentId = queue.shift()!;
223
- const node = this.nodeMap.get(currentId);
224
-
225
- if (node) {
226
- keysToRemove.push(currentId);
227
- // Add children to queue (BFS order)
228
- node.children.forEach(child => queue.push(child.id));
229
- }
230
- }
231
-
232
- // Remove all collected keys
233
- for (const key of keysToRemove) {
234
- this.nodeMap.delete(key);
235
- }
236
- }
237
- ```
238
-
239
- ### 3.3 When to Use DFS for Tree Operations
240
-
241
- **Use DFS when:**
242
- 1. **Adding subtrees** - Recursively add children
243
- 2. **Deep trees** - When height << width (memory efficient)
244
- 3. **Path finding** - Need specific path between nodes
245
- 4. **Ancestry checks** - Bottom-up processing
246
-
247
- **DFS Implementation for Subtree Addition:**
248
- ```typescript
249
- /**
250
- * Add subtree using DFS traversal
251
- * Good for: Memory efficient, natural recursion
252
- */
253
- private addSubtreeDFS(node: WorkflowNode): void {
254
- this.nodeMap.set(node.id, node);
255
-
256
- // Recursively add children (DFS - depth-first)
257
- for (const child of node.children) {
258
- this.addSubtreeDFS(child);
259
- }
260
- }
261
- ```
262
-
263
- ### 3.4 Recommended Pattern for Tree Debugger
264
-
265
- **Hybrid Approach:**
266
-
267
- ```typescript
268
- /**
269
- * Incremental update based on event type
270
- * Uses optimal traversal for each operation
271
- */
272
- private updateNodeMapIncremental(event: WorkflowEvent): void {
273
- switch (event.type) {
274
- case 'childAttached':
275
- // DFS for addition: Natural recursion, memory efficient
276
- this.addSubtreeDFS(event.child);
277
- break;
278
-
279
- case 'childDetached':
280
- // BFS for removal: Parent before children, clear ordering
281
- this.removeSubtreeBFS(event.child.id);
282
- break;
283
-
284
- default:
285
- // Other events don't affect structure
286
- break;
287
- }
288
- }
289
- ```
290
-
291
- ### 3.5 Performance Comparison
292
-
293
- **Benchmark Scenario:** Tree with 1000 nodes, removing 100-node subtree
294
-
295
- | Method | Time Complexity | Memory | Notes |
296
- |--------|----------------|--------|-------|
297
- | Full Rebuild | O(n) | O(n) | Clears all, re-adds all |
298
- | BFS Incremental | O(m) | O(w) | m=subtree size, w=max width |
299
- | DFS Incremental | O(m) | O(h) | m=subtree size, h=max height |
300
-
301
- **Recommendation:** BFS for removal, DFS for addition
302
-
303
- ---
304
-
305
- ## 4. Memory Management Patterns for Tree Structures
306
-
307
- ### 4.1 Weak References for Auxiliary Data
308
-
309
- **Source:** [MDN - WeakMap](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)
310
-
311
- **Pattern:** Use WeakMap for metadata that shouldn't prevent garbage collection
312
-
313
- ```typescript
314
- // Good pattern: WeakMap for node metadata
315
- const nodeMetadata = new WeakMap<WorkflowNode, {
316
- lastAccessed: number;
317
- accessCount: number;
318
- }>();
319
-
320
- // When node is garbage collected, metadata is automatically cleaned up
321
- // No memory leaks from detached nodes
322
- ```
323
-
324
- **Not Applicable to nodeMap:** nodeMap needs strong references (nodes must stay in memory)
325
-
326
- ### 4.2 Circular Reference Prevention
327
-
328
- **Common Pitfall:** Parent <-> Child circular references prevent garbage collection
329
-
330
- ```typescript
331
- // BAD: Circular references prevent GC
332
- class TreeNode {
333
- parent: TreeNode | null = null;
334
- children: TreeNode[] = [];
335
- }
336
-
337
- // Even after removing from tree, nodes may stay in memory
338
- // due to circular parent/child references
339
-
340
- // Solution: Explicit cleanup
341
- class TreeNode {
342
- dispose() {
343
- this.children.forEach(child => {
344
- child.parent = null; // Break circular reference
345
- child.dispose();
346
- });
347
- this.children = [];
348
- }
349
- }
350
- ```
351
-
352
- **For Tree Debugger:** Ensure detached nodes are removed from nodeMap
353
-
354
- ```typescript
355
- private removeSubtreeWithCleanup(rootId: string): void {
356
- const node = this.nodeMap.get(rootId);
357
- if (!node) return;
358
-
359
- // Break references if needed (implementation dependent)
360
- // For WorkflowNode, just remove from map
361
- this.removeSubtreeBFS(rootId);
362
- }
363
- ```
364
-
365
- ### 4.3 Object Pooling for Frequent Creation
366
-
367
- **Pattern:** Reuse objects instead of creating/destroying
368
-
369
- ```typescript
370
- // Object pool for frequently created WorkflowEvent objects
371
- class EventPool {
372
- private pool: WorkflowEvent[] = [];
373
-
374
- acquire(): WorkflowEvent {
375
- return this.pool.pop() || this.createEvent();
376
- }
377
-
378
- release(event: WorkflowEvent): void {
379
- // Reset event state
380
- this.pool.push(event);
381
- }
382
-
383
- private createEvent(): WorkflowEvent {
384
- // Create new event
385
- return {} as WorkflowEvent;
386
- }
387
- }
388
- ```
389
-
390
- **When to Use:**
391
- - High-frequency events (1000+ per second)
392
- - Events have consistent structure
393
- - Memory pressure is a concern
394
-
395
- **For Tree Debugger:** Probably not needed unless event frequency is very high
396
-
397
- ### 4.4 Memory Profiling Patterns
398
-
399
- **Chrome DevTools Memory Profiling:**
400
- ```typescript
401
- // Add memory tracking for debugging
402
- class MemoryTracker {
403
- private snapshots: Map<string, number> = new Map();
404
-
405
- snapshot(label: string): void {
406
- if (performance.memory) {
407
- this.snapshots.set(label, performance.memory.usedJSHeapSize);
408
- }
409
- }
410
-
411
- report(): void {
412
- console.table(this.snapshots);
413
- }
414
- }
415
-
416
- // Usage in tree debugger
417
- constructor(workflow: Workflow) {
418
- this.memoryTracker = new MemoryTracker();
419
- this.memoryTracker.snapshot('constructor');
420
-
421
- // ... build node map
422
-
423
- this.memoryTracker.snapshot('after-build');
424
- }
425
- ```
426
-
427
- ---
428
-
429
- ## 5. Common Pitfalls in Incremental Tree Updates
430
-
431
- ### 5.1 Pitfall 1: Missing Descendants
432
-
433
- **Problem:** Only removing/adding root node, not entire subtree
434
-
435
- ```typescript
436
- // BAD: Only removes root
437
- private removeSubtreeBad(rootId: string): void {
438
- this.nodeMap.delete(rootId); // Children remain in map!
439
- }
440
-
441
- // GOOD: Removes entire subtree
442
- private removeSubtreeGood(rootId: string): void {
443
- const keysToDelete = this.collectSubtreeKeys(rootId);
444
- for (const key of keysToDelete) {
445
- this.nodeMap.delete(key);
446
- }
447
- }
448
-
449
- private collectSubtreeKeys(rootId: string): string[] {
450
- const keys: string[] = [];
451
- const queue = [rootId];
452
-
453
- while (queue.length > 0) {
454
- const currentId = queue.shift()!;
455
- const node = this.nodeMap.get(currentId);
456
-
457
- if (node) {
458
- keys.push(currentId);
459
- node.children.forEach(child => queue.push(child.id));
460
- }
461
- }
462
-
463
- return keys;
464
- }
465
- ```
466
-
467
- ### 5.2 Pitfall 2: Inconsistent State During Update
468
-
469
- **Problem:** Map is partially updated when accessed by other code
470
-
471
- ```typescript
472
- // BAD: Map is inconsistent during iteration
473
- private removeSubtreeBad(rootId: string): void {
474
- const node = this.nodeMap.get(rootId);
475
- if (node) {
476
- this.nodeMap.delete(rootId); // Map now missing root
477
- // If another thread calls getNode() here, returns undefined
478
- node.children.forEach(child => {
479
- this.removeSubtreeBad(child.id); // Recursion leaves map inconsistent
480
- });
481
- }
482
- }
483
-
484
- // GOOD: Collect all keys first, then update atomically
485
- private removeSubtreeGood(rootId: string): void {
486
- const keysToDelete = this.collectSubtreeKeys(rootId);
487
-
488
- // Single atomic update
489
- for (const key of keysToDelete) {
490
- this.nodeMap.delete(key);
491
- }
492
- }
493
- ```
494
-
495
- ### 5.3 Pitfall 3: Event Type Confusion
496
-
497
- **Problem:** Treating all events as structural changes
498
-
499
- ```typescript
500
- // BAD: Rebuilds on every event
501
- onEvent(event: WorkflowEvent): void {
502
- this.nodeMap.clear();
503
- this.buildNodeMap(this.root); // Unnecessary for non-structural events
504
- }
505
-
506
- // GOOD: Only update on structural changes
507
- onEvent(event: WorkflowEvent): void {
508
- switch (event.type) {
509
- case 'childAttached':
510
- this.addSubtreeDFS(event.child);
511
- break;
512
- case 'childDetached':
513
- this.removeSubtreeBFS(event.child.id);
514
- break;
515
- // Other events don't affect structure
516
- }
517
- }
518
- ```
519
-
520
- ### 5.4 Pitfall 4: Stack Overflow on Deep Recursion
521
-
522
- **Problem:** DFS recursion on very deep trees causes stack overflow
523
-
524
- ```typescript
525
- // BAD: Recursion may overflow stack on deep trees
526
- private addSubtreeDFS(node: WorkflowNode): void {
527
- this.nodeMap.set(node.id, node);
528
- node.children.forEach(child => this.addSubtreeDFS(child)); // Recursion depth = tree height
529
- }
530
-
531
- // GOOD: Use iterative DFS for deep trees
532
- private addSubtreeDFSIterative(node: WorkflowNode): void {
533
- const stack = [node];
534
-
535
- while (stack.length > 0) {
536
- const current = stack.pop()!;
537
- this.nodeMap.set(current.id, current);
538
-
539
- // Push children in reverse order for correct traversal
540
- for (let i = current.children.length - 1; i >= 0; i--) {
541
- stack.push(current.children[i]);
542
- }
543
- }
544
- }
545
- ```
546
-
547
- **Recommendation:** Use iterative approach for production code with unknown tree depth
548
-
549
- ### 5.5 Pitfall 5: Memory Leaks from Event Listeners
550
-
551
- **Problem:** Observers not removed when workflow is destroyed
552
-
553
- ```typescript
554
- // BAD: Observer never removed
555
- class WorkflowTreeDebugger {
556
- constructor(workflow: Workflow) {
557
- workflow.addObserver(this); // Never removed
558
- }
559
- }
560
-
561
- // GOOD: Implement cleanup
562
- class WorkflowTreeDebugger {
563
- constructor(private workflow: Workflow) {
564
- this.workflow.addObserver(this);
565
- }
566
-
567
- dispose(): void {
568
- this.workflow.removeObserver(this);
569
- this.nodeMap.clear();
570
- }
571
- }
572
- ```
573
-
574
- ---
575
-
576
- ## 6. Actionable Implementation Guide
577
-
578
- ### 6.1 Implement removeSubtreeNodes() with BFS
579
-
580
- ```typescript
581
- /**
582
- * Remove subtree nodes from nodeMap using BFS traversal
583
- * @param rootId ID of root node to remove
584
- *
585
- * Why BFS:
586
- * - Processes parent before children (natural removal order)
587
- * - Level-by-level traversal predictable
588
- * - No recursion (no stack overflow risk)
589
- */
590
- private removeSubtreeNodes(rootId: string): void {
591
- const queue: string[] = [rootId];
592
- const keysToRemove: string[] = [];
593
-
594
- // BFS traversal to collect all keys in subtree
595
- while (queue.length > 0) {
596
- const currentId = queue.shift()!;
597
- const node = this.nodeMap.get(currentId);
598
-
599
- if (node) {
600
- keysToRemove.push(currentId);
601
- // Add children to queue for BFS traversal
602
- node.children.forEach(child => queue.push(child.id));
603
- }
604
- }
605
-
606
- // Batch delete all collected keys
607
- for (const key of keysToRemove) {
608
- this.nodeMap.delete(key);
609
- }
610
- }
611
- ```
612
-
613
- ### 6.2 Implement Event-Type Dispatch for onEvent()
614
-
615
- ```typescript
616
- /**
617
- * Handle workflow events with type-based dispatch
618
- * @param event Workflow event to process
619
- *
620
- * Performance considerations:
621
- * - Only updates nodeMap on structural changes
622
- * - Non-structural events bypass map updates
623
- * - O(1) switch statement dispatch
624
- */
625
- onEvent(event: WorkflowEvent): void {
626
- // Early return for non-structural events (fast path)
627
- if (event.type !== 'childAttached' && event.type !== 'childDetached') {
628
- this.events.next(event);
629
- return;
630
- }
631
-
632
- // Type-based dispatch for structural events
633
- switch (event.type) {
634
- case 'childAttached': {
635
- // Incremental add: DFS for memory efficiency
636
- this.addSubtreeDFS(event.child);
637
- break;
638
- }
639
-
640
- case 'childDetached': {
641
- // Incremental remove: BFS for level-by-level cleanup
642
- this.removeSubtreeNodes(event.child.id);
643
- break;
644
- }
645
-
646
- default: {
647
- // Exhaustive check for type safety
648
- const _exhaustiveCheck: never = event;
649
- break;
650
- }
651
- }
652
-
653
- // Forward all events to event stream
654
- this.events.next(event);
655
- }
656
-
657
- /**
658
- * Add subtree using DFS traversal
659
- * Good for: Memory efficient on deep trees, natural recursion
660
- */
661
- private addSubtreeDFS(node: WorkflowNode): void {
662
- this.nodeMap.set(node.id, node);
663
- node.children.forEach(child => this.addSubtreeDFS(child));
664
- }
665
- ```
666
-
667
- ### 6.3 Performance Optimization Checklist
668
-
669
- **Optimizations Applied:**
670
- - [x] Use Map instead of Object for O(1) operations
671
- - [x] Batch deletions (collect keys, then delete)
672
- - [x] Event-type dispatch (avoid unnecessary updates)
673
- - [x] BFS for removal (parent before children)
674
- - [x] DFS for addition (memory efficient)
675
- - [ ] Consider iterative DFS for very deep trees
676
- - [ ] Add memory tracking for debugging
677
- - [ ] Consider batching rapid successive updates
678
-
679
- **Future Optimizations:**
680
- - Object pooling for high-frequency events
681
- - WeakMap for auxiliary metadata
682
- - Update batching/debouncing for rapid changes
683
- - Lazy nodeMap rebuild after N incremental updates
684
-
685
- ### 6.4 Testing Strategy
686
-
687
- ```typescript
688
- describe('Incremental Node Map Updates', () => {
689
- it('should correctly remove subtree using BFS', () => {
690
- const debugger = new WorkflowTreeDebugger(rootWorkflow);
691
-
692
- // Build tree with 100 nodes
693
- const initialSize = debugger.getStats().totalNodes;
694
- expect(initialSize).toBe(100);
695
-
696
- // Detach subtree with 20 nodes
697
- detachChild(childId);
698
-
699
- // Verify only 20 nodes removed
700
- const finalSize = debugger.getStats().totalNodes;
701
- expect(finalSize).toBe(80);
702
-
703
- // Verify detached nodes not accessible
704
- expect(debugger.getNode(detachedChildId)).toBeUndefined();
705
- expect(debugger.getNode(detachedGrandchildId)).toBeUndefined();
706
- });
707
-
708
- it('should correctly add subtree using DFS', () => {
709
- const debugger = new WorkflowTreeDebugger(rootWorkflow);
710
-
711
- // Attach subtree with 20 nodes
712
- attachChild(parentId, newChild);
713
-
714
- // Verify all 20 nodes added
715
- const stats = debugger.getStats();
716
- expect(stats.totalNodes).toBe(120);
717
-
718
- // Verify all nodes accessible
719
- expect(debugger.getNode(newChild.id)).toBeDefined();
720
- expect(debugger.getNode(grandchild.id)).toBeDefined();
721
- });
722
-
723
- it('should handle non-structural events efficiently', () => {
724
- const debugger = new WorkflowTreeDebugger(rootWorkflow);
725
- const initialMapSize = (debugger as any).nodeMap.size;
726
-
727
- // Trigger 100 non-structural events
728
- for (let i = 0; i < 100; i++) {
729
- triggerNonStructuralEvent();
730
- }
731
-
732
- // Verify nodeMap not rebuilt
733
- expect((debugger as any).nodeMap.size).toBe(initialMapSize);
734
- });
735
- });
736
- ```
737
-
738
- ---
739
-
740
- ## 7. Summary & Recommendations
741
-
742
- ### 7.1 Key Takeaways
743
-
744
- 1. **Use BFS for subtree removal** - Parent before children, predictable ordering
745
- 2. **Use DFS for subtree addition** - Memory efficient, natural recursion
746
- 3. **Event-type dispatch** - Only update map on structural changes
747
- 4. **Batch operations** - Collect keys, then update atomically
748
- 5. **Consider iterative DFS** - Avoid stack overflow on deep trees
749
-
750
- ### 7.2 Performance Improvements
751
-
752
- **Before (Full Rebuild):**
753
- - Time: O(n) for every tree change
754
- - Memory: O(n) - entire tree in memory during rebuild
755
- - Scalability: Poor for large trees
756
-
757
- **After (Incremental):**
758
- - Time: O(m) where m = subtree size
759
- - Memory: O(w) for BFS, O(h) for DFS
760
- - Scalability: Excellent for large trees
761
-
762
- **Expected Speedup:** 10-100x for large trees when modifying small subtrees
763
-
764
- ### 7.3 References
765
-
766
- 1. **React Reconciliation:** https://react.dev/learn/render-and-commit
767
- - Section: "React's Diffing Algorithm"
768
- - Key concepts: O(n) heuristics, key-based identification
769
-
770
- 2. **MDN Map Documentation:** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
771
- - Operations: O(1) get/set/has/delete
772
- - Iteration: forEach and for...of performance
773
-
774
- 3. **V8 Performance Blog:** https://v8.dev/blog
775
- - Map optimization patterns
776
- - Hidden classes and inline caching
777
-
778
- 4. **WeakMap Documentation:** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
779
- - Use case: Auxiliary data that shouldn't prevent GC
780
-
781
- 5. **Chrome DevTools Memory:** https://developer.chrome.com/docs/devtools/memory-problems
782
- - Heap snapshots, memory profiling
783
-
784
- ---
785
-
786
- **Document Status:** Research Complete
787
- **Next Step:** Implement incremental updates in WorkflowTreeDebugger
788
- **Estimated Impact:** 10-100x performance improvement for large tree operations