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
@@ -1,169 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { Agent } from '../../core/agent.js';
3
- import { MCPHandler } from '../../core/mcp-handler.js';
4
-
5
- describe('Agent', () => {
6
- it('should create with unique id', () => {
7
- const a1 = new Agent();
8
- const a2 = new Agent();
9
- expect(a1.id).not.toBe(a2.id);
10
- });
11
-
12
- it('should use default name when not provided', () => {
13
- const agent = new Agent();
14
- expect(agent.name).toBe('Agent');
15
- });
16
-
17
- it('should use custom name when provided', () => {
18
- const agent = new Agent({ name: 'CustomAgent' });
19
- expect(agent.name).toBe('CustomAgent');
20
- });
21
-
22
- it('should provide access to MCP handler', () => {
23
- const agent = new Agent();
24
- const handler = agent.getMcpHandler();
25
- expect(handler).toBeInstanceOf(MCPHandler);
26
- });
27
-
28
- it('should register MCP servers from config', () => {
29
- const agent = new Agent({
30
- mcps: [
31
- {
32
- name: 'test-mcp',
33
- transport: 'inprocess',
34
- tools: [
35
- {
36
- name: 'test_tool',
37
- description: 'A test tool',
38
- input_schema: { type: 'object', properties: {} },
39
- },
40
- ],
41
- },
42
- ],
43
- });
44
-
45
- const handler = agent.getMcpHandler();
46
- expect(handler.getServerNames()).toContain('test-mcp');
47
- expect(handler.hasTool('test-mcp__test_tool')).toBe(true);
48
- });
49
- });
50
-
51
- describe('MCPHandler', () => {
52
- it('should register and unregister servers', () => {
53
- const handler = new MCPHandler();
54
-
55
- handler.registerServer({
56
- name: 'server1',
57
- transport: 'inprocess',
58
- });
59
-
60
- expect(handler.getServerNames()).toContain('server1');
61
-
62
- handler.unregisterServer('server1');
63
- expect(handler.getServerNames()).not.toContain('server1');
64
- });
65
-
66
- it('should throw when registering duplicate server', () => {
67
- const handler = new MCPHandler();
68
-
69
- handler.registerServer({
70
- name: 'server1',
71
- transport: 'inprocess',
72
- });
73
-
74
- expect(() =>
75
- handler.registerServer({
76
- name: 'server1',
77
- transport: 'inprocess',
78
- })
79
- ).toThrow("MCP server 'server1' is already registered");
80
- });
81
-
82
- it('should convert tools to full names', () => {
83
- const handler = new MCPHandler();
84
-
85
- handler.registerServer({
86
- name: 'myserver',
87
- transport: 'inprocess',
88
- tools: [
89
- {
90
- name: 'tool1',
91
- description: 'Tool 1',
92
- input_schema: { type: 'object', properties: {} },
93
- },
94
- {
95
- name: 'tool2',
96
- description: 'Tool 2',
97
- input_schema: { type: 'object', properties: {} },
98
- },
99
- ],
100
- });
101
-
102
- const tools = handler.getTools();
103
- expect(tools).toHaveLength(2);
104
- expect(tools[0].name).toBe('myserver__tool1');
105
- expect(tools[1].name).toBe('myserver__tool2');
106
- });
107
-
108
- it('should execute registered tool', async () => {
109
- const handler = new MCPHandler();
110
-
111
- handler.registerServer({
112
- name: 'math',
113
- transport: 'inprocess',
114
- tools: [
115
- {
116
- name: 'add',
117
- description: 'Add two numbers',
118
- input_schema: {
119
- type: 'object',
120
- properties: {
121
- a: { type: 'number' },
122
- b: { type: 'number' },
123
- },
124
- },
125
- },
126
- ],
127
- });
128
-
129
- handler.registerToolExecutor('math', 'add', async (input: unknown) => {
130
- const { a, b } = input as { a: number; b: number };
131
- return a + b;
132
- });
133
-
134
- const result = await handler.executeTool('math__add', { a: 2, b: 3 });
135
- expect(result.content).toBe('5');
136
- expect(result.is_error).toBeUndefined();
137
- });
138
-
139
- it('should return error for unknown tool', async () => {
140
- const handler = new MCPHandler();
141
- const result = await handler.executeTool('unknown__tool', {});
142
- expect(result.is_error).toBe(true);
143
- expect(result.content).toContain('not found');
144
- });
145
-
146
- it('should return error when tool throws', async () => {
147
- const handler = new MCPHandler();
148
-
149
- handler.registerServer({
150
- name: 'failing',
151
- transport: 'inprocess',
152
- tools: [
153
- {
154
- name: 'fail',
155
- description: 'Always fails',
156
- input_schema: { type: 'object', properties: {} },
157
- },
158
- ],
159
- });
160
-
161
- handler.registerToolExecutor('failing', 'fail', async () => {
162
- throw new Error('Tool error');
163
- });
164
-
165
- const result = await handler.executeTool('failing__fail', {});
166
- expect(result.is_error).toBe(true);
167
- expect(result.content).toContain('Tool error');
168
- });
169
- });
@@ -1,182 +0,0 @@
1
- /**
2
- * Unit tests for cache key generation
3
- */
4
-
5
- import { describe, it, expect } from 'vitest';
6
- import { z } from 'zod';
7
- import {
8
- deterministicStringify,
9
- generateCacheKey,
10
- getSchemaHash,
11
- } from '../../cache/cache-key.js';
12
-
13
- describe('deterministicStringify', () => {
14
- it('should produce same output for same object regardless of key order', () => {
15
- const obj1 = { b: 2, a: 1 };
16
- const obj2 = { a: 1, b: 2 };
17
-
18
- expect(deterministicStringify(obj1)).toBe(deterministicStringify(obj2));
19
- });
20
-
21
- it('should handle primitives correctly', () => {
22
- expect(deterministicStringify(null)).toBe('null');
23
- expect(deterministicStringify(undefined)).toBe('undefined');
24
- expect(deterministicStringify(true)).toBe('true');
25
- expect(deterministicStringify(false)).toBe('false');
26
- expect(deterministicStringify(42)).toBe('42');
27
- expect(deterministicStringify('hello')).toBe('"hello"');
28
- });
29
-
30
- it('should handle arrays correctly', () => {
31
- expect(deterministicStringify([1, 2, 3])).toBe('[1,2,3]');
32
- expect(deterministicStringify(['a', 'b'])).toBe('["a","b"]');
33
- });
34
-
35
- it('should handle nested objects with sorted keys', () => {
36
- const obj = { z: { b: 2, a: 1 }, y: [3, 2, 1] };
37
- const result = deterministicStringify(obj);
38
-
39
- // Keys should be sorted: y before z, a before b
40
- expect(result).toBe('{"y":[3,2,1],"z":{"a":1,"b":2}}');
41
- });
42
-
43
- it('should throw on circular references', () => {
44
- const obj: Record<string, unknown> = { a: 1 };
45
- obj.self = obj;
46
-
47
- expect(() => deterministicStringify(obj)).toThrow(
48
- 'Converting circular structure to JSON'
49
- );
50
- });
51
-
52
- it('should handle Date objects', () => {
53
- const date = new Date('2024-01-15T10:30:00.000Z');
54
- const result = deterministicStringify(date);
55
-
56
- expect(result).toBe('"2024-01-15T10:30:00.000Z"');
57
- });
58
-
59
- it('should handle Map objects', () => {
60
- const map = new Map([
61
- ['z', 1],
62
- ['a', 2],
63
- ]);
64
- const result = deterministicStringify(map);
65
-
66
- // Keys should be sorted in the output
67
- expect(result).toContain('Map{');
68
- expect(result).toContain('"a"');
69
- expect(result).toContain('"z"');
70
- });
71
-
72
- it('should handle Set objects', () => {
73
- const set = new Set([3, 1, 2]);
74
- const result = deterministicStringify(set);
75
-
76
- expect(result).toContain('Set{');
77
- });
78
- });
79
-
80
- describe('getSchemaHash', () => {
81
- it('should produce consistent hash for same schema', () => {
82
- const schema1 = z.object({ name: z.string() });
83
- const schema2 = z.object({ name: z.string() });
84
-
85
- expect(getSchemaHash(schema1)).toBe(getSchemaHash(schema2));
86
- });
87
-
88
- it('should produce different hashes for different schemas', () => {
89
- const schema1 = z.object({ name: z.string() });
90
- const schema2 = z.object({ age: z.number() });
91
-
92
- expect(getSchemaHash(schema1)).not.toBe(getSchemaHash(schema2));
93
- });
94
-
95
- it('should handle undefined schema', () => {
96
- expect(getSchemaHash(undefined)).toBe('no-schema');
97
- });
98
-
99
- it('should produce 64-character hex string', () => {
100
- const schema = z.object({ value: z.number() });
101
- const hash = getSchemaHash(schema);
102
-
103
- expect(hash).toMatch(/^[a-f0-9]{64}$/);
104
- });
105
- });
106
-
107
- describe('generateCacheKey', () => {
108
- it('should produce same key for identical inputs', () => {
109
- const inputs1 = {
110
- user: 'Hello',
111
- model: 'claude-sonnet-4-20250514',
112
- data: { value: 42 },
113
- };
114
- const inputs2 = {
115
- user: 'Hello',
116
- model: 'claude-sonnet-4-20250514',
117
- data: { value: 42 },
118
- };
119
-
120
- expect(generateCacheKey(inputs1)).toBe(generateCacheKey(inputs2));
121
- });
122
-
123
- it('should produce different keys for different inputs', () => {
124
- const inputs1 = {
125
- user: 'Hello',
126
- model: 'claude-sonnet-4-20250514',
127
- };
128
- const inputs2 = {
129
- user: 'Goodbye',
130
- model: 'claude-sonnet-4-20250514',
131
- };
132
-
133
- expect(generateCacheKey(inputs1)).not.toBe(generateCacheKey(inputs2));
134
- });
135
-
136
- it('should produce 64-character hex string', () => {
137
- const key = generateCacheKey({
138
- user: 'Test',
139
- model: 'claude-sonnet-4-20250514',
140
- });
141
-
142
- expect(key).toMatch(/^[a-f0-9]{64}$/);
143
- });
144
-
145
- it('should include tools in key generation (sorted)', () => {
146
- const toolSchema = { type: 'object' as const, properties: {}, required: [] };
147
- const inputs1 = {
148
- user: 'Hello',
149
- model: 'claude-sonnet-4-20250514',
150
- tools: [
151
- { name: 'tool_b', description: 'B', input_schema: toolSchema },
152
- { name: 'tool_a', description: 'A', input_schema: toolSchema },
153
- ],
154
- };
155
- const inputs2 = {
156
- user: 'Hello',
157
- model: 'claude-sonnet-4-20250514',
158
- tools: [
159
- { name: 'tool_a', description: 'A', input_schema: toolSchema },
160
- { name: 'tool_b', description: 'B', input_schema: toolSchema },
161
- ],
162
- };
163
-
164
- // Same tools in different order should produce same key
165
- expect(generateCacheKey(inputs1)).toBe(generateCacheKey(inputs2));
166
- });
167
-
168
- it('should include schema hash in key', () => {
169
- const schema = z.object({ result: z.string() });
170
- const inputs1 = {
171
- user: 'Hello',
172
- model: 'claude-sonnet-4-20250514',
173
- responseFormat: schema,
174
- };
175
- const inputs2 = {
176
- user: 'Hello',
177
- model: 'claude-sonnet-4-20250514',
178
- };
179
-
180
- expect(generateCacheKey(inputs1)).not.toBe(generateCacheKey(inputs2));
181
- });
182
- });
@@ -1,172 +0,0 @@
1
- /**
2
- * Unit tests for LLMCache
3
- */
4
-
5
- import { describe, it, expect, beforeEach } from 'vitest';
6
- import { LLMCache } from '../../cache/cache.js';
7
-
8
- describe('LLMCache', () => {
9
- let cache: LLMCache;
10
-
11
- beforeEach(() => {
12
- cache = new LLMCache({ maxItems: 10 });
13
- });
14
-
15
- describe('get/set', () => {
16
- it('should store and retrieve values', async () => {
17
- await cache.set('key1', { data: 'test' });
18
- const result = await cache.get('key1');
19
-
20
- expect(result).toEqual({ data: 'test' });
21
- });
22
-
23
- it('should return undefined for missing keys', async () => {
24
- const result = await cache.get('nonexistent');
25
-
26
- expect(result).toBeUndefined();
27
- });
28
-
29
- it('should update existing keys', async () => {
30
- await cache.set('key1', 'first');
31
- await cache.set('key1', 'second');
32
-
33
- const result = await cache.get('key1');
34
- expect(result).toBe('second');
35
- });
36
- });
37
-
38
- describe('has', () => {
39
- it('should return true for existing keys', async () => {
40
- await cache.set('key1', 'value');
41
-
42
- expect(cache.has('key1')).toBe(true);
43
- });
44
-
45
- it('should return false for missing keys', () => {
46
- expect(cache.has('nonexistent')).toBe(false);
47
- });
48
- });
49
-
50
- describe('bust', () => {
51
- it('should remove specific key', async () => {
52
- await cache.set('key1', 'value1');
53
- await cache.set('key2', 'value2');
54
-
55
- await cache.bust('key1');
56
-
57
- expect(cache.has('key1')).toBe(false);
58
- expect(cache.has('key2')).toBe(true);
59
- });
60
-
61
- it('should not throw for missing keys', async () => {
62
- await expect(cache.bust('nonexistent')).resolves.not.toThrow();
63
- });
64
- });
65
-
66
- describe('bustPrefix', () => {
67
- it('should remove all keys with given prefix', async () => {
68
- await cache.set('key1', 'value1', { prefix: 'group-a' });
69
- await cache.set('key2', 'value2', { prefix: 'group-a' });
70
- await cache.set('key3', 'value3', { prefix: 'group-b' });
71
-
72
- await cache.bustPrefix('group-a');
73
-
74
- expect(cache.has('key1')).toBe(false);
75
- expect(cache.has('key2')).toBe(false);
76
- expect(cache.has('key3')).toBe(true);
77
- });
78
-
79
- it('should not throw for nonexistent prefix', async () => {
80
- await expect(cache.bustPrefix('nonexistent')).resolves.not.toThrow();
81
- });
82
- });
83
-
84
- describe('clear', () => {
85
- it('should remove all entries', async () => {
86
- await cache.set('key1', 'value1');
87
- await cache.set('key2', 'value2');
88
-
89
- await cache.clear();
90
-
91
- expect(cache.size).toBe(0);
92
- });
93
-
94
- it('should reset metrics', async () => {
95
- await cache.set('key1', 'value1');
96
- await cache.get('key1'); // hit
97
- await cache.get('key2'); // miss
98
-
99
- await cache.clear();
100
-
101
- const metrics = cache.metrics();
102
- expect(metrics.hits).toBe(0);
103
- expect(metrics.misses).toBe(0);
104
- });
105
- });
106
-
107
- describe('metrics', () => {
108
- it('should track hits and misses', async () => {
109
- await cache.set('key1', 'value1');
110
-
111
- await cache.get('key1'); // hit
112
- await cache.get('key1'); // hit
113
- await cache.get('key2'); // miss
114
-
115
- const metrics = cache.metrics();
116
- expect(metrics.hits).toBe(2);
117
- expect(metrics.misses).toBe(1);
118
- expect(metrics.hitRate).toBeCloseTo(66.67, 0);
119
- });
120
-
121
- it('should track size', async () => {
122
- await cache.set('key1', 'value1');
123
- await cache.set('key2', 'value2');
124
-
125
- const metrics = cache.metrics();
126
- expect(metrics.size).toBe(2);
127
- });
128
- });
129
-
130
- describe('LRU eviction', () => {
131
- it('should evict least recently used items when maxItems exceeded', async () => {
132
- const smallCache = new LLMCache({ maxItems: 3 });
133
-
134
- await smallCache.set('key1', 'value1');
135
- await smallCache.set('key2', 'value2');
136
- await smallCache.set('key3', 'value3');
137
- await smallCache.set('key4', 'value4');
138
-
139
- // key1 should be evicted (least recently used)
140
- expect(smallCache.has('key1')).toBe(false);
141
- expect(smallCache.has('key4')).toBe(true);
142
- });
143
-
144
- it('should update LRU order on get', async () => {
145
- const smallCache = new LLMCache({ maxItems: 3 });
146
-
147
- await smallCache.set('key1', 'value1');
148
- await smallCache.set('key2', 'value2');
149
- await smallCache.set('key3', 'value3');
150
-
151
- // Access key1 to make it most recently used
152
- await smallCache.get('key1');
153
-
154
- // Add new item, should evict key2 instead of key1
155
- await smallCache.set('key4', 'value4');
156
-
157
- expect(smallCache.has('key1')).toBe(true);
158
- expect(smallCache.has('key2')).toBe(false);
159
- });
160
- });
161
-
162
- describe('keys', () => {
163
- it('should return iterator of all keys', async () => {
164
- await cache.set('key1', 'value1');
165
- await cache.set('key2', 'value2');
166
-
167
- const keys = Array.from(cache.keys());
168
- expect(keys).toContain('key1');
169
- expect(keys).toContain('key2');
170
- });
171
- });
172
- });
@@ -1,138 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import {
3
- getExecutionContext,
4
- requireExecutionContext,
5
- runInContext,
6
- runInContextSync,
7
- hasExecutionContext,
8
- createChildContext,
9
- type AgentExecutionContext,
10
- } from '../../core/context.js';
11
- import type { WorkflowNode, WorkflowEvent } from '../../types/index.js';
12
-
13
- describe('AgentExecutionContext', () => {
14
- const createMockNode = (name: string): WorkflowNode => ({
15
- id: `node-${name}`,
16
- name,
17
- parent: null,
18
- children: [],
19
- status: 'running',
20
- logs: [],
21
- events: [],
22
- stateSnapshot: null,
23
- });
24
-
25
- const createMockContext = (name: string): AgentExecutionContext => ({
26
- workflowNode: createMockNode(name),
27
- emitEvent: () => {},
28
- workflowId: `workflow-${name}`,
29
- });
30
-
31
- it('should return undefined outside of context', () => {
32
- expect(getExecutionContext()).toBeUndefined();
33
- });
34
-
35
- it('should throw when requiring context outside of context', () => {
36
- expect(() => requireExecutionContext('test operation')).toThrow(
37
- 'test operation called outside of workflow context'
38
- );
39
- });
40
-
41
- it('should detect context availability', () => {
42
- expect(hasExecutionContext()).toBe(false);
43
- });
44
-
45
- it('should provide context within runInContext', async () => {
46
- const ctx = createMockContext('test');
47
-
48
- await runInContext(ctx, async () => {
49
- expect(hasExecutionContext()).toBe(true);
50
- expect(getExecutionContext()).toBe(ctx);
51
- expect(requireExecutionContext('test')).toBe(ctx);
52
- });
53
-
54
- // Context should be gone after run completes
55
- expect(hasExecutionContext()).toBe(false);
56
- });
57
-
58
- it('should provide context within sync runInContextSync', () => {
59
- const ctx = createMockContext('test');
60
-
61
- runInContextSync(ctx, () => {
62
- expect(hasExecutionContext()).toBe(true);
63
- expect(getExecutionContext()).toBe(ctx);
64
- });
65
-
66
- expect(hasExecutionContext()).toBe(false);
67
- });
68
-
69
- it('should propagate context through nested async calls', async () => {
70
- const ctx = createMockContext('root');
71
-
72
- const nested = async () => {
73
- const innerCtx = getExecutionContext();
74
- return innerCtx?.workflowNode.name;
75
- };
76
-
77
- await runInContext(ctx, async () => {
78
- const name = await nested();
79
- expect(name).toBe('root');
80
- });
81
- });
82
-
83
- it('should create child context with new node', async () => {
84
- const parentCtx = createMockContext('parent');
85
- const childNode = createMockNode('child');
86
-
87
- await runInContext(parentCtx, async () => {
88
- const childCtx = createChildContext(childNode);
89
- expect(childCtx).toBeDefined();
90
- expect(childCtx?.workflowNode).toBe(childNode);
91
- expect(childCtx?.workflowId).toBe(parentCtx.workflowId);
92
- });
93
- });
94
-
95
- it('should return undefined for child context when not in context', () => {
96
- const childNode = createMockNode('child');
97
- const childCtx = createChildContext(childNode);
98
- expect(childCtx).toBeUndefined();
99
- });
100
-
101
- it('should allow nested contexts', async () => {
102
- const outerCtx = createMockContext('outer');
103
- const innerCtx = createMockContext('inner');
104
-
105
- await runInContext(outerCtx, async () => {
106
- expect(getExecutionContext()?.workflowNode.name).toBe('outer');
107
-
108
- await runInContext(innerCtx, async () => {
109
- expect(getExecutionContext()?.workflowNode.name).toBe('inner');
110
- });
111
-
112
- // Should restore outer context
113
- expect(getExecutionContext()?.workflowNode.name).toBe('outer');
114
- });
115
- });
116
-
117
- it('should capture emitted events', async () => {
118
- const events: WorkflowEvent[] = [];
119
- const node = createMockNode('test');
120
- const ctx: AgentExecutionContext = {
121
- workflowNode: node,
122
- emitEvent: (event) => events.push(event),
123
- workflowId: 'wf-1',
124
- };
125
-
126
- await runInContext(ctx, async () => {
127
- const currentCtx = requireExecutionContext('emit');
128
- currentCtx.emitEvent({
129
- type: 'stepStart',
130
- node: currentCtx.workflowNode,
131
- step: 'test-step',
132
- });
133
- });
134
-
135
- expect(events).toHaveLength(1);
136
- expect(events[0].type).toBe('stepStart');
137
- });
138
- });