@oxagen/cli 0.5.0 → 0.6.1

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 (702) hide show
  1. package/README.md +66 -3
  2. package/dist/agent/__tests__/code-graph.test.d.ts +2 -0
  3. package/dist/agent/__tests__/code-graph.test.d.ts.map +1 -0
  4. package/dist/agent/__tests__/code-graph.test.js +83 -0
  5. package/dist/agent/__tests__/code-graph.test.js.map +1 -0
  6. package/dist/agent/__tests__/evaluator.test.d.ts +2 -0
  7. package/dist/agent/__tests__/evaluator.test.d.ts.map +1 -0
  8. package/dist/agent/__tests__/evaluator.test.js +96 -0
  9. package/dist/agent/__tests__/evaluator.test.js.map +1 -0
  10. package/dist/agent/__tests__/fleet-memory.test.d.ts +2 -0
  11. package/dist/agent/__tests__/fleet-memory.test.d.ts.map +1 -0
  12. package/dist/agent/__tests__/fleet-memory.test.js +107 -0
  13. package/dist/agent/__tests__/fleet-memory.test.js.map +1 -0
  14. package/dist/agent/__tests__/fleet-store.test.d.ts +2 -0
  15. package/dist/agent/__tests__/fleet-store.test.d.ts.map +1 -0
  16. package/dist/agent/__tests__/fleet-store.test.js +93 -0
  17. package/dist/agent/__tests__/fleet-store.test.js.map +1 -0
  18. package/dist/agent/__tests__/git-isolation.test.d.ts +2 -0
  19. package/dist/agent/__tests__/git-isolation.test.d.ts.map +1 -0
  20. package/dist/agent/__tests__/git-isolation.test.js +119 -0
  21. package/dist/agent/__tests__/git-isolation.test.js.map +1 -0
  22. package/dist/agent/__tests__/judge.test.d.ts +2 -0
  23. package/dist/agent/__tests__/judge.test.d.ts.map +1 -0
  24. package/dist/agent/__tests__/judge.test.js +140 -0
  25. package/dist/agent/__tests__/judge.test.js.map +1 -0
  26. package/dist/agent/__tests__/loop-errors.test.d.ts +2 -0
  27. package/dist/agent/__tests__/loop-errors.test.d.ts.map +1 -0
  28. package/dist/agent/__tests__/loop-errors.test.js +75 -0
  29. package/dist/agent/__tests__/loop-errors.test.js.map +1 -0
  30. package/dist/agent/__tests__/loop-gating.test.d.ts +2 -0
  31. package/dist/agent/__tests__/loop-gating.test.d.ts.map +1 -0
  32. package/dist/agent/__tests__/loop-gating.test.js +94 -0
  33. package/dist/agent/__tests__/loop-gating.test.js.map +1 -0
  34. package/dist/agent/__tests__/model-router.test.d.ts +2 -0
  35. package/dist/agent/__tests__/model-router.test.d.ts.map +1 -0
  36. package/dist/agent/__tests__/model-router.test.js +138 -0
  37. package/dist/agent/__tests__/model-router.test.js.map +1 -0
  38. package/dist/agent/__tests__/orchestrator-isolation.test.d.ts +2 -0
  39. package/dist/agent/__tests__/orchestrator-isolation.test.d.ts.map +1 -0
  40. package/dist/agent/__tests__/orchestrator-isolation.test.js +134 -0
  41. package/dist/agent/__tests__/orchestrator-isolation.test.js.map +1 -0
  42. package/dist/agent/__tests__/orchestrator.test.d.ts +2 -0
  43. package/dist/agent/__tests__/orchestrator.test.d.ts.map +1 -0
  44. package/dist/agent/__tests__/orchestrator.test.js +201 -0
  45. package/dist/agent/__tests__/orchestrator.test.js.map +1 -0
  46. package/dist/agent/__tests__/permissions.test.d.ts +2 -0
  47. package/dist/agent/__tests__/permissions.test.d.ts.map +1 -0
  48. package/dist/agent/__tests__/permissions.test.js +206 -0
  49. package/dist/agent/__tests__/permissions.test.js.map +1 -0
  50. package/dist/agent/__tests__/pipeline-telemetry.test.d.ts +2 -0
  51. package/dist/agent/__tests__/pipeline-telemetry.test.d.ts.map +1 -0
  52. package/dist/agent/__tests__/pipeline-telemetry.test.js +158 -0
  53. package/dist/agent/__tests__/pipeline-telemetry.test.js.map +1 -0
  54. package/dist/agent/__tests__/pipeline.test.d.ts +2 -0
  55. package/dist/agent/__tests__/pipeline.test.d.ts.map +1 -0
  56. package/dist/agent/__tests__/pipeline.test.js +235 -0
  57. package/dist/agent/__tests__/pipeline.test.js.map +1 -0
  58. package/dist/agent/__tests__/planner.test.d.ts +2 -0
  59. package/dist/agent/__tests__/planner.test.d.ts.map +1 -0
  60. package/dist/agent/__tests__/planner.test.js +98 -0
  61. package/dist/agent/__tests__/planner.test.js.map +1 -0
  62. package/dist/agent/__tests__/prompt-enhancer.test.d.ts +2 -0
  63. package/dist/agent/__tests__/prompt-enhancer.test.d.ts.map +1 -0
  64. package/dist/agent/__tests__/prompt-enhancer.test.js +107 -0
  65. package/dist/agent/__tests__/prompt-enhancer.test.js.map +1 -0
  66. package/dist/agent/__tests__/rate-card.test.d.ts +2 -0
  67. package/dist/agent/__tests__/rate-card.test.d.ts.map +1 -0
  68. package/dist/agent/__tests__/rate-card.test.js +69 -0
  69. package/dist/agent/__tests__/rate-card.test.js.map +1 -0
  70. package/dist/agent/__tests__/system-prompt.test.d.ts +2 -0
  71. package/dist/agent/__tests__/system-prompt.test.d.ts.map +1 -0
  72. package/dist/agent/__tests__/system-prompt.test.js +29 -0
  73. package/dist/agent/__tests__/system-prompt.test.js.map +1 -0
  74. package/dist/agent/__tests__/trace-format-verbose.test.d.ts +2 -0
  75. package/dist/agent/__tests__/trace-format-verbose.test.d.ts.map +1 -0
  76. package/dist/agent/__tests__/trace-format-verbose.test.js +93 -0
  77. package/dist/agent/__tests__/trace-format-verbose.test.js.map +1 -0
  78. package/dist/agent/__tests__/trace-format.test.d.ts +2 -0
  79. package/dist/agent/__tests__/trace-format.test.d.ts.map +1 -0
  80. package/dist/agent/__tests__/trace-format.test.js +104 -0
  81. package/dist/agent/__tests__/trace-format.test.js.map +1 -0
  82. package/dist/agent/__tests__/trace-store.test.d.ts +2 -0
  83. package/dist/agent/__tests__/trace-store.test.d.ts.map +1 -0
  84. package/dist/agent/__tests__/trace-store.test.js +113 -0
  85. package/dist/agent/__tests__/trace-store.test.js.map +1 -0
  86. package/dist/agent/__tests__/verbose-log.test.d.ts +2 -0
  87. package/dist/agent/__tests__/verbose-log.test.d.ts.map +1 -0
  88. package/dist/agent/__tests__/verbose-log.test.js +69 -0
  89. package/dist/agent/__tests__/verbose-log.test.js.map +1 -0
  90. package/dist/agent/code-graph.d.ts +18 -0
  91. package/dist/agent/code-graph.d.ts.map +1 -0
  92. package/dist/agent/code-graph.js +119 -0
  93. package/dist/agent/code-graph.js.map +1 -0
  94. package/dist/agent/env.d.ts +11 -0
  95. package/dist/agent/env.d.ts.map +1 -0
  96. package/dist/agent/env.js +82 -0
  97. package/dist/agent/env.js.map +1 -0
  98. package/dist/agent/evaluator.d.ts +13 -0
  99. package/dist/agent/evaluator.d.ts.map +1 -0
  100. package/dist/agent/evaluator.js +150 -0
  101. package/dist/agent/evaluator.js.map +1 -0
  102. package/dist/agent/fleet/git-isolation.d.ts +142 -0
  103. package/dist/agent/fleet/git-isolation.d.ts.map +1 -0
  104. package/dist/agent/fleet/git-isolation.js +290 -0
  105. package/dist/agent/fleet/git-isolation.js.map +1 -0
  106. package/dist/agent/fleet/memory.d.ts +21 -0
  107. package/dist/agent/fleet/memory.d.ts.map +1 -0
  108. package/dist/agent/fleet/memory.js +129 -0
  109. package/dist/agent/fleet/memory.js.map +1 -0
  110. package/dist/agent/fleet/orchestrator.d.ts +108 -0
  111. package/dist/agent/fleet/orchestrator.d.ts.map +1 -0
  112. package/dist/agent/fleet/orchestrator.js +358 -0
  113. package/dist/agent/fleet/orchestrator.js.map +1 -0
  114. package/dist/agent/fleet/store.d.ts +13 -0
  115. package/dist/agent/fleet/store.d.ts.map +1 -0
  116. package/dist/agent/fleet/store.js +79 -0
  117. package/dist/agent/fleet/store.js.map +1 -0
  118. package/dist/agent/fleet/types.d.ts +107 -0
  119. package/dist/agent/fleet/types.d.ts.map +1 -0
  120. package/dist/agent/fleet/types.js +17 -0
  121. package/dist/agent/fleet/types.js.map +1 -0
  122. package/dist/agent/judge.d.ts +46 -0
  123. package/dist/agent/judge.d.ts.map +1 -0
  124. package/dist/agent/judge.js +182 -0
  125. package/dist/agent/judge.js.map +1 -0
  126. package/dist/agent/loop.d.ts +96 -0
  127. package/dist/agent/loop.d.ts.map +1 -0
  128. package/dist/agent/loop.js +233 -0
  129. package/dist/agent/loop.js.map +1 -0
  130. package/dist/agent/memory.d.ts +14 -0
  131. package/dist/agent/memory.d.ts.map +1 -0
  132. package/dist/agent/memory.js +118 -0
  133. package/dist/agent/memory.js.map +1 -0
  134. package/dist/agent/model-router.d.ts +65 -0
  135. package/dist/agent/model-router.d.ts.map +1 -0
  136. package/dist/agent/model-router.js +118 -0
  137. package/dist/agent/model-router.js.map +1 -0
  138. package/dist/agent/model.d.ts +9 -0
  139. package/dist/agent/model.d.ts.map +1 -0
  140. package/dist/agent/model.js +24 -0
  141. package/dist/agent/model.js.map +1 -0
  142. package/dist/agent/permissions.d.ts +103 -0
  143. package/dist/agent/permissions.d.ts.map +1 -0
  144. package/dist/agent/permissions.js +245 -0
  145. package/dist/agent/permissions.js.map +1 -0
  146. package/dist/agent/pipeline.d.ts +92 -0
  147. package/dist/agent/pipeline.d.ts.map +1 -0
  148. package/dist/agent/pipeline.js +371 -0
  149. package/dist/agent/pipeline.js.map +1 -0
  150. package/dist/agent/planner.d.ts +19 -0
  151. package/dist/agent/planner.d.ts.map +1 -0
  152. package/dist/agent/planner.js +139 -0
  153. package/dist/agent/planner.js.map +1 -0
  154. package/dist/agent/project-context.d.ts +13 -0
  155. package/dist/agent/project-context.d.ts.map +1 -0
  156. package/dist/agent/project-context.js +66 -0
  157. package/dist/agent/project-context.js.map +1 -0
  158. package/dist/agent/prompt-enhancer.d.ts +46 -0
  159. package/dist/agent/prompt-enhancer.d.ts.map +1 -0
  160. package/dist/agent/prompt-enhancer.js +137 -0
  161. package/dist/agent/prompt-enhancer.js.map +1 -0
  162. package/dist/agent/rate-card.d.ts +77 -0
  163. package/dist/agent/rate-card.d.ts.map +1 -0
  164. package/dist/agent/rate-card.js +99 -0
  165. package/dist/agent/rate-card.js.map +1 -0
  166. package/dist/agent/system-prompt.d.ts +14 -0
  167. package/dist/agent/system-prompt.d.ts.map +1 -0
  168. package/dist/agent/system-prompt.js +47 -0
  169. package/dist/agent/system-prompt.js.map +1 -0
  170. package/dist/agent/tools.d.ts +23 -0
  171. package/dist/agent/tools.d.ts.map +1 -0
  172. package/dist/agent/tools.js +354 -0
  173. package/dist/agent/tools.js.map +1 -0
  174. package/dist/agent/trace-format.d.ts +13 -0
  175. package/dist/agent/trace-format.d.ts.map +1 -0
  176. package/dist/agent/trace-format.js +188 -0
  177. package/dist/agent/trace-format.js.map +1 -0
  178. package/dist/agent/trace-store.d.ts +19 -0
  179. package/dist/agent/trace-store.d.ts.map +1 -0
  180. package/dist/agent/trace-store.js +82 -0
  181. package/dist/agent/trace-store.js.map +1 -0
  182. package/dist/agent/trace.d.ts +180 -0
  183. package/dist/agent/trace.d.ts.map +1 -0
  184. package/dist/agent/trace.js +2 -0
  185. package/dist/agent/trace.js.map +1 -0
  186. package/dist/agent/verbose-log.d.ts +8 -0
  187. package/dist/agent/verbose-log.d.ts.map +1 -0
  188. package/dist/agent/verbose-log.js +53 -0
  189. package/dist/agent/verbose-log.js.map +1 -0
  190. package/dist/agents/__tests__/loader.test.d.ts +2 -0
  191. package/dist/agents/__tests__/loader.test.d.ts.map +1 -0
  192. package/dist/agents/__tests__/loader.test.js +88 -0
  193. package/dist/agents/__tests__/loader.test.js.map +1 -0
  194. package/dist/agents/__tests__/tools.test.d.ts +2 -0
  195. package/dist/agents/__tests__/tools.test.d.ts.map +1 -0
  196. package/dist/agents/__tests__/tools.test.js +40 -0
  197. package/dist/agents/__tests__/tools.test.js.map +1 -0
  198. package/dist/agents/index.d.ts +12 -0
  199. package/dist/agents/index.d.ts.map +1 -0
  200. package/dist/agents/index.js +4 -0
  201. package/dist/agents/index.js.map +1 -0
  202. package/dist/agents/loader.d.ts +25 -0
  203. package/dist/agents/loader.d.ts.map +1 -0
  204. package/dist/agents/loader.js +133 -0
  205. package/dist/agents/loader.js.map +1 -0
  206. package/dist/agents/tools.d.ts +14 -0
  207. package/dist/agents/tools.d.ts.map +1 -0
  208. package/dist/agents/tools.js +21 -0
  209. package/dist/agents/tools.js.map +1 -0
  210. package/dist/agents/types.d.ts +27 -0
  211. package/dist/agents/types.d.ts.map +1 -0
  212. package/dist/agents/types.js +11 -0
  213. package/dist/agents/types.js.map +1 -0
  214. package/dist/agents/write.d.ts +10 -0
  215. package/dist/agents/write.d.ts.map +1 -0
  216. package/dist/agents/write.js +28 -0
  217. package/dist/agents/write.js.map +1 -0
  218. package/dist/commands/__tests__/agent.test.d.ts +2 -0
  219. package/dist/commands/__tests__/agent.test.d.ts.map +1 -0
  220. package/dist/commands/__tests__/agent.test.js +82 -0
  221. package/dist/commands/__tests__/agent.test.js.map +1 -0
  222. package/dist/commands/__tests__/command.test.d.ts +2 -0
  223. package/dist/commands/__tests__/command.test.d.ts.map +1 -0
  224. package/dist/commands/__tests__/command.test.js +73 -0
  225. package/dist/commands/__tests__/command.test.js.map +1 -0
  226. package/dist/commands/__tests__/cost.test.d.ts +2 -0
  227. package/dist/commands/__tests__/cost.test.d.ts.map +1 -0
  228. package/dist/commands/__tests__/cost.test.js +139 -0
  229. package/dist/commands/__tests__/cost.test.js.map +1 -0
  230. package/dist/commands/__tests__/graph.pull.test.d.ts +2 -0
  231. package/dist/commands/__tests__/graph.pull.test.d.ts.map +1 -0
  232. package/dist/commands/__tests__/graph.pull.test.js +259 -0
  233. package/dist/commands/__tests__/graph.pull.test.js.map +1 -0
  234. package/dist/commands/__tests__/mcp.test.d.ts +2 -0
  235. package/dist/commands/__tests__/mcp.test.d.ts.map +1 -0
  236. package/dist/commands/__tests__/mcp.test.js +88 -0
  237. package/dist/commands/__tests__/mcp.test.js.map +1 -0
  238. package/dist/commands/__tests__/replay.test.d.ts +2 -0
  239. package/dist/commands/__tests__/replay.test.d.ts.map +1 -0
  240. package/dist/commands/__tests__/replay.test.js +76 -0
  241. package/dist/commands/__tests__/replay.test.js.map +1 -0
  242. package/dist/commands/__tests__/rules.test.d.ts +2 -0
  243. package/dist/commands/__tests__/rules.test.d.ts.map +1 -0
  244. package/dist/commands/__tests__/rules.test.js +95 -0
  245. package/dist/commands/__tests__/rules.test.js.map +1 -0
  246. package/dist/commands/__tests__/settings.test.d.ts +2 -0
  247. package/dist/commands/__tests__/settings.test.d.ts.map +1 -0
  248. package/dist/commands/__tests__/settings.test.js +83 -0
  249. package/dist/commands/__tests__/settings.test.js.map +1 -0
  250. package/dist/commands/agent.d.ts +15 -0
  251. package/dist/commands/agent.d.ts.map +1 -0
  252. package/dist/commands/agent.js +58 -0
  253. package/dist/commands/agent.js.map +1 -0
  254. package/dist/commands/agent.skill.load.d.ts +3 -0
  255. package/dist/commands/agent.skill.load.d.ts.map +1 -0
  256. package/dist/commands/agent.skill.load.js +57 -0
  257. package/dist/commands/agent.skill.load.js.map +1 -0
  258. package/dist/commands/code.d.ts +14 -0
  259. package/dist/commands/code.d.ts.map +1 -0
  260. package/dist/commands/code.js +100 -0
  261. package/dist/commands/code.js.map +1 -0
  262. package/dist/commands/command.d.ts +17 -0
  263. package/dist/commands/command.d.ts.map +1 -0
  264. package/dist/commands/command.js +74 -0
  265. package/dist/commands/command.js.map +1 -0
  266. package/dist/commands/config.d.ts +2 -0
  267. package/dist/commands/config.d.ts.map +1 -0
  268. package/dist/commands/config.js +66 -0
  269. package/dist/commands/config.js.map +1 -0
  270. package/dist/commands/cost.d.ts +10 -0
  271. package/dist/commands/cost.d.ts.map +1 -0
  272. package/dist/commands/cost.js +140 -0
  273. package/dist/commands/cost.js.map +1 -0
  274. package/dist/commands/env.d.ts +19 -0
  275. package/dist/commands/env.d.ts.map +1 -0
  276. package/dist/commands/env.js +64 -0
  277. package/dist/commands/env.js.map +1 -0
  278. package/dist/commands/graph.pull.d.ts +15 -0
  279. package/dist/commands/graph.pull.d.ts.map +1 -0
  280. package/dist/commands/graph.pull.js +137 -0
  281. package/dist/commands/graph.pull.js.map +1 -0
  282. package/dist/commands/graph.search.d.ts +10 -0
  283. package/dist/commands/graph.search.d.ts.map +1 -0
  284. package/dist/commands/graph.search.js +25 -0
  285. package/dist/commands/graph.search.js.map +1 -0
  286. package/dist/commands/graph.status.d.ts +10 -0
  287. package/dist/commands/graph.status.d.ts.map +1 -0
  288. package/dist/commands/graph.status.js +75 -0
  289. package/dist/commands/graph.status.js.map +1 -0
  290. package/dist/commands/mcp.add.d.ts +13 -0
  291. package/dist/commands/mcp.add.d.ts.map +1 -0
  292. package/dist/commands/mcp.add.js +110 -0
  293. package/dist/commands/mcp.add.js.map +1 -0
  294. package/dist/commands/mcp.auth.d.ts +10 -0
  295. package/dist/commands/mcp.auth.d.ts.map +1 -0
  296. package/dist/commands/mcp.auth.js +132 -0
  297. package/dist/commands/mcp.auth.js.map +1 -0
  298. package/dist/commands/mcp.check.d.ts +10 -0
  299. package/dist/commands/mcp.check.d.ts.map +1 -0
  300. package/dist/commands/mcp.check.js +114 -0
  301. package/dist/commands/mcp.check.js.map +1 -0
  302. package/dist/commands/mcp.d.ts +18 -0
  303. package/dist/commands/mcp.d.ts.map +1 -0
  304. package/dist/commands/mcp.js +183 -0
  305. package/dist/commands/mcp.js.map +1 -0
  306. package/dist/commands/mcp.list.d.ts +9 -0
  307. package/dist/commands/mcp.list.d.ts.map +1 -0
  308. package/dist/commands/mcp.list.js +93 -0
  309. package/dist/commands/mcp.list.js.map +1 -0
  310. package/dist/commands/mcp.permit.d.ts +12 -0
  311. package/dist/commands/mcp.permit.d.ts.map +1 -0
  312. package/dist/commands/mcp.permit.js +117 -0
  313. package/dist/commands/mcp.permit.js.map +1 -0
  314. package/dist/commands/mcp.remove.d.ts +9 -0
  315. package/dist/commands/mcp.remove.d.ts.map +1 -0
  316. package/dist/commands/mcp.remove.js +65 -0
  317. package/dist/commands/mcp.remove.js.map +1 -0
  318. package/dist/commands/plugin.org.install_bulk.js +1 -1
  319. package/dist/commands/plugin.org.install_bulk.js.map +1 -1
  320. package/dist/commands/privacy.erase.test.js +7 -0
  321. package/dist/commands/privacy.erase.test.js.map +1 -1
  322. package/dist/commands/replay.d.ts +5 -0
  323. package/dist/commands/replay.d.ts.map +1 -0
  324. package/dist/commands/replay.js +28 -0
  325. package/dist/commands/replay.js.map +1 -0
  326. package/dist/commands/rules.d.ts +19 -0
  327. package/dist/commands/rules.d.ts.map +1 -0
  328. package/dist/commands/rules.js +96 -0
  329. package/dist/commands/rules.js.map +1 -0
  330. package/dist/commands/schema/schema.config.d.ts +3 -0
  331. package/dist/commands/schema/schema.config.d.ts.map +1 -0
  332. package/dist/commands/schema/schema.config.js +34 -0
  333. package/dist/commands/schema/schema.config.js.map +1 -0
  334. package/dist/commands/schema/schema.disable.d.ts +3 -0
  335. package/dist/commands/schema/schema.disable.d.ts.map +1 -0
  336. package/dist/commands/schema/schema.disable.js +22 -0
  337. package/dist/commands/schema/schema.disable.js.map +1 -0
  338. package/dist/commands/schema/schema.enable.d.ts +3 -0
  339. package/dist/commands/schema/schema.enable.d.ts.map +1 -0
  340. package/dist/commands/schema/schema.enable.js +22 -0
  341. package/dist/commands/schema/schema.enable.js.map +1 -0
  342. package/dist/commands/schema/schema.export.d.ts +3 -0
  343. package/dist/commands/schema/schema.export.d.ts.map +1 -0
  344. package/dist/commands/schema/schema.export.js +31 -0
  345. package/dist/commands/schema/schema.export.js.map +1 -0
  346. package/dist/commands/schema/schema.get.d.ts +3 -0
  347. package/dist/commands/schema/schema.get.d.ts.map +1 -0
  348. package/dist/commands/schema/schema.get.js +23 -0
  349. package/dist/commands/schema/schema.get.js.map +1 -0
  350. package/dist/commands/schema/schema.label.d.ts +5 -0
  351. package/dist/commands/schema/schema.label.d.ts.map +1 -0
  352. package/dist/commands/schema/schema.label.js +60 -0
  353. package/dist/commands/schema/schema.label.js.map +1 -0
  354. package/dist/commands/schema/schema.list.d.ts +3 -0
  355. package/dist/commands/schema/schema.list.d.ts.map +1 -0
  356. package/dist/commands/schema/schema.list.js +30 -0
  357. package/dist/commands/schema/schema.list.js.map +1 -0
  358. package/dist/commands/schema/schema.prop.d.ts +5 -0
  359. package/dist/commands/schema/schema.prop.d.ts.map +1 -0
  360. package/dist/commands/schema/schema.prop.js +72 -0
  361. package/dist/commands/schema/schema.prop.js.map +1 -0
  362. package/dist/commands/schema/schema.reconcile.d.ts +10 -0
  363. package/dist/commands/schema/schema.reconcile.d.ts.map +1 -0
  364. package/dist/commands/schema/schema.reconcile.js +65 -0
  365. package/dist/commands/schema/schema.reconcile.js.map +1 -0
  366. package/dist/commands/schema/schema.rel.d.ts +5 -0
  367. package/dist/commands/schema/schema.rel.d.ts.map +1 -0
  368. package/dist/commands/schema/schema.rel.js +65 -0
  369. package/dist/commands/schema/schema.rel.js.map +1 -0
  370. package/dist/commands/schema/schema.version.d.ts +7 -0
  371. package/dist/commands/schema/schema.version.d.ts.map +1 -0
  372. package/dist/commands/schema/schema.version.js +96 -0
  373. package/dist/commands/schema/schema.version.js.map +1 -0
  374. package/dist/commands/secret.d.ts +23 -0
  375. package/dist/commands/secret.d.ts.map +1 -0
  376. package/dist/commands/secret.js +90 -0
  377. package/dist/commands/secret.js.map +1 -0
  378. package/dist/commands/settings.d.ts +10 -0
  379. package/dist/commands/settings.d.ts.map +1 -0
  380. package/dist/commands/settings.js +117 -0
  381. package/dist/commands/settings.js.map +1 -0
  382. package/dist/commands/skill.create.d.ts +3 -0
  383. package/dist/commands/skill.create.d.ts.map +1 -0
  384. package/dist/commands/skill.create.js +52 -0
  385. package/dist/commands/skill.create.js.map +1 -0
  386. package/dist/commands/skill.enable.d.ts +3 -0
  387. package/dist/commands/skill.enable.d.ts.map +1 -0
  388. package/dist/commands/skill.enable.js +31 -0
  389. package/dist/commands/skill.enable.js.map +1 -0
  390. package/dist/commands.test.js +1291 -281
  391. package/dist/commands.test.js.map +1 -1
  392. package/dist/components/DevStatus.d.ts.map +1 -1
  393. package/dist/components/DevStatus.js +3 -2
  394. package/dist/components/DevStatus.js.map +1 -1
  395. package/dist/daemon/client.d.ts +30 -0
  396. package/dist/daemon/client.d.ts.map +1 -0
  397. package/dist/daemon/client.js +97 -0
  398. package/dist/daemon/client.js.map +1 -0
  399. package/dist/daemon/code-graph/builder.d.ts +6 -0
  400. package/dist/daemon/code-graph/builder.d.ts.map +1 -0
  401. package/dist/daemon/code-graph/builder.js +215 -0
  402. package/dist/daemon/code-graph/builder.js.map +1 -0
  403. package/dist/daemon/code-graph/query.d.ts +29 -0
  404. package/dist/daemon/code-graph/query.d.ts.map +1 -0
  405. package/dist/daemon/code-graph/query.js +98 -0
  406. package/dist/daemon/code-graph/query.js.map +1 -0
  407. package/dist/daemon/code-graph/types.d.ts +37 -0
  408. package/dist/daemon/code-graph/types.d.ts.map +1 -0
  409. package/dist/daemon/code-graph/types.js +5 -0
  410. package/dist/daemon/code-graph/types.js.map +1 -0
  411. package/dist/daemon/code-graph/watcher.d.ts +37 -0
  412. package/dist/daemon/code-graph/watcher.d.ts.map +1 -0
  413. package/dist/daemon/code-graph/watcher.js +79 -0
  414. package/dist/daemon/code-graph/watcher.js.map +1 -0
  415. package/dist/daemon/lifecycle.d.ts +6 -0
  416. package/dist/daemon/lifecycle.d.ts.map +1 -0
  417. package/dist/daemon/lifecycle.js +132 -0
  418. package/dist/daemon/lifecycle.js.map +1 -0
  419. package/dist/daemon/protocol.d.ts +113 -0
  420. package/dist/daemon/protocol.d.ts.map +1 -0
  421. package/dist/daemon/protocol.js +16 -0
  422. package/dist/daemon/protocol.js.map +1 -0
  423. package/dist/daemon/server.d.ts +26 -0
  424. package/dist/daemon/server.d.ts.map +1 -0
  425. package/dist/daemon/server.js +168 -0
  426. package/dist/daemon/server.js.map +1 -0
  427. package/dist/index.d.ts +1 -1
  428. package/dist/index.js +559 -357
  429. package/dist/index.js.map +1 -1
  430. package/dist/lib/api.d.ts +5 -0
  431. package/dist/lib/api.d.ts.map +1 -0
  432. package/dist/lib/api.js +52 -0
  433. package/dist/lib/api.js.map +1 -0
  434. package/dist/lib/config.d.ts +5 -0
  435. package/dist/lib/config.d.ts.map +1 -1
  436. package/dist/lib/config.js +8 -2
  437. package/dist/lib/config.js.map +1 -1
  438. package/dist/lib/differential-context.d.ts +46 -0
  439. package/dist/lib/differential-context.d.ts.map +1 -0
  440. package/dist/lib/differential-context.js +89 -0
  441. package/dist/lib/differential-context.js.map +1 -0
  442. package/dist/lib/resolve.d.ts +3 -0
  443. package/dist/lib/resolve.d.ts.map +1 -0
  444. package/dist/lib/resolve.js +29 -0
  445. package/dist/lib/resolve.js.map +1 -0
  446. package/dist/lib/structured-tool-io.d.ts +31 -0
  447. package/dist/lib/structured-tool-io.d.ts.map +1 -0
  448. package/dist/lib/structured-tool-io.js +56 -0
  449. package/dist/lib/structured-tool-io.js.map +1 -0
  450. package/dist/mcp/__tests__/client.test.d.ts +2 -0
  451. package/dist/mcp/__tests__/client.test.d.ts.map +1 -0
  452. package/dist/mcp/__tests__/client.test.js +101 -0
  453. package/dist/mcp/__tests__/client.test.js.map +1 -0
  454. package/dist/mcp/client.d.ts +89 -0
  455. package/dist/mcp/client.d.ts.map +1 -0
  456. package/dist/mcp/client.js +201 -0
  457. package/dist/mcp/client.js.map +1 -0
  458. package/dist/repl/__tests__/_queue_demo.test.d.ts +2 -0
  459. package/dist/repl/__tests__/_queue_demo.test.d.ts.map +1 -0
  460. package/dist/repl/__tests__/_queue_demo.test.js +40 -0
  461. package/dist/repl/__tests__/_queue_demo.test.js.map +1 -0
  462. package/dist/repl/__tests__/components.test.d.ts +2 -0
  463. package/dist/repl/__tests__/components.test.d.ts.map +1 -0
  464. package/dist/repl/__tests__/components.test.js +87 -0
  465. package/dist/repl/__tests__/components.test.js.map +1 -0
  466. package/dist/repl/__tests__/interactive.queue.test.d.ts +2 -0
  467. package/dist/repl/__tests__/interactive.queue.test.d.ts.map +1 -0
  468. package/dist/repl/__tests__/interactive.queue.test.js +124 -0
  469. package/dist/repl/__tests__/interactive.queue.test.js.map +1 -0
  470. package/dist/repl/components.d.ts +76 -0
  471. package/dist/repl/components.d.ts.map +1 -0
  472. package/dist/repl/components.js +182 -0
  473. package/dist/repl/components.js.map +1 -0
  474. package/dist/repl/interactive.d.ts +17 -0
  475. package/dist/repl/interactive.d.ts.map +1 -0
  476. package/dist/repl/interactive.js +439 -0
  477. package/dist/repl/interactive.js.map +1 -0
  478. package/dist/repl/one-shot.d.ts +25 -0
  479. package/dist/repl/one-shot.d.ts.map +1 -0
  480. package/dist/repl/one-shot.js +153 -0
  481. package/dist/repl/one-shot.js.map +1 -0
  482. package/dist/rules/__tests__/enforce.test.d.ts +2 -0
  483. package/dist/rules/__tests__/enforce.test.d.ts.map +1 -0
  484. package/dist/rules/__tests__/enforce.test.js +58 -0
  485. package/dist/rules/__tests__/enforce.test.js.map +1 -0
  486. package/dist/rules/__tests__/loader.test.d.ts +2 -0
  487. package/dist/rules/__tests__/loader.test.d.ts.map +1 -0
  488. package/dist/rules/__tests__/loader.test.js +54 -0
  489. package/dist/rules/__tests__/loader.test.js.map +1 -0
  490. package/dist/rules/enforce.d.ts +23 -0
  491. package/dist/rules/enforce.d.ts.map +1 -0
  492. package/dist/rules/enforce.js +36 -0
  493. package/dist/rules/enforce.js.map +1 -0
  494. package/dist/rules/index.d.ts +10 -0
  495. package/dist/rules/index.d.ts.map +1 -0
  496. package/dist/rules/index.js +4 -0
  497. package/dist/rules/index.js.map +1 -0
  498. package/dist/rules/loader.d.ts +10 -0
  499. package/dist/rules/loader.d.ts.map +1 -0
  500. package/dist/rules/loader.js +77 -0
  501. package/dist/rules/loader.js.map +1 -0
  502. package/dist/rules/types.d.ts +39 -0
  503. package/dist/rules/types.d.ts.map +1 -0
  504. package/dist/rules/types.js +16 -0
  505. package/dist/rules/types.js.map +1 -0
  506. package/dist/rules/write.d.ts +10 -0
  507. package/dist/rules/write.d.ts.map +1 -0
  508. package/dist/rules/write.js +28 -0
  509. package/dist/rules/write.js.map +1 -0
  510. package/dist/settings/__tests__/gate.test.d.ts +2 -0
  511. package/dist/settings/__tests__/gate.test.d.ts.map +1 -0
  512. package/dist/settings/__tests__/gate.test.js +137 -0
  513. package/dist/settings/__tests__/gate.test.js.map +1 -0
  514. package/dist/settings/__tests__/hooks.test.d.ts +2 -0
  515. package/dist/settings/__tests__/hooks.test.d.ts.map +1 -0
  516. package/dist/settings/__tests__/hooks.test.js +103 -0
  517. package/dist/settings/__tests__/hooks.test.js.map +1 -0
  518. package/dist/settings/__tests__/mcp-write.test.d.ts +2 -0
  519. package/dist/settings/__tests__/mcp-write.test.d.ts.map +1 -0
  520. package/dist/settings/__tests__/mcp-write.test.js +77 -0
  521. package/dist/settings/__tests__/mcp-write.test.js.map +1 -0
  522. package/dist/settings/__tests__/permissions-gate.test.d.ts +2 -0
  523. package/dist/settings/__tests__/permissions-gate.test.d.ts.map +1 -0
  524. package/dist/settings/__tests__/permissions-gate.test.js +75 -0
  525. package/dist/settings/__tests__/permissions-gate.test.js.map +1 -0
  526. package/dist/settings/__tests__/resolve.test.d.ts +2 -0
  527. package/dist/settings/__tests__/resolve.test.d.ts.map +1 -0
  528. package/dist/settings/__tests__/resolve.test.js +109 -0
  529. package/dist/settings/__tests__/resolve.test.js.map +1 -0
  530. package/dist/settings/__tests__/runtime.test.d.ts +2 -0
  531. package/dist/settings/__tests__/runtime.test.d.ts.map +1 -0
  532. package/dist/settings/__tests__/runtime.test.js +72 -0
  533. package/dist/settings/__tests__/runtime.test.js.map +1 -0
  534. package/dist/settings/__tests__/schema.test.d.ts +2 -0
  535. package/dist/settings/__tests__/schema.test.d.ts.map +1 -0
  536. package/dist/settings/__tests__/schema.test.js +55 -0
  537. package/dist/settings/__tests__/schema.test.js.map +1 -0
  538. package/dist/settings/__tests__/write.test.d.ts +2 -0
  539. package/dist/settings/__tests__/write.test.d.ts.map +1 -0
  540. package/dist/settings/__tests__/write.test.js +61 -0
  541. package/dist/settings/__tests__/write.test.js.map +1 -0
  542. package/dist/settings/gate.d.ts +34 -0
  543. package/dist/settings/gate.d.ts.map +1 -0
  544. package/dist/settings/gate.js +50 -0
  545. package/dist/settings/gate.js.map +1 -0
  546. package/dist/settings/hooks.d.ts +26 -0
  547. package/dist/settings/hooks.d.ts.map +1 -0
  548. package/dist/settings/hooks.js +115 -0
  549. package/dist/settings/hooks.js.map +1 -0
  550. package/dist/settings/index.d.ts +23 -0
  551. package/dist/settings/index.d.ts.map +1 -0
  552. package/dist/settings/index.js +23 -0
  553. package/dist/settings/index.js.map +1 -0
  554. package/dist/settings/mcp-write.d.ts +41 -0
  555. package/dist/settings/mcp-write.d.ts.map +1 -0
  556. package/dist/settings/mcp-write.js +61 -0
  557. package/dist/settings/mcp-write.js.map +1 -0
  558. package/dist/settings/permissions-gate.d.ts +19 -0
  559. package/dist/settings/permissions-gate.d.ts.map +1 -0
  560. package/dist/settings/permissions-gate.js +103 -0
  561. package/dist/settings/permissions-gate.js.map +1 -0
  562. package/dist/settings/resolve.d.ts +37 -0
  563. package/dist/settings/resolve.d.ts.map +1 -0
  564. package/dist/settings/resolve.js +169 -0
  565. package/dist/settings/resolve.js.map +1 -0
  566. package/dist/settings/runtime.d.ts +28 -0
  567. package/dist/settings/runtime.d.ts.map +1 -0
  568. package/dist/settings/runtime.js +45 -0
  569. package/dist/settings/runtime.js.map +1 -0
  570. package/dist/settings/schema.d.ts +1387 -0
  571. package/dist/settings/schema.d.ts.map +1 -0
  572. package/dist/settings/schema.js +146 -0
  573. package/dist/settings/schema.js.map +1 -0
  574. package/dist/settings/write.d.ts +37 -0
  575. package/dist/settings/write.d.ts.map +1 -0
  576. package/dist/settings/write.js +85 -0
  577. package/dist/settings/write.js.map +1 -0
  578. package/dist/slash/__tests__/expand.test.d.ts +2 -0
  579. package/dist/slash/__tests__/expand.test.d.ts.map +1 -0
  580. package/dist/slash/__tests__/expand.test.js +44 -0
  581. package/dist/slash/__tests__/expand.test.js.map +1 -0
  582. package/dist/slash/__tests__/loader.test.d.ts +2 -0
  583. package/dist/slash/__tests__/loader.test.d.ts.map +1 -0
  584. package/dist/slash/__tests__/loader.test.js +48 -0
  585. package/dist/slash/__tests__/loader.test.js.map +1 -0
  586. package/dist/slash/expand.d.ts +32 -0
  587. package/dist/slash/expand.d.ts.map +1 -0
  588. package/dist/slash/expand.js +48 -0
  589. package/dist/slash/expand.js.map +1 -0
  590. package/dist/slash/index.d.ts +11 -0
  591. package/dist/slash/index.d.ts.map +1 -0
  592. package/dist/slash/index.js +4 -0
  593. package/dist/slash/index.js.map +1 -0
  594. package/dist/slash/loader.d.ts +10 -0
  595. package/dist/slash/loader.d.ts.map +1 -0
  596. package/dist/slash/loader.js +64 -0
  597. package/dist/slash/loader.js.map +1 -0
  598. package/dist/slash/types.d.ts +24 -0
  599. package/dist/slash/types.d.ts.map +1 -0
  600. package/dist/slash/types.js +11 -0
  601. package/dist/slash/types.js.map +1 -0
  602. package/dist/slash/write.d.ts +10 -0
  603. package/dist/slash/write.d.ts.map +1 -0
  604. package/dist/slash/write.js +26 -0
  605. package/dist/slash/write.js.map +1 -0
  606. package/dist/tui/__tests__/app.test.d.ts +2 -0
  607. package/dist/tui/__tests__/app.test.d.ts.map +1 -0
  608. package/dist/tui/__tests__/app.test.js +136 -0
  609. package/dist/tui/__tests__/app.test.js.map +1 -0
  610. package/dist/tui/__tests__/banner.test.d.ts +2 -0
  611. package/dist/tui/__tests__/banner.test.d.ts.map +1 -0
  612. package/dist/tui/__tests__/banner.test.js +15 -0
  613. package/dist/tui/__tests__/banner.test.js.map +1 -0
  614. package/dist/tui/__tests__/command-form.test.d.ts +2 -0
  615. package/dist/tui/__tests__/command-form.test.d.ts.map +1 -0
  616. package/dist/tui/__tests__/command-form.test.js +96 -0
  617. package/dist/tui/__tests__/command-form.test.js.map +1 -0
  618. package/dist/tui/__tests__/command-tree.test.d.ts +2 -0
  619. package/dist/tui/__tests__/command-tree.test.d.ts.map +1 -0
  620. package/dist/tui/__tests__/command-tree.test.js +55 -0
  621. package/dist/tui/__tests__/command-tree.test.js.map +1 -0
  622. package/dist/tui/__tests__/runner.test.d.ts +2 -0
  623. package/dist/tui/__tests__/runner.test.d.ts.map +1 -0
  624. package/dist/tui/__tests__/runner.test.js +38 -0
  625. package/dist/tui/__tests__/runner.test.js.map +1 -0
  626. package/dist/tui/__tests__/theme.test.d.ts +2 -0
  627. package/dist/tui/__tests__/theme.test.d.ts.map +1 -0
  628. package/dist/tui/__tests__/theme.test.js +11 -0
  629. package/dist/tui/__tests__/theme.test.js.map +1 -0
  630. package/dist/tui/agent-view/activity-feed.d.ts +3 -0
  631. package/dist/tui/agent-view/activity-feed.d.ts.map +1 -0
  632. package/dist/tui/agent-view/activity-feed.js +34 -0
  633. package/dist/tui/agent-view/activity-feed.js.map +1 -0
  634. package/dist/tui/agent-view/budget-bar.d.ts +3 -0
  635. package/dist/tui/agent-view/budget-bar.d.ts.map +1 -0
  636. package/dist/tui/agent-view/budget-bar.js +53 -0
  637. package/dist/tui/agent-view/budget-bar.js.map +1 -0
  638. package/dist/tui/agent-view/compile-panel.d.ts +3 -0
  639. package/dist/tui/agent-view/compile-panel.d.ts.map +1 -0
  640. package/dist/tui/agent-view/compile-panel.js +34 -0
  641. package/dist/tui/agent-view/compile-panel.js.map +1 -0
  642. package/dist/tui/agent-view/index.d.ts +4 -0
  643. package/dist/tui/agent-view/index.d.ts.map +1 -0
  644. package/dist/tui/agent-view/index.js +31 -0
  645. package/dist/tui/agent-view/index.js.map +1 -0
  646. package/dist/tui/agent-view/memory-panel.d.ts +3 -0
  647. package/dist/tui/agent-view/memory-panel.d.ts.map +1 -0
  648. package/dist/tui/agent-view/memory-panel.js +80 -0
  649. package/dist/tui/agent-view/memory-panel.js.map +1 -0
  650. package/dist/tui/agent-view/session-panel.d.ts +3 -0
  651. package/dist/tui/agent-view/session-panel.d.ts.map +1 -0
  652. package/dist/tui/agent-view/session-panel.js +44 -0
  653. package/dist/tui/agent-view/session-panel.js.map +1 -0
  654. package/dist/tui/agent-view/status-bar.d.ts +7 -0
  655. package/dist/tui/agent-view/status-bar.d.ts.map +1 -0
  656. package/dist/tui/agent-view/status-bar.js +22 -0
  657. package/dist/tui/agent-view/status-bar.js.map +1 -0
  658. package/dist/tui/app.d.ts +9 -0
  659. package/dist/tui/app.d.ts.map +1 -0
  660. package/dist/tui/app.js +115 -0
  661. package/dist/tui/app.js.map +1 -0
  662. package/dist/tui/banner.d.ts +5 -0
  663. package/dist/tui/banner.d.ts.map +1 -0
  664. package/dist/tui/banner.js +17 -0
  665. package/dist/tui/banner.js.map +1 -0
  666. package/dist/tui/command-form.d.ts +9 -0
  667. package/dist/tui/command-form.d.ts.map +1 -0
  668. package/dist/tui/command-form.js +76 -0
  669. package/dist/tui/command-form.js.map +1 -0
  670. package/dist/tui/command-tree.d.ts +30 -0
  671. package/dist/tui/command-tree.d.ts.map +1 -0
  672. package/dist/tui/command-tree.js +43 -0
  673. package/dist/tui/command-tree.js.map +1 -0
  674. package/dist/tui/fleet-view/agent-row.d.ts +10 -0
  675. package/dist/tui/fleet-view/agent-row.d.ts.map +1 -0
  676. package/dist/tui/fleet-view/agent-row.js +80 -0
  677. package/dist/tui/fleet-view/agent-row.js.map +1 -0
  678. package/dist/tui/fleet-view/dispatch-input.d.ts +5 -0
  679. package/dist/tui/fleet-view/dispatch-input.d.ts.map +1 -0
  680. package/dist/tui/fleet-view/dispatch-input.js +36 -0
  681. package/dist/tui/fleet-view/dispatch-input.js.map +1 -0
  682. package/dist/tui/fleet-view/fleet-app.d.ts +11 -0
  683. package/dist/tui/fleet-view/fleet-app.d.ts.map +1 -0
  684. package/dist/tui/fleet-view/fleet-app.js +95 -0
  685. package/dist/tui/fleet-view/fleet-app.js.map +1 -0
  686. package/dist/tui/fleet-view/fleet-summary.d.ts +6 -0
  687. package/dist/tui/fleet-view/fleet-summary.d.ts.map +1 -0
  688. package/dist/tui/fleet-view/fleet-summary.js +19 -0
  689. package/dist/tui/fleet-view/fleet-summary.js.map +1 -0
  690. package/dist/tui/fleet-view/index.d.ts +16 -0
  691. package/dist/tui/fleet-view/index.d.ts.map +1 -0
  692. package/dist/tui/fleet-view/index.js +65 -0
  693. package/dist/tui/fleet-view/index.js.map +1 -0
  694. package/dist/tui/runner.d.ts +7 -0
  695. package/dist/tui/runner.d.ts.map +1 -0
  696. package/dist/tui/runner.js +36 -0
  697. package/dist/tui/runner.js.map +1 -0
  698. package/dist/tui/theme.d.ts +8 -0
  699. package/dist/tui/theme.d.ts.map +1 -0
  700. package/dist/tui/theme.js +10 -0
  701. package/dist/tui/theme.js.map +1 -0
  702. package/package.json +16 -7
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Git isolation protocol for the fleet — the safety layer that makes it
3
+ * *physically impossible* for two parallel subagents to clobber each other's
4
+ * files, and that makes it *impossible to lose* any work an agent committed.
5
+ *
6
+ * The original fleet ran every subagent against one shared working tree and
7
+ * tried to avoid collisions with a guess: tasks whose *predicted* `files[]`
8
+ * overlapped were serialized. That guess fails the moment an agent edits a file
9
+ * it didn't predict — two writes interleave and you get a half-written file,
10
+ * before any commit exists to recover from. The fix is not "commit more
11
+ * cleverly", it's isolation: give each agent its own checkout.
12
+ *
13
+ * The model (a correct, minimal version of "branch-per-change, replay-on-merge"):
14
+ *
15
+ * 1. SPAWN — each task gets its own `git worktree` on its own branch, cut
16
+ * from a single frozen base ref. Separate index, separate HEAD,
17
+ * separate files: file-level clobbering is now structurally
18
+ * impossible, not merely discouraged.
19
+ * 2. CHECKPOINT — the agent's changes are committed atomically, and every
20
+ * commit hash is pinned under `refs/oxagen/agents/<task>/<n>`.
21
+ * A pinned commit is content-addressed and immune to branch
22
+ * deletion and `git gc`: work can be orphaned but never lost.
23
+ * 3. INTEGRATE — task branches are merged back into one integration branch
24
+ * *one at a time* (a mutex), with `rerere` enabled. A merge that
25
+ * conflicts is **aborted**, leaving the integration tree clean,
26
+ * and the conflict is *surfaced* (the files are returned) instead
27
+ * of silently corrupting anything. Conflicts are relocated to an
28
+ * explicit, owned step — they are not made to disappear, because
29
+ * for *code* that is impossible in general (two semantically
30
+ * contradictory edits can't both be right).
31
+ * 4. DISPOSE — worktrees and branches are torn down, but the
32
+ * `refs/oxagen/agents/*` pins are kept. `git for-each-ref
33
+ * refs/oxagen/agents` is then a durable log of every atomic
34
+ * change the fleet ever made, recoverable by hash.
35
+ *
36
+ * Git is shelled via {@link GitRunner} (injectable) so the orchestrator's unit
37
+ * tests stay filesystem-free; the real runner uses `node:child_process`,
38
+ * matching the rest of the CLI (no git library dependency).
39
+ */
40
+ import { execFile } from "node:child_process";
41
+ import { mkdirSync, existsSync, readFileSync, appendFileSync } from "node:fs";
42
+ import { join } from "node:path";
43
+ import { promisify } from "node:util";
44
+ const pexec = promisify(execFile);
45
+ /** The real runner: `git <args>` via child_process, rooted at the repo. */
46
+ export function defaultGitRunner(repoRoot) {
47
+ return async (args, cwd) => {
48
+ try {
49
+ const { stdout, stderr } = await pexec("git", args, {
50
+ cwd: cwd ?? repoRoot,
51
+ maxBuffer: 64 * 1024 * 1024,
52
+ });
53
+ return { stdout, stderr, code: 0 };
54
+ }
55
+ catch (e) {
56
+ const err = e;
57
+ return {
58
+ stdout: err.stdout ?? "",
59
+ stderr: err.stderr ?? err.message ?? "",
60
+ code: typeof err.code === "number" ? err.code : 1,
61
+ };
62
+ }
63
+ };
64
+ }
65
+ /** Allowed characters in a branch/path segment derived from a task id. */
66
+ function safeSegment(id) {
67
+ return id.replace(/[^A-Za-z0-9._-]/g, "-").replace(/^-+|-+$/g, "") || "task";
68
+ }
69
+ /**
70
+ * Owns the worktrees, branches, and durability pins for one fleet run.
71
+ *
72
+ * One instance per {@link Fleet}. Methods are safe to call from many concurrent
73
+ * agents: `spawn`/`checkpoint`/`dispose` operate on disjoint worktrees, and
74
+ * `integrate` is serialized internally so two merges never race on the
75
+ * integration branch.
76
+ */
77
+ export class WorktreeManager {
78
+ opts;
79
+ git;
80
+ ns;
81
+ repoRoot;
82
+ root;
83
+ /** The frozen commit every task branch is cut from. */
84
+ baseRef = "";
85
+ /** Lazily-created integration worktree path + branch. */
86
+ integration = null;
87
+ initialized = false;
88
+ /** Per-task pin sequence + recorded checkpoints (the durability log). */
89
+ seq = new Map();
90
+ commits = new Map();
91
+ /** Worktrees handed out, by task id. */
92
+ worktrees = new Map();
93
+ /** Serializes `integrate` so concurrent finishers can't race the merge. */
94
+ integrateLock = Promise.resolve();
95
+ constructor(opts) {
96
+ this.opts = opts;
97
+ this.git = opts.git ?? defaultGitRunner(opts.repoRoot);
98
+ this.ns = safeSegment(opts.namespace ?? "fleet");
99
+ this.repoRoot = opts.repoRoot;
100
+ this.root = opts.root ?? join(opts.repoRoot, ".oxagen", "worktrees");
101
+ }
102
+ /**
103
+ * Resolve the repo toplevel, freeze the base ref, enable `rerere`, and keep
104
+ * the worktree root out of git's sight. Idempotent.
105
+ */
106
+ async init() {
107
+ if (this.initialized)
108
+ return;
109
+ const top = await this.git(["rev-parse", "--show-toplevel"]);
110
+ if (top.code !== 0) {
111
+ throw new Error(`git isolation: not a git repository (${top.stderr.trim()})`);
112
+ }
113
+ this.repoRoot = top.stdout.trim();
114
+ if (!this.opts.root)
115
+ this.root = join(this.repoRoot, ".oxagen", "worktrees");
116
+ const head = await this.git(["rev-parse", "HEAD"]);
117
+ if (head.code !== 0)
118
+ throw new Error(`git isolation: cannot resolve HEAD (${head.stderr.trim()})`);
119
+ this.baseRef = head.stdout.trim();
120
+ // rerere makes repeated conflict resolutions idempotent — a resolver agent
121
+ // (or human) resolves a given conflict once and git replays it thereafter.
122
+ await this.git(["config", "rerere.enabled", "true"]);
123
+ this.excludeWorktreeRoot();
124
+ mkdirSync(this.root, { recursive: true });
125
+ this.initialized = true;
126
+ }
127
+ /** The frozen base every task fans out from. */
128
+ get base() {
129
+ return this.baseRef;
130
+ }
131
+ /**
132
+ * Create an isolated worktree for `taskId` and return its path. The agent runs
133
+ * with this as its `cwd`; nothing it does can touch another agent's tree.
134
+ */
135
+ async spawn(taskId) {
136
+ await this.init();
137
+ const seg = safeSegment(taskId);
138
+ const branch = `fleet/${this.ns}/t/${seg}`;
139
+ const path = join(this.root, this.ns, `t-${seg}`);
140
+ // A re-run may leave a stale worktree/branch behind; clear it first.
141
+ await this.removeWorktree(path);
142
+ await this.git(["branch", "-D", branch]); // ignore "not found"
143
+ const add = await this.git(["worktree", "add", "-b", branch, path, this.baseRef]);
144
+ if (add.code !== 0) {
145
+ throw new Error(`git isolation: worktree add failed for ${taskId}: ${add.stderr.trim()}`);
146
+ }
147
+ this.worktrees.set(taskId, { path, branch });
148
+ return path;
149
+ }
150
+ /**
151
+ * Atomically commit whatever the agent changed in its worktree and pin the
152
+ * commit under `refs/oxagen/agents/<task>/<n>`. Returns the checkpoint, or
153
+ * `null` when the agent changed nothing.
154
+ */
155
+ async checkpoint(taskId, message) {
156
+ const wt = this.worktrees.get(taskId);
157
+ if (!wt)
158
+ throw new Error(`git isolation: no worktree for ${taskId} (call spawn first)`);
159
+ await this.git(["add", "-A"], wt.path);
160
+ const status = await this.git(["status", "--porcelain"], wt.path);
161
+ if (status.code === 0 && status.stdout.trim() === "")
162
+ return null; // nothing changed
163
+ // --no-verify: these are fine-grained per-step commits; the gate runs at
164
+ // integration / CI, not on every micro-commit.
165
+ const commit = await this.git(["commit", "--no-verify", "-m", message], wt.path);
166
+ if (commit.code !== 0) {
167
+ throw new Error(`git isolation: commit failed for ${taskId}: ${commit.stderr.trim()}`);
168
+ }
169
+ const rev = await this.git(["rev-parse", "HEAD"], wt.path);
170
+ const hash = rev.stdout.trim();
171
+ const n = (this.seq.get(taskId) ?? 0) + 1;
172
+ this.seq.set(taskId, n);
173
+ const ref = `refs/oxagen/agents/${safeSegment(taskId)}/${n}`;
174
+ await this.git(["update-ref", ref, hash]); // pin: survives branch deletion + gc
175
+ const cp = { taskId, hash, ref, message };
176
+ const list = this.commits.get(taskId) ?? [];
177
+ list.push(cp);
178
+ this.commits.set(taskId, list);
179
+ return cp;
180
+ }
181
+ /** Every pinned checkpoint recorded for a task — the durability log. */
182
+ recordedCommits(taskId) {
183
+ return this.commits.get(taskId) ?? [];
184
+ }
185
+ /**
186
+ * Merge a task's branch into the integration branch. Serialized so two merges
187
+ * never race. A conflicting merge is aborted (integration tree left clean) and
188
+ * the conflicting files are returned — never a corrupt half-merge.
189
+ */
190
+ integrate(taskId, message) {
191
+ return this.withIntegrateLock(() => this.doIntegrate(taskId, message));
192
+ }
193
+ async doIntegrate(taskId, message) {
194
+ const wt = this.worktrees.get(taskId);
195
+ if (!wt)
196
+ throw new Error(`git isolation: no worktree for ${taskId}`);
197
+ const int = await this.ensureIntegration();
198
+ const msg = message ?? `fleet(${taskId}): integrate`;
199
+ const merge = await this.git(["merge", "--no-ff", "-m", msg, wt.branch], int.path);
200
+ if (merge.code === 0) {
201
+ const tip = await this.git(["rev-parse", "HEAD"], int.path);
202
+ return { ok: true, commit: tip.stdout.trim(), taskBranch: wt.branch };
203
+ }
204
+ // Conflict. rerere may already have replayed a recorded resolution — if no
205
+ // files remain unmerged, commit it and report success.
206
+ const unmerged = await this.git(["diff", "--name-only", "--diff-filter=U"], int.path);
207
+ const conflicts = unmerged.stdout.split("\n").map((l) => l.trim()).filter(Boolean);
208
+ if (conflicts.length === 0) {
209
+ const done = await this.git(["commit", "--no-verify", "--no-edit"], int.path);
210
+ if (done.code === 0) {
211
+ const tip = await this.git(["rev-parse", "HEAD"], int.path);
212
+ return { ok: true, commit: tip.stdout.trim(), taskBranch: wt.branch, autoResolved: true };
213
+ }
214
+ }
215
+ // Real conflict: abort so the integration tree stays clean, and surface it.
216
+ await this.git(["merge", "--abort"], int.path);
217
+ const tip = await this.git(["rev-parse", wt.branch]);
218
+ return { ok: false, conflicts, taskBranch: wt.branch, taskTip: tip.stdout.trim() };
219
+ }
220
+ /** The integration branch + its worktree path, once at least one integrate ran. */
221
+ integrationRef() {
222
+ return this.integration;
223
+ }
224
+ /**
225
+ * Remove a task's worktree. Keeps the branch and the `refs/oxagen/agents` pins
226
+ * (so nothing is lost). Pass `keep` to leave the worktree on disk — e.g. after
227
+ * a conflict, so a resolver agent or human can work in it.
228
+ */
229
+ async dispose(taskId, opts = {}) {
230
+ const wt = this.worktrees.get(taskId);
231
+ if (!wt || opts.keep)
232
+ return;
233
+ await this.removeWorktree(wt.path);
234
+ this.worktrees.delete(taskId);
235
+ }
236
+ /**
237
+ * Tear down every worktree and prune. Keeps the integration branch (the
238
+ * result) and all `refs/oxagen/agents` pins (the durability log).
239
+ */
240
+ async cleanupAll() {
241
+ for (const [id, wt] of this.worktrees) {
242
+ await this.removeWorktree(wt.path);
243
+ this.worktrees.delete(id);
244
+ }
245
+ if (this.integration)
246
+ await this.removeWorktree(this.integration.path);
247
+ await this.git(["worktree", "prune"]);
248
+ }
249
+ // ── internals ────────────────────────────────────────────────────────────
250
+ async ensureIntegration() {
251
+ if (this.integration)
252
+ return this.integration;
253
+ const branch = `fleet/${this.ns}/integration`;
254
+ const path = join(this.root, this.ns, "integration");
255
+ await this.removeWorktree(path);
256
+ await this.git(["branch", "-D", branch]);
257
+ const add = await this.git(["worktree", "add", "-b", branch, path, this.baseRef]);
258
+ if (add.code !== 0) {
259
+ throw new Error(`git isolation: integration worktree failed: ${add.stderr.trim()}`);
260
+ }
261
+ this.integration = { path, branch };
262
+ return this.integration;
263
+ }
264
+ async removeWorktree(path) {
265
+ if (!existsSync(path))
266
+ return;
267
+ await this.git(["worktree", "remove", "--force", path]);
268
+ }
269
+ async withIntegrateLock(fn) {
270
+ const run = this.integrateLock.then(fn, fn);
271
+ this.integrateLock = run.then(() => undefined, () => undefined);
272
+ return run;
273
+ }
274
+ /** Keep `.oxagen/` out of git's untracked list without touching tracked .gitignore. */
275
+ excludeWorktreeRoot() {
276
+ try {
277
+ const exclude = join(this.repoRoot, ".git", "info", "exclude");
278
+ if (!existsSync(exclude))
279
+ return;
280
+ const body = readFileSync(exclude, "utf8");
281
+ if (!body.split("\n").some((l) => l.trim() === ".oxagen/")) {
282
+ appendFileSync(exclude, `${body.endsWith("\n") ? "" : "\n"}.oxagen/\n`);
283
+ }
284
+ }
285
+ catch {
286
+ /* best-effort; isolation still works if we can't write the exclude */
287
+ }
288
+ }
289
+ }
290
+ //# sourceMappingURL=git-isolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-isolation.js","sourceRoot":"","sources":["../../../src/agent/fleet/git-isolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { MemoryRecord } from "./types.js";
2
+ export interface FleetMemory {
3
+ /** Append a weighted lesson. Never throws — recording must not break a run. */
4
+ record(rec: Omit<MemoryRecord, "id" | "createdAt">): void;
5
+ /** Return the most relevant lessons for a query, best first. */
6
+ recall(query: string, opts?: {
7
+ limit?: number;
8
+ files?: string[];
9
+ }): MemoryRecord[];
10
+ /** All records, newest first (for the agents screen memory panel). */
11
+ all(): MemoryRecord[];
12
+ }
13
+ /**
14
+ * Open (or create) the project's fleet memory. Reads are cached in-process and
15
+ * invalidated on every write, so a long-lived REPL/agents screen sees its own
16
+ * appends without re-reading the file each recall.
17
+ */
18
+ export declare function openFleetMemory(cwd: string): FleetMemory;
19
+ /** Render recalled lessons as a compact context block for prompt injection. */
20
+ export declare function formatLessons(records: MemoryRecord[]): string;
21
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/agent/fleet/memory.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwB/C,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC;IAC1D,gEAAgE;IAChE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,YAAY,EAAE,CAAC;IACnF,sEAAsE;IACtE,GAAG,IAAI,YAAY,EAAE,CAAC;CACvB;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAkExD;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAS7D"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Fleet memory — a local, dependency-free record of what the agent army builds
3
+ * and fixes, with lexical recall.
4
+ *
5
+ * This complements the engram/DuckDB episodic store ({@link openSessionMemory}).
6
+ * That store is best-effort and silently disables itself when its optional native
7
+ * dependency is missing; this one is plain JSON Lines on disk, so memory
8
+ * recording is *guaranteed* — which is what the user asked for ("record the
9
+ * memories as it fixes/builds things"). It mirrors the platform's weighted
10
+ * `agent.memory.write` shape (kind + weight + lesson) so the same lessons can be
11
+ * promoted to the knowledge graph later.
12
+ *
13
+ * Recall is a transparent lexical scorer (term overlap + file overlap + weight),
14
+ * not embeddings: it needs no model call, works offline, and is good enough to
15
+ * surface the handful of relevant lessons that should steer the next task.
16
+ */
17
+ import { mkdirSync, appendFileSync, readFileSync, existsSync } from "node:fs";
18
+ import { homedir } from "node:os";
19
+ import { basename, dirname, join } from "node:path";
20
+ /** Stable per-project key from the working directory name. */
21
+ function projectKey(cwd) {
22
+ return basename(cwd) || "default";
23
+ }
24
+ function memoryPath(cwd) {
25
+ return join(homedir(), ".config", "oxagen", "memories", `${projectKey(cwd)}.jsonl`);
26
+ }
27
+ const STOPWORDS = new Set([
28
+ "the", "a", "an", "and", "or", "to", "of", "in", "on", "for", "with", "is",
29
+ "are", "be", "this", "that", "it", "as", "at", "by", "from", "into", "we",
30
+ "you", "i", "fix", "add", "the", "use", "code", "file", "files",
31
+ ]);
32
+ /** Split text into lowercased, de-stopped terms for lexical scoring. */
33
+ function terms(text) {
34
+ return (text.toLowerCase().match(/[a-z0-9_]+/g) ?? []).filter((t) => t.length > 2 && !STOPWORDS.has(t));
35
+ }
36
+ let counter = 0;
37
+ function newId() {
38
+ counter = (counter + 1) % 1_000_000;
39
+ return `mem_${Date.now().toString(36)}_${counter.toString(36)}`;
40
+ }
41
+ /**
42
+ * Open (or create) the project's fleet memory. Reads are cached in-process and
43
+ * invalidated on every write, so a long-lived REPL/agents screen sees its own
44
+ * appends without re-reading the file each recall.
45
+ */
46
+ export function openFleetMemory(cwd) {
47
+ const path = memoryPath(cwd);
48
+ let cache = null;
49
+ function load() {
50
+ if (cache)
51
+ return cache;
52
+ if (!existsSync(path)) {
53
+ cache = [];
54
+ return cache;
55
+ }
56
+ try {
57
+ const lines = readFileSync(path, "utf8").split("\n").filter(Boolean);
58
+ cache = lines
59
+ .map((l) => {
60
+ try {
61
+ return JSON.parse(l);
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ })
67
+ .filter((r) => r !== null);
68
+ }
69
+ catch {
70
+ cache = [];
71
+ }
72
+ return cache;
73
+ }
74
+ return {
75
+ record(rec) {
76
+ const full = { ...rec, id: newId(), createdAt: Date.now() };
77
+ try {
78
+ mkdirSync(dirname(path), { recursive: true });
79
+ appendFileSync(path, JSON.stringify(full) + "\n", "utf8");
80
+ if (cache)
81
+ cache.push(full);
82
+ else
83
+ cache = [full];
84
+ }
85
+ catch {
86
+ /* memory is best-effort — never break the run over a failed append */
87
+ }
88
+ },
89
+ recall(query, opts = {}) {
90
+ const limit = opts.limit ?? 5;
91
+ const qTerms = new Set(terms(query));
92
+ const qFiles = new Set((opts.files ?? []).map((f) => f));
93
+ const weightBoost = { low: 0, high: 1, critical: 2 };
94
+ const scored = load()
95
+ .map((r) => {
96
+ const rTerms = terms(r.lesson + " " + r.files.join(" "));
97
+ let overlap = 0;
98
+ for (const t of rTerms)
99
+ if (qTerms.has(t))
100
+ overlap++;
101
+ let fileOverlap = 0;
102
+ for (const f of r.files)
103
+ if (qFiles.has(f))
104
+ fileOverlap++;
105
+ const score = overlap + fileOverlap * 3 + weightBoost[r.weight];
106
+ return { r, score };
107
+ })
108
+ .filter((s) => s.score > 0)
109
+ .sort((a, b) => b.score - a.score || b.r.createdAt - a.r.createdAt);
110
+ return scored.slice(0, limit).map((s) => s.r);
111
+ },
112
+ all() {
113
+ return [...load()].sort((a, b) => b.createdAt - a.createdAt);
114
+ },
115
+ };
116
+ }
117
+ /** Render recalled lessons as a compact context block for prompt injection. */
118
+ export function formatLessons(records) {
119
+ if (records.length === 0)
120
+ return "";
121
+ return records
122
+ .map((r) => {
123
+ const mark = r.weight === "critical" ? "‼" : r.weight === "high" ? "!" : "·";
124
+ const files = r.files.length ? ` [${r.files.slice(0, 3).join(", ")}]` : "";
125
+ return `${mark} (${r.kind}) ${r.lesson}${files}`;
126
+ })
127
+ .join("\n");
128
+ }
129
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/agent/fleet/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * The fleet orchestrator — an army of coding subagents working one tree at once.
3
+ *
4
+ * Each task is run by a subagent: the local coding loop ({@link runAgent}) on the
5
+ * cheapest sufficient model, against the same working directory. The orchestrator
6
+ * keeps as many running as the concurrency cap allows while respecting two safety
7
+ * rules so parallel agents never corrupt the tree or each other:
8
+ *
9
+ * 1. Dependencies — a task waits until every task it `dependsOn` is `done`; if a
10
+ * dependency fails, the task (and its dependents) are marked `blocked`.
11
+ * 2. File ownership — two tasks whose predicted `files` overlap are serialized,
12
+ * so two agents never edit the same file at the same time.
13
+ *
14
+ * It records a weighted memory for every task it finishes (success or failure),
15
+ * accumulates token/cost totals, and emits a snapshot on every change for the
16
+ * agents screen to render. `runAgent` is injected so the engine is unit-testable
17
+ * without touching the gateway.
18
+ */
19
+ import { EventEmitter } from "node:events";
20
+ import type { ProjectContext } from "../project-context.js";
21
+ import type { AgentDefinition } from "../../agents/types.js";
22
+ import type { FleetMemory } from "./memory.js";
23
+ import type { PlanStore } from "./store.js";
24
+ import type { Isolation } from "./git-isolation.js";
25
+ import { type FleetSnapshot, type Plan } from "./types.js";
26
+ /** The subset of {@link runAgent} the fleet depends on (injectable for tests). */
27
+ export type AgentRunner = (opts: {
28
+ prompt: string;
29
+ cwd: string;
30
+ model?: string;
31
+ projectContext?: ProjectContext;
32
+ agent?: AgentDefinition;
33
+ readOnly?: boolean;
34
+ signal?: AbortSignal;
35
+ onText?: (delta: string) => void;
36
+ onToolCall?: (name: string, input: unknown) => void;
37
+ }) => Promise<{
38
+ text: string;
39
+ steps: number;
40
+ usage: {
41
+ inputTokens?: number;
42
+ outputTokens?: number;
43
+ };
44
+ }>;
45
+ export interface FleetOptions {
46
+ cwd: string;
47
+ /** Max subagents running at once (default 4). */
48
+ concurrency?: number;
49
+ memory?: FleetMemory | null;
50
+ store?: PlanStore | null;
51
+ projectContext?: ProjectContext;
52
+ /** Named agent registry; a task's `agent` is looked up here at dispatch. */
53
+ agents?: Map<string, AgentDefinition>;
54
+ /** Inject a fake runner in tests; defaults to the real {@link runAgent}. */
55
+ runner?: AgentRunner;
56
+ /** Read-only subagents (explain, don't edit). */
57
+ readOnly?: boolean;
58
+ /**
59
+ * Per-task git isolation. When set, each agent runs in its own worktree and
60
+ * its work is checkpointed + integrated via explicit merges, so parallel
61
+ * agents physically cannot clobber the tree. When omitted (default), all
62
+ * agents share `cwd` and overlapping-file tasks are serialized instead.
63
+ */
64
+ isolation?: Isolation | null;
65
+ }
66
+ export declare class Fleet extends EventEmitter {
67
+ private readonly cwd;
68
+ private readonly concurrency;
69
+ private readonly memory;
70
+ private readonly store;
71
+ private readonly projectContext;
72
+ private readonly agents;
73
+ private readonly runner;
74
+ private readonly readOnly;
75
+ private readonly isolation;
76
+ private readonly tasks;
77
+ private readonly snapshots;
78
+ private readonly controllers;
79
+ private readonly running;
80
+ private planId;
81
+ private settle;
82
+ private donePromise;
83
+ private adhocCounter;
84
+ constructor(opts: FleetOptions);
85
+ /** Register every task in a plan (does not start it). */
86
+ loadPlan(plan: Plan): void;
87
+ /** Add one ad-hoc task (e.g. typed into the agents screen). Returns its id. */
88
+ dispatchPrompt(prompt: string): string;
89
+ /** Begin scheduling. Resolves when every task has reached a terminal state. */
90
+ start(): Promise<void>;
91
+ /** Cancel one running/queued task. */
92
+ cancelTask(id: string): void;
93
+ /** Cancel everything in flight. */
94
+ cancelAll(): void;
95
+ snapshot(): FleetSnapshot;
96
+ /** Fill open slots with ready tasks, honouring deps and file-ownership locks. */
97
+ private pump;
98
+ /** The next queued task whose deps are all done and whose files are free. */
99
+ private pickReady;
100
+ private run;
101
+ private recordSuccess;
102
+ private recordFailure;
103
+ private toSnapshot;
104
+ private update;
105
+ private emitUpdate;
106
+ private checkDone;
107
+ }
108
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/agent/fleet/orchestrator.ts"],"names":[],"mappings":"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"}