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
@@ -1,2 +1,432 @@
1
- import{getActiveCube as x,getCodexWakeTarget as C,setCodexWakeTarget as R}from"./cubes.js";import{CodexAppServerClient as S}from"./codex-app-server.js";import{checkCodexBridgeHealthy as K}from"./codex-remote.js";import{recordEventReceipt as W}from"./health-beat.js";import{BORG_CODEX_REMOTE_WAKE_ENV as O,resolveSessionAgentKind as M}from"./agent-runtime.js";import{codexAppServerSocketFromEnv as B,pickFreshThread as F,wakeTargetChanged as N,wakeRetryBackoffMs as H,wakeRetryExpired as j,WAKE_RETRY_MAX_ATTEMPTS as L,shouldFireHeartbeat as X}from"./codex-wake-resolve.js";const q="New Borg cube-log activity arrived.";function se(e){return`New Borg cube-log activity arrived:
2
- ${e}`}const _="Borg cube activity arrived while you were busy. Wake triage: run `borg_read-log unread_only=true` and DRAIN \u2014 repeat until the returned page is under the limit and behind_by is 0 \u2014 so no entries are skipped. Then handle actionable entries; if none, resume the prior interrupted work.";function D(e=process.env){return e[O]==="1"}import{resolveSessionAgentKind as ke}from"./agent-runtime.js";function V(e=process.env){return D(e)?{enabled:!0}:{enabled:!1}}async function le(e,t={}){try{const r=await(t.getCodexWakeTarget??C)(e.cubeId,e.droneId);return r?(t.checkBridge??K)(r.socketPath):!1}catch{return null}}let f=!1;const h=[],u=new Set,w=[],$=100;let g=!1,k=null;function ue(){return k}function T(e){k=(e.now??Date.now)()}let v=!1,y=!1;function p(){return y?!1:(y=!0,!0)}function A(){y=!1}function Y(e){return e?.code==="ENOENT"}function G(e){return new Promise(t=>setTimeout(t,e))}function m(e,t){return t.createClient?t.createClient(e):new S(e)}async function b(e,t){const n=B(t.env??process.env);if(n){const o=m(n,t);await o.connect();try{const a=await o.loadedThreadIds(),i=[];for(const l of a){const s=await o.readThread(l);s&&i.push({id:s.id,cwd:s.cwd,updatedAt:s.updatedAt})}const c=F(i,{cwd:(t.cwd??(()=>process.cwd()))()});return c?(await Q(e,{socketPath:n,threadId:c},t),{socketPath:n,threadId:c}):null}finally{o.close()}}const r=await(t.getCodexWakeTarget??C)(e.cubeId,e.droneId);return r?{socketPath:r.socketPath,threadId:r.threadId}:null}async function Q(e,t,n){try{const r=n.getCodexWakeTarget??C,o=n.setCodexWakeTarget??R,a=await r(e.cubeId,e.droneId),i=a?{socketPath:a.socketPath,threadId:a.threadId}:null;N(i,t)&&await o(e.cubeId,e.droneId,t)}catch{}}function de(e=q,t=process.env,n={}){V(t).enabled&&(h.push({reason:e,deps:n}),!f&&(f=!0,U().finally(()=>{f=!1})))}async function U(){for(;h.length>0;){const e=h.shift();await z(e.reason,e.deps)}}async function z(e,t){if(!p()){E(t);return}try{const n=await(t.getActiveCube??x)();if(!n)return;const r=await b(n,t);if(!r)return;const{socketPath:o,threadId:a}=r,i=`${a}\0${e}`;if(u.has(i))return;const c=m(o,t);await c.connect();try{if((await c.readThread(a))?.status?.type==="active"){E(t);return}await c.startTurn(a,e),W(),ee(i),T(t)}finally{c.close()}}catch{E(t)}finally{A()}}function E(e){g||(g=!0,J(e).finally(()=>{g=!1}))}async function J(e){const t=e.sleep??G,n=e.now??Date.now,r=e.jitter??(()=>Math.random()*500),o=e.maxAttempts??L,a=n();let i=0;for(;!j(a,n())&&i<o;)if(await t(H(i,r())),i++,!!p())try{const c=await(e.getActiveCube??x)();if(!c)continue;const l=await b(c,e);if(!l)continue;const{socketPath:s,threadId:I}=l,d=m(s,e);await d.connect();try{if((await d.readThread(I))?.status?.type==="active")continue;await d.startTurn(I,_),W(),T(e);return}finally{d.close()}}catch{}finally{A()}}const P=20*6e4;async function Z(e={},t=P){if(v)return;const n=(e.now??Date.now)();if(X(k,n,t)&&!(e.isStreamOwner&&!e.isStreamOwner())&&p()){v=!0;try{const r=await(e.getActiveCube??x)();if(!r)return;const o=await b(r,e);if(!o)return;const a=m(o.socketPath,e);await a.connect();try{if((await a.readThread(o.threadId))?.status?.type==="active")return;await a.startTurn(o.threadId,_),T(e)}finally{a.close()}}catch(r){Y(r)&&e.onAppServerSocketDead?.()}finally{v=!1,A()}}}function fe(e={}){const t=e.agentKind??M(),n=e.remoteWakeEnabled??D();if(t!=="codex"||!n)return null;const r=e.intervalMs??P,o=e.tick??(()=>{Z()}),a=setInterval(o,r);return a.unref?.(),a}function he(){f=!1,h.length=0,u.clear(),w.length=0,g=!1,k=null,v=!1,y=!1}function ee(e){if(!u.has(e))for(u.add(e),w.push(e);w.length>$;){const t=w.shift();t&&u.delete(t)}}export{_ as CODEX_CATCHUP_PROMPT,P as CODEX_HEARTBEAT_CADENCE_MS,q as CODEX_WAKE_PROMPT,Z as fireCodexHeartbeatTick,se as formatCodexWakePrompt,ue as getLastDeliveredAt,D as isCodexRemoteWakeEnabled,le as probeCodexBridgeArmed,he as resetCodexWakeForTests,V as resolveCodexWakeTarget,ke as resolveSessionAgentKind,fe as startCodexHeartbeat,de as wakeCodexViaAppServer};
1
+ import { getActiveCube, getCodexWakeTarget, setCodexWakeTarget } from './cubes.js';
2
+ import { CodexAppServerClient } from './codex-app-server.js';
3
+ import { checkCodexBridgeHealthy } from './codex-remote.js';
4
+ import { BORG_CODEX_REMOTE_WAKE_ENV, resolveSessionAgentKind, } from './agent-runtime.js';
5
+ import { codexAppServerSocketFromEnv, pickFreshThread, wakeTargetChanged, wakeRetryBackoffMs, wakeRetryExpired, WAKE_RETRY_MAX_ATTEMPTS, shouldFireHeartbeat, } from './codex-wake-resolve.js';
6
+ export const CODEX_WAKE_PROMPT = 'New Borg cube-log activity arrived.';
7
+ export function formatCodexWakePrompt(inboxLine) {
8
+ return `New Borg cube-log activity arrived:\n${inboxLine}`;
9
+ }
10
+ // gh#708: STATIC catch-up/drain prompt (zero interpolation — no token/secret/PII/
11
+ // cube-content; the entry bodies are fetched by codex itself via the
12
+ // grant/visibility-gated borg_read-log, never injected into the wake). Delivered
13
+ // once after a wake is deferred (mid-turn thread) or retried (transient miss), to
14
+ // fire the already-shipped drain so no entry is skipped. gh#857 WI-2 reuses it as
15
+ // the periodic heartbeat prompt.
16
+ export const CODEX_CATCHUP_PROMPT = 'Borg cube activity arrived while you were busy. Wake triage: run `borg_read-log unread_only=true` and DRAIN — repeat until the returned page is under the limit and behind_by is 0 — so no entries are skipped. Then handle actionable entries; if none, resume the prior interrupted work.';
17
+ export function isCodexRemoteWakeEnabled(env = process.env) {
18
+ return env[BORG_CODEX_REMOTE_WAKE_ENV] === '1';
19
+ }
20
+ export { resolveSessionAgentKind } from './agent-runtime.js';
21
+ export function resolveCodexWakeTarget(env = process.env) {
22
+ if (!isCodexRemoteWakeEnabled(env)) {
23
+ return { enabled: false };
24
+ }
25
+ return { enabled: true };
26
+ }
27
+ /**
28
+ * gh#633: resolve a codex drone's transport-agnostic "wake-path-armed" signal
29
+ * from its OWN runtime wake mechanism — the app-server bridge's process
30
+ * liveness, the codex analogue of the claude tail-F Monitor health. Fed into
31
+ * the health beat so the HOP-2 wake-path-deaf classifier reads a
32
+ * transport-agnostic armed signal instead of the claude-shaped monitor_armed
33
+ * (which is false-by-design for codex and falsely flagged them, gh#633).
34
+ *
35
+ * Tri-state (boolean|null; caller maps null→armed for false-deaf-avoidance):
36
+ * - false ONLY on a positively-dead bridge: no wake target registered (the
37
+ * bridge cannot deliver wakes), OR the app-server pid is dead.
38
+ * - true when the wake target resolves AND the app-server pid is alive.
39
+ * - null when the bridge health is indeterminate (target read or pid check
40
+ * could not resolve) → armed (don't false-flag on uncertainty).
41
+ */
42
+ export async function probeCodexBridgeArmed(active, deps = {}) {
43
+ try {
44
+ const resolve = deps.getCodexWakeTarget ?? getCodexWakeTarget;
45
+ const target = await resolve(active.cubeId, active.droneId);
46
+ // No registered wake target → the bridge cannot deliver a wake → not armed.
47
+ if (!target)
48
+ return false;
49
+ const check = deps.checkBridge ?? checkCodexBridgeHealthy;
50
+ return check(target.socketPath);
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ let wakeInFlight = false;
57
+ const pendingWakeRequests = [];
58
+ const deliveredWakeKeys = new Set();
59
+ const deliveredWakeKeyOrder = [];
60
+ const DELIVERED_WAKE_KEY_CAP = 100;
61
+ // gh#708/#857: a single in-flight retry-drain loop coalesces ALL wakes deferred
62
+ // (mid-turn thread) or missed (transient error) into ONE retried-until-delivered
63
+ // drain. The coalesce gate means a burst collapses to one poller, not N.
64
+ let retryDrainInFlight = false;
65
+ // gh#857 WI-2: timestamp of the last SUCCESSFUL wake delivery (per-entry OR
66
+ // retry-drain OR heartbeat). The heartbeat reads this (shouldFireHeartbeat) to
67
+ // skip when a delivery already landed inside the cadence window. Module-scoped
68
+ // because the wake path and the heartbeat run in the same MCP-client child.
69
+ let lastDeliveredAt = null;
70
+ /** gh#857 WI-2: last successful wake delivery time (for the heartbeat gate). */
71
+ export function getLastDeliveredAt() {
72
+ return lastDeliveredAt;
73
+ }
74
+ function markDelivered(deps) {
75
+ lastDeliveredAt = (deps.now ?? Date.now)();
76
+ }
77
+ // gh#857 WI-2: a single-in-flight guard for the heartbeat tick (mirrors
78
+ // wakeInFlight + retryDrainInFlight). Without it, a tick that stalls in IO past
79
+ // the next interval could let a second tick read the stale (pre-markDelivered)
80
+ // lastDeliveredAt, pass its gate, and double-inject the drain — the exact
81
+ // double-fire the design forbids.
82
+ let heartbeatInFlight = false;
83
+ // gh#861 finding 1: a SINGLE module-scoped mutex serializing the resolve+inject
84
+ // critical section ACROSS all three injecting paths (per-entry wake, retry-drain,
85
+ // heartbeat tick). The per-path flags above (wakeInFlight / retryDrainInFlight /
86
+ // heartbeatInFlight) each serialize their OWN path but NOT across paths — so a
87
+ // per-entry WAKE prompt and a heartbeat/retry DRAIN prompt could land in the same
88
+ // codex thread concurrently (double-inject collision). This lock closes that
89
+ // cross-path race: a path that cannot acquire it backs off via its own retry
90
+ // mechanism (heartbeat: skip tick; retry-drain: continue loop; per-entry: schedule
91
+ // a retry-drain so the entry is not lost).
92
+ let injectInFlight = false;
93
+ function tryAcquireInjectLock() {
94
+ if (injectInFlight)
95
+ return false;
96
+ injectInFlight = true;
97
+ return true;
98
+ }
99
+ function releaseInjectLock() {
100
+ injectInFlight = false;
101
+ }
102
+ /**
103
+ * gh#861 finding 3: a positively-dead codex app-server socket. ENOENT means the
104
+ * socket file is gone (the app-server never created it / unlinked it on exit) —
105
+ * the wake path cannot deliver, so the heartbeat timer should be torn down. Kept
106
+ * narrow (ENOENT only): a transient ECONNREFUSED during a momentary blip must NOT
107
+ * tear the backstop down.
108
+ */
109
+ function isAppServerDeadError(err) {
110
+ return err?.code === 'ENOENT';
111
+ }
112
+ function defaultSleep(ms) {
113
+ return new Promise((resolve) => setTimeout(resolve, ms));
114
+ }
115
+ /**
116
+ * gh#855: FRESH wake-target resolution. Prefer THIS drone's live app-server
117
+ * socket (pinned into the child's env at spawn) and re-resolve the loaded thread
118
+ * NOW (loadedThreadIds is re-runnable) — so a missed/stale launch probe or a
119
+ * thread change can never cause permanent deafness. Self-heals the file cache
120
+ * (write-only-on-change) so other readers (probeCodexBridgeArmed / health-beat)
121
+ * stay current. Falls back to the launch-recorded file when the env socket is
122
+ * absent (un-upgraded launch) — no regression. Returns the resolved target, or
123
+ * null (caller skips this wake; the next one retries). Does NOT keep a
124
+ * connection open — the env path opens a short-lived probe client to re-resolve
125
+ * the thread, then closes it, so the caller can dedup BEFORE opening the wake
126
+ * connection (no reconnect on an already-delivered wake).
127
+ */
128
+ function makeCodexClient(sock, deps) {
129
+ return deps.createClient ? deps.createClient(sock) : new CodexAppServerClient(sock);
130
+ }
131
+ async function resolveFreshCodexWakeTarget(active, deps) {
132
+ const envSocket = codexAppServerSocketFromEnv(deps.env ?? process.env);
133
+ if (envSocket) {
134
+ const probe = makeCodexClient(envSocket, deps);
135
+ await probe.connect();
136
+ try {
137
+ const ids = await probe.loadedThreadIds();
138
+ const summaries = [];
139
+ for (const id of ids) {
140
+ const t = await probe.readThread(id);
141
+ if (t)
142
+ summaries.push({ id: t.id, cwd: t.cwd, updatedAt: t.updatedAt });
143
+ }
144
+ const threadId = pickFreshThread(summaries, { cwd: (deps.cwd ?? (() => process.cwd()))() });
145
+ if (!threadId)
146
+ return null; // no loaded thread yet — next wake retries (no permanent fail)
147
+ await maybePersistWakeTarget(active, { socketPath: envSocket, threadId }, deps);
148
+ return { socketPath: envSocket, threadId };
149
+ }
150
+ finally {
151
+ probe.close();
152
+ }
153
+ }
154
+ // Fallback: the launch-recorded file (un-upgraded launch / env absent) — no
155
+ // connect needed to resolve, so the caller dedups before opening any socket.
156
+ const target = await (deps.getCodexWakeTarget ?? getCodexWakeTarget)(active.cubeId, active.droneId);
157
+ if (!target)
158
+ return null;
159
+ return { socketPath: target.socketPath, threadId: target.threadId };
160
+ }
161
+ /** Self-healing cache write — only when the resolved target actually changed. */
162
+ async function maybePersistWakeTarget(active, fresh, deps) {
163
+ try {
164
+ const get = deps.getCodexWakeTarget ?? getCodexWakeTarget;
165
+ const set = deps.setCodexWakeTarget ?? setCodexWakeTarget;
166
+ const existing = await get(active.cubeId, active.droneId);
167
+ const prev = existing ? { socketPath: existing.socketPath, threadId: existing.threadId } : null;
168
+ if (wakeTargetChanged(prev, fresh)) {
169
+ await set(active.cubeId, active.droneId, fresh);
170
+ }
171
+ }
172
+ catch {
173
+ // best-effort cache write; never break the wake path
174
+ }
175
+ }
176
+ export function wakeCodexViaAppServer(reason = CODEX_WAKE_PROMPT, env = process.env, deps = {}) {
177
+ const target = resolveCodexWakeTarget(env);
178
+ if (!target.enabled)
179
+ return;
180
+ pendingWakeRequests.push({ reason, deps });
181
+ if (wakeInFlight)
182
+ return;
183
+ wakeInFlight = true;
184
+ void drainCodexWakeQueue().finally(() => {
185
+ wakeInFlight = false;
186
+ });
187
+ }
188
+ async function drainCodexWakeQueue() {
189
+ while (pendingWakeRequests.length > 0) {
190
+ const request = pendingWakeRequests.shift();
191
+ await wakeCodexTargeted(request.reason, request.deps);
192
+ }
193
+ }
194
+ async function wakeCodexTargeted(reason, deps) {
195
+ // gh#861 finding 1: another path (heartbeat/retry-drain) is mid-inject into the
196
+ // same thread — defer to the retry-drain so this entry isn't double-injected nor
197
+ // lost (the drain re-syncs the whole burst via the server read-cursor).
198
+ if (!tryAcquireInjectLock()) {
199
+ scheduleRetryDrain(deps);
200
+ return;
201
+ }
202
+ try {
203
+ const active = await (deps.getActiveCube ?? getActiveCube)();
204
+ if (!active)
205
+ return;
206
+ // gh#855: resolve FRESH (live env socket + re-resolved thread), falling back
207
+ // to the launch-recorded file only when the env socket is absent.
208
+ const resolved = await resolveFreshCodexWakeTarget(active, deps);
209
+ if (!resolved)
210
+ return;
211
+ const { socketPath, threadId } = resolved;
212
+ const wakeKey = `${threadId}\0${reason}`;
213
+ if (deliveredWakeKeys.has(wakeKey))
214
+ return; // dedup before opening the wake socket
215
+ const client = makeCodexClient(socketPath, deps);
216
+ await client.connect();
217
+ try {
218
+ const thread = await client.readThread(threadId);
219
+ if (thread?.status?.type === 'active') {
220
+ // gh#708/#857: the thread is mid-turn — this per-entry wake can't land
221
+ // now. Schedule the retry-drain (coalesced, retried-until-delivered) so
222
+ // the burst's entries are drained once the thread goes idle; codex has no
223
+ // on-disk tail fallback like Claude's borg-inbox-monitor.
224
+ scheduleRetryDrain(deps);
225
+ return;
226
+ }
227
+ await client.startTurn(threadId, reason);
228
+ rememberDeliveredWake(wakeKey);
229
+ markDelivered(deps);
230
+ }
231
+ finally {
232
+ client.close();
233
+ }
234
+ }
235
+ catch {
236
+ // gh#857: a transient connect/read/startTurn failure must NOT be silently
237
+ // swallowed (the old best-effort drop let a single blip lose an entry).
238
+ // Schedule the retry-drain so the wake is retried-until-delivered; the SSE
239
+ // stream is never broken (this is fire-and-forget).
240
+ scheduleRetryDrain(deps);
241
+ }
242
+ finally {
243
+ releaseInjectLock();
244
+ }
245
+ }
246
+ /**
247
+ * gh#708/#857 WI-1: schedule a single coalesced retry-drain. Multiple wakes
248
+ * deferred (mid-turn) or missed (transient) collapse into ONE loop
249
+ * (retryDrainInFlight gate). The loop retries — with exponential backoff
250
+ * (wakeRetryBackoffMs) — until the thread is reachable+idle and the
251
+ * CODEX_CATCHUP_PROMPT drain is delivered (server read-cursor then drains ALL
252
+ * unread, so one drain covers the whole burst). Durable: unlike the old
253
+ * 15-min-give-up catch-up poller, it retries until a generous age cap
254
+ * (wakeRetryExpired); the gh#857 WI-2 heartbeat is the backstop beyond that.
255
+ * Never throws into the SSE path (fire-and-forget).
256
+ */
257
+ function scheduleRetryDrain(deps) {
258
+ if (retryDrainInFlight)
259
+ return; // coalesce: one loop covers all deferred/missed wakes
260
+ retryDrainInFlight = true;
261
+ void runRetryDrainLoop(deps).finally(() => {
262
+ retryDrainInFlight = false;
263
+ });
264
+ }
265
+ async function runRetryDrainLoop(deps) {
266
+ const sleep = deps.sleep ?? defaultSleep;
267
+ const now = deps.now ?? Date.now;
268
+ const jitter = deps.jitter ?? (() => Math.random() * 500);
269
+ const maxAttempts = deps.maxAttempts ?? WAKE_RETRY_MAX_ATTEMPTS;
270
+ const startedAt = now();
271
+ let attempts = 0;
272
+ // Terminate on the time-based age cap OR a hard iteration ceiling (defensive
273
+ // belt: a non-advancing clock would make the time-only guard hot-spin).
274
+ while (!wakeRetryExpired(startedAt, now()) && attempts < maxAttempts) {
275
+ await sleep(wakeRetryBackoffMs(attempts, jitter()));
276
+ attempts++;
277
+ // gh#861 finding 1: another path (heartbeat/per-entry wake) holds the inject
278
+ // lock — back off and retry rather than double-inject into the same thread.
279
+ if (!tryAcquireInjectLock())
280
+ continue;
281
+ try {
282
+ const active = await (deps.getActiveCube ?? getActiveCube)();
283
+ if (!active)
284
+ continue; // no active cube yet → keep retrying (until age cap)
285
+ // gh#855: same FRESH resolution as the per-entry wake, so a stale launch
286
+ // probe can't defeat the retry-drain either.
287
+ const resolved = await resolveFreshCodexWakeTarget(active, deps);
288
+ if (!resolved)
289
+ continue; // thread not loaded yet → retry (age-capped)
290
+ const { socketPath, threadId } = resolved;
291
+ const client = makeCodexClient(socketPath, deps);
292
+ await client.connect();
293
+ try {
294
+ const thread = await client.readThread(threadId);
295
+ if (thread?.status?.type === 'active') {
296
+ continue; // re-defer: still mid-turn (backoff before next poll)
297
+ }
298
+ await client.startTurn(threadId, CODEX_CATCHUP_PROMPT);
299
+ markDelivered(deps);
300
+ return; // drain delivered → server read-cursor drains all unread → done
301
+ }
302
+ finally {
303
+ client.close();
304
+ }
305
+ }
306
+ catch {
307
+ // transient socket/read error must not abort the loop — keep retrying with
308
+ // backoff until reachable+idle or the age cap; never throws into SSE.
309
+ }
310
+ finally {
311
+ releaseInjectLock();
312
+ }
313
+ }
314
+ // aged out: the gh#857 WI-2 periodic heartbeat is the ultimate backstop.
315
+ }
316
+ /**
317
+ * gh#857 WI-2: codex /loop-equivalent heartbeat cadence. Codex retains this
318
+ * independent 20-minute drain because it has no Claude-style per-entry inbox
319
+ * Monitor. Claude recovery is adaptive: 3h ±30m while the Monitor is healthy
320
+ * or indeterminate, and 15m ±3m only while it is explicitly broken.
321
+ */
322
+ export const CODEX_HEARTBEAT_CADENCE_MS = 20 * 60_000;
323
+ /**
324
+ * gh#857 WI-2: one tick of the codex /loop-equivalent heartbeat — a periodic,
325
+ * independent re-engagement that injects a borg_read-log (unread_only=true) DRAIN turn so an
326
+ * idle codex drone re-syncs even if every per-entry wake was missed. SKIPS when a
327
+ * delivery (per-entry wake, retry-drain, or a prior heartbeat) already landed
328
+ * within the cadence window (shouldFireHeartbeat), so an active cube with flowing
329
+ * wakes never gets a redundant injection. Unlike the per-entry path it does NOT
330
+ * consult deliveredWakeKeys — the cadence gate is the throttle, and the static
331
+ * drain prompt is intentionally re-delivered each idle window. Best-effort: a
332
+ * mid-turn thread / transient error / unresolved target just skips this tick (the
333
+ * next tick retries). Never throws.
334
+ */
335
+ export async function fireCodexHeartbeatTick(deps = {}, cadenceMs = CODEX_HEARTBEAT_CADENCE_MS) {
336
+ if (heartbeatInFlight)
337
+ return; // a prior tick's IO is still running → no overlap
338
+ const now = (deps.now ?? Date.now)();
339
+ if (!shouldFireHeartbeat(lastDeliveredAt, now, cadenceMs))
340
+ return; // a wake landed recently
341
+ // gh#861 finding 2: a lease-LOSING duplicate child must not tick/inject — mirror
342
+ // the per-entry path, which only fires inside an SSE session holding the stream
343
+ // lease. When the gate is provided and we don't own the lease, skip this tick.
344
+ if (deps.isStreamOwner && !deps.isStreamOwner())
345
+ return;
346
+ // gh#861 finding 1: another path is mid-inject into the thread → skip this tick
347
+ // (next tick retries) rather than collide a DRAIN prompt with an in-flight wake.
348
+ if (!tryAcquireInjectLock())
349
+ return;
350
+ // Set BEFORE the first await — the check+gate+set above are synchronous, so a
351
+ // concurrent tick can't interleave before the flag is set (single-threaded).
352
+ heartbeatInFlight = true;
353
+ try {
354
+ const active = await (deps.getActiveCube ?? getActiveCube)();
355
+ if (!active)
356
+ return;
357
+ const resolved = await resolveFreshCodexWakeTarget(active, deps);
358
+ if (!resolved)
359
+ return; // thread not loaded yet → next tick retries
360
+ const client = makeCodexClient(resolved.socketPath, deps);
361
+ await client.connect();
362
+ try {
363
+ const thread = await client.readThread(resolved.threadId);
364
+ if (thread?.status?.type === 'active')
365
+ return; // mid-turn → skip; next tick retries
366
+ await client.startTurn(resolved.threadId, CODEX_CATCHUP_PROMPT);
367
+ // markDelivered updates local heartbeat-gating state only.
368
+ markDelivered(deps);
369
+ }
370
+ finally {
371
+ client.close();
372
+ }
373
+ }
374
+ catch (err) {
375
+ // gh#861 finding 3: a positively-dead app-server socket (ENOENT) → the wake
376
+ // path is gone; signal teardown so the timer stops ticking against a dead
377
+ // socket (re-armed when an active cube returns). Other (transient) errors are
378
+ // best-effort skips — never break the SSE stream; next tick retries.
379
+ if (isAppServerDeadError(err))
380
+ deps.onAppServerSocketDead?.();
381
+ }
382
+ finally {
383
+ heartbeatInFlight = false;
384
+ releaseInjectLock();
385
+ }
386
+ }
387
+ /**
388
+ * gh#857 WI-2: start the codex /loop-equivalent heartbeat — a setInterval firing
389
+ * fireCodexHeartbeatTick every cadence. CODEX-ONLY: claude wakes via the tail-F
390
+ * inbox Monitor + /loop ScheduleWakeup and has NO app-server socket to inject
391
+ * into, so the heartbeat is intrinsically a codex mechanism. The gate reads
392
+ * agentKind and remote-wake capability LOCALLY from this child's own env,
393
+ * never a mutable/server-recorded field, so a mislabel can't silently defeat
394
+ * the backstop (gh#633 lesson). Agent CLI identity and remote transport are
395
+ * separate: a Codex CLI without a live remote transport has no app-server
396
+ * heartbeat to run. The timer is unref'd so it never keeps the process alive.
397
+ * Returns the timer, or null when this is not a remotely-wakeable Codex
398
+ * session. Injectable for tests.
399
+ */
400
+ export function startCodexHeartbeat(opts = {}) {
401
+ const agentKind = opts.agentKind ?? resolveSessionAgentKind();
402
+ const remoteWakeEnabled = opts.remoteWakeEnabled ?? isCodexRemoteWakeEnabled();
403
+ if (agentKind !== 'codex' || !remoteWakeEnabled)
404
+ return null;
405
+ const intervalMs = opts.intervalMs ?? CODEX_HEARTBEAT_CADENCE_MS;
406
+ const tick = opts.tick ?? (() => void fireCodexHeartbeatTick());
407
+ const timer = setInterval(tick, intervalMs);
408
+ timer.unref?.();
409
+ return timer;
410
+ }
411
+ export function resetCodexWakeForTests() {
412
+ wakeInFlight = false;
413
+ pendingWakeRequests.length = 0;
414
+ deliveredWakeKeys.clear();
415
+ deliveredWakeKeyOrder.length = 0;
416
+ retryDrainInFlight = false;
417
+ lastDeliveredAt = null;
418
+ heartbeatInFlight = false;
419
+ injectInFlight = false;
420
+ }
421
+ function rememberDeliveredWake(key) {
422
+ if (deliveredWakeKeys.has(key))
423
+ return;
424
+ deliveredWakeKeys.add(key);
425
+ deliveredWakeKeyOrder.push(key);
426
+ while (deliveredWakeKeyOrder.length > DELIVERED_WAKE_KEY_CAP) {
427
+ const oldKey = deliveredWakeKeyOrder.shift();
428
+ if (oldKey)
429
+ deliveredWakeKeys.delete(oldKey);
430
+ }
431
+ }
432
+ //# sourceMappingURL=codex-app-wake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-wake.js","sourceRoot":"","sources":["../src/codex-app-wake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-launch.d.ts","sourceRoot":"","sources":["../src/codex-launch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAC/B,MAAM,CAWR;AAED,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,EAAE,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAC7C,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,qBAAqB,EAAE,CAAC,OAAO,EAAE;QAC/B,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;KACtB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,GAAG,EAAE,OAAO,CAAC;IACb,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,MAAM,CAgCT;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAMtE;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAKzE;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChB"}
@@ -1,2 +1,102 @@
1
- import{wakePathArming as c}from"./regen-format.js";function i(e,t,r){return e==="claude"&&t?c("claude",t,r)+`
2
- Keep this Monitor armed for the whole session \u2014 NEVER TaskStop it (the generic /loop "TaskStop any Monitor you armed" step does NOT apply to the cube inbox Monitor; it targets throwaway loop-scratch watches only). The sole exception is a confirmed terminal eviction (410 DRONE_EVICTED). `:""}function d(e){const t=e.codexWakeNonce?`Wake target nonce: ${e.codexWakeNonce}. `:"",r=e.codexWakePathClause??"Codex Borg wakeups use remote-control when available; if no wake arrives, run borg_regen manually when returning to the session.",a="OpenCode wakes: the inbox Monitor is not available yet for OpenCode; check activity by calling borg_read-log periodically.",o=e.cli==="claude"?"/loop ":"",n=e.cli==="claude"?e.monitorClause:e.cli==="codex"?r:a;return`${o}Call borg_regen and follow the playbook in its response. `+t+'Note: at session start the borg MCP server is still spinning up in parallel \u2014 if a system reminder claims "MCP server disconnected" or the borg tools are not yet registered, do NOT bail. Recover via `ToolSearch({query: "select:mcp__borg__borg_regen,mcp__borg__borg_log,Monitor", max_results: 3})` to load the bootstrap tools in one call, then call borg_regen. The server typically becomes available within a few seconds. '+n}function u(e){const t=e.indexOf("--remote");if(t<0)return null;const r=e[t+1];return r?.startsWith("unix://")?r.slice(7):null}function l(e){if(e[0]==="resume"&&e[1]&&!e[1].startsWith("-"))return e[1];const t=e.indexOf("--resume");return t>=0&&e[t+1]?e[t+1]:null}async function h(e){try{const t=e.passthroughArgs?l(e.passthroughArgs):null;if(t){await e.deps.setCodexWakeTarget(e.cubeId,e.droneId,{threadId:t,socketPath:e.socketPath});return}const r=Date.now()+15e3;for(;Date.now()<r;){const a=await e.deps.findLoadedCodexThread({socketPath:e.socketPath,cwd:e.cwd,previewIncludes:e.previewNeedle,updatedAfter:e.launchedAtSeconds-5});if(a){await e.deps.setCodexWakeTarget(e.cubeId,e.droneId,{threadId:a,socketPath:e.socketPath});return}await new Promise(o=>setTimeout(o,500))}}catch{}}export{d as buildAgentKickoffPrompt,i as buildKickoffWakePathClause,h as recordCodexWakeTarget,u as socketPathFromRemoteArgs,l as threadIdFromPassthroughArgs};
1
+ import { wakePathArming } from './regen-format.js';
2
+ /**
3
+ * The claude kickoff prompt's wake-path section (gh#929) — the SAME shared
4
+ * `wakePathArming` the SessionStart hook + /clear orientation use (one place,
5
+ * not three), plus a one-line NEVER-TaskStop safety reminder preserved from
6
+ * the pre-gh#929 monitorClause. Built by both launch call sites
7
+ * (claude.ts + assimilate-cmd.ts) and passed to `buildAgentKickoffPrompt` as
8
+ * `monitorClause`. Codex wakes via the app-server (no tail-Monitor / `/loop`
9
+ * to arm) → empty; no active cube (no inboxPath) → empty.
10
+ */
11
+ export function buildKickoffWakePathClause(agentKind, inboxPath, monitorStateRoot) {
12
+ if (agentKind === 'claude' && inboxPath) {
13
+ return (wakePathArming('claude', inboxPath, monitorStateRoot) +
14
+ '\nKeep this Monitor armed for the whole session — NEVER TaskStop it (the generic ' +
15
+ '/loop "TaskStop any Monitor you armed" step does NOT apply to the cube inbox Monitor; ' +
16
+ 'it targets throwaway loop-scratch watches only). The sole exception is a confirmed ' +
17
+ 'terminal eviction (410 DRONE_EVICTED). ');
18
+ }
19
+ return '';
20
+ }
21
+ export function buildAgentKickoffPrompt(options) {
22
+ // gh#929: compacted to the load-bearing launch essentials (lean/explicit/
23
+ // imperative, #914 treatment). STRIPPED: the read-log-triage paragraph (the
24
+ // playbook owns it post-#914) + the role-specific anti-passive-Standing
25
+ // clause (Coordinator/Queen-only; belongs in role-text, not injected for
26
+ // ALL). KEPT: core call + MCP-disconnect recovery + the wake-path arming
27
+ // (claude via the shared monitorClause = buildKickoffWakePathClause; codex
28
+ // via codexWakePathClause) + the claude/codex/opencode cli-branching.
29
+ const codexNonceClause = options.codexWakeNonce
30
+ ? `Wake target nonce: ${options.codexWakeNonce}. `
31
+ : '';
32
+ const codexWakePathClause = options.codexWakePathClause ??
33
+ `Codex Borg wakeups use remote-control when available; if no wake arrives, run borg_regen manually when returning to the session.`;
34
+ const opencodeWakePathClause = `OpenCode wakes: the inbox Monitor is not available yet for OpenCode; check activity by calling borg_read-log periodically.`;
35
+ const loopOrEmpty = options.cli === 'claude' ? '/loop ' : '';
36
+ const wakeClause = options.cli === 'claude'
37
+ ? options.monitorClause
38
+ : options.cli === 'codex'
39
+ ? codexWakePathClause
40
+ : opencodeWakePathClause;
41
+ return (`${loopOrEmpty}Call borg_regen and follow the playbook in its response. ` +
42
+ codexNonceClause +
43
+ `Note: at session start the borg MCP server is still spinning up in ` +
44
+ `parallel — if a system reminder claims "MCP server disconnected" or ` +
45
+ `the borg tools are not yet registered, do NOT bail. Recover via ` +
46
+ `\`ToolSearch({query: "select:mcp__borg__borg_regen,mcp__borg__borg_log,Monitor", max_results: 3})\` ` +
47
+ `to load the bootstrap tools in one call, then call borg_regen. ` +
48
+ `The server typically becomes available within a few seconds. ` +
49
+ wakeClause);
50
+ }
51
+ export function socketPathFromRemoteArgs(args) {
52
+ const index = args.indexOf('--remote');
53
+ if (index < 0)
54
+ return null;
55
+ const value = args[index + 1];
56
+ if (!value?.startsWith('unix://'))
57
+ return null;
58
+ return value.slice('unix://'.length);
59
+ }
60
+ export function threadIdFromPassthroughArgs(args) {
61
+ if (args[0] === 'resume' && args[1] && !args[1].startsWith('-'))
62
+ return args[1];
63
+ const resumeIndex = args.indexOf('--resume');
64
+ if (resumeIndex >= 0 && args[resumeIndex + 1])
65
+ return args[resumeIndex + 1];
66
+ return null;
67
+ }
68
+ export async function recordCodexWakeTarget(options) {
69
+ try {
70
+ const explicitThreadId = options.passthroughArgs
71
+ ? threadIdFromPassthroughArgs(options.passthroughArgs)
72
+ : null;
73
+ if (explicitThreadId) {
74
+ await options.deps.setCodexWakeTarget(options.cubeId, options.droneId, {
75
+ threadId: explicitThreadId,
76
+ socketPath: options.socketPath,
77
+ });
78
+ return;
79
+ }
80
+ const deadline = Date.now() + 15_000;
81
+ while (Date.now() < deadline) {
82
+ const threadId = await options.deps.findLoadedCodexThread({
83
+ socketPath: options.socketPath,
84
+ cwd: options.cwd,
85
+ previewIncludes: options.previewNeedle,
86
+ updatedAfter: options.launchedAtSeconds - 5,
87
+ });
88
+ if (threadId) {
89
+ await options.deps.setCodexWakeTarget(options.cubeId, options.droneId, {
90
+ threadId,
91
+ socketPath: options.socketPath,
92
+ });
93
+ return;
94
+ }
95
+ await new Promise((resolve) => setTimeout(resolve, 500));
96
+ }
97
+ }
98
+ catch {
99
+ // Best-effort mapping: launch still succeeds and manual regen remains available.
100
+ }
101
+ }
102
+ //# sourceMappingURL=codex-launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-launch.js","sourceRoot":"","sources":["../src/codex-launch.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,11 @@ export interface PrepareCodexRemoteDeps {
56
56
  }
57
57
  export declare const DEFAULT_CODEX_REMOTE_DIR: string;
58
58
  export declare function withCodexCwdArg(args: string[], cwd: string): string[];
59
+ /** Resolve the project directory Codex itself will use for this launch.
60
+ * Relative explicit paths are interpreted from the wrapper's current working
61
+ * directory, matching Codex's CLI path resolution. The final occurrence wins,
62
+ * matching clap's override behavior for repeated options. */
63
+ export declare function resolveCodexLaunchCwd(args: string[], fallbackCwd: string): string;
59
64
  export declare function defaultIsAlive(pid: number): boolean;
60
65
  /**
61
66
  * gh#633: process-liveness probe for the borg-owned codex app-server — the
@@ -108,7 +113,7 @@ export declare function prepareCodexRemoteLaunch(deps: PrepareCodexRemoteDeps):
108
113
  * claude.ts and assimilate-deps.ts so there's ONE wiring.
109
114
  *
110
115
  * The readiness probe uses Codex app-server RPCs ONLY (connect + thread/loaded/
111
- * list) — it never calls a borg /api/drone/* endpoint — so it can never advance
116
+ * list) — it never calls a Borg coordination endpoint — so it can never advance
112
117
  * last_seen/last_regen_at and mask a deaf Codex (the gh#46/gh#406 signal-truth
113
118
  * invariant; the app-server socket is the wake-DELIVERY wire, not a liveness
114
119
  * signal).
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-remote.d.ts","sourceRoot":"","sources":["../src/codex-remote.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,qBAAqB,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,kFAAkF;IAClF,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,UAAU,CAAC;IACnD,4FAA4F;IAC5F,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,6EAA6E;IAC7E,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACxB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACpC;AAED,eAAO,MAAM,wBAAwB,QAAwD,CAAC;AAyC9F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAGrE;AAED;;;6DAG6D;AAC7D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAyBjF;AAYD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,IAAI,GAAE;IACJ,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC,GACL,OAAO,GAAG,IAAI,CAahB;AAwDD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CA+F5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAC5C,sBAAsB,EACtB,gBAAgB,GAAG,YAAY,GAAG,OAAO,CAC1C,CAiGA"}