@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,908 @@
1
+ /**
2
+ * Dynamic Memory Retrieval System for UAP
3
+ *
4
+ * Retrieves relevant memories based on task content, not static context.
5
+ * Implements semantic search with fallback to keyword matching.
6
+ *
7
+ * Features:
8
+ * - Adaptive retrieval depth based on query complexity
9
+ * - Context budget management to prevent overflow
10
+ * - Speculative prefetch for common patterns
11
+ */
12
+ import { existsSync, readFileSync } from 'fs';
13
+ import { join } from 'path';
14
+ import Database from 'better-sqlite3';
15
+ import { classifyTask, extractTaskEntities, getSuggestedMemoryQueries, } from './task-classifier.js';
16
+ import { ContextBudget } from './context-compressor.js';
17
+ import { compressToSemanticUnits } from './semantic-compression.js';
18
+ import { decideContextLevel, recordOutcome, } from './adaptive-context.js';
19
+ import { getRelevantKnowledge, recordKnowledgeOutcome } from './terminal-bench-knowledge.js';
20
+ import { ContextPruner } from './context-pruner.js';
21
+ import { PredictiveMemoryService } from './predictive-memory.js';
22
+ import { contentHash, jaccardSimilarity } from '../utils/string-similarity.js';
23
+ import { detectAmbiguity, formatAmbiguityForContext, } from './ambiguity-detector.js';
24
+ const DEFAULT_RETRIEVAL_DEPTHS = {
25
+ simple: { shortTerm: 3, sessionMem: 2, longTerm: 5, patterns: 3 },
26
+ moderate: { shortTerm: 6, sessionMem: 5, longTerm: 8, patterns: 5 },
27
+ complex: { shortTerm: 10, sessionMem: 8, longTerm: 15, patterns: 8 },
28
+ };
29
+ /**
30
+ * Measure query complexity to determine retrieval depth
31
+ * Based on SimpleMem's adaptive query-aware retrieval
32
+ */
33
+ export function measureQueryComplexity(query) {
34
+ let score = 0;
35
+ // Length-based scoring (lower thresholds)
36
+ const wordCount = query.split(/\s+/).length;
37
+ if (wordCount > 30)
38
+ score += 1.5;
39
+ else if (wordCount > 12)
40
+ score += 0.75;
41
+ else if (wordCount > 6)
42
+ score += 0.25;
43
+ // Technical terms increase complexity
44
+ const techPatterns = [
45
+ /debug|fix|error|exception|bug/i,
46
+ /implement|refactor|optimize|build/i,
47
+ /configure|setup|install|deploy/i,
48
+ /security|vulnerability|cve|auth/i,
49
+ /performance|memory|cpu|latency/i,
50
+ /database|query|migration|schema/i,
51
+ /test|coverage|mock|spec/i,
52
+ ];
53
+ for (const pattern of techPatterns) {
54
+ if (pattern.test(query))
55
+ score += 0.4;
56
+ }
57
+ // Multiple entities/files increase complexity
58
+ const fileMatches = query.match(/[\w./\\-]+\.(ts|js|py|json|yaml|sh|sql)/gi);
59
+ if (fileMatches) {
60
+ score += fileMatches.length * 0.3;
61
+ }
62
+ // Multi-step tasks are complex
63
+ if (/and then|after that|followed by|step \d|first.*then|also|additionally/i.test(query)) {
64
+ score += 1;
65
+ }
66
+ // Questions about "why" or "how" are moderate
67
+ if (/^(why|how|what caused|explain)/i.test(query)) {
68
+ score += 0.5;
69
+ }
70
+ // Multiple actions in one query
71
+ const actionWords = query.match(/\b(fix|implement|configure|debug|create|update|delete|add|remove)\b/gi);
72
+ if (actionWords && actionWords.length > 1) {
73
+ score += actionWords.length * 0.3;
74
+ }
75
+ if (score >= 2)
76
+ return 'complex';
77
+ if (score >= 1)
78
+ return 'moderate';
79
+ return 'simple';
80
+ }
81
+ /**
82
+ * Get retrieval limits based on query complexity
83
+ */
84
+ export function getRetrievalDepth(complexity, config = DEFAULT_RETRIEVAL_DEPTHS) {
85
+ return config[complexity];
86
+ }
87
+ /**
88
+ * Main function to retrieve task-specific memory context
89
+ * Now with adaptive retrieval depth and context budget management
90
+ */
91
+ export async function retrieveDynamicMemoryContext(taskInstruction, projectRoot = process.cwd(), options = {}) {
92
+ const { maxTokens = 2000, useSemanticCompression = true, taskMetadata } = options;
93
+ // Step 0: Adaptive context decision - skip UAP if not beneficial
94
+ const contextDecision = decideContextLevel(taskInstruction, taskMetadata);
95
+ if (contextDecision.level === 'none') {
96
+ const classification = classifyTask(taskInstruction);
97
+ return {
98
+ classification,
99
+ relevantMemories: [],
100
+ patterns: [],
101
+ gotchas: [],
102
+ projectContext: '',
103
+ formattedContext: '',
104
+ queryComplexity: 'simple',
105
+ tokenBudget: { used: 0, remaining: maxTokens, total: maxTokens },
106
+ contextDecision,
107
+ };
108
+ }
109
+ // Adjust maxTokens based on context decision
110
+ const effectiveMaxTokens = contextDecision.level === 'minimal' ? Math.min(maxTokens, 800) : maxTokens;
111
+ // Step 1: Classify the task
112
+ const classification = classifyTask(taskInstruction);
113
+ // Step 2: Measure query complexity for adaptive retrieval
114
+ const queryComplexity = measureQueryComplexity(taskInstruction);
115
+ const retrievalDepth = getRetrievalDepth(queryComplexity);
116
+ // Step 3: Initialize context budget
117
+ const budget = new ContextBudget(effectiveMaxTokens);
118
+ // Step 4: Extract entities from task
119
+ const entities = extractTaskEntities(taskInstruction);
120
+ // Step 5: Get suggested memory queries (enhanced with predictive prefetch)
121
+ const suggestedQueries = getSuggestedMemoryQueries(classification);
122
+ // Step 5b: Predictive memory prefetch - predict additional queries based on task history
123
+ try {
124
+ const predictive = new PredictiveMemoryService();
125
+ const predictedQueries = predictive.predictNeededContext(taskInstruction, []);
126
+ // Merge predicted queries with suggested (deduplicated)
127
+ const existingSet = new Set(suggestedQueries);
128
+ for (const pq of predictedQueries) {
129
+ if (!existingSet.has(pq)) {
130
+ suggestedQueries.push(pq);
131
+ existingSet.add(pq);
132
+ }
133
+ }
134
+ }
135
+ catch {
136
+ // PredictiveMemory failure is non-fatal
137
+ }
138
+ // Step 6: Query all memory sources with adaptive limits
139
+ // OPTIMIZATION 8: Pass effectiveMaxTokens to coordinate budgets
140
+ const memories = await queryAllMemorySources(taskInstruction, classification, entities, suggestedQueries, projectRoot, retrievalDepth, effectiveMaxTokens);
141
+ // Step 7: Apply semantic compression if enabled and we have many memories
142
+ let compressionStats;
143
+ let processedMemories = memories;
144
+ if (useSemanticCompression && memories.length > 5) {
145
+ const memoryData = memories.map((m) => ({
146
+ content: m.content,
147
+ type: m.type,
148
+ importance: Math.round(m.relevance * 10),
149
+ }));
150
+ const compressed = compressToSemanticUnits(memoryData);
151
+ compressionStats = {
152
+ ratio: compressed.overallRatio,
153
+ sourceTokens: compressed.totalSourceTokens,
154
+ compressedTokens: compressed.totalCompressedTokens,
155
+ };
156
+ // Replace memories with compressed versions if significant savings
157
+ if (compressed.overallRatio > 1.5) {
158
+ processedMemories = compressed.units.flatMap((unit) => unit.atomicFacts.map((fact) => ({
159
+ content: fact.content,
160
+ type: fact.type === 'gotcha'
161
+ ? 'gotcha'
162
+ : fact.type === 'lesson'
163
+ ? 'lesson'
164
+ : fact.type === 'pattern'
165
+ ? 'pattern'
166
+ : 'context',
167
+ relevance: fact.actionability,
168
+ source: 'semantic-compression',
169
+ })));
170
+ }
171
+ }
172
+ // Step 7b: Prune memories to fit token budget using ContextPruner
173
+ try {
174
+ const pruner = new ContextPruner();
175
+ const prunableMemories = processedMemories.map((m, i) => ({
176
+ content: m.content,
177
+ relevance: m.relevance,
178
+ age: i, // Use index as age proxy (older = higher index)
179
+ accessCount: 1,
180
+ }));
181
+ const pruned = pruner.prune(prunableMemories, budget.remaining());
182
+ if (pruned.length < processedMemories.length) {
183
+ // Map pruned back to processed memories by content match
184
+ const prunedContents = new Set(pruned.map((p) => p.content));
185
+ processedMemories = processedMemories.filter((m) => prunedContents.has(m.content));
186
+ }
187
+ }
188
+ catch {
189
+ // ContextPruner failure is non-fatal
190
+ }
191
+ // Step 8: Extract patterns and gotchas
192
+ const patterns = processedMemories
193
+ .filter((m) => m.type === 'pattern')
194
+ .map((m) => m.content)
195
+ .slice(0, retrievalDepth.patterns);
196
+ const gotchas = processedMemories
197
+ .filter((m) => m.type === 'gotcha')
198
+ .map((m) => m.content)
199
+ .slice(0, retrievalDepth.patterns);
200
+ // Step 9: Get project-specific context
201
+ const projectContext = await getProjectContext(classification, projectRoot);
202
+ // Step 10: Ambiguity detection (P37 pattern)
203
+ const ambiguityResult = detectAmbiguity(taskInstruction);
204
+ // Step 11: Format context with budget allocation
205
+ let baseContext = formatContextWithRecencyBias(classification, processedMemories, patterns, gotchas, projectContext);
206
+ // Append ambiguity context if detected
207
+ const ambiguityContext = formatAmbiguityForContext(ambiguityResult);
208
+ if (ambiguityContext) {
209
+ baseContext = ambiguityContext + '\n\n' + baseContext;
210
+ }
211
+ const { content: formattedContext } = budget.allocate('main', baseContext);
212
+ return {
213
+ classification,
214
+ relevantMemories: processedMemories,
215
+ patterns,
216
+ gotchas,
217
+ projectContext,
218
+ formattedContext,
219
+ queryComplexity,
220
+ tokenBudget: {
221
+ used: budget.usage().used,
222
+ remaining: budget.remaining(),
223
+ total: effectiveMaxTokens,
224
+ },
225
+ compressionStats,
226
+ contextDecision,
227
+ ambiguity: ambiguityResult,
228
+ };
229
+ }
230
+ /**
231
+ * Query all memory sources for relevant information
232
+ * Uses adaptive retrieval depth to limit queries based on complexity
233
+ *
234
+ * OPTIMIZATION 8: Removed internal TOKEN_BUDGET hardcap - let the outer
235
+ * ContextBudget manager handle truncation to avoid double-counting.
236
+ * Pass maxTokens through from caller for proper budget coordination.
237
+ */
238
+ async function queryAllMemorySources(taskInstruction, classification, entities, suggestedQueries, projectRoot, depth, maxTokens) {
239
+ const memories = [];
240
+ // Source 1: Short-term SQLite memory (limited by depth)
241
+ const shortTermMemories = await queryShortTermMemory(classification, entities, projectRoot, depth.shortTerm);
242
+ memories.push(...shortTermMemories);
243
+ // Source 2: Session memories (limited by depth)
244
+ const sessionMemories = await querySessionMemory(taskInstruction, projectRoot, depth.sessionMem);
245
+ memories.push(...sessionMemories);
246
+ // Source 3: Long-term prepopulated memory (limited by depth)
247
+ const longTermMemories = await queryLongTermMemory(suggestedQueries, projectRoot, depth.longTerm);
248
+ memories.push(...longTermMemories);
249
+ // Source 4: CLAUDE.md sections relevant to task
250
+ const claudeMdMemories = await queryCLAUDEMd(classification, projectRoot);
251
+ memories.push(...claudeMdMemories);
252
+ // Source 5: Category-specific patterns from droids (limited by depth)
253
+ const droidPatterns = getCategoryPatterns(classification, depth.patterns);
254
+ memories.push(...droidPatterns);
255
+ // Source 6: Terminal-Bench domain knowledge (proven to improve accuracy)
256
+ // OPTIMIZATION 2: Also match file-creation type from domain knowledge
257
+ const domainKnowledge = getRelevantKnowledge(taskInstruction, classification.category);
258
+ for (const k of domainKnowledge) {
259
+ memories.push({
260
+ content: k.content,
261
+ type: k.type === 'gotcha' ? 'gotcha' : k.type === 'pattern' ? 'pattern' : 'context',
262
+ relevance: k.importance / 10,
263
+ source: 'terminal-bench-knowledge',
264
+ });
265
+ }
266
+ // Deduplicate and sort by relevance
267
+ const uniqueMemories = deduplicateMemories(memories);
268
+ uniqueMemories.sort((a, b) => b.relevance - a.relevance);
269
+ // OPTIMIZATION 8: Use maxTokens from caller (coordinated with outer ContextBudget)
270
+ // instead of hardcoded internal budget that caused double-counting
271
+ const effectiveBudget = maxTokens || 3000;
272
+ const budgeted = [];
273
+ let usedTokens = 0;
274
+ for (const mem of uniqueMemories) {
275
+ const memTokens = Math.ceil(mem.content.length / 4);
276
+ if (usedTokens + memTokens > effectiveBudget && budgeted.length > 0)
277
+ break;
278
+ budgeted.push(mem);
279
+ usedTokens += memTokens;
280
+ }
281
+ return budgeted;
282
+ }
283
+ /**
284
+ * Query short-term SQLite memory using FTS5 full-text search with LIKE fallback
285
+ * OPTIMIZATION 12: Use FTS5 index (memories_fts) for better semantic matching
286
+ */
287
+ async function queryShortTermMemory(classification, entities, projectRoot, limit = 5) {
288
+ const dbPath = join(projectRoot, 'agents/data/memory/short_term.db');
289
+ if (!existsSync(dbPath))
290
+ return [];
291
+ const memories = [];
292
+ const perKeywordLimit = Math.max(1, Math.ceil(limit / 3));
293
+ let db = null;
294
+ try {
295
+ db = new Database(dbPath, { readonly: true });
296
+ // Check if FTS5 index exists
297
+ const hasFts = db
298
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories_fts'")
299
+ .get() != null;
300
+ if (hasFts) {
301
+ // Use FTS5 for ranked full-text search (much better than LIKE)
302
+ const ftsStmt = db.prepare(`
303
+ SELECT m.type, m.content, rank
304
+ FROM memories_fts fts
305
+ JOIN memories m ON fts.rowid = m.id
306
+ WHERE memories_fts MATCH ?
307
+ ORDER BY rank
308
+ LIMIT ?
309
+ `);
310
+ // Build FTS5 query from keywords (OR-joined for broader recall)
311
+ const ftsKeywords = classification.keywords
312
+ .slice(0, 5)
313
+ .map((k) => k.replace(/[^a-zA-Z0-9_-]/g, ''))
314
+ .filter((k) => k.length > 2);
315
+ if (ftsKeywords.length > 0) {
316
+ const ftsQuery = ftsKeywords.join(' OR ');
317
+ try {
318
+ const rows = ftsStmt.all(ftsQuery, limit);
319
+ for (const row of rows) {
320
+ if (row.content) {
321
+ // FTS5 rank is negative (closer to 0 = better match)
322
+ const relevance = Math.min(0.95, 0.8 + Math.abs(row.rank) * 0.01);
323
+ memories.push({
324
+ content: row.content.slice(0, 500),
325
+ type: row.type === 'lesson' ? 'lesson' : row.type === 'gotcha' ? 'gotcha' : 'context',
326
+ relevance,
327
+ source: 'short-term-memory-fts5',
328
+ });
329
+ }
330
+ }
331
+ }
332
+ catch {
333
+ // FTS5 query syntax error — fall through to LIKE
334
+ }
335
+ }
336
+ // Also query by technology entities via FTS5
337
+ for (const tech of entities.technologies.slice(0, 2)) {
338
+ const safeTech = tech.replace(/[^a-zA-Z0-9_-]/g, '');
339
+ if (safeTech.length < 2)
340
+ continue;
341
+ try {
342
+ const rows = ftsStmt.all(safeTech, 2);
343
+ for (const row of rows) {
344
+ if (row.content) {
345
+ memories.push({
346
+ content: row.content.slice(0, 500),
347
+ type: row.type === 'gotcha' ? 'gotcha' : 'context',
348
+ relevance: 0.7,
349
+ source: 'short-term-memory-fts5',
350
+ });
351
+ }
352
+ }
353
+ }
354
+ catch {
355
+ // Ignore individual query errors
356
+ }
357
+ }
358
+ }
359
+ else {
360
+ // Fallback to LIKE queries if FTS5 not available
361
+ const keywordStmt = db.prepare(`
362
+ SELECT type, content FROM memories
363
+ WHERE content LIKE ?
364
+ ORDER BY id DESC
365
+ LIMIT ?
366
+ `);
367
+ for (const keyword of classification.keywords.slice(0, 3)) {
368
+ const rows = keywordStmt.all(`%${keyword}%`, perKeywordLimit);
369
+ for (const row of rows) {
370
+ if (row.content) {
371
+ memories.push({
372
+ content: row.content.slice(0, 500),
373
+ type: row.type === 'lesson' ? 'lesson' : 'context',
374
+ relevance: 0.7,
375
+ source: 'short-term-memory',
376
+ });
377
+ }
378
+ }
379
+ }
380
+ for (const tech of entities.technologies.slice(0, 2)) {
381
+ const rows = keywordStmt.all(`%${tech}%`, 2);
382
+ for (const row of rows) {
383
+ if (row.content) {
384
+ memories.push({
385
+ content: row.content.slice(0, 500),
386
+ type: row.type === 'gotcha' ? 'gotcha' : 'context',
387
+ relevance: 0.6,
388
+ source: 'short-term-memory',
389
+ });
390
+ }
391
+ }
392
+ }
393
+ }
394
+ }
395
+ catch {
396
+ // Ignore query errors
397
+ }
398
+ finally {
399
+ db?.close();
400
+ }
401
+ return memories;
402
+ }
403
+ /**
404
+ * Query session memories for recent decisions using parameterized queries (secure)
405
+ */
406
+ async function querySessionMemory(_taskInstruction, projectRoot, limit = 5) {
407
+ const dbPath = join(projectRoot, 'agents/data/memory/short_term.db');
408
+ if (!existsSync(dbPath))
409
+ return [];
410
+ const memories = [];
411
+ let db = null;
412
+ try {
413
+ db = new Database(dbPath, { readonly: true });
414
+ const stmt = db.prepare(`
415
+ SELECT type, content FROM session_memories
416
+ WHERE importance >= 7
417
+ ORDER BY id DESC
418
+ LIMIT ?
419
+ `);
420
+ const rows = stmt.all(limit);
421
+ for (const row of rows) {
422
+ if (row.content) {
423
+ memories.push({
424
+ content: row.content.slice(0, 500),
425
+ type: row.type === 'lesson' ? 'lesson' : row.type === 'decision' ? 'context' : 'pattern',
426
+ relevance: 0.8,
427
+ source: 'session-memory',
428
+ });
429
+ }
430
+ }
431
+ }
432
+ catch {
433
+ // Ignore query errors
434
+ }
435
+ finally {
436
+ db?.close();
437
+ }
438
+ return memories;
439
+ }
440
+ // OPTIMIZATION 9: Stopwords to filter from long-term memory queries
441
+ // These words match nearly everything and reduce query precision
442
+ const QUERY_STOPWORDS = new Set([
443
+ 'a',
444
+ 'an',
445
+ 'the',
446
+ 'is',
447
+ 'are',
448
+ 'was',
449
+ 'were',
450
+ 'be',
451
+ 'been',
452
+ 'being',
453
+ 'have',
454
+ 'has',
455
+ 'had',
456
+ 'do',
457
+ 'does',
458
+ 'did',
459
+ 'will',
460
+ 'would',
461
+ 'could',
462
+ 'should',
463
+ 'may',
464
+ 'might',
465
+ 'shall',
466
+ 'can',
467
+ 'need',
468
+ 'must',
469
+ 'to',
470
+ 'of',
471
+ 'in',
472
+ 'for',
473
+ 'on',
474
+ 'with',
475
+ 'at',
476
+ 'by',
477
+ 'from',
478
+ 'as',
479
+ 'into',
480
+ 'through',
481
+ 'during',
482
+ 'before',
483
+ 'after',
484
+ 'above',
485
+ 'below',
486
+ 'and',
487
+ 'but',
488
+ 'or',
489
+ 'nor',
490
+ 'not',
491
+ 'so',
492
+ 'yet',
493
+ 'both',
494
+ 'either',
495
+ 'this',
496
+ 'that',
497
+ 'these',
498
+ 'those',
499
+ 'it',
500
+ 'its',
501
+ 'best',
502
+ 'most',
503
+ 'very',
504
+ 'good',
505
+ 'great',
506
+ 'well',
507
+ 'new',
508
+ 'more',
509
+ 'common',
510
+ 'general',
511
+ 'basic',
512
+ 'simple',
513
+ 'all',
514
+ 'any',
515
+ 'some',
516
+ 'how',
517
+ 'what',
518
+ 'when',
519
+ 'where',
520
+ 'which',
521
+ 'who',
522
+ 'why',
523
+ 'practices',
524
+ 'tips',
525
+ 'implementation',
526
+ 'gotchas',
527
+ 'mistakes',
528
+ 'patterns',
529
+ ]);
530
+ /**
531
+ * Query long-term prepopulated memory
532
+ * OPTIMIZATION 9: Added stopword filtering for better query precision
533
+ */
534
+ async function queryLongTermMemory(queries, projectRoot, _limit = 5) {
535
+ const memoryPath = join(projectRoot, 'agents/data/memory/long_term_prepopulated.json');
536
+ if (!existsSync(memoryPath))
537
+ return [];
538
+ const memories = [];
539
+ try {
540
+ const data = JSON.parse(readFileSync(memoryPath, 'utf-8'));
541
+ const allMemories = data.memories || data.lessons || data || [];
542
+ for (const query of queries.slice(0, 5)) {
543
+ if (memories.length >= _limit)
544
+ break;
545
+ const queryLower = query.toLowerCase();
546
+ // OPTIMIZATION 9: Filter out stopwords to improve match quality
547
+ const queryWords = queryLower
548
+ .split(/\s+/)
549
+ .filter((w) => w.length > 2 && !QUERY_STOPWORDS.has(w));
550
+ // Skip queries that are entirely stopwords
551
+ if (queryWords.length === 0)
552
+ continue;
553
+ for (const mem of allMemories) {
554
+ if (memories.length >= _limit)
555
+ break;
556
+ const content = (mem.content || mem.text || JSON.stringify(mem)).toLowerCase();
557
+ const matchCount = queryWords.filter((w) => content.includes(w)).length;
558
+ // Require at least 1 non-stopword match (was 2 including stopwords)
559
+ if (matchCount >= 1 && matchCount / queryWords.length >= 0.3) {
560
+ memories.push({
561
+ content: (mem.content || mem.text || JSON.stringify(mem)).slice(0, 500),
562
+ type: mem.type || 'lesson',
563
+ relevance: matchCount / queryWords.length,
564
+ source: 'long-term-memory',
565
+ });
566
+ }
567
+ }
568
+ }
569
+ }
570
+ catch {
571
+ // Ignore parse errors
572
+ }
573
+ return memories;
574
+ }
575
+ /**
576
+ * Query CLAUDE.md for relevant sections
577
+ */
578
+ async function queryCLAUDEMd(classification, projectRoot) {
579
+ const claudeMdPath = join(projectRoot, 'CLAUDE.md');
580
+ if (!existsSync(claudeMdPath))
581
+ return [];
582
+ const memories = [];
583
+ try {
584
+ const content = readFileSync(claudeMdPath, 'utf-8');
585
+ // Extract Code Field section (always relevant)
586
+ const codeFieldMatch = content.match(/## .*CODE FIELD.*?(?=\n## |\n---\n|$)/s);
587
+ if (codeFieldMatch) {
588
+ memories.push({
589
+ content: codeFieldMatch[0].slice(0, 800),
590
+ type: 'pattern',
591
+ relevance: 0.9,
592
+ source: 'CLAUDE.md',
593
+ });
594
+ }
595
+ // Extract category-specific sections
596
+ const categorySectionMap = {
597
+ sysadmin: [/## .*System|Admin|Linux|Network.*?(?=\n## |\n---\n|$)/is],
598
+ security: [/## .*Security|Auth.*?(?=\n## |\n---\n|$)/is],
599
+ testing: [/## .*Test.*?(?=\n## |\n---\n|$)/is],
600
+ coding: [/## .*Coding|Convention|Pattern.*?(?=\n## |\n---\n|$)/is],
601
+ };
602
+ const patterns = categorySectionMap[classification.category] || [];
603
+ for (const pattern of patterns) {
604
+ const match = content.match(pattern);
605
+ if (match) {
606
+ memories.push({
607
+ content: match[0].slice(0, 600),
608
+ type: 'context',
609
+ relevance: 0.75,
610
+ source: 'CLAUDE.md',
611
+ });
612
+ }
613
+ }
614
+ // Extract gotchas/troubleshooting sections
615
+ const gotchasMatch = content.match(/## .*Troubleshoot|Gotcha|Common.*?(?=\n## |\n---\n|$)/is);
616
+ if (gotchasMatch) {
617
+ memories.push({
618
+ content: gotchasMatch[0].slice(0, 500),
619
+ type: 'gotcha',
620
+ relevance: 0.7,
621
+ source: 'CLAUDE.md',
622
+ });
623
+ }
624
+ }
625
+ catch {
626
+ // Ignore read errors
627
+ }
628
+ return memories;
629
+ }
630
+ /**
631
+ * Get category-specific patterns from droid knowledge
632
+ */
633
+ function getCategoryPatterns(classification, limit = 4) {
634
+ const patterns = [];
635
+ const categoryPatterns = {
636
+ sysadmin: [
637
+ 'Use `ip addr` instead of deprecated `ifconfig` for network info',
638
+ 'Use `ss -tlnp` instead of `netstat` for listening ports',
639
+ 'Always check `journalctl -u <service>` for service logs',
640
+ 'Use `make -j$(nproc)` for parallel kernel compilation',
641
+ ],
642
+ security: [
643
+ 'Never log sensitive data (passwords, tokens, keys)',
644
+ 'Use parameterized queries to prevent SQL injection',
645
+ 'Validate and sanitize all user input',
646
+ 'Check for CVE exploits before attempting complex attacks',
647
+ ],
648
+ 'ml-training': [
649
+ 'Start with smaller models (distilbert vs bert-large) for speed',
650
+ 'Use `CUDA_VISIBLE_DEVICES` to select specific GPUs',
651
+ 'Cache datasets to avoid repeated downloads',
652
+ 'Set `num_train_epochs=3` initially, increase if needed',
653
+ ],
654
+ debugging: [
655
+ 'Use `pip check` to detect dependency conflicts',
656
+ 'Use `git reflog` to recover lost commits',
657
+ 'Check `conda env export` before modifying environments',
658
+ 'Add verbose flags (-v, --debug) to diagnose issues',
659
+ ],
660
+ coding: [
661
+ 'State assumptions before writing code',
662
+ 'Handle edge cases explicitly (empty arrays, null values)',
663
+ 'Use TypeScript strict mode for better type safety',
664
+ 'Include try-catch for operations that can fail',
665
+ ],
666
+ testing: [
667
+ 'Test edge cases: empty input, null, undefined',
668
+ 'Use mocks for external dependencies',
669
+ 'Aim for high coverage on critical paths',
670
+ 'Run tests before committing: `npm test`',
671
+ ],
672
+ };
673
+ const relevantPatterns = categoryPatterns[classification.category] || [];
674
+ const patternLimit = Math.max(1, Math.ceil(limit * 0.6));
675
+ for (const pattern of relevantPatterns.slice(0, patternLimit)) {
676
+ patterns.push({
677
+ content: pattern,
678
+ type: 'pattern',
679
+ relevance: 0.85,
680
+ source: 'droid-knowledge',
681
+ });
682
+ }
683
+ // Add common gotchas
684
+ const commonGotchas = [
685
+ 'Array index: use `i < length`, not `i <= length`',
686
+ 'JSON.parse throws on invalid input - wrap in try/catch',
687
+ 'Empty array reduce needs initial value',
688
+ 'Map.get() returns undefined for missing keys',
689
+ ];
690
+ const gotchaLimit = Math.max(1, limit - patternLimit);
691
+ for (const gotcha of commonGotchas.slice(0, gotchaLimit)) {
692
+ patterns.push({
693
+ content: gotcha,
694
+ type: 'gotcha',
695
+ relevance: 0.8,
696
+ source: 'droid-knowledge',
697
+ });
698
+ }
699
+ return patterns;
700
+ }
701
+ /**
702
+ * Get project-specific context
703
+ */
704
+ async function getProjectContext(classification, projectRoot) {
705
+ const sections = [];
706
+ // Add project structure if relevant
707
+ if (['coding', 'testing', 'debugging'].includes(classification.category)) {
708
+ try {
709
+ const pkgJsonPath = join(projectRoot, 'package.json');
710
+ if (existsSync(pkgJsonPath)) {
711
+ const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
712
+ sections.push(`Project: ${pkg.name} v${pkg.version}`);
713
+ if (pkg.scripts) {
714
+ const scripts = Object.keys(pkg.scripts).slice(0, 5).join(', ');
715
+ sections.push(`Available scripts: ${scripts}`);
716
+ }
717
+ }
718
+ }
719
+ catch {
720
+ // Ignore
721
+ }
722
+ }
723
+ return sections.join('\n');
724
+ }
725
+ /**
726
+ * Format context with recency bias (critical info at END)
727
+ * Based on Droid's hierarchical prompting strategy
728
+ */
729
+ function formatContextWithRecencyBias(classification, memories, patterns, gotchas, projectContext) {
730
+ const sections = [];
731
+ // Section 1: Project context (less critical, at start)
732
+ if (projectContext) {
733
+ sections.push('## Project Context\n' + projectContext);
734
+ }
735
+ // Section 2: General patterns (medium priority)
736
+ if (patterns.length > 0) {
737
+ sections.push('## Relevant Patterns\n' +
738
+ patterns
739
+ .slice(0, 5)
740
+ .map((p) => `- ${p}`)
741
+ .join('\n'));
742
+ }
743
+ // Section 3: Retrieved memories
744
+ const lessons = memories.filter((m) => m.type === 'lesson').slice(0, 3);
745
+ if (lessons.length > 0) {
746
+ sections.push('## Lessons from Memory\n' + lessons.map((m) => `- ${m.content}`).join('\n'));
747
+ }
748
+ // Section 4: Task classification info
749
+ sections.push(`## Task Classification
750
+ - Category: ${classification.category}
751
+ - Suggested approach: Use ${classification.suggestedDroid} patterns
752
+ - Key focus: ${classification.keywords.slice(0, 3).join(', ')}`);
753
+ // Section 5: CRITICAL - Gotchas at END (recency bias)
754
+ if (gotchas.length > 0) {
755
+ sections.push('## ⚠️ CRITICAL: Avoid These Mistakes\n' +
756
+ gotchas
757
+ .slice(0, 4)
758
+ .map((g) => `- ${g}`)
759
+ .join('\n'));
760
+ }
761
+ // Section 6: Final reminders (most recent = highest attention)
762
+ sections.push(`## Final Reminders
763
+ - State assumptions before coding
764
+ - Handle edge cases explicitly
765
+ - Verify solution before reporting success`);
766
+ return sections.join('\n\n') + '\n\n---\n\n';
767
+ }
768
+ /**
769
+ * Deduplicate memories by content hash AND semantic similarity
770
+ * Uses SHA-256 based content hash for exact deduplication,
771
+ * then Jaccard similarity for near-duplicate detection
772
+ */
773
+ function deduplicateMemories(memories) {
774
+ const seen = new Set();
775
+ const unique = [];
776
+ const SIMILARITY_THRESHOLD = 0.8;
777
+ for (const mem of memories) {
778
+ // Phase 1: Exact content hash deduplication
779
+ const key = contentHash(mem.content);
780
+ if (seen.has(key))
781
+ continue;
782
+ // Phase 2: Semantic similarity check against existing unique memories
783
+ const contentLower = mem.content.toLowerCase();
784
+ let isDuplicate = false;
785
+ for (const existing of unique) {
786
+ const similarity = jaccardSimilarity(contentLower, existing.content.toLowerCase());
787
+ if (similarity > SIMILARITY_THRESHOLD) {
788
+ isDuplicate = true;
789
+ // Keep the one with higher relevance
790
+ if (mem.relevance > existing.relevance) {
791
+ const idx = unique.indexOf(existing);
792
+ unique[idx] = mem;
793
+ }
794
+ break;
795
+ }
796
+ }
797
+ if (!isDuplicate) {
798
+ seen.add(key);
799
+ unique.push(mem);
800
+ }
801
+ }
802
+ return unique;
803
+ }
804
+ export function recordTaskFeedback(outcome) {
805
+ const { instruction, success, durationMs, modelId, agentOutput, projectRoot } = outcome;
806
+ // 1. Classify the task for feedback routing
807
+ const classification = classifyTask(instruction);
808
+ const taskType = classification.category;
809
+ // 2. Update adaptive context historical data
810
+ recordOutcome(taskType, true, success, durationMs, modelId);
811
+ // 3. Record knowledge outcome to boost/demote domain knowledge
812
+ recordKnowledgeOutcome(instruction, success);
813
+ // 4. Extract new learnings from agent output (on success only)
814
+ if (success && agentOutput) {
815
+ const learnedPatterns = extractLearnedPatterns(agentOutput, taskType);
816
+ for (const pattern of learnedPatterns) {
817
+ const persistPath = projectRoot
818
+ ? join(projectRoot, 'agents/data/memory/long_term_prepopulated.json')
819
+ : undefined;
820
+ recordKnowledgeOutcome(instruction, true, {
821
+ category: taskType,
822
+ type: pattern.type,
823
+ content: pattern.content,
824
+ keywords: pattern.keywords,
825
+ importance: 7,
826
+ }, persistPath);
827
+ }
828
+ }
829
+ }
830
+ /**
831
+ * Extract learned patterns from successful agent output
832
+ * Looks for commands that worked, solutions that passed, and techniques used
833
+ */
834
+ function extractLearnedPatterns(agentOutput, taskType) {
835
+ const patterns = [];
836
+ // Extract successful commands (lines starting with $ or containing common tool names)
837
+ const commandMatches = agentOutput.match(/^\$\s+.+$/gm);
838
+ if (commandMatches) {
839
+ for (const cmd of commandMatches.slice(0, 3)) {
840
+ const cleanCmd = cmd.replace(/^\$\s+/, '').trim();
841
+ if (cleanCmd.length > 10 && cleanCmd.length < 200) {
842
+ const keywords = extractKeywordsFromCommand(cleanCmd);
843
+ patterns.push({
844
+ type: 'tool',
845
+ content: `Successful command for ${taskType}: ${cleanCmd}`,
846
+ keywords: [taskType, ...keywords],
847
+ });
848
+ }
849
+ }
850
+ }
851
+ // Extract "worked" or "fixed" phrases
852
+ const solutionMatches = agentOutput.match(/(?:fixed|solved|resolved|working|passed|succeeded)[^.]*\./gi);
853
+ if (solutionMatches) {
854
+ for (const solution of solutionMatches.slice(0, 2)) {
855
+ if (solution.length > 15 && solution.length < 300) {
856
+ patterns.push({
857
+ type: 'pattern',
858
+ content: solution.trim(),
859
+ keywords: [taskType],
860
+ });
861
+ }
862
+ }
863
+ }
864
+ return patterns;
865
+ }
866
+ /**
867
+ * Extract keywords from a command string
868
+ */
869
+ function extractKeywordsFromCommand(cmd) {
870
+ const toolNames = [
871
+ 'hashcat',
872
+ 'john',
873
+ 'readelf',
874
+ 'objdump',
875
+ 'strings',
876
+ 'sqlite3',
877
+ 'make',
878
+ 'gcc',
879
+ 'python',
880
+ 'pip',
881
+ 'npm',
882
+ 'git',
883
+ 'docker',
884
+ 'curl',
885
+ 'wget',
886
+ 'stockfish',
887
+ 'bleach',
888
+ '7z',
889
+ 'tar',
890
+ 'grep',
891
+ 'awk',
892
+ 'sed',
893
+ ];
894
+ const keywords = [];
895
+ const cmdLower = cmd.toLowerCase();
896
+ for (const tool of toolNames) {
897
+ if (cmdLower.includes(tool)) {
898
+ keywords.push(tool);
899
+ }
900
+ }
901
+ // Extract flags (e.g., -m 11600)
902
+ const flags = cmd.match(/-\w+\s+\S+/g);
903
+ if (flags) {
904
+ keywords.push(...flags.slice(0, 3).map((f) => f.trim()));
905
+ }
906
+ return keywords;
907
+ }
908
+ //# sourceMappingURL=dynamic-retrieval.js.map