@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,366 @@
1
+ #!/usr/bin/env bash
2
+ # UAP Session Start Hook (universal - all coding harnesses)
3
+ # COMPLIANCE ENFORCEMENT: Outputs mandatory protocol checklist
4
+ # that the AI agent MUST complete before any work begins.
5
+ # Fails safely - never blocks the agent.
6
+ set -euo pipefail
7
+
8
+ PROJECT_DIR="${CLAUDE_PROJECT_DIR:-${FACTORY_PROJECT_DIR:-${CURSOR_PROJECT_DIR:-.}}}"
9
+ DB_PATH="${PROJECT_DIR}/agents/data/memory/short_term.db"
10
+ COORD_DB="${PROJECT_DIR}/agents/data/coordination/coordination.db"
11
+
12
+ if [ ! -f "$DB_PATH" ]; then
13
+ exit 0
14
+ fi
15
+
16
+ # Auto-create coordination DB if missing (self-healing)
17
+ if [ ! -f "$COORD_DB" ]; then
18
+ mkdir -p "$(dirname "$COORD_DB")"
19
+ sqlite3 "$COORD_DB" "
20
+ PRAGMA journal_mode = WAL;
21
+ PRAGMA synchronous = NORMAL;
22
+ PRAGMA busy_timeout = 10000;
23
+
24
+ CREATE TABLE IF NOT EXISTS agent_registry (
25
+ id TEXT PRIMARY KEY, name TEXT NOT NULL, session_id TEXT NOT NULL,
26
+ status TEXT NOT NULL CHECK(status IN ('active','idle','completed','failed')),
27
+ current_task TEXT, worktree_branch TEXT, started_at TEXT NOT NULL,
28
+ last_heartbeat TEXT NOT NULL, capabilities TEXT
29
+ );
30
+ CREATE INDEX IF NOT EXISTS idx_agent_registry_session ON agent_registry(session_id);
31
+ CREATE INDEX IF NOT EXISTS idx_agent_registry_status ON agent_registry(status);
32
+
33
+ CREATE TABLE IF NOT EXISTS agent_messages (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT, channel TEXT NOT NULL,
35
+ from_agent TEXT, to_agent TEXT,
36
+ type TEXT NOT NULL CHECK(type IN ('request','response','notification','claim','release')),
37
+ payload TEXT NOT NULL, priority INTEGER DEFAULT 5,
38
+ created_at TEXT NOT NULL, read_at TEXT, expires_at TEXT
39
+ );
40
+ CREATE INDEX IF NOT EXISTS idx_messages_channel ON agent_messages(channel);
41
+ CREATE INDEX IF NOT EXISTS idx_messages_to_agent ON agent_messages(to_agent);
42
+ CREATE INDEX IF NOT EXISTS idx_messages_created ON agent_messages(created_at);
43
+
44
+ CREATE TABLE IF NOT EXISTS work_announcements (
45
+ id INTEGER PRIMARY KEY AUTOINCREMENT, agent_id TEXT NOT NULL,
46
+ agent_name TEXT, worktree_branch TEXT,
47
+ intent_type TEXT NOT NULL CHECK(intent_type IN ('editing','reviewing','refactoring','testing','documenting')),
48
+ resource TEXT NOT NULL, description TEXT, files_affected TEXT,
49
+ estimated_completion TEXT, announced_at TEXT NOT NULL, completed_at TEXT,
50
+ FOREIGN KEY (agent_id) REFERENCES agent_registry(id)
51
+ );
52
+ CREATE INDEX IF NOT EXISTS idx_announcements_agent ON work_announcements(agent_id);
53
+ CREATE INDEX IF NOT EXISTS idx_announcements_resource ON work_announcements(resource);
54
+ CREATE INDEX IF NOT EXISTS idx_announcements_active ON work_announcements(completed_at) WHERE completed_at IS NULL;
55
+
56
+ CREATE TABLE IF NOT EXISTS work_claims (
57
+ id INTEGER PRIMARY KEY AUTOINCREMENT, resource TEXT NOT NULL,
58
+ agent_id TEXT NOT NULL, claim_type TEXT NOT NULL CHECK(claim_type IN ('exclusive','shared')),
59
+ claimed_at TEXT NOT NULL, expires_at TEXT,
60
+ FOREIGN KEY (agent_id) REFERENCES agent_registry(id)
61
+ );
62
+ CREATE INDEX IF NOT EXISTS idx_claims_agent ON work_claims(agent_id);
63
+ CREATE INDEX IF NOT EXISTS idx_claims_resource ON work_claims(resource);
64
+
65
+ CREATE TABLE IF NOT EXISTS deploy_queue (
66
+ id INTEGER PRIMARY KEY AUTOINCREMENT, agent_id TEXT NOT NULL,
67
+ action_type TEXT NOT NULL CHECK(action_type IN ('commit','push','merge','deploy','workflow')),
68
+ target TEXT NOT NULL, payload TEXT,
69
+ status TEXT NOT NULL CHECK(status IN ('pending','batched','executing','completed','failed')),
70
+ batch_id TEXT, queued_at TEXT NOT NULL, execute_after TEXT,
71
+ priority INTEGER DEFAULT 5, dependencies TEXT
72
+ );
73
+ CREATE INDEX IF NOT EXISTS idx_deploy_status ON deploy_queue(status);
74
+ CREATE INDEX IF NOT EXISTS idx_deploy_batch ON deploy_queue(batch_id);
75
+ CREATE INDEX IF NOT EXISTS idx_deploy_target ON deploy_queue(target);
76
+
77
+ CREATE TABLE IF NOT EXISTS deploy_batches (
78
+ id TEXT PRIMARY KEY, created_at TEXT NOT NULL, executed_at TEXT,
79
+ status TEXT NOT NULL CHECK(status IN ('pending','executing','completed','failed')),
80
+ result TEXT
81
+ );
82
+ " 2>/dev/null || true
83
+ fi
84
+
85
+ # Clean stale agents from coordination DB (heartbeat >24h old)
86
+ if [ -f "$COORD_DB" ]; then
87
+ sqlite3 "$COORD_DB" "
88
+ DELETE FROM work_claims WHERE agent_id IN (
89
+ SELECT id FROM agent_registry
90
+ WHERE status IN ('active','idle') AND last_heartbeat < datetime('now','-24 hours')
91
+ );
92
+ DELETE FROM work_announcements WHERE agent_id IN (
93
+ SELECT id FROM agent_registry
94
+ WHERE status IN ('active','idle') AND last_heartbeat < datetime('now','-24 hours')
95
+ ) AND completed_at IS NULL;
96
+ UPDATE agent_registry SET status='failed'
97
+ WHERE status IN ('active','idle') AND last_heartbeat < datetime('now','-24 hours');
98
+ DELETE FROM agent_registry
99
+ WHERE status IN ('completed','failed') AND started_at < datetime('now','-7 days');
100
+ DELETE FROM agent_messages WHERE created_at < datetime('now','-24 hours');
101
+ " 2>/dev/null || true
102
+ fi
103
+
104
+ # ============================================================
105
+ # MANDATORY: Auto-register this agent + start heartbeat
106
+ # ============================================================
107
+ AGENT_ID="claude-${SESSION_ID:-$(head -c 6 /dev/urandom | od -An -tx1 | tr -d ' \n')}"
108
+ AGENT_NAME="claude-code"
109
+
110
+ if [ -f "$COORD_DB" ]; then
111
+ # Register this agent
112
+ sqlite3 "$COORD_DB" "
113
+ INSERT OR REPLACE INTO agent_registry (id, name, session_id, status, capabilities, started_at, last_heartbeat)
114
+ VALUES ('${AGENT_ID}', '${AGENT_NAME}', '${AGENT_ID}', 'active', '[]', datetime('now'), datetime('now'));
115
+ " 2>/dev/null || true
116
+
117
+ # Check for other active agents and their work
118
+ OTHER_AGENTS=$(sqlite3 "$COORD_DB" "
119
+ SELECT id || ': ' || COALESCE(current_task, 'idle')
120
+ FROM agent_registry
121
+ WHERE status='active' AND id != '${AGENT_ID}'
122
+ ORDER BY last_heartbeat DESC LIMIT 5;
123
+ " 2>/dev/null || true)
124
+
125
+ ACTIVE_WORK=$(sqlite3 "$COORD_DB" "
126
+ SELECT agent_id || ' -> ' || resources
127
+ FROM work_announcements
128
+ WHERE completed_at IS NULL
129
+ ORDER BY announced_at DESC LIMIT 5;
130
+ " 2>/dev/null || true)
131
+ fi
132
+
133
+ # Export agent ID for downstream tools
134
+ export UAP_AGENT_ID="${AGENT_ID}"
135
+
136
+ # Start background heartbeat (every 30s, auto-stops when shell exits)
137
+ if [ -f "$COORD_DB" ]; then
138
+ (
139
+ while true; do
140
+ sleep 30
141
+ sqlite3 "$COORD_DB" "UPDATE agent_registry SET last_heartbeat=datetime('now') WHERE id='${AGENT_ID}';" 2>/dev/null || break
142
+ done
143
+ ) &
144
+ HEARTBEAT_PID=$!
145
+ # Ensure heartbeat stops and agent deregisters on exit
146
+ trap "kill $HEARTBEAT_PID 2>/dev/null; sqlite3 \"$COORD_DB\" \"UPDATE agent_registry SET status='completed' WHERE id='${AGENT_ID}';\" 2>/dev/null" EXIT
147
+ fi
148
+
149
+ output=""
150
+
151
+ # ============================================================
152
+ # UAP SESSION BANNER - Rich Operational Data
153
+ # ============================================================
154
+ SESSION_ID=$(head -c 6 /dev/urandom | od -An -tx1 | tr -d ' \n' | head -c 6)
155
+ TASK_DB="${PROJECT_DIR}/.uap/tasks/tasks.db"
156
+ PKG_VERSION=$(node -e "try{console.log(JSON.parse(require('fs').readFileSync('${PROJECT_DIR}/package.json','utf8')).version)}catch{console.log('?')}" 2>/dev/null || echo "?")
157
+
158
+ # Gather task stats
159
+ TASK_TOTAL=0; TASK_OPEN=0; TASK_PROGRESS=0; TASK_BLOCKED=0; TASK_DONE=0
160
+ if [ -f "$TASK_DB" ]; then
161
+ TASK_TOTAL=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks;" 2>/dev/null || echo 0)
162
+ TASK_OPEN=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks WHERE status='open';" 2>/dev/null || echo 0)
163
+ TASK_PROGRESS=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks WHERE status='in_progress';" 2>/dev/null || echo 0)
164
+ TASK_BLOCKED=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks WHERE status='blocked';" 2>/dev/null || echo 0)
165
+ TASK_DONE=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks WHERE status='done' OR status='wont_do';" 2>/dev/null || echo 0)
166
+ fi
167
+
168
+ # Gather memory stats
169
+ MEM_ENTRIES=0; MEM_SIZE="0 KB"
170
+ if [ -f "$DB_PATH" ]; then
171
+ MEM_ENTRIES=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM memories;" 2>/dev/null || echo 0)
172
+ MEM_SIZE=$(du -h "$DB_PATH" 2>/dev/null | cut -f1 || echo "?")
173
+ fi
174
+
175
+ # Gather agent stats
176
+ AGENT_COUNT=0
177
+ if [ -f "$COORD_DB" ]; then
178
+ AGENT_COUNT=$(sqlite3 "$COORD_DB" "SELECT COUNT(*) FROM agent_registry WHERE status='active';" 2>/dev/null || echo 0)
179
+ fi
180
+
181
+ # Qdrant status
182
+ QDRANT_STATUS="OFF"
183
+ if docker ps --filter name=qdrant --format "{{.Status}}" 2>/dev/null | grep -q "Up"; then
184
+ QDRANT_STATUS="ON"
185
+ fi
186
+
187
+ # Git branch
188
+ GIT_BRANCH=$(git -C "$PROJECT_DIR" branch --show-current 2>/dev/null || echo "?")
189
+ GIT_DIRTY=$(git -C "$PROJECT_DIR" status --porcelain 2>/dev/null | wc -l | tr -d ' ')
190
+
191
+ # Worktree count
192
+ WORKTREE_COUNT=0
193
+ if [ -d "${PROJECT_DIR}/.worktrees" ]; then
194
+ WORKTREE_COUNT=$(find "${PROJECT_DIR}/.worktrees" -maxdepth 1 -mindepth 1 -type d 2>/dev/null | wc -l | tr -d ' ')
195
+ fi
196
+
197
+ # Pattern count
198
+ PATTERN_COUNT=0
199
+ if [ -f "${PROJECT_DIR}/.factory/patterns/index.json" ]; then
200
+ PATTERN_COUNT=$(node -e "try{console.log(JSON.parse(require('fs').readFileSync('${PROJECT_DIR}/.factory/patterns/index.json','utf8')).patterns?.length||0)}catch{console.log(0)}" 2>/dev/null || echo 0)
201
+ fi
202
+
203
+ # Skill count
204
+ SKILL_COUNT=$(find "${PROJECT_DIR}/.claude/skills" "${PROJECT_DIR}/.factory/skills" -name "SKILL.md" 2>/dev/null | wc -l | tr -d ' ')
205
+
206
+ # Droid count
207
+ DROID_COUNT=$(find "${PROJECT_DIR}/.factory/droids" -name "*.md" -not -name "test-droid-*" 2>/dev/null | wc -l | tr -d ' ')
208
+
209
+ # Build task progress bar (20 chars wide)
210
+ if [ "$TASK_TOTAL" -gt 0 ]; then
211
+ TASK_PCT=$((TASK_DONE * 100 / TASK_TOTAL))
212
+ FILLED=$((TASK_DONE * 20 / TASK_TOTAL))
213
+ EMPTY=$((20 - FILLED))
214
+ TASK_BAR=$(printf '%0.s█' $(seq 1 $FILLED 2>/dev/null) 2>/dev/null)$(printf '%0.s░' $(seq 1 $EMPTY 2>/dev/null) 2>/dev/null)
215
+ else
216
+ TASK_PCT=0
217
+ TASK_BAR="░░░░░░░░░░░░░░░░░░░░"
218
+ fi
219
+
220
+ # Render banner
221
+ W=62
222
+ output+="╭$(printf '─%.0s' $(seq 1 $W))╮"$'\n'
223
+ output+="│ UAP Universal Agent Protocol v${PKG_VERSION}$(printf ' %.0s' $(seq 1 $((W - 40 - ${#PKG_VERSION}))))│"$'\n'
224
+ output+="│ Session: ${SESSION_ID} $(date '+%Y-%m-%d %H:%M:%S') Branch: ${GIT_BRANCH}$(printf ' %.0s' $(seq 1 $((W - 42 - ${#GIT_BRANCH}))))│"$'\n'
225
+ output+="├$(printf '─%.0s' $(seq 1 $W))┤"$'\n'
226
+
227
+ # Task status line
228
+ if [ "$TASK_TOTAL" -gt 0 ]; then
229
+ output+="│ Tasks: ${TASK_BAR} ${TASK_PCT}% (${TASK_DONE}/${TASK_TOTAL})$(printf ' %.0s' $(seq 1 $((W - 38 - ${#TASK_PCT} - ${#TASK_DONE} - ${#TASK_TOTAL}))))│"$'\n'
230
+ TASK_DETAIL="${TASK_OPEN} open ${TASK_PROGRESS} active ${TASK_BLOCKED} blocked ${TASK_DONE} done"
231
+ output+="│ ${TASK_DETAIL}$(printf ' %.0s' $(seq 1 $((W - 3 - ${#TASK_DETAIL}))))│"$'\n'
232
+ else
233
+ output+="│ Tasks: No tasks tracked yet$(printf ' %.0s' $(seq 1 $((W - 28))))│"$'\n'
234
+ fi
235
+
236
+ # Memory & infrastructure line
237
+ MEM_LINE="Memory: ${MEM_ENTRIES} entries (${MEM_SIZE}) Qdrant: ${QDRANT_STATUS}"
238
+ output+="│ ${MEM_LINE}$(printf ' %.0s' $(seq 1 $((W - 1 - ${#MEM_LINE}))))│"$'\n'
239
+
240
+ # Agents, patterns, skills line
241
+ INFRA_LINE="Agents: ${AGENT_COUNT} Patterns: ${PATTERN_COUNT} Skills: ${SKILL_COUNT} Droids: ${DROID_COUNT}"
242
+ output+="│ ${INFRA_LINE}$(printf ' %.0s' $(seq 1 $((W - 1 - ${#INFRA_LINE}))))│"$'\n'
243
+
244
+ # Git & worktree line
245
+ GIT_LINE="Git: ${GIT_DIRTY} uncommitted Worktrees: ${WORKTREE_COUNT}"
246
+ output+="│ ${GIT_LINE}$(printf ' %.0s' $(seq 1 $((W - 1 - ${#GIT_LINE}))))│"$'\n'
247
+
248
+ output+="├$(printf '─%.0s' $(seq 1 $W))┤"$'\n'
249
+
250
+ # Active policies
251
+ output+="│ Policies: [ON] IaC Parity [ON] File Backup$(printf ' %.0s' $(seq 1 $((W - 47))))│"$'\n'
252
+
253
+ # Memory layers
254
+ L3_STATUS="?"
255
+ [ "$QDRANT_STATUS" = "ON" ] && L3_STATUS="ON"
256
+ output+="│ Layers: L1:ON L2:ON L3:${L3_STATUS} L4:ON$(printf ' %.0s' $(seq 1 $((W - 37 - ${#L3_STATUS}))))│"$'\n'
257
+
258
+ output+="╰$(printf '─%.0s' $(seq 1 $W))╯"$'\n'
259
+ output+=""$'\n'
260
+
261
+ # ============================================================
262
+ # COMPLIANCE ENFORCEMENT BLOCK
263
+ # This is injected as system context. The AI MUST follow these.
264
+ # ============================================================
265
+ output+="<system-reminder>"$'\n'
266
+ output+="## UAP COMPLIANCE - MANDATORY PROTOCOL"$'\n'
267
+ output+=""$'\n'
268
+ output+="You MUST complete these steps IN ORDER before doing ANY work."$'\n'
269
+ output+="Skipping ANY step is a critical protocol violation."$'\n'
270
+ output+=""$'\n'
271
+ output+="### BEFORE WORK (execute these commands NOW):"$'\n'
272
+ output+="1. Run: uap task ready"$'\n'
273
+ output+="2. Run: sqlite3 ./agents/data/memory/short_term.db \"SELECT type, substr(content,1,80) FROM memories ORDER BY id DESC LIMIT 5;\""$'\n'
274
+ output+="3. Run: uap memory query \"<relevant to user request>\""$'\n'
275
+ output+="4. On work request: Run: uap task create --type <task|bug|feature> --title \"<description>\""$'\n'
276
+ output+=""$'\n'
277
+ output+="### BEFORE FIRST EDIT (MANDATORY):"$'\n'
278
+ output+="5. BACKUP all files you will modify: cp <file> .uap-backups/$(date +%Y-%m-%d)/<file>"$'\n'
279
+ output+=" Or use: mkdir -p .uap-backups/$(date +%Y-%m-%d) && cp -r <dir> .uap-backups/$(date +%Y-%m-%d)/"$'\n'
280
+ output+=""$'\n'
281
+ output+="### DURING WORK:"$'\n'
282
+ output+="6. ALL file changes MUST use worktree: uap worktree create <slug>"$'\n'
283
+ output+="7. Work in .worktrees/NNN-<slug>/ directory"$'\n'
284
+ output+=""$'\n'
285
+ output+="### BEFORE COMMIT:"$'\n'
286
+ output+="8. Self-review: git diff"$'\n'
287
+ output+="9. Run tests if applicable"$'\n'
288
+ output+=""$'\n'
289
+ output+="### AFTER WORK:"$'\n'
290
+ output+="10. Store lesson: sqlite3 ./agents/data/memory/short_term.db \"INSERT INTO session_memories (session_id,timestamp,type,content,importance) VALUES ('current',datetime('now'),'decision','<summary of work and lessons>',7);\""$'\n'
291
+ output+="11. Clean up worktree after PR merge: uap worktree cleanup <id>"$'\n'
292
+ output+=""$'\n'
293
+ output+="### MULTI-AGENT COORDINATION (MANDATORY):"$'\n'
294
+ output+="Your agent ID is: ${AGENT_ID}"$'\n'
295
+ output+="12. Before editing files, announce work: uap agent announce --resources '<file1>,<file2>' --description '<what>'"$'\n'
296
+ output+="13. Check for conflicts: uap agent overlaps"$'\n'
297
+ output+="14. After completing work: uap agent complete <announcement-id>"$'\n'
298
+ output+=""$'\n'
299
+
300
+ if [ -n "$OTHER_AGENTS" ]; then
301
+ output+="### ACTIVE AGENTS (coordinate with them):"$'\n'
302
+ output+="$OTHER_AGENTS"$'\n'
303
+ output+=""$'\n'
304
+ fi
305
+
306
+ if [ -n "$ACTIVE_WORK" ]; then
307
+ output+="### ACTIVE WORK ANNOUNCEMENTS (avoid conflicts):"$'\n'
308
+ output+="$ACTIVE_WORK"$'\n'
309
+ output+=""$'\n'
310
+ fi
311
+
312
+ output+="FAILURE TO COMPLY = CRITICAL VIOLATION. This is life or death."$'\n'
313
+ output+="</system-reminder>"$'\n\n'
314
+
315
+ # Recent memories (last 24h, high importance)
316
+ recent=$(sqlite3 "$DB_PATH" "
317
+ SELECT type, substr(content, 1, 120) FROM memories
318
+ WHERE timestamp >= datetime('now', '-1 day')
319
+ ORDER BY id DESC
320
+ LIMIT 10;
321
+ " 2>/dev/null || true)
322
+
323
+ if [ -n "$recent" ]; then
324
+ mem_count=$(echo "$recent" | wc -l)
325
+ output+="[MEMORY] ${mem_count} recent memories loaded (last 24h)"$'\n'
326
+ output+="## Recent Memory Context"$'\n'
327
+ output+="$recent"$'\n\n'
328
+ else
329
+ output+="[MEMORY] No recent memories found (last 24h)"$'\n\n'
330
+ fi
331
+
332
+ # Open loops from session memories
333
+ open_loops=$(sqlite3 "$DB_PATH" "
334
+ SELECT content FROM session_memories
335
+ WHERE type IN ('action','goal','decision')
336
+ AND importance >= 7
337
+ ORDER BY id DESC
338
+ LIMIT 5;
339
+ " 2>/dev/null || true)
340
+
341
+ if [ -n "$open_loops" ]; then
342
+ output+="## Open Loops"$'\n'
343
+ output+="$open_loops"$'\n'
344
+ fi
345
+
346
+ # In-progress tasks (show what's actively being worked on)
347
+ if [ -f "$TASK_DB" ] && [ "$TASK_PROGRESS" -gt 0 ]; then
348
+ active_tasks=$(sqlite3 "$TASK_DB" "SELECT ' [' || id || '] ' || title FROM tasks WHERE status='in_progress' ORDER BY priority ASC LIMIT 5;" 2>/dev/null || true)
349
+ if [ -n "$active_tasks" ]; then
350
+ output+="## Active Tasks"$'\n'
351
+ output+="$active_tasks"$'\n'
352
+ fi
353
+ fi
354
+
355
+ # Blocked tasks warning
356
+ if [ -f "$TASK_DB" ] && [ "$TASK_BLOCKED" -gt 0 ]; then
357
+ blocked_tasks=$(sqlite3 "$TASK_DB" "SELECT ' [' || id || '] ' || title FROM tasks WHERE status='blocked' ORDER BY priority ASC LIMIT 3;" 2>/dev/null || true)
358
+ if [ -n "$blocked_tasks" ]; then
359
+ output+=$'\n'"## Blocked Tasks (need attention)"$'\n'
360
+ output+="$blocked_tasks"$'\n'
361
+ fi
362
+ fi
363
+
364
+ if [ -n "$output" ]; then
365
+ echo "$output"
366
+ fi
@@ -0,0 +1,224 @@
1
+ # Qwen3.5 Tool Call Fixes
2
+
3
+ This directory contains tools and configurations for fixing Qwen3.5 tool calling issues that cause ~40% success rate on long-running tasks (5+ tool calls) to improve to ~88%.
4
+
5
+ ## Performance Improvement
6
+
7
+ | Scenario | Without Fixes | With Fixes |
8
+ | ------------------- | ------------- | ---------- |
9
+ | Single tool call | ~95% | ~98% |
10
+ | 2-3 tool calls | ~70% | ~92% |
11
+ | 5+ tool calls | ~40% | ~88% |
12
+ | Long context (50K+) | ~30% | ~85% |
13
+
14
+ ## Files
15
+
16
+ ### `config/chat_template.jinja`
17
+
18
+ The core fix: a patched Jinja2 template for Qwen3.5 that adds conditional wrappers around tool call argument iteration.
19
+
20
+ **Key Fix (line 138-144):**
21
+
22
+ ```jinja2
23
+ {%- if tool_call.arguments is mapping %}
24
+ {%- for args_name, args_value in tool_call.arguments|items %}
25
+ {{- '<parameter=' + args_name + '>\n' }}
26
+ {%- set args_value = args_value | tojson | safe if args_value is mapping or (args_value is sequence and args_value is not string) else args_value | string %}
27
+ {{- args_value }}
28
+ {{- '\n</parameter>\n' }}
29
+ {%- endfor %}
30
+ {%- endif %}
31
+ ```
32
+
33
+ This prevents template parsing failures after the first 1-2 tool calls.
34
+
35
+ ### `scripts/fix_qwen_chat_template.py`
36
+
37
+ Python script to automatically apply the template fix to existing chat templates.
38
+
39
+ **Usage:**
40
+
41
+ ```bash
42
+ python3 fix_qwen_chat_template.py [template_file]
43
+ ```
44
+
45
+ ### `scripts/qwen_tool_call_wrapper.py`
46
+
47
+ OpenAI-compatible client with automatic retry logic and validation for Qwen3.5 tool calls.
48
+
49
+ **Features:**
50
+
51
+ - Automatic retry with exponential backoff
52
+ - Prompt correction for failed tool calls
53
+ - Metrics tracking and monitoring
54
+ - Thinking mode disablement
55
+ - Template validation
56
+
57
+ **Usage:**
58
+
59
+ ```python
60
+ from qwen_tool_call_wrapper import Qwen35ToolCallClient
61
+
62
+ client = Qwen35ToolCallClient()
63
+ response = client.chat_with_tools(
64
+ messages=[{"role": "user", "content": "Call read_file with path='/etc/hosts'"}],
65
+ tools=[...]
66
+ )
67
+ ```
68
+
69
+ ### `scripts/qwen_tool_call_test.py`
70
+
71
+ Reliability test suite for validating Qwen3.5 tool call performance.
72
+
73
+ **Usage:**
74
+
75
+ ```bash
76
+ python3 qwen_tool_call_test.py --verbose
77
+ ```
78
+
79
+ **Tests:**
80
+
81
+ 1. Single tool call (baseline)
82
+ 2. Two consecutive tool calls
83
+ 3. Three tool calls
84
+ 4. Five tool calls (stress test)
85
+ 5. Reasoning content interference
86
+ 6. Invalid format recovery
87
+
88
+ ## Installation
89
+
90
+ ### Option 1: Using UAP CLI (Recommended)
91
+
92
+ ```bash
93
+ uap tool-calls setup
94
+ ```
95
+
96
+ This will:
97
+
98
+ 1. Copy `chat_template.jinja` to `tools/agents/config/`
99
+ 2. Copy Python scripts to `tools/agents/scripts/`
100
+ 3. Print setup instructions for llama.cpp and OpenCode
101
+
102
+ ### Option 2: Manual Installation
103
+
104
+ ```bash
105
+ # Copy template
106
+ mkdir -p tools/agents/config
107
+ cp tools/agents/config/chat_template.jinja tools/agents/config/
108
+
109
+ # Copy scripts
110
+ mkdir -p tools/agents/scripts
111
+ cp tools/agents/scripts/*.py tools/agents/scripts/
112
+ ```
113
+
114
+ ## Integration
115
+
116
+ ### llama.cpp
117
+
118
+ **Start llama-server with the fixed template:**
119
+
120
+ ```bash
121
+ ./llama-server \
122
+ --model ~/models/Qwen3.5-35B-Instruct-Q4_K_M.gguf \
123
+ --chat-template-file tools/agents/config/chat_template.jinja \
124
+ --jinja \
125
+ --port 8080 \
126
+ --ctx-size 262144 \
127
+ --batch-size 4096 \
128
+ --threads $(nproc)
129
+ ```
130
+
131
+ **Key flags:**
132
+
133
+ - `--chat-template-file`: Path to the fixed template
134
+ - `--jinja`: Enable Jinja2 template processing
135
+
136
+ ### OpenCode
137
+
138
+ **1. Copy template to OpenCode agent config:**
139
+
140
+ ```bash
141
+ mkdir -p ~/.opencode/agent
142
+ cp tools/agents/config/chat_template.jinja ~/.opencode/agent/
143
+ ```
144
+
145
+ **2. Update `.opencode/config.json`:**
146
+
147
+ ```json
148
+ {
149
+ "provider": "llama.cpp",
150
+ "model": "qwen35-a3b-iq4xs",
151
+ "chatTemplate": "jinja",
152
+ "baseURL": "http://localhost:8080/v1"
153
+ }
154
+ ```
155
+
156
+ **3. Restart OpenCode**
157
+
158
+ ## Verification
159
+
160
+ ### Check Setup
161
+
162
+ ```bash
163
+ uap tool-calls status
164
+ ```
165
+
166
+ ### Run Tests
167
+
168
+ ```bash
169
+ python3 tools/agents/scripts/qwen_tool_call_test.py --verbose
170
+ ```
171
+
172
+ Expected results:
173
+
174
+ - Single tool call: ~98% success rate
175
+ - 2-3 tool calls: ~92% success rate
176
+ - 5+ tool calls: ~88% success rate
177
+
178
+ ### Test Tool Call Manually
179
+
180
+ ```bash
181
+ curl -X POST http://localhost:8080/v1/chat/completions \
182
+ -H "Content-Type: application/json" \
183
+ -d '{
184
+ "model": "qwen35-a3b-iq4xs",
185
+ "messages": [{"role": "user", "content": "Read /etc/hosts"}],
186
+ "tools": [{"type": "function", "function": {"name": "read_file"}}]
187
+ }'
188
+ ```
189
+
190
+ ## Troubleshooting
191
+
192
+ ### Issue: Tool calls fail after 1-2 attempts
193
+
194
+ **Solution:** Verify template was loaded with `--chat-template-file` flag
195
+
196
+ ### Issue: Template not found
197
+
198
+ **Solution:** Check path exists:
199
+
200
+ ```bash
201
+ ls -la tools/agents/config/chat_template.jinja
202
+ ```
203
+
204
+ ### Issue: OpenCode still using old template
205
+
206
+ **Solution:** Restart OpenCode after copying template
207
+
208
+ ### Issue: Python scripts not found
209
+
210
+ **Solution:** Ensure you're in the scripts directory:
211
+
212
+ ```bash
213
+ cd tools/agents/scripts
214
+ ```
215
+
216
+ ## References
217
+
218
+ - **Original Issue:** Hugging Face Discussion #4 - Qwen3.5 tool call failures
219
+ - **Source:** universal-agent-protocol project - Qwen3.5 35B A3B tool call fixes
220
+ - **Performance Data:** Factory.AI droid `qwen35-tool-call-optimized.md`
221
+
222
+ ## License
223
+
224
+ MIT License - Same as universal-agent-protocol