borgmcp 1.1.15 → 2.0.2

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 (466) hide show
  1. package/CONTRIBUTING.md +15 -0
  2. package/LICENSE +201 -33
  3. package/NOTICE +2 -0
  4. package/README.md +85 -36
  5. package/SECURITY.md +7 -0
  6. package/dist/agent-runtime.d.ts.map +1 -0
  7. package/dist/agent-runtime.js +63 -1
  8. package/dist/agent-runtime.js.map +1 -0
  9. package/dist/assimilate-cmd.d.ts +96 -17
  10. package/dist/assimilate-cmd.d.ts.map +1 -0
  11. package/dist/assimilate-cmd.js +1396 -48
  12. package/dist/assimilate-cmd.js.map +1 -0
  13. package/dist/assimilate-deps.d.ts.map +1 -0
  14. package/dist/assimilate-deps.js +384 -3
  15. package/dist/assimilate-deps.js.map +1 -0
  16. package/dist/assimilate-guard.d.ts +5 -7
  17. package/dist/assimilate-guard.d.ts.map +1 -0
  18. package/dist/assimilate-guard.js +60 -2
  19. package/dist/assimilate-guard.js.map +1 -0
  20. package/dist/assimilate-welcome.d.ts +1 -1
  21. package/dist/assimilate-welcome.d.ts.map +1 -0
  22. package/dist/assimilate-welcome.js +32 -2
  23. package/dist/assimilate-welcome.js.map +1 -0
  24. package/dist/auth-env.d.ts +7 -50
  25. package/dist/auth-env.d.ts.map +1 -0
  26. package/dist/auth-env.js +22 -1
  27. package/dist/auth-env.js.map +1 -0
  28. package/dist/backends/launch-all-pastelist.d.ts.map +1 -0
  29. package/dist/backends/launch-all-pastelist.js +11 -4
  30. package/dist/backends/launch-all-pastelist.js.map +1 -0
  31. package/dist/backends/launch-all-tmux.d.ts.map +1 -0
  32. package/dist/backends/launch-all-tmux.js +49 -1
  33. package/dist/backends/launch-all-tmux.js.map +1 -0
  34. package/dist/backends/launch-all-windows.d.ts.map +1 -0
  35. package/dist/backends/launch-all-windows.js +86 -12
  36. package/dist/backends/launch-all-windows.js.map +1 -0
  37. package/dist/bare-launch-menu.d.ts.map +1 -0
  38. package/dist/bare-launch-menu.js +83 -6
  39. package/dist/bare-launch-menu.js.map +1 -0
  40. package/dist/claude-launch-args.d.ts.map +1 -0
  41. package/dist/claude-launch-args.js +34 -1
  42. package/dist/claude-launch-args.js.map +1 -0
  43. package/dist/claude.d.ts.map +1 -0
  44. package/dist/claude.js +486 -14
  45. package/dist/claude.js.map +1 -0
  46. package/dist/cleanup-cmd.d.ts +5 -5
  47. package/dist/cleanup-cmd.d.ts.map +1 -0
  48. package/dist/cleanup-cmd.js +453 -14
  49. package/dist/cleanup-cmd.js.map +1 -0
  50. package/dist/clear-rewake-core.d.ts.map +1 -0
  51. package/dist/clear-rewake-core.js +23 -2
  52. package/dist/clear-rewake-core.js.map +1 -0
  53. package/dist/clear-rewake.d.ts.map +1 -0
  54. package/dist/clear-rewake.js +19 -1
  55. package/dist/clear-rewake.js.map +1 -0
  56. package/dist/cli-help.d.ts +5 -0
  57. package/dist/cli-help.d.ts.map +1 -0
  58. package/dist/cli-help.js +104 -56
  59. package/dist/cli-help.js.map +1 -0
  60. package/dist/cli-platform.d.ts.map +1 -0
  61. package/dist/cli-platform.js +106 -4
  62. package/dist/cli-platform.js.map +1 -0
  63. package/dist/cli-tool-approval.d.ts +84 -0
  64. package/dist/cli-tool-approval.d.ts.map +1 -0
  65. package/dist/cli-tool-approval.js +583 -0
  66. package/dist/cli-tool-approval.js.map +1 -0
  67. package/dist/codex-app-server.d.ts.map +1 -0
  68. package/dist/codex-app-server.js +228 -4
  69. package/dist/codex-app-server.js.map +1 -0
  70. package/dist/codex-app-wake.d.ts +9 -11
  71. package/dist/codex-app-wake.d.ts.map +1 -0
  72. package/dist/codex-app-wake.js +436 -2
  73. package/dist/codex-app-wake.js.map +1 -0
  74. package/dist/codex-launch.d.ts.map +1 -0
  75. package/dist/codex-launch.js +102 -2
  76. package/dist/codex-launch.js.map +1 -0
  77. package/dist/codex-remote.d.ts +6 -1
  78. package/dist/codex-remote.d.ts.map +1 -0
  79. package/dist/codex-remote.js +394 -1
  80. package/dist/codex-remote.js.map +1 -0
  81. package/dist/codex-wake-resolve.d.ts +4 -4
  82. package/dist/codex-wake-resolve.d.ts.map +1 -0
  83. package/dist/codex-wake-resolve.js +127 -1
  84. package/dist/codex-wake-resolve.js.map +1 -0
  85. package/dist/config-utils.d.ts +2 -2
  86. package/dist/config-utils.d.ts.map +1 -0
  87. package/dist/config-utils.js +766 -3
  88. package/dist/config-utils.js.map +1 -0
  89. package/dist/config.d.ts +98 -61
  90. package/dist/config.d.ts.map +1 -0
  91. package/dist/config.js +426 -1
  92. package/dist/config.js.map +1 -0
  93. package/dist/console-prefix.d.ts.map +1 -0
  94. package/dist/console-prefix.js +96 -1
  95. package/dist/console-prefix.js.map +1 -0
  96. package/dist/cube-name.d.ts.map +1 -0
  97. package/dist/cube-name.js +67 -1
  98. package/dist/cube-name.js.map +1 -0
  99. package/dist/cubes.d.ts +126 -18
  100. package/dist/cubes.d.ts.map +1 -0
  101. package/dist/cubes.js +412 -4
  102. package/dist/cubes.js.map +1 -0
  103. package/dist/debug.d.ts.map +1 -0
  104. package/dist/debug.js +71 -1
  105. package/dist/debug.js.map +1 -0
  106. package/dist/direct-log.d.ts.map +1 -0
  107. package/dist/direct-log.js +11 -1
  108. package/dist/direct-log.js.map +1 -0
  109. package/dist/docs-sections.d.ts +11 -10
  110. package/dist/docs-sections.d.ts.map +1 -0
  111. package/dist/docs-sections.js +113 -3
  112. package/dist/docs-sections.js.map +1 -0
  113. package/dist/drone-lifecycle.d.ts +5 -21
  114. package/dist/drone-lifecycle.d.ts.map +1 -0
  115. package/dist/drone-lifecycle.js +57 -8
  116. package/dist/drone-lifecycle.js.map +1 -0
  117. package/dist/drone-management.d.ts +29 -0
  118. package/dist/drone-management.d.ts.map +1 -0
  119. package/dist/drone-management.js +109 -0
  120. package/dist/drone-management.js.map +1 -0
  121. package/dist/ensure-mcp-config.d.ts.map +1 -0
  122. package/dist/ensure-mcp-config.js +36 -1
  123. package/dist/ensure-mcp-config.js.map +1 -0
  124. package/dist/evict-drone.d.ts +10 -2
  125. package/dist/evict-drone.d.ts.map +1 -0
  126. package/dist/evict-drone.js +60 -1
  127. package/dist/evict-drone.js.map +1 -0
  128. package/dist/gc-orphan-inboxes.d.ts.map +1 -0
  129. package/dist/gc-orphan-inboxes.js +177 -1
  130. package/dist/gc-orphan-inboxes.js.map +1 -0
  131. package/dist/inbox-monitor.d.ts +1 -1
  132. package/dist/inbox-monitor.d.ts.map +1 -0
  133. package/dist/inbox-monitor.js +856 -3
  134. package/dist/inbox-monitor.js.map +1 -0
  135. package/dist/index.d.ts +6 -4
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +1034 -37
  138. package/dist/index.js.map +1 -0
  139. package/dist/launch-all-cmd.d.ts.map +1 -0
  140. package/dist/launch-all-cmd.js +377 -37
  141. package/dist/launch-all-cmd.js.map +1 -0
  142. package/dist/launch-all-command.d.ts.map +1 -0
  143. package/dist/launch-all-command.js +24 -1
  144. package/dist/launch-all-command.js.map +1 -0
  145. package/dist/launch-all-deps.d.ts +3 -8
  146. package/dist/launch-all-deps.d.ts.map +1 -0
  147. package/dist/launch-all-deps.js +99 -1
  148. package/dist/launch-all-deps.js.map +1 -0
  149. package/dist/launch-all-discovery.d.ts +1 -0
  150. package/dist/launch-all-discovery.d.ts.map +1 -0
  151. package/dist/launch-all-discovery.js +90 -4
  152. package/dist/launch-all-discovery.js.map +1 -0
  153. package/dist/launch-all-locks.d.ts.map +1 -0
  154. package/dist/launch-all-locks.js +54 -1
  155. package/dist/launch-all-locks.js.map +1 -0
  156. package/dist/launch-gate.d.ts +2 -2
  157. package/dist/launch-gate.d.ts.map +1 -0
  158. package/dist/launch-gate.js +73 -1
  159. package/dist/launch-gate.js.map +1 -0
  160. package/dist/lifecycle-log-guard.d.ts.map +1 -0
  161. package/dist/lifecycle-log-guard.js +93 -2
  162. package/dist/lifecycle-log-guard.js.map +1 -0
  163. package/dist/list-roles-render.d.ts.map +1 -0
  164. package/dist/list-roles-render.js +40 -6
  165. package/dist/list-roles-render.js.map +1 -0
  166. package/dist/local-log-routing.d.ts +19 -0
  167. package/dist/local-log-routing.d.ts.map +1 -0
  168. package/dist/local-log-routing.js +67 -0
  169. package/dist/local-log-routing.js.map +1 -0
  170. package/dist/local-manage-tool-result.d.ts +8 -0
  171. package/dist/local-manage-tool-result.d.ts.map +1 -0
  172. package/dist/local-manage-tool-result.js +10 -0
  173. package/dist/local-manage-tool-result.js.map +1 -0
  174. package/dist/local-server-cursor.d.ts +34 -0
  175. package/dist/local-server-cursor.d.ts.map +1 -0
  176. package/dist/local-server-cursor.js +151 -0
  177. package/dist/local-server-cursor.js.map +1 -0
  178. package/dist/log-audit.d.ts.map +1 -0
  179. package/dist/log-audit.js +194 -3
  180. package/dist/log-audit.js.map +1 -0
  181. package/dist/log-stream.d.ts +35 -18
  182. package/dist/log-stream.d.ts.map +1 -0
  183. package/dist/log-stream.js +1270 -12
  184. package/dist/log-stream.js.map +1 -0
  185. package/dist/model-presets.d.ts.map +1 -0
  186. package/dist/model-presets.js +19 -1
  187. package/dist/model-presets.js.map +1 -0
  188. package/dist/name-validator.d.ts.map +1 -0
  189. package/dist/name-validator.js +22 -1
  190. package/dist/name-validator.js.map +1 -0
  191. package/dist/opencode-drone.d.ts.map +1 -0
  192. package/dist/opencode-drone.js +438 -4
  193. package/dist/opencode-drone.js.map +1 -0
  194. package/dist/opencode-plugin.d.ts +1 -1
  195. package/dist/opencode-plugin.d.ts.map +1 -0
  196. package/dist/opencode-plugin.js +29 -4
  197. package/dist/opencode-plugin.js.map +1 -0
  198. package/dist/parse-assimilate-args.d.ts +1 -1
  199. package/dist/parse-assimilate-args.d.ts.map +1 -0
  200. package/dist/parse-assimilate-args.js +125 -1
  201. package/dist/parse-assimilate-args.js.map +1 -0
  202. package/dist/parse-launch-all-args.d.ts.map +1 -0
  203. package/dist/parse-launch-all-args.js +70 -1
  204. package/dist/parse-launch-all-args.js.map +1 -0
  205. package/dist/postinstall-banner.d.ts.map +1 -0
  206. package/dist/postinstall-banner.js +27 -2
  207. package/dist/postinstall-banner.js.map +1 -0
  208. package/dist/postinstall.d.ts.map +1 -0
  209. package/dist/postinstall.js +32 -5
  210. package/dist/postinstall.js.map +1 -0
  211. package/dist/readiness-probe.d.ts.map +1 -0
  212. package/dist/readiness-probe.js +9 -1
  213. package/dist/readiness-probe.js.map +1 -0
  214. package/dist/regen-format.d.ts.map +1 -0
  215. package/dist/regen-format.js +545 -13
  216. package/dist/regen-format.js.map +1 -0
  217. package/dist/regen.d.ts.map +1 -0
  218. package/dist/regen.js +141 -5
  219. package/dist/regen.js.map +1 -0
  220. package/dist/remote-client.d.ts +88 -173
  221. package/dist/remote-client.d.ts.map +1 -0
  222. package/dist/remote-client.js +997 -1
  223. package/dist/remote-client.js.map +1 -0
  224. package/dist/reset-local-seat-cmd.d.ts +50 -0
  225. package/dist/reset-local-seat-cmd.d.ts.map +1 -0
  226. package/dist/reset-local-seat-cmd.js +169 -0
  227. package/dist/reset-local-seat-cmd.js.map +1 -0
  228. package/dist/role-match.d.ts.map +1 -0
  229. package/dist/role-match.js +23 -1
  230. package/dist/role-match.js.map +1 -0
  231. package/dist/role-resolver.d.ts.map +1 -0
  232. package/dist/role-resolver.js +60 -1
  233. package/dist/role-resolver.js.map +1 -0
  234. package/dist/roster-render.d.ts.map +1 -0
  235. package/dist/roster-render.js +121 -3
  236. package/dist/roster-render.js.map +1 -0
  237. package/dist/seat-probe.d.ts +32 -13
  238. package/dist/seat-probe.d.ts.map +1 -0
  239. package/dist/seat-probe.js +78 -1
  240. package/dist/seat-probe.js.map +1 -0
  241. package/dist/seat-store.d.ts +76 -0
  242. package/dist/seat-store.d.ts.map +1 -0
  243. package/dist/seat-store.js +309 -0
  244. package/dist/seat-store.js.map +1 -0
  245. package/dist/seats.d.ts +375 -0
  246. package/dist/seats.d.ts.map +1 -0
  247. package/dist/seats.js +670 -0
  248. package/dist/seats.js.map +1 -0
  249. package/dist/self-path.d.ts +27 -0
  250. package/dist/self-path.d.ts.map +1 -0
  251. package/dist/self-path.js +43 -0
  252. package/dist/self-path.js.map +1 -0
  253. package/dist/server-endpoint.d.ts +9 -0
  254. package/dist/server-endpoint.d.ts.map +1 -0
  255. package/dist/server-endpoint.js +38 -0
  256. package/dist/server-endpoint.js.map +1 -0
  257. package/dist/server-errors.d.ts +50 -0
  258. package/dist/server-errors.d.ts.map +1 -0
  259. package/dist/server-errors.js +79 -0
  260. package/dist/server-errors.js.map +1 -0
  261. package/dist/server-handshake.d.ts +197 -0
  262. package/dist/server-handshake.d.ts.map +1 -0
  263. package/dist/server-handshake.js +533 -0
  264. package/dist/server-handshake.js.map +1 -0
  265. package/dist/server-response.d.ts +3 -0
  266. package/dist/server-response.d.ts.map +1 -0
  267. package/dist/server-response.js +67 -0
  268. package/dist/server-response.js.map +1 -0
  269. package/dist/server-trust.d.ts +14 -0
  270. package/dist/server-trust.d.ts.map +1 -0
  271. package/dist/server-trust.js +225 -0
  272. package/dist/server-trust.js.map +1 -0
  273. package/dist/session-continuity.d.ts +33 -0
  274. package/dist/session-continuity.d.ts.map +1 -0
  275. package/dist/session-continuity.js +220 -0
  276. package/dist/session-continuity.js.map +1 -0
  277. package/dist/setup-confirm.d.ts +3 -3
  278. package/dist/setup-confirm.d.ts.map +1 -0
  279. package/dist/setup-confirm.js +126 -2
  280. package/dist/setup-confirm.js.map +1 -0
  281. package/dist/setup.d.ts +5 -3
  282. package/dist/setup.d.ts.map +1 -0
  283. package/dist/setup.js +169 -46
  284. package/dist/setup.js.map +1 -0
  285. package/dist/shell-escape.d.ts.map +1 -0
  286. package/dist/shell-escape.js +22 -1
  287. package/dist/shell-escape.js.map +1 -0
  288. package/dist/spawn.d.ts +2 -2
  289. package/dist/spawn.d.ts.map +1 -0
  290. package/dist/spawn.js +29 -10
  291. package/dist/spawn.js.map +1 -0
  292. package/dist/startup-services.d.ts +0 -1
  293. package/dist/startup-services.d.ts.map +1 -0
  294. package/dist/startup-services.js +26 -1
  295. package/dist/startup-services.js.map +1 -0
  296. package/dist/stream-owner.d.ts +6 -2
  297. package/dist/stream-owner.d.ts.map +1 -0
  298. package/dist/stream-owner.js +547 -2
  299. package/dist/stream-owner.js.map +1 -0
  300. package/dist/stream-status.d.ts +1 -1
  301. package/dist/stream-status.d.ts.map +1 -0
  302. package/dist/stream-status.js +268 -3
  303. package/dist/stream-status.js.map +1 -0
  304. package/dist/sync-roles-render.d.ts.map +1 -0
  305. package/dist/sync-roles-render.js +118 -3
  306. package/dist/sync-roles-render.js.map +1 -0
  307. package/dist/sync.d.ts +1 -1
  308. package/dist/sync.d.ts.map +1 -0
  309. package/dist/sync.js +286 -22
  310. package/dist/sync.js.map +1 -0
  311. package/dist/terminal-title.d.ts.map +1 -0
  312. package/dist/terminal-title.js +68 -1
  313. package/dist/terminal-title.js.map +1 -0
  314. package/dist/token-store.d.ts +17 -111
  315. package/dist/token-store.d.ts.map +1 -0
  316. package/dist/token-store.js +81 -1
  317. package/dist/token-store.js.map +1 -0
  318. package/dist/tool-manifest.d.ts +4 -8
  319. package/dist/tool-manifest.d.ts.map +1 -0
  320. package/dist/tool-manifest.js +554 -1
  321. package/dist/tool-manifest.js.map +1 -0
  322. package/dist/tool-scope.d.ts +8 -12
  323. package/dist/tool-scope.d.ts.map +1 -0
  324. package/dist/tool-scope.js +97 -1
  325. package/dist/tool-scope.js.map +1 -0
  326. package/dist/types.d.ts +1 -5
  327. package/dist/types.d.ts.map +1 -0
  328. package/dist/types.js +5 -0
  329. package/dist/types.js.map +1 -0
  330. package/dist/unknown-subcommand.d.ts +1 -1
  331. package/dist/unknown-subcommand.d.ts.map +1 -0
  332. package/dist/unknown-subcommand.js +37 -1
  333. package/dist/unknown-subcommand.js.map +1 -0
  334. package/dist/version.d.ts +1 -1
  335. package/dist/version.d.ts.map +1 -0
  336. package/dist/version.js +78 -2
  337. package/dist/version.js.map +1 -0
  338. package/dist/working-repo.d.ts.map +1 -0
  339. package/dist/working-repo.js +81 -1
  340. package/dist/working-repo.js.map +1 -0
  341. package/dist/worktree-lifecycle.d.ts.map +1 -0
  342. package/dist/worktree-lifecycle.js +205 -2
  343. package/dist/worktree-lifecycle.js.map +1 -0
  344. package/docs/EXTRACTION_PROVENANCE.md +42 -0
  345. package/docs/LOCAL_SERVER.md +103 -0
  346. package/docs/RELEASING.md +129 -0
  347. package/package.json +52 -34
  348. package/src/agent-runtime.ts +69 -0
  349. package/src/assimilate-cmd.ts +1864 -0
  350. package/src/assimilate-deps.ts +444 -0
  351. package/src/assimilate-guard.ts +84 -0
  352. package/src/assimilate-welcome.ts +39 -0
  353. package/src/auth-env.ts +21 -0
  354. package/src/backends/launch-all-pastelist.ts +18 -0
  355. package/src/backends/launch-all-tmux.ts +75 -0
  356. package/src/backends/launch-all-windows.ts +110 -0
  357. package/src/bare-launch-menu.ts +148 -0
  358. package/src/claude-launch-args.ts +35 -0
  359. package/src/claude.ts +561 -0
  360. package/src/cleanup-cmd.ts +581 -0
  361. package/src/clear-rewake-core.ts +34 -0
  362. package/src/clear-rewake.ts +18 -0
  363. package/src/cli-help.ts +116 -0
  364. package/src/cli-platform.ts +127 -0
  365. package/src/cli-tool-approval.ts +716 -0
  366. package/src/codex-app-server.ts +238 -0
  367. package/src/codex-app-wake.ts +524 -0
  368. package/src/codex-launch.ts +140 -0
  369. package/src/codex-remote.ts +500 -0
  370. package/src/codex-wake-resolve.ts +155 -0
  371. package/src/config-utils.ts +811 -0
  372. package/src/config.ts +595 -0
  373. package/src/console-prefix.ts +99 -0
  374. package/src/cube-name.ts +69 -0
  375. package/src/cubes.ts +583 -0
  376. package/src/debug.ts +73 -0
  377. package/src/direct-log.ts +9 -0
  378. package/src/docs-sections.ts +129 -0
  379. package/src/drone-lifecycle.ts +62 -0
  380. package/src/drone-management.ts +162 -0
  381. package/src/ensure-mcp-config.ts +54 -0
  382. package/src/evict-drone.ts +82 -0
  383. package/src/gc-orphan-inboxes.ts +229 -0
  384. package/src/inbox-monitor.ts +1005 -0
  385. package/src/index.ts +1201 -0
  386. package/src/launch-all-cmd.ts +450 -0
  387. package/src/launch-all-command.ts +30 -0
  388. package/src/launch-all-deps.ts +188 -0
  389. package/src/launch-all-discovery.ts +118 -0
  390. package/src/launch-all-locks.ts +74 -0
  391. package/src/launch-gate.ts +80 -0
  392. package/src/lifecycle-log-guard.ts +144 -0
  393. package/src/list-roles-render.ts +52 -0
  394. package/src/local-log-routing.ts +106 -0
  395. package/src/local-manage-tool-result.ts +10 -0
  396. package/src/local-server-cursor.ts +188 -0
  397. package/src/log-audit.ts +207 -0
  398. package/src/log-stream.ts +1567 -0
  399. package/src/model-presets.ts +22 -0
  400. package/src/name-validator.ts +23 -0
  401. package/src/opencode-drone.ts +528 -0
  402. package/src/opencode-plugin.ts +38 -0
  403. package/src/parse-assimilate-args.ts +125 -0
  404. package/src/parse-launch-all-args.ts +100 -0
  405. package/src/postinstall-banner.ts +37 -0
  406. package/src/postinstall.ts +36 -0
  407. package/src/readiness-probe.ts +12 -0
  408. package/src/regen-format.ts +651 -0
  409. package/src/regen.ts +150 -0
  410. package/src/remote-client.ts +1457 -0
  411. package/src/reset-local-seat-cmd.ts +227 -0
  412. package/src/role-match.ts +29 -0
  413. package/src/role-resolver.ts +93 -0
  414. package/src/roster-render.ts +196 -0
  415. package/src/seat-probe.ts +115 -0
  416. package/src/seat-store.ts +333 -0
  417. package/src/seats.ts +911 -0
  418. package/src/self-path.ts +51 -0
  419. package/src/server-endpoint.ts +38 -0
  420. package/src/server-errors.ts +95 -0
  421. package/src/server-handshake.ts +816 -0
  422. package/src/server-response.ts +76 -0
  423. package/src/server-trust.ts +245 -0
  424. package/src/session-continuity.ts +280 -0
  425. package/src/setup-confirm.ts +171 -0
  426. package/src/setup.ts +186 -0
  427. package/src/shell-escape.ts +22 -0
  428. package/src/spawn.ts +31 -0
  429. package/src/startup-services.ts +36 -0
  430. package/src/stream-owner.ts +686 -0
  431. package/src/stream-status.ts +337 -0
  432. package/src/sync-roles-render.ts +163 -0
  433. package/src/sync.ts +363 -0
  434. package/src/terminal-title.ts +76 -0
  435. package/src/token-store.ts +102 -0
  436. package/src/tool-manifest.ts +610 -0
  437. package/src/tool-scope.ts +110 -0
  438. package/src/types.ts +5 -0
  439. package/src/unknown-subcommand.ts +35 -0
  440. package/src/version.ts +82 -0
  441. package/src/working-repo.ts +99 -0
  442. package/src/worktree-lifecycle.ts +254 -0
  443. package/dist/auth-recovery.d.ts +0 -33
  444. package/dist/auth-recovery.js +0 -1
  445. package/dist/auth.d.ts +0 -103
  446. package/dist/auth.js +0 -39
  447. package/dist/device-auth.d.ts +0 -75
  448. package/dist/device-auth.js +0 -1
  449. package/dist/drone-address.d.ts +0 -26
  450. package/dist/drone-address.js +0 -1
  451. package/dist/get-started.d.ts +0 -20
  452. package/dist/get-started.js +0 -2
  453. package/dist/health-beat.d.ts +0 -134
  454. package/dist/health-beat.js +0 -1
  455. package/dist/role-section.d.ts +0 -110
  456. package/dist/role-section.js +0 -8
  457. package/dist/setup-action.d.ts +0 -20
  458. package/dist/setup-action.js +0 -1
  459. package/dist/stale-version-check.d.ts +0 -40
  460. package/dist/stale-version-check.js +0 -1
  461. package/dist/subscription-retry.d.ts +0 -40
  462. package/dist/subscription-retry.js +0 -1
  463. package/dist/templates.d.ts +0 -107
  464. package/dist/templates.js +0 -359
  465. package/dist/token-crypto.d.ts +0 -50
  466. package/dist/token-crypto.js +0 -1
