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,210 +0,0 @@
1
- /**
2
- * Unit tests for ReflectionManager
3
- */
4
-
5
- import { describe, it, expect, beforeEach } from 'vitest';
6
- import { ReflectionManager } from '../../reflection/reflection.js';
7
- import type { ReflectionContext, WorkflowNode } from '../../types/index.js';
8
-
9
- describe('ReflectionManager', () => {
10
- const createTestNode = (): WorkflowNode => ({
11
- id: 'test-node-1',
12
- name: 'Test Node',
13
- parent: null,
14
- children: [],
15
- status: 'failed',
16
- logs: [],
17
- events: [],
18
- stateSnapshot: null,
19
- });
20
-
21
- const createContext = (
22
- error: Error,
23
- attemptNumber: number = 1
24
- ): ReflectionContext => ({
25
- level: 'workflow',
26
- failedNode: createTestNode(),
27
- error,
28
- attemptNumber,
29
- previousAttempts: [],
30
- });
31
-
32
- describe('isEnabled', () => {
33
- it('should return true when enabled', () => {
34
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
35
- expect(manager.isEnabled()).toBe(true);
36
- });
37
-
38
- it('should return false when disabled', () => {
39
- const manager = new ReflectionManager({ enabled: false, maxAttempts: 3 });
40
- expect(manager.isEnabled()).toBe(false);
41
- });
42
- });
43
-
44
- describe('getMaxAttempts', () => {
45
- it('should return configured maxAttempts', () => {
46
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 5 });
47
- expect(manager.getMaxAttempts()).toBe(5);
48
- });
49
- });
50
-
51
- describe('getRetryDelayMs', () => {
52
- it('should return 0 when not configured', () => {
53
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
54
- expect(manager.getRetryDelayMs()).toBe(0);
55
- });
56
-
57
- it('should return configured delay', () => {
58
- const manager = new ReflectionManager({
59
- enabled: true,
60
- maxAttempts: 3,
61
- retryDelayMs: 1000,
62
- });
63
- expect(manager.getRetryDelayMs()).toBe(1000);
64
- });
65
- });
66
-
67
- describe('triggerReflection', () => {
68
- it('should throw when reflection is disabled', async () => {
69
- const manager = new ReflectionManager({ enabled: false, maxAttempts: 3 });
70
-
71
- await expect(manager.triggerReflection()).rejects.toThrow(
72
- 'Reflection is not enabled'
73
- );
74
- });
75
-
76
- it('should record reflection in history', async () => {
77
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
78
-
79
- await manager.triggerReflection('test reason');
80
-
81
- const history = manager.getReflectionHistory();
82
- expect(history).toHaveLength(1);
83
- expect(history[0].reason).toBe('test reason');
84
- });
85
- });
86
-
87
- describe('getReflectionHistory', () => {
88
- it('should return empty array initially', () => {
89
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
90
- expect(manager.getReflectionHistory()).toEqual([]);
91
- });
92
-
93
- it('should return copy of history (not reference)', () => {
94
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
95
- const history1 = manager.getReflectionHistory();
96
- const history2 = manager.getReflectionHistory();
97
-
98
- expect(history1).not.toBe(history2);
99
- });
100
- });
101
-
102
- describe('reflect (heuristic mode)', () => {
103
- it('should not retry rate limit errors', async () => {
104
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
105
- const context = createContext(new Error('rate limit exceeded'));
106
-
107
- const result = await manager.reflect(context);
108
-
109
- expect(result.shouldRetry).toBe(false);
110
- expect(result.reason).toContain('Non-retryable error');
111
- });
112
-
113
- it('should not retry authentication errors', async () => {
114
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
115
- const context = createContext(new Error('authentication failed'));
116
-
117
- const result = await manager.reflect(context);
118
-
119
- expect(result.shouldRetry).toBe(false);
120
- });
121
-
122
- it('should retry validation errors', async () => {
123
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
124
- const context = createContext(new Error('validation failed: missing field'));
125
-
126
- const result = await manager.reflect(context);
127
-
128
- expect(result.shouldRetry).toBe(true);
129
- expect(result.reason).toContain('Validation/parsing error');
130
- });
131
-
132
- it('should retry JSON parse errors', async () => {
133
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
134
- const context = createContext(new Error('JSON parse error at position 10'));
135
-
136
- const result = await manager.reflect(context);
137
-
138
- expect(result.shouldRetry).toBe(true);
139
- });
140
-
141
- it('should retry timeout errors (up to limit)', async () => {
142
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
143
-
144
- const context1 = createContext(new Error('timeout'), 1);
145
- const result1 = await manager.reflect(context1);
146
- expect(result1.shouldRetry).toBe(true);
147
-
148
- const context2 = createContext(new Error('timeout'), 2);
149
- const result2 = await manager.reflect(context2);
150
- expect(result2.shouldRetry).toBe(false);
151
- });
152
-
153
- it('should stop retrying after max attempts', async () => {
154
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 2 });
155
- const context = createContext(new Error('generic error'), 2);
156
-
157
- const result = await manager.reflect(context);
158
-
159
- expect(result.shouldRetry).toBe(false);
160
- expect(result.reason).toContain('Max attempts');
161
- });
162
-
163
- it('should record reflection in history', async () => {
164
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
165
- const context = createContext(new Error('test error'));
166
-
167
- await manager.reflect(context);
168
-
169
- const history = manager.getReflectionHistory();
170
- expect(history).toHaveLength(1);
171
- expect(history[0].level).toBe('workflow');
172
- expect(history[0].error.message).toBe('test error');
173
- });
174
- });
175
-
176
- describe('markLastReflectionSuccessful', () => {
177
- it('should mark last entry as successful', async () => {
178
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
179
- const context = createContext(new Error('test error'));
180
-
181
- await manager.reflect(context);
182
- manager.markLastReflectionSuccessful();
183
-
184
- const history = manager.getReflectionHistory();
185
- expect(history[0].success).toBe(true);
186
- });
187
-
188
- it('should do nothing when history is empty', () => {
189
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
190
-
191
- // Should not throw
192
- expect(() => manager.markLastReflectionSuccessful()).not.toThrow();
193
- });
194
- });
195
-
196
- describe('event emission', () => {
197
- it('should emit reflectionStart and reflectionEnd events', async () => {
198
- const events: { type: string }[] = [];
199
- const manager = new ReflectionManager({ enabled: true, maxAttempts: 3 });
200
- manager.setEventEmitter((event) => events.push(event));
201
-
202
- const context = createContext(new Error('test error'));
203
- await manager.reflect(context);
204
-
205
- expect(events).toHaveLength(2);
206
- expect(events[0].type).toBe('reflectionStart');
207
- expect(events[1].type).toBe('reflectionEnd');
208
- });
209
- });
210
- });
@@ -1,85 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { Workflow, WorkflowTreeDebugger } from '../../index.js';
3
-
4
- class DebugTestWorkflow extends Workflow {
5
- async run(): Promise<void> {
6
- this.setStatus('completed');
7
- }
8
- }
9
-
10
- describe('WorkflowTreeDebugger', () => {
11
- it('should render tree string', () => {
12
- const wf = new DebugTestWorkflow('Root');
13
- const debugger_ = new WorkflowTreeDebugger(wf);
14
-
15
- const tree = debugger_.toTreeString();
16
- expect(tree).toContain('Root');
17
- expect(tree).toContain('[idle]');
18
- });
19
-
20
- it('should show child nodes in tree', () => {
21
- const parent = new DebugTestWorkflow('Parent');
22
- const child1 = new DebugTestWorkflow('Child1', parent);
23
- const child2 = new DebugTestWorkflow('Child2', parent);
24
-
25
- const debugger_ = new WorkflowTreeDebugger(parent);
26
- const tree = debugger_.toTreeString();
27
-
28
- expect(tree).toContain('Parent');
29
- expect(tree).toContain('Child1');
30
- expect(tree).toContain('Child2');
31
- expect(tree).toContain('├──');
32
- expect(tree).toContain('└──');
33
- });
34
-
35
- it('should find node by ID', () => {
36
- const parent = new DebugTestWorkflow('Parent');
37
- const child = new DebugTestWorkflow('Child', parent);
38
-
39
- const debugger_ = new WorkflowTreeDebugger(parent);
40
-
41
- expect(debugger_.getNode(parent.id)).toBe(parent.getNode());
42
- expect(debugger_.getNode(child.id)).toBe(child.getNode());
43
- expect(debugger_.getNode('nonexistent')).toBeUndefined();
44
- });
45
-
46
- it('should collect logs from all nodes', async () => {
47
- const parent = new DebugTestWorkflow('Parent');
48
- const child = new DebugTestWorkflow('Child', parent);
49
-
50
- const debugger_ = new WorkflowTreeDebugger(parent);
51
-
52
- // Add some logs manually
53
- parent.getNode().logs.push({
54
- id: '1',
55
- workflowId: parent.id,
56
- timestamp: Date.now(),
57
- level: 'info',
58
- message: 'Parent log',
59
- });
60
-
61
- child.getNode().logs.push({
62
- id: '2',
63
- workflowId: child.id,
64
- timestamp: Date.now(),
65
- level: 'info',
66
- message: 'Child log',
67
- });
68
-
69
- const logString = debugger_.toLogString();
70
- expect(logString).toContain('Parent log');
71
- expect(logString).toContain('Child log');
72
- });
73
-
74
- it('should return stats', () => {
75
- const parent = new DebugTestWorkflow('Parent');
76
- new DebugTestWorkflow('Child1', parent);
77
- new DebugTestWorkflow('Child2', parent);
78
-
79
- const debugger_ = new WorkflowTreeDebugger(parent);
80
- const stats = debugger_.getStats();
81
-
82
- expect(stats.totalNodes).toBe(3);
83
- expect(stats.byStatus.idle).toBe(3);
84
- });
85
- });
@@ -1,81 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { Workflow, WorkflowObserver, WorkflowNode, LogEntry, WorkflowEvent } from '../../index.js';
3
-
4
- class SimpleWorkflow extends Workflow {
5
- async run(): Promise<string> {
6
- this.setStatus('running');
7
- this.logger.info('Running simple workflow');
8
- this.setStatus('completed');
9
- return 'done';
10
- }
11
- }
12
-
13
- describe('Workflow', () => {
14
- it('should create with unique id', () => {
15
- const wf1 = new SimpleWorkflow();
16
- const wf2 = new SimpleWorkflow();
17
- expect(wf1.id).not.toBe(wf2.id);
18
- });
19
-
20
- it('should use class name as default name', () => {
21
- const wf = new SimpleWorkflow();
22
- expect(wf.getNode().name).toBe('SimpleWorkflow');
23
- });
24
-
25
- it('should use custom name when provided', () => {
26
- const wf = new SimpleWorkflow('CustomName');
27
- expect(wf.getNode().name).toBe('CustomName');
28
- });
29
-
30
- it('should start with idle status', () => {
31
- const wf = new SimpleWorkflow();
32
- expect(wf.status).toBe('idle');
33
- expect(wf.getNode().status).toBe('idle');
34
- });
35
-
36
- it('should attach child to parent', () => {
37
- const parent = new SimpleWorkflow('Parent');
38
- const child = new SimpleWorkflow('Child', parent);
39
-
40
- expect(child.parent).toBe(parent);
41
- expect(parent.children).toContain(child);
42
- expect(parent.getNode().children).toContain(child.getNode());
43
- });
44
-
45
- it('should emit logs to observers', async () => {
46
- const wf = new SimpleWorkflow();
47
- const logs: LogEntry[] = [];
48
-
49
- const observer: WorkflowObserver = {
50
- onLog: (entry) => logs.push(entry),
51
- onEvent: () => {},
52
- onStateUpdated: () => {},
53
- onTreeChanged: () => {},
54
- };
55
-
56
- wf.addObserver(observer);
57
- await wf.run();
58
-
59
- expect(logs.length).toBeGreaterThan(0);
60
- expect(logs[0].message).toBe('Running simple workflow');
61
- });
62
-
63
- it('should emit childAttached event', () => {
64
- const parent = new SimpleWorkflow('Parent');
65
- const events: WorkflowEvent[] = [];
66
-
67
- const observer: WorkflowObserver = {
68
- onLog: () => {},
69
- onEvent: (event) => events.push(event),
70
- onStateUpdated: () => {},
71
- onTreeChanged: () => {},
72
- };
73
-
74
- parent.addObserver(observer);
75
- const child = new SimpleWorkflow('Child', parent);
76
-
77
- const attachEvent = events.find((e) => e.type === 'childAttached');
78
- expect(attachEvent).toBeDefined();
79
- expect(attachEvent?.type === 'childAttached' && attachEvent.parentId).toBe(parent.id);
80
- });
81
- });
@@ -1,244 +0,0 @@
1
- /**
2
- * Cache Key Generation - Deterministic key generation for LLM response caching
3
- *
4
- * Uses SHA-256 hashing with deterministic JSON serialization to ensure
5
- * identical inputs always produce identical cache keys.
6
- */
7
-
8
- import { createHash } from 'node:crypto';
9
- import type { Tool, MCPServer, Skill } from '../types/index.js';
10
- import type { z } from 'zod';
11
-
12
- /**
13
- * Inputs used to generate a cache key
14
- */
15
- export interface CacheKeyInputs {
16
- /** User message content */
17
- user: string;
18
- /** Data passed to the prompt */
19
- data?: Record<string, unknown>;
20
- /** System prompt */
21
- system?: string;
22
- /** Model identifier */
23
- model: string;
24
- /** Temperature setting */
25
- temperature?: number;
26
- /** Maximum tokens */
27
- maxTokens?: number;
28
- /** Tools available to the agent */
29
- tools?: Tool[];
30
- /** MCP servers */
31
- mcps?: MCPServer[];
32
- /** Skills */
33
- skills?: Skill[];
34
- /** Zod response format schema */
35
- responseFormat?: z.ZodType;
36
- }
37
-
38
- /**
39
- * Deterministically stringify a value with sorted object keys
40
- *
41
- * Unlike JSON.stringify, this function guarantees consistent output
42
- * regardless of key insertion order by sorting all object keys.
43
- *
44
- * @param value - Value to stringify
45
- * @returns Deterministic JSON string
46
- * @throws TypeError if circular reference detected
47
- */
48
- export function deterministicStringify(value: unknown): string {
49
- const seen = new WeakSet<object>();
50
-
51
- function stringify(val: unknown): string {
52
- if (val === null) return 'null';
53
- if (val === undefined) return 'undefined';
54
- if (typeof val === 'string') return JSON.stringify(val);
55
- if (typeof val === 'number') {
56
- if (Number.isNaN(val)) return 'NaN';
57
- if (!Number.isFinite(val)) return val > 0 ? 'Infinity' : '-Infinity';
58
- return String(val);
59
- }
60
- if (typeof val === 'boolean') return String(val);
61
- if (typeof val === 'function') return 'function';
62
- if (typeof val === 'symbol') return 'symbol';
63
- if (typeof val === 'bigint') return `${val}n`;
64
-
65
- if (typeof val === 'object') {
66
- if (seen.has(val as object)) {
67
- throw new TypeError('Converting circular structure to JSON');
68
- }
69
- seen.add(val as object);
70
-
71
- let result: string;
72
-
73
- if (Array.isArray(val)) {
74
- result = '[' + val.map(stringify).join(',') + ']';
75
- } else if (val instanceof Date) {
76
- result = JSON.stringify(val.toISOString());
77
- } else if (val instanceof Map) {
78
- const entries = Array.from(val.entries())
79
- .sort(([a], [b]) => String(a).localeCompare(String(b)))
80
- .map(([k, v]) => `[${stringify(k)},${stringify(v)}]`);
81
- result = `Map{${entries.join(',')}}`;
82
- } else if (val instanceof Set) {
83
- const values = Array.from(val)
84
- .map(stringify)
85
- .sort();
86
- result = `Set{${values.join(',')}}`;
87
- } else {
88
- // Regular object - sort keys
89
- const keys = Object.keys(val as Record<string, unknown>).sort();
90
- const pairs = keys.map(
91
- (k) =>
92
- JSON.stringify(k) +
93
- ':' +
94
- stringify((val as Record<string, unknown>)[k])
95
- );
96
- result = '{' + pairs.join(',') + '}';
97
- }
98
-
99
- seen.delete(val as object);
100
- return result;
101
- }
102
-
103
- return String(val);
104
- }
105
-
106
- return stringify(value);
107
- }
108
-
109
- /**
110
- * Generate a hash from a Zod schema's internal definition
111
- *
112
- * Zod schemas are functions that cannot be directly serialized.
113
- * This extracts the schema's _def property which contains the
114
- * schema structure and hashes it.
115
- *
116
- * @param schema - Zod schema to hash
117
- * @returns SHA-256 hex digest of the schema definition
118
- */
119
- export function getSchemaHash(schema: z.ZodType | undefined): string {
120
- if (!schema) {
121
- return 'no-schema';
122
- }
123
-
124
- try {
125
- // Access Zod's internal _def property
126
- const def = (schema as { _def?: unknown })._def;
127
- if (!def) {
128
- return 'unknown-schema';
129
- }
130
-
131
- // Create a simplified representation of the schema
132
- const schemaRep = extractSchemaStructure(def);
133
- const serialized = deterministicStringify(schemaRep);
134
-
135
- return createHash('sha256').update(serialized, 'utf8').digest('hex');
136
- } catch {
137
- // Fallback for schemas that can't be introspected
138
- return 'fallback-schema';
139
- }
140
- }
141
-
142
- /**
143
- * Extract a serializable structure from a Zod schema definition
144
- */
145
- function extractSchemaStructure(def: unknown): unknown {
146
- if (def === null || def === undefined) {
147
- return def;
148
- }
149
-
150
- if (typeof def !== 'object') {
151
- return def;
152
- }
153
-
154
- const typedDef = def as Record<string, unknown>;
155
- const result: Record<string, unknown> = {};
156
-
157
- // Extract key properties that define schema structure
158
- if ('typeName' in typedDef) {
159
- result.typeName = typedDef.typeName;
160
- }
161
-
162
- if ('shape' in typedDef && typeof typedDef.shape === 'function') {
163
- // Object schema - extract shape
164
- try {
165
- const shape = typedDef.shape() as Record<string, { _def?: unknown }>;
166
- result.shape = Object.fromEntries(
167
- Object.entries(shape).map(([key, value]) => [
168
- key,
169
- extractSchemaStructure(value?._def),
170
- ])
171
- );
172
- } catch {
173
- result.shape = 'complex-shape';
174
- }
175
- }
176
-
177
- if ('type' in typedDef && typedDef.type && typeof typedDef.type === 'object') {
178
- result.type = extractSchemaStructure((typedDef.type as { _def?: unknown })._def);
179
- }
180
-
181
- if ('values' in typedDef) {
182
- result.values = typedDef.values;
183
- }
184
-
185
- if ('checks' in typedDef && Array.isArray(typedDef.checks)) {
186
- result.checks = typedDef.checks.map((check: { kind?: string }) => check.kind);
187
- }
188
-
189
- return result;
190
- }
191
-
192
- /**
193
- * Generate a deterministic cache key from prompt execution inputs
194
- *
195
- * The key is a 64-character SHA-256 hex digest that uniquely identifies
196
- * a specific combination of prompt, data, configuration, and tools.
197
- *
198
- * @param inputs - Cache key inputs
199
- * @returns 64-character hex SHA-256 digest
200
- */
201
- export function generateCacheKey(inputs: CacheKeyInputs): string {
202
- // Build normalized representation with sorted arrays
203
- const normalized: Record<string, unknown> = {
204
- user: inputs.user,
205
- model: inputs.model,
206
- };
207
-
208
- // Include optional fields only if defined
209
- if (inputs.data !== undefined) {
210
- normalized.data = inputs.data;
211
- }
212
-
213
- if (inputs.system !== undefined) {
214
- normalized.system = inputs.system;
215
- }
216
-
217
- if (inputs.temperature !== undefined) {
218
- normalized.temperature = inputs.temperature;
219
- }
220
-
221
- if (inputs.maxTokens !== undefined) {
222
- normalized.maxTokens = inputs.maxTokens;
223
- }
224
-
225
- // Sort tool/mcp/skill names for determinism
226
- if (inputs.tools && inputs.tools.length > 0) {
227
- normalized.tools = inputs.tools.map((t) => t.name).sort();
228
- }
229
-
230
- if (inputs.mcps && inputs.mcps.length > 0) {
231
- normalized.mcps = inputs.mcps.map((m) => m.name).sort();
232
- }
233
-
234
- if (inputs.skills && inputs.skills.length > 0) {
235
- normalized.skills = inputs.skills.map((s) => s.name).sort();
236
- }
237
-
238
- // Include schema hash
239
- normalized.schemaHash = getSchemaHash(inputs.responseFormat);
240
-
241
- // Generate SHA-256 hash
242
- const serialized = deterministicStringify(normalized);
243
- return createHash('sha256').update(serialized, 'utf8').digest('hex');
244
- }