@miller-tech/uap 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +888 -0
  3. package/dist/analyzers/index.d.ts +3 -0
  4. package/dist/analyzers/index.d.ts.map +1 -0
  5. package/dist/analyzers/index.js +684 -0
  6. package/dist/analyzers/index.js.map +1 -0
  7. package/dist/benchmarks/agents/naive-agent.d.ts +60 -0
  8. package/dist/benchmarks/agents/naive-agent.d.ts.map +1 -0
  9. package/dist/benchmarks/agents/naive-agent.js +144 -0
  10. package/dist/benchmarks/agents/naive-agent.js.map +1 -0
  11. package/dist/benchmarks/agents/uap-agent.d.ts +167 -0
  12. package/dist/benchmarks/agents/uap-agent.d.ts.map +1 -0
  13. package/dist/benchmarks/agents/uap-agent.js +437 -0
  14. package/dist/benchmarks/agents/uap-agent.js.map +1 -0
  15. package/dist/benchmarks/benchmark.d.ts +328 -0
  16. package/dist/benchmarks/benchmark.d.ts.map +1 -0
  17. package/dist/benchmarks/benchmark.js +112 -0
  18. package/dist/benchmarks/benchmark.js.map +1 -0
  19. package/dist/benchmarks/execution-verifier.d.ts +41 -0
  20. package/dist/benchmarks/execution-verifier.d.ts.map +1 -0
  21. package/dist/benchmarks/execution-verifier.js +340 -0
  22. package/dist/benchmarks/execution-verifier.js.map +1 -0
  23. package/dist/benchmarks/hierarchical-prompting.d.ts +37 -0
  24. package/dist/benchmarks/hierarchical-prompting.d.ts.map +1 -0
  25. package/dist/benchmarks/hierarchical-prompting.js +246 -0
  26. package/dist/benchmarks/hierarchical-prompting.js.map +1 -0
  27. package/dist/benchmarks/improved-benchmark.d.ts +89 -0
  28. package/dist/benchmarks/improved-benchmark.d.ts.map +1 -0
  29. package/dist/benchmarks/improved-benchmark.js +585 -0
  30. package/dist/benchmarks/improved-benchmark.js.map +1 -0
  31. package/dist/benchmarks/index.d.ts +11 -0
  32. package/dist/benchmarks/index.d.ts.map +1 -0
  33. package/dist/benchmarks/index.js +11 -0
  34. package/dist/benchmarks/index.js.map +1 -0
  35. package/dist/benchmarks/model-integration.d.ts +111 -0
  36. package/dist/benchmarks/model-integration.d.ts.map +1 -0
  37. package/dist/benchmarks/model-integration.js +904 -0
  38. package/dist/benchmarks/model-integration.js.map +1 -0
  39. package/dist/benchmarks/multi-turn-agent.d.ts +44 -0
  40. package/dist/benchmarks/multi-turn-agent.d.ts.map +1 -0
  41. package/dist/benchmarks/multi-turn-agent.js +254 -0
  42. package/dist/benchmarks/multi-turn-agent.js.map +1 -0
  43. package/dist/benchmarks/multi-turn-loop.d.ts +57 -0
  44. package/dist/benchmarks/multi-turn-loop.d.ts.map +1 -0
  45. package/dist/benchmarks/multi-turn-loop.js +167 -0
  46. package/dist/benchmarks/multi-turn-loop.js.map +1 -0
  47. package/dist/benchmarks/tasks.d.ts +19 -0
  48. package/dist/benchmarks/tasks.d.ts.map +1 -0
  49. package/dist/benchmarks/tasks.js +435 -0
  50. package/dist/benchmarks/tasks.js.map +1 -0
  51. package/dist/bin/cli.d.ts +3 -0
  52. package/dist/bin/cli.d.ts.map +1 -0
  53. package/dist/bin/cli.js +546 -0
  54. package/dist/bin/cli.js.map +1 -0
  55. package/dist/bin/llama-server-optimize.d.ts +18 -0
  56. package/dist/bin/llama-server-optimize.d.ts.map +1 -0
  57. package/dist/bin/llama-server-optimize.js +708 -0
  58. package/dist/bin/llama-server-optimize.js.map +1 -0
  59. package/dist/bin/policy.d.ts +3 -0
  60. package/dist/bin/policy.d.ts.map +1 -0
  61. package/dist/bin/policy.js +143 -0
  62. package/dist/bin/policy.js.map +1 -0
  63. package/dist/bin/tool-calls.d.ts +3 -0
  64. package/dist/bin/tool-calls.d.ts.map +1 -0
  65. package/dist/bin/tool-calls.js +4 -0
  66. package/dist/bin/tool-calls.js.map +1 -0
  67. package/dist/browser/index.d.ts +2 -0
  68. package/dist/browser/index.d.ts.map +1 -0
  69. package/dist/browser/index.js +2 -0
  70. package/dist/browser/index.js.map +1 -0
  71. package/dist/browser/web-browser.d.ts +30 -0
  72. package/dist/browser/web-browser.d.ts.map +1 -0
  73. package/dist/browser/web-browser.js +93 -0
  74. package/dist/browser/web-browser.js.map +1 -0
  75. package/dist/cli/agent.d.ts +20 -0
  76. package/dist/cli/agent.d.ts.map +1 -0
  77. package/dist/cli/agent.js +474 -0
  78. package/dist/cli/agent.js.map +1 -0
  79. package/dist/cli/analyze.d.ts +7 -0
  80. package/dist/cli/analyze.d.ts.map +1 -0
  81. package/dist/cli/analyze.js +103 -0
  82. package/dist/cli/analyze.js.map +1 -0
  83. package/dist/cli/completion-gates.d.ts +51 -0
  84. package/dist/cli/completion-gates.d.ts.map +1 -0
  85. package/dist/cli/completion-gates.js +201 -0
  86. package/dist/cli/completion-gates.js.map +1 -0
  87. package/dist/cli/compliance.d.ts +8 -0
  88. package/dist/cli/compliance.d.ts.map +1 -0
  89. package/dist/cli/compliance.js +509 -0
  90. package/dist/cli/compliance.js.map +1 -0
  91. package/dist/cli/coord.d.ts +7 -0
  92. package/dist/cli/coord.d.ts.map +1 -0
  93. package/dist/cli/coord.js +138 -0
  94. package/dist/cli/coord.js.map +1 -0
  95. package/dist/cli/dashboard.d.ts +21 -0
  96. package/dist/cli/dashboard.d.ts.map +1 -0
  97. package/dist/cli/dashboard.js +1508 -0
  98. package/dist/cli/dashboard.js.map +1 -0
  99. package/dist/cli/deploy.d.ts +19 -0
  100. package/dist/cli/deploy.d.ts.map +1 -0
  101. package/dist/cli/deploy.js +387 -0
  102. package/dist/cli/deploy.js.map +1 -0
  103. package/dist/cli/droids.d.ts +9 -0
  104. package/dist/cli/droids.d.ts.map +1 -0
  105. package/dist/cli/droids.js +227 -0
  106. package/dist/cli/droids.js.map +1 -0
  107. package/dist/cli/generate.d.ts +17 -0
  108. package/dist/cli/generate.d.ts.map +1 -0
  109. package/dist/cli/generate.js +432 -0
  110. package/dist/cli/generate.js.map +1 -0
  111. package/dist/cli/hooks.d.ts +9 -0
  112. package/dist/cli/hooks.d.ts.map +1 -0
  113. package/dist/cli/hooks.js +464 -0
  114. package/dist/cli/hooks.js.map +1 -0
  115. package/dist/cli/init.d.ts +12 -0
  116. package/dist/cli/init.d.ts.map +1 -0
  117. package/dist/cli/init.js +364 -0
  118. package/dist/cli/init.js.map +1 -0
  119. package/dist/cli/mcp-router.d.ts +16 -0
  120. package/dist/cli/mcp-router.d.ts.map +1 -0
  121. package/dist/cli/mcp-router.js +143 -0
  122. package/dist/cli/mcp-router.js.map +1 -0
  123. package/dist/cli/memory.d.ts +24 -0
  124. package/dist/cli/memory.d.ts.map +1 -0
  125. package/dist/cli/memory.js +885 -0
  126. package/dist/cli/memory.js.map +1 -0
  127. package/dist/cli/model.d.ts +15 -0
  128. package/dist/cli/model.d.ts.map +1 -0
  129. package/dist/cli/model.js +290 -0
  130. package/dist/cli/model.js.map +1 -0
  131. package/dist/cli/patterns.d.ts +26 -0
  132. package/dist/cli/patterns.d.ts.map +1 -0
  133. package/dist/cli/patterns.js +862 -0
  134. package/dist/cli/patterns.js.map +1 -0
  135. package/dist/cli/rtk-validation.d.ts +9 -0
  136. package/dist/cli/rtk-validation.d.ts.map +1 -0
  137. package/dist/cli/rtk-validation.js +9 -0
  138. package/dist/cli/rtk-validation.js.map +1 -0
  139. package/dist/cli/rtk.d.ts +34 -0
  140. package/dist/cli/rtk.d.ts.map +1 -0
  141. package/dist/cli/rtk.js +401 -0
  142. package/dist/cli/rtk.js.map +1 -0
  143. package/dist/cli/schema-diff.d.ts +7 -0
  144. package/dist/cli/schema-diff.d.ts.map +1 -0
  145. package/dist/cli/schema-diff.js +11 -0
  146. package/dist/cli/schema-diff.js.map +1 -0
  147. package/dist/cli/setup-mcp-router.d.ts +8 -0
  148. package/dist/cli/setup-mcp-router.d.ts.map +1 -0
  149. package/dist/cli/setup-mcp-router.js +163 -0
  150. package/dist/cli/setup-mcp-router.js.map +1 -0
  151. package/dist/cli/setup-wizard.d.ts +2 -0
  152. package/dist/cli/setup-wizard.d.ts.map +1 -0
  153. package/dist/cli/setup-wizard.js +806 -0
  154. package/dist/cli/setup-wizard.js.map +1 -0
  155. package/dist/cli/setup.d.ts +15 -0
  156. package/dist/cli/setup.d.ts.map +1 -0
  157. package/dist/cli/setup.js +154 -0
  158. package/dist/cli/setup.js.map +1 -0
  159. package/dist/cli/sync.d.ts +8 -0
  160. package/dist/cli/sync.d.ts.map +1 -0
  161. package/dist/cli/sync.js +395 -0
  162. package/dist/cli/sync.js.map +1 -0
  163. package/dist/cli/task.d.ts +33 -0
  164. package/dist/cli/task.d.ts.map +1 -0
  165. package/dist/cli/task.js +672 -0
  166. package/dist/cli/task.js.map +1 -0
  167. package/dist/cli/tool-calls.d.ts +20 -0
  168. package/dist/cli/tool-calls.d.ts.map +1 -0
  169. package/dist/cli/tool-calls.js +605 -0
  170. package/dist/cli/tool-calls.js.map +1 -0
  171. package/dist/cli/uap.d.ts +10 -0
  172. package/dist/cli/uap.d.ts.map +1 -0
  173. package/dist/cli/uap.js +398 -0
  174. package/dist/cli/uap.js.map +1 -0
  175. package/dist/cli/update.d.ts +10 -0
  176. package/dist/cli/update.d.ts.map +1 -0
  177. package/dist/cli/update.js +300 -0
  178. package/dist/cli/update.js.map +1 -0
  179. package/dist/cli/visualize.d.ts +77 -0
  180. package/dist/cli/visualize.d.ts.map +1 -0
  181. package/dist/cli/visualize.js +287 -0
  182. package/dist/cli/visualize.js.map +1 -0
  183. package/dist/cli/worktree.d.ts +9 -0
  184. package/dist/cli/worktree.d.ts.map +1 -0
  185. package/dist/cli/worktree.js +213 -0
  186. package/dist/cli/worktree.js.map +1 -0
  187. package/dist/coordination/adaptive-patterns.d.ts +65 -0
  188. package/dist/coordination/adaptive-patterns.d.ts.map +1 -0
  189. package/dist/coordination/adaptive-patterns.js +108 -0
  190. package/dist/coordination/adaptive-patterns.js.map +1 -0
  191. package/dist/coordination/auto-agent.d.ts +82 -0
  192. package/dist/coordination/auto-agent.d.ts.map +1 -0
  193. package/dist/coordination/auto-agent.js +145 -0
  194. package/dist/coordination/auto-agent.js.map +1 -0
  195. package/dist/coordination/capability-router.d.ts +79 -0
  196. package/dist/coordination/capability-router.d.ts.map +1 -0
  197. package/dist/coordination/capability-router.js +334 -0
  198. package/dist/coordination/capability-router.js.map +1 -0
  199. package/dist/coordination/database.d.ts +13 -0
  200. package/dist/coordination/database.d.ts.map +1 -0
  201. package/dist/coordination/database.js +136 -0
  202. package/dist/coordination/database.js.map +1 -0
  203. package/dist/coordination/deploy-batcher.d.ts +122 -0
  204. package/dist/coordination/deploy-batcher.d.ts.map +1 -0
  205. package/dist/coordination/deploy-batcher.js +718 -0
  206. package/dist/coordination/deploy-batcher.js.map +1 -0
  207. package/dist/coordination/droid-validator.d.ts +59 -0
  208. package/dist/coordination/droid-validator.d.ts.map +1 -0
  209. package/dist/coordination/droid-validator.js +142 -0
  210. package/dist/coordination/droid-validator.js.map +1 -0
  211. package/dist/coordination/index.d.ts +10 -0
  212. package/dist/coordination/index.d.ts.map +1 -0
  213. package/dist/coordination/index.js +10 -0
  214. package/dist/coordination/index.js.map +1 -0
  215. package/dist/coordination/pattern-router.d.ts +50 -0
  216. package/dist/coordination/pattern-router.d.ts.map +1 -0
  217. package/dist/coordination/pattern-router.js +118 -0
  218. package/dist/coordination/pattern-router.js.map +1 -0
  219. package/dist/coordination/service.d.ts +81 -0
  220. package/dist/coordination/service.d.ts.map +1 -0
  221. package/dist/coordination/service.js +619 -0
  222. package/dist/coordination/service.js.map +1 -0
  223. package/dist/coordination/worktree-enforcer.d.ts +22 -0
  224. package/dist/coordination/worktree-enforcer.d.ts.map +1 -0
  225. package/dist/coordination/worktree-enforcer.js +71 -0
  226. package/dist/coordination/worktree-enforcer.js.map +1 -0
  227. package/dist/generators/claude-md.d.ts +3 -0
  228. package/dist/generators/claude-md.d.ts.map +1 -0
  229. package/dist/generators/claude-md.js +1020 -0
  230. package/dist/generators/claude-md.js.map +1 -0
  231. package/dist/generators/template-loader.d.ts +105 -0
  232. package/dist/generators/template-loader.d.ts.map +1 -0
  233. package/dist/generators/template-loader.js +291 -0
  234. package/dist/generators/template-loader.js.map +1 -0
  235. package/dist/index.d.ts +49 -0
  236. package/dist/index.d.ts.map +1 -0
  237. package/dist/index.js +63 -0
  238. package/dist/index.js.map +1 -0
  239. package/dist/mcp-router/config/parser.d.ts +9 -0
  240. package/dist/mcp-router/config/parser.d.ts.map +1 -0
  241. package/dist/mcp-router/config/parser.js +174 -0
  242. package/dist/mcp-router/config/parser.js.map +1 -0
  243. package/dist/mcp-router/executor/client.d.ts +31 -0
  244. package/dist/mcp-router/executor/client.d.ts.map +1 -0
  245. package/dist/mcp-router/executor/client.js +189 -0
  246. package/dist/mcp-router/executor/client.js.map +1 -0
  247. package/dist/mcp-router/index.d.ts +22 -0
  248. package/dist/mcp-router/index.d.ts.map +1 -0
  249. package/dist/mcp-router/index.js +18 -0
  250. package/dist/mcp-router/index.js.map +1 -0
  251. package/dist/mcp-router/output-compressor.d.ts +26 -0
  252. package/dist/mcp-router/output-compressor.d.ts.map +1 -0
  253. package/dist/mcp-router/output-compressor.js +236 -0
  254. package/dist/mcp-router/output-compressor.js.map +1 -0
  255. package/dist/mcp-router/search/fuzzy.d.ts +26 -0
  256. package/dist/mcp-router/search/fuzzy.d.ts.map +1 -0
  257. package/dist/mcp-router/search/fuzzy.js +94 -0
  258. package/dist/mcp-router/search/fuzzy.js.map +1 -0
  259. package/dist/mcp-router/server.d.ts +50 -0
  260. package/dist/mcp-router/server.d.ts.map +1 -0
  261. package/dist/mcp-router/server.js +229 -0
  262. package/dist/mcp-router/server.js.map +1 -0
  263. package/dist/mcp-router/session-stats.d.ts +37 -0
  264. package/dist/mcp-router/session-stats.d.ts.map +1 -0
  265. package/dist/mcp-router/session-stats.js +56 -0
  266. package/dist/mcp-router/session-stats.js.map +1 -0
  267. package/dist/mcp-router/tools/discover.d.ts +37 -0
  268. package/dist/mcp-router/tools/discover.d.ts.map +1 -0
  269. package/dist/mcp-router/tools/discover.js +65 -0
  270. package/dist/mcp-router/tools/discover.js.map +1 -0
  271. package/dist/mcp-router/tools/execute.d.ts +43 -0
  272. package/dist/mcp-router/tools/execute.d.ts.map +1 -0
  273. package/dist/mcp-router/tools/execute.js +144 -0
  274. package/dist/mcp-router/tools/execute.js.map +1 -0
  275. package/dist/mcp-router/types.d.ts +62 -0
  276. package/dist/mcp-router/types.d.ts.map +1 -0
  277. package/dist/mcp-router/types.js +6 -0
  278. package/dist/mcp-router/types.js.map +1 -0
  279. package/dist/memory/adaptive-context.d.ts +149 -0
  280. package/dist/memory/adaptive-context.d.ts.map +1 -0
  281. package/dist/memory/adaptive-context.js +1095 -0
  282. package/dist/memory/adaptive-context.js.map +1 -0
  283. package/dist/memory/agent-scoped-memory.d.ts +67 -0
  284. package/dist/memory/agent-scoped-memory.d.ts.map +1 -0
  285. package/dist/memory/agent-scoped-memory.js +126 -0
  286. package/dist/memory/agent-scoped-memory.js.map +1 -0
  287. package/dist/memory/ambiguity-detector.d.ts +54 -0
  288. package/dist/memory/ambiguity-detector.d.ts.map +1 -0
  289. package/dist/memory/ambiguity-detector.js +401 -0
  290. package/dist/memory/ambiguity-detector.js.map +1 -0
  291. package/dist/memory/backends/base.d.ts +18 -0
  292. package/dist/memory/backends/base.d.ts.map +1 -0
  293. package/dist/memory/backends/base.js +2 -0
  294. package/dist/memory/backends/base.js.map +1 -0
  295. package/dist/memory/backends/factory.d.ts +4 -0
  296. package/dist/memory/backends/factory.d.ts.map +1 -0
  297. package/dist/memory/backends/factory.js +53 -0
  298. package/dist/memory/backends/factory.js.map +1 -0
  299. package/dist/memory/backends/github.d.ts +27 -0
  300. package/dist/memory/backends/github.d.ts.map +1 -0
  301. package/dist/memory/backends/github.js +134 -0
  302. package/dist/memory/backends/github.js.map +1 -0
  303. package/dist/memory/backends/qdrant-cloud.d.ts +32 -0
  304. package/dist/memory/backends/qdrant-cloud.d.ts.map +1 -0
  305. package/dist/memory/backends/qdrant-cloud.js +167 -0
  306. package/dist/memory/backends/qdrant-cloud.js.map +1 -0
  307. package/dist/memory/context-compressor.d.ts +116 -0
  308. package/dist/memory/context-compressor.d.ts.map +1 -0
  309. package/dist/memory/context-compressor.js +430 -0
  310. package/dist/memory/context-compressor.js.map +1 -0
  311. package/dist/memory/context-pruner.d.ts +55 -0
  312. package/dist/memory/context-pruner.d.ts.map +1 -0
  313. package/dist/memory/context-pruner.js +85 -0
  314. package/dist/memory/context-pruner.js.map +1 -0
  315. package/dist/memory/correction-propagator.d.ts +44 -0
  316. package/dist/memory/correction-propagator.d.ts.map +1 -0
  317. package/dist/memory/correction-propagator.js +156 -0
  318. package/dist/memory/correction-propagator.js.map +1 -0
  319. package/dist/memory/daily-log.d.ts +67 -0
  320. package/dist/memory/daily-log.d.ts.map +1 -0
  321. package/dist/memory/daily-log.js +143 -0
  322. package/dist/memory/daily-log.js.map +1 -0
  323. package/dist/memory/dynamic-retrieval.d.ts +112 -0
  324. package/dist/memory/dynamic-retrieval.d.ts.map +1 -0
  325. package/dist/memory/dynamic-retrieval.js +908 -0
  326. package/dist/memory/dynamic-retrieval.js.map +1 -0
  327. package/dist/memory/embeddings.d.ts +172 -0
  328. package/dist/memory/embeddings.d.ts.map +1 -0
  329. package/dist/memory/embeddings.js +780 -0
  330. package/dist/memory/embeddings.js.map +1 -0
  331. package/dist/memory/generic-uap-patterns.d.ts +7 -0
  332. package/dist/memory/generic-uap-patterns.d.ts.map +1 -0
  333. package/dist/memory/generic-uap-patterns.js +43 -0
  334. package/dist/memory/generic-uap-patterns.js.map +1 -0
  335. package/dist/memory/hierarchical-memory.d.ts +141 -0
  336. package/dist/memory/hierarchical-memory.d.ts.map +1 -0
  337. package/dist/memory/hierarchical-memory.js +485 -0
  338. package/dist/memory/hierarchical-memory.js.map +1 -0
  339. package/dist/memory/knowledge-graph.d.ts +98 -0
  340. package/dist/memory/knowledge-graph.d.ts.map +1 -0
  341. package/dist/memory/knowledge-graph.js +275 -0
  342. package/dist/memory/knowledge-graph.js.map +1 -0
  343. package/dist/memory/memory-consolidator.d.ts +124 -0
  344. package/dist/memory/memory-consolidator.d.ts.map +1 -0
  345. package/dist/memory/memory-consolidator.js +514 -0
  346. package/dist/memory/memory-consolidator.js.map +1 -0
  347. package/dist/memory/memory-maintenance.d.ts +39 -0
  348. package/dist/memory/memory-maintenance.d.ts.map +1 -0
  349. package/dist/memory/memory-maintenance.js +336 -0
  350. package/dist/memory/memory-maintenance.js.map +1 -0
  351. package/dist/memory/model-router.d.ts +105 -0
  352. package/dist/memory/model-router.d.ts.map +1 -0
  353. package/dist/memory/model-router.js +474 -0
  354. package/dist/memory/model-router.js.map +1 -0
  355. package/dist/memory/multi-view-memory.d.ts +134 -0
  356. package/dist/memory/multi-view-memory.d.ts.map +1 -0
  357. package/dist/memory/multi-view-memory.js +430 -0
  358. package/dist/memory/multi-view-memory.js.map +1 -0
  359. package/dist/memory/predictive-memory.d.ts +79 -0
  360. package/dist/memory/predictive-memory.d.ts.map +1 -0
  361. package/dist/memory/predictive-memory.js +294 -0
  362. package/dist/memory/predictive-memory.js.map +1 -0
  363. package/dist/memory/prepopulate.d.ts +76 -0
  364. package/dist/memory/prepopulate.d.ts.map +1 -0
  365. package/dist/memory/prepopulate.js +832 -0
  366. package/dist/memory/prepopulate.js.map +1 -0
  367. package/dist/memory/semantic-compression.d.ts +77 -0
  368. package/dist/memory/semantic-compression.d.ts.map +1 -0
  369. package/dist/memory/semantic-compression.js +359 -0
  370. package/dist/memory/semantic-compression.js.map +1 -0
  371. package/dist/memory/serverless-qdrant.d.ts +102 -0
  372. package/dist/memory/serverless-qdrant.d.ts.map +1 -0
  373. package/dist/memory/serverless-qdrant.js +369 -0
  374. package/dist/memory/serverless-qdrant.js.map +1 -0
  375. package/dist/memory/short-term/factory.d.ts +26 -0
  376. package/dist/memory/short-term/factory.d.ts.map +1 -0
  377. package/dist/memory/short-term/factory.js +28 -0
  378. package/dist/memory/short-term/factory.js.map +1 -0
  379. package/dist/memory/short-term/indexeddb.d.ts +25 -0
  380. package/dist/memory/short-term/indexeddb.d.ts.map +1 -0
  381. package/dist/memory/short-term/indexeddb.js +64 -0
  382. package/dist/memory/short-term/indexeddb.js.map +1 -0
  383. package/dist/memory/short-term/schema.d.ts +6 -0
  384. package/dist/memory/short-term/schema.d.ts.map +1 -0
  385. package/dist/memory/short-term/schema.js +141 -0
  386. package/dist/memory/short-term/schema.js.map +1 -0
  387. package/dist/memory/short-term/sqlite.d.ts +64 -0
  388. package/dist/memory/short-term/sqlite.d.ts.map +1 -0
  389. package/dist/memory/short-term/sqlite.js +274 -0
  390. package/dist/memory/short-term/sqlite.js.map +1 -0
  391. package/dist/memory/speculative-cache.d.ts +111 -0
  392. package/dist/memory/speculative-cache.d.ts.map +1 -0
  393. package/dist/memory/speculative-cache.js +457 -0
  394. package/dist/memory/speculative-cache.js.map +1 -0
  395. package/dist/memory/task-classifier.d.ts +40 -0
  396. package/dist/memory/task-classifier.d.ts.map +1 -0
  397. package/dist/memory/task-classifier.js +342 -0
  398. package/dist/memory/task-classifier.js.map +1 -0
  399. package/dist/memory/terminal-bench-knowledge.d.ts +48 -0
  400. package/dist/memory/terminal-bench-knowledge.d.ts.map +1 -0
  401. package/dist/memory/terminal-bench-knowledge.js +622 -0
  402. package/dist/memory/terminal-bench-knowledge.js.map +1 -0
  403. package/dist/memory/write-gate.d.ts +39 -0
  404. package/dist/memory/write-gate.d.ts.map +1 -0
  405. package/dist/memory/write-gate.js +190 -0
  406. package/dist/memory/write-gate.js.map +1 -0
  407. package/dist/models/api-client.d.ts +46 -0
  408. package/dist/models/api-client.d.ts.map +1 -0
  409. package/dist/models/api-client.js +182 -0
  410. package/dist/models/api-client.js.map +1 -0
  411. package/dist/models/execution-profiles.d.ts +64 -0
  412. package/dist/models/execution-profiles.d.ts.map +1 -0
  413. package/dist/models/execution-profiles.js +403 -0
  414. package/dist/models/execution-profiles.js.map +1 -0
  415. package/dist/models/executor.d.ts +130 -0
  416. package/dist/models/executor.d.ts.map +1 -0
  417. package/dist/models/executor.js +382 -0
  418. package/dist/models/executor.js.map +1 -0
  419. package/dist/models/index.d.ts +19 -0
  420. package/dist/models/index.d.ts.map +1 -0
  421. package/dist/models/index.js +23 -0
  422. package/dist/models/index.js.map +1 -0
  423. package/dist/models/plan-validator.d.ts +37 -0
  424. package/dist/models/plan-validator.d.ts.map +1 -0
  425. package/dist/models/plan-validator.js +179 -0
  426. package/dist/models/plan-validator.js.map +1 -0
  427. package/dist/models/planner.d.ts +73 -0
  428. package/dist/models/planner.d.ts.map +1 -0
  429. package/dist/models/planner.js +375 -0
  430. package/dist/models/planner.js.map +1 -0
  431. package/dist/models/router.d.ts +96 -0
  432. package/dist/models/router.d.ts.map +1 -0
  433. package/dist/models/router.js +523 -0
  434. package/dist/models/router.js.map +1 -0
  435. package/dist/models/types.d.ts +370 -0
  436. package/dist/models/types.d.ts.map +1 -0
  437. package/dist/models/types.js +232 -0
  438. package/dist/models/types.js.map +1 -0
  439. package/dist/models/unified-router.d.ts +152 -0
  440. package/dist/models/unified-router.d.ts.map +1 -0
  441. package/dist/models/unified-router.js +313 -0
  442. package/dist/models/unified-router.js.map +1 -0
  443. package/dist/policies/convert-policy-to-claude.d.ts +3 -0
  444. package/dist/policies/convert-policy-to-claude.d.ts.map +1 -0
  445. package/dist/policies/convert-policy-to-claude.js +87 -0
  446. package/dist/policies/convert-policy-to-claude.js.map +1 -0
  447. package/dist/policies/database-manager.d.ts +27 -0
  448. package/dist/policies/database-manager.d.ts.map +1 -0
  449. package/dist/policies/database-manager.js +198 -0
  450. package/dist/policies/database-manager.js.map +1 -0
  451. package/dist/policies/enforced-tool-router.d.ts +53 -0
  452. package/dist/policies/enforced-tool-router.d.ts.map +1 -0
  453. package/dist/policies/enforced-tool-router.js +80 -0
  454. package/dist/policies/enforced-tool-router.js.map +1 -0
  455. package/dist/policies/index.d.ts +10 -0
  456. package/dist/policies/index.d.ts.map +1 -0
  457. package/dist/policies/index.js +8 -0
  458. package/dist/policies/index.js.map +1 -0
  459. package/dist/policies/policy-gate.d.ts +59 -0
  460. package/dist/policies/policy-gate.d.ts.map +1 -0
  461. package/dist/policies/policy-gate.js +171 -0
  462. package/dist/policies/policy-gate.js.map +1 -0
  463. package/dist/policies/policy-memory.d.ts +18 -0
  464. package/dist/policies/policy-memory.d.ts.map +1 -0
  465. package/dist/policies/policy-memory.js +126 -0
  466. package/dist/policies/policy-memory.js.map +1 -0
  467. package/dist/policies/policy-tools.d.ts +11 -0
  468. package/dist/policies/policy-tools.d.ts.map +1 -0
  469. package/dist/policies/policy-tools.js +66 -0
  470. package/dist/policies/policy-tools.js.map +1 -0
  471. package/dist/policies/schemas/policy.d.ts +69 -0
  472. package/dist/policies/schemas/policy.d.ts.map +1 -0
  473. package/dist/policies/schemas/policy.js +31 -0
  474. package/dist/policies/schemas/policy.js.map +1 -0
  475. package/dist/tasks/coordination.d.ts +83 -0
  476. package/dist/tasks/coordination.d.ts.map +1 -0
  477. package/dist/tasks/coordination.js +291 -0
  478. package/dist/tasks/coordination.js.map +1 -0
  479. package/dist/tasks/database.d.ts +19 -0
  480. package/dist/tasks/database.d.ts.map +1 -0
  481. package/dist/tasks/database.js +149 -0
  482. package/dist/tasks/database.js.map +1 -0
  483. package/dist/tasks/decoder-gate.d.ts +64 -0
  484. package/dist/tasks/decoder-gate.d.ts.map +1 -0
  485. package/dist/tasks/decoder-gate.js +268 -0
  486. package/dist/tasks/decoder-gate.js.map +1 -0
  487. package/dist/tasks/index.d.ts +6 -0
  488. package/dist/tasks/index.d.ts.map +1 -0
  489. package/dist/tasks/index.js +6 -0
  490. package/dist/tasks/index.js.map +1 -0
  491. package/dist/tasks/service.d.ts +40 -0
  492. package/dist/tasks/service.d.ts.map +1 -0
  493. package/dist/tasks/service.js +671 -0
  494. package/dist/tasks/service.js.map +1 -0
  495. package/dist/tasks/types.d.ts +238 -0
  496. package/dist/tasks/types.d.ts.map +1 -0
  497. package/dist/tasks/types.js +74 -0
  498. package/dist/tasks/types.js.map +1 -0
  499. package/dist/telemetry/index.d.ts +2 -0
  500. package/dist/telemetry/index.d.ts.map +1 -0
  501. package/dist/telemetry/index.js +2 -0
  502. package/dist/telemetry/index.js.map +1 -0
  503. package/dist/telemetry/session-telemetry.d.ts +56 -0
  504. package/dist/telemetry/session-telemetry.d.ts.map +1 -0
  505. package/dist/telemetry/session-telemetry.js +807 -0
  506. package/dist/telemetry/session-telemetry.js.map +1 -0
  507. package/dist/types/analysis.d.ts +82 -0
  508. package/dist/types/analysis.d.ts.map +1 -0
  509. package/dist/types/analysis.js +2 -0
  510. package/dist/types/analysis.js.map +1 -0
  511. package/dist/types/config.d.ts +3324 -0
  512. package/dist/types/config.d.ts.map +1 -0
  513. package/dist/types/config.js +418 -0
  514. package/dist/types/config.js.map +1 -0
  515. package/dist/types/coordination.d.ts +240 -0
  516. package/dist/types/coordination.d.ts.map +1 -0
  517. package/dist/types/coordination.js +43 -0
  518. package/dist/types/coordination.js.map +1 -0
  519. package/dist/types/index.d.ts +4 -0
  520. package/dist/types/index.d.ts.map +1 -0
  521. package/dist/types/index.js +4 -0
  522. package/dist/types/index.js.map +1 -0
  523. package/dist/uap-droids-strict.d.ts +59 -0
  524. package/dist/uap-droids-strict.d.ts.map +1 -0
  525. package/dist/uap-droids-strict.js +200 -0
  526. package/dist/uap-droids-strict.js.map +1 -0
  527. package/dist/utils/config-manager.d.ts +30 -0
  528. package/dist/utils/config-manager.d.ts.map +1 -0
  529. package/dist/utils/config-manager.js +41 -0
  530. package/dist/utils/config-manager.js.map +1 -0
  531. package/dist/utils/fetch-with-retry.d.ts +5 -0
  532. package/dist/utils/fetch-with-retry.d.ts.map +1 -0
  533. package/dist/utils/fetch-with-retry.js +61 -0
  534. package/dist/utils/fetch-with-retry.js.map +1 -0
  535. package/dist/utils/merge-claude-md.d.ts +28 -0
  536. package/dist/utils/merge-claude-md.d.ts.map +1 -0
  537. package/dist/utils/merge-claude-md.js +342 -0
  538. package/dist/utils/merge-claude-md.js.map +1 -0
  539. package/dist/utils/rate-limiter.d.ts +58 -0
  540. package/dist/utils/rate-limiter.d.ts.map +1 -0
  541. package/dist/utils/rate-limiter.js +100 -0
  542. package/dist/utils/rate-limiter.js.map +1 -0
  543. package/dist/utils/string-similarity.d.ts +37 -0
  544. package/dist/utils/string-similarity.d.ts.map +1 -0
  545. package/dist/utils/string-similarity.js +114 -0
  546. package/dist/utils/string-similarity.js.map +1 -0
  547. package/dist/utils/validate-json.d.ts +51 -0
  548. package/dist/utils/validate-json.d.ts.map +1 -0
  549. package/dist/utils/validate-json.js +94 -0
  550. package/dist/utils/validate-json.js.map +1 -0
  551. package/docs/INDEX.md +66 -0
  552. package/docs/architecture/MULTI_MODEL.md +224 -0
  553. package/docs/architecture/SYSTEM_ANALYSIS.md +1117 -0
  554. package/docs/architecture/UAP_COMPLIANCE.md +217 -0
  555. package/docs/architecture/UAP_PROTOCOL.md +339 -0
  556. package/docs/architecture/UAP_STRICT_DROIDS.md +172 -0
  557. package/docs/archive/BALLS_MODE_SELF_ANALYSIS.md +260 -0
  558. package/docs/archive/FAILING_TASKS_SOLUTION_PLAN.md +668 -0
  559. package/docs/archive/JINJA2-SYSTEM-MESSAGE-FIX.md +209 -0
  560. package/docs/archive/NPM-PUBLISH-V0.9.1.md +240 -0
  561. package/docs/archive/OPTIMIZATION_OPTIONS.md +334 -0
  562. package/docs/archive/SETUP_IMPROVEMENTS.md +213 -0
  563. package/docs/archive/UAP_GENERIC_OPTIMIZATION_PLAN.md +270 -0
  564. package/docs/archive/UAP_V103_PATTERN_DESIGN.md +315 -0
  565. package/docs/archive/UAP_V104_COMPLIANCE_DESIGN.md +223 -0
  566. package/docs/archive/changelog/2026-03-10_uap-100-compliance.md +77 -0
  567. package/docs/archive/changelog/2026-03-10_uap-full-system-verification.md +109 -0
  568. package/docs/benchmarks/ACCURACY_ANALYSIS.md +471 -0
  569. package/docs/benchmarks/TOKEN_OPTIMIZATION.md +572 -0
  570. package/docs/benchmarks/VALIDATION_PLAN.md +568 -0
  571. package/docs/benchmarks/VALIDATION_RESULTS.md +161 -0
  572. package/docs/deployment/DEPLOYMENT.md +895 -0
  573. package/docs/deployment/DEPLOYMENT_STRATEGIES.md +518 -0
  574. package/docs/deployment/DEPLOY_BATCHER_ANALYSIS.md +856 -0
  575. package/docs/deployment/DEPLOY_BATCHING.md +273 -0
  576. package/docs/deployment/DEPLOY_BUCKETING_ANALYSIS.md +420 -0
  577. package/docs/deployment/QWEN35_LLAMA_CPP.md +265 -0
  578. package/docs/getting-started/INTEGRATION.md +449 -0
  579. package/docs/getting-started/OVERVIEW.md +344 -0
  580. package/docs/getting-started/SETUP.md +203 -0
  581. package/docs/integrations/MCP_ROUTER_SETUP.md +445 -0
  582. package/docs/integrations/RTK_INTEGRATION.md +468 -0
  583. package/docs/operations/TROUBLESHOOTING.md +660 -0
  584. package/docs/reference/API_REFERENCE.md +903 -0
  585. package/docs/reference/FEATURES.md +472 -0
  586. package/docs/reference/HARNESS-MATRIX.md +318 -0
  587. package/docs/reference/UAP_CLI_REFERENCE.md +600 -0
  588. package/docs/research/BEHAVIORAL_PATTERNS.md +228 -0
  589. package/docs/research/DOMAIN_STRATEGIES.md +316 -0
  590. package/docs/research/MEMORY_SYSTEMS_COMPARISON.md +812 -0
  591. package/docs/research/PATTERN_ANALYSIS_2026-01-18.md +436 -0
  592. package/docs/research/PERFORMANCE_ANALYSIS_2026-01-18.md +209 -0
  593. package/docs/research/PERFORMANCE_TEST_PLAN.md +383 -0
  594. package/docs/research/TERMINAL_BENCH_LEARNINGS.md +217 -0
  595. package/package.json +113 -0
  596. package/scripts/README.md +161 -0
  597. package/templates/CLAUDE.template.md +10 -0
  598. package/templates/CLAUDE_ARCHITECTURE.template.md +103 -0
  599. package/templates/CLAUDE_CODING.template.md +127 -0
  600. package/templates/CLAUDE_DROIDS.template.md +109 -0
  601. package/templates/CLAUDE_MEMORY.template.md +131 -0
  602. package/templates/CLAUDE_WORKFLOWS.template.md +139 -0
  603. package/templates/PROJECT.template.md +209 -0
  604. package/templates/SCHEMA.md +57 -0
  605. package/templates/archive/CLAUDE.template.root-v6.md +534 -0
  606. package/templates/archive/CLAUDE.template.v6.md +534 -0
  607. package/templates/hooks/forgecode/pre-compact.sh +68 -0
  608. package/templates/hooks/forgecode/session-start.sh +169 -0
  609. package/templates/hooks/forgecode.plugin.sh +128 -0
  610. package/templates/hooks/pre-compact.sh +74 -0
  611. package/templates/hooks/session-start.sh +366 -0
  612. package/tools/agents/README.md +224 -0
  613. package/tools/agents/UAP/README.md +386 -0
  614. package/tools/agents/UAP/__init__.py +9 -0
  615. package/tools/agents/UAP/cli.py +901 -0
  616. package/tools/agents/UAP/compliance_verify.sh +108 -0
  617. package/tools/agents/UAP/full_verification.sh +126 -0
  618. package/tools/agents/UAP/version.py +32 -0
  619. package/tools/agents/benchmarks/benchmark_memory_systems.py +730 -0
  620. package/tools/agents/benchmarks/results/benchmark_20260106_064817.json +170 -0
  621. package/tools/agents/benchmarks/results/benchmark_20260106_064817.md +51 -0
  622. package/tools/agents/config/chat_template.jinja +77 -0
  623. package/tools/agents/config/tool-call-schema.json +19 -0
  624. package/tools/agents/config/tool-call.gbnf +58 -0
  625. package/tools/agents/docker/Dockerfile.python +52 -0
  626. package/tools/agents/docker/Dockerfile.ubuntu +55 -0
  627. package/tools/agents/docker-compose.qdrant.yml +24 -0
  628. package/tools/agents/install-opencode-local.sh.j2 +135 -0
  629. package/tools/agents/migrations/apply.py +256 -0
  630. package/tools/agents/opencode_uap_agent.py +1505 -0
  631. package/tools/agents/plugin/README.md +91 -0
  632. package/tools/agents/plugin/index.ts +46 -0
  633. package/tools/agents/plugin/pre-compact.sh +68 -0
  634. package/tools/agents/plugin/session-start.sh +175 -0
  635. package/tools/agents/plugin/uap-commands.ts +45 -0
  636. package/tools/agents/plugin/uap-droids.ts +54 -0
  637. package/tools/agents/plugin/uap-patterns.ts +54 -0
  638. package/tools/agents/plugin/uap-skills.ts +52 -0
  639. package/tools/agents/plugins/uap-enforce.ts +314 -0
  640. package/tools/agents/scripts/__pycache__/tool_call_wrapper.cpython-313.pyc +0 -0
  641. package/tools/agents/scripts/chat_template_verifier.py +343 -0
  642. package/tools/agents/scripts/fix-qwen-template.js +38 -0
  643. package/tools/agents/scripts/fix_qwen_chat_template.py +316 -0
  644. package/tools/agents/scripts/generate_lora_training_data.py +412 -0
  645. package/tools/agents/scripts/init_qdrant.py +151 -0
  646. package/tools/agents/scripts/memory_migration.py +560 -0
  647. package/tools/agents/scripts/migrate_memory_to_qdrant.py +110 -0
  648. package/tools/agents/scripts/prepare_lora.sh +512 -0
  649. package/tools/agents/scripts/query_memory.py +200 -0
  650. package/tools/agents/scripts/qwen-tool-call-test.js +38 -0
  651. package/tools/agents/scripts/qwen-tool-call-wrapper.js +38 -0
  652. package/tools/agents/scripts/qwen_tool_call_test.py +464 -0
  653. package/tools/agents/scripts/qwen_tool_call_wrapper.py +686 -0
  654. package/tools/agents/scripts/start-services.sh +96 -0
  655. package/tools/agents/scripts/tool-choice-proxy.cjs +296 -0
  656. package/tools/agents/scripts/tool_call_test.py +656 -0
  657. package/tools/agents/scripts/tool_call_wrapper.py +799 -0
  658. package/tools/agents/tests/test_uap_compliance.py +257 -0
  659. package/tools/agents/uap_agent.py +122 -0
  660. package/tools/agents/uap_agent_install.sh +12 -0