@@ -1,3 +1,113 @@
1
- const o="https://borgmcp.ai/docs",c=[{slug:"overview",title:"Overview",url:`${o}`,page:"index",summary:"What Borg MCP is + the cube / drone / role / log mental model.",keywords:["overview","what is","intro","mental model","how it works","start"]},{slug:"concepts",title:"Core concepts",url:`${o}/concepts`,page:"concepts",summary:"Cubes, drones, roles, the activity log + signals, claims, decisions.",keywords:["cube","drone","role","log","signal","claim","decision","coordinate","coordination"]},{slug:"cli",title:"CLI commands",url:`${o}/cli`,page:"cli",summary:"borg setup / assimilate / sync / cleanup / launch-all.",keywords:["cli","command","setup","install","assimilate","cleanup","worktree","launch","terminal"]},{slug:"plans",title:"Plans & limits",url:`${o}/tiers`,page:"tiers",summary:"Free vs Cube ($1/mo per cube) \u2014 sessions, requests, limits.",keywords:["plan","pricing","price","cost","billing","tier","free","paid","subscribe","limit","quota"]},{slug:"tools",title:"Tool reference",url:`${o}/tools`,page:"tools",summary:"Every borg_* tool \u2014 name, description, params (auto-generated).",keywords:["tool","tools","api","reference","param","borg_"]},{slug:"faq",title:"FAQ",url:`${o}/faq`,page:"faq",summary:"Common questions \u2014 agents, coordination, privacy, billing, SSH.",keywords:["faq","question","codex","privacy","private","cancel","ssh","remote","second agent"]}];function u(s){const t=s.toLowerCase().split(/[^a-z0-9_]+/).filter(e=>e.length>=2);if(t.length===0)return[];const i=c.map(e=>{const r=[e.slug,e.title,e.summary,...e.keywords].join(" ").toLowerCase(),a=t.filter(l=>r.includes(l)||e.keywords.some(n=>l.includes(n))).length;return{s:e,hits:a}}).filter(e=>e.hits>0);return i.sort((e,r)=>r.hits-e.hits),i.map(e=>e.s)}function m(s){return s.map(t=>`- ${t.title} \u2014 ${t.summary}
2
- ${t.url}`).join(`
3
- `)}export{o as DOCS_BASE_URL,c as DOCS_SECTIONS,m as formatDocsIndex,u as matchDocsSections};
1
+ /**
2
+ * The single source for the in-product docs index.
3
+ *
4
+ * `borg_docs` (index.ts) returns these sections so an agent can route a "how
5
+ * does borgmcp work / setup / concept / tool" question to the right
6
+ * repository-local document, then WebFetch the URL for the content. Pure data +
7
+ * a lazy keyword match — NO server-side fetch, NO RAG/embeddings.
8
+ *
9
+ * This is a local-only client: every URL points at the public source repository
10
+ * (its README + `docs/`), never a hosted product site.
11
+ *
12
+ * `page` is the repository-local file each section maps to (anti-drift anchor).
13
+ */
14
+ export const DOCS_BASE_URL = "https://github.com/Byte-Ventures/borg-mcp-client";
15
+ const README_URL = `${DOCS_BASE_URL}#readme`;
16
+ const LOCAL_SERVER_URL = `${DOCS_BASE_URL}/blob/main/docs/LOCAL_SERVER.md`;
17
+ export const DOCS_SECTIONS = [
18
+ {
19
+ slug: "overview",
20
+ title: "Overview",
21
+ url: README_URL,
22
+ page: "README.md",
23
+ summary: "What Borg MCP is + the cube / drone / role / log mental model.",
24
+ keywords: ["overview", "what is", "intro", "mental model", "how it works", "start"],
25
+ },
26
+ {
27
+ slug: "concepts",
28
+ title: "Core concepts",
29
+ url: README_URL,
30
+ page: "README.md",
31
+ summary: "Cubes, drones, roles, the activity log + signals, claims, decisions.",
32
+ keywords: ["cube", "drone", "role", "log", "signal", "claim", "decision", "coordinate", "coordination"],
33
+ },
34
+ {
35
+ slug: "install",
36
+ title: "Install client",
37
+ url: README_URL,
38
+ page: "README.md",
39
+ summary: "Install the published Borg MCP client and verify the borg CLI.",
40
+ keywords: ["install", "installation", "npm", "client", "borgmcp", "borg help", "claude code", "codex", "opencode"],
41
+ },
42
+ {
43
+ slug: "run-server",
44
+ title: "Run server",
45
+ url: LOCAL_SERVER_URL,
46
+ page: "docs/LOCAL_SERVER.md",
47
+ summary: "Run a self-hosted borgmcp-server: setup, start, endpoint, network configuration.",
48
+ keywords: ["server", "self-hosted", "borgmcp-server", "borg-mcp-server", "setup", "start", "listen port", "7091", "local server", "--lan", "tls"],
49
+ },
50
+ {
51
+ slug: "enroll",
52
+ title: "Enroll",
53
+ url: LOCAL_SERVER_URL,
54
+ page: "docs/LOCAL_SERVER.md",
55
+ summary: "Connect a client to a self-hosted server: invitations, assimilate --host --enroll, credentials.",
56
+ keywords: ["enroll", "enrollment", "invitation", "invite", "assimilate", "--host", "credential", "credentials", "owner", "join server"],
57
+ },
58
+ {
59
+ slug: "self-hosting",
60
+ title: "Self-hosting operations",
61
+ url: LOCAL_SERVER_URL,
62
+ page: "docs/LOCAL_SERVER.md",
63
+ summary: "Operate a self-hosted server: data directory, credential rotation and grants, capacity, backup, upgrades.",
64
+ keywords: ["self-hosting", "operations", "operate", "backup", "restore", "upgrade", "rotate", "revoke", "grant", "capacity", "data directory", "license"],
65
+ },
66
+ {
67
+ slug: "cli",
68
+ title: "CLI commands",
69
+ url: README_URL,
70
+ page: "README.md",
71
+ summary: "Client launch, sync, cleanup, worktree maintenance, and launch-all reference.",
72
+ keywords: ["cli", "command", "sync", "cleanup", "worktree", "launch", "launch-all", "terminal", "maintenance", "prune"],
73
+ },
74
+ {
75
+ slug: "tools",
76
+ title: "Tool reference",
77
+ url: README_URL,
78
+ page: "README.md",
79
+ summary: "Every borg_* tool — name, description, params.",
80
+ keywords: ["tool", "tools", "api", "reference", "param", "borg_"],
81
+ },
82
+ {
83
+ slug: "faq",
84
+ title: "FAQ",
85
+ url: README_URL,
86
+ page: "README.md",
87
+ summary: "Common questions — agents, coordination, worktrees, docs maturity, security.",
88
+ keywords: ["faq", "question", "agent", "claude", "codex", "opencode", "coordination", "worktree", "security", "reporting", "second agent"],
89
+ },
90
+ ];
91
+ /**
92
+ * Lazy topic match: a section matches when the topic shares a whitespace token
93
+ * with the section's slug / title / summary / keywords (case-insensitive,
94
+ * substring both ways so "price"↔"pricing"). Returns matches ranked by hit
95
+ * count; empty when nothing matches (the caller then shows the full index).
96
+ */
97
+ export function matchDocsSections(topic) {
98
+ const tokens = topic.toLowerCase().split(/[^a-z0-9_]+/).filter((t) => t.length >= 2);
99
+ if (tokens.length === 0)
100
+ return [];
101
+ const scored = DOCS_SECTIONS.map((s) => {
102
+ const haystack = [s.slug, s.title, s.summary, ...s.keywords].join(" ").toLowerCase();
103
+ const hits = tokens.filter((t) => haystack.includes(t) || s.keywords.some((k) => t.includes(k))).length;
104
+ return { s, hits };
105
+ }).filter((x) => x.hits > 0);
106
+ scored.sort((a, b) => b.hits - a.hits);
107
+ return scored.map((x) => x.s);
108
+ }
109
+ /** Render sections as a plain-text index (title — summary — URL per line). */
110
+ export function formatDocsIndex(sections) {
111
+ return sections.map((s) => `- ${s.title} — ${s.summary}\n ${s.url}`).join("\n");
112
+ }
113
+ //# sourceMappingURL=docs-sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-sections.js","sourceRoot":"","sources":["../src/docs-sections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAEhF,MAAM,UAAU,GAAG,GAAG,aAAa,SAAS,CAAC;AAC7C,MAAM,gBAAgB,GAAG,GAAG,aAAa,iCAAiC,CAAC;AAe3E,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,gEAAgE;QACzE,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,CAAC;KACpF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,eAAe;QACtB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,sEAAsE;QAC/E,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,CAAC;KACxG;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,gBAAgB;QACvB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,gEAAgE;QACzE,QAAQ,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC;KACnH;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,YAAY;QACnB,GAAG,EAAE,gBAAgB;QACrB,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,kFAAkF;QAC3F,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC;KAClJ;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,gBAAgB;QACrB,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,iGAAiG;QAC1G,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC;KACxI;IACD;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,yBAAyB;QAChC,GAAG,EAAE,gBAAgB;QACrB,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,2GAA2G;QACpH,QAAQ,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,CAAC;KAC1J;IACD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,cAAc;QACrB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,+EAA+E;QACxF,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC;KACxH;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,gBAAgB;QACvB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,gDAAgD;QACzD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC;KAClE;IACD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,8EAA8E;QACvF,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC;KAC3I;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACrF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACrF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACxG,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnF,CAAC"}
@@ -5,47 +5,31 @@
5
5
  * Two distinct, NON-conflated outcomes when a drone's session stops resolving:
