borgmcp 1.1.14 → 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 +86 -37
  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
@@ -1 +1,394 @@
1
- import{mkdirSync as R,chmodSync as k,readdirSync as D,rmSync as S,writeFileSync as v,readFileSync as _}from"node:fs";import{homedir as $}from"node:os";import{join as m}from"node:path";import{randomBytes as T}from"node:crypto";import{spawn as w}from"node:child_process";import{CodexAppServerClient as N}from"./codex-app-server.js";import{codexBorgSessionConfigArgs as M,BORG_SESSION_ENV as P}from"./launch-gate.js";import{codexAppServerSocketConfigArgs as O}from"./codex-wake-resolve.js";import{BORG_AGENT_KIND_ENV as I,BORG_CODEX_REMOTE_WAKE_ENV as y,codexAgentKindConfigArgs as z,codexRemoteWakeConfigArgs as B}from"./agent-runtime.js";const F=m($(),".config","borgmcp","codex-remote"),H=3e4,A=16384;function d(r){let e=String(r).replace(/\x1B\[[0-?]*[ -/]*[@-~]/g,"");return e=e.replace(/\b((?:authorization\s*:\s*)?bearer)\s+[^\s,;]+/gi,"$1 <REDACTED>"),e=e.replace(/\b([a-z][a-z0-9+.-]*:\/\/)([^/\s:@]+):([^@\s/]+)@/gi,"$1<REDACTED>@"),e=e.replace(/([?&](?:access_token|auth_token|id_token|refresh_token|session_token|token|api_key|apikey|secret|password)=)[^&#\s]*/gi,"$1<REDACTED>"),e=e.replace(/\b((?:[a-z0-9_-]*(?:token|secret|password)|api[_-]?key)\s*[:=]\s*)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,;]+)/gi,"$1<REDACTED>"),e=e.replace(/\beyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\b/g,"<REDACTED>"),e=e.replace(/(^|[\s("'=])(?:file:\/\/)?\/(?:Users|home|private|tmp|var|etc|opt|Volumes)\/[^\s"'`<>)}\]]+/gm,"$1<REDACTED_PATH>"),e=e.replace(/\b[A-Za-z]:\\(?:Users|Documents and Settings|ProgramData|Temp)\\[^\s"'`<>)}\]]+/g,"<REDACTED_PATH>"),e.slice(-A)}function Q(r,e){return U(r)?r:["--cd",e,...r]}function U(r){return r.some(e=>e==="--cd"||e.startsWith("--cd=")||e==="-C")}function C(r){try{return process.kill(r,0),!0}catch(e){return e?.code==="EPERM"}}function ee(r,e={}){if(!r)return null;const s=e.isAlive??C,o=e.readPidFile??(i=>_(i,"utf-8")),a=r.replace(/\.sock$/,".pid");try{const i=Number.parseInt(o(a).trim(),10);return Number.isNaN(i)?null:s(i)}catch{return null}}function p(r){try{S(r,{force:!0})}catch{}}function V(r,e){let s;try{s=D(r)}catch{return}for(const o of s){if(!o.endsWith(".pid"))continue;const a=m(r,o),i=m(r,o.replace(/\.pid$/,".sock"));let t;try{t=Number.parseInt(_(a,"utf-8").trim(),10)}catch{p(a);continue}(Number.isNaN(t)||!e(t))&&(p(i),p(a))}}function f(r){return{args:[],env:{},warning:r}}function X(r){return r.error?`process error: ${d(r.error)}`:r.exitCode!=null?`exit code ${r.exitCode}`:r.signal?`signal ${r.signal}`:"unknown exit status"}function b(r){const e=d(r).trim();return e?` Stderr: ${e}`:""}async function re(r){const e=r.runtimeDir??F,s=r.isAlive??C,o=r.readyTimeoutMs??H,a=r.pollIntervalMs??250;try{R(e,{recursive:!0,mode:448}),k(e,448),V(e,s)}catch(n){return f(`Codex remote-wake disabled: could not prepare ${e} (${n?.message??n}); run borg_regen manually.`)}const i=(r.socketId??(()=>T(16).toString("hex")))(),t=m(e,`${i}.sock`),l=m(e,`${i}.pid`);let c;try{c=r.spawnAppServer(t)}catch(n){return p(t),f(`Codex remote-wake disabled: could not start \`codex app-server\` (${d(String(n?.message??n))}) \u2014 confirm the Codex executable is installed and available on PATH. Remote wake is unavailable for this session; run borg_regen manually to catch up.`)}if(c.pid!=null)try{v(l,String(c.pid))}catch{}const g=()=>{try{c.kill()}catch{}p(t),p(l)},x=Math.max(1,Math.ceil(o/a));let u=!1,h;for(let n=0;n<x&&!u;n++){try{u=await r.probeReady(t)}catch{u=!1}if(!u){const E=c.diagnostics?.();if(E?.exited){h=E;break}}!u&&n<x-1&&await r.sleep(a)}if(!u){const n=h??c.diagnostics?.();return g(),n?.exited?f(`Codex remote-wake disabled: \`codex app-server\` exited before becoming ready (${X(n)}).${b(n.stderr)} Run borg_regen manually to catch up.`):f(`Codex remote-wake disabled: \`codex app-server\` remained running but did not become ready at ${d(t)} within ${o}ms.${b(n?.stderr??"")} Run borg_regen manually to catch up.`)}return{args:["--remote",`unix://${t}`],env:{[y]:"1"},server:{pid:c.pid,socketPath:t,cleanup:g}}}function te(){return{spawnAppServer:r=>{const e=w("codex",["app-server",...M(),...z(),...B(),...O(r),"--listen",`unix://${r}`],{stdio:["ignore","ignore","pipe"],shell:!1,env:{...process.env,[P]:"1",[I]:"codex",[y]:"1"}});let s="",o=!1,a=null,i=null,t=null;return e.stderr?.setEncoding("utf8"),e.stderr?.on("data",l=>{s=`${s}${String(l)}`.slice(-A)}),e.once("close",(l,c)=>{o=!0,a=l,i=c}),e.once("error",l=>{o=!0,t=d(l.message)}),{pid:e.pid,kill:()=>{try{e.kill()}catch{}},diagnostics:()=>({exited:o,exitCode:a,signal:i,error:t==null?null:d(t),stderr:d(s)})}},probeReady:async r=>{const e=new N(r);try{return await e.connect(),await e.loadedThreadIds(),!0}catch{return!1}finally{try{e.close()}catch{}}},sleep:r=>new Promise(e=>setTimeout(e,r))}}export{F as DEFAULT_CODEX_REMOTE_DIR,ee as checkCodexBridgeHealthy,te as defaultCodexRemoteDeps,C as defaultIsAlive,re as prepareCodexRemoteLaunch,Q as withCodexCwdArg};
1
+ import { mkdirSync, chmodSync, readdirSync, rmSync, writeFileSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ import { randomBytes } from 'node:crypto';
5
+ import { spawn } from 'node:child_process';
6
+ import { CodexAppServerClient } from './codex-app-server.js';
7
+ import { codexBorgSessionConfigArgs, BORG_SESSION_ENV } from './launch-gate.js';
8
+ import { codexAppServerSocketConfigArgs } from './codex-wake-resolve.js';
9
+ import { BORG_AGENT_KIND_ENV, BORG_CODEX_REMOTE_WAKE_ENV, codexAgentKindConfigArgs, codexRemoteWakeConfigArgs, } from './agent-runtime.js';
10
+ export const DEFAULT_CODEX_REMOTE_DIR = join(homedir(), '.config', 'borgmcp', 'codex-remote');
11
+ const DEFAULT_CODEX_REMOTE_READY_TIMEOUT_MS = 30_000;
12
+ const MAX_CODEX_APP_SERVER_STDERR_CHARS = 16_384;
13
+ /**
14
+ * Keep app-server failure details useful without copying credentials or local
15
+ * filesystem locations into the parent process warning.
16
+ */
17
+ function sanitizeCodexDiagnostic(input) {
18
+ let sanitized = String(input).replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
19
+ sanitized = sanitized.replace(/\b((?:authorization\s*:\s*)?bearer)\s+[^\s,;]+/gi, '$1 <REDACTED>');
20
+ sanitized = sanitized.replace(/\b([a-z][a-z0-9+.-]*:\/\/)([^/\s:@]+):([^@\s/]+)@/gi, '$1<REDACTED>@');
21
+ sanitized = sanitized.replace(/([?&](?:access_token|auth_token|id_token|refresh_token|session_token|token|api_key|apikey|secret|password)=)[^&#\s]*/gi, '$1<REDACTED>');
22
+ sanitized = sanitized.replace(/\b((?:[a-z0-9_-]*(?:token|secret|password)|api[_-]?key)\s*[:=]\s*)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,;]+)/gi, '$1<REDACTED>');
23
+ sanitized = sanitized.replace(/\beyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\b/g, '<REDACTED>');
24
+ sanitized = sanitized.replace(/(^|[\s("'=])(?:file:\/\/)?\/(?:Users|home|private|tmp|var|etc|opt|Volumes)\/[^\s"'`<>)}\]]+/gm, '$1<REDACTED_PATH>');
25
+ sanitized = sanitized.replace(/\b[A-Za-z]:\\(?:Users|Documents and Settings|ProgramData|Temp)\\[^\s"'`<>)}\]]+/g, '<REDACTED_PATH>');
26
+ return sanitized.slice(-MAX_CODEX_APP_SERVER_STDERR_CHARS);
27
+ }
28
+ export function withCodexCwdArg(args, cwd) {
29
+ if (hasCodexCwdArg(args))
30
+ return args;
31
+ return ['--cd', cwd, ...args];
32
+ }
33
+ /** Resolve the project directory Codex itself will use for this launch.
34
+ * Relative explicit paths are interpreted from the wrapper's current working
35
+ * directory, matching Codex's CLI path resolution. The final occurrence wins,
36
+ * matching clap's override behavior for repeated options. */
37
+ export function resolveCodexLaunchCwd(args, fallbackCwd) {
38
+ const baseCwd = resolve(fallbackCwd);
39
+ let selected = baseCwd;
40
+ for (let index = 0; index < args.length; index += 1) {
41
+ const arg = args[index];
42
+ if (arg === '--')
43
+ break;
44
+ if (arg === '--cd' || arg === '-C') {
45
+ const value = args[index + 1];
46
+ if (value !== undefined && value.length > 0) {
47
+ selected = resolve(baseCwd, value);
48
+ index += 1;
49
+ }
50
+ continue;
51
+ }
52
+ if (arg.startsWith('--cd=')) {
53
+ const value = arg.slice('--cd='.length);
54
+ if (value.length > 0)
55
+ selected = resolve(baseCwd, value);
56
+ continue;
57
+ }
58
+ if (arg.startsWith('-C') && arg.length > 2) {
59
+ const value = arg.slice(2).replace(/^=/, '');
60
+ if (value.length > 0)
61
+ selected = resolve(baseCwd, value);
62
+ }
63
+ }
64
+ return selected;
65
+ }
66
+ function hasCodexCwdArg(args) {
67
+ for (const arg of args) {
68
+ if (arg === '--')
69
+ return false;
70
+ if (arg === '--cd' || arg.startsWith('--cd=') || arg === '-C' || (arg.startsWith('-C') && arg.length > 2)) {
71
+ return true;
72
+ }
73
+ }
74
+ return false;
75
+ }
76
+ export function defaultIsAlive(pid) {
77
+ try {
78
+ process.kill(pid, 0);
79
+ return true;
80
+ }
81
+ catch (err) {
82
+ // EPERM ⇒ the process exists but we can't signal it (still alive).
83
+ return err?.code === 'EPERM';
84
+ }
85
+ }
86
+ /**
87
+ * gh#633: process-liveness probe for the borg-owned codex app-server — the
88
+ * transport-agnostic analogue of the claude tail-F Monitor's pgrep check
89
+ * (checkInboxMonitorHealthy / stream-status.ts:48). Codex drones wake via this
90
+ * app-server bridge, NOT a tail-F Monitor, so wake_path_client_monitor_armed is
91
+ * false-by-design for them; the HOP-2 wake-path-deaf classifier mis-read that
92
+ * as deaf (gh#633). This gives HOP-2 the codex wake path's ACTUAL health.
93
+ *
94
+ * Uses the app-server PIDFILE (written at spawn, beside the socket) +
95
+ * process.kill(pid, 0) — NOT pgrep. The codex TUI is also launched
96
+ * `codex --remote unix://<socketPath>`, so a `pgrep -f <socketPath>` would ALSO
97
+ * match the live TUI and FALSE-ARM when the app-server has crashed but the TUI
98
+ * still runs (the deaf-but-alive case). The pidfile holds the EXACT app-server
99
+ * pid, so kill(0) reflects the app-server's liveness specifically — and it's
100
+ * cheaper than pgrep (no subprocess). Mirrors pruneStaleSockets' pid check.
101
+ *
102
+ * Tri-state (mirrors checkInboxMonitorHealthy's boolean|null contract):
103
+ * - true: pidfile resolves to a LIVE pid → app-server (bridge) is up → armed.
104
+ * - false: pidfile resolves to a DEAD pid → an unclean exit (crash/kill -9)
105
+ * left a stale pidfile (cleanup never ran) → bridge down → HOP-2
106
+ * correctly flags a genuinely-deaf codex drone (no SLI-lie).
107
+ * - null: pidfile missing / unreadable / unparseable → cannot determine →
108
+ * caller maps null→armed (false-deaf-avoidance, same as the claude
109
+ * monitor branch). A CLEAN app-server exit removes the pidfile, but
110
+ * then the drone is shutting down → the silent-stall watchdog
111
+ * backstops it via a separate layer.
112
+ *
113
+ * Residual (negligible, gh#633 / Coordinator 6f28fe3f): PID reuse — if the
114
+ * crashed app-server's pid is recycled by an unrelated process before the next
115
+ * launch's pruneStaleSockets removes the stale pidfile, kill(0) reports alive →
116
+ * a brief false-arm. The window is tiny (exact-pid reuse during the crash gap)
117
+ * and self-heals on the next launch's prune; far smaller than existsSync's
118
+ * always-on stale-file masking.
119
+ */
120
+ export function checkCodexBridgeHealthy(socketPath, deps = {}) {
121
+ if (!socketPath)
122
+ return null;
123
+ const isAlive = deps.isAlive ?? defaultIsAlive;
124
+ const readPidFile = deps.readPidFile ?? ((pidPath) => readFileSync(pidPath, 'utf-8'));
125
+ const pidPath = socketPath.replace(/\.sock$/, '.pid');
126
+ try {
127
+ const pid = Number.parseInt(readPidFile(pidPath).trim(), 10);
128
+ if (Number.isNaN(pid))
129
+ return null;
130
+ return isAlive(pid);
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ }
136
+ function safeRm(p) {
137
+ try {
138
+ rmSync(p, { force: true });
139
+ }
140
+ catch {
141
+ // best-effort
142
+ }
143
+ }
144
+ /**
145
+ * Remove sockets in the owned dir whose owning app-server pid is no longer
146
+ * alive (crashed prior launches), leaving live concurrent sessions' sockets
147
+ * untouched. Operates ONLY inside the borg-owned runtime dir.
148
+ */
149
+ function pruneStaleSockets(runtimeDir, isAlive) {
150
+ let entries;
151
+ try {
152
+ entries = readdirSync(runtimeDir);
153
+ }
154
+ catch {
155
+ return;
156
+ }
157
+ for (const name of entries) {
158
+ if (!name.endsWith('.pid'))
159
+ continue;
160
+ const pidPath = join(runtimeDir, name);
161
+ const sockPath = join(runtimeDir, name.replace(/\.pid$/, '.sock'));
162
+ let pid;
163
+ try {
164
+ pid = Number.parseInt(readFileSync(pidPath, 'utf-8').trim(), 10);
165
+ }
166
+ catch {
167
+ safeRm(pidPath);
168
+ continue;
169
+ }
170
+ if (Number.isNaN(pid) || !isAlive(pid)) {
171
+ safeRm(sockPath);
172
+ safeRm(pidPath);
173
+ }
174
+ }
175
+ }
176
+ function failLoud(reason) {
177
+ return { args: [], env: {}, warning: reason };
178
+ }
179
+ function formatExitReason(diagnostics) {
180
+ if (diagnostics.error)
181
+ return `process error: ${sanitizeCodexDiagnostic(diagnostics.error)}`;
182
+ if (diagnostics.exitCode != null)
183
+ return `exit code ${diagnostics.exitCode}`;
184
+ if (diagnostics.signal)
185
+ return `signal ${diagnostics.signal}`;
186
+ return 'unknown exit status';
187
+ }
188
+ function formatStderr(stderr) {
189
+ const trimmed = sanitizeCodexDiagnostic(stderr).trim();
190
+ return trimmed ? ` Stderr: ${trimmed}` : '';
191
+ }
192
+ /**
193
+ * Start a borg-owned per-launch Codex app-server, probe it for readiness, and
194
+ * return the `--remote` launch args + an owned handle (or a fail-loud warning).
195
+ * Async + lifecycle-owning: the caller MUST call `result.server?.cleanup()` on
196
+ * TUI exit.
197
+ */
198
+ export async function prepareCodexRemoteLaunch(deps) {
199
+ const runtimeDir = deps.runtimeDir ?? DEFAULT_CODEX_REMOTE_DIR;
200
+ const isAlive = deps.isAlive ?? defaultIsAlive;
201
+ const readyTimeoutMs = deps.readyTimeoutMs ?? DEFAULT_CODEX_REMOTE_READY_TIMEOUT_MS;
202
+ const pollIntervalMs = deps.pollIntervalMs ?? 250;
203
+ // 1. 0700 owned dir + prune crashed prior sockets (concurrent-safe via pid liveness).
204
+ try {
205
+ mkdirSync(runtimeDir, { recursive: true, mode: 0o700 });
206
+ chmodSync(runtimeDir, 0o700); // enforce 0700 even if it pre-existed with looser perms
207
+ pruneStaleSockets(runtimeDir, isAlive);
208
+ }
209
+ catch (err) {
210
+ return failLoud(`Codex remote-wake disabled: could not prepare ${runtimeDir} (${err?.message ?? err}); run borg_regen manually.`);
211
+ }
212
+ // 2. unique, non-predictable socket path inside the owned dir.
213
+ const id = (deps.socketId ?? (() => randomBytes(16).toString('hex')))();
214
+ const socketPath = join(runtimeDir, `${id}.sock`);
215
+ const pidPath = join(runtimeDir, `${id}.pid`);
216
+ // 3. spawn the long-lived app-server.
217
+ let child;
218
+ try {
219
+ child = deps.spawnAppServer(socketPath);
220
+ }
221
+ catch (err) {
222
+ safeRm(socketPath);
223
+ return failLoud(`Codex remote-wake disabled: could not start \`codex app-server\` (${sanitizeCodexDiagnostic(String(err?.message ?? err))}) — ` +
224
+ `confirm the Codex executable is installed and available on PATH. ` +
225
+ `Remote wake is unavailable for this session; run borg_regen manually to catch up.`);
226
+ }
227
+ if (child.pid != null) {
228
+ try {
229
+ writeFileSync(pidPath, String(child.pid));
230
+ }
231
+ catch {
232
+ // pidfile is only for stale-prune; launch still proceeds.
233
+ }
234
+ }
235
+ const cleanup = () => {
236
+ try {
237
+ child.kill();
238
+ }
239
+ catch {
240
+ // best-effort
241
+ }
242
+ safeRm(socketPath);
243
+ safeRm(pidPath);
244
+ };
245
+ // 4. readiness via a real protocol round-trip — bounded attempts (no clock dep).
246
+ const attempts = Math.max(1, Math.ceil(readyTimeoutMs / pollIntervalMs));
247
+ let ready = false;
248
+ let exitDiagnostics;
249
+ for (let i = 0; i < attempts && !ready; i++) {
250
+ try {
251
+ ready = await deps.probeReady(socketPath);
252
+ }
253
+ catch {
254
+ ready = false;
255
+ }
256
+ if (!ready) {
257
+ const diagnostics = child.diagnostics?.();
258
+ if (diagnostics?.exited) {
259
+ exitDiagnostics = diagnostics;
260
+ break;
261
+ }
262
+ }
263
+ if (!ready && i < attempts - 1)
264
+ await deps.sleep(pollIntervalMs);
265
+ }
266
+ if (!ready) {
267
+ const diagnostics = exitDiagnostics ?? child.diagnostics?.();
268
+ cleanup();
269
+ if (diagnostics?.exited) {
270
+ return failLoud(`Codex remote-wake disabled: \`codex app-server\` exited before becoming ready ` +
271
+ `(${formatExitReason(diagnostics)}).${formatStderr(diagnostics.stderr)} ` +
272
+ `Run borg_regen manually to catch up.`);
273
+ }
274
+ return failLoud(`Codex remote-wake disabled: \`codex app-server\` remained running but did not become ready ` +
275
+ `at ${sanitizeCodexDiagnostic(socketPath)} within ${readyTimeoutMs}ms.${formatStderr(diagnostics?.stderr ?? '')} ` +
276
+ `Run borg_regen manually to catch up.`);
277
+ }
278
+ // 5. ready → owned remote launch.
279
+ return {
280
+ args: ['--remote', `unix://${socketPath}`],
281
+ env: { [BORG_CODEX_REMOTE_WAKE_ENV]: '1' },
282
+ server: { pid: child.pid, socketPath, cleanup },
283
+ };
284
+ }
285
+ /**
286
+ * Production deps for prepareCodexRemoteLaunch — spawn the real `codex
287
+ * app-server` child + probe it with the real CodexAppServerClient. Shared by
288
+ * claude.ts and assimilate-deps.ts so there's ONE wiring.
289
+ *
290
+ * The readiness probe uses Codex app-server RPCs ONLY (connect + thread/loaded/
291
+ * list) — it never calls a Borg coordination endpoint — so it can never advance
292
+ * last_seen/last_regen_at and mask a deaf Codex (the gh#46/gh#406 signal-truth
293
+ * invariant; the app-server socket is the wake-DELIVERY wire, not a liveness
294
+ * signal).
295
+ */
296
+ export function defaultCodexRemoteDeps() {
297
+ return {
298
+ spawnAppServer: (socketPath) => {
299
+ // gh#851: this app-server — NOT the `codex --remote` TUI — spawns the
300
+ // borg-mcp MCP child, so the BORG_SESSION activation marker (gh#673) must
301
+ // ride HERE too, or the child gates dormant. Load-bearing = the `-c
302
+ // mcp_servers.borg.env.BORG_SESSION="1"` override (codex MCP children read
303
+ // only the pinned env, injected via the app-server's -c — same V2b
304
+ // mechanism the TUI launch uses, applied at the app-server boundary). The
305
+ // env BORG_SESSION=1 is a defensive belt (inherited env never reaches the
306
+ // codex MCP child by itself). Still activation-only per the launch-gate
307
+ // SR-BINDING — never a security/access signal.
308
+ //
309
+ // gh#855: pin THIS app-server's live socket into the same child env via the
310
+ // same `-c` channel, so the waking borg-mcp child is authoritative about
311
+ // its OWN socket and re-resolves the loaded thread FRESH each wake — a
312
+ // missed/stale launch probe can no longer cause permanent deafness. The
313
+ // socketPath is borg-generated (randomBytes), never user input, TOML-quoted
314
+ // exactly like the BORG_SESSION override — zero injection surface.
315
+ const child = spawn('codex', [
316
+ 'app-server',
317
+ ...codexBorgSessionConfigArgs(),
318
+ ...codexAgentKindConfigArgs(),
319
+ ...codexRemoteWakeConfigArgs(),
320
+ ...codexAppServerSocketConfigArgs(socketPath),
321
+ '--listen',
322
+ `unix://${socketPath}`,
323
+ ], {
324
+ stdio: ['ignore', 'ignore', 'pipe'],
325
+ shell: false,
326
+ env: {
327
+ ...process.env,
328
+ [BORG_SESSION_ENV]: '1',
329
+ [BORG_AGENT_KIND_ENV]: 'codex',
330
+ [BORG_CODEX_REMOTE_WAKE_ENV]: '1',
331
+ },
332
+ });
333
+ let stderr = '';
334
+ let exited = false;
335
+ let exitCode = null;
336
+ let signal = null;
337
+ let error = null;
338
+ child.stderr?.setEncoding('utf8');
339
+ child.stderr?.on('data', (chunk) => {
340
+ stderr = `${stderr}${String(chunk)}`.slice(-MAX_CODEX_APP_SERVER_STDERR_CHARS);
341
+ });
342
+ // `close` follows stdio drain; using it instead of `exit` keeps the final
343
+ // stderr chunk available when readiness reports the child failure.
344
+ child.once('close', (code, exitSignal) => {
345
+ exited = true;
346
+ exitCode = code;
347
+ signal = exitSignal;
348
+ });
349
+ child.once('error', (childError) => {
350
+ exited = true;
351
+ error = sanitizeCodexDiagnostic(childError.message);
352
+ });
353
+ return {
354
+ pid: child.pid,
355
+ kill: () => {
356
+ try {
357
+ child.kill();
358
+ }
359
+ catch {
360
+ // best-effort
361
+ }
362
+ },
363
+ diagnostics: () => ({
364
+ exited,
365
+ exitCode,
366
+ signal,
367
+ error: error == null ? null : sanitizeCodexDiagnostic(error),
368
+ stderr: sanitizeCodexDiagnostic(stderr),
369
+ }),
370
+ };
371
+ },
372
+ probeReady: async (socketPath) => {
373
+ const probe = new CodexAppServerClient(socketPath);
374
+ try {
375
+ await probe.connect();
376
+ await probe.loadedThreadIds();
377
+ return true;
378
+ }
379
+ catch {
380
+ return false;
381
+ }
382
+ finally {
383
+ try {
384
+ probe.close();
385
+ }
386
+ catch {
387
+ // best-effort
388
+ }
389
+ }
390
+ },
391
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
392
+ };
393
+ }
394
+ //# sourceMappingURL=codex-remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-remote.js","sourceRoot":"","sources":["../src/codex-remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-wake-resolve.d.ts","sourceRoot":"","sources":["../src/codex-wake-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kFAAkF;AAClF,eAAO,MAAM,gCAAgC,iCAAiC,CAAC;AAE/E,wFAAwF;AACxF,wBAAgB,2BAA2B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,IAAI,CAG/F;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAUhG;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,EACnE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAC1B,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,GACrD;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAWlD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EACzD,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAIT;AAID,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AACxC,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAc,CAAC;AACjD;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,CAIvE;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,EACX,QAAQ,SAAwB,GAC/B,OAAO,CAET;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB,OAAO,CAGT"}
@@ -1 +1,127 @@
1
- const u="BORG_CODEX_APP_SERVER_SOCKET";function a(t=process.env){const e=t[u];return e&&e.length>0?e:null}function f(t){return["-c",`mcp_servers.borg.env.${u}="${t}"`]}function E(t,e){if(t.length===0)return null;if(t.length===1)return t[0].id;const r=t.filter(o=>o.cwd===e.cwd),n=r.length>0?r:t;let c=n[0];for(const o of n)(o.updatedAt??0)>(c.updatedAt??0)&&(c=o);return c.id}function i(t,e){const r={};let n=!1;for(const[c,o]of Object.entries(t)){if(e(o.socketPath)===!1){n=!0;continue}r[c]=o}return{targets:r,changed:n}}function d(t,e){return!t||t.socketPath!==e.socketPath||t.threadId!==e.threadId}const p=5e3,_=6e4,s=45*6e4,x=1e3;function A(t,e=0){const r=Math.max(0,t),n=p*2**r;return Math.min(n,_)+e}function R(t,e,r=s){return e-t>=r}function l(t,e,r){return t===null?!0:e-t>=r}export{u as BORG_CODEX_APP_SERVER_SOCKET_ENV,p as WAKE_RETRY_BASE_MS,_ as WAKE_RETRY_CAP_MS,s as WAKE_RETRY_MAX_AGE_MS,x as WAKE_RETRY_MAX_ATTEMPTS,f as codexAppServerSocketConfigArgs,a as codexAppServerSocketFromEnv,E as pickFreshThread,i as pruneDeadWakeTargets,l as shouldFireHeartbeat,A as wakeRetryBackoffMs,R as wakeRetryExpired,d as wakeTargetChanged};
1
+ /**
2
+ * gh#855 — pure helpers for FRESH codex wake-target re-resolution.
3
+ *
4
+ * Root cause of codex deaf-when-idle: the wake target (socket + thread) was
5
+ * resolved once at launch and never refreshed, so a missed/stale launch probe
6
+ * left the drone permanently deaf. Phase 1 makes the waking borg-mcp child
7
+ * authoritative about its OWN live app-server socket — the socket is injected
8
+ * into the child's pinned env at spawn (codex-remote.ts, via the #851 `-c
9
+ * mcp_servers.borg.env.X` channel) — and re-resolves the loaded thread FRESH on
10
+ * every wake (loadedThreadIds is a re-runnable RPC).
11
+ *
12
+ * These are the pure pieces; the IO orchestration lives in codex-app-wake.ts.
13
+ */
14
+ /** Pinned-env var carrying THIS drone's live app-server socket (set at spawn). */
15
+ export const BORG_CODEX_APP_SERVER_SOCKET_ENV = 'BORG_CODEX_APP_SERVER_SOCKET';
16
+ /** The live app-server socket for this borg-mcp child, or null (un-upgraded launch). */
17
+ export function codexAppServerSocketFromEnv(env = process.env) {
18
+ const v = env[BORG_CODEX_APP_SERVER_SOCKET_ENV];
19
+ return v && v.length > 0 ? v : null;
20
+ }
21
+ /**
22
+ * The per-launch codex config override that pins THIS app-server's live socket
23
+ * into the borg-mcp child's [mcp_servers.borg.env] — the same `-c` channel the
24
+ * #851 BORG_SESSION marker rides (codex MCP children read only the pinned env,
25
+ * never inherited env). The socketPath is borg-generated (randomBytes under
26
+ * ~/.config/borgmcp/codex-remote), never user input; TOML-quoted exactly like
27
+ * the BORG_SESSION override, so there is zero injection surface.
28
+ */
29
+ export function codexAppServerSocketConfigArgs(socketPath) {
30
+ return ['-c', `mcp_servers.borg.env.${BORG_CODEX_APP_SERVER_SOCKET_ENV}="${socketPath}"`];
31
+ }
32
+ /**
33
+ * Pick the loaded thread to wake on the live socket. Each borg-owned app-server
34
+ * is fresh-per-launch / single-session, so the common case is exactly one loaded
35
+ * thread. When more than one is loaded, prefer the thread whose cwd matches this
36
+ * drone's working directory (sibling worktrees have distinct cwds), then the
37
+ * newest by updatedAt — always deterministic. No loaded thread → null (no wake
38
+ * this cycle; the next wake retries, so a transient empty list never causes
39
+ * permanent deafness).
40
+ */
41
+ export function pickFreshThread(threads, opts) {
42
+ if (threads.length === 0)
43
+ return null;
44
+ if (threads.length === 1)
45
+ return threads[0].id;
46
+ const cwdMatches = threads.filter((t) => t.cwd === opts.cwd);
47
+ const pool = cwdMatches.length > 0 ? cwdMatches : threads;
48
+ let best = pool[0];
49
+ for (const t of pool) {
50
+ if ((t.updatedAt ?? 0) > (best.updatedAt ?? 0))
51
+ best = t;
52
+ }
53
+ return best.id;
54
+ }
55
+ /**
56
+ * Pure prune: drop wake-target entries whose app-server socket is positively
57
+ * dead (liveness === false), so the file self-heals. Keeps alive (true) and
58
+ * indeterminate (null) entries — false-deaf-avoidance, mirroring
59
+ * checkCodexBridgeHealthy's tri-state. Returns the surviving map + whether
60
+ * anything changed (so the caller writes only on change).
61
+ */
62
+ export function pruneDeadWakeTargets(targets, socketLiveness) {
63
+ const out = {};
64
+ let changed = false;
65
+ for (const [key, t] of Object.entries(targets)) {
66
+ if (socketLiveness(t.socketPath) === false) {
67
+ changed = true;
68
+ continue;
69
+ }
70
+ out[key] = t;
71
+ }
72
+ return { targets: out, changed };
73
+ }
74
+ /**
75
+ * Whether the freshly-resolved target differs from what's already recorded —
76
+ * so the self-healing cache write happens only on change (no file thrash on a
77
+ * busy cube re-resolving the same socket+thread every wake).
78
+ */
79
+ export function wakeTargetChanged(existing, fresh) {
80
+ return (!existing || existing.socketPath !== fresh.socketPath || existing.threadId !== fresh.threadId);
81
+ }
82
+ // ─── gh#857 Phase 2: durable retry + heartbeat (pure helpers) ───────────────
83
+ /** Base backoff for the first retry of a dropped/deferred wake. */
84
+ export const WAKE_RETRY_BASE_MS = 5_000;
85
+ /** Backoff ceiling — a wedged thread is retried at most this often. */
86
+ export const WAKE_RETRY_CAP_MS = 60_000;
87
+ /**
88
+ * Age cap: a pending wake older than this is given up (dropped from the queue).
89
+ * Generous on purpose — the WI-2 heartbeat is the backstop beyond it, and the
90
+ * server read-cursor means the next delivery (heartbeat or a fresh entry) drains
91
+ * everything anyway, so an aged-out single wake is never a permanent miss.
92
+ */
93
+ export const WAKE_RETRY_MAX_AGE_MS = 45 * 60_000;
94
+ /**
95
+ * Hard iteration ceiling for the retry-drain loop — a defensive belt ALONGSIDE
96
+ * the time-based age cap. In prod the age cap (real clock) terminates the loop in
97
+ * ~45-50 attempts; this ceiling only matters if the clock fails to advance
98
+ * (pathological / a non-advancing injected clock in tests) where a time-only
99
+ * guard would hot-spin forever. Set far above any real attempt count.
100
+ */
101
+ export const WAKE_RETRY_MAX_ATTEMPTS = 1000;
102
+ /**
103
+ * Exponential backoff (ms) for the Nth retry of a pending wake (0-based),
104
+ * doubling from WAKE_RETRY_BASE_MS, saturating at WAKE_RETRY_CAP_MS, plus
105
+ * caller-supplied jitter so co-located sibling drones don't retry in lockstep.
106
+ */
107
+ export function wakeRetryBackoffMs(attempts, jitter = 0) {
108
+ const n = Math.max(0, attempts);
109
+ const exp = WAKE_RETRY_BASE_MS * 2 ** n;
110
+ return Math.min(exp, WAKE_RETRY_CAP_MS) + jitter;
111
+ }
112
+ /** True once a pending wake has outlived the age cap (give up; heartbeat backstops). */
113
+ export function wakeRetryExpired(firstEnqueuedAt, now, maxAgeMs = WAKE_RETRY_MAX_AGE_MS) {
114
+ return now - firstEnqueuedAt >= maxAgeMs;
115
+ }
116
+ /**
117
+ * WI-2 double-fire avoidance: the periodic heartbeat fires only when no wake (or
118
+ * prior heartbeat) delivery landed within the cadence window — so an active cube
119
+ * with flowing per-entry wakes doesn't get redundant heartbeat injections. A
120
+ * never-delivered seat (null) always fires.
121
+ */
122
+ export function shouldFireHeartbeat(lastDeliveredAt, now, cadenceMs) {
123
+ if (lastDeliveredAt === null)
124
+ return true;
125
+ return now - lastDeliveredAt >= cadenceMs;
126
+ }
127
+ //# sourceMappingURL=codex-wake-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-wake-resolve.js","sourceRoot":"","sources":["../src/codex-wake-resolve.ts"],"names":[],"mappings":"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"}
@@ -64,8 +64,8 @@ export declare function removeUserPromptSubmitHook(): boolean;
64
64
  * Detect whether the borg MCP server is already registered in the Claude
65
65
  * Code CLI config (`~/.claude.json` `mcpServers.borg`).
66
66
  *
67
- * Per gh#79: when a user re-runs `borg setup` to refresh OAuth (the
68
- * canonical re-run reason), the setup wizard's "Add borg to Claude Code?"
67
+ * Per gh#79: when a user re-runs `borg setup` (the canonical re-run
68
+ * reason), the setup wizard's "Add borg to Claude Code?"
69
69
  * prompt is redundant — the answer is deterministic ("already
70
70
  * configured"). This detect lets the wizard silently skip Step 1 entirely
71
71
  * when borg is present. Per the dispatch's Queen-implicit anti-scope,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-utils.d.ts","sourceRoot":"","sources":["../src/config-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8EH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,gEAAgE;AAChE,wBAAgB,mCAAmC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEhF;AAoQD;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,OAAO,CAgBtD;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAgB1D;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAkChD;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CA2BjD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAkCpD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,GAAE,MAA2B,GACtC,OAAO,CAaT;AAED,wBAAgB,0BAA0B,CACxC,UAAU,GAAE,MAA0B,GACrC,OAAO,CAqBT;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAyBnC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CA8BxC;AAsCD,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,cAAc,GAAG,kBAAkB,GAAG,MAAM,EACvD,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAyB,GACnC,OAAO,CAiBT;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,GAAE,MAAyB,GAAG,OAAO,CAE/F;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CAAC,SAAS,GAAE,MAAyB,GAAG,OAAO,CAEnG;AAID;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,GAAE,MAA6B,GACxC,OAAO,CAaT;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAgB3C"}