@@ -0,0 +1,730 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Memory Systems Benchmark Suite
4
+
5
+ Benchmarks the current UAP memory implementation and compares against
6
+ theoretical performance of alternative systems (Mem0, A-MEM, MemGPT patterns).
7
+
8
+ Usage:
9
+ tools/agents/.venv/bin/python tools/agents/benchmarks/benchmark_memory_systems.py
10
+
11
+ Outputs results to: tools/agents/benchmarks/results/
12
+ """
13
+
14
+ import json
15
+ import os
16
+ import random
17
+ import sqlite3
18
+ import statistics
19
+ import string
20
+ import time
21
+ import uuid
22
+ from dataclasses import dataclass
23
+ from datetime import datetime, timedelta
24
+ from pathlib import Path
25
+ from typing import Optional
26
+
27
+ try:
28
+ from sentence_transformers import SentenceTransformer
29
+ from qdrant_client import QdrantClient
30
+ from qdrant_client.models import PointStruct, Distance, VectorParams
31
+
32
+ QDRANT_AVAILABLE = True
33
+ except ImportError:
34
+ QDRANT_AVAILABLE = False
35
+ print(
36
+ "Warning: Qdrant/sentence-transformers not available. Some benchmarks skipped."
37
+ )
38
+
39
+
40
+ @dataclass
41
+ class BenchmarkResult:
42
+ name: str
43
+ operation: str
44
+ samples: int
45
+ mean_ms: float
46
+ median_ms: float
47
+ p95_ms: float
48
+ p99_ms: float
49
+ min_ms: float
50
+ max_ms: float
51
+ ops_per_sec: float
52
+
53
+
54
+ class MemoryBenchmark:
55
+ def __init__(self, results_dir: Optional[Path] = None):
56
+ self.project_root = Path(__file__).parent.parent.parent.parent
57
+ self.results_dir = (
58
+ results_dir or self.project_root / "tools/agents/benchmarks/results"
59
+ )
60
+ self.results_dir.mkdir(parents=True, exist_ok=True)
61
+
62
+ # Test database paths (use separate test databases)
63
+ self.test_db = self.results_dir / "test_short_term.db"
64
+ self.test_collection = "benchmark_memory"
65
+
66
+ # Initialize embedding model if available
67
+ self.model = None
68
+ self.qdrant = None
69
+ if QDRANT_AVAILABLE:
70
+ try:
71
+ self.model = SentenceTransformer("all-MiniLM-L6-v2", device="cpu")
72
+ self.qdrant = QdrantClient(host="localhost", port=6333)
73
+ except Exception as e:
74
+ print(f"Warning: Could not initialize Qdrant: {e}")
75
+
76
+ self.results: list[BenchmarkResult] = []
77
+
78
+ def setup_test_sqlite(self):
79
+ """Create test SQLite database with same schema as production."""
80
+ if self.test_db.exists():
81
+ os.remove(self.test_db)
82
+
83
+ conn = sqlite3.connect(self.test_db)
84
+ cursor = conn.cursor()
85
+
86
+ cursor.execute("""
87
+ CREATE TABLE memories (
88
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
89
+ timestamp TEXT NOT NULL,
90
+ type TEXT NOT NULL CHECK(type IN ('action', 'observation', 'thought', 'goal')),
91
+ content TEXT NOT NULL
92
+ )
93
+ """)
94
+ cursor.execute(
95
+ "CREATE INDEX idx_memories_timestamp ON memories(timestamp DESC)"
96
+ )
97
+ cursor.execute("CREATE INDEX idx_memories_type ON memories(type)")
98
+
99
+ # Session memory table (proposed enhancement)
100
+ cursor.execute("""
101
+ CREATE TABLE session_memories (
102
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
103
+ session_id TEXT NOT NULL,
104
+ timestamp TEXT NOT NULL,
105
+ type TEXT NOT NULL CHECK(type IN ('summary', 'decision', 'entity', 'error')),
106
+ content TEXT NOT NULL,
107
+ context TEXT,
108
+ importance INTEGER DEFAULT 5
109
+ )
110
+ """)
111
+ cursor.execute(
112
+ "CREATE INDEX idx_session_memories_session ON session_memories(session_id)"
113
+ )
114
+
115
+ # Knowledge graph tables (proposed enhancement)
116
+ cursor.execute("""
117
+ CREATE TABLE entities (
118
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
119
+ type TEXT NOT NULL,
120
+ name TEXT NOT NULL,
121
+ context TEXT,
122
+ first_seen TEXT NOT NULL,
123
+ last_seen TEXT NOT NULL,
124
+ mention_count INTEGER DEFAULT 1,
125
+ UNIQUE(type, name)
126
+ )
127
+ """)
128
+ cursor.execute("""
129
+ CREATE TABLE relationships (
130
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
131
+ source_id INTEGER NOT NULL,
132
+ target_id INTEGER NOT NULL,
133
+ relation TEXT NOT NULL,
134
+ weight REAL DEFAULT 1.0,
135
+ timestamp TEXT NOT NULL,
136
+ FOREIGN KEY (source_id) REFERENCES entities(id),
137
+ FOREIGN KEY (target_id) REFERENCES entities(id)
138
+ )
139
+ """)
140
+ cursor.execute("CREATE INDEX idx_rel_source ON relationships(source_id)")
141
+ cursor.execute("CREATE INDEX idx_rel_target ON relationships(target_id)")
142
+
143
+ conn.commit()
144
+ conn.close()
145
+
146
+ def setup_test_qdrant(self):
147
+ """Create test Qdrant collection."""
148
+ if not self.qdrant:
149
+ return False
150
+
151
+ try:
152
+ # Delete if exists
153
+ try:
154
+ self.qdrant.delete_collection(self.test_collection)
155
+ except Exception:
156
+ pass
157
+
158
+ # Create fresh collection
159
+ self.qdrant.create_collection(
160
+ collection_name=self.test_collection,
161
+ vectors_config=VectorParams(size=384, distance=Distance.COSINE),
162
+ )
163
+ return True
164
+ except Exception as e:
165
+ print(f"Warning: Could not setup Qdrant test collection: {e}")
166
+ return False
167
+
168
+ def generate_test_content(self, size: int = 100) -> str:
169
+ """Generate realistic test content."""
170
+ templates = [
171
+ "Fixed bug in {file} where {issue} caused {effect}",
172
+ "Updated {component} to use {pattern} for better {benefit}",
173
+ "Deployed {service} to {environment} with {config} settings",
174
+ "Discovered that {feature} requires {requirement} to work correctly",
175
+ "Resolved {error} by {solution} in {location}",
176
+ "Created {artifact} with {specifications} for {purpose}",
177
+ ]
178
+
179
+ files = ["api.py", "main.cpp", "config.yaml", "auth.js", "database.sql"]
180
+ components = [
181
+ "cache layer",
182
+ "auth module",
183
+ "API gateway",
184
+ "frontend",
185
+ "database",
186
+ ]
187
+ patterns = ["singleton", "factory", "observer", "decorator", "strategy"]
188
+
189
+ template = random.choice(templates)
190
+ content = template.format(
191
+ file=random.choice(files),
192
+ component=random.choice(components),
193
+ pattern=random.choice(patterns),
194
+ issue="null pointer exception",
195
+ effect="crashes",
196
+ benefit="performance",
197
+ service="products-api",
198
+ environment="production",
199
+ config="optimized",
200
+ feature="OAuth",
201
+ requirement="HTTPS",
202
+ error="timeout",
203
+ solution="increasing buffer",
204
+ location="main handler",
205
+ artifact="deployment script",
206
+ specifications="HA config",
207
+ purpose="disaster recovery",
208
+ )
209
+
210
+ # Pad to desired size
211
+ while len(content) < size:
212
+ content += " " + "".join(random.choices(string.ascii_lowercase, k=10))
213
+
214
+ return content[:size]
215
+
216
+ def benchmark_operation(
217
+ self, name: str, operation: str, func, iterations: int = 100
218
+ ) -> BenchmarkResult:
219
+ """Run a benchmark and collect statistics."""
220
+ times = []
221
+
222
+ for _ in range(iterations):
223
+ start = time.perf_counter()
224
+ func()
225
+ elapsed = (time.perf_counter() - start) * 1000 # Convert to ms
226
+ times.append(elapsed)
227
+
228
+ times.sort()
229
+ result = BenchmarkResult(
230
+ name=name,
231
+ operation=operation,
232
+ samples=iterations,
233
+ mean_ms=statistics.mean(times),
234
+ median_ms=statistics.median(times),
235
+ p95_ms=times[int(len(times) * 0.95)],
236
+ p99_ms=times[int(len(times) * 0.99)],
237
+ min_ms=min(times),
238
+ max_ms=max(times),
239
+ ops_per_sec=1000 / statistics.mean(times)
240
+ if statistics.mean(times) > 0
241
+ else 0,
242
+ )
243
+
244
+ self.results.append(result)
245
+ return result
246
+
247
+ def run_sqlite_benchmarks(self):
248
+ """Benchmark SQLite short-term memory operations."""
249
+ print("\n=== SQLite Short-term Memory Benchmarks ===\n")
250
+ self.setup_test_sqlite()
251
+
252
+ # Benchmark: Single INSERT
253
+ def insert_single():
254
+ conn = sqlite3.connect(self.test_db)
255
+ cursor = conn.cursor()
256
+ cursor.execute(
257
+ "INSERT INTO memories (timestamp, type, content) VALUES (?, ?, ?)",
258
+ (
259
+ datetime.utcnow().isoformat(),
260
+ "action",
261
+ self.generate_test_content(200),
262
+ ),
263
+ )
264
+ conn.commit()
265
+ conn.close()
266
+
267
+ result = self.benchmark_operation(
268
+ "SQLite", "INSERT (single)", insert_single, 100
269
+ )
270
+ print(
271
+ f"INSERT (single): {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
272
+ )
273
+
274
+ # Pre-populate for read tests
275
+ conn = sqlite3.connect(self.test_db)
276
+ cursor = conn.cursor()
277
+ for i in range(1000):
278
+ cursor.execute(
279
+ "INSERT INTO memories (timestamp, type, content) VALUES (?, ?, ?)",
280
+ (
281
+ (datetime.utcnow() - timedelta(hours=i)).isoformat(),
282
+ random.choice(["action", "observation", "thought", "goal"]),
283
+ self.generate_test_content(200),
284
+ ),
285
+ )
286
+ conn.commit()
287
+ conn.close()
288
+
289
+ # Benchmark: SELECT recent (LIMIT 50)
290
+ def select_recent():
291
+ conn = sqlite3.connect(self.test_db)
292
+ cursor = conn.cursor()
293
+ cursor.execute("SELECT * FROM memories ORDER BY id DESC LIMIT 50")
294
+ _ = cursor.fetchall()
295
+ conn.close()
296
+
297
+ result = self.benchmark_operation(
298
+ "SQLite", "SELECT recent (LIMIT 50)", select_recent, 100
299
+ )
300
+ print(
301
+ f"SELECT recent (50): {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
302
+ )
303
+
304
+ # Benchmark: SELECT by type
305
+ def select_by_type():
306
+ conn = sqlite3.connect(self.test_db)
307
+ cursor = conn.cursor()
308
+ cursor.execute(
309
+ "SELECT * FROM memories WHERE type = 'action' ORDER BY id DESC LIMIT 20"
310
+ )
311
+ _ = cursor.fetchall()
312
+ conn.close()
313
+
314
+ result = self.benchmark_operation(
315
+ "SQLite", "SELECT by type", select_by_type, 100
316
+ )
317
+ print(
318
+ f"SELECT by type: {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
319
+ )
320
+
321
+ # Benchmark: Full-text search (LIKE)
322
+ def fulltext_search():
323
+ conn = sqlite3.connect(self.test_db)
324
+ cursor = conn.cursor()
325
+ cursor.execute("SELECT * FROM memories WHERE content LIKE '%api%' LIMIT 10")
326
+ _ = cursor.fetchall()
327
+ conn.close()
328
+
329
+ result = self.benchmark_operation("SQLite", "LIKE search", fulltext_search, 100)
330
+ print(
331
+ f"LIKE search: {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
332
+ )
333
+
334
+ # Benchmark: Knowledge graph query (proposed enhancement)
335
+ # Pre-populate entities
336
+ conn = sqlite3.connect(self.test_db)
337
+ cursor = conn.cursor()
338
+ for i in range(100):
339
+ cursor.execute(
340
+ "INSERT OR IGNORE INTO entities (type, name, first_seen, last_seen) VALUES (?, ?, ?, ?)",
341
+ (
342
+ random.choice(["file", "function", "concept", "error"]),
343
+ f"entity_{i}",
344
+ datetime.utcnow().isoformat(),
345
+ datetime.utcnow().isoformat(),
346
+ ),
347
+ )
348
+ for i in range(200):
349
+ cursor.execute(
350
+ "INSERT INTO relationships (source_id, target_id, relation, timestamp) VALUES (?, ?, ?, ?)",
351
+ (
352
+ random.randint(1, 100),
353
+ random.randint(1, 100),
354
+ random.choice(["depends_on", "fixes", "causes", "related_to"]),
355
+ datetime.utcnow().isoformat(),
356
+ ),
357
+ )
358
+ conn.commit()
359
+ conn.close()
360
+
361
+ def graph_query():
362
+ conn = sqlite3.connect(self.test_db)
363
+ cursor = conn.cursor()
364
+ cursor.execute("""
365
+ SELECT e.*, r.relation, e2.name as related
366
+ FROM entities e
367
+ LEFT JOIN relationships r ON e.id = r.source_id
368
+ LEFT JOIN entities e2 ON r.target_id = e2.id
369
+ WHERE e.type = 'file'
370
+ LIMIT 20
371
+ """)
372
+ _ = cursor.fetchall()
373
+ conn.close()
374
+
375
+ result = self.benchmark_operation(
376
+ "SQLite", "Graph query (1-hop)", graph_query, 100
377
+ )
378
+ print(
379
+ f"Graph query (1-hop): {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
380
+ )
381
+
382
+ def run_qdrant_benchmarks(self):
383
+ """Benchmark Qdrant long-term memory operations."""
384
+ if not self.qdrant or not self.model:
385
+ print("\n=== Qdrant Benchmarks SKIPPED (not available) ===")
386
+ return
387
+
388
+ print("\n=== Qdrant Long-term Memory Benchmarks ===\n")
389
+
390
+ if not self.setup_test_qdrant():
391
+ print("Could not setup Qdrant test collection, skipping")
392
+ return
393
+
394
+ # Pre-generate embeddings for batch insert
395
+ test_contents = [self.generate_test_content(200) for _ in range(100)]
396
+
397
+ # Benchmark: Single INSERT with embedding
398
+ idx = [0]
399
+
400
+ def insert_single():
401
+ content = test_contents[idx[0] % len(test_contents)]
402
+ embedding = self.model.encode(content).tolist()
403
+ point = PointStruct(
404
+ id=str(uuid.uuid4()),
405
+ vector=embedding,
406
+ payload={
407
+ "type": "lesson",
408
+ "content": content,
409
+ "importance": random.randint(1, 10),
410
+ "timestamp": datetime.utcnow().isoformat(),
411
+ },
412
+ )
413
+ self.qdrant.upsert(collection_name=self.test_collection, points=[point])
414
+ idx[0] += 1
415
+
416
+ result = self.benchmark_operation(
417
+ "Qdrant", "INSERT (single + embed)", insert_single, 50
418
+ )
419
+ print(
420
+ f"INSERT (single + embed): {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
421
+ )
422
+
423
+ # Pre-populate for search tests
424
+ points = []
425
+ for i in range(500):
426
+ content = self.generate_test_content(200)
427
+ embedding = self.model.encode(content).tolist()
428
+ points.append(
429
+ PointStruct(
430
+ id=str(uuid.uuid4()),
431
+ vector=embedding,
432
+ payload={
433
+ "type": random.choice(["fact", "skill", "lesson", "discovery"]),
434
+ "content": content,
435
+ "tags": random.sample(
436
+ ["api", "database", "auth", "cache", "deploy"], 2
437
+ ),
438
+ "importance": random.randint(1, 10),
439
+ "timestamp": datetime.utcnow().isoformat(),
440
+ },
441
+ )
442
+ )
443
+
444
+ # Batch insert
445
+ self.qdrant.upsert(collection_name=self.test_collection, points=points)
446
+
447
+ # Benchmark: Semantic search (just query, no embedding)
448
+ query_embeddings = [
449
+ self.model.encode(self.generate_test_content(50)).tolist()
450
+ for _ in range(20)
451
+ ]
452
+ qidx = [0]
453
+
454
+ def semantic_search():
455
+ query_vec = query_embeddings[qidx[0] % len(query_embeddings)]
456
+ results = self.qdrant.query_points(
457
+ collection_name=self.test_collection, query=query_vec, limit=5
458
+ )
459
+ _ = results.points
460
+ qidx[0] += 1
461
+
462
+ result = self.benchmark_operation(
463
+ "Qdrant", "Semantic search (top-5)", semantic_search, 100
464
+ )
465
+ print(
466
+ f"Semantic search (top-5): {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
467
+ )
468
+
469
+ # Benchmark: Search with filter
470
+ def filtered_search():
471
+ query_vec = query_embeddings[qidx[0] % len(query_embeddings)]
472
+ from qdrant_client.models import Filter, FieldCondition, MatchValue
473
+
474
+ results = self.qdrant.query_points(
475
+ collection_name=self.test_collection,
476
+ query=query_vec,
477
+ query_filter=Filter(
478
+ must=[FieldCondition(key="importance", match=MatchValue(value=8))]
479
+ ),
480
+ limit=5,
481
+ )
482
+ _ = results.points
483
+ qidx[0] += 1
484
+
485
+ result = self.benchmark_operation(
486
+ "Qdrant", "Filtered search", filtered_search, 100
487
+ )
488
+ print(
489
+ f"Filtered search: {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
490
+ )
491
+
492
+ # Benchmark: Embedding generation (major latency component)
493
+ def generate_embedding():
494
+ content = self.generate_test_content(200)
495
+ _ = self.model.encode(content)
496
+
497
+ result = self.benchmark_operation(
498
+ "Embedding", "Generate (all-MiniLM-L6-v2)", generate_embedding, 100
499
+ )
500
+ print(
501
+ f"Embedding generation: {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
502
+ )
503
+
504
+ def run_consolidation_benchmark(self):
505
+ """Benchmark memory consolidation operations (proposed enhancement)."""
506
+ print("\n=== Memory Consolidation Benchmarks ===\n")
507
+
508
+ import hashlib
509
+
510
+ # Simulate consolidation logic
511
+ test_memories = [
512
+ {"type": "action", "content": self.generate_test_content(200)}
513
+ for _ in range(50)
514
+ ]
515
+
516
+ def consolidate_simple():
517
+ """Simple consolidation: extract key facts."""
518
+ facts = []
519
+ for mem in test_memories:
520
+ if any(
521
+ kw in mem["content"].lower()
522
+ for kw in ["fixed", "resolved", "created"]
523
+ ):
524
+ facts.append(
525
+ {
526
+ "type": "lesson",
527
+ "content": mem["content"][:100],
528
+ "hash": hashlib.md5(mem["content"].encode()).hexdigest()[
529
+ :16
530
+ ],
531
+ }
532
+ )
533
+ # Deduplicate by hash
534
+ seen = set()
535
+ unique = []
536
+ for f in facts:
537
+ if f["hash"] not in seen:
538
+ seen.add(f["hash"])
539
+ unique.append(f)
540
+ return unique
541
+
542
+ result = self.benchmark_operation(
543
+ "Consolidation", "Simple extraction", consolidate_simple, 100
544
+ )
545
+ print(
546
+ f"Simple extraction: {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
547
+ )
548
+
549
+ # Simulate deduplication with embedding similarity
550
+ if self.model:
551
+
552
+ def consolidate_with_similarity():
553
+ """Consolidation with semantic deduplication."""
554
+ facts = []
555
+ for mem in test_memories[:10]: # Limit for speed
556
+ embedding = self.model.encode(mem["content"])
557
+ facts.append({"content": mem["content"], "embedding": embedding})
558
+
559
+ # Check pairwise similarity
560
+ import numpy as np
561
+
562
+ unique = [facts[0]]
563
+ for f in facts[1:]:
564
+ is_dup = False
565
+ for u in unique:
566
+ sim = np.dot(f["embedding"], u["embedding"]) / (
567
+ np.linalg.norm(f["embedding"])
568
+ * np.linalg.norm(u["embedding"])
569
+ )
570
+ if sim > 0.92:
571
+ is_dup = True
572
+ break
573
+ if not is_dup:
574
+ unique.append(f)
575
+ return unique
576
+
577
+ result = self.benchmark_operation(
578
+ "Consolidation", "Semantic dedup", consolidate_with_similarity, 20
579
+ )
580
+ print(
581
+ f"Semantic dedup: {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95, {result.ops_per_sec:.0f} ops/sec"
582
+ )
583
+
584
+ def run_scalability_test(self):
585
+ """Test performance at different scales."""
586
+ print("\n=== Scalability Tests ===\n")
587
+
588
+ scales = [100, 1000, 5000]
589
+
590
+ for scale in scales:
591
+ # Setup fresh database
592
+ self.setup_test_sqlite()
593
+
594
+ # Populate
595
+ conn = sqlite3.connect(self.test_db)
596
+ cursor = conn.cursor()
597
+ for i in range(scale):
598
+ cursor.execute(
599
+ "INSERT INTO memories (timestamp, type, content) VALUES (?, ?, ?)",
600
+ (
601
+ datetime.utcnow().isoformat(),
602
+ "action",
603
+ self.generate_test_content(200),
604
+ ),
605
+ )
606
+ conn.commit()
607
+ conn.close()
608
+
609
+ # Benchmark at this scale
610
+ def select_recent():
611
+ conn = sqlite3.connect(self.test_db)
612
+ cursor = conn.cursor()
613
+ cursor.execute("SELECT * FROM memories ORDER BY id DESC LIMIT 50")
614
+ _ = cursor.fetchall()
615
+ conn.close()
616
+
617
+ result = self.benchmark_operation(
618
+ f"SQLite@{scale}", "SELECT recent", select_recent, 50
619
+ )
620
+ print(
621
+ f"SQLite @ {scale} rows: SELECT recent = {result.mean_ms:.3f}ms mean, {result.p95_ms:.3f}ms p95"
622
+ )
623
+
624
+ def generate_report(self) -> str:
625
+ """Generate markdown report of all benchmarks."""
626
+ report = [
627
+ "# Memory Systems Benchmark Report",
628
+ f"\n**Generated:** {datetime.utcnow().isoformat()}Z",
629
+ f"**System:** UAP Memory Implementation",
630
+ "",
631
+ "## Summary",
632
+ "",
633
+ "| System | Operation | Mean (ms) | P95 (ms) | Ops/sec |",
634
+ "|--------|-----------|-----------|----------|---------|",
635
+ ]
636
+
637
+ for r in self.results:
638
+ report.append(
639
+ f"| {r.name} | {r.operation} | {r.mean_ms:.3f} | {r.p95_ms:.3f} | {r.ops_per_sec:.0f} |"
640
+ )
641
+
642
+ report.extend(
643
+ [
644
+ "",
645
+ "## Key Findings",
646
+ "",
647
+ "### Short-term Memory (SQLite)",
648
+ "- Single INSERT operations are extremely fast (<0.5ms)",
649
+ "- SELECT with ORDER BY and LIMIT scales well",
650
+ "- Knowledge graph queries (1-hop) add minimal overhead",
651
+ "",
652
+ "### Long-term Memory (Qdrant)",
653
+ "- Embedding generation is the main latency contributor",
654
+ "- Semantic search is fast once vectors exist (~50-100ms)",
655
+ "- Filtering adds minimal overhead",
656
+ "",
657
+ "### Consolidation",
658
+ "- Simple extraction is very fast (<1ms)",
659
+ "- Semantic deduplication adds significant latency (~100-500ms)",
660
+ "- Recommendation: Use hash-based dedup, semantic only for high-importance",
661
+ "",
662
+ "## Recommendations",
663
+ "",
664
+ "1. **Keep SQLite for short-term**: Performance is excellent",
665
+ "2. **Batch Qdrant operations**: Reduce per-operation overhead",
666
+ "3. **Cache embeddings**: Avoid regenerating for known content",
667
+ "4. **Use hybrid dedup**: Hash first, semantic for borderline cases",
668
+ "5. **Add session memory layer**: Low overhead, high value",
669
+ ]
670
+ )
671
+
672
+ return "\n".join(report)
673
+
674
+ def save_results(self):
675
+ """Save benchmark results to files."""
676
+ # JSON results
677
+ json_results = [
678
+ {
679
+ "name": r.name,
680
+ "operation": r.operation,
681
+ "samples": r.samples,
682
+ "mean_ms": r.mean_ms,
683
+ "median_ms": r.median_ms,
684
+ "p95_ms": r.p95_ms,
685
+ "p99_ms": r.p99_ms,
686
+ "min_ms": r.min_ms,
687
+ "max_ms": r.max_ms,
688
+ "ops_per_sec": r.ops_per_sec,
689
+ }
690
+ for r in self.results
691
+ ]
692
+
693
+ timestamp = datetime.utcnow().strftime("%Y%m%d_%H%M%S")
694
+
695
+ with open(self.results_dir / f"benchmark_{timestamp}.json", "w") as f:
696
+ json.dump(json_results, f, indent=2)
697
+
698
+ # Markdown report
699
+ report = self.generate_report()
700
+ with open(self.results_dir / f"benchmark_{timestamp}.md", "w") as f:
701
+ f.write(report)
702
+
703
+ print(f"\nResults saved to: {self.results_dir}")
704
+
705
+ def run_all(self):
706
+ """Run all benchmarks."""
707
+ print("=" * 60)
708
+ print(" UAP MEMORY SYSTEMS BENCHMARK SUITE")
709
+ print("=" * 60)
710
+
711
+ self.run_sqlite_benchmarks()
712
+ self.run_qdrant_benchmarks()
713
+ self.run_consolidation_benchmark()
714
+ self.run_scalability_test()
715
+
716
+ print("\n" + "=" * 60)
717
+ print(" BENCHMARK COMPLETE")
718
+ print("=" * 60)
719
+
720
+ self.save_results()
721
+ print("\n" + self.generate_report())
722
+
723
+
724
+ def main():
725
+ benchmark = MemoryBenchmark()
726
+ benchmark.run_all()
727
+
728
+
729
+ if __name__ == "__main__":
730
+ main()