6
6
  *
7
7
  * - DroneEvictedError (server 410 / code DRONE_EVICTED) — TERMINAL. The seat is
8
- * gone. The agent shuts down gracefully (print terminal message, TaskStop the
9
- * inbox Monitor, do NOT reschedule /loop). This is the SOLE authoritative
8
+ * gone. The client emits one harness-neutral stop-session recovery path. This
9
+ * is the SOLE authoritative
10
10
  * teardown trigger (SEC R2): an SSE eviction frame or inbox sentinel is only
11
11
  * a WAKE HINT — the agent confirms via an authed call returning this code.
12
- *
13
- * - DroneFrozenError (server 423 / code DRONE_FROZEN) — REVERSIBLE. The seat
14
- * (or its cube) is frozen by a subscription downgrade; it resumes when
15
- * billing is restored. The agent must NOT shut down — it keeps looping. We
16
- * surface a distinct, friendly message so a frozen seat is never
17
- * indistinguishable-to-the-human from an eviction or an outage.
18
12
  */
19
13
  export declare const DRONE_EVICTED_CODE = "DRONE_EVICTED";
20
- export declare const DRONE_FROZEN_CODE = "DRONE_FROZEN";
21
14
  export declare class DroneEvictedError extends Error {
22
15
  constructor(message?: string);
23
16
  }
