universal-agent-protocol 0.5.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 (415) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +462 -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 +656 -0
  6. package/dist/analyzers/index.js.map +1 -0
  7. package/dist/bin/cli.d.ts +3 -0
  8. package/dist/bin/cli.d.ts.map +1 -0
  9. package/dist/bin/cli.js +506 -0
  10. package/dist/bin/cli.js.map +1 -0
  11. package/dist/bin/tool-calls.d.ts +3 -0
  12. package/dist/bin/tool-calls.d.ts.map +1 -0
  13. package/dist/bin/tool-calls.js +4 -0
  14. package/dist/bin/tool-calls.js.map +1 -0
  15. package/dist/cli/agent.d.ts +20 -0
  16. package/dist/cli/agent.d.ts.map +1 -0
  17. package/dist/cli/agent.js +434 -0
  18. package/dist/cli/agent.js.map +1 -0
  19. package/dist/cli/analyze.d.ts +7 -0
  20. package/dist/cli/analyze.d.ts.map +1 -0
  21. package/dist/cli/analyze.js +103 -0
  22. package/dist/cli/analyze.js.map +1 -0
  23. package/dist/cli/coord.d.ts +7 -0
  24. package/dist/cli/coord.d.ts.map +1 -0
  25. package/dist/cli/coord.js +138 -0
  26. package/dist/cli/coord.js.map +1 -0
  27. package/dist/cli/dashboard.d.ts +8 -0
  28. package/dist/cli/dashboard.d.ts.map +1 -0
  29. package/dist/cli/dashboard.js +704 -0
  30. package/dist/cli/dashboard.js.map +1 -0
  31. package/dist/cli/deploy.d.ts +19 -0
  32. package/dist/cli/deploy.d.ts.map +1 -0
  33. package/dist/cli/deploy.js +267 -0
  34. package/dist/cli/deploy.js.map +1 -0
  35. package/dist/cli/droids.d.ts +9 -0
  36. package/dist/cli/droids.d.ts.map +1 -0
  37. package/dist/cli/droids.js +227 -0
  38. package/dist/cli/droids.js.map +1 -0
  39. package/dist/cli/generate.d.ts +17 -0
  40. package/dist/cli/generate.d.ts.map +1 -0
  41. package/dist/cli/generate.js +432 -0
  42. package/dist/cli/generate.js.map +1 -0
  43. package/dist/cli/hooks.d.ts +9 -0
  44. package/dist/cli/hooks.d.ts.map +1 -0
  45. package/dist/cli/hooks.js +374 -0
  46. package/dist/cli/hooks.js.map +1 -0
  47. package/dist/cli/init.d.ts +11 -0
  48. package/dist/cli/init.d.ts.map +1 -0
  49. package/dist/cli/init.js +316 -0
  50. package/dist/cli/init.js.map +1 -0
  51. package/dist/cli/mcp-router.d.ts +16 -0
  52. package/dist/cli/mcp-router.d.ts.map +1 -0
  53. package/dist/cli/mcp-router.js +143 -0
  54. package/dist/cli/mcp-router.js.map +1 -0
  55. package/dist/cli/memory.d.ts +24 -0
  56. package/dist/cli/memory.d.ts.map +1 -0
  57. package/dist/cli/memory.js +877 -0
  58. package/dist/cli/memory.js.map +1 -0
  59. package/dist/cli/model.d.ts +15 -0
  60. package/dist/cli/model.d.ts.map +1 -0
  61. package/dist/cli/model.js +270 -0
  62. package/dist/cli/model.js.map +1 -0
  63. package/dist/cli/patterns.d.ts +26 -0
  64. package/dist/cli/patterns.d.ts.map +1 -0
  65. package/dist/cli/patterns.js +587 -0
  66. package/dist/cli/patterns.js.map +1 -0
  67. package/dist/cli/setup-mcp-router.d.ts +8 -0
  68. package/dist/cli/setup-mcp-router.d.ts.map +1 -0
  69. package/dist/cli/setup-mcp-router.js +163 -0
  70. package/dist/cli/setup-mcp-router.js.map +1 -0
  71. package/dist/cli/setup.d.ts +13 -0
  72. package/dist/cli/setup.d.ts.map +1 -0
  73. package/dist/cli/setup.js +146 -0
  74. package/dist/cli/setup.js.map +1 -0
  75. package/dist/cli/sync.d.ts +7 -0
  76. package/dist/cli/sync.d.ts.map +1 -0
  77. package/dist/cli/sync.js +26 -0
  78. package/dist/cli/sync.js.map +1 -0
  79. package/dist/cli/task.d.ts +33 -0
  80. package/dist/cli/task.d.ts.map +1 -0
  81. package/dist/cli/task.js +616 -0
  82. package/dist/cli/task.js.map +1 -0
  83. package/dist/cli/tool-calls.d.ts +8 -0
  84. package/dist/cli/tool-calls.d.ts.map +1 -0
  85. package/dist/cli/tool-calls.js +239 -0
  86. package/dist/cli/tool-calls.js.map +1 -0
  87. package/dist/cli/update.d.ts +10 -0
  88. package/dist/cli/update.d.ts.map +1 -0
  89. package/dist/cli/update.js +300 -0
  90. package/dist/cli/update.js.map +1 -0
  91. package/dist/cli/visualize.d.ts +77 -0
  92. package/dist/cli/visualize.d.ts.map +1 -0
  93. package/dist/cli/visualize.js +287 -0
  94. package/dist/cli/visualize.js.map +1 -0
  95. package/dist/cli/worktree.d.ts +9 -0
  96. package/dist/cli/worktree.d.ts.map +1 -0
  97. package/dist/cli/worktree.js +175 -0
  98. package/dist/cli/worktree.js.map +1 -0
  99. package/dist/coordination/capability-router.d.ts +79 -0
  100. package/dist/coordination/capability-router.d.ts.map +1 -0
  101. package/dist/coordination/capability-router.js +324 -0
  102. package/dist/coordination/capability-router.js.map +1 -0
  103. package/dist/coordination/database.d.ts +13 -0
  104. package/dist/coordination/database.d.ts.map +1 -0
  105. package/dist/coordination/database.js +131 -0
  106. package/dist/coordination/database.js.map +1 -0
  107. package/dist/coordination/deploy-batcher.d.ts +101 -0
  108. package/dist/coordination/deploy-batcher.d.ts.map +1 -0
  109. package/dist/coordination/deploy-batcher.js +565 -0
  110. package/dist/coordination/deploy-batcher.js.map +1 -0
  111. package/dist/coordination/index.d.ts +5 -0
  112. package/dist/coordination/index.d.ts.map +1 -0
  113. package/dist/coordination/index.js +5 -0
  114. package/dist/coordination/index.js.map +1 -0
  115. package/dist/coordination/service.d.ts +81 -0
  116. package/dist/coordination/service.d.ts.map +1 -0
  117. package/dist/coordination/service.js +603 -0
  118. package/dist/coordination/service.js.map +1 -0
  119. package/dist/generators/claude-md.d.ts +3 -0
  120. package/dist/generators/claude-md.d.ts.map +1 -0
  121. package/dist/generators/claude-md.js +977 -0
  122. package/dist/generators/claude-md.js.map +1 -0
  123. package/dist/generators/template-loader.d.ts +105 -0
  124. package/dist/generators/template-loader.d.ts.map +1 -0
  125. package/dist/generators/template-loader.js +291 -0
  126. package/dist/generators/template-loader.js.map +1 -0
  127. package/dist/index.d.ts +47 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +59 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/mcp-router/config/parser.d.ts +9 -0
  132. package/dist/mcp-router/config/parser.d.ts.map +1 -0
  133. package/dist/mcp-router/config/parser.js +174 -0
  134. package/dist/mcp-router/config/parser.js.map +1 -0
  135. package/dist/mcp-router/executor/client.d.ts +31 -0
  136. package/dist/mcp-router/executor/client.d.ts.map +1 -0
  137. package/dist/mcp-router/executor/client.js +187 -0
  138. package/dist/mcp-router/executor/client.js.map +1 -0
  139. package/dist/mcp-router/index.d.ts +22 -0
  140. package/dist/mcp-router/index.d.ts.map +1 -0
  141. package/dist/mcp-router/index.js +18 -0
  142. package/dist/mcp-router/index.js.map +1 -0
  143. package/dist/mcp-router/output-compressor.d.ts +26 -0
  144. package/dist/mcp-router/output-compressor.d.ts.map +1 -0
  145. package/dist/mcp-router/output-compressor.js +236 -0
  146. package/dist/mcp-router/output-compressor.js.map +1 -0
  147. package/dist/mcp-router/search/fuzzy.d.ts +26 -0
  148. package/dist/mcp-router/search/fuzzy.d.ts.map +1 -0
  149. package/dist/mcp-router/search/fuzzy.js +94 -0
  150. package/dist/mcp-router/search/fuzzy.js.map +1 -0
  151. package/dist/mcp-router/server.d.ts +50 -0
  152. package/dist/mcp-router/server.d.ts.map +1 -0
  153. package/dist/mcp-router/server.js +229 -0
  154. package/dist/mcp-router/server.js.map +1 -0
  155. package/dist/mcp-router/session-stats.d.ts +37 -0
  156. package/dist/mcp-router/session-stats.d.ts.map +1 -0
  157. package/dist/mcp-router/session-stats.js +56 -0
  158. package/dist/mcp-router/session-stats.js.map +1 -0
  159. package/dist/mcp-router/tools/discover.d.ts +37 -0
  160. package/dist/mcp-router/tools/discover.d.ts.map +1 -0
  161. package/dist/mcp-router/tools/discover.js +65 -0
  162. package/dist/mcp-router/tools/discover.js.map +1 -0
  163. package/dist/mcp-router/tools/execute.d.ts +43 -0
  164. package/dist/mcp-router/tools/execute.d.ts.map +1 -0
  165. package/dist/mcp-router/tools/execute.js +103 -0
  166. package/dist/mcp-router/tools/execute.js.map +1 -0
  167. package/dist/mcp-router/types.d.ts +62 -0
  168. package/dist/mcp-router/types.d.ts.map +1 -0
  169. package/dist/mcp-router/types.js +6 -0
  170. package/dist/mcp-router/types.js.map +1 -0
  171. package/dist/memory/adaptive-context.d.ts +146 -0
  172. package/dist/memory/adaptive-context.d.ts.map +1 -0
  173. package/dist/memory/adaptive-context.js +1022 -0
  174. package/dist/memory/adaptive-context.js.map +1 -0
  175. package/dist/memory/agent-scoped-memory.d.ts +67 -0
  176. package/dist/memory/agent-scoped-memory.d.ts.map +1 -0
  177. package/dist/memory/agent-scoped-memory.js +126 -0
  178. package/dist/memory/agent-scoped-memory.js.map +1 -0
  179. package/dist/memory/backends/base.d.ts +18 -0
  180. package/dist/memory/backends/base.d.ts.map +1 -0
  181. package/dist/memory/backends/base.js +2 -0
  182. package/dist/memory/backends/base.js.map +1 -0
  183. package/dist/memory/backends/factory.d.ts +4 -0
  184. package/dist/memory/backends/factory.d.ts.map +1 -0
  185. package/dist/memory/backends/factory.js +53 -0
  186. package/dist/memory/backends/factory.js.map +1 -0
  187. package/dist/memory/backends/github.d.ts +22 -0
  188. package/dist/memory/backends/github.d.ts.map +1 -0
  189. package/dist/memory/backends/github.js +118 -0
  190. package/dist/memory/backends/github.js.map +1 -0
  191. package/dist/memory/backends/qdrant-cloud.d.ts +32 -0
  192. package/dist/memory/backends/qdrant-cloud.d.ts.map +1 -0
  193. package/dist/memory/backends/qdrant-cloud.js +168 -0
  194. package/dist/memory/backends/qdrant-cloud.js.map +1 -0
  195. package/dist/memory/context-compressor.d.ts +74 -0
  196. package/dist/memory/context-compressor.d.ts.map +1 -0
  197. package/dist/memory/context-compressor.js +289 -0
  198. package/dist/memory/context-compressor.js.map +1 -0
  199. package/dist/memory/correction-propagator.d.ts +44 -0
  200. package/dist/memory/correction-propagator.d.ts.map +1 -0
  201. package/dist/memory/correction-propagator.js +156 -0
  202. package/dist/memory/correction-propagator.js.map +1 -0
  203. package/dist/memory/daily-log.d.ts +67 -0
  204. package/dist/memory/daily-log.d.ts.map +1 -0
  205. package/dist/memory/daily-log.js +143 -0
  206. package/dist/memory/daily-log.js.map +1 -0
  207. package/dist/memory/dynamic-retrieval.d.ts +110 -0
  208. package/dist/memory/dynamic-retrieval.d.ts.map +1 -0
  209. package/dist/memory/dynamic-retrieval.js +688 -0
  210. package/dist/memory/dynamic-retrieval.js.map +1 -0
  211. package/dist/memory/embeddings.d.ts +116 -0
  212. package/dist/memory/embeddings.d.ts.map +1 -0
  213. package/dist/memory/embeddings.js +461 -0
  214. package/dist/memory/embeddings.js.map +1 -0
  215. package/dist/memory/hierarchical-memory.d.ts +141 -0
  216. package/dist/memory/hierarchical-memory.d.ts.map +1 -0
  217. package/dist/memory/hierarchical-memory.js +477 -0
  218. package/dist/memory/hierarchical-memory.js.map +1 -0
  219. package/dist/memory/memory-consolidator.d.ts +124 -0
  220. package/dist/memory/memory-consolidator.d.ts.map +1 -0
  221. package/dist/memory/memory-consolidator.js +514 -0
  222. package/dist/memory/memory-consolidator.js.map +1 -0
  223. package/dist/memory/memory-maintenance.d.ts +39 -0
  224. package/dist/memory/memory-maintenance.d.ts.map +1 -0
  225. package/dist/memory/memory-maintenance.js +305 -0
  226. package/dist/memory/memory-maintenance.js.map +1 -0
  227. package/dist/memory/model-router.d.ts +102 -0
  228. package/dist/memory/model-router.d.ts.map +1 -0
  229. package/dist/memory/model-router.js +448 -0
  230. package/dist/memory/model-router.js.map +1 -0
  231. package/dist/memory/multi-view-memory.d.ts +134 -0
  232. package/dist/memory/multi-view-memory.d.ts.map +1 -0
  233. package/dist/memory/multi-view-memory.js +420 -0
  234. package/dist/memory/multi-view-memory.js.map +1 -0
  235. package/dist/memory/prepopulate.d.ts +76 -0
  236. package/dist/memory/prepopulate.d.ts.map +1 -0
  237. package/dist/memory/prepopulate.js +815 -0
  238. package/dist/memory/prepopulate.js.map +1 -0
  239. package/dist/memory/semantic-compression.d.ts +77 -0
  240. package/dist/memory/semantic-compression.d.ts.map +1 -0
  241. package/dist/memory/semantic-compression.js +348 -0
  242. package/dist/memory/semantic-compression.js.map +1 -0
  243. package/dist/memory/serverless-qdrant.d.ts +102 -0
  244. package/dist/memory/serverless-qdrant.d.ts.map +1 -0
  245. package/dist/memory/serverless-qdrant.js +369 -0
  246. package/dist/memory/serverless-qdrant.js.map +1 -0
  247. package/dist/memory/short-term/factory.d.ts +26 -0
  248. package/dist/memory/short-term/factory.d.ts.map +1 -0
  249. package/dist/memory/short-term/factory.js +28 -0
  250. package/dist/memory/short-term/factory.js.map +1 -0
  251. package/dist/memory/short-term/indexeddb.d.ts +25 -0
  252. package/dist/memory/short-term/indexeddb.d.ts.map +1 -0
  253. package/dist/memory/short-term/indexeddb.js +64 -0
  254. package/dist/memory/short-term/indexeddb.js.map +1 -0
  255. package/dist/memory/short-term/schema.d.ts +6 -0
  256. package/dist/memory/short-term/schema.d.ts.map +1 -0
  257. package/dist/memory/short-term/schema.js +119 -0
  258. package/dist/memory/short-term/schema.js.map +1 -0
  259. package/dist/memory/short-term/sqlite.d.ts +50 -0
  260. package/dist/memory/short-term/sqlite.d.ts.map +1 -0
  261. package/dist/memory/short-term/sqlite.js +221 -0
  262. package/dist/memory/short-term/sqlite.js.map +1 -0
  263. package/dist/memory/speculative-cache.d.ts +111 -0
  264. package/dist/memory/speculative-cache.d.ts.map +1 -0
  265. package/dist/memory/speculative-cache.js +409 -0
  266. package/dist/memory/speculative-cache.js.map +1 -0
  267. package/dist/memory/task-classifier.d.ts +34 -0
  268. package/dist/memory/task-classifier.d.ts.map +1 -0
  269. package/dist/memory/task-classifier.js +300 -0
  270. package/dist/memory/task-classifier.js.map +1 -0
  271. package/dist/memory/terminal-bench-knowledge.d.ts +48 -0
  272. package/dist/memory/terminal-bench-knowledge.d.ts.map +1 -0
  273. package/dist/memory/terminal-bench-knowledge.js +399 -0
  274. package/dist/memory/terminal-bench-knowledge.js.map +1 -0
  275. package/dist/memory/write-gate.d.ts +39 -0
  276. package/dist/memory/write-gate.d.ts.map +1 -0
  277. package/dist/memory/write-gate.js +190 -0
  278. package/dist/memory/write-gate.js.map +1 -0
  279. package/dist/models/executor.d.ts +130 -0
  280. package/dist/models/executor.d.ts.map +1 -0
  281. package/dist/models/executor.js +383 -0
  282. package/dist/models/executor.js.map +1 -0
  283. package/dist/models/index.d.ts +15 -0
  284. package/dist/models/index.d.ts.map +1 -0
  285. package/dist/models/index.js +17 -0
  286. package/dist/models/index.js.map +1 -0
  287. package/dist/models/planner.d.ts +71 -0
  288. package/dist/models/planner.d.ts.map +1 -0
  289. package/dist/models/planner.js +344 -0
  290. package/dist/models/planner.js.map +1 -0
  291. package/dist/models/router.d.ts +75 -0
  292. package/dist/models/router.d.ts.map +1 -0
  293. package/dist/models/router.js +344 -0
  294. package/dist/models/router.js.map +1 -0
  295. package/dist/models/types.d.ts +370 -0
  296. package/dist/models/types.d.ts.map +1 -0
  297. package/dist/models/types.js +181 -0
  298. package/dist/models/types.js.map +1 -0
  299. package/dist/tasks/coordination.d.ts +74 -0
  300. package/dist/tasks/coordination.d.ts.map +1 -0
  301. package/dist/tasks/coordination.js +237 -0
  302. package/dist/tasks/coordination.js.map +1 -0
  303. package/dist/tasks/database.d.ts +14 -0
  304. package/dist/tasks/database.d.ts.map +1 -0
  305. package/dist/tasks/database.js +128 -0
  306. package/dist/tasks/database.js.map +1 -0
  307. package/dist/tasks/index.d.ts +5 -0
  308. package/dist/tasks/index.d.ts.map +1 -0
  309. package/dist/tasks/index.js +5 -0
  310. package/dist/tasks/index.js.map +1 -0
  311. package/dist/tasks/service.d.ts +39 -0
  312. package/dist/tasks/service.d.ts.map +1 -0
  313. package/dist/tasks/service.js +582 -0
  314. package/dist/tasks/service.js.map +1 -0
  315. package/dist/tasks/types.d.ts +224 -0
  316. package/dist/tasks/types.d.ts.map +1 -0
  317. package/dist/tasks/types.js +64 -0
  318. package/dist/tasks/types.js.map +1 -0
  319. package/dist/types/analysis.d.ts +82 -0
  320. package/dist/types/analysis.d.ts.map +1 -0
  321. package/dist/types/analysis.js +2 -0
  322. package/dist/types/analysis.js.map +1 -0
  323. package/dist/types/config.d.ts +3023 -0
  324. package/dist/types/config.d.ts.map +1 -0
  325. package/dist/types/config.js +292 -0
  326. package/dist/types/config.js.map +1 -0
  327. package/dist/types/coordination.d.ts +240 -0
  328. package/dist/types/coordination.d.ts.map +1 -0
  329. package/dist/types/coordination.js +43 -0
  330. package/dist/types/coordination.js.map +1 -0
  331. package/dist/types/index.d.ts +4 -0
  332. package/dist/types/index.d.ts.map +1 -0
  333. package/dist/types/index.js +4 -0
  334. package/dist/types/index.js.map +1 -0
  335. package/dist/utils/calculate-average.d.ts +15 -0
  336. package/dist/utils/calculate-average.d.ts.map +1 -0
  337. package/dist/utils/calculate-average.js +21 -0
  338. package/dist/utils/calculate-average.js.map +1 -0
  339. package/dist/utils/config-manager.d.ts +30 -0
  340. package/dist/utils/config-manager.d.ts.map +1 -0
  341. package/dist/utils/config-manager.js +41 -0
  342. package/dist/utils/config-manager.js.map +1 -0
  343. package/dist/utils/dijkstra.d.ts +17 -0
  344. package/dist/utils/dijkstra.d.ts.map +1 -0
  345. package/dist/utils/dijkstra.js +91 -0
  346. package/dist/utils/dijkstra.js.map +1 -0
  347. package/dist/utils/fetch-with-retry.d.ts +5 -0
  348. package/dist/utils/fetch-with-retry.d.ts.map +1 -0
  349. package/dist/utils/fetch-with-retry.js +61 -0
  350. package/dist/utils/fetch-with-retry.js.map +1 -0
  351. package/dist/utils/merge-claude-md.d.ts +28 -0
  352. package/dist/utils/merge-claude-md.d.ts.map +1 -0
  353. package/dist/utils/merge-claude-md.js +342 -0
  354. package/dist/utils/merge-claude-md.js.map +1 -0
  355. package/dist/utils/order-processor-refactored.d.ts +126 -0
  356. package/dist/utils/order-processor-refactored.d.ts.map +1 -0
  357. package/dist/utils/order-processor-refactored.js +165 -0
  358. package/dist/utils/order-processor-refactored.js.map +1 -0
  359. package/dist/utils/order-processor-strategy.d.ts +72 -0
  360. package/dist/utils/order-processor-strategy.d.ts.map +1 -0
  361. package/dist/utils/order-processor-strategy.js +158 -0
  362. package/dist/utils/order-processor-strategy.js.map +1 -0
  363. package/dist/utils/order-processor.d.ts +242 -0
  364. package/dist/utils/order-processor.d.ts.map +1 -0
  365. package/dist/utils/order-processor.js +370 -0
  366. package/dist/utils/order-processor.js.map +1 -0
  367. package/dist/utils/rate-limiter-simple.d.ts +58 -0
  368. package/dist/utils/rate-limiter-simple.d.ts.map +1 -0
  369. package/dist/utils/rate-limiter-simple.js +100 -0
  370. package/dist/utils/rate-limiter-simple.js.map +1 -0
  371. package/dist/utils/rate-limiter.d.ts +62 -0
  372. package/dist/utils/rate-limiter.d.ts.map +1 -0
  373. package/dist/utils/rate-limiter.js +150 -0
  374. package/dist/utils/rate-limiter.js.map +1 -0
  375. package/dist/utils/string-similarity.d.ts +37 -0
  376. package/dist/utils/string-similarity.d.ts.map +1 -0
  377. package/dist/utils/string-similarity.js +114 -0
  378. package/dist/utils/string-similarity.js.map +1 -0
  379. package/dist/utils/validate-json.d.ts +51 -0
  380. package/dist/utils/validate-json.d.ts.map +1 -0
  381. package/dist/utils/validate-json.js +99 -0
  382. package/dist/utils/validate-json.js.map +1 -0
  383. package/package.json +96 -0
  384. package/templates/CLAUDE.template.md +11 -0
  385. package/templates/CLAUDE_ARCHITECTURE.template.md +103 -0
  386. package/templates/CLAUDE_CODING.template.md +125 -0
  387. package/templates/CLAUDE_DROIDS.template.md +109 -0
  388. package/templates/CLAUDE_MEMORY.template.md +130 -0
  389. package/templates/CLAUDE_WORKFLOWS.template.md +136 -0
  390. package/templates/PROJECT.template.md +209 -0
  391. package/templates/SCHEMA.md +57 -0
  392. package/templates/archive/CLAUDE.template.root-v6.md +762 -0
  393. package/templates/archive/CLAUDE.template.v6.md +762 -0
  394. package/templates/hooks/pre-compact.sh +68 -0
  395. package/templates/hooks/session-start.sh +106 -0
  396. package/tools/agents/README.md +224 -0
  397. package/tools/agents/UAP/README.md +351 -0
  398. package/tools/agents/UAP/__init__.py +9 -0
  399. package/tools/agents/UAP/cli.py +675 -0
  400. package/tools/agents/UAP/version.py +2 -0
  401. package/tools/agents/benchmarks/benchmark_memory_systems.py +637 -0
  402. package/tools/agents/benchmarks/results/benchmark_20260106_064817.json +170 -0
  403. package/tools/agents/benchmarks/results/benchmark_20260106_064817.md +51 -0
  404. package/tools/agents/config/chat_template.jinja +172 -0
  405. package/tools/agents/docker-compose.qdrant.yml +24 -0
  406. package/tools/agents/migrations/apply.py +256 -0
  407. package/tools/agents/scripts/fix_qwen_chat_template.py +314 -0
  408. package/tools/agents/scripts/init_qdrant.py +151 -0
  409. package/tools/agents/scripts/memory_migration.py +518 -0
  410. package/tools/agents/scripts/migrate_memory_to_qdrant.py +113 -0
  411. package/tools/agents/scripts/query_memory.py +189 -0
  412. package/tools/agents/scripts/qwen_tool_call_test.py +419 -0
  413. package/tools/agents/scripts/qwen_tool_call_wrapper.py +517 -0
  414. package/tools/agents/scripts/start-services.sh +96 -0
  415. package/tools/agents/tests/test_uap_compliance.py +257 -0
