borgmcp 1.1.15 → 2.0.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 (459) 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.map +1 -0
  71. package/dist/codex-app-wake.js +432 -2
  72. package/dist/codex-app-wake.js.map +1 -0
  73. package/dist/codex-launch.d.ts.map +1 -0
  74. package/dist/codex-launch.js +102 -2
  75. package/dist/codex-launch.js.map +1 -0
  76. package/dist/codex-remote.d.ts +6 -1
  77. package/dist/codex-remote.d.ts.map +1 -0
  78. package/dist/codex-remote.js +394 -1
  79. package/dist/codex-remote.js.map +1 -0
  80. package/dist/codex-wake-resolve.d.ts.map +1 -0
  81. package/dist/codex-wake-resolve.js +127 -1
  82. package/dist/codex-wake-resolve.js.map +1 -0
  83. package/dist/config-utils.d.ts +2 -2
  84. package/dist/config-utils.d.ts.map +1 -0
  85. package/dist/config-utils.js +766 -3
  86. package/dist/config-utils.js.map +1 -0
  87. package/dist/config.d.ts +98 -61
  88. package/dist/config.d.ts.map +1 -0
  89. package/dist/config.js +426 -1
  90. package/dist/config.js.map +1 -0
  91. package/dist/console-prefix.d.ts.map +1 -0
  92. package/dist/console-prefix.js +96 -1
  93. package/dist/console-prefix.js.map +1 -0
  94. package/dist/cube-name.d.ts.map +1 -0
  95. package/dist/cube-name.js +67 -1
  96. package/dist/cube-name.js.map +1 -0
  97. package/dist/cubes.d.ts +126 -18
  98. package/dist/cubes.d.ts.map +1 -0
  99. package/dist/cubes.js +412 -4
  100. package/dist/cubes.js.map +1 -0
  101. package/dist/debug.d.ts.map +1 -0
  102. package/dist/debug.js +71 -1
  103. package/dist/debug.js.map +1 -0
  104. package/dist/direct-log.d.ts.map +1 -0
  105. package/dist/direct-log.js +11 -1
  106. package/dist/direct-log.js.map +1 -0
  107. package/dist/docs-sections.d.ts +11 -10
  108. package/dist/docs-sections.d.ts.map +1 -0
  109. package/dist/docs-sections.js +113 -3
  110. package/dist/docs-sections.js.map +1 -0
  111. package/dist/drone-lifecycle.d.ts +5 -21
  112. package/dist/drone-lifecycle.d.ts.map +1 -0
  113. package/dist/drone-lifecycle.js +57 -8
  114. package/dist/drone-lifecycle.js.map +1 -0
  115. package/dist/drone-management.d.ts +29 -0
  116. package/dist/drone-management.d.ts.map +1 -0
  117. package/dist/drone-management.js +109 -0
  118. package/dist/drone-management.js.map +1 -0
  119. package/dist/ensure-mcp-config.d.ts.map +1 -0
  120. package/dist/ensure-mcp-config.js +36 -1
  121. package/dist/ensure-mcp-config.js.map +1 -0
  122. package/dist/evict-drone.d.ts +10 -2
  123. package/dist/evict-drone.d.ts.map +1 -0
  124. package/dist/evict-drone.js +60 -1
  125. package/dist/evict-drone.js.map +1 -0
  126. package/dist/gc-orphan-inboxes.d.ts.map +1 -0
  127. package/dist/gc-orphan-inboxes.js +177 -1
  128. package/dist/gc-orphan-inboxes.js.map +1 -0
  129. package/dist/inbox-monitor.d.ts +1 -1
  130. package/dist/inbox-monitor.d.ts.map +1 -0
  131. package/dist/inbox-monitor.js +856 -3
  132. package/dist/inbox-monitor.js.map +1 -0
  133. package/dist/index.d.ts +6 -4
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +1034 -37
  136. package/dist/index.js.map +1 -0
  137. package/dist/launch-all-cmd.d.ts.map +1 -0
  138. package/dist/launch-all-cmd.js +377 -37
  139. package/dist/launch-all-cmd.js.map +1 -0
  140. package/dist/launch-all-command.d.ts.map +1 -0
  141. package/dist/launch-all-command.js +24 -1
  142. package/dist/launch-all-command.js.map +1 -0
  143. package/dist/launch-all-deps.d.ts +3 -8
  144. package/dist/launch-all-deps.d.ts.map +1 -0
  145. package/dist/launch-all-deps.js +99 -1
  146. package/dist/launch-all-deps.js.map +1 -0
  147. package/dist/launch-all-discovery.d.ts +1 -0
  148. package/dist/launch-all-discovery.d.ts.map +1 -0
  149. package/dist/launch-all-discovery.js +90 -4
  150. package/dist/launch-all-discovery.js.map +1 -0
  151. package/dist/launch-all-locks.d.ts.map +1 -0
  152. package/dist/launch-all-locks.js +54 -1
  153. package/dist/launch-all-locks.js.map +1 -0
  154. package/dist/launch-gate.d.ts +2 -2
  155. package/dist/launch-gate.d.ts.map +1 -0
  156. package/dist/launch-gate.js +73 -1
  157. package/dist/launch-gate.js.map +1 -0
  158. package/dist/lifecycle-log-guard.d.ts.map +1 -0
  159. package/dist/lifecycle-log-guard.js +93 -2
  160. package/dist/lifecycle-log-guard.js.map +1 -0
  161. package/dist/list-roles-render.d.ts.map +1 -0
  162. package/dist/list-roles-render.js +40 -6
  163. package/dist/list-roles-render.js.map +1 -0
  164. package/dist/local-log-routing.d.ts +19 -0
  165. package/dist/local-log-routing.d.ts.map +1 -0
  166. package/dist/local-log-routing.js +67 -0
  167. package/dist/local-log-routing.js.map +1 -0
  168. package/dist/local-manage-tool-result.d.ts +8 -0
  169. package/dist/local-manage-tool-result.d.ts.map +1 -0
  170. package/dist/local-manage-tool-result.js +10 -0
  171. package/dist/local-manage-tool-result.js.map +1 -0
  172. package/dist/local-server-cursor.d.ts +34 -0
  173. package/dist/local-server-cursor.d.ts.map +1 -0
  174. package/dist/local-server-cursor.js +151 -0
  175. package/dist/local-server-cursor.js.map +1 -0
  176. package/dist/log-audit.d.ts.map +1 -0
  177. package/dist/log-audit.js +194 -3
  178. package/dist/log-audit.js.map +1 -0
  179. package/dist/log-stream.d.ts +31 -18
  180. package/dist/log-stream.d.ts.map +1 -0
  181. package/dist/log-stream.js +1214 -12
  182. package/dist/log-stream.js.map +1 -0
  183. package/dist/model-presets.d.ts.map +1 -0
  184. package/dist/model-presets.js +19 -1
  185. package/dist/model-presets.js.map +1 -0
  186. package/dist/name-validator.d.ts.map +1 -0
  187. package/dist/name-validator.js +22 -1
  188. package/dist/name-validator.js.map +1 -0
  189. package/dist/opencode-drone.d.ts.map +1 -0
  190. package/dist/opencode-drone.js +438 -4
  191. package/dist/opencode-drone.js.map +1 -0
  192. package/dist/opencode-plugin.d.ts +1 -1
  193. package/dist/opencode-plugin.d.ts.map +1 -0
  194. package/dist/opencode-plugin.js +29 -4
  195. package/dist/opencode-plugin.js.map +1 -0
  196. package/dist/parse-assimilate-args.d.ts +1 -1
  197. package/dist/parse-assimilate-args.d.ts.map +1 -0
  198. package/dist/parse-assimilate-args.js +125 -1
  199. package/dist/parse-assimilate-args.js.map +1 -0
  200. package/dist/parse-launch-all-args.d.ts.map +1 -0
  201. package/dist/parse-launch-all-args.js +70 -1
  202. package/dist/parse-launch-all-args.js.map +1 -0
  203. package/dist/postinstall-banner.d.ts.map +1 -0
  204. package/dist/postinstall-banner.js +27 -2
  205. package/dist/postinstall-banner.js.map +1 -0
  206. package/dist/postinstall.d.ts.map +1 -0
  207. package/dist/postinstall.js +32 -5
  208. package/dist/postinstall.js.map +1 -0
  209. package/dist/readiness-probe.d.ts.map +1 -0
  210. package/dist/readiness-probe.js +9 -1
  211. package/dist/readiness-probe.js.map +1 -0
  212. package/dist/regen-format.d.ts.map +1 -0
  213. package/dist/regen-format.js +545 -13
  214. package/dist/regen-format.js.map +1 -0
  215. package/dist/regen.d.ts.map +1 -0
  216. package/dist/regen.js +141 -5
  217. package/dist/regen.js.map +1 -0
  218. package/dist/remote-client.d.ts +65 -175
  219. package/dist/remote-client.d.ts.map +1 -0
  220. package/dist/remote-client.js +942 -1
  221. package/dist/remote-client.js.map +1 -0
  222. package/dist/reset-local-seat-cmd.d.ts +50 -0
  223. package/dist/reset-local-seat-cmd.d.ts.map +1 -0
  224. package/dist/reset-local-seat-cmd.js +169 -0
  225. package/dist/reset-local-seat-cmd.js.map +1 -0
  226. package/dist/role-match.d.ts.map +1 -0
  227. package/dist/role-match.js +23 -1
  228. package/dist/role-match.js.map +1 -0
  229. package/dist/role-resolver.d.ts.map +1 -0
  230. package/dist/role-resolver.js +60 -1
  231. package/dist/role-resolver.js.map +1 -0
  232. package/dist/roster-render.d.ts.map +1 -0
  233. package/dist/roster-render.js +121 -3
  234. package/dist/roster-render.js.map +1 -0
  235. package/dist/seat-probe.d.ts +32 -13
  236. package/dist/seat-probe.d.ts.map +1 -0
  237. package/dist/seat-probe.js +78 -1
  238. package/dist/seat-probe.js.map +1 -0
  239. package/dist/seat-store.d.ts +76 -0
  240. package/dist/seat-store.d.ts.map +1 -0
  241. package/dist/seat-store.js +309 -0
  242. package/dist/seat-store.js.map +1 -0
  243. package/dist/seats.d.ts +303 -0
  244. package/dist/seats.d.ts.map +1 -0
  245. package/dist/seats.js +551 -0
  246. package/dist/seats.js.map +1 -0
  247. package/dist/self-path.d.ts +27 -0
  248. package/dist/self-path.d.ts.map +1 -0
  249. package/dist/self-path.js +43 -0
  250. package/dist/self-path.js.map +1 -0
  251. package/dist/server-endpoint.d.ts +9 -0
  252. package/dist/server-endpoint.d.ts.map +1 -0
  253. package/dist/server-endpoint.js +38 -0
  254. package/dist/server-endpoint.js.map +1 -0
  255. package/dist/server-errors.d.ts +50 -0
  256. package/dist/server-errors.d.ts.map +1 -0
  257. package/dist/server-errors.js +79 -0
  258. package/dist/server-errors.js.map +1 -0
  259. package/dist/server-handshake.d.ts +197 -0
  260. package/dist/server-handshake.d.ts.map +1 -0
  261. package/dist/server-handshake.js +505 -0
  262. package/dist/server-handshake.js.map +1 -0
  263. package/dist/server-response.d.ts +3 -0
  264. package/dist/server-response.d.ts.map +1 -0
  265. package/dist/server-response.js +67 -0
  266. package/dist/server-response.js.map +1 -0
  267. package/dist/server-trust.d.ts +14 -0
  268. package/dist/server-trust.d.ts.map +1 -0
  269. package/dist/server-trust.js +225 -0
  270. package/dist/server-trust.js.map +1 -0
  271. package/dist/setup-confirm.d.ts +3 -3
  272. package/dist/setup-confirm.d.ts.map +1 -0
  273. package/dist/setup-confirm.js +126 -2
  274. package/dist/setup-confirm.js.map +1 -0
  275. package/dist/setup.d.ts +5 -3
  276. package/dist/setup.d.ts.map +1 -0
  277. package/dist/setup.js +169 -46
  278. package/dist/setup.js.map +1 -0
  279. package/dist/shell-escape.d.ts.map +1 -0
  280. package/dist/shell-escape.js +22 -1
  281. package/dist/shell-escape.js.map +1 -0
  282. package/dist/spawn.d.ts +2 -2
  283. package/dist/spawn.d.ts.map +1 -0
  284. package/dist/spawn.js +29 -10
  285. package/dist/spawn.js.map +1 -0
  286. package/dist/startup-services.d.ts +0 -1
  287. package/dist/startup-services.d.ts.map +1 -0
  288. package/dist/startup-services.js +26 -1
  289. package/dist/startup-services.js.map +1 -0
  290. package/dist/stream-owner.d.ts +6 -2
  291. package/dist/stream-owner.d.ts.map +1 -0
  292. package/dist/stream-owner.js +547 -2
  293. package/dist/stream-owner.js.map +1 -0
  294. package/dist/stream-status.d.ts +1 -1
  295. package/dist/stream-status.d.ts.map +1 -0
  296. package/dist/stream-status.js +268 -3
  297. package/dist/stream-status.js.map +1 -0
  298. package/dist/sync-roles-render.d.ts.map +1 -0
  299. package/dist/sync-roles-render.js +118 -3
  300. package/dist/sync-roles-render.js.map +1 -0
  301. package/dist/sync.d.ts +1 -1
  302. package/dist/sync.d.ts.map +1 -0
  303. package/dist/sync.js +286 -22
  304. package/dist/sync.js.map +1 -0
  305. package/dist/terminal-title.d.ts.map +1 -0
  306. package/dist/terminal-title.js +68 -1
  307. package/dist/terminal-title.js.map +1 -0
  308. package/dist/token-store.d.ts +17 -111
  309. package/dist/token-store.d.ts.map +1 -0
  310. package/dist/token-store.js +81 -1
  311. package/dist/token-store.js.map +1 -0
  312. package/dist/tool-manifest.d.ts +4 -8
  313. package/dist/tool-manifest.d.ts.map +1 -0
  314. package/dist/tool-manifest.js +554 -1
  315. package/dist/tool-manifest.js.map +1 -0
  316. package/dist/tool-scope.d.ts +8 -12
  317. package/dist/tool-scope.d.ts.map +1 -0
  318. package/dist/tool-scope.js +97 -1
  319. package/dist/tool-scope.js.map +1 -0
  320. package/dist/types.d.ts +1 -5
  321. package/dist/types.d.ts.map +1 -0
  322. package/dist/types.js +5 -0
  323. package/dist/types.js.map +1 -0
  324. package/dist/unknown-subcommand.d.ts +1 -1
  325. package/dist/unknown-subcommand.d.ts.map +1 -0
  326. package/dist/unknown-subcommand.js +37 -1
  327. package/dist/unknown-subcommand.js.map +1 -0
  328. package/dist/version.d.ts +1 -1
  329. package/dist/version.d.ts.map +1 -0
  330. package/dist/version.js +78 -2
  331. package/dist/version.js.map +1 -0
  332. package/dist/working-repo.d.ts.map +1 -0
  333. package/dist/working-repo.js +81 -1
  334. package/dist/working-repo.js.map +1 -0
  335. package/dist/worktree-lifecycle.d.ts.map +1 -0
  336. package/dist/worktree-lifecycle.js +205 -2
  337. package/dist/worktree-lifecycle.js.map +1 -0
  338. package/docs/EXTRACTION_PROVENANCE.md +40 -0
  339. package/docs/LOCAL_SERVER.md +103 -0
  340. package/docs/RELEASING.md +120 -0
  341. package/package.json +52 -34
  342. package/src/agent-runtime.ts +69 -0
  343. package/src/assimilate-cmd.ts +1864 -0
  344. package/src/assimilate-deps.ts +444 -0
  345. package/src/assimilate-guard.ts +84 -0
  346. package/src/assimilate-welcome.ts +39 -0
  347. package/src/auth-env.ts +21 -0
  348. package/src/backends/launch-all-pastelist.ts +18 -0
  349. package/src/backends/launch-all-tmux.ts +75 -0
  350. package/src/backends/launch-all-windows.ts +110 -0
  351. package/src/bare-launch-menu.ts +148 -0
  352. package/src/claude-launch-args.ts +35 -0
  353. package/src/claude.ts +561 -0
  354. package/src/cleanup-cmd.ts +581 -0
  355. package/src/clear-rewake-core.ts +34 -0
  356. package/src/clear-rewake.ts +18 -0
  357. package/src/cli-help.ts +116 -0
  358. package/src/cli-platform.ts +127 -0
  359. package/src/cli-tool-approval.ts +716 -0
  360. package/src/codex-app-server.ts +238 -0
  361. package/src/codex-app-wake.ts +512 -0
  362. package/src/codex-launch.ts +140 -0
  363. package/src/codex-remote.ts +500 -0
  364. package/src/codex-wake-resolve.ts +155 -0
  365. package/src/config-utils.ts +811 -0
  366. package/src/config.ts +595 -0
  367. package/src/console-prefix.ts +99 -0
  368. package/src/cube-name.ts +69 -0
  369. package/src/cubes.ts +583 -0
  370. package/src/debug.ts +73 -0
  371. package/src/direct-log.ts +9 -0
  372. package/src/docs-sections.ts +129 -0
  373. package/src/drone-lifecycle.ts +62 -0
  374. package/src/drone-management.ts +162 -0
  375. package/src/ensure-mcp-config.ts +54 -0
  376. package/src/evict-drone.ts +82 -0
  377. package/src/gc-orphan-inboxes.ts +229 -0
  378. package/src/inbox-monitor.ts +1005 -0
  379. package/src/index.ts +1201 -0
  380. package/src/launch-all-cmd.ts +450 -0
  381. package/src/launch-all-command.ts +30 -0
  382. package/src/launch-all-deps.ts +188 -0
  383. package/src/launch-all-discovery.ts +118 -0
  384. package/src/launch-all-locks.ts +74 -0
  385. package/src/launch-gate.ts +80 -0
  386. package/src/lifecycle-log-guard.ts +144 -0
  387. package/src/list-roles-render.ts +52 -0
  388. package/src/local-log-routing.ts +106 -0
  389. package/src/local-manage-tool-result.ts +10 -0
  390. package/src/local-server-cursor.ts +188 -0
  391. package/src/log-audit.ts +207 -0
  392. package/src/log-stream.ts +1505 -0
  393. package/src/model-presets.ts +22 -0
  394. package/src/name-validator.ts +23 -0
  395. package/src/opencode-drone.ts +528 -0
  396. package/src/opencode-plugin.ts +38 -0
  397. package/src/parse-assimilate-args.ts +125 -0
  398. package/src/parse-launch-all-args.ts +100 -0
  399. package/src/postinstall-banner.ts +37 -0
  400. package/src/postinstall.ts +36 -0
  401. package/src/readiness-probe.ts +12 -0
  402. package/src/regen-format.ts +651 -0
  403. package/src/regen.ts +150 -0
  404. package/src/remote-client.ts +1379 -0
  405. package/src/reset-local-seat-cmd.ts +227 -0
  406. package/src/role-match.ts +29 -0
  407. package/src/role-resolver.ts +93 -0
  408. package/src/roster-render.ts +196 -0
  409. package/src/seat-probe.ts +115 -0
  410. package/src/seat-store.ts +333 -0
  411. package/src/seats.ts +741 -0
  412. package/src/self-path.ts +51 -0
  413. package/src/server-endpoint.ts +38 -0
  414. package/src/server-errors.ts +93 -0
  415. package/src/server-handshake.ts +783 -0
  416. package/src/server-response.ts +76 -0
  417. package/src/server-trust.ts +245 -0
  418. package/src/setup-confirm.ts +171 -0
  419. package/src/setup.ts +186 -0
  420. package/src/shell-escape.ts +22 -0
  421. package/src/spawn.ts +31 -0
  422. package/src/startup-services.ts +36 -0
  423. package/src/stream-owner.ts +686 -0
  424. package/src/stream-status.ts +337 -0
  425. package/src/sync-roles-render.ts +163 -0
  426. package/src/sync.ts +363 -0
  427. package/src/terminal-title.ts +76 -0
  428. package/src/token-store.ts +102 -0
  429. package/src/tool-manifest.ts +610 -0
  430. package/src/tool-scope.ts +110 -0
  431. package/src/types.ts +5 -0
  432. package/src/unknown-subcommand.ts +35 -0
  433. package/src/version.ts +82 -0
  434. package/src/working-repo.ts +99 -0
  435. package/src/worktree-lifecycle.ts +254 -0
  436. package/dist/auth-recovery.d.ts +0 -33
  437. package/dist/auth-recovery.js +0 -1
  438. package/dist/auth.d.ts +0 -103
  439. package/dist/auth.js +0 -39
  440. package/dist/device-auth.d.ts +0 -75
  441. package/dist/device-auth.js +0 -1
  442. package/dist/drone-address.d.ts +0 -26
  443. package/dist/drone-address.js +0 -1
  444. package/dist/get-started.d.ts +0 -20
  445. package/dist/get-started.js +0 -2
  446. package/dist/health-beat.d.ts +0 -134
  447. package/dist/health-beat.js +0 -1
  448. package/dist/role-section.d.ts +0 -110
  449. package/dist/role-section.js +0 -8
  450. package/dist/setup-action.d.ts +0 -20
  451. package/dist/setup-action.js +0 -1
  452. package/dist/stale-version-check.d.ts +0 -40
  453. package/dist/stale-version-check.js +0 -1
  454. package/dist/subscription-retry.d.ts +0 -40
  455. package/dist/subscription-retry.js +0 -1
  456. package/dist/templates.d.ts +0 -107
  457. package/dist/templates.js +0 -359
  458. package/dist/token-crypto.d.ts +0 -50
  459. package/dist/token-crypto.js +0 -1