24
- export declare class DroneFrozenError extends Error {
25
- constructor(message?: string);
26
- }
27
17
  /**
28
- * Markers the agent's /loop + role playbook branch on. Single-sourced so the
18
+ * Marker the agent's /loop + role playbook branch on. Single-sourced so the
29
19
  * SSE wake sentinel (log-stream) and the tool-result funnel (index) agree.
30
20
  */
31
21
  export declare const EVICTED_RESULT_MARKER = "[CUBE-EVICTED]";
32
- export declare const FROZEN_RESULT_MARKER = "[CUBE-FROZEN]";
33
22
  /**
34
23
  * The recognizable tool RESULT the agent sees when an authed call returns the
35
24
  * AUTHORITATIVE 410 DRONE_EVICTED. Spells out the sanctioned graceful-shutdown
36
25
  * sequence so the agent acts on it deterministically.
37
26
  */
38
- export declare function formatEvictedToolResult(detail?: string): string;
39
- /**
40
- * The recognizable tool RESULT for a REVERSIBLE 423 DRONE_FROZEN. The agent
41
- * must NOT shut down — the seat resumes when billing is restored.
42
- */
43
- export declare function formatFrozenToolResult(detail?: string): string;
27
+ export declare function formatEvictedToolResult(cubeName?: string): string;
44
28
  /**
45
29
  * Extract the structured error code from a worker error body. The worker error
46
30
  * funnel (sanitizeError → createHttpError) emits `{ code, message }`; some
47
31
  * legacy/nested shapes use `{ error: { code } }`. Returns null when absent or
48
- * unparseable — callers must NOT treat a bare status (410/423) as authoritative
32
+ * unparseable — callers must NOT treat a bare status (410) as authoritative
49
33
  * without the matching code (SEC R2/R4: spoof + ambiguity resistance).
50
34
  */