@@ -0,0 +1,81 @@
1
+ import type { AgentRegistryEntry, AgentMessage, WorkClaim, WorkAnnouncement, WorkOverlap, CollaborationSuggestion, DeployAction, CoordinationStatus, AgentStatus, MessageChannel, ClaimType, WorkIntentType, DeployActionType, DeployStatus, MessagePayload } from '../types/coordination.js';
2
+ export interface CoordinationServiceConfig {
3
+ dbPath?: string;
4
+ sessionId?: string;
5
+ heartbeatIntervalMs?: number;
6
+ claimExpiryMs?: number;
7
+ }
8
+ export declare class CoordinationService {
9
+ private db;
10
+ private sessionId;
11
+ private heartbeatIntervalMs;
12
+ private claimExpiryMs;
13
+ constructor(config?: CoordinationServiceConfig);
14
+ register(name: string, capabilities?: string[], worktreeBranch?: string): string;
15
+ heartbeat(agentId: string): void;
16
+ updateStatus(agentId: string, status: AgentStatus, currentTask?: string): void;
17
+ deregister(agentId: string): void;
18
+ getAgent(agentId: string): AgentRegistryEntry | null;
19
+ getActiveAgents(): AgentRegistryEntry[];
20
+ cleanupStaleAgents(): number;
21
+ cleanupStaleAgentsByTime(hours?: number): number;
22
+ private cleanupAgentsOlderThan;
23
+ claimResource(agentId: string, resource: string, claimType?: ClaimType): boolean;
24
+ releaseResource(agentId: string, resource: string): void;
25
+ releaseAllClaims(agentId: string): void;
26
+ isResourceClaimed(resource: string): string | null;
27
+ getResourceClaims(resource: string): WorkClaim[];
28
+ getAgentClaims(agentId: string): WorkClaim[];
29
+ /**
30
+ * Announce intent to work on a resource. Does NOT lock - just informs other agents.
31
+ * Returns overlap info if other agents are also working on related resources.
32
+ */
33
+ announceWork(agentId: string, resource: string, intentType: WorkIntentType, options?: {
34
+ description?: string;
35
+ filesAffected?: string[];
36
+ estimatedMinutes?: number;
37
+ }): {
38
+ announcement: WorkAnnouncement;
39
+ overlaps: WorkOverlap[];
40
+ suggestions: CollaborationSuggestion[];
41
+ };
42
+ /**
43
+ * Mark work as complete on a resource.
44
+ */
45
+ completeWork(agentId: string, resource: string): void;
46
+ /**
47
+ * Get all active work announcements (not completed).
48
+ */
49
+ getActiveWork(): WorkAnnouncement[];
50
+ /**
51
+ * Get work announcements for a specific resource.
52
+ */
53
+ getWorkOnResource(resource: string): WorkAnnouncement[];
54
+ /**
55
+ * Detect overlapping work that might cause merge conflicts.
56
+ */
57
+ detectOverlaps(resource: string, excludeAgentId?: string): WorkOverlap[];
58
+ private assessConflictRisk;
59
+ private generateOverlapSuggestion;
60
+ /**
61
+ * Generate collaboration suggestions based on overlaps.
62
+ */
63
+ generateCollaborationSuggestions(agentId: string, _resource: string, overlaps: WorkOverlap[]): CollaborationSuggestion[];
64
+ private suggestMergeOrder;
65
+ broadcast(fromAgent: string, channel: MessageChannel, payload: MessagePayload, priority?: number): void;
66
+ send(fromAgent: string, toAgent: string, payload: MessagePayload, priority?: number): void;
67
+ private sendMessage;
68
+ receive(agentId: string, channel?: MessageChannel, markAsRead?: boolean): AgentMessage[];
69
+ getPendingMessages(agentId: string): number;
70
+ queueDeploy(agentId: string, actionType: DeployActionType, target: string, payload?: Record<string, unknown>, options?: {
71
+ priority?: number;
72
+ executeAfter?: Date;
73
+ dependencies?: string[];
74
+ }): number;
75
+ getPendingDeploys(): DeployAction[];
76
+ getReadyDeploys(): DeployAction[];
77
+ updateDeployStatus(deployId: number, status: DeployStatus, batchId?: string): void;
78
+ getStatus(): CoordinationStatus;
79
+ cleanup(): void;
80
+ }
81
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/coordination/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,603 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { CoordinationDatabase, getDefaultCoordinationDbPath } from './database.js';
3
+ export class CoordinationService {
4
+ db;
5
+ sessionId;
6
+ heartbeatIntervalMs;
7
+ claimExpiryMs;
8
+ constructor(config = {}) {
9
+ const dbPath = config.dbPath || getDefaultCoordinationDbPath();
10
+ this.db = CoordinationDatabase.getInstance(dbPath).getDatabase();
11
+ this.sessionId = config.sessionId || randomUUID();
12
+ this.heartbeatIntervalMs = config.heartbeatIntervalMs || 30000;
13
+ this.claimExpiryMs = config.claimExpiryMs || 300000; // 5 minutes
14
+ }
15
+ // ==================== Agent Lifecycle ====================
16
+ register(name, capabilities, worktreeBranch) {
17
+ const id = randomUUID();
18
+ const now = new Date().toISOString();
19
+ const stmt = this.db.prepare(`
20
+ INSERT INTO agent_registry (id, name, session_id, status, worktree_branch, started_at, last_heartbeat, capabilities)
21
+ VALUES (?, ?, ?, 'active', ?, ?, ?, ?)
22
+ `);
23
+ stmt.run(id, name, this.sessionId, worktreeBranch || null, now, now, capabilities ? JSON.stringify(capabilities) : null);
24
+ return id;
25
+ }
26
+ heartbeat(agentId) {
27
+ const stmt = this.db.prepare(`
28
+ UPDATE agent_registry
29
+ SET last_heartbeat = ?
30
+ WHERE id = ?
31
+ `);
32
+ stmt.run(new Date().toISOString(), agentId);
33
+ }
34
+ updateStatus(agentId, status, currentTask) {
35
+ const stmt = this.db.prepare(`
36
+ UPDATE agent_registry
37
+ SET status = ?, current_task = ?, last_heartbeat = ?
38
+ WHERE id = ?
39
+ `);
40
+ stmt.run(status, currentTask || null, new Date().toISOString(), agentId);
41
+ }
42
+ deregister(agentId) {
43
+ // Release all claims
44
+ this.releaseAllClaims(agentId);
45
+ // Update status
46
+ const stmt = this.db.prepare(`
47
+ UPDATE agent_registry
48
+ SET status = 'completed'
49
+ WHERE id = ?
50
+ `);
51
+ stmt.run(agentId);
52
+ }
53
+ getAgent(agentId) {
54
+ const stmt = this.db.prepare(`
55
+ SELECT id, name, session_id as sessionId, status, current_task as currentTask,
56
+ worktree_branch as worktreeBranch, started_at as startedAt,
57
+ last_heartbeat as lastHeartbeat, capabilities
58
+ FROM agent_registry
59
+ WHERE id = ?
60
+ `);
61
+ const row = stmt.get(agentId);
62
+ if (!row)
63
+ return null;
64
+ return {
65
+ ...row,
66
+ capabilities: row.capabilities ? JSON.parse(row.capabilities) : undefined,
67
+ };
68
+ }
69
+ getActiveAgents() {
70
+ const stmt = this.db.prepare(`
71
+ SELECT id, name, session_id as sessionId, status, current_task as currentTask,
72
+ worktree_branch as worktreeBranch, started_at as startedAt,
73
+ last_heartbeat as lastHeartbeat, capabilities
74
+ FROM agent_registry
75
+ WHERE status IN ('active', 'idle')
76
+ ORDER BY started_at DESC
77
+ `);
78
+ const rows = stmt.all();
79
+ return rows.map((row) => ({
80
+ ...row,
81
+ capabilities: row.capabilities ? JSON.parse(row.capabilities) : undefined,
82
+ }));
83
+ }
84
+ // Cleanup stale agents (no heartbeat for too long)
85
+ cleanupStaleAgents() {
86
+ const cutoff = new Date(Date.now() - this.heartbeatIntervalMs * 3).toISOString();
87
+ return this.cleanupAgentsOlderThan(cutoff);
88
+ }
89
+ // Cleanup agents with heartbeat older than a specific duration in hours
90
+ cleanupStaleAgentsByTime(hours = 24) {
91
+ const cutoff = new Date(Date.now() - hours * 60 * 60 * 1000).toISOString();
92
+ return this.cleanupAgentsOlderThan(cutoff);
93
+ }
94
+ cleanupAgentsOlderThan(cutoff) {
95
+ // Get stale agents
96
+ const staleStmt = this.db.prepare(`
97
+ SELECT id FROM agent_registry
98
+ WHERE status IN ('active', 'idle') AND last_heartbeat < ?
99
+ `);
100
+ const staleAgents = staleStmt.all(cutoff);
101
+ // Release their claims and complete their announcements
102
+ for (const agent of staleAgents) {
103
+ this.releaseAllClaims(agent.id);
104
+ this.db.prepare(`
105
+ UPDATE work_announcements SET completed_at = ?
106
+ WHERE agent_id = ? AND completed_at IS NULL
107
+ `).run(new Date().toISOString(), agent.id);
108
+ }
109
+ // Mark as failed
110
+ const updateStmt = this.db.prepare(`
111
+ UPDATE agent_registry
112
+ SET status = 'failed'
113
+ WHERE status IN ('active', 'idle') AND last_heartbeat < ?
114
+ `);
115
+ const result = updateStmt.run(cutoff);
116
+ return result.changes;
117
+ }
118
+ // ==================== Work Claims ====================
119
+ claimResource(agentId, resource, claimType = 'exclusive') {
120
+ const now = new Date().toISOString();
121
+ const expiresAt = new Date(Date.now() + this.claimExpiryMs).toISOString();
122
+ // Check for existing exclusive claim
123
+ const checkStmt = this.db.prepare(`
124
+ SELECT agent_id, claim_type FROM work_claims
125
+ WHERE resource = ? AND (expires_at IS NULL OR expires_at > ?)
126
+ `);
127
+ const existing = checkStmt.get(resource, now);
128
+ if (existing) {
129
+ if (existing.claim_type === 'exclusive') {
130
+ return false; // Resource already exclusively claimed
131
+ }
132
+ if (claimType === 'exclusive') {
133
+ return false; // Can't get exclusive claim when shared claims exist
134
+ }
135
+ }
136
+ try {
137
+ const stmt = this.db.prepare(`
138
+ INSERT INTO work_claims (resource, agent_id, claim_type, claimed_at, expires_at)
139
+ VALUES (?, ?, ?, ?, ?)
140
+ `);
141
+ stmt.run(resource, agentId, claimType, now, expiresAt);
142
+ return true;
143
+ }
144
+ catch {
145
+ return false; // Constraint violation (duplicate exclusive claim)
146
+ }
147
+ }
148
+ releaseResource(agentId, resource) {
149
+ const stmt = this.db.prepare(`
150
+ DELETE FROM work_claims
151
+ WHERE agent_id = ? AND resource = ?
152
+ `);
153
+ stmt.run(agentId, resource);
154
+ }
155
+ releaseAllClaims(agentId) {
156
+ const stmt = this.db.prepare(`
157
+ DELETE FROM work_claims
158
+ WHERE agent_id = ?
159
+ `);
160
+ stmt.run(agentId);
161
+ }
162
+ isResourceClaimed(resource) {
163
+ const now = new Date().toISOString();
164
+ const stmt = this.db.prepare(`
165
+ SELECT agent_id FROM work_claims
166
+ WHERE resource = ? AND claim_type = 'exclusive'
167
+ AND (expires_at IS NULL OR expires_at > ?)
168
+ `);
169
+ const row = stmt.get(resource, now);
170
+ return row?.agent_id || null;
171
+ }
172
+ getResourceClaims(resource) {
173
+ const now = new Date().toISOString();
174
+ const stmt = this.db.prepare(`
175
+ SELECT id, resource, agent_id as agentId, claim_type as claimType,
176
+ claimed_at as claimedAt, expires_at as expiresAt
177
+ FROM work_claims
178
+ WHERE resource = ? AND (expires_at IS NULL OR expires_at > ?)
179
+ `);
180
+ return stmt.all(resource, now);
181
+ }
182
+ getAgentClaims(agentId) {
183
+ const stmt = this.db.prepare(`
184
+ SELECT id, resource, agent_id as agentId, claim_type as claimType,
185
+ claimed_at as claimedAt, expires_at as expiresAt
186
+ FROM work_claims
187
+ WHERE agent_id = ?
188
+ `);
189
+ return stmt.all(agentId);
190
+ }
191
+ // ==================== Work Announcements (Collaborative) ====================
192
+ // NOTE: Agents work in isolated git worktrees, so they don't NEED to claim resources.
193
+ // Announcements are informational - they help optimize velocity and minimize merge conflicts.
194
+ /**
195
+ * Announce intent to work on a resource. Does NOT lock - just informs other agents.
196
+ * Returns overlap info if other agents are also working on related resources.
197
+ */
198
+ announceWork(agentId, resource, intentType, options = {}) {
199
+ const agent = this.getAgent(agentId);
200
+ const now = new Date().toISOString();
201
+ const estimatedCompletion = options.estimatedMinutes
202
+ ? new Date(Date.now() + options.estimatedMinutes * 60000).toISOString()
203
+ : null;
204
+ const stmt = this.db.prepare(`
205
+ INSERT INTO work_announcements
206
+ (agent_id, agent_name, worktree_branch, intent_type, resource, description, files_affected, estimated_completion, announced_at)
207
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
208
+ `);
209
+ const result = stmt.run(agentId, agent?.name || null, agent?.worktreeBranch || null, intentType, resource, options.description || null, options.filesAffected ? JSON.stringify(options.filesAffected) : null, estimatedCompletion, now);
210
+ const announcement = {
211
+ id: result.lastInsertRowid,
212
+ agentId,
213
+ agentName: agent?.name,
214
+ worktreeBranch: agent?.worktreeBranch,
215
+ intentType,
216
+ resource,
217
+ description: options.description,
218
+ filesAffected: options.filesAffected,
219
+ estimatedCompletion: estimatedCompletion || undefined,
220
+ announcedAt: now,
221
+ };
222
+ // Detect overlaps and generate suggestions
223
+ const overlaps = this.detectOverlaps(resource, agentId);
224
+ const suggestions = this.generateCollaborationSuggestions(agentId, resource, overlaps);
225
+ // Broadcast to other agents about potential overlap
226
+ if (overlaps.length > 0) {
227
+ this.broadcast(agentId, 'coordination', {
228
+ action: 'work_overlap_detected',
229
+ resource,
230
+ data: { overlaps, suggestions },
231
+ });
232
+ }
233
+ return { announcement, overlaps, suggestions };
234
+ }
235
+ /**
236
+ * Mark work as complete on a resource.
237
+ */
238
+ completeWork(agentId, resource) {
239
+ const stmt = this.db.prepare(`
240
+ UPDATE work_announcements
241
+ SET completed_at = ?
242
+ WHERE agent_id = ? AND resource = ? AND completed_at IS NULL
243
+ `);
244
+ stmt.run(new Date().toISOString(), agentId, resource);
245
+ // Broadcast completion so others know merge order
246
+ this.broadcast(agentId, 'coordination', {
247
+ action: 'work_completed',
248
+ resource,
249
+ });
250
+ }
251
+ /**
252
+ * Get all active work announcements (not completed).
253
+ */
254
+ getActiveWork() {
255
+ const stmt = this.db.prepare(`
256
+ SELECT
257
+ wa.id, wa.agent_id as agentId, wa.agent_name as agentName,
258
+ wa.worktree_branch as worktreeBranch, wa.intent_type as intentType,
259
+ wa.resource, wa.description, wa.files_affected as filesAffected,
260
+ wa.estimated_completion as estimatedCompletion, wa.announced_at as announcedAt
261
+ FROM work_announcements wa
262
+ JOIN agent_registry ar ON wa.agent_id = ar.id
263
+ WHERE wa.completed_at IS NULL AND ar.status IN ('active', 'idle')
264
+ ORDER BY wa.announced_at DESC
265
+ `);
266
+ const rows = stmt.all();
267
+ return rows.map((row) => ({
268
+ ...row,
269
+ filesAffected: row.filesAffected ? JSON.parse(row.filesAffected) : undefined,
270
+ }));
271
+ }
272
+ /**
273
+ * Get work announcements for a specific resource.
274
+ */
275
+ getWorkOnResource(resource) {
276
+ const stmt = this.db.prepare(`
277
+ SELECT
278
+ wa.id, wa.agent_id as agentId, wa.agent_name as agentName,
279
+ wa.worktree_branch as worktreeBranch, wa.intent_type as intentType,
280
+ wa.resource, wa.description, wa.files_affected as filesAffected,
281
+ wa.estimated_completion as estimatedCompletion, wa.announced_at as announcedAt
282
+ FROM work_announcements wa
283
+ JOIN agent_registry ar ON wa.agent_id = ar.id
284
+ WHERE wa.resource LIKE ? AND wa.completed_at IS NULL AND ar.status IN ('active', 'idle')
285
+ ORDER BY wa.announced_at DESC
286
+ `);
287
+ const rows = stmt.all(`%${resource}%`);
288
+ return rows.map((row) => ({
289
+ ...row,
290
+ filesAffected: row.filesAffected ? JSON.parse(row.filesAffected) : undefined,
291
+ }));
292
+ }
293
+ /**
294
+ * Detect overlapping work that might cause merge conflicts.
295
+ */
296
+ detectOverlaps(resource, excludeAgentId) {
297
+ const activeWork = this.getActiveWork();
298
+ const overlaps = [];
299
+ // Group by resource pattern (file, directory, or module)
300
+ const resourceParts = resource.split('/');
301
+ const directory = resourceParts.slice(0, -1).join('/');
302
+ // Find work on same file
303
+ const sameFile = activeWork.filter((w) => w.agentId !== excludeAgentId && w.resource === resource);
304
+ // Find work on same directory
305
+ const sameDirectory = activeWork.filter((w) => w.agentId !== excludeAgentId &&
306
+ w.resource !== resource &&
307
+ w.resource.startsWith(directory + '/'));
308
+ // Find work with overlapping files
309
+ const overlappingFiles = activeWork.filter((w) => {
310
+ if (w.agentId === excludeAgentId)
311
+ return false;
312
+ if (!w.filesAffected)
313
+ return false;
314
+ return w.filesAffected.some((f) => f === resource || resource.includes(f) || f.includes(resource));
315
+ });
316
+ if (sameFile.length > 0) {
317
+ overlaps.push({
318
+ resource,
319
+ agents: sameFile.map((w) => ({
320
+ id: w.agentId,
321
+ name: w.agentName || 'unknown',
322
+ intentType: w.intentType,
323
+ worktreeBranch: w.worktreeBranch,
324
+ description: w.description,
325
+ })),
326
+ conflictRisk: this.assessConflictRisk(sameFile),
327
+ suggestion: this.generateOverlapSuggestion(sameFile, 'same_file'),
328
+ });
329
+ }
330
+ if (sameDirectory.length > 0) {
331
+ overlaps.push({
332
+ resource: directory,
333
+ agents: sameDirectory.map((w) => ({
334
+ id: w.agentId,
335
+ name: w.agentName || 'unknown',
336
+ intentType: w.intentType,
337
+ worktreeBranch: w.worktreeBranch,
338
+ description: w.description,
339
+ })),
340
+ conflictRisk: this.assessConflictRisk(sameDirectory, 'directory'),
341
+ suggestion: this.generateOverlapSuggestion(sameDirectory, 'same_directory'),
342
+ });
343
+ }
344
+ if (overlappingFiles.length > 0) {
345
+ overlaps.push({
346
+ resource: 'files_overlap',
347
+ agents: overlappingFiles.map((w) => ({
348
+ id: w.agentId,
349
+ name: w.agentName || 'unknown',
350
+ intentType: w.intentType,
351
+ worktreeBranch: w.worktreeBranch,
352
+ description: w.description,
353
+ })),
354
+ conflictRisk: 'medium',
355
+ suggestion: this.generateOverlapSuggestion(overlappingFiles, 'files_overlap'),
356
+ });
357
+ }
358
+ return overlaps;
359
+ }
360
+ assessConflictRisk(work, type = 'file') {
361
+ if (work.length === 0)
362
+ return 'none';
363
+ // Multiple agents editing same file = high risk
364
+ const editors = work.filter((w) => w.intentType === 'editing' || w.intentType === 'refactoring');
365
+ if (editors.length >= 2)
366
+ return 'critical';
367
+ if (editors.length === 1 && work.length > 1)
368
+ return 'high';
369
+ // Refactoring has higher conflict potential
370
+ if (work.some((w) => w.intentType === 'refactoring'))
371
+ return 'high';
372
+ // Directory-level work is lower risk
373
+ if (type === 'directory')
374
+ return 'medium';
375
+ // Review/test/document are low risk
376
+ const lowRiskTypes = ['reviewing', 'testing', 'documenting'];
377
+ if (work.every((w) => lowRiskTypes.includes(w.intentType)))
378
+ return 'low';
379
+ return 'medium';
380
+ }
381
+ generateOverlapSuggestion(work, type) {
382
+ const agentNames = work.map((w) => w.agentName || w.agentId.slice(0, 8)).join(', ');
383
+ switch (type) {
384
+ case 'same_file':
385
+ return `Multiple agents (${agentNames}) working on same file. Consider: ` +
386
+ `1) Coordinate merge order - who finishes first should merge first, ` +
387
+ `2) Split into non-overlapping sections, ` +
388
+ `3) One agent waits for other to complete.`;
389
+ case 'same_directory':
390
+ return `Agents (${agentNames}) working in same directory. Usually safe with worktrees, ` +
391
+ `but watch for: import changes, shared types/interfaces, barrel files (index.ts).`;
392
+ case 'files_overlap':
393
+ return `Agents (${agentNames}) have overlapping file changes. Review affected files ` +
394
+ `and coordinate merge order to minimize conflicts.`;
395
+ default:
396
+ return `Overlap detected with ${agentNames}. Coordinate to optimize velocity.`;
397
+ }
398
+ }
399
+ /**
400
+ * Generate collaboration suggestions based on overlaps.
401
+ */
402
+ generateCollaborationSuggestions(agentId, _resource, overlaps) {
403
+ const suggestions = [];
404
+ for (const overlap of overlaps) {
405
+ const allAgents = [agentId, ...overlap.agents.map((a) => a.id)];
406
+ // Critical/High risk: suggest sequential work
407
+ if (overlap.conflictRisk === 'critical' || overlap.conflictRisk === 'high') {
408
+ suggestions.push({
409
+ type: 'sequence',
410
+ agents: allAgents,
411
+ reason: `High merge conflict risk on ${overlap.resource}. Sequential work recommended.`,
412
+ suggestedOrder: this.suggestMergeOrder(overlap),
413
+ estimatedMergeComplexity: overlap.conflictRisk,
414
+ });
415
+ }
416
+ // Medium risk: suggest merge order
417
+ if (overlap.conflictRisk === 'medium') {
418
+ suggestions.push({
419
+ type: 'merge_order',
420
+ agents: allAgents,
421
+ reason: `Medium conflict risk. Agree on merge order to avoid rebase pain.`,
422
+ suggestedOrder: this.suggestMergeOrder(overlap),
423
+ estimatedMergeComplexity: 'medium',
424
+ });
425
+ }
426
+ // Low risk: parallel is fine
427
+ if (overlap.conflictRisk === 'low') {
428
+ suggestions.push({
429
+ type: 'parallel',
430
+ agents: allAgents,
431
+ reason: `Low conflict risk. Parallel work is safe. Watch for shared imports.`,
432
+ estimatedMergeComplexity: 'low',
433
+ });
434
+ }
435
+ }
436
+ return suggestions;
437
+ }
438
+ suggestMergeOrder(overlap) {
439
+ // Prefer: review/test first, then docs, then edits, then refactoring
440
+ const priorityOrder = ['reviewing', 'testing', 'documenting', 'editing', 'refactoring'];
441
+ return overlap.agents
442
+ .sort((a, b) => {
443
+ const aPriority = priorityOrder.indexOf(a.intentType);
444
+ const bPriority = priorityOrder.indexOf(b.intentType);
445
+ return aPriority - bPriority;
446
+ })
447
+ .map((a) => a.name || a.id);
448
+ }
449
+ // ==================== Messaging ====================
450
+ broadcast(fromAgent, channel, payload, priority = 5) {
451
+ this.sendMessage(fromAgent, undefined, channel, 'notification', payload, priority);
452
+ }
453
+ send(fromAgent, toAgent, payload, priority = 5) {
454
+ this.sendMessage(fromAgent, toAgent, 'direct', 'request', payload, priority);
455
+ }
456
+ sendMessage(fromAgent, toAgent, channel, type, payload, priority) {
457
+ const stmt = this.db.prepare(`
458
+ INSERT INTO agent_messages (channel, from_agent, to_agent, type, payload, priority, created_at)
459
+ VALUES (?, ?, ?, ?, ?, ?, ?)
460
+ `);
461
+ stmt.run(channel, fromAgent, toAgent, type, JSON.stringify(payload), priority, new Date().toISOString());
462
+ }
463
+ receive(agentId, channel, markAsRead = true) {
464
+ let sql = `
465
+ SELECT id, channel, from_agent as fromAgent, to_agent as toAgent, type,
466
+ payload, priority, created_at as createdAt, read_at as readAt, expires_at as expiresAt
467
+ FROM agent_messages
468
+ WHERE (to_agent = ? OR (to_agent IS NULL AND channel != 'direct'))
469
+ AND read_at IS NULL
470
+ AND (expires_at IS NULL OR expires_at > ?)
471
+ `;
472
+ const params = [agentId, new Date().toISOString()];
473
+ if (channel) {
474
+ sql += ' AND channel = ?';
475
+ params.push(channel);
476
+ }
477
+ sql += ' ORDER BY priority DESC, created_at ASC';
478
+ const stmt = this.db.prepare(sql);
479
+ const rows = stmt.all(...params);
480
+ const messages = rows.map((row) => ({
481
+ ...row,
482
+ payload: JSON.parse(row.payload),
483
+ }));
484
+ if (markAsRead && messages.length > 0) {
485
+ const ids = messages.map((m) => m.id);
486
+ const updateStmt = this.db.prepare(`
487
+ UPDATE agent_messages
488
+ SET read_at = ?
489
+ WHERE id IN (${ids.map(() => '?').join(',')})
490
+ `);
491
+ updateStmt.run(new Date().toISOString(), ...ids);
492
+ }
493
+ return messages;
494
+ }
495
+ getPendingMessages(agentId) {
496
+ const stmt = this.db.prepare(`
497
+ SELECT COUNT(*) as count
498
+ FROM agent_messages
499
+ WHERE (to_agent = ? OR (to_agent IS NULL AND channel != 'direct'))
500
+ AND read_at IS NULL
501
+ AND (expires_at IS NULL OR expires_at > ?)
502
+ `);
503
+ const row = stmt.get(agentId, new Date().toISOString());
504
+ return row.count;
505
+ }
506
+ // ==================== Deploy Queue ====================
507
+ queueDeploy(agentId, actionType, target, payload, options = {}) {
508
+ const now = new Date().toISOString();
509
+ const executeAfter = options.executeAfter?.toISOString() ||
510
+ new Date(Date.now() + 30000).toISOString(); // Default 30s delay for batching
511
+ const stmt = this.db.prepare(`
512
+ INSERT INTO deploy_queue (agent_id, action_type, target, payload, status, queued_at, execute_after, priority, dependencies)
513
+ VALUES (?, ?, ?, ?, 'pending', ?, ?, ?, ?)
514
+ `);
515
+ const result = stmt.run(agentId, actionType, target, payload ? JSON.stringify(payload) : null, now, executeAfter, options.priority || 5, options.dependencies ? JSON.stringify(options.dependencies) : null);
516
+ return result.lastInsertRowid;
517
+ }
518
+ getPendingDeploys() {
519
+ const stmt = this.db.prepare(`
520
+ SELECT id, agent_id as agentId, action_type as actionType, target, payload,
521
+ status, batch_id as batchId, queued_at as queuedAt,
522
+ execute_after as executeAfter, priority, dependencies
523
+ FROM deploy_queue
524
+ WHERE status = 'pending'
525
+ ORDER BY priority DESC, queued_at ASC
526
+ `);
527
+ const rows = stmt.all();
528
+ return rows.map((row) => ({
529
+ ...row,
530
+ payload: row.payload ? JSON.parse(row.payload) : undefined,
531
+ dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,
532
+ }));
533
+ }
534
+ getReadyDeploys() {
535
+ const now = new Date().toISOString();
536
+ const stmt = this.db.prepare(`
537
+ SELECT id, agent_id as agentId, action_type as actionType, target, payload,
538
+ status, batch_id as batchId, queued_at as queuedAt,
539
+ execute_after as executeAfter, priority, dependencies
540
+ FROM deploy_queue
541
+ WHERE status = 'pending' AND execute_after <= ?
542
+ ORDER BY priority DESC, queued_at ASC
543
+ `);
544
+ const rows = stmt.all(now);
545
+ return rows.map((row) => ({
546
+ ...row,
547
+ payload: row.payload ? JSON.parse(row.payload) : undefined,
548
+ dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,
549
+ }));
550
+ }
551
+ updateDeployStatus(deployId, status, batchId) {
552
+ const stmt = this.db.prepare(`
553
+ UPDATE deploy_queue
554
+ SET status = ?, batch_id = ?
555
+ WHERE id = ?
556
+ `);
557
+ stmt.run(status, batchId || null, deployId);
558
+ }
559
+ // ==================== Status ====================
560
+ getStatus() {
561
+ const activeAgents = this.getActiveAgents();
562
+ const claimsStmt = this.db.prepare(`
563
+ SELECT id, resource, agent_id as agentId, claim_type as claimType,
564
+ claimed_at as claimedAt, expires_at as expiresAt
565
+ FROM work_claims
566
+ WHERE expires_at IS NULL OR expires_at > ?
567
+ `);
568
+ const activeClaims = claimsStmt.all(new Date().toISOString());
569
+ const pendingDeploys = this.getPendingDeploys();
570
+ // Count pending messages (broadcast + unclaimed)
571
+ const msgStmt = this.db.prepare(`
572
+ SELECT COUNT(*) as count
573
+ FROM agent_messages
574
+ WHERE read_at IS NULL AND (expires_at IS NULL OR expires_at > ?)
575
+ `);
576
+ const msgRow = msgStmt.get(new Date().toISOString());
577
+ return {
578
+ activeAgents,
579
+ activeClaims,
580
+ pendingDeploys,
581
+ pendingMessages: msgRow.count,
582
+ };
583
+ }
584
+ // ==================== Cleanup ====================
585
+ cleanup() {
586
+ const cutoff = new Date(Date.now() - 86400000).toISOString(); // 24 hours ago
587
+ // Clean old messages
588
+ this.db.prepare(`DELETE FROM agent_messages WHERE created_at < ?`).run(cutoff);
589
+ // Clean expired claims
590
+ this.db.prepare(`DELETE FROM work_claims WHERE expires_at < ?`).run(new Date().toISOString());
591
+ // Clean old completed agents
592
+ this.db.prepare(`
593
+ DELETE FROM agent_registry
594
+ WHERE status IN ('completed', 'failed') AND started_at < ?
595
+ `).run(cutoff);
596
+ // Clean old completed deploys
597
+ this.db.prepare(`
598
+ DELETE FROM deploy_queue
599
+ WHERE status IN ('completed', 'failed') AND queued_at < ?
600
+ `).run(cutoff);
601
+ }
602
+ }
603
+ //# sourceMappingURL=service.js.map