groundswell 0.0.1 → 0.0.3

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 (451) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/README.md +99 -5
  3. package/dist/__tests__/adversarial/attachChild-performance.test.d.ts +16 -0
  4. package/dist/__tests__/adversarial/attachChild-performance.test.d.ts.map +1 -0
  5. package/dist/__tests__/adversarial/attachChild-performance.test.js +187 -0
  6. package/dist/__tests__/adversarial/attachChild-performance.test.js.map +1 -0
  7. package/dist/__tests__/adversarial/circular-reference.test.d.ts +13 -0
  8. package/dist/__tests__/adversarial/circular-reference.test.d.ts.map +1 -0
  9. package/dist/__tests__/adversarial/circular-reference.test.js +92 -0
  10. package/dist/__tests__/adversarial/circular-reference.test.js.map +1 -0
  11. package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts +16 -0
  12. package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts.map +1 -0
  13. package/dist/__tests__/adversarial/complex-circular-reference.test.js +127 -0
  14. package/dist/__tests__/adversarial/complex-circular-reference.test.js.map +1 -0
  15. package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts +21 -0
  16. package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts.map +1 -0
  17. package/dist/__tests__/adversarial/concurrent-task-failures.test.js +667 -0
  18. package/dist/__tests__/adversarial/concurrent-task-failures.test.js.map +1 -0
  19. package/dist/__tests__/adversarial/deep-analysis.test.d.ts +6 -0
  20. package/dist/__tests__/adversarial/deep-analysis.test.d.ts.map +1 -0
  21. package/dist/__tests__/adversarial/deep-analysis.test.js +877 -0
  22. package/dist/__tests__/adversarial/deep-analysis.test.js.map +1 -0
  23. package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts +13 -0
  24. package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts.map +1 -0
  25. package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js +186 -0
  26. package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js.map +1 -0
  27. package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts +6 -0
  28. package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts.map +1 -0
  29. package/dist/__tests__/adversarial/e2e-prd-validation.test.js +626 -0
  30. package/dist/__tests__/adversarial/e2e-prd-validation.test.js.map +1 -0
  31. package/dist/__tests__/adversarial/edge-case.test.d.ts +6 -0
  32. package/dist/__tests__/adversarial/edge-case.test.d.ts.map +1 -0
  33. package/dist/__tests__/adversarial/edge-case.test.js +857 -0
  34. package/dist/__tests__/adversarial/edge-case.test.js.map +1 -0
  35. package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts +20 -0
  36. package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts.map +1 -0
  37. package/dist/__tests__/adversarial/error-merge-strategy.test.js +907 -0
  38. package/dist/__tests__/adversarial/error-merge-strategy.test.js.map +1 -0
  39. package/dist/__tests__/adversarial/incremental-performance.test.d.ts +2 -0
  40. package/dist/__tests__/adversarial/incremental-performance.test.d.ts.map +1 -0
  41. package/dist/__tests__/adversarial/incremental-performance.test.js +113 -0
  42. package/dist/__tests__/adversarial/incremental-performance.test.js.map +1 -0
  43. package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts +22 -0
  44. package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts.map +1 -0
  45. package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js +383 -0
  46. package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js.map +1 -0
  47. package/dist/__tests__/adversarial/observer-propagation.test.d.ts +21 -0
  48. package/dist/__tests__/adversarial/observer-propagation.test.d.ts.map +1 -0
  49. package/dist/__tests__/adversarial/observer-propagation.test.js +404 -0
  50. package/dist/__tests__/adversarial/observer-propagation.test.js.map +1 -0
  51. package/dist/__tests__/adversarial/parent-validation.test.d.ts +13 -0
  52. package/dist/__tests__/adversarial/parent-validation.test.d.ts.map +1 -0
  53. package/dist/__tests__/adversarial/parent-validation.test.js +128 -0
  54. package/dist/__tests__/adversarial/parent-validation.test.js.map +1 -0
  55. package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts +20 -0
  56. package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts.map +1 -0
  57. package/dist/__tests__/adversarial/prd-12-2-compliance.test.js +482 -0
  58. package/dist/__tests__/adversarial/prd-12-2-compliance.test.js.map +1 -0
  59. package/dist/__tests__/adversarial/prd-compliance.test.d.ts +6 -0
  60. package/dist/__tests__/adversarial/prd-compliance.test.d.ts.map +1 -0
  61. package/dist/__tests__/adversarial/prd-compliance.test.js +886 -0
  62. package/dist/__tests__/adversarial/prd-compliance.test.js.map +1 -0
  63. package/dist/__tests__/compatibility/backward-compatibility.test.d.ts +22 -0
  64. package/dist/__tests__/compatibility/backward-compatibility.test.d.ts.map +1 -0
  65. package/dist/__tests__/compatibility/backward-compatibility.test.js +1843 -0
  66. package/dist/__tests__/compatibility/backward-compatibility.test.js.map +1 -0
  67. package/dist/__tests__/helpers/index.d.ts +10 -0
  68. package/dist/__tests__/helpers/index.d.ts.map +1 -0
  69. package/dist/__tests__/helpers/index.js +10 -0
  70. package/dist/__tests__/helpers/index.js.map +1 -0
  71. package/dist/__tests__/helpers/tree-verification.d.ts +90 -0
  72. package/dist/__tests__/helpers/tree-verification.d.ts.map +1 -0
  73. package/dist/__tests__/helpers/tree-verification.js +202 -0
  74. package/dist/__tests__/helpers/tree-verification.js.map +1 -0
  75. package/dist/__tests__/integration/agent-workflow.test.d.ts +2 -0
  76. package/dist/__tests__/integration/agent-workflow.test.d.ts.map +1 -0
  77. package/dist/__tests__/integration/agent-workflow.test.js +256 -0
  78. package/dist/__tests__/integration/agent-workflow.test.js.map +1 -0
  79. package/dist/__tests__/integration/bidirectional-consistency.test.d.ts +14 -0
  80. package/dist/__tests__/integration/bidirectional-consistency.test.d.ts.map +1 -0
  81. package/dist/__tests__/integration/bidirectional-consistency.test.js +668 -0
  82. package/dist/__tests__/integration/bidirectional-consistency.test.js.map +1 -0
  83. package/dist/__tests__/integration/observer-logging.test.d.ts +2 -0
  84. package/dist/__tests__/integration/observer-logging.test.d.ts.map +1 -0
  85. package/dist/__tests__/integration/observer-logging.test.js +517 -0
  86. package/dist/__tests__/integration/observer-logging.test.js.map +1 -0
  87. package/dist/__tests__/integration/tree-mirroring.test.d.ts +2 -0
  88. package/dist/__tests__/integration/tree-mirroring.test.d.ts.map +1 -0
  89. package/dist/__tests__/integration/tree-mirroring.test.js +117 -0
  90. package/dist/__tests__/integration/tree-mirroring.test.js.map +1 -0
  91. package/dist/__tests__/integration/workflow-reparenting.test.d.ts +12 -0
  92. package/dist/__tests__/integration/workflow-reparenting.test.d.ts.map +1 -0
  93. package/dist/__tests__/integration/workflow-reparenting.test.js +239 -0
  94. package/dist/__tests__/integration/workflow-reparenting.test.js.map +1 -0
  95. package/dist/__tests__/unit/agent.test.d.ts +2 -0
  96. package/dist/__tests__/unit/agent.test.d.ts.map +1 -0
  97. package/dist/__tests__/unit/agent.test.js +143 -0
  98. package/dist/__tests__/unit/agent.test.js.map +1 -0
  99. package/dist/__tests__/unit/cache-key.test.d.ts +5 -0
  100. package/dist/__tests__/unit/cache-key.test.d.ts.map +1 -0
  101. package/dist/__tests__/unit/cache-key.test.js +145 -0
  102. package/dist/__tests__/unit/cache-key.test.js.map +1 -0
  103. package/dist/__tests__/unit/cache.test.d.ts +5 -0
  104. package/dist/__tests__/unit/cache.test.d.ts.map +1 -0
  105. package/dist/__tests__/unit/cache.test.js +132 -0
  106. package/dist/__tests__/unit/cache.test.js.map +1 -0
  107. package/dist/__tests__/unit/context.test.d.ts +2 -0
  108. package/dist/__tests__/unit/context.test.d.ts.map +1 -0
  109. package/dist/__tests__/unit/context.test.js +220 -0
  110. package/dist/__tests__/unit/context.test.js.map +1 -0
  111. package/dist/__tests__/unit/decorators.test.d.ts +2 -0
  112. package/dist/__tests__/unit/decorators.test.d.ts.map +1 -0
  113. package/dist/__tests__/unit/decorators.test.js +162 -0
  114. package/dist/__tests__/unit/decorators.test.js.map +1 -0
  115. package/dist/__tests__/unit/introspection-tools.test.d.ts +5 -0
  116. package/dist/__tests__/unit/introspection-tools.test.d.ts.map +1 -0
  117. package/dist/__tests__/unit/introspection-tools.test.js +191 -0
  118. package/dist/__tests__/unit/introspection-tools.test.js.map +1 -0
  119. package/dist/__tests__/unit/logger.test.d.ts +2 -0
  120. package/dist/__tests__/unit/logger.test.d.ts.map +1 -0
  121. package/dist/__tests__/unit/logger.test.js +241 -0
  122. package/dist/__tests__/unit/logger.test.js.map +1 -0
  123. package/dist/__tests__/unit/observable.test.d.ts +2 -0
  124. package/dist/__tests__/unit/observable.test.d.ts.map +1 -0
  125. package/dist/__tests__/unit/observable.test.js +251 -0
  126. package/dist/__tests__/unit/observable.test.js.map +1 -0
  127. package/dist/__tests__/unit/prompt.test.d.ts +2 -0
  128. package/dist/__tests__/unit/prompt.test.d.ts.map +1 -0
  129. package/dist/__tests__/unit/prompt.test.js +113 -0
  130. package/dist/__tests__/unit/prompt.test.js.map +1 -0
  131. package/dist/__tests__/unit/reflection.test.d.ts +5 -0
  132. package/dist/__tests__/unit/reflection.test.d.ts.map +1 -0
  133. package/dist/__tests__/unit/reflection.test.js +160 -0
  134. package/dist/__tests__/unit/reflection.test.js.map +1 -0
  135. package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts +2 -0
  136. package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts.map +1 -0
  137. package/dist/__tests__/unit/tree-debugger-incremental.test.js +136 -0
  138. package/dist/__tests__/unit/tree-debugger-incremental.test.js.map +1 -0
  139. package/dist/__tests__/unit/tree-debugger.test.d.ts +2 -0
  140. package/dist/__tests__/unit/tree-debugger.test.d.ts.map +1 -0
  141. package/dist/__tests__/unit/tree-debugger.test.js +69 -0
  142. package/dist/__tests__/unit/tree-debugger.test.js.map +1 -0
  143. package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts +2 -0
  144. package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts.map +1 -0
  145. package/dist/__tests__/unit/utils/workflow-error-utils.test.js +154 -0
  146. package/dist/__tests__/unit/utils/workflow-error-utils.test.js.map +1 -0
  147. package/dist/__tests__/unit/workflow-detachChild.test.d.ts +2 -0
  148. package/dist/__tests__/unit/workflow-detachChild.test.d.ts.map +1 -0
  149. package/dist/__tests__/unit/workflow-detachChild.test.js +76 -0
  150. package/dist/__tests__/unit/workflow-detachChild.test.js.map +1 -0
  151. package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts +2 -0
  152. package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts.map +1 -0
  153. package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js +122 -0
  154. package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js.map +1 -0
  155. package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts +2 -0
  156. package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts.map +1 -0
  157. package/dist/__tests__/unit/workflow-isDescendantOf.test.js +140 -0
  158. package/dist/__tests__/unit/workflow-isDescendantOf.test.js.map +1 -0
  159. package/dist/__tests__/unit/workflow.test.d.ts +2 -0
  160. package/dist/__tests__/unit/workflow.test.d.ts.map +1 -0
  161. package/dist/__tests__/unit/workflow.test.js +330 -0
  162. package/dist/__tests__/unit/workflow.test.js.map +1 -0
  163. package/dist/cache/cache-key.d.ts +66 -0
  164. package/dist/cache/cache-key.d.ts.map +1 -0
  165. package/dist/cache/cache-key.js +195 -0
  166. package/dist/cache/cache-key.js.map +1 -0
  167. package/dist/cache/cache.d.ts +104 -0
  168. package/dist/cache/cache.d.ts.map +1 -0
  169. package/dist/cache/cache.js +179 -0
  170. package/dist/cache/cache.js.map +1 -0
  171. package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
  172. package/dist/cache/index.d.ts.map +1 -0
  173. package/dist/cache/index.js +6 -0
  174. package/dist/cache/index.js.map +1 -0
  175. package/dist/core/agent.d.ts +112 -0
  176. package/dist/core/agent.d.ts.map +1 -0
  177. package/dist/core/agent.js +426 -0
  178. package/dist/core/agent.js.map +1 -0
  179. package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
  180. package/dist/core/context.d.ts.map +1 -0
  181. package/dist/core/context.js +80 -0
  182. package/dist/core/context.js.map +1 -0
  183. package/dist/core/event-tree.d.ts +72 -0
  184. package/dist/core/event-tree.d.ts.map +1 -0
  185. package/dist/core/event-tree.js +211 -0
  186. package/dist/core/event-tree.js.map +1 -0
  187. package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
  188. package/dist/core/factory.d.ts.map +1 -0
  189. package/dist/core/factory.js +110 -0
  190. package/dist/core/factory.js.map +1 -0
  191. package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
  192. package/dist/core/index.d.ts.map +1 -0
  193. package/dist/core/index.js +9 -0
  194. package/dist/core/index.js.map +1 -0
  195. package/dist/core/logger.d.ts +50 -0
  196. package/dist/core/logger.d.ts.map +1 -0
  197. package/dist/core/logger.js +91 -0
  198. package/dist/core/logger.js.map +1 -0
  199. package/dist/core/mcp-handler.d.ts +69 -0
  200. package/dist/core/mcp-handler.d.ts.map +1 -0
  201. package/dist/core/mcp-handler.js +143 -0
  202. package/dist/core/mcp-handler.js.map +1 -0
  203. package/dist/core/prompt.d.ts +80 -0
  204. package/dist/core/prompt.d.ts.map +1 -0
  205. package/dist/core/prompt.js +120 -0
  206. package/dist/core/prompt.js.map +1 -0
  207. package/dist/core/workflow-context.d.ts +57 -0
  208. package/dist/core/workflow-context.d.ts.map +1 -0
  209. package/dist/core/workflow-context.js +263 -0
  210. package/dist/core/workflow-context.js.map +1 -0
  211. package/dist/core/workflow.d.ts +241 -0
  212. package/dist/core/workflow.d.ts.map +1 -0
  213. package/dist/core/workflow.js +464 -0
  214. package/dist/core/workflow.js.map +1 -0
  215. package/dist/debugger/index.d.ts +2 -0
  216. package/dist/debugger/index.d.ts.map +1 -0
  217. package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
  218. package/dist/debugger/index.js.map +1 -0
  219. package/dist/debugger/tree-debugger.d.ts +71 -0
  220. package/dist/debugger/tree-debugger.d.ts.map +1 -0
  221. package/dist/debugger/tree-debugger.js +198 -0
  222. package/dist/debugger/tree-debugger.js.map +1 -0
  223. package/dist/decorators/index.d.ts +4 -0
  224. package/dist/decorators/index.d.ts.map +1 -0
  225. package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
  226. package/dist/decorators/index.js.map +1 -0
  227. package/dist/decorators/observed-state.d.ts +32 -0
  228. package/dist/decorators/observed-state.d.ts.map +1 -0
  229. package/dist/decorators/observed-state.js +79 -0
  230. package/dist/decorators/observed-state.js.map +1 -0
  231. package/dist/decorators/step.d.ts +15 -0
  232. package/dist/decorators/step.d.ts.map +1 -0
  233. package/dist/decorators/step.js +110 -0
  234. package/dist/decorators/step.js.map +1 -0
  235. package/dist/decorators/task.d.ts +50 -0
  236. package/dist/decorators/task.d.ts.map +1 -0
  237. package/dist/decorators/task.js +118 -0
  238. package/dist/decorators/task.js.map +1 -0
  239. package/dist/examples/index.d.ts +3 -0
  240. package/dist/examples/index.d.ts.map +1 -0
  241. package/{src/examples/index.ts → dist/examples/index.js} +1 -0
  242. package/dist/examples/index.js.map +1 -0
  243. package/dist/examples/tdd-orchestrator.d.ts +15 -0
  244. package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
  245. package/dist/examples/tdd-orchestrator.js +121 -0
  246. package/dist/examples/tdd-orchestrator.js.map +1 -0
  247. package/dist/examples/test-cycle-workflow.d.ts +14 -0
  248. package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
  249. package/dist/examples/test-cycle-workflow.js +116 -0
  250. package/dist/examples/test-cycle-workflow.js.map +1 -0
  251. package/dist/index.d.ts +27 -0
  252. package/dist/index.d.ts.map +1 -0
  253. package/dist/index.js +40 -0
  254. package/dist/index.js.map +1 -0
  255. package/dist/reflection/index.d.ts +5 -0
  256. package/dist/reflection/index.d.ts.map +1 -0
  257. package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
  258. package/dist/reflection/index.js.map +1 -0
  259. package/dist/reflection/reflection.d.ts +84 -0
  260. package/dist/reflection/reflection.d.ts.map +1 -0
  261. package/dist/reflection/reflection.js +329 -0
  262. package/dist/reflection/reflection.js.map +1 -0
  263. package/dist/tools/index.d.ts +6 -0
  264. package/dist/tools/index.d.ts.map +1 -0
  265. package/dist/tools/index.js +11 -0
  266. package/dist/tools/index.js.map +1 -0
  267. package/dist/tools/introspection.d.ts +165 -0
  268. package/dist/tools/introspection.d.ts.map +1 -0
  269. package/dist/tools/introspection.js +324 -0
  270. package/dist/tools/introspection.js.map +1 -0
  271. package/dist/types/agent.d.ts +66 -0
  272. package/dist/types/agent.d.ts.map +1 -0
  273. package/dist/types/agent.js +6 -0
  274. package/dist/types/agent.js.map +1 -0
  275. package/dist/types/decorators.d.ts +31 -0
  276. package/dist/types/decorators.d.ts.map +1 -0
  277. package/dist/types/decorators.js +2 -0
  278. package/dist/types/decorators.js.map +1 -0
  279. package/dist/types/error-strategy.d.ts +13 -0
  280. package/dist/types/error-strategy.d.ts.map +1 -0
  281. package/dist/types/error-strategy.js +2 -0
  282. package/dist/types/error-strategy.js.map +1 -0
  283. package/dist/types/error.d.ts +20 -0
  284. package/dist/types/error.d.ts.map +1 -0
  285. package/dist/types/error.js +2 -0
  286. package/dist/types/error.js.map +1 -0
  287. package/dist/types/events.d.ts +87 -0
  288. package/dist/types/events.d.ts.map +1 -0
  289. package/dist/types/events.js +2 -0
  290. package/dist/types/events.js.map +1 -0
  291. package/dist/types/index.d.ts +15 -0
  292. package/dist/types/index.d.ts.map +1 -0
  293. package/dist/types/index.js +2 -0
  294. package/dist/types/index.js.map +1 -0
  295. package/dist/types/logging.d.ts +24 -0
  296. package/dist/types/logging.d.ts.map +1 -0
  297. package/dist/types/logging.js +2 -0
  298. package/dist/types/logging.js.map +1 -0
  299. package/dist/types/observer.d.ts +18 -0
  300. package/dist/types/observer.d.ts.map +1 -0
  301. package/dist/types/observer.js +2 -0
  302. package/dist/types/observer.js.map +1 -0
  303. package/dist/types/prompt.d.ts +31 -0
  304. package/dist/types/prompt.d.ts.map +1 -0
  305. package/dist/types/prompt.js +6 -0
  306. package/dist/types/prompt.js.map +1 -0
  307. package/dist/types/reflection.d.ts +96 -0
  308. package/dist/types/reflection.d.ts.map +1 -0
  309. package/dist/types/reflection.js +24 -0
  310. package/dist/types/reflection.js.map +1 -0
  311. package/dist/types/sdk-primitives.d.ts +118 -0
  312. package/dist/types/sdk-primitives.d.ts.map +1 -0
  313. package/dist/types/sdk-primitives.js +6 -0
  314. package/dist/types/sdk-primitives.js.map +1 -0
  315. package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
  316. package/dist/types/snapshot.d.ts.map +1 -0
  317. package/dist/types/snapshot.js +2 -0
  318. package/dist/types/snapshot.js.map +1 -0
  319. package/dist/types/workflow-context.d.ts +139 -0
  320. package/dist/types/workflow-context.d.ts.map +1 -0
  321. package/dist/types/workflow-context.js +8 -0
  322. package/dist/types/workflow-context.js.map +1 -0
  323. package/dist/types/workflow.d.ts +30 -0
  324. package/dist/types/workflow.d.ts.map +1 -0
  325. package/dist/types/workflow.js +2 -0
  326. package/dist/types/workflow.js.map +1 -0
  327. package/dist/utils/id.d.ts +6 -0
  328. package/dist/utils/id.d.ts.map +1 -0
  329. package/dist/utils/id.js +12 -0
  330. package/dist/utils/id.js.map +1 -0
  331. package/{src/utils/index.ts → dist/utils/index.d.ts} +2 -0
  332. package/dist/utils/index.d.ts.map +1 -0
  333. package/dist/utils/index.js +4 -0
  334. package/dist/utils/index.js.map +1 -0
  335. package/dist/utils/observable.d.ts +54 -0
  336. package/dist/utils/observable.d.ts.map +1 -0
  337. package/dist/utils/observable.js +82 -0
  338. package/dist/utils/observable.js.map +1 -0
  339. package/dist/utils/workflow-error-utils.d.ts +22 -0
  340. package/dist/utils/workflow-error-utils.d.ts.map +1 -0
  341. package/dist/utils/workflow-error-utils.js +45 -0
  342. package/dist/utils/workflow-error-utils.js.map +1 -0
  343. package/package.json +7 -2
  344. package/.claude/settings.local.json +0 -9
  345. package/.claude/system_prompts/task-breakdown.md +0 -100
  346. package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
  347. package/PRPs/PRDs/001-hierarchical-workflow-engine.md +0 -543
  348. package/PRPs/PRDs/002-agent-prompt.md +0 -390
  349. package/PRPs/PRDs/003-agent-prompt.md +0 -943
  350. package/PRPs/PRDs/004-agent-prompt.md +0 -1136
  351. package/PRPs/PRDs/tasks-001.json +0 -492
  352. package/PRPs/README.md +0 -83
  353. package/PRPs/templates/prp_base.md +0 -222
  354. package/docs/agent.md +0 -422
  355. package/docs/prompt.md +0 -419
  356. package/docs/workflow.md +0 -600
  357. package/examples/README.md +0 -244
  358. package/examples/examples/01-basic-workflow.ts +0 -100
  359. package/examples/examples/02-decorator-options.ts +0 -217
  360. package/examples/examples/03-parent-child.ts +0 -241
  361. package/examples/examples/04-observers-debugger.ts +0 -340
  362. package/examples/examples/05-error-handling.ts +0 -387
  363. package/examples/examples/06-concurrent-tasks.ts +0 -352
  364. package/examples/examples/07-agent-loops.ts +0 -432
  365. package/examples/examples/08-sdk-features.ts +0 -667
  366. package/examples/examples/09-reflection.ts +0 -573
  367. package/examples/examples/10-introspection.ts +0 -550
  368. package/examples/index.ts +0 -143
  369. package/examples/utils/helpers.ts +0 -57
  370. package/llms_full.txt +0 -5890
  371. package/plan/P1P2/PRP.md +0 -527
  372. package/plan/P1P2/research/LRU_CACHE_BEST_PRACTICES.md +0 -1929
  373. package/plan/P1P2/research/LRU_CACHE_CODE_PATTERNS.md +0 -857
  374. package/plan/P1P2/research/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
  375. package/plan/P1P2/research/LRU_CACHE_RESEARCH_INDEX.md +0 -424
  376. package/plan/P1P2/research/REFLECTION_INDEX.md +0 -291
  377. package/plan/P1P2/research/REFLECTION_RESEARCH_REPORT.md +0 -1342
  378. package/plan/P1P2/research/RESEARCH_SUMMARY.md +0 -342
  379. package/plan/P1P2/research/anthropic-sdk.md +0 -174
  380. package/plan/P1P2/research/async-local-storage.md +0 -200
  381. package/plan/P1P2/research/reflection-code-patterns.md +0 -1205
  382. package/plan/P1P2/research/reflection-decision-matrix.md +0 -421
  383. package/plan/P1P2/research/reflection-implementation-guide.md +0 -1341
  384. package/plan/P1P2/research/reflection-integration-guide.md +0 -834
  385. package/plan/P1P2/research/reflection-patterns.md +0 -1468
  386. package/plan/P1P2/research/reflection-quick-reference.md +0 -558
  387. package/plan/P1P2/research/zod-schema.md +0 -152
  388. package/plan/P3P4/PRP.md +0 -1388
  389. package/plan/P3P4/research/caching-lru.md +0 -116
  390. package/plan/P3P4/research/introspection-tools.md +0 -177
  391. package/plan/P3P4/research/reflection-patterns.md +0 -117
  392. package/plan/P4P5/PRP.md +0 -1136
  393. package/plan/P4P5/research/RESEARCH_SUMMARY.md +0 -151
  394. package/plan/architecture/external_deps.md +0 -358
  395. package/plan/architecture/system_context.md +0 -242
  396. package/plan/backlog.json +0 -867
  397. package/plan/research/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
  398. package/plan/research/README-INTROSPECTION.md +0 -352
  399. package/plan/research/agent-introspection-patterns.md +0 -1085
  400. package/plan/research/introspection-security-guide.md +0 -928
  401. package/plan/research/introspection-tool-examples.md +0 -875
  402. package/scripts/generate-llms-full.ts +0 -206
  403. package/src/__tests__/integration/agent-workflow.test.ts +0 -256
  404. package/src/__tests__/integration/tree-mirroring.test.ts +0 -114
  405. package/src/__tests__/unit/agent.test.ts +0 -169
  406. package/src/__tests__/unit/cache-key.test.ts +0 -182
  407. package/src/__tests__/unit/cache.test.ts +0 -172
  408. package/src/__tests__/unit/context.test.ts +0 -138
  409. package/src/__tests__/unit/decorators.test.ts +0 -100
  410. package/src/__tests__/unit/introspection-tools.test.ts +0 -277
  411. package/src/__tests__/unit/prompt.test.ts +0 -135
  412. package/src/__tests__/unit/reflection.test.ts +0 -210
  413. package/src/__tests__/unit/tree-debugger.test.ts +0 -85
  414. package/src/__tests__/unit/workflow.test.ts +0 -81
  415. package/src/cache/cache-key.ts +0 -244
  416. package/src/cache/cache.ts +0 -236
  417. package/src/core/agent.ts +0 -573
  418. package/src/core/event-tree.ts +0 -260
  419. package/src/core/logger.ts +0 -87
  420. package/src/core/mcp-handler.ts +0 -184
  421. package/src/core/prompt.ts +0 -150
  422. package/src/core/workflow-context.ts +0 -349
  423. package/src/core/workflow.ts +0 -302
  424. package/src/debugger/tree-debugger.ts +0 -210
  425. package/src/decorators/observed-state.ts +0 -95
  426. package/src/decorators/step.ts +0 -139
  427. package/src/decorators/task.ts +0 -96
  428. package/src/examples/tdd-orchestrator.ts +0 -65
  429. package/src/examples/test-cycle-workflow.ts +0 -64
  430. package/src/index.ts +0 -140
  431. package/src/reflection/reflection.ts +0 -407
  432. package/src/tools/index.ts +0 -36
  433. package/src/tools/introspection.ts +0 -464
  434. package/src/types/agent.ts +0 -90
  435. package/src/types/decorators.ts +0 -25
  436. package/src/types/error-strategy.ts +0 -13
  437. package/src/types/error.ts +0 -20
  438. package/src/types/events.ts +0 -74
  439. package/src/types/index.ts +0 -55
  440. package/src/types/logging.ts +0 -24
  441. package/src/types/observer.ts +0 -18
  442. package/src/types/prompt.ts +0 -40
  443. package/src/types/reflection.ts +0 -117
  444. package/src/types/sdk-primitives.ts +0 -128
  445. package/src/types/workflow-context.ts +0 -163
  446. package/src/types/workflow.ts +0 -37
  447. package/src/utils/id.ts +0 -11
  448. package/src/utils/observable.ts +0 -77
  449. package/tasks.json +0 -0
  450. package/tsconfig.json +0 -22
  451. package/vitest.config.ts +0 -16