51
35
  export declare function errorCodeFromBody(body: string): string | null;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drone-lifecycle.d.ts","sourceRoot":"","sources":["../src/drone-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,qBAAa,iBAAkB,SAAQ,KAAK;gBAExC,OAAO,SAAyC;CAKnD;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQjE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D"}
@@ -1,8 +1,57 @@
1
- const n="DRONE_EVICTED",s="DRONE_FROZEN";class i extends Error{constructor(e="This drone has been evicted from the cube. Re-assimilate to rejoin."){super(e),this.name="DroneEvictedError"}}class a extends Error{constructor(e="This drone is paused \u2014 its cube or seat was frozen by a subscription downgrade. It resumes automatically when billing is restored."){super(e),this.name="DroneFrozenError"}}const o="[CUBE-EVICTED]",t="[CUBE-FROZEN]";function E(r){return`${o} ${r??"This drone has been evicted from the cube."}
2
-
3
- This is the AUTHORITATIVE terminal signal (server 410 DRONE_EVICTED). Shut down gracefully:
4
- 1. Print a clear final message ("evicted from cube \u2014 shutting down").
5
- 2. TaskStop the inbox Monitor \u2014 the SANCTIONED exception to "never TaskStop the Monitor"; eviction is the terminal case.
6
- 3. Do NOT reschedule /loop (let the loop end). Do NOT re-assimilate in-session \u2014 the seat is gone.`}function c(r){return`${t} ${r??"This drone is paused \u2014 its cube or seat was frozen by a subscription downgrade."}
7
-
8
- This is REVERSIBLE (server 423 DRONE_FROZEN) \u2014 do NOT shut down and do NOT TaskStop the inbox Monitor. Keep looping; the seat resumes automatically when billing is restored.`}function d(r){try{const e=JSON.parse(r);if(typeof e?.code=="string")return e.code;if(typeof e?.error?.code=="string")return e.error.code}catch{}return null}export{n as DRONE_EVICTED_CODE,s as DRONE_FROZEN_CODE,i as DroneEvictedError,a as DroneFrozenError,o as EVICTED_RESULT_MARKER,t as FROZEN_RESULT_MARKER,d as errorCodeFromBody,E as formatEvictedToolResult,c as formatFrozenToolResult};
1
+ /**
2
+ * gh#877: drone-lifecycle signals shared across the client wire layers
3
+ * (log-stream SSE + remote-client authedFetch + index tool funnel).
4
+ *
5
+ * Two distinct, NON-conflated outcomes when a drone's session stops resolving:
6
+ *
7
+ * - DroneEvictedError (server 410 / code DRONE_EVICTED) — TERMINAL. The seat is
8
+ * gone. The client emits one harness-neutral stop-session recovery path. This
9
+ * is the SOLE authoritative
10
+ * teardown trigger (SEC R2): an SSE eviction frame or inbox sentinel is only
11
+ * a WAKE HINT — the agent confirms via an authed call returning this code.
12
+ */
13
+ export const DRONE_EVICTED_CODE = 'DRONE_EVICTED';
14
+ export class DroneEvictedError extends Error {
15
+ constructor(message = 'This seat was removed from the cube.') {
16
+ super(message);
17
+ this.name = 'DroneEvictedError';
18
+ }
19
+ }
20
+ /**
21
+ * Marker the agent's /loop + role playbook branch on. Single-sourced so the
22
+ * SSE wake sentinel (log-stream) and the tool-result funnel (index) agree.
23
+ */
24
+ export const EVICTED_RESULT_MARKER = '[CUBE-EVICTED]';
25
+ /**
26
+ * The recognizable tool RESULT the agent sees when an authed call returns the
27
+ * AUTHORITATIVE 410 DRONE_EVICTED. Spells out the sanctioned graceful-shutdown
28
+ * sequence so the agent acts on it deterministically.
29
+ */
30
+ export function formatEvictedToolResult(cubeName) {
31
+ const cube = cubeName ?? 'the selected cube';
32
+ return (`${EVICTED_RESULT_MARKER} This seat was removed from cube ${cube}.\n\n` +
33
+ 'Borg has stopped listening for activity for this seat. Do not retry this request or restart the loop.\n\n' +
34
+ 'Your worktree and project files are unchanged. Finish any local file safety checks, then end this agent session.\n\n' +
35
+ 'To rejoin later, start a new session and use a new invitation from the server operator. Do not re-assimilate from this evicted session.');
36
+ }
37
+ /**
38
+ * Extract the structured error code from a worker error body. The worker error
39
+ * funnel (sanitizeError → createHttpError) emits `{ code, message }`; some
40
+ * legacy/nested shapes use `{ error: { code } }`. Returns null when absent or
41
+ * unparseable — callers must NOT treat a bare status (410) as authoritative
42
+ * without the matching code (SEC R2/R4: spoof + ambiguity resistance).
43
+ */
44
+ export function errorCodeFromBody(body) {
45
+ try {
46
+ const parsed = JSON.parse(body);
47
+ if (typeof parsed?.code === 'string')
48
+ return parsed.code;
49
+ if (typeof parsed?.error?.code === 'string')
50
+ return parsed.error.code;
51
+ }
52
+ catch {
53
+ // not JSON
54
+ }
55
+ return null;
56
+ }
57
+ //# sourceMappingURL=drone-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drone-lifecycle.js","sourceRoot":"","sources":["../src/drone-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAElD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YACE,OAAO,GAAG,sCAAsC;QAEhD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAiB;IACvD,MAAM,IAAI,GAAG,QAAQ,IAAI,mBAAmB,CAAC;IAC7C,OAAO,CACL,GAAG,qBAAqB,oCAAoC,IAAI,OAAO;QACvE,2GAA2G;QAC3G,sHAAsH;QACtH,yIAAyI,CAC1I,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAQ,CAAC;QACvC,IAAI,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;QACzD,IAAI,OAAO,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,WAAW;IACb,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { EvictDroneResult, ReassignDroneResult } from 'borgmcp-shared/protocol';
2
+ import { type ActiveCube } from './cubes.js';
3
+ import { type LocalManageOperation } from './remote-client.js';
4
+ interface ManagedCube {
5
+ id: string;
6
+ name: string;
7
+ roles: any[];
8
+ drones: any[];
9
+ }
10
+ export interface DroneManagementDeps {
11
+ getActiveCube: () => Promise<ActiveCube | null>;
12
+ getCubeForManagement: (cubeId: string, operation: LocalManageOperation, active: ActiveCube) => Promise<ManagedCube>;
13
+ reassignDrone: (droneId: string, roleId: string, active: ActiveCube) => Promise<ReassignDroneResult>;
14
+ evictDrone: (droneId: string, options: {
15
+ cubeId: string;
16
+ cubeName: string;
17
+ targetReference: string;
18
+ active: ActiveCube;
19
+ }) => Promise<EvictDroneResult>;
20
+ refreshActiveCubeMetadata: (active: ActiveCube) => Promise<boolean>;
21
+ }
22
+ export declare const STALE_ROLE_DISPLAY_WARNING: string;
23
+ export declare function runReassignDroneTool(input: {
24
+ droneId: unknown;
25
+ roleId: unknown;
26
+ }, deps?: DroneManagementDeps): Promise<string>;
27
+ export declare function runEvictDroneTool(args: Record<string, unknown> | undefined, deps?: DroneManagementDeps): Promise<string>;
28
+ export {};
29
+ //# sourceMappingURL=drone-management.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drone-management.d.ts","sourceRoot":"","sources":["../src/drone-management.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,MAAM,EAAE,GAAG,EAAE,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAChD,oBAAoB,EAAE,CACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,oBAAoB,EAC/B,MAAM,EAAE,UAAU,KACf,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrG,UAAU,EAAE,CACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,KACvF,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/B,yBAAyB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE;AAUD,eAAO,MAAM,0BAA0B,QAE8J,CAAC;AAYtM,wBAAsB,oBAAoB,CACxC,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,EAC5C,IAAI,GAAE,mBAAiC,GACtC,OAAO,CAAC,MAAM,CAAC,CAiDjB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,IAAI,GAAE,mBAAiC,GACtC,OAAO,CAAC,MAAM,CAAC,CAwCjB"}
@@ -0,0 +1,109 @@
1
+ import { activeCubeWithFreshRegenIdentity, getActiveCube, refreshActiveCubeMetadata, } from './cubes.js';
2
+ import { assertUuidShape, formatEvictDroneSuccess, formatReassignDroneSuccess, resolveDroneIdByLabel, } from './evict-drone.js';
3
+ import { evictDrone, getCubeForManagement, reassignDrone, } from './remote-client.js';
4
+ const defaultDeps = {
5
+ getActiveCube,
6
+ getCubeForManagement,
7
+ reassignDrone,
8
+ evictDrone,
9
+ refreshActiveCubeMetadata,
10
+ };
11
+ export const STALE_ROLE_DISPLAY_WARNING = 'Local display warning: The server committed this change, but Borg could not refresh this worktree\'s saved seat metadata. Local role details may be stale. Do not retry the reassignment.\n\n' +
12
+ 'Run `borg_regen` to refresh the server-authoritative role. If this session still shows the previous role, restart this agent session once. Do not re-assimilate or repeat the management request.';
13
+ function opaqueNotFound() {
14
+ throw new Error('Borg server request failed (HTTP 404)');
15
+ }
16
+ async function requireActiveCube(deps) {
17
+ const active = await deps.getActiveCube();
18
+ if (!active)
19
+ throw new Error('Not assimilated to a cube. Use borg_assimilate <cube-name> first.');
20
+ return active;
21
+ }
22
+ export async function runReassignDroneTool(input, deps = defaultDeps) {
23
+ if (typeof input.droneId !== 'string' || input.droneId.length === 0) {
24
+ throw new Error('drone_id is required');
25
+ }
26
+ if (typeof input.roleId !== 'string' || input.roleId.length === 0) {
27
+ throw new Error('role_id is required');
28
+ }
29
+ assertUuidShape(input.droneId, 'drone_id');
30
+ assertUuidShape(input.roleId, 'role_id');
31
+ const active = await requireActiveCube(deps);
32
+ const operation = {
33
+ operation: `reassign drone ${JSON.stringify(input.droneId)} to role ${JSON.stringify(input.roleId)} in cube ${JSON.stringify(active.name)}`,
34
+ cubeName: active.name,
35
+ noMutation: 'No drone was reassigned.',
36
+ };
37
+ const cube = await deps.getCubeForManagement(active.cubeId, operation, active);
38
+ const priorDrone = cube.drones.find((candidate) => candidate.id === input.droneId);
39
+ const role = cube.roles.find((candidate) => candidate.id === input.roleId);
40
+ if (!priorDrone || !role)
41
+ opaqueNotFound();
42
+ const { drone } = await deps.reassignDrone(input.droneId, input.roleId, active);
43
+ if (drone.id !== input.droneId || drone.cube_id !== cube.id || drone.role_id !== input.roleId) {
44
+ throw new Error('[LOCAL-MANAGE-COMMIT-UNCONFIRMED] The server returned a successful reassignment response for unexpected identifiers. The reassignment may already be committed. Do not retry blindly; inspect the cube roster first.');
45
+ }
46
+ let warning = '';
47
+ if (drone.id === active.droneId) {
48
+ try {
49
+ const refreshed = await deps.refreshActiveCubeMetadata(activeCubeWithFreshRegenIdentity(active, {
50
+ cube,
51
+ drone,
52
+ role,
53
+ }));
54
+ if (!refreshed)
55
+ warning = `\n\n${STALE_ROLE_DISPLAY_WARNING}`;
56
+ }
57
+ catch {
58
+ warning = `\n\n${STALE_ROLE_DISPLAY_WARNING}`;
59
+ }
60
+ }
61
+ return formatReassignDroneSuccess({
62
+ droneLabel: drone.label,
63
+ cubeName: cube.name,
64
+ roleName: role.name,
65
+ droneId: drone.id,
66
+ roleId: drone.role_id,
67
+ }) + warning;
68
+ }
69
+ export async function runEvictDroneTool(args, deps = defaultDeps) {
70
+ const droneIdInput = typeof args?.drone_id === 'string' ? args.drone_id : undefined;
71
+ const labelInput = typeof args?.label === 'string' ? args.label.trim() : undefined;
72
+ const cubeIdInput = typeof args?.cube_id === 'string' ? args.cube_id : undefined;
73
+ if (droneIdInput !== undefined && (labelInput !== undefined || cubeIdInput !== undefined)) {
74
+ throw new Error('Provide drone_id OR label with cube_id, not both.');
75
+ }
76
+ if (droneIdInput === undefined && (!labelInput || !cubeIdInput)) {
77
+ throw new Error('Provide drone_id OR both label and cube_id.');
78
+ }
79
+ if (droneIdInput !== undefined)
80
+ assertUuidShape(droneIdInput, 'drone_id');
81
+ if (cubeIdInput !== undefined)
82
+ assertUuidShape(cubeIdInput, 'cube_id');
83
+ const active = await requireActiveCube(deps);
84
+ const cubeId = droneIdInput === undefined ? cubeIdInput : active.cubeId;
85
+ const targetReference = labelInput ?? droneIdInput;
86
+ const fallbackCubeName = cubeId === active.cubeId ? active.name : cubeId;
87
+ const operation = {
88
+ operation: `remove ${JSON.stringify(targetReference)} from cube ${JSON.stringify(fallbackCubeName)}`,
89
+ cubeName: fallbackCubeName,
90
+ noMutation: 'No drone was removed.',
91
+ };
92
+ const cube = await deps.getCubeForManagement(cubeId, operation, active);
93
+ const priorDrone = labelInput === undefined
94
+ ? cube.drones.find((candidate) => candidate.id === droneIdInput)
95
+ : resolveDroneIdByLabel(cube.drones, labelInput);
96
+ if (!priorDrone)
97
+ opaqueNotFound();
98
+ const result = await deps.evictDrone(priorDrone.id, {
99
+ cubeId,
100
+ cubeName: cube.name,
101
+ targetReference,
102
+ active,
103
+ });
104
+ if (result.drone_id !== priorDrone.id || result.evicted !== true) {
105
+ throw new Error('[LOCAL-MANAGE-COMMIT-UNCONFIRMED] The server returned a successful eviction response for an unexpected drone. The eviction may already be committed. Do not retry blindly; inspect the cube roster first.');
106
+ }
107
+ return formatEvictDroneSuccess(priorDrone.label, cube.name);
108
+ }
109
+ //# sourceMappingURL=drone-management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drone-management.js","sourceRoot":"","sources":["../src/drone-management.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-mcp-config.d.ts","sourceRoot":"","sources":["../src/ensure-mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAU1C,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,EAAE,MAAM,OAAO,CAAC;IAClC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,EAAE,MAAM,OAAO,CAAC;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,oBAAoB,EAAE,MAAM,OAAO,CAAC;IACpC,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAWD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,IAAI,GAAE,mBAAiC,GACtC,OAAO,CAeT"}
@@ -1 +1,36 @@
1
- import{addCodexMcpServer as r,addMcpServer as o,addOpenCodeMcpServer as n,isCodexMcpServerConfigured as u,isMcpServerConfigured as C,isOpenCodeMcpServerConfigured as i}from"./config-utils.js";const a={isClaudeConfigured:C,addClaude:o,isCodexConfigured:u,addCodex:r,isOpenCodeConfigured:i,addOpenCode:n};function c(d,e=a){switch(d){case"claude":return e.isClaudeConfigured()?!1:(e.addClaude(),!0);case"codex":return e.isCodexConfigured()?!1:(e.addCodex(),!0);case"opencode":return e.isOpenCodeConfigured()?!1:(e.addOpenCode(),!0)}}export{c as ensureCliMcpConfigured};
1
+ import { addCodexMcpServer, addMcpServer, addOpenCodeMcpServer, isCodexMcpServerConfigured, isMcpServerConfigured, isOpenCodeMcpServerConfigured, } from './config-utils.js';
2
+ const defaultDeps = {
3
+ isClaudeConfigured: isMcpServerConfigured,
4
+ addClaude: addMcpServer,
5
+ isCodexConfigured: isCodexMcpServerConfigured,
6
+ addCodex: addCodexMcpServer,
7
+ isOpenCodeConfigured: isOpenCodeMcpServerConfigured,
8
+ addOpenCode: addOpenCodeMcpServer,
9
+ };
10
+ /**
11
+ * Ensure borg is registered as an MCP server for one selected agent CLI.
12
+ *
13
+ * Returns true when this call added the registration and false when it was
14
+ * already present. Errors from an adder intentionally propagate so callers
15
+ * can fail the launch with the CLI-specific remediation message.
16
+ */
17
+ export function ensureCliMcpConfigured(cli, deps = defaultDeps) {
18
+ switch (cli) {
19
+ case 'claude':
20
+ if (deps.isClaudeConfigured())
21
+ return false;
22
+ deps.addClaude();
23
+ return true;
24
+ case 'codex':
25
+ if (deps.isCodexConfigured())
26
+ return false;
27
+ deps.addCodex();
28
+ return true;
29
+ case 'opencode':
30
+ if (deps.isOpenCodeConfigured())
31
+ return false;
32
+ deps.addOpenCode();
33
+ return true;
34
+ }
35
+ }
36
+ //# sourceMappingURL=ensure-mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-mcp-config.js","sourceRoot":"","sources":["../src/ensure-mcp-config.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,mBAAmB,CAAC;AAW3B,MAAM,WAAW,GAAwB;IACvC,kBAAkB,EAAE,qBAAqB;IACzC,SAAS,EAAE,YAAY;IACvB,iBAAiB,EAAE,0BAA0B;IAC7C,QAAQ,EAAE,iBAAiB;IAC3B,oBAAoB,EAAE,6BAA6B;IACnD,WAAW,EAAE,oBAAoB;CAClC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAY,EACZ,OAA4B,WAAW;IAEvC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ;YACX,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,KAAK,OAAO;YACV,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,KAAK,UAAU;YACb,IAAI,IAAI,CAAC,oBAAoB,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Pure label→id resolution for the `borg_evict-drone` tool (gh#718).
3
3
  *