package/dist/seats.js ADDED
@@ -0,0 +1,551 @@
1
+ /**
2
+ * The unified 0600 seat store (Queen rescope, scope A) — `seats.json`.
3
+ *
4
+ * Collapses the per-seat drone-session CREDENTIAL and its worktree BINDING into
5
+ * ONE atomically-written record, keyed by the deterministic seat ref
6
+ * (origin+trust+cube+role+operation). Because a record's `state` and its
7
+ * `worktree` binding are written together in a single `withStore` commit, the
8
+ * invariant "an ACTIVE credential without a binding" is UNREACHABLE BY
9
+ * CONSTRUCTION: PREPARE mints `{credential, state:'pending'}` with NO worktree;
10
+ * FINALIZE sets `state:'active' + server metadata + worktree + display` in one
11
+ * commit; a reset deletes the whole record so credential+binding vanish together
12
+ * (there is no cross-store 'partial').
13
+ *
14
+ * The single store flock (seat-store.withStore) serializes every read-compare-
15
+ * write; there is no second lock and no composite. The raw bearer rests ONLY in
16
+ * the 0600 file and is never returned past this module except by the sole
17
+ * hydration reader; every other observation is digest-only.
18
+ */
19
+ import os from 'os';
20
+ import path from 'path';
21
+ import { createHash } from 'node:crypto';
22
+ import { readStoreFile, withStore } from './seat-store.js';
23
+ export const SEATS_FILE = path.join(os.homedir(), '.config', 'borgmcp', 'seats.json');
24
+ const SEATS_VERSION = 1;
25
+ const REF_RE = /^borg-server-session:[a-f0-9]{64}$/;
26
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
27
+ /** The deterministic per-seat ref (identical algorithm to the retired keychain account). */
28
+ export function seatRef(input) {
29
+ const binding = createHash('sha256')
30
+ .update(input.origin)
31
+ .update('\0')
32
+ .update(input.trustIdentity)
33
+ .update('\0')
34
+ .update(input.cubeId)
35
+ .update('\0')
36
+ .update(input.roleId)
37
+ .update('\0')
38
+ .update(input.operation.projectRoot)
39
+ .update('\0')
40
+ .update(input.operation.kind)
41
+ .update('\0')
42
+ .update(input.operation.operationKey)
43
+ .digest('hex');
44
+ return `borg-server-session:${binding}`;
45
+ }
46
+ function digestOf(bearer) {
47
+ return createHash('sha256').update(bearer).digest('hex');
48
+ }
49
+ function emptyStore() {
50
+ return { version: SEATS_VERSION, seats: {} };
51
+ }
52
+ const ROLE_CLASSES = new Set(['queen', 'worker']);
53
+ const OPERATION_KINDS = new Set(['seat', 'sibling']);
54
+ function isNonEmptyString(value) {
55
+ return typeof value === 'string' && value.length > 0;
56
+ }
57
+ function isValidOperation(value) {
58
+ if (value === null || typeof value !== 'object')
59
+ return false;
60
+ const op = value;
61
+ return (isNonEmptyString(op.projectRoot) &&
62
+ typeof op.kind === 'string' &&
63
+ OPERATION_KINDS.has(op.kind) &&
64
+ isNonEmptyString(op.operationKey));
65
+ }
66
+ /**
67
+ * CR#2: FULL per-entry validation. Every key/value/invariant of a seat record is
68
+ * checked — the ref is well-formed and self-consistent (the map key equals the
69
+ * record's derived ref), state ∈ {pending,active}, the credential is a non-empty
70
+ * string, the operation is well-shaped, an ACTIVE record carries ALL its required
71
+ * server + binding fields, and a PENDING record carries NO active-only fields
72
+ * (session id / expiry). A single invalid entry ⇒ the whole store is rejected
73
+ * (fail closed at the caller, bytes preserved) — never a silent cast.
74
+ */
75
+ function isValidSeatRecord(ref, value) {
76
+ if (!REF_RE.test(ref))
77
+ return false;
78
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
79
+ return false;
80
+ const r = value;
81
+ // Identity + credential + operation.
82
+ if (!isNonEmptyString(r.origin) ||
83
+ !isNonEmptyString(r.trustIdentity) ||
84
+ !isNonEmptyString(r.cubeId) ||
85
+ !isNonEmptyString(r.roleId) ||
86
+ !isValidOperation(r.operation) ||
87
+ !isNonEmptyString(r.credential)) {
88
+ return false;
89
+ }
90
+ if (r.state !== 'pending' && r.state !== 'active')
91
+ return false;
92
+ // Optional display/typed fields, validated when present.
93
+ if (r.name !== undefined && typeof r.name !== 'string')
94
+ return false;
95
+ if (r.droneLabel !== undefined && typeof r.droneLabel !== 'string')
96
+ return false;
97
+ if (r.roleName !== undefined && typeof r.roleName !== 'string')
98
+ return false;
99
+ if (r.roleClass !== undefined && (typeof r.roleClass !== 'string' || !ROLE_CLASSES.has(r.roleClass)))
100
+ return false;
101
+ if (r.isHumanSeat !== undefined && typeof r.isHumanSeat !== 'boolean')
102
+ return false;
103
+ if (r.worktree !== undefined && typeof r.worktree !== 'string')
104
+ return false;
105
+ if (r.droneId !== undefined && (typeof r.droneId !== 'string' || !UUID_RE.test(r.droneId)))
106
+ return false;
107
+ if (r.sessionId !== undefined && (typeof r.sessionId !== 'string' || !UUID_RE.test(r.sessionId)))
108
+ return false;
109
+ if (r.expiresAt !== undefined &&
110
+ (typeof r.expiresAt !== 'string' || !Number.isFinite(Date.parse(r.expiresAt)))) {
111
+ return false;
112
+ }
113
+ // State-consistency invariants (no inconsistent active|pending).
114
+ if (r.state === 'active') {
115
+ // An ACTIVE record MUST carry its full server session + worktree binding.
116
+ if (typeof r.droneId !== 'string' ||
117
+ typeof r.sessionId !== 'string' ||
118
+ typeof r.expiresAt !== 'string' ||
119
+ typeof r.worktree !== 'string' ||
120
+ typeof r.name !== 'string' ||
121
+ typeof r.droneLabel !== 'string') {
122
+ return false;
123
+ }
124
+ }
125
+ else {
126
+ // A PENDING record must NOT carry active-only server session fields.
127
+ if (r.sessionId !== undefined || r.expiresAt !== undefined)
128
+ return false;
129
+ }
130
+ // The map key must equal the record's derived ref (no cross-key aliasing).
131
+ return seatRef(value) === ref;
132
+ }
133
+ /**
134
+ * CR4 + CR#2: parse + FULL version/schema/per-entry validation. Returns null (→ fail
135
+ * closed at the caller, bytes preserved) for any malformed JSON, wrong version, or
136
+ * ANY invalid entry; never throws and never coerces an invalid file into a
137
+ * valid-looking or empty store.
138
+ */
139
+ function parseStore(raw) {
140
+ let parsed;
141
+ try {
142
+ parsed = JSON.parse(raw);
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
148
+ const candidate = parsed;
149
+ if (candidate.version === SEATS_VERSION &&
150
+ candidate.seats &&
151
+ typeof candidate.seats === 'object' &&
152
+ !Array.isArray(candidate.seats)) {
153
+ const seats = candidate.seats;
154
+ for (const [ref, record] of Object.entries(seats)) {
155
+ if (!isValidSeatRecord(ref, record))
156
+ return null;
157
+ }
158
+ return { version: SEATS_VERSION, seats: seats };
159
+ }
160
+ }
161
+ return null;
162
+ }
163
+ async function readStore() {
164
+ const raw = await readStoreFile(SEATS_FILE);
165
+ // CR4 fail-closed: ENOENT alone initializes empty. A present-but-malformed /
166
+ // wrong-version / schema-invalid store MUST NOT read as empty (a following commit
167
+ // would erase every seat); throw so the on-disk bytes are preserved.
168
+ if (raw === null)
169
+ return emptyStore();
170
+ const parsed = parseStore(raw);
171
+ if (parsed === null) {
172
+ throw new Error('Borg seat store is malformed or has an unsupported version; refusing to read it');
173
+ }
174
+ return parsed;
175
+ }
176
+ /** True iff `record` is a well-formed seat for `ref` + `binding` (origin/trust/cube). */
177
+ function recordMatches(record, ref, binding) {
178
+ return (record !== undefined &&
179
+ record.origin === binding.origin &&
180
+ record.trustIdentity === binding.trustIdentity &&
181
+ record.cubeId === binding.cubeId &&
182
+ (record.state === 'pending' || record.state === 'active') &&
183
+ typeof record.credential === 'string' &&
184
+ seatRef(record) === ref);
185
+ }
186
+ /**
187
+ * TYPED, token-safe observation of the record at `ref` (CR#3). Lock-free read
188
+ * (atomic rename → complete file); the authoritative delete/activate re-reads
189
+ * under the flock. Returns only a digest + drone id, never the raw bearer.
190
+ */
191
+ export async function observeSeat(ref, binding) {
192
+ if (!REF_RE.test(ref))
193
+ return { state: 'absent' };
194
+ const store = await readStore();
195
+ const record = store.seats[ref];
196
+ if (!recordMatches(record, ref, binding))
197
+ return { state: 'absent' };
198
+ const digest = digestOf(record.credential);
199
+ if (record.state === 'active') {
200
+ return { state: 'active', digest, droneId: typeof record.droneId === 'string' ? record.droneId : '' };
201
+ }
202
+ return { state: 'pending', digest };
203
+ }
204
+ /**
205
+ * The SOLE raw-bearer reader (SR-seven #5). Returns the ACTIVE bearer for `ref`
206
+ * iff the record is active AND the binding matches — used only to hydrate the
207
+ * live seat for authenticated requests. Every other caller observes digest-only.
208
+ */
209
+ export async function getActiveSeatCredential(ref, binding) {
210
+ if (!REF_RE.test(ref))
211
+ return null;
212
+ const store = await readStore();
213
+ const record = store.seats[ref];
214
+ if (!recordMatches(record, ref, binding) || record.state !== 'active')
215
+ return null;
216
+ return record.credential;
217
+ }
218
+ // ─── PREPARE / mint (no worktree yet) ────────────────────────────────────────
219
+ /**
220
+ * Mint the client bearer for one seat, or return the existing record (pending or
221
+ * active) so a lost-response retry re-sends the identical bearer. The minted
222
+ * record has NO worktree binding — FINALIZE adds it atomically with activation,
223
+ * so a pending record is never a live binding.
224
+ */
225
+ export async function mintPendingSeat(input) {
226
+ const ref = seatRef(input);
227
+ return withStore(SEATS_FILE, emptyStore, parseStore, async (txn) => {
228
+ const existing = txn.data.seats[ref];
229
+ if (recordMatches(existing, ref, { origin: input.origin, trustIdentity: input.trustIdentity, cubeId: input.cubeId })) {
230
+ return existing;
231
+ }
232
+ const record = {
233
+ origin: input.origin,
234
+ trustIdentity: input.trustIdentity,
235
+ cubeId: input.cubeId,
236
+ roleId: input.roleId,
237
+ operation: input.operation,
238
+ credential: input.credential,
239
+ state: 'pending',
240
+ };
241
+ txn.data.seats[ref] = record;
242
+ await txn.commit();
243
+ return record;
244
+ });
245
+ }
246
+ /**
247
+ * CR#1 PREPARE-time abort in the single-store model. Under ONE store flock:
248
+ * REVALIDATE the typed expectation against the record currently at the seat ref
249
+ * (EXACT: the exact prior ACTIVE record must still hold — ref, optional drone id,
250
+ * optional live-bearer digest; ABSENT: no ACTIVE record may hold this seat), then
251
+ * — only if it holds — MINT the pending record in the SAME lock hold. A pre-existing
252
+ * valid record (pending from a lost-response retry, or the active record being
253
+ * reattached) is REUSED so the identical bearer is re-sent. `scrubBeforeMint`
254
+ * discards a known-invalid saved record (eviction remint) before minting, still
255
+ * under the one flock. On a mismatch NOTHING is minted or scrubbed (abort).
256
+ */
257
+ export async function prepareSeat(input) {
258
+ const { expected, revalidate = true, scrubBeforeMint = false, seed } = input;
259
+ const ref = seatRef(seed);
260
+ const binding = { origin: seed.origin, trustIdentity: seed.trustIdentity, cubeId: seed.cubeId };
261
+ return withStore(SEATS_FILE, emptyStore, parseStore, async (txn) => {
262
+ if (revalidate) {
263
+ const prior = txn.data.seats[ref];
264
+ let mismatch;
265
+ if (expected.kind === 'exact') {
266
+ const holds = recordMatches(prior, ref, binding) &&
267
+ prior.state === 'active' &&
268
+ ref === expected.credentialRef &&
269
+ (expected.droneId === undefined || prior.droneId === expected.droneId) &&
270
+ (expected.sessionDigest === undefined || digestOf(prior.credential) === expected.sessionDigest);
271
+ mismatch = !holds;
272
+ }
273
+ else {
274
+ // ABSENT: an ACTIVE record holding this seat is a mismatch. A PENDING record
275
+ // (a lost-response retry / crash-in-gap) is NOT a live binding and is reused
276
+ // below so the identical bearer is re-sent.
277
+ mismatch = recordMatches(prior, ref, binding) && prior.state === 'active';
278
+ }
279
+ if (mismatch)
280
+ return { ok: false, reason: 'expectation-mismatch' };
281
+ }
282
+ if (scrubBeforeMint) {
283
+ delete txn.data.seats[ref];
284
+ }
285
+ const existing = txn.data.seats[ref];
286
+ if (recordMatches(existing, ref, binding)) {
287
+ // Idempotent reuse: re-send the exact bearer the server already digest-bound
288
+ // (a lost-response retry, a crash-in-gap pending, or an active reattach).
289
+ return { ok: true, record: existing };
290
+ }
291
+ const record = {
292
+ origin: seed.origin,
293
+ trustIdentity: seed.trustIdentity,
294
+ cubeId: seed.cubeId,
295
+ roleId: seed.roleId,
296
+ operation: seed.operation,
297
+ credential: seed.credential,
298
+ state: 'pending',
299
+ };
300
+ txn.data.seats[ref] = record;
301
+ await txn.commit();
302
+ return { ok: true, record };
303
+ });
304
+ }
305
+ /**
306
+ * ATOMIC compare-and-activate + bind (CR#2 + the scope-A collapse). Under ONE
307
+ * flock: the exact pending/active record whose bearer digest matches
308
+ * `expectedPendingDigest` is stamped ACTIVE with the server metadata AND the
309
+ * worktree binding + display, in a single commit. A same-ref replacement or a
310
+ * missing record fails closed (`replaced`/`missing`) — server metadata for bearer
311
+ * A is never bound onto bearer B, and the digest guard holds even on the
312
+ * no-expectation-digest paths (the SENT bearer's digest is always pinned).
313
+ * Because `state:'active'` and `worktree` land together, ACTIVE-without-binding
314
+ * is unreachable by construction.
315
+ */
316
+ export async function activateAndBindSeat(input) {
317
+ if (!UUID_RE.test(input.droneId) || !UUID_RE.test(input.sessionId)) {
318
+ throw new Error('invalid Borg server session identity');
319
+ }
320
+ if (typeof input.expiresAt !== 'string' || !Number.isFinite(Date.parse(input.expiresAt))) {
321
+ throw new Error('invalid Borg server session expiry');
322
+ }
323
+ const ref = seatRef(input);
324
+ const binding = { origin: input.origin, trustIdentity: input.trustIdentity, cubeId: input.cubeId };
325
+ return withStore(SEATS_FILE, emptyStore, parseStore, async (txn) => {
326
+ const record = txn.data.seats[ref];
327
+ if (!recordMatches(record, ref, binding))
328
+ return 'missing';
329
+ if (digestOf(record.credential) !== input.expectedPendingDigest)
330
+ return 'replaced';
331
+ txn.data.seats[ref] = {
332
+ ...record,
333
+ state: 'active',
334
+ droneId: input.droneId,
335
+ sessionId: input.sessionId,
336
+ expiresAt: input.expiresAt,
337
+ worktree: input.worktree,
338
+ name: input.name,
339
+ droneLabel: input.droneLabel,
340
+ ...(input.roleName !== undefined ? { roleName: input.roleName } : {}),
341
+ ...(input.roleClass !== undefined ? { roleClass: input.roleClass } : {}),
342
+ ...(input.isHumanSeat !== undefined ? { isHumanSeat: input.isHumanSeat } : {}),
343
+ };
344
+ await txn.commit();
345
+ return 'activated';
346
+ });
347
+ }
348
+ /**
349
+ * CR#2: bind an existing PENDING record to a worktree WITHOUT activating it. On a
350
+ * SIBLING attach whose atomic activate+bind failed, the spawned worktree is
351
+ * preserved for an operator-driven rerun (CR#5). This stamps the worktree locator +
352
+ * display (and, if known, the drone id) onto the EXACT digest-matched PENDING record
353
+ * so the rerun FROM that worktree can DISCOVER and RESUME it — re-sending the
354
+ * identical bearer the server already digest-bound, converging on the SAME seat (no
355
+ * ghost). The record STAYS `state:'pending'`: it is non-hydratable as a live seat
356
+ * (getActiveSeatForWorktree still requires state==='active'), so this introduces no
357
+ * ACTIVE-without-activation state. Under ONE store flock (CR#3), fail-closed (CR#4):
358
+ * a missing / already-ACTIVE / same-ref-replaced record is a typed no-op — never
359
+ * binds a worktree onto a different bearer, never mutates an ACTIVE record.
360
+ */
361
+ export async function bindPendingSeatToWorktree(input) {
362
+ if (input.droneId !== undefined && !UUID_RE.test(input.droneId)) {
363
+ throw new Error('invalid Borg server session identity');
364
+ }
365
+ const ref = seatRef(input);
366
+ const binding = { origin: input.origin, trustIdentity: input.trustIdentity, cubeId: input.cubeId };
367
+ return withStore(SEATS_FILE, emptyStore, parseStore, async (txn) => {
368
+ const record = txn.data.seats[ref];
369
+ if (!recordMatches(record, ref, binding))
370
+ return 'missing';
371
+ // Never touch an ACTIVE record, and never bind a worktree onto a same-ref
372
+ // replacement — the record's live digest must still equal the sent bearer's.
373
+ if (record.state !== 'pending' || digestOf(record.credential) !== input.expectedPendingDigest) {
374
+ return 'replaced';
375
+ }
376
+ txn.data.seats[ref] = {
377
+ ...record,
378
+ // state STAYS 'pending' — NOT activated. Only the worktree locator + display
379
+ // (+ drone id) land, so the preserved worktree owns a discoverable, resumable
380
+ // pending record without becoming a live/hydratable binding.
381
+ worktree: input.worktree,
382
+ name: input.name,
383
+ droneLabel: input.droneLabel,
384
+ ...(input.droneId !== undefined ? { droneId: input.droneId } : {}),
385
+ ...(input.roleName !== undefined ? { roleName: input.roleName } : {}),
386
+ ...(input.roleClass !== undefined ? { roleClass: input.roleClass } : {}),
387
+ ...(input.isHumanSeat !== undefined ? { isHumanSeat: input.isHumanSeat } : {}),
388
+ };
389
+ await txn.commit();
390
+ return 'bound';
391
+ });
392
+ }
393
+ // ─── Hydration / enumeration (scan by worktree) ──────────────────────────────
394
+ /** The exact ACTIVE seat bound to `worktree`, or null. A pending record (no
395
+ * worktree, or non-active) is NEVER surfaced as a live binding. */
396
+ export async function getActiveSeatForWorktree(worktree) {
397
+ const store = await readStore();
398
+ for (const [ref, record] of Object.entries(store.seats)) {
399
+ if (record.state === 'active' && record.worktree === worktree && seatRef(record) === ref) {
400
+ return record;
401
+ }
402
+ }
403
+ return null;
404
+ }
405
+ /**
406
+ * CR#2: the seat bound to `worktree` regardless of state — an ACTIVE seat OR a
407
+ * bound-PENDING record (a sibling whose activation failed, bound to its preserved
408
+ * worktree by `bindPendingSeatToWorktree`). Used ONLY by the resume path to recover
409
+ * a bound-pending record's stored `operation` + `state` so the rerun can re-derive
410
+ * the EXACT seat ref and re-send the identical bearer. A bound-pending record is
411
+ * still NON-hydratable as a live seat — `getActiveSeatForWorktree` (and hence
412
+ * `getActiveCube`) still require state==='active', so this reader does NOT weaken
413
+ * the no-ACTIVE-without-binding / non-hydratable-pending invariants.
414
+ */
415
+ export async function getSeatForWorktree(worktree) {
416
+ const store = await readStore();
417
+ for (const [ref, record] of Object.entries(store.seats)) {
418
+ if (record.worktree === worktree && seatRef(record) === ref) {
419
+ return record;
420
+ }
421
+ }
422
+ return null;
423
+ }
424
+ /**
425
+ * CR#3: find an in-flight IMPLICIT-sibling attempt for `binding` — a PENDING,
426
+ * kind==='sibling' record whose operation.projectRoot is the source repo and which
427
+ * has NO worktree binding yet (unbound). Such a record is the persisted, collision-
428
+ * safe attempt identity left when a crash struck AFTER the server accepted the attach
429
+ * but BEFORE the worktree bind: its per-invocation-unique operationKey would otherwise
430
+ * be undiscoverable, so a rerun would mint a NEW bearer and the server (digest-
431
+ * correlating) would create a GHOST seat. Recovering it lets the rerun re-derive the
432
+ * EXACT ref and re-send the identical bearer (the server reuses its seat). A BOUND
433
+ * pending sibling (already discoverable by its worktree) and an ACTIVE record are NOT
434
+ * returned — so a COMPLETED sibling frees the source-repo key and the next distinct
435
+ * sibling mints a fresh identity. Deterministic first match.
436
+ */
437
+ export async function findIncompleteSiblingAttempt(binding) {
438
+ const store = await readStore();
439
+ for (const [ref, record] of Object.entries(store.seats)) {
440
+ if (record.state === 'pending' &&
441
+ record.worktree === undefined &&
442
+ record.operation.kind === 'sibling' &&
443
+ record.origin === binding.origin &&
444
+ record.trustIdentity === binding.trustIdentity &&
445
+ record.cubeId === binding.cubeId &&
446
+ record.operation.projectRoot === binding.projectRoot &&
447
+ seatRef(record) === ref) {
448
+ return record;
449
+ }
450
+ }
451
+ return null;
452
+ }
453
+ /** True iff this worktree has ANY persisted seat record (active OR a bound
454
+ * pending), so a crash-in-gap PENDING seat is discoverable (not mislabeled). */
455
+ export async function hasSeatForWorktree(worktree) {
456
+ const store = await readStore();
457
+ return Object.values(store.seats).some((r) => r.worktree === worktree);
458
+ }
459
+ /** All ACTIVE bound seats — {worktree, record}. */
460
+ export async function readAllActiveSeats() {
461
+ const store = await readStore();
462
+ const out = [];
463
+ for (const [ref, record] of Object.entries(store.seats)) {
464
+ if (record.state === 'active' && typeof record.worktree === 'string' && seatRef(record) === ref) {
465
+ out.push({ worktree: record.worktree, record });
466
+ }
467
+ }
468
+ return out;
469
+ }
470
+ /**
471
+ * Reset the seat bound to `worktree`: under ONE flock, re-check the exact FULL
472
+ * binding (ref + drone id) and the token-safe observation, then DELETE the whole
473
+ * record — credential AND binding vanish together in one commit (no 'partial',
474
+ * no cross-store skew). Any drift (missing / different ref or drone / same-ref
475
+ * digest replacement) is an honest no-op.
476
+ */
477
+ export async function resetSeatForWorktree(expected) {
478
+ return withStore(SEATS_FILE, emptyStore, parseStore, async (txn) => {
479
+ const record = txn.data.seats[expected.ref];
480
+ if (record === undefined ||
481
+ record.worktree !== expected.worktree ||
482
+ record.droneId !== expected.droneId ||
483
+ seatRef(record) !== expected.ref) {
484
+ // Look for whether ANY record still binds this worktree — if not, no-op.
485
+ const anyBound = Object.values(txn.data.seats).some((r) => r.worktree === expected.worktree);
486
+ return anyBound ? { outcome: 'changed' } : { outcome: 'no-binding' };
487
+ }
488
+ // Same-ref replacement guard: the live digest must still match the snapshot.
489
+ const expDigest = expected.observation.state === 'absent' ? null : expected.observation.digest;
490
+ if (expDigest !== null && digestOf(record.credential) !== expDigest) {
491
+ return { outcome: 'changed' };
492
+ }
493
+ delete txn.data.seats[expected.ref];
494
+ await txn.commit();
495
+ return { outcome: 'reset', ref: expected.ref };
496
+ });
497
+ }
498
+ /** Abort-scrub of the caller's OWN pending record only (CR#2 finalize abort):
499
+ * delete iff still pending AND digest matches — never an active record, never a
500
+ * same-ref replacement. */
501
+ export async function scrubPendingSeat(ref, binding, expectedPendingDigest) {
502
+ if (!REF_RE.test(ref))
503
+ return false;
504
+ return withStore(SEATS_FILE, emptyStore, parseStore, async (txn) => {
505
+ const record = txn.data.seats[ref];
506
+ if (!recordMatches(record, ref, binding) || record.state !== 'pending')
507
+ return false;
508
+ if (digestOf(record.credential) !== expectedPendingDigest)
509
+ return false;
510
+ delete txn.data.seats[ref];
511
+ await txn.commit();
512
+ return true;
513
+ });
514
+ }
515
+ /** Discard any record for one seat ref (eviction remint before a fresh mint). */
516
+ export async function clearSeat(ref) {
517
+ if (!REF_RE.test(ref))
518
+ throw new Error('invalid Borg server session credential reference');
519
+ await withStore(SEATS_FILE, emptyStore, parseStore, async (txn) => {
520
+ if (txn.data.seats[ref] !== undefined) {
521
+ delete txn.data.seats[ref];
522
+ await txn.commit();
523
+ }
524
+ });
525
+ }
526
+ /** Metadata-only refresh of one exact ACTIVE seat. The expected tuple prevents
527
+ * a delayed response from updating a replacement seat that reused the worktree. */
528
+ export async function refreshSeatMetadata(worktree, expected, display) {
529
+ if (!REF_RE.test(expected.credentialRef))
530
+ return false;
531
+ return withStore(SEATS_FILE, emptyStore, parseStore, async (txn) => {
532
+ const record = txn.data.seats[expected.credentialRef];
533
+ if (record?.state !== 'active' || record.worktree !== worktree ||
534
+ record.cubeId !== expected.cubeId || record.droneId !== expected.droneId ||
535
+ seatRef(record) !== expected.credentialRef)
536
+ return false;
537
+ txn.data.seats[expected.credentialRef] = {
538
+ ...record,
539
+ name: display.name,
540
+ droneLabel: display.droneLabel,
541
+ ...(display.roleName !== undefined ? { roleName: display.roleName } : {}),
542
+ ...(display.roleClass !== undefined ? { roleClass: display.roleClass } : {}),
543
+ ...(display.isHumanSeat !== undefined ? { isHumanSeat: display.isHumanSeat } : {}),
544
+ };
545
+ await txn.commit();
546
+ return true;
547
+ });
548
+ }
549
+ /** @internal Test-only: point the store at a fixture path is done via HOME; this
550
+ * clears the module cache (there is none — every op reads fresh under the lock). */
551
+ //# sourceMappingURL=seats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seats.js","sourceRoot":"","sources":["../src/seats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Resolve absolute paths to sibling bin executables from the running entrypoint.
3
+ *
4
+ * When borg-mcp is installed globally or repo-locally, MCP config registrations
5
+ * and orientation commands must use the exact binary from THIS installation, not
6
+ * a bare name resolved via PATH (which may point to a different version).
7
+ *
8
+ * `fileURLToPath(import.meta.url)` gives the realpath of the compiled JS file
9
+ * under `dist/`. All bin targets are siblings in the same `dist/` directory.
10
+ */
11
+ /**
12
+ * Absolute path to a sibling bin file in dist/.
13
+ * Returns the path even if the file does not yet exist (caller decides whether
14
+ * to fail) so callers that write config can store the path before build.
15
+ */
16
+ export declare function resolveSelfBinPath(binName: string): string;
17
+ /** Absolute path to the borg-mcp stdio server entrypoint (dist/index.js). */
18
+ export declare function resolveMcpBinaryPath(): string;
19
+ /** Absolute path to borg-regen (dist/regen.js). */
20
+ export declare function resolveRegenPath(): string;
21
+ /** Absolute path to borg-inbox-monitor (dist/inbox-monitor.js). */
22
+ export declare function resolveInboxMonitorPath(): string;
23
+ /** Absolute path to borg-clear-rewake (dist/clear-rewake.js). */
24
+ export declare function resolveClearRewakePath(): string;
25
+ /** Absolute path to borg-log-audit (dist/log-audit.js). */
26
+ export declare function resolveLogAuditPath(): string;
27
+ //# sourceMappingURL=self-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-path.d.ts","sourceRoot":"","sources":["../src/self-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,iEAAiE;AACjE,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Resolve absolute paths to sibling bin executables from the running entrypoint.
3
+ *
4
+ * When borg-mcp is installed globally or repo-locally, MCP config registrations
5
+ * and orientation commands must use the exact binary from THIS installation, not
6
+ * a bare name resolved via PATH (which may point to a different version).
7
+ *
8
+ * `fileURLToPath(import.meta.url)` gives the realpath of the compiled JS file
9
+ * under `dist/`. All bin targets are siblings in the same `dist/` directory.
10
+ */
11
+ import path from 'path';
12
+ import { fileURLToPath } from 'url';
13
+ const DIST_DIR = path.dirname(fileURLToPath(import.meta.url));
14
+ /**
15
+ * Absolute path to a sibling bin file in dist/.
16
+ * Returns the path even if the file does not yet exist (caller decides whether
17
+ * to fail) so callers that write config can store the path before build.
18
+ */
19
+ export function resolveSelfBinPath(binName) {
20
+ const binPath = path.join(DIST_DIR, binName);
21
+ return binPath;
22
+ }
23
+ /** Absolute path to the borg-mcp stdio server entrypoint (dist/index.js). */
24
+ export function resolveMcpBinaryPath() {
25
+ return resolveSelfBinPath('index.js');
26
+ }
27
+ /** Absolute path to borg-regen (dist/regen.js). */
28
+ export function resolveRegenPath() {
29
+ return resolveSelfBinPath('regen.js');
30
+ }
31
+ /** Absolute path to borg-inbox-monitor (dist/inbox-monitor.js). */
32
+ export function resolveInboxMonitorPath() {
33
+ return resolveSelfBinPath('inbox-monitor.js');
34
+ }
35
+ /** Absolute path to borg-clear-rewake (dist/clear-rewake.js). */
36
+ export function resolveClearRewakePath() {
37
+ return resolveSelfBinPath('clear-rewake.js');
38
+ }
39
+ /** Absolute path to borg-log-audit (dist/log-audit.js). */
40
+ export function resolveLogAuditPath() {
41
+ return resolveSelfBinPath('log-audit.js');
42
+ }
43
+ //# sourceMappingURL=self-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-path.js","sourceRoot":"","sources":["../src/self-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9D;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,oBAAoB;IAClC,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;AACxC,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;AACxC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,uBAAuB;IACrC,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;AAChD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,sBAAsB;IACpC,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;AAC/C,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,mBAAmB;IACjC,OAAO,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAC5C,CAAC"}