@@ -0,0 +1,136 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Workflow, WorkflowTreeDebugger } from '../../index.js';
3
+ class IncrementalTestWorkflow extends Workflow {
4
+ async run() {
5
+ this.setStatus('completed');
6
+ }
7
+ }
8
+ describe('Incremental Node Map Updates', () => {
9
+ it('childDetached removes entire subtree (node + descendants)', () => {
10
+ const root = new IncrementalTestWorkflow('Root');
11
+ const child1 = new IncrementalTestWorkflow('Child1', root);
12
+ const grandchild = new IncrementalTestWorkflow('Grandchild', child1);
13
+ const child2 = new IncrementalTestWorkflow('Child2', root);
14
+ const debugger_ = new WorkflowTreeDebugger(root);
15
+ // Verify all nodes are initially in the map
16
+ expect(debugger_.getNode(root.id)).toBe(root.getNode());
17
+ expect(debugger_.getNode(child1.id)).toBe(child1.getNode());
18
+ expect(debugger_.getNode(grandchild.id)).toBe(grandchild.getNode());
19
+ expect(debugger_.getNode(child2.id)).toBe(child2.getNode());
20
+ expect(debugger_.getStats().totalNodes).toBe(4);
21
+ // Detach child1 (should remove child1 + grandchild)
22
+ root.detachChild(child1);
23
+ // Verify child1 and grandchild are removed
24
+ expect(debugger_.getNode(child1.id)).toBeUndefined();
25
+ expect(debugger_.getNode(grandchild.id)).toBeUndefined();
26
+ // Verify root and child2 are still present
27
+ expect(debugger_.getNode(root.id)).toBe(root.getNode());
28
+ expect(debugger_.getNode(child2.id)).toBe(child2.getNode());
29
+ // Verify total node count decreased by 2
30
+ expect(debugger_.getStats().totalNodes).toBe(2);
31
+ });
32
+ it('childDetached on already-removed node is no-op', () => {
33
+ const root = new IncrementalTestWorkflow('Root');
34
+ const child1 = new IncrementalTestWorkflow('Child1', root);
35
+ const grandchild = new IncrementalTestWorkflow('Grandchild', child1);
36
+ const debugger_ = new WorkflowTreeDebugger(root);
37
+ expect(debugger_.getStats().totalNodes).toBe(3);
38
+ // Detach child1
39
+ root.detachChild(child1);
40
+ expect(debugger_.getStats().totalNodes).toBe(1);
41
+ expect(debugger_.getNode(child1.id)).toBeUndefined();
42
+ expect(debugger_.getNode(grandchild.id)).toBeUndefined();
43
+ // Simulate the edge case where nodeMap still has orphaned nodes
44
+ // by directly removing a node that was never properly attached
45
+ // This tests the removeSubtreeNodes() no-op behavior
46
+ const orphanId = 'nonexistent-node';
47
+ expect(debugger_.getNode(orphanId)).toBeUndefined();
48
+ // Calling removeSubtreeNodes on a non-existent node should be safe
49
+ // We can't call detachChild twice because it throws, but we can
50
+ // verify the nodeMap state is consistent
51
+ expect(debugger_.getStats().totalNodes).toBe(1);
52
+ });
53
+ it('childAttached adds subtree (verify existing behavior)', () => {
54
+ const root = new IncrementalTestWorkflow('Root');
55
+ const debugger_ = new WorkflowTreeDebugger(root);
56
+ expect(debugger_.getStats().totalNodes).toBe(1);
57
+ // Attach a child with its own subtree
58
+ const child1 = new IncrementalTestWorkflow('Child1', root);
59
+ const grandchild = new IncrementalTestWorkflow('Grandchild', child1);
60
+ // Verify all nodes are in the map
61
+ expect(debugger_.getNode(root.id)).toBe(root.getNode());
62
+ expect(debugger_.getNode(child1.id)).toBe(child1.getNode());
63
+ expect(debugger_.getNode(grandchild.id)).toBe(grandchild.getNode());
64
+ expect(debugger_.getStats().totalNodes).toBe(3);
65
+ });
66
+ it('onTreeChanged does not rebuild map', () => {
67
+ const root = new IncrementalTestWorkflow('Root');
68
+ const child1 = new IncrementalTestWorkflow('Child1', root);
69
+ const grandchild = new IncrementalTestWorkflow('Grandchild', child1);
70
+ const child2 = new IncrementalTestWorkflow('Child2', root);
71
+ const debugger_ = new WorkflowTreeDebugger(root);
72
+ // Get reference to the nodeMap (we'll check it's the same object)
73
+ const nodeMapBefore = debugger_.getStats();
74
+ // Detach child1
75
+ root.detachChild(child1);
76
+ // Verify map was updated incrementally (nodes removed)
77
+ expect(debugger_.getStats().totalNodes).toBe(2);
78
+ expect(debugger_.getNode(child1.id)).toBeUndefined();
79
+ expect(debugger_.getNode(grandchild.id)).toBeUndefined();
80
+ // Verify remaining nodes are still accessible
81
+ expect(debugger_.getNode(root.id)).toBe(root.getNode());
82
+ expect(debugger_.getNode(child2.id)).toBe(child2.getNode());
83
+ });
84
+ it('multiple rapid attach/detach operations work correctly', () => {
85
+ const root = new IncrementalTestWorkflow('Root');
86
+ const child1 = new IncrementalTestWorkflow('Child1', root);
87
+ const child2 = new IncrementalTestWorkflow('Child2', root);
88
+ const grandchild1 = new IncrementalTestWorkflow('Grandchild1', child1);
89
+ const grandchild2 = new IncrementalTestWorkflow('Grandchild2', child1);
90
+ const debugger_ = new WorkflowTreeDebugger(root);
91
+ expect(debugger_.getStats().totalNodes).toBe(5);
92
+ // Detach child1 (removes child1 + 2 grandchildren)
93
+ root.detachChild(child1);
94
+ expect(debugger_.getStats().totalNodes).toBe(2);
95
+ // Attach a new child
96
+ const child3 = new IncrementalTestWorkflow('Child3', root);
97
+ expect(debugger_.getStats().totalNodes).toBe(3);
98
+ expect(debugger_.getNode(child3.id)).toBe(child3.getNode());
99
+ // Detach child2
100
+ root.detachChild(child2);
101
+ expect(debugger_.getStats().totalNodes).toBe(2);
102
+ // Verify final state
103
+ expect(debugger_.getNode(root.id)).toBe(root.getNode());
104
+ expect(debugger_.getNode(child3.id)).toBe(child3.getNode());
105
+ expect(debugger_.getNode(child1.id)).toBeUndefined();
106
+ expect(debugger_.getNode(child2.id)).toBeUndefined();
107
+ expect(debugger_.getNode(grandchild1.id)).toBeUndefined();
108
+ expect(debugger_.getNode(grandchild2.id)).toBeUndefined();
109
+ });
110
+ it('detaching node with many descendants removes all', () => {
111
+ const root = new IncrementalTestWorkflow('Root');
112
+ // Build a deep subtree
113
+ const child1 = new IncrementalTestWorkflow('Child1', root);
114
+ let current = child1;
115
+ const descendants = [];
116
+ for (let i = 0; i < 10; i++) {
117
+ const descendant = new IncrementalTestWorkflow(`Descendant${i}`, current);
118
+ descendants.push(descendant);
119
+ current = descendant;
120
+ }
121
+ const debugger_ = new WorkflowTreeDebugger(root);
122
+ // Total: 1 root + 1 child1 + 10 descendants = 12 nodes
123
+ expect(debugger_.getStats().totalNodes).toBe(12);
124
+ // Detach child1 (should remove child1 + all 10 descendants)
125
+ root.detachChild(child1);
126
+ // Verify all were removed
127
+ expect(debugger_.getStats().totalNodes).toBe(1);
128
+ expect(debugger_.getNode(child1.id)).toBeUndefined();
129
+ for (const descendant of descendants) {
130
+ expect(debugger_.getNode(descendant.id)).toBeUndefined();
131
+ }
132
+ // Verify root is still there
133
+ expect(debugger_.getNode(root.id)).toBe(root.getNode());
134
+ });
135
+ });
136
+ //# sourceMappingURL=tree-debugger-incremental.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-debugger-incremental.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/tree-debugger-incremental.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tree-debugger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-debugger.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/tree-debugger.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Workflow, WorkflowTreeDebugger } from '../../index.js';
3
+ class DebugTestWorkflow extends Workflow {
4
+ async run() {
5
+ this.setStatus('completed');
6
+ }
7
+ }
8
+ describe('WorkflowTreeDebugger', () => {
9
+ it('should render tree string', () => {
10
+ const wf = new DebugTestWorkflow('Root');
11
+ const debugger_ = new WorkflowTreeDebugger(wf);
12
+ const tree = debugger_.toTreeString();
13
+ expect(tree).toContain('Root');
14
+ expect(tree).toContain('[idle]');
15
+ });
16
+ it('should show child nodes in tree', () => {
17
+ const parent = new DebugTestWorkflow('Parent');
18
+ const child1 = new DebugTestWorkflow('Child1', parent);
19
+ const child2 = new DebugTestWorkflow('Child2', parent);
20
+ const debugger_ = new WorkflowTreeDebugger(parent);
21
+ const tree = debugger_.toTreeString();
22
+ expect(tree).toContain('Parent');
23
+ expect(tree).toContain('Child1');
24
+ expect(tree).toContain('Child2');
25
+ expect(tree).toContain('├──');
26
+ expect(tree).toContain('└──');
27
+ });
28
+ it('should find node by ID', () => {
29
+ const parent = new DebugTestWorkflow('Parent');
30
+ const child = new DebugTestWorkflow('Child', parent);
31
+ const debugger_ = new WorkflowTreeDebugger(parent);
32
+ expect(debugger_.getNode(parent.id)).toBe(parent.getNode());
33
+ expect(debugger_.getNode(child.id)).toBe(child.getNode());
34
+ expect(debugger_.getNode('nonexistent')).toBeUndefined();
35
+ });
36
+ it('should collect logs from all nodes', async () => {
37
+ const parent = new DebugTestWorkflow('Parent');
38
+ const child = new DebugTestWorkflow('Child', parent);
39
+ const debugger_ = new WorkflowTreeDebugger(parent);
40
+ // Add some logs manually
41
+ parent.getNode().logs.push({
42
+ id: '1',
43
+ workflowId: parent.id,
44
+ timestamp: Date.now(),
45
+ level: 'info',
46
+ message: 'Parent log',
47
+ });
48
+ child.getNode().logs.push({
49
+ id: '2',
50
+ workflowId: child.id,
51
+ timestamp: Date.now(),
52
+ level: 'info',
53
+ message: 'Child log',
54
+ });
55
+ const logString = debugger_.toLogString();
56
+ expect(logString).toContain('Parent log');
57
+ expect(logString).toContain('Child log');
58
+ });
59
+ it('should return stats', () => {
60
+ const parent = new DebugTestWorkflow('Parent');
61
+ new DebugTestWorkflow('Child1', parent);
62
+ new DebugTestWorkflow('Child2', parent);
63
+ const debugger_ = new WorkflowTreeDebugger(parent);
64
+ const stats = debugger_.getStats();
65
+ expect(stats.totalNodes).toBe(3);
66
+ expect(stats.byStatus.idle).toBe(3);
67
+ });
68
+ });
69
+ //# sourceMappingURL=tree-debugger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-debugger.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/tree-debugger.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workflow-error-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-error-utils.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/unit/utils/workflow-error-utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { mergeWorkflowErrors } from '../../../utils/workflow-error-utils.js';
3
+ describe('mergeWorkflowErrors', () => {
4
+ // Helper function to create a mock WorkflowError
5
+ function createMockWorkflowError(overrides) {
6
+ return {
7
+ message: 'Test error',
8
+ original: new Error('Original error'),
9
+ workflowId: 'wf-test-123',
10
+ stack: 'Error: Test error\n at test.ts:10:15',
11
+ state: { key: 'value' },
12
+ logs: [
13
+ {
14
+ id: 'log-1',
15
+ workflowId: 'wf-test-123',
16
+ timestamp: Date.now(),
17
+ level: 'error',
18
+ message: 'Test log message',
19
+ },
20
+ ],
21
+ ...overrides,
22
+ };
23
+ }
24
+ it('should return a single error when merging one error', () => {
25
+ const error = createMockWorkflowError({ workflowId: 'wf-1' });
26
+ const result = mergeWorkflowErrors([error], 'testTask', 'parent-wf', 1);
27
+ expect(result.message).toBe("1 of 1 concurrent child workflows failed in task 'testTask'");
28
+ expect(result.workflowId).toBe('parent-wf');
29
+ expect(result.logs).toEqual(error.logs);
30
+ expect(result.stack).toBe(error.stack);
31
+ expect(result.state).toEqual(error.state);
32
+ });
33
+ it('should aggregate multiple errors with unique workflow IDs', () => {
34
+ const error1 = createMockWorkflowError({
35
+ message: 'Error 1',
36
+ workflowId: 'wf-1',
37
+ stack: 'stack 1',
38
+ state: { key1: 'value1' },
39
+ logs: [{ id: 'log-1', workflowId: 'wf-1', timestamp: 1000, level: 'error', message: 'Log 1' }],
40
+ });
41
+ const error2 = createMockWorkflowError({
42
+ message: 'Error 2',
43
+ workflowId: 'wf-2',
44
+ stack: 'stack 2',
45
+ state: { key2: 'value2' },
46
+ logs: [{ id: 'log-2', workflowId: 'wf-2', timestamp: 2000, level: 'error', message: 'Log 2' }],
47
+ });
48
+ const error3 = createMockWorkflowError({
49
+ message: 'Error 3',
50
+ workflowId: 'wf-3',
51
+ stack: 'stack 3',
52
+ state: { key3: 'value3' },
53
+ logs: [{ id: 'log-3', workflowId: 'wf-3', timestamp: 3000, level: 'error', message: 'Log 3' }],
54
+ });
55
+ const result = mergeWorkflowErrors([error1, error2, error3], 'concurrentTask', 'parent-wf', 5);
56
+ expect(result.message).toBe("3 of 5 concurrent child workflows failed in task 'concurrentTask'");
57
+ expect(result.workflowId).toBe('parent-wf');
58
+ expect(result.stack).toBe('stack 1'); // First error's stack
59
+ expect(result.state).toEqual({ key1: 'value1' }); // First error's state
60
+ expect(result.logs).toHaveLength(3); // All logs aggregated
61
+ });
62
+ it('should deduplicate workflow IDs when errors have duplicate IDs', () => {
63
+ const error1 = createMockWorkflowError({ workflowId: 'wf-dup' });
64
+ const error2 = createMockWorkflowError({ workflowId: 'wf-dup' });
65
+ const error3 = createMockWorkflowError({ workflowId: 'wf-unique' });
66
+ const result = mergeWorkflowErrors([error1, error2, error3], 'testTask', 'parent-wf', 4);
67
+ // Access the metadata from original field
68
+ const metadata = result.original;
69
+ expect(metadata.failedWorkflowIds).toEqual(['wf-dup', 'wf-unique']);
70
+ expect(metadata.failedWorkflowIds).toHaveLength(2); // Deduplicated
71
+ });
72
+ it('should flatten logs arrays from all errors using flatMap', () => {
73
+ const error1 = createMockWorkflowError({
74
+ workflowId: 'wf-1',
75
+ logs: [
76
+ { id: 'log-1', workflowId: 'wf-1', timestamp: 1000, level: 'info', message: 'Log 1.1' },
77
+ { id: 'log-2', workflowId: 'wf-1', timestamp: 2000, level: 'info', message: 'Log 1.2' },
78
+ ],
79
+ });
80
+ const error2 = createMockWorkflowError({
81
+ workflowId: 'wf-2',
82
+ logs: [
83
+ { id: 'log-3', workflowId: 'wf-2', timestamp: 3000, level: 'error', message: 'Log 2.1' },
84
+ { id: 'log-4', workflowId: 'wf-2', timestamp: 4000, level: 'error', message: 'Log 2.2' },
85
+ ],
86
+ });
87
+ const result = mergeWorkflowErrors([error1, error2], 'testTask', 'parent-wf', 2);
88
+ expect(result.logs).toHaveLength(4);
89
+ expect(result.logs[0].message).toBe('Log 1.1');
90
+ expect(result.logs[1].message).toBe('Log 1.2');
91
+ expect(result.logs[2].message).toBe('Log 2.1');
92
+ expect(result.logs[3].message).toBe('Log 2.2');
93
+ });
94
+ it('should use first error stack trace', () => {
95
+ const error1 = createMockWorkflowError({ stack: 'First stack trace' });
96
+ const error2 = createMockWorkflowError({ stack: 'Second stack trace' });
97
+ const error3 = createMockWorkflowError({ stack: 'Third stack trace' });
98
+ const result = mergeWorkflowErrors([error1, error2, error3], 'testTask', 'parent-wf', 3);
99
+ expect(result.stack).toBe('First stack trace');
100
+ });
101
+ it('should use first error state', () => {
102
+ const error1 = createMockWorkflowError({ state: { first: 'state1' } });
103
+ const error2 = createMockWorkflowError({ state: { second: 'state2' } });
104
+ const result = mergeWorkflowErrors([error1, error2], 'testTask', 'parent-wf', 2);
105
+ expect(result.state).toEqual({ first: 'state1' });
106
+ });
107
+ it('should use empty object when first error has no state', () => {
108
+ const error1 = createMockWorkflowError({ state: undefined });
109
+ const error2 = createMockWorkflowError({ state: { hasState: 'yes' } });
110
+ const result = mergeWorkflowErrors([error1, error2], 'testTask', 'parent-wf', 2);
111
+ expect(result.state).toEqual({});
112
+ });
113
+ it('should handle undefined stack trace gracefully', () => {
114
+ const error1 = createMockWorkflowError({ stack: undefined });
115
+ const error2 = createMockWorkflowError({ stack: 'Has stack' });
116
+ const result = mergeWorkflowErrors([error1, error2], 'testTask', 'parent-wf', 2);
117
+ expect(result.stack).toBeUndefined();
118
+ });
119
+ it('should include metadata in original field', () => {
120
+ const error1 = createMockWorkflowError({ workflowId: 'wf-1' });
121
+ const error2 = createMockWorkflowError({ workflowId: 'wf-2' });
122
+ const error3 = createMockWorkflowError({ workflowId: 'wf-3' });
123
+ const result = mergeWorkflowErrors([error1, error2, error3], 'concurrentTask', 'parent-wf', 5);
124
+ const metadata = result.original;
125
+ expect(metadata.name).toBe('WorkflowAggregateError');
126
+ expect(metadata.message).toBe("3 of 5 concurrent child workflows failed in task 'concurrentTask'");
127
+ expect(metadata.errors).toEqual([error1, error2, error3]);
128
+ expect(metadata.totalChildren).toBe(5);
129
+ expect(metadata.failedChildren).toBe(3);
130
+ expect(metadata.failedWorkflowIds).toEqual(['wf-1', 'wf-2', 'wf-3']);
131
+ });
132
+ it('should handle empty logs array', () => {
133
+ const error1 = createMockWorkflowError({ logs: [] });
134
+ const error2 = createMockWorkflowError({ logs: [] });
135
+ const result = mergeWorkflowErrors([error1, error2], 'testTask', 'parent-wf', 2);
136
+ expect(result.logs).toEqual([]);
137
+ });
138
+ it('should include task name in message', () => {
139
+ const error = createMockWorkflowError();
140
+ const result = mergeWorkflowErrors([error], 'myCustomTask', 'parent-wf', 1);
141
+ expect(result.message).toContain("task 'myCustomTask'");
142
+ });
143
+ it('should include correct counts in message', () => {
144
+ const errors = Array.from({ length: 3 }, (_, i) => createMockWorkflowError({ workflowId: `wf-${i}` }));
145
+ const result = mergeWorkflowErrors(errors, 'testTask', 'parent-wf', 10);
146
+ expect(result.message).toBe("3 of 10 concurrent child workflows failed in task 'testTask'");
147
+ });
148
+ it('should preserve parent workflow ID', () => {
149
+ const error = createMockWorkflowError({ workflowId: 'child-123' });
150
+ const result = mergeWorkflowErrors([error], 'testTask', 'parent-abc', 1);
151
+ expect(result.workflowId).toBe('parent-abc');
152
+ });
153
+ });
154
+ //# sourceMappingURL=workflow-error-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-error-utils.test.js","sourceRoot":"","sources":["../../../../src/__tests__/unit/utils/workflow-error-utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workflow-detachChild.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-detachChild.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/workflow-detachChild.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Workflow } from '../../index.js';
3
+ class SimpleWorkflow extends Workflow {
4
+ async run() {
5
+ this.setStatus('running');
6
+ this.setStatus('completed');
7
+ return 'done';
8
+ }
9
+ }
10
+ describe('Workflow.detachChild()', () => {
11
+ it('should remove child from parent.children array', () => {
12
+ // Arrange: Create parent with child
13
+ const parent = new SimpleWorkflow('Parent');
14
+ const child = new SimpleWorkflow('Child', parent);
15
+ // Assert: Verify child is in parent.children
16
+ expect(parent.children).toContain(child);
17
+ // Act: Call detachChild (will fail - method doesn't exist)
18
+ parent.detachChild(child);
19
+ // Assert: Verify child removed from parent.children
20
+ expect(parent.children).not.toContain(child);
21
+ });
22
+ it('should clear child.parent to null', () => {
23
+ // Arrange: Create parent with child
24
+ const parent = new SimpleWorkflow('Parent');
25
+ const child = new SimpleWorkflow('Child', parent);
26
+ // Assert: Verify child.parent is set
27
+ expect(child.parent).toBe(parent);
28
+ // Act: Call detachChild
29
+ parent.detachChild(child);
30
+ // Assert: Verify child.parent is null
31
+ expect(child.parent).toBeNull();
32
+ });
33
+ it('should remove child.node from parent.node.children array', () => {
34
+ // Arrange: Create parent with child
35
+ const parent = new SimpleWorkflow('Parent');
36
+ const child = new SimpleWorkflow('Child', parent);
37
+ // Assert: Verify child.node is in parent.node.children
38
+ expect(parent.getNode().children).toContain(child.getNode());
39
+ // Act: Call detachChild
40
+ parent.detachChild(child);
41
+ // Assert: Verify child.node removed from parent.node.children
42
+ expect(parent.getNode().children).not.toContain(child.getNode());
43
+ });
44
+ it('should emit childDetached event with correct payload', () => {
45
+ // Arrange: Create parent with observer
46
+ const parent = new SimpleWorkflow('Parent');
47
+ const events = [];
48
+ const observer = {
49
+ onLog: () => { },
50
+ onEvent: (event) => events.push(event),
51
+ onStateUpdated: () => { },
52
+ onTreeChanged: () => { },
53
+ };
54
+ parent.addObserver(observer);
55
+ // Act: Create child (triggers attachChild event), then detach
56
+ const child = new SimpleWorkflow('Child', parent);
57
+ events.length = 0; // Clear attachChild events
58
+ parent.detachChild(child);
59
+ // Assert: Verify childDetached event was emitted
60
+ const detachEvent = events.find((e) => e.type === 'childDetached');
61
+ expect(detachEvent).toBeDefined();
62
+ // Assert: Verify event payload (with type guard for discriminated union)
63
+ expect(detachEvent?.type === 'childDetached' && detachEvent.parentId).toBe(parent.id);
64
+ expect(detachEvent?.type === 'childDetached' && detachEvent.childId).toBe(child.id);
65
+ });
66
+ it('should throw error when child is not attached to parent', () => {
67
+ // Arrange: Create parent and child separately (no attachment)
68
+ const parent = new SimpleWorkflow('Parent');
69
+ const child = new SimpleWorkflow('Child');
70
+ // Assert: Verify child is NOT in parent.children
71
+ expect(parent.children).not.toContain(child);
72
+ // Act & Assert: Calling detachChild should throw error
73
+ expect(() => parent.detachChild(child)).toThrow(/not attached/i);
74
+ });
75
+ });
76
+ //# sourceMappingURL=workflow-detachChild.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-detachChild.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/workflow-detachChild.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workflow-emitEvent-childDetached.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-emitEvent-childDetached.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/workflow-emitEvent-childDetached.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Workflow } from '../../index.js';
3
+ class SimpleWorkflow extends Workflow {
4
+ async run() {
5
+ this.setStatus('running');
6
+ this.setStatus('completed');
7
+ return 'done';
8
+ }
9
+ }
10
+ describe('emitEvent() - childDetached Tree Update Events', () => {
11
+ it('should call onTreeChanged() when childDetached event is emitted', () => {
12
+ // Arrange: Create parent with observer tracking callbacks
13
+ const parent = new SimpleWorkflow('Parent');
14
+ const events = [];
15
+ const treeChanges = [];
16
+ const observer = {
17
+ onLog: () => { },
18
+ onEvent: (e) => events.push(e),
19
+ onStateUpdated: () => { },
20
+ onTreeChanged: (root) => treeChanges.push(root),
21
+ };
22
+ parent.addObserver(observer);
23
+ // Act: Detach child (which emits childDetached event)
24
+ const child = new SimpleWorkflow('Child', parent);
25
+ events.length = 0; // Clear attachChild events
26
+ treeChanges.length = 0; // Clear attachChild tree changes
27
+ parent.detachChild(child);
28
+ // Assert: Verify childDetached event was emitted
29
+ const detachEvent = events.find((e) => e.type === 'childDetached');
30
+ expect(detachEvent).toBeDefined();
31
+ expect(detachEvent?.type === 'childDetached' && detachEvent.parentId).toBe(parent.id);
32
+ // CRITICAL ASSERTION: onTreeChanged() must be called
33
+ expect(treeChanges.length).toBe(1);
34
+ expect(treeChanges[0]).toBe(parent.getNode()); // Receives root node
35
+ });
36
+ it('should call onEvent() before onTreeChanged() for childDetached', () => {
37
+ // Arrange: Track call order
38
+ const parent = new SimpleWorkflow('Parent');
39
+ const callOrder = [];
40
+ const observer = {
41
+ onLog: () => { },
42
+ onEvent: () => callOrder.push('onEvent'),
43
+ onStateUpdated: () => { },
44
+ onTreeChanged: () => callOrder.push('onTreeChanged'),
45
+ };
46
+ parent.addObserver(observer);
47
+ // Act
48
+ const child = new SimpleWorkflow('Child', parent);
49
+ callOrder.length = 0; // Clear attachChild call order
50
+ parent.detachChild(child);
51
+ // Assert: Verify order
52
+ expect(callOrder).toEqual(['onEvent', 'onTreeChanged']);
53
+ });
54
+ it('should include childDetached in tree update event types', () => {
55
+ // This test verifies the implementation at the code level
56
+ // Access the emitEvent method and verify it triggers onTreeChanged for childDetached
57
+ const workflow = new SimpleWorkflow('Test');
58
+ // Access private emitEvent method for testing
59
+ const emitEvent = workflow.emitEvent.bind(workflow);
60
+ // Track if onTreeChanged was called
61
+ let onTreeChangedCalled = false;
62
+ const mockObserver = {
63
+ onLog: () => { },
64
+ onEvent: () => { },
65
+ onStateUpdated: () => { },
66
+ onTreeChanged: () => { onTreeChangedCalled = true; },
67
+ };
68
+ // Mock getRootObservers to return test observer
69
+ workflow.getRootObservers = () => [mockObserver];
70
+ // Emit childDetached event
71
+ emitEvent({
72
+ type: 'childDetached',
73
+ parentId: workflow.id,
74
+ childId: 'test-child-id',
75
+ });
76
+ // Assert: onTreeChanged should be called
77
+ expect(onTreeChangedCalled).toBe(true);
78
+ });
79
+ it('should pass correct root node to onTreeChanged() after detach', () => {
80
+ // Arrange: Create multi-level tree
81
+ const root = new SimpleWorkflow('Root');
82
+ const parent = new SimpleWorkflow('Parent', root);
83
+ const child = new SimpleWorkflow('Child', parent);
84
+ const treeChangedRoots = [];
85
+ const observer = {
86
+ onLog: () => { },
87
+ onEvent: () => { },
88
+ onStateUpdated: () => { },
89
+ onTreeChanged: (rootNode) => treeChangedRoots.push(rootNode),
90
+ };
91
+ root.addObserver(observer);
92
+ // Clear events from tree construction
93
+ treeChangedRoots.length = 0;
94
+ // Act: Detach child from parent
95
+ parent.detachChild(child);
96
+ // Assert: onTreeChanged should receive root node (from root workflow)
97
+ expect(treeChangedRoots.length).toBe(1);
98
+ expect(treeChangedRoots[0]).toBe(root.getNode());
99
+ });
100
+ it('should trigger onTreeChanged for both attach and detach operations', () => {
101
+ // Arrange: Track tree changes
102
+ const parent = new SimpleWorkflow('Parent');
103
+ const treeChanges = [];
104
+ const observer = {
105
+ onLog: () => { },
106
+ onEvent: () => { },
107
+ onStateUpdated: () => { },
108
+ onTreeChanged: (root) => treeChanges.push({ operation: 'treeChanged', root }),
109
+ };
110
+ parent.addObserver(observer);
111
+ // Act 1: Attach child
112
+ const child = new SimpleWorkflow('Child', parent);
113
+ const attachCount = treeChanges.length;
114
+ // Act 2: Detach child
115
+ treeChanges.length = 0; // Clear to only track detach
116
+ parent.detachChild(child);
117
+ // Assert: Both attach and detach should trigger onTreeChanged
118
+ expect(treeChanges.length).toBe(1);
119
+ expect(treeChanges[0].root).toBe(parent.getNode());
120
+ });
121
+ });
122
+ //# sourceMappingURL=workflow-emitEvent-childDetached.test.js.map