4
- * `CubeStore.evictDrone` and the owner-authed `DELETE /api/drones/:id` route
4
+ * the local drone-management route
5
5
  * both take a drone UUID. Coordinators, however, see drone LABELS everywhere
6
6
  * (roster, regen, cube log) and rarely the UUIDs. This helper lets the tool
7
7
  * accept a label and resolve it to the drone id client-side, against the
8
- * owner-scoped cube detail returned by `getCube` (the same id+label pairs
8
+ * cube-grant-scoped detail returned by `getCube` (the same id+label pairs
9
9
  * `borg_list-drones` renders). No I/O here — a pure function so it can be
10
10
  * unit-tested in isolation; the handler in index.ts owns the network calls.
11
11
  */
@@ -40,4 +40,12 @@ export declare function assertUuidShape(value: string, label: string): void;
40
40
  * explicit `drone_id` input instead.
41
41
  */
42
42
  export declare function resolveDroneIdByLabel(drones: ReadonlyArray<EvictableDrone>, label: string): EvictableDrone | null;
43
+ export declare function formatReassignDroneSuccess(input: {
44
+ droneLabel: string;
45
+ cubeName: string;
46
+ roleName: string;
47
+ droneId: string;
48
+ roleId: string;
49
+ }): string;
50
+ export declare function formatEvictDroneSuccess(droneLabel: string, cubeName: string): string;
43
51
  //# sourceMappingURL=evict-drone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evict-drone.d.ts","sourceRoot":"","sources":["../src/evict-drone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIlE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,EACrC,KAAK,EAAE,MAAM,GACZ,cAAc,GAAG,IAAI,CAIvB;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAMT;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOpF"}
@@ -1 +1,60 @@
1
- function i(t){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)}function o(t,e){if(!i(t))throw new Error(`${e} "${t}" is not a UUID`)}function f(t,e){const n=e.trim(),r=t.find(a=>a.label===n);return r?{id:r.id,label:r.label}:null}export{o as assertUuidShape,i as isUuidShape,f as resolveDroneIdByLabel};
1
+ /**
2
+ * Pure label→id resolution for the `borg_evict-drone` tool (gh#718).
3
+ *
4
+ * the local drone-management route
5
+ * both take a drone UUID. Coordinators, however, see drone LABELS everywhere
6
+ * (roster, regen, cube log) and rarely the UUIDs. This helper lets the tool
7
+ * accept a label and resolve it to the drone id client-side, against the
8
+ * cube-grant-scoped detail returned by `getCube` (the same id+label pairs
9
+ * `borg_list-drones` renders). No I/O here — a pure function so it can be
10
+ * unit-tested in isolation; the handler in index.ts owns the network calls.
11
+ */
12
+ /**
13
+ * Strict whole-string UUID shape check for the `drone_id` input (gh#782).
14
+ * The handler rejects non-UUID values before building the DELETE URL: a
15
+ * label passed as drone_id gets a clear "use label + cube_id" hint instead
16
+ * of a confusing 404, and a path-shaped value ("../cubes/<uuid>") is never
17
+ * interpolated into a request path. Case-insensitive; anchored so embedded
18
+ * or suffixed UUIDs do not pass.
19
+ */
20
+ export function isUuidShape(value) {
21
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);
22
+ }
23
+ /**
24
+ * Assert-style wrapper around isUuidShape (gh#782, reassign half). Called
25
+ * by the remote-client functions that interpolate a drone id into the
26
+ * request path (reassignDrone PATCH, evictDrone DELETE) — FIRST, before
27
+ * any token fetch or network I/O, so a path-shaped value like
28
+ * "../cubes/<uuid>" can never reach URL construction. The `label` names
29
+ * the offending input in the caller-facing error.
30
+ */
31
+ export function assertUuidShape(value, label) {
32
+ if (!isUuidShape(value)) {
33
+ throw new Error(`${label} "${value}" is not a UUID`);
34
+ }
35
+ }
36
+ /**
37
+ * Resolve an exact drone label to its `{ id, label }` within a single cube's
38
+ * drone list. Labels are unique per cube, so an exact match is unambiguous.
39
+ * Returns null when no drone carries the label (the handler turns that into a
40
+ * caller-facing error). Matching is exact (not substring) and label-only — a
41
+ * UUID passed here never resolves, because the handler routes UUIDs through the
42
+ * explicit `drone_id` input instead.
43
+ */
44
+ export function resolveDroneIdByLabel(drones, label) {
45
+ const target = label.trim();
46
+ const match = drones.find((d) => d.label === target);
47
+ return match ? { id: match.id, label: match.label } : null;
48
+ }
49
+ export function formatReassignDroneSuccess(input) {
50
+ return (`Reassigned ${input.droneLabel} in cube ${input.cubeName} to role ${input.roleName}.\n` +
51
+ `Drone id: ${input.droneId}\n` +
52
+ `Role id: ${input.roleId}`);
53
+ }
54
+ export function formatEvictDroneSuccess(droneLabel, cubeName) {
55
+ return (`Removed ${droneLabel} from cube ${cubeName}.\n` +
56
+ 'The seat credential is revoked. The session will stop after its next Borg request.\n' +
57
+ 'The worktree and project files were not deleted. Activity history remains attributed to the removed seat.\n' +
58
+ 'After its work is merged, run `borg cleanup` to review whether the worktree can be pruned.');
59
+ }
60
+ //# sourceMappingURL=evict-drone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evict-drone.js","sourceRoot":"","sources":["../src/evict-drone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAa;IAC1D,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,iBAAiB,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAqC,EACrC,KAAa;IAEb,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAM1C;IACC,OAAO,CACL,cAAc,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC,QAAQ,YAAY,KAAK,CAAC,QAAQ,KAAK;QACvF,aAAa,KAAK,CAAC,OAAO,IAAI;QAC9B,YAAY,KAAK,CAAC,MAAM,EAAE,CAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAkB,EAAE,QAAgB;IAC1E,OAAO,CACL,WAAW,UAAU,cAAc,QAAQ,KAAK;QAChD,sFAAsF;QACtF,6GAA6G;QAC7G,4FAA4F,CAC7F,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc-orphan-inboxes.d.ts","sourceRoot":"","sources":["../src/gc-orphan-inboxes.ts"],"names":[],"mappings":"AA0BA,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,QAA2B,CAAC;AAE9D,8FAA8F;AAC9F,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,+FAA+F;IAC/F,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,yEAAyE;IACzE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,gBAAgB,CAAC;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,gBAAgB,EAAE,CAOrF;AAED,MAAM,WAAW,iBAAiB;IAChC,+GAA+G;IAC/G,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,yEAAyE;IACzE,oBAAoB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/D,kEAAkE;IAClE,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACvD,yDAAyD;IACzD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iBAAiB,EACvB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAC/B,OAAO,CAmBT;AAED,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,gBAAgB,CAAC;IAClD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,YAAY,CAAC;CACpB,GAAG,MAAM,EAAE,CA0BX;AAED,qEAAqE;AACrE,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAmB,GAAG,iBAAiB,CAsCpF;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkB7E"}