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,857 +0,0 @@
1
- # LRU Cache Code Patterns for LLM Caching
2
-
3
- **Quick Reference Guide with Copy-Paste Ready Examples**
4
-
5
- ---
6
-
7
- ## Table of Contents
8
-
9
- 1. [Installation](#installation)
10
- 2. [Quick Start Pattern](#quick-start-pattern)
11
- 3. [Cache Key Generation Patterns](#cache-key-generation-patterns)
12
- 4. [Configuration Patterns](#configuration-patterns)
13
- 5. [Usage Patterns](#usage-patterns)
14
- 6. [Testing Patterns](#testing-patterns)
15
- 7. [Monitoring Patterns](#monitoring-patterns)
16
-
17
- ---
18
-
19
- ## Installation
20
-
21
- ```bash
22
- # Core dependencies
23
- npm install lru-cache safe-stable-stringify zod
24
-
25
- # Optional: For semantic caching
26
- npm install @xenova/transformers # For embeddings
27
-
28
- # TypeScript support
29
- npm install --save-dev typescript @types/node
30
- ```
31
-
32
- **Package.json:**
33
-
34
- ```json
35
- {
36
- "dependencies": {
37
- "lru-cache": "^10.0.0",
38
- "safe-stable-stringify": "^2.4.0",
39
- "zod": "^3.22.0"
40
- },
41
- "devDependencies": {
42
- "typescript": "^5.2.0",
43
- "@types/node": "^20.0.0"
44
- }
45
- }
46
- ```
47
-
48
- ---
49
-
50
- ## Quick Start Pattern
51
-
52
- ### Minimal Working Example
53
-
54
- ```typescript
55
- import { LRUCache } from 'lru-cache';
56
- import { createHash } from 'node:crypto';
57
- import safeStringify from 'safe-stable-stringify';
58
-
59
- // 1. Create cache
60
- const cache = new LRUCache<string, string>({
61
- max: 100,
62
- ttl: 3600000 // 1 hour
63
- });
64
-
65
- // 2. Generate deterministic key
66
- function cacheKey(input: any): string {
67
- const normalized = safeStringify(input);
68
- const hash = createHash('sha256');
69
- hash.update(normalized);
70
- return hash.digest('hex');
71
- }
72
-
73
- // 3. Use cache
74
- async function getCachedResponse(prompt: string): Promise<string> {
75
- const key = cacheKey({ prompt });
76
-
77
- return cache.fetch(
78
- key,
79
- async () => {
80
- // This only runs on cache miss
81
- const response = await expensiveOperation(prompt);
82
- return response;
83
- }
84
- );
85
- }
86
- ```
87
-
88
- ---
89
-
90
- ## Cache Key Generation Patterns
91
-
92
- ### Pattern 1: Simple String Hashing
93
-
94
- ```typescript
95
- function simpleKeyHash(text: string): string {
96
- return createHash('sha256').update(text).digest('hex');
97
- }
98
-
99
- // Usage
100
- const key = simpleKeyHash('user prompt text');
101
- ```
102
-
103
- ### Pattern 2: Object Hashing (Most Common)
104
-
105
- ```typescript
106
- function objectKeyHash(obj: Record<string, any>): string {
107
- const normalized = safeStringify(obj);
108
- const hash = createHash('sha256');
109
- hash.update(normalized);
110
- return hash.digest('hex').substring(0, 16); // 16 chars for readability
111
- }
112
-
113
- // Usage
114
- const key = objectKeyHash({
115
- model: 'gpt-4',
116
- temperature: 0.7,
117
- prompt: 'What is AI?'
118
- });
119
- ```
120
-
121
- ### Pattern 3: Composite Keys with Prefix
122
-
123
- ```typescript
124
- function compositeKey(
125
- model: string,
126
- version: string,
127
- input: Record<string, any>
128
- ): string {
129
- const hash = objectKeyHash(input);
130
- return `${model}:${version}:${hash}`;
131
- }
132
-
133
- // Usage
134
- const key = compositeKey('gpt-4', 'v1', { prompt: '...' });
135
- // Output: gpt-4:v1:a1b2c3d4e5f6g7h8
136
- ```
137
-
138
- ### Pattern 4: Semantic Cache Key (Embedding-based)
139
-
140
- ```typescript
141
- async function semanticCacheKey(
142
- prompt: string,
143
- embeddingModel: any
144
- ): Promise<string> {
145
- // Get embedding vector
146
- const embedding = await embeddingModel.embed(prompt);
147
-
148
- // Round to 2 decimal places for compression
149
- const compressed = embedding
150
- .slice(0, 10) // Take first 10 dimensions
151
- .map((v: number) => Math.round(v * 100) / 100);
152
-
153
- return safeStringify({
154
- type: 'semantic',
155
- embedding: compressed
156
- });
157
- }
158
- ```
159
-
160
- ### Pattern 5: Versioned Keys (Auto-invalidate on schema change)
161
-
162
- ```typescript
163
- class VersionedKeyGenerator {
164
- private version: number = 1;
165
-
166
- constructor(private modelName: string) {}
167
-
168
- generate(input: any): string {
169
- const normalized = safeStringify({
170
- version: this.version,
171
- model: this.modelName,
172
- input
173
- });
174
-
175
- const hash = createHash('sha256');
176
- hash.update(normalized);
177
- return hash.digest('hex');
178
- }
179
-
180
- // Bump version to invalidate all old cache entries
181
- invalidateAll(): void {
182
- this.version++;
183
- }
184
- }
185
-
186
- // Usage
187
- const keyGen = new VersionedKeyGenerator('gpt-4');
188
- const key1 = keyGen.generate({ prompt: 'hello' });
189
-
190
- keyGen.invalidateAll(); // All old keys now invalid
191
-
192
- const key2 = keyGen.generate({ prompt: 'hello' });
193
- // key1 !== key2 (different version)
194
- ```
195
-
196
- ---
197
-
198
- ## Configuration Patterns
199
-
200
- ### Pattern 1: Development Cache (Small, Short-lived)
201
-
202
- ```typescript
203
- const devCache = new LRUCache<string, any>({
204
- max: 100,
205
- ttl: 600000, // 10 minutes
206
- updateAgeOnGet: true
207
- });
208
- ```
209
-
210
- ### Pattern 2: Production Cache (Large, Long-lived)
211
-
212
- ```typescript
213
- const prodCache = new LRUCache<string, any>({
214
- max: 5000,
215
- maxSize: 500 * 1024 * 1024, // 500 MB
216
- ttl: 24 * 3600 * 1000, // 24 hours
217
- sizeCalculation: (val) => {
218
- const json = JSON.stringify(val);
219
- return Buffer.byteLength(json, 'utf8') + 100;
220
- },
221
- updateAgeOnGet: true
222
- });
223
- ```
224
-
225
- ### Pattern 3: Memory-Constrained Cache
226
-
227
- ```typescript
228
- const memoryConstrainedCache = new LRUCache<string, any>({
229
- max: 500, // Limit by item count instead of size
230
- ttl: 3600000, // 1 hour
231
- updateAgeOnGet: false // Don't refresh on every access
232
- });
233
- ```
234
-
235
- ### Pattern 4: High-Throughput Cache
236
-
237
- ```typescript
238
- const highThroughputCache = new LRUCache<string, any>({
239
- max: 10000,
240
- ttl: 1800000, // 30 minutes
241
- updateAgeOnGet: true, // Keep hot items fresh
242
-
243
- // Optional: Track evictions
244
- dispose: (value, key, reason) => {
245
- if (reason === 'evict') {
246
- console.log(`Evicted key: ${key.substring(0, 8)}...`);
247
- }
248
- }
249
- });
250
- ```
251
-
252
- ### Pattern 5: Persistent + In-Memory Hybrid
253
-
254
- ```typescript
255
- import { promises as fs } from 'node:fs';
256
-
257
- class HybridCache {
258
- private memory: LRUCache<string, any>;
259
- private persistDir = './cache';
260
-
261
- constructor() {
262
- this.memory = new LRUCache<string, any>({
263
- max: 1000,
264
- maxSize: 100 * 1024 * 1024
265
- });
266
- }
267
-
268
- async get(key: string): Promise<any | undefined> {
269
- // L1: Memory
270
- const memValue = this.memory.get(key);
271
- if (memValue) return memValue;
272
-
273
- // L2: Disk
274
- try {
275
- const filePath = `${this.persistDir}/${key}.json`;
276
- const data = await fs.readFile(filePath, 'utf8');
277
- const value = JSON.parse(data);
278
-
279
- // Promote to memory
280
- this.memory.set(key, value);
281
- return value;
282
- } catch {
283
- return undefined;
284
- }
285
- }
286
-
287
- async set(key: string, value: any): Promise<void> {
288
- this.memory.set(key, value);
289
-
290
- // Persist to disk
291
- const filePath = `${this.persistDir}/${key}.json`;
292
- await fs.mkdir(this.persistDir, { recursive: true });
293
- await fs.writeFile(filePath, JSON.stringify(value));
294
- }
295
- }
296
- ```
297
-
298
- ---
299
-
300
- ## Usage Patterns
301
-
302
- ### Pattern 1: Basic Fetch (Recommended)
303
-
304
- ```typescript
305
- async function fetchWithCache(
306
- prompt: string,
307
- cache: LRUCache<string, string>
308
- ): Promise<string> {
309
- const key = createHash('sha256').update(prompt).digest('hex');
310
-
311
- return cache.fetch(
312
- key,
313
- async () => {
314
- // Only executes on cache miss
315
- const response = await callLLM(prompt);
316
- return response;
317
- },
318
- {
319
- ttl: 24 * 3600 * 1000 // Per-item override
320
- }
321
- );
322
- }
323
-
324
- async function callLLM(prompt: string): Promise<string> {
325
- // Your LLM API call
326
- return 'LLM response...';
327
- }
328
- ```
329
-
330
- ### Pattern 2: Conditional Fetch
331
-
332
- ```typescript
333
- async function fetchWithExpiry(
334
- key: string,
335
- fetchFn: () => Promise<any>,
336
- cache: LRUCache<string, any>,
337
- forceRefresh = false
338
- ): Promise<any> {
339
- if (forceRefresh) {
340
- // Force refresh even if cached
341
- const value = await fetchFn();
342
- cache.set(key, value);
343
- return value;
344
- }
345
-
346
- return cache.fetch(key, fetchFn);
347
- }
348
-
349
- // Usage
350
- const result = await fetchWithExpiry(
351
- key,
352
- async () => expensiveOperation(),
353
- cache,
354
- false // Set true to force refresh
355
- );
356
- ```
357
-
358
- ### Pattern 3: Batch Operations
359
-
360
- ```typescript
361
- async function cacheBatchLookups(
362
- prompts: string[],
363
- cache: LRUCache<string, string>
364
- ): Promise<Map<string, string>> {
365
- const results = new Map<string, string>();
366
-
367
- // Process in parallel with cache deduplication
368
- await Promise.all(
369
- prompts.map(async (prompt) => {
370
- const key = createHash('sha256').update(prompt).digest('hex');
371
-
372
- const response = await cache.fetch(
373
- key,
374
- async () => callLLM(prompt)
375
- );
376
-
377
- results.set(prompt, response);
378
- })
379
- );
380
-
381
- return results;
382
- }
383
- ```
384
-
385
- ### Pattern 4: Stale-While-Revalidate Pattern
386
-
387
- ```typescript
388
- async function staleWhileRevalidate(
389
- key: string,
390
- cache: LRUCache<string, any>,
391
- fetchFn: () => Promise<any>
392
- ): Promise<any> {
393
- // Return stale value immediately if available
394
- const cached = cache.get(key);
395
- if (cached) {
396
- // Refresh in background
397
- fetchFn().then((fresh) => {
398
- cache.set(key, fresh);
399
- }).catch(console.error);
400
-
401
- return cached;
402
- }
403
-
404
- // No cached value, wait for fetch
405
- return fetchFn().then((value) => {
406
- cache.set(key, value);
407
- return value;
408
- });
409
- }
410
- ```
411
-
412
- ### Pattern 5: Cache Warming
413
-
414
- ```typescript
415
- async function warmCache(
416
- cache: LRUCache<string, any>,
417
- prompts: string[]
418
- ): Promise<void> {
419
- console.log(`Warming cache with ${prompts.length} entries...`);
420
-
421
- for (const prompt of prompts) {
422
- const key = createHash('sha256').update(prompt).digest('hex');
423
-
424
- try {
425
- await cache.fetch(
426
- key,
427
- async () => callLLM(prompt),
428
- { ttl: 7 * 24 * 3600 * 1000 } // 7 days
429
- );
430
- } catch (error) {
431
- console.error(`Failed to warm cache for prompt: ${prompt}`, error);
432
- }
433
- }
434
-
435
- console.log('Cache warming complete');
436
- }
437
-
438
- // Usage
439
- const commonPrompts = [
440
- 'What is AI?',
441
- 'Explain machine learning',
442
- 'Define neural networks'
443
- ];
444
-
445
- await warmCache(cache, commonPrompts);
446
- ```
447
-
448
- ---
449
-
450
- ## Testing Patterns
451
-
452
- ### Pattern 1: Cache Hit/Miss Testing
453
-
454
- ```typescript
455
- import { describe, it, expect } from 'vitest';
456
-
457
- describe('LLM Cache', () => {
458
- let cache: LRUCache<string, string>;
459
-
460
- beforeEach(() => {
461
- cache = new LRUCache({ max: 100 });
462
- });
463
-
464
- it('should have cache hit on repeated prompt', async () => {
465
- const prompt = 'What is AI?';
466
- let callCount = 0;
467
-
468
- const fetchFn = async () => {
469
- callCount++;
470
- return 'AI is...';
471
- };
472
-
473
- // First call - miss
474
- const result1 = await cache.fetch(
475
- createHash('sha256').update(prompt).digest('hex'),
476
- fetchFn
477
- );
478
-
479
- // Second call - hit
480
- const result2 = await cache.fetch(
481
- createHash('sha256').update(prompt).digest('hex'),
482
- fetchFn
483
- );
484
-
485
- expect(result1).toBe(result2);
486
- expect(callCount).toBe(1); // Only called once
487
- });
488
-
489
- it('should evict LRU items', () => {
490
- const cache = new LRUCache({ max: 2 });
491
-
492
- cache.set('key1', 'value1');
493
- cache.set('key2', 'value2');
494
- cache.set('key3', 'value3');
495
-
496
- expect(cache.get('key1')).toBeUndefined(); // Evicted
497
- expect(cache.get('key2')).toBe('value2');
498
- expect(cache.get('key3')).toBe('value3');
499
- });
500
- });
501
- ```
502
-
503
- ### Pattern 2: Key Generation Testing
504
-
505
- ```typescript
506
- describe('Cache Key Generation', () => {
507
- it('should produce same key for equivalent inputs', () => {
508
- const obj1 = { a: 1, b: 2, c: 3 };
509
- const obj2 = { c: 3, b: 2, a: 1 };
510
-
511
- const key1 = objectKeyHash(obj1);
512
- const key2 = objectKeyHash(obj2);
513
-
514
- expect(key1).toBe(key2);
515
- });
516
-
517
- it('should handle circular references', () => {
518
- const obj: any = { value: 42 };
519
- obj.self = obj;
520
-
521
- expect(() => {
522
- objectKeyHash(obj);
523
- }).not.toThrow();
524
- });
525
-
526
- it('should produce different keys for different inputs', () => {
527
- const key1 = objectKeyHash({ prompt: 'hello' });
528
- const key2 = objectKeyHash({ prompt: 'world' });
529
-
530
- expect(key1).not.toBe(key2);
531
- });
532
- });
533
- ```
534
-
535
- ### Pattern 3: Performance Testing
536
-
537
- ```typescript
538
- import { performance } from 'node:perf_hooks';
539
-
540
- describe('Cache Performance', () => {
541
- it('should handle 10k cache hits in < 100ms', () => {
542
- const cache = new LRUCache<string, string>({ max: 1000 });
543
- cache.set('key', 'value');
544
-
545
- const start = performance.now();
546
-
547
- for (let i = 0; i < 10000; i++) {
548
- cache.get('key');
549
- }
550
-
551
- const elapsed = performance.now() - start;
552
- expect(elapsed).toBeLessThan(100);
553
- });
554
-
555
- it('should deterministically stringify in < 1ms', () => {
556
- const obj = {
557
- messages: Array(10).fill({ role: 'user', content: 'x'.repeat(100) }),
558
- model: 'gpt-4',
559
- temperature: 0.7
560
- };
561
-
562
- const start = performance.now();
563
-
564
- for (let i = 0; i < 1000; i++) {
565
- safeStringify(obj);
566
- }
567
-
568
- const elapsed = performance.now() - start;
569
- expect(elapsed).toBeLessThan(1000); // 1000 iterations < 1 second
570
- });
571
- });
572
- ```
573
-
574
- ---
575
-
576
- ## Monitoring Patterns
577
-
578
- ### Pattern 1: Basic Metrics Collection
579
-
580
- ```typescript
581
- class CacheMetrics {
582
- hits = 0;
583
- misses = 0;
584
- latencies: number[] = [];
585
-
586
- recordHit(latency: number): void {
587
- this.hits++;
588
- this.latencies.push(latency);
589
- this.trimLatencies();
590
- }
591
-
592
- recordMiss(latency: number): void {
593
- this.misses++;
594
- this.latencies.push(latency);
595
- this.trimLatencies();
596
- }
597
-
598
- private trimLatencies(): void {
599
- if (this.latencies.length > 10000) {
600
- this.latencies = this.latencies.slice(-5000);
601
- }
602
- }
603
-
604
- getStats() {
605
- const total = this.hits + this.misses;
606
- const avgLatency = this.latencies.length > 0
607
- ? this.latencies.reduce((a, b) => a + b, 0) / this.latencies.length
608
- : 0;
609
-
610
- return {
611
- hits: this.hits,
612
- misses: this.misses,
613
- hitRate: total > 0 ? ((this.hits / total) * 100).toFixed(2) + '%' : '0%',
614
- avgLatency: avgLatency.toFixed(3) + ' ms',
615
- p95Latency: this.percentile(95) + ' ms',
616
- p99Latency: this.percentile(99) + ' ms'
617
- };
618
- }
619
-
620
- private percentile(p: number): string {
621
- const sorted = [...this.latencies].sort((a, b) => a - b);
622
- const idx = Math.ceil((p / 100) * sorted.length) - 1;
623
- return sorted[idx]?.toFixed(3) || '0';
624
- }
625
- }
626
- ```
627
-
628
- ### Pattern 2: Periodic Logging
629
-
630
- ```typescript
631
- function setupCacheMonitoring(
632
- cache: LRUCache<string, any>,
633
- metrics: CacheMetrics,
634
- intervalMs = 60000
635
- ): () => void {
636
- const timer = setInterval(() => {
637
- const stats = metrics.getStats();
638
- console.log('[Cache Status]', {
639
- timestamp: new Date().toISOString(),
640
- size: cache.size,
641
- ...stats
642
- });
643
- }, intervalMs);
644
-
645
- return () => clearInterval(timer);
646
- }
647
-
648
- // Usage
649
- const metrics = new CacheMetrics();
650
- const stopMonitoring = setupCacheMonitoring(cache, metrics, 30000);
651
-
652
- // Later
653
- stopMonitoring();
654
- ```
655
-
656
- ### Pattern 3: Alert on Low Hit Rate
657
-
658
- ```typescript
659
- function monitorHitRate(
660
- metrics: CacheMetrics,
661
- minHitRate = 0.3, // 30% minimum
662
- checkIntervalMs = 60000
663
- ): () => void {
664
- const timer = setInterval(() => {
665
- const stats = metrics.getStats();
666
- const hitRate = parseFloat(stats.hitRate);
667
-
668
- if (hitRate < minHitRate * 100) {
669
- console.warn(
670
- `⚠️ Low cache hit rate: ${stats.hitRate} (threshold: ${minHitRate * 100}%)`
671
- );
672
- }
673
- }, checkIntervalMs);
674
-
675
- return () => clearInterval(timer);
676
- }
677
- ```
678
-
679
- ### Pattern 4: Export Metrics to JSON
680
-
681
- ```typescript
682
- async function exportMetrics(
683
- metrics: CacheMetrics,
684
- filePath: string
685
- ): Promise<void> {
686
- const stats = metrics.getStats();
687
- const data = JSON.stringify(stats, null, 2);
688
-
689
- await fs.promises.writeFile(filePath, data, 'utf8');
690
- console.log(`Metrics exported to ${filePath}`);
691
- }
692
-
693
- // Usage
694
- await exportMetrics(metrics, './cache-metrics.json');
695
- ```
696
-
697
- ---
698
-
699
- ## Edge Cases and Solutions
700
-
701
- ### Handling Large Prompts
702
-
703
- ```typescript
704
- // For very large prompts, use streaming hash
705
- async function hashLargePrompt(prompt: string): Promise<string> {
706
- const hash = createHash('sha256');
707
- const chunkSize = 65536; // 64 KB
708
-
709
- for (let i = 0; i < prompt.length; i += chunkSize) {
710
- hash.update(prompt.slice(i, i + chunkSize));
711
- }
712
-
713
- return hash.digest('hex');
714
- }
715
- ```
716
-
717
- ### Handling Special Characters
718
-
719
- ```typescript
720
- // Ensure UTF-8 encoding for consistent hashing
721
- function hashWithEncoding(input: string): string {
722
- const buffer = Buffer.from(input, 'utf8');
723
- const hash = createHash('sha256');
724
- hash.update(buffer);
725
- return hash.digest('hex');
726
- }
727
- ```
728
-
729
- ### Handling Null/Undefined Values
730
-
731
- ```typescript
732
- function safeKeyHash(value: any): string {
733
- if (value === null || value === undefined) {
734
- return createHash('sha256').update('null').digest('hex');
735
- }
736
-
737
- const str = safeStringify(value);
738
- const hash = createHash('sha256');
739
- hash.update(str);
740
- return hash.digest('hex');
741
- }
742
- ```
743
-
744
- ---
745
-
746
- ## Complete Integration Example
747
-
748
- ```typescript
749
- // cache.service.ts
750
- import { LRUCache } from 'lru-cache';
751
- import { createHash } from 'node:crypto';
752
- import safeStringify from 'safe-stable-stringify';
753
-
754
- export interface CacheConfig {
755
- maxItems?: number;
756
- maxSizeMB?: number;
757
- ttlHours?: number;
758
- }
759
-
760
- export class LLMCacheService {
761
- private cache: LRUCache<string, any>;
762
- private metrics = {
763
- hits: 0,
764
- misses: 0,
765
- latencies: [] as number[]
766
- };
767
-
768
- constructor(config: CacheConfig = {}) {
769
- const {
770
- maxItems = 5000,
771
- maxSizeMB = 500,
772
- ttlHours = 24
773
- } = config;
774
-
775
- this.cache = new LRUCache({
776
- max: maxItems,
777
- maxSize: maxSizeMB * 1024 * 1024,
778
- sizeCalculation: (val) => {
779
- const json = JSON.stringify(val);
780
- return Buffer.byteLength(json, 'utf8') + 100;
781
- },
782
- ttl: ttlHours * 3600 * 1000,
783
- updateAgeOnGet: true
784
- });
785
- }
786
-
787
- async fetch<T>(
788
- input: Record<string, any>,
789
- fetcher: () => Promise<T>
790
- ): Promise<T> {
791
- const start = performance.now();
792
- const key = this.generateKey(input);
793
-
794
- const result = await this.cache.fetch(key, fetcher);
795
-
796
- const latency = performance.now() - start;
797
- const cached = this.cache.get(key) !== undefined;
798
-
799
- if (cached) {
800
- this.metrics.hits++;
801
- } else {
802
- this.metrics.misses++;
803
- }
804
- this.metrics.latencies.push(latency);
805
-
806
- return result;
807
- }
808
-
809
- private generateKey(input: Record<string, any>): string {
810
- const normalized = safeStringify(input);
811
- const hash = createHash('sha256');
812
- hash.update(normalized);
813
- return hash.digest('hex');
814
- }
815
-
816
- getMetrics() {
817
- const total = this.metrics.hits + this.metrics.misses;
818
- return {
819
- hits: this.metrics.hits,
820
- misses: this.metrics.misses,
821
- hitRate: total > 0 ? (this.metrics.hits / total * 100).toFixed(2) : '0',
822
- size: this.cache.size
823
- };
824
- }
825
-
826
- clear(): void {
827
- this.cache.clear();
828
- }
829
- }
830
-
831
- // Usage in your application
832
- const cacheService = new LLMCacheService({
833
- maxItems: 5000,
834
- maxSizeMB: 500,
835
- ttlHours: 24
836
- });
837
-
838
- // Use in your LLM service
839
- const response = await cacheService.fetch(
840
- {
841
- model: 'gpt-4',
842
- prompt: 'What is AI?',
843
- temperature: 0.7
844
- },
845
- async () => {
846
- return callOpenAIAPI(...);
847
- }
848
- );
849
-
850
- // Monitor
851
- console.log(cacheService.getMetrics());
852
- ```
853
-
854
- ---
855
-
856
- **Document Version:** 1.0
857
- **Last Updated:** 2025-12-08