borgmcp 1.1.15 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/CONTRIBUTING.md +15 -0
  2. package/LICENSE +201 -33
  3. package/NOTICE +2 -0
  4. package/README.md +85 -36
  5. package/SECURITY.md +7 -0
  6. package/dist/agent-runtime.d.ts.map +1 -0
  7. package/dist/agent-runtime.js +63 -1
  8. package/dist/agent-runtime.js.map +1 -0
  9. package/dist/assimilate-cmd.d.ts +96 -17
  10. package/dist/assimilate-cmd.d.ts.map +1 -0
  11. package/dist/assimilate-cmd.js +1396 -48
  12. package/dist/assimilate-cmd.js.map +1 -0
  13. package/dist/assimilate-deps.d.ts.map +1 -0
  14. package/dist/assimilate-deps.js +384 -3
  15. package/dist/assimilate-deps.js.map +1 -0
  16. package/dist/assimilate-guard.d.ts +5 -7
  17. package/dist/assimilate-guard.d.ts.map +1 -0
  18. package/dist/assimilate-guard.js +60 -2
  19. package/dist/assimilate-guard.js.map +1 -0
  20. package/dist/assimilate-welcome.d.ts +1 -1
  21. package/dist/assimilate-welcome.d.ts.map +1 -0
  22. package/dist/assimilate-welcome.js +32 -2
  23. package/dist/assimilate-welcome.js.map +1 -0
  24. package/dist/auth-env.d.ts +7 -50
  25. package/dist/auth-env.d.ts.map +1 -0
  26. package/dist/auth-env.js +22 -1
  27. package/dist/auth-env.js.map +1 -0
  28. package/dist/backends/launch-all-pastelist.d.ts.map +1 -0
  29. package/dist/backends/launch-all-pastelist.js +11 -4
  30. package/dist/backends/launch-all-pastelist.js.map +1 -0
  31. package/dist/backends/launch-all-tmux.d.ts.map +1 -0
  32. package/dist/backends/launch-all-tmux.js +49 -1
  33. package/dist/backends/launch-all-tmux.js.map +1 -0
  34. package/dist/backends/launch-all-windows.d.ts.map +1 -0
  35. package/dist/backends/launch-all-windows.js +86 -12
  36. package/dist/backends/launch-all-windows.js.map +1 -0
  37. package/dist/bare-launch-menu.d.ts.map +1 -0
  38. package/dist/bare-launch-menu.js +83 -6
  39. package/dist/bare-launch-menu.js.map +1 -0
  40. package/dist/claude-launch-args.d.ts.map +1 -0
  41. package/dist/claude-launch-args.js +34 -1
  42. package/dist/claude-launch-args.js.map +1 -0
  43. package/dist/claude.d.ts.map +1 -0
  44. package/dist/claude.js +486 -14
  45. package/dist/claude.js.map +1 -0
  46. package/dist/cleanup-cmd.d.ts +5 -5
  47. package/dist/cleanup-cmd.d.ts.map +1 -0
  48. package/dist/cleanup-cmd.js +453 -14
  49. package/dist/cleanup-cmd.js.map +1 -0
  50. package/dist/clear-rewake-core.d.ts.map +1 -0
  51. package/dist/clear-rewake-core.js +23 -2
  52. package/dist/clear-rewake-core.js.map +1 -0
  53. package/dist/clear-rewake.d.ts.map +1 -0
  54. package/dist/clear-rewake.js +19 -1
  55. package/dist/clear-rewake.js.map +1 -0
  56. package/dist/cli-help.d.ts +5 -0
  57. package/dist/cli-help.d.ts.map +1 -0
  58. package/dist/cli-help.js +104 -56
  59. package/dist/cli-help.js.map +1 -0
  60. package/dist/cli-platform.d.ts.map +1 -0
  61. package/dist/cli-platform.js +106 -4
  62. package/dist/cli-platform.js.map +1 -0
  63. package/dist/cli-tool-approval.d.ts +84 -0
  64. package/dist/cli-tool-approval.d.ts.map +1 -0
  65. package/dist/cli-tool-approval.js +583 -0
  66. package/dist/cli-tool-approval.js.map +1 -0
  67. package/dist/codex-app-server.d.ts.map +1 -0
  68. package/dist/codex-app-server.js +228 -4
  69. package/dist/codex-app-server.js.map +1 -0
  70. package/dist/codex-app-wake.d.ts +9 -11
  71. package/dist/codex-app-wake.d.ts.map +1 -0
  72. package/dist/codex-app-wake.js +436 -2
  73. package/dist/codex-app-wake.js.map +1 -0
  74. package/dist/codex-launch.d.ts.map +1 -0
  75. package/dist/codex-launch.js +102 -2
  76. package/dist/codex-launch.js.map +1 -0
  77. package/dist/codex-remote.d.ts +6 -1
  78. package/dist/codex-remote.d.ts.map +1 -0
  79. package/dist/codex-remote.js +394 -1
  80. package/dist/codex-remote.js.map +1 -0
  81. package/dist/codex-wake-resolve.d.ts +4 -4
  82. package/dist/codex-wake-resolve.d.ts.map +1 -0
  83. package/dist/codex-wake-resolve.js +127 -1
  84. package/dist/codex-wake-resolve.js.map +1 -0
  85. package/dist/config-utils.d.ts +2 -2
  86. package/dist/config-utils.d.ts.map +1 -0
  87. package/dist/config-utils.js +766 -3
  88. package/dist/config-utils.js.map +1 -0
  89. package/dist/config.d.ts +98 -61
  90. package/dist/config.d.ts.map +1 -0
  91. package/dist/config.js +426 -1
  92. package/dist/config.js.map +1 -0
  93. package/dist/console-prefix.d.ts.map +1 -0
  94. package/dist/console-prefix.js +96 -1
  95. package/dist/console-prefix.js.map +1 -0
  96. package/dist/cube-name.d.ts.map +1 -0
  97. package/dist/cube-name.js +67 -1
  98. package/dist/cube-name.js.map +1 -0
  99. package/dist/cubes.d.ts +126 -18
  100. package/dist/cubes.d.ts.map +1 -0
  101. package/dist/cubes.js +412 -4
  102. package/dist/cubes.js.map +1 -0
  103. package/dist/debug.d.ts.map +1 -0
  104. package/dist/debug.js +71 -1
  105. package/dist/debug.js.map +1 -0
  106. package/dist/direct-log.d.ts.map +1 -0
  107. package/dist/direct-log.js +11 -1
  108. package/dist/direct-log.js.map +1 -0
  109. package/dist/docs-sections.d.ts +11 -10
  110. package/dist/docs-sections.d.ts.map +1 -0
  111. package/dist/docs-sections.js +113 -3
  112. package/dist/docs-sections.js.map +1 -0
  113. package/dist/drone-lifecycle.d.ts +5 -21
  114. package/dist/drone-lifecycle.d.ts.map +1 -0
  115. package/dist/drone-lifecycle.js +57 -8
  116. package/dist/drone-lifecycle.js.map +1 -0
  117. package/dist/drone-management.d.ts +29 -0
  118. package/dist/drone-management.d.ts.map +1 -0
  119. package/dist/drone-management.js +109 -0
  120. package/dist/drone-management.js.map +1 -0
  121. package/dist/ensure-mcp-config.d.ts.map +1 -0
  122. package/dist/ensure-mcp-config.js +36 -1
  123. package/dist/ensure-mcp-config.js.map +1 -0
  124. package/dist/evict-drone.d.ts +10 -2
  125. package/dist/evict-drone.d.ts.map +1 -0
  126. package/dist/evict-drone.js +60 -1
  127. package/dist/evict-drone.js.map +1 -0
  128. package/dist/gc-orphan-inboxes.d.ts.map +1 -0
  129. package/dist/gc-orphan-inboxes.js +177 -1
  130. package/dist/gc-orphan-inboxes.js.map +1 -0
  131. package/dist/inbox-monitor.d.ts +1 -1
  132. package/dist/inbox-monitor.d.ts.map +1 -0
  133. package/dist/inbox-monitor.js +856 -3
  134. package/dist/inbox-monitor.js.map +1 -0
  135. package/dist/index.d.ts +6 -4
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +1034 -37
  138. package/dist/index.js.map +1 -0
  139. package/dist/launch-all-cmd.d.ts.map +1 -0
  140. package/dist/launch-all-cmd.js +377 -37
  141. package/dist/launch-all-cmd.js.map +1 -0
  142. package/dist/launch-all-command.d.ts.map +1 -0
  143. package/dist/launch-all-command.js +24 -1
  144. package/dist/launch-all-command.js.map +1 -0
  145. package/dist/launch-all-deps.d.ts +3 -8
  146. package/dist/launch-all-deps.d.ts.map +1 -0
  147. package/dist/launch-all-deps.js +99 -1
  148. package/dist/launch-all-deps.js.map +1 -0
  149. package/dist/launch-all-discovery.d.ts +1 -0
  150. package/dist/launch-all-discovery.d.ts.map +1 -0
  151. package/dist/launch-all-discovery.js +90 -4
  152. package/dist/launch-all-discovery.js.map +1 -0
  153. package/dist/launch-all-locks.d.ts.map +1 -0
  154. package/dist/launch-all-locks.js +54 -1
  155. package/dist/launch-all-locks.js.map +1 -0
  156. package/dist/launch-gate.d.ts +2 -2
  157. package/dist/launch-gate.d.ts.map +1 -0
  158. package/dist/launch-gate.js +73 -1
  159. package/dist/launch-gate.js.map +1 -0
  160. package/dist/lifecycle-log-guard.d.ts.map +1 -0
  161. package/dist/lifecycle-log-guard.js +93 -2
  162. package/dist/lifecycle-log-guard.js.map +1 -0
  163. package/dist/list-roles-render.d.ts.map +1 -0
  164. package/dist/list-roles-render.js +40 -6
  165. package/dist/list-roles-render.js.map +1 -0
  166. package/dist/local-log-routing.d.ts +19 -0
  167. package/dist/local-log-routing.d.ts.map +1 -0
  168. package/dist/local-log-routing.js +67 -0
  169. package/dist/local-log-routing.js.map +1 -0
  170. package/dist/local-manage-tool-result.d.ts +8 -0
  171. package/dist/local-manage-tool-result.d.ts.map +1 -0
  172. package/dist/local-manage-tool-result.js +10 -0
  173. package/dist/local-manage-tool-result.js.map +1 -0
  174. package/dist/local-server-cursor.d.ts +34 -0
  175. package/dist/local-server-cursor.d.ts.map +1 -0
  176. package/dist/local-server-cursor.js +151 -0
  177. package/dist/local-server-cursor.js.map +1 -0
  178. package/dist/log-audit.d.ts.map +1 -0
  179. package/dist/log-audit.js +194 -3
  180. package/dist/log-audit.js.map +1 -0
  181. package/dist/log-stream.d.ts +35 -18
  182. package/dist/log-stream.d.ts.map +1 -0
  183. package/dist/log-stream.js +1270 -12
  184. package/dist/log-stream.js.map +1 -0
  185. package/dist/model-presets.d.ts.map +1 -0
  186. package/dist/model-presets.js +19 -1
  187. package/dist/model-presets.js.map +1 -0
  188. package/dist/name-validator.d.ts.map +1 -0
  189. package/dist/name-validator.js +22 -1
  190. package/dist/name-validator.js.map +1 -0
  191. package/dist/opencode-drone.d.ts.map +1 -0
  192. package/dist/opencode-drone.js +438 -4
  193. package/dist/opencode-drone.js.map +1 -0
  194. package/dist/opencode-plugin.d.ts +1 -1
  195. package/dist/opencode-plugin.d.ts.map +1 -0
  196. package/dist/opencode-plugin.js +29 -4
  197. package/dist/opencode-plugin.js.map +1 -0
  198. package/dist/parse-assimilate-args.d.ts +1 -1
  199. package/dist/parse-assimilate-args.d.ts.map +1 -0
  200. package/dist/parse-assimilate-args.js +125 -1
  201. package/dist/parse-assimilate-args.js.map +1 -0
  202. package/dist/parse-launch-all-args.d.ts.map +1 -0
  203. package/dist/parse-launch-all-args.js +70 -1
  204. package/dist/parse-launch-all-args.js.map +1 -0
  205. package/dist/postinstall-banner.d.ts.map +1 -0
  206. package/dist/postinstall-banner.js +27 -2
  207. package/dist/postinstall-banner.js.map +1 -0
  208. package/dist/postinstall.d.ts.map +1 -0
  209. package/dist/postinstall.js +32 -5
  210. package/dist/postinstall.js.map +1 -0
  211. package/dist/readiness-probe.d.ts.map +1 -0
  212. package/dist/readiness-probe.js +9 -1
  213. package/dist/readiness-probe.js.map +1 -0
  214. package/dist/regen-format.d.ts.map +1 -0
  215. package/dist/regen-format.js +545 -13
  216. package/dist/regen-format.js.map +1 -0
  217. package/dist/regen.d.ts.map +1 -0
  218. package/dist/regen.js +141 -5
  219. package/dist/regen.js.map +1 -0
  220. package/dist/remote-client.d.ts +88 -173
  221. package/dist/remote-client.d.ts.map +1 -0
  222. package/dist/remote-client.js +997 -1
  223. package/dist/remote-client.js.map +1 -0
  224. package/dist/reset-local-seat-cmd.d.ts +50 -0
  225. package/dist/reset-local-seat-cmd.d.ts.map +1 -0
  226. package/dist/reset-local-seat-cmd.js +169 -0
  227. package/dist/reset-local-seat-cmd.js.map +1 -0
  228. package/dist/role-match.d.ts.map +1 -0
  229. package/dist/role-match.js +23 -1
  230. package/dist/role-match.js.map +1 -0
  231. package/dist/role-resolver.d.ts.map +1 -0
  232. package/dist/role-resolver.js +60 -1
  233. package/dist/role-resolver.js.map +1 -0
  234. package/dist/roster-render.d.ts.map +1 -0
  235. package/dist/roster-render.js +121 -3
  236. package/dist/roster-render.js.map +1 -0
  237. package/dist/seat-probe.d.ts +32 -13
  238. package/dist/seat-probe.d.ts.map +1 -0
  239. package/dist/seat-probe.js +78 -1
  240. package/dist/seat-probe.js.map +1 -0
  241. package/dist/seat-store.d.ts +76 -0
  242. package/dist/seat-store.d.ts.map +1 -0
  243. package/dist/seat-store.js +309 -0
  244. package/dist/seat-store.js.map +1 -0
  245. package/dist/seats.d.ts +375 -0
  246. package/dist/seats.d.ts.map +1 -0
  247. package/dist/seats.js +670 -0
  248. package/dist/seats.js.map +1 -0
  249. package/dist/self-path.d.ts +27 -0
  250. package/dist/self-path.d.ts.map +1 -0
  251. package/dist/self-path.js +43 -0
  252. package/dist/self-path.js.map +1 -0
  253. package/dist/server-endpoint.d.ts +9 -0
  254. package/dist/server-endpoint.d.ts.map +1 -0
  255. package/dist/server-endpoint.js +38 -0
  256. package/dist/server-endpoint.js.map +1 -0
  257. package/dist/server-errors.d.ts +50 -0
  258. package/dist/server-errors.d.ts.map +1 -0
  259. package/dist/server-errors.js +79 -0
  260. package/dist/server-errors.js.map +1 -0
  261. package/dist/server-handshake.d.ts +197 -0
  262. package/dist/server-handshake.d.ts.map +1 -0
  263. package/dist/server-handshake.js +533 -0
  264. package/dist/server-handshake.js.map +1 -0
  265. package/dist/server-response.d.ts +3 -0
  266. package/dist/server-response.d.ts.map +1 -0
  267. package/dist/server-response.js +67 -0
  268. package/dist/server-response.js.map +1 -0
  269. package/dist/server-trust.d.ts +14 -0
  270. package/dist/server-trust.d.ts.map +1 -0
  271. package/dist/server-trust.js +225 -0
  272. package/dist/server-trust.js.map +1 -0
  273. package/dist/session-continuity.d.ts +33 -0
  274. package/dist/session-continuity.d.ts.map +1 -0
  275. package/dist/session-continuity.js +220 -0
  276. package/dist/session-continuity.js.map +1 -0
  277. package/dist/setup-confirm.d.ts +3 -3
  278. package/dist/setup-confirm.d.ts.map +1 -0
  279. package/dist/setup-confirm.js +126 -2
  280. package/dist/setup-confirm.js.map +1 -0
  281. package/dist/setup.d.ts +5 -3
  282. package/dist/setup.d.ts.map +1 -0
  283. package/dist/setup.js +169 -46
  284. package/dist/setup.js.map +1 -0
  285. package/dist/shell-escape.d.ts.map +1 -0
  286. package/dist/shell-escape.js +22 -1
  287. package/dist/shell-escape.js.map +1 -0
  288. package/dist/spawn.d.ts +2 -2
  289. package/dist/spawn.d.ts.map +1 -0
  290. package/dist/spawn.js +29 -10
  291. package/dist/spawn.js.map +1 -0
  292. package/dist/startup-services.d.ts +0 -1
  293. package/dist/startup-services.d.ts.map +1 -0
  294. package/dist/startup-services.js +26 -1
  295. package/dist/startup-services.js.map +1 -0
  296. package/dist/stream-owner.d.ts +6 -2
  297. package/dist/stream-owner.d.ts.map +1 -0
  298. package/dist/stream-owner.js +547 -2
  299. package/dist/stream-owner.js.map +1 -0
  300. package/dist/stream-status.d.ts +1 -1
  301. package/dist/stream-status.d.ts.map +1 -0
  302. package/dist/stream-status.js +268 -3
  303. package/dist/stream-status.js.map +1 -0
  304. package/dist/sync-roles-render.d.ts.map +1 -0
  305. package/dist/sync-roles-render.js +118 -3
  306. package/dist/sync-roles-render.js.map +1 -0
  307. package/dist/sync.d.ts +1 -1
  308. package/dist/sync.d.ts.map +1 -0
  309. package/dist/sync.js +286 -22
  310. package/dist/sync.js.map +1 -0
  311. package/dist/terminal-title.d.ts.map +1 -0
  312. package/dist/terminal-title.js +68 -1
  313. package/dist/terminal-title.js.map +1 -0
  314. package/dist/token-store.d.ts +17 -111
  315. package/dist/token-store.d.ts.map +1 -0
  316. package/dist/token-store.js +81 -1
  317. package/dist/token-store.js.map +1 -0
  318. package/dist/tool-manifest.d.ts +4 -8
  319. package/dist/tool-manifest.d.ts.map +1 -0
  320. package/dist/tool-manifest.js +554 -1
  321. package/dist/tool-manifest.js.map +1 -0
  322. package/dist/tool-scope.d.ts +8 -12
  323. package/dist/tool-scope.d.ts.map +1 -0
  324. package/dist/tool-scope.js +97 -1
  325. package/dist/tool-scope.js.map +1 -0
  326. package/dist/types.d.ts +1 -5
  327. package/dist/types.d.ts.map +1 -0
  328. package/dist/types.js +5 -0
  329. package/dist/types.js.map +1 -0
  330. package/dist/unknown-subcommand.d.ts +1 -1
  331. package/dist/unknown-subcommand.d.ts.map +1 -0
  332. package/dist/unknown-subcommand.js +37 -1
  333. package/dist/unknown-subcommand.js.map +1 -0
  334. package/dist/version.d.ts +1 -1
  335. package/dist/version.d.ts.map +1 -0
  336. package/dist/version.js +78 -2
  337. package/dist/version.js.map +1 -0
  338. package/dist/working-repo.d.ts.map +1 -0
  339. package/dist/working-repo.js +81 -1
  340. package/dist/working-repo.js.map +1 -0
  341. package/dist/worktree-lifecycle.d.ts.map +1 -0
  342. package/dist/worktree-lifecycle.js +205 -2
  343. package/dist/worktree-lifecycle.js.map +1 -0
  344. package/docs/EXTRACTION_PROVENANCE.md +42 -0
  345. package/docs/LOCAL_SERVER.md +103 -0
  346. package/docs/RELEASING.md +129 -0
  347. package/package.json +52 -34
  348. package/src/agent-runtime.ts +69 -0
  349. package/src/assimilate-cmd.ts +1864 -0
  350. package/src/assimilate-deps.ts +444 -0
  351. package/src/assimilate-guard.ts +84 -0
  352. package/src/assimilate-welcome.ts +39 -0
  353. package/src/auth-env.ts +21 -0
  354. package/src/backends/launch-all-pastelist.ts +18 -0
  355. package/src/backends/launch-all-tmux.ts +75 -0
  356. package/src/backends/launch-all-windows.ts +110 -0
  357. package/src/bare-launch-menu.ts +148 -0
  358. package/src/claude-launch-args.ts +35 -0
  359. package/src/claude.ts +561 -0
  360. package/src/cleanup-cmd.ts +581 -0
  361. package/src/clear-rewake-core.ts +34 -0
  362. package/src/clear-rewake.ts +18 -0
  363. package/src/cli-help.ts +116 -0
  364. package/src/cli-platform.ts +127 -0
  365. package/src/cli-tool-approval.ts +716 -0
  366. package/src/codex-app-server.ts +238 -0
  367. package/src/codex-app-wake.ts +524 -0
  368. package/src/codex-launch.ts +140 -0
  369. package/src/codex-remote.ts +500 -0
  370. package/src/codex-wake-resolve.ts +155 -0
  371. package/src/config-utils.ts +811 -0
  372. package/src/config.ts +595 -0
  373. package/src/console-prefix.ts +99 -0
  374. package/src/cube-name.ts +69 -0
  375. package/src/cubes.ts +583 -0
  376. package/src/debug.ts +73 -0
  377. package/src/direct-log.ts +9 -0
  378. package/src/docs-sections.ts +129 -0
  379. package/src/drone-lifecycle.ts +62 -0
  380. package/src/drone-management.ts +162 -0
  381. package/src/ensure-mcp-config.ts +54 -0
  382. package/src/evict-drone.ts +82 -0
  383. package/src/gc-orphan-inboxes.ts +229 -0
  384. package/src/inbox-monitor.ts +1005 -0
  385. package/src/index.ts +1201 -0
  386. package/src/launch-all-cmd.ts +450 -0
  387. package/src/launch-all-command.ts +30 -0
  388. package/src/launch-all-deps.ts +188 -0
  389. package/src/launch-all-discovery.ts +118 -0
  390. package/src/launch-all-locks.ts +74 -0
  391. package/src/launch-gate.ts +80 -0
  392. package/src/lifecycle-log-guard.ts +144 -0
  393. package/src/list-roles-render.ts +52 -0
  394. package/src/local-log-routing.ts +106 -0
  395. package/src/local-manage-tool-result.ts +10 -0
  396. package/src/local-server-cursor.ts +188 -0
  397. package/src/log-audit.ts +207 -0
  398. package/src/log-stream.ts +1567 -0
  399. package/src/model-presets.ts +22 -0
  400. package/src/name-validator.ts +23 -0
  401. package/src/opencode-drone.ts +528 -0
  402. package/src/opencode-plugin.ts +38 -0
  403. package/src/parse-assimilate-args.ts +125 -0
  404. package/src/parse-launch-all-args.ts +100 -0
  405. package/src/postinstall-banner.ts +37 -0
  406. package/src/postinstall.ts +36 -0
  407. package/src/readiness-probe.ts +12 -0
  408. package/src/regen-format.ts +651 -0
  409. package/src/regen.ts +150 -0
  410. package/src/remote-client.ts +1457 -0
  411. package/src/reset-local-seat-cmd.ts +227 -0
  412. package/src/role-match.ts +29 -0
  413. package/src/role-resolver.ts +93 -0
  414. package/src/roster-render.ts +196 -0
  415. package/src/seat-probe.ts +115 -0
  416. package/src/seat-store.ts +333 -0
  417. package/src/seats.ts +911 -0
  418. package/src/self-path.ts +51 -0
  419. package/src/server-endpoint.ts +38 -0
  420. package/src/server-errors.ts +95 -0
  421. package/src/server-handshake.ts +816 -0
  422. package/src/server-response.ts +76 -0
  423. package/src/server-trust.ts +245 -0
  424. package/src/session-continuity.ts +280 -0
  425. package/src/setup-confirm.ts +171 -0
  426. package/src/setup.ts +186 -0
  427. package/src/shell-escape.ts +22 -0
  428. package/src/spawn.ts +31 -0
  429. package/src/startup-services.ts +36 -0
  430. package/src/stream-owner.ts +686 -0
  431. package/src/stream-status.ts +337 -0
  432. package/src/sync-roles-render.ts +163 -0
  433. package/src/sync.ts +363 -0
  434. package/src/terminal-title.ts +76 -0
  435. package/src/token-store.ts +102 -0
  436. package/src/tool-manifest.ts +610 -0
  437. package/src/tool-scope.ts +110 -0
  438. package/src/types.ts +5 -0
  439. package/src/unknown-subcommand.ts +35 -0
  440. package/src/version.ts +82 -0
  441. package/src/working-repo.ts +99 -0
  442. package/src/worktree-lifecycle.ts +254 -0
  443. package/dist/auth-recovery.d.ts +0 -33
  444. package/dist/auth-recovery.js +0 -1
  445. package/dist/auth.d.ts +0 -103
  446. package/dist/auth.js +0 -39
  447. package/dist/device-auth.d.ts +0 -75
  448. package/dist/device-auth.js +0 -1
  449. package/dist/drone-address.d.ts +0 -26
  450. package/dist/drone-address.js +0 -1
  451. package/dist/get-started.d.ts +0 -20
  452. package/dist/get-started.js +0 -2
  453. package/dist/health-beat.d.ts +0 -134
  454. package/dist/health-beat.js +0 -1
  455. package/dist/role-section.d.ts +0 -110
  456. package/dist/role-section.js +0 -8
  457. package/dist/setup-action.d.ts +0 -20
  458. package/dist/setup-action.js +0 -1
  459. package/dist/stale-version-check.d.ts +0 -40
  460. package/dist/stale-version-check.js +0 -1
  461. package/dist/subscription-retry.d.ts +0 -40
  462. package/dist/subscription-retry.js +0 -1
  463. package/dist/templates.d.ts +0 -107
  464. package/dist/templates.js +0 -359
  465. package/dist/token-crypto.d.ts +0 -50
  466. package/dist/token-crypto.js +0 -1
@@ -1,2 +1,436 @@
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 { hasPendingWakeActivity } from './remote-client.js';
5
+ import { BORG_CODEX_REMOTE_WAKE_ENV, resolveSessionAgentKind, } from './agent-runtime.js';
6
+ import { codexAppServerSocketFromEnv, pickFreshThread, wakeTargetChanged, wakeRetryBackoffMs, wakeRetryExpired, WAKE_RETRY_MAX_ATTEMPTS, shouldFireHeartbeat, } from './codex-wake-resolve.js';
7
+ export const CODEX_WAKE_PROMPT = 'New Borg cube-log activity arrived.';
8
+ export function formatCodexWakePrompt(inboxLine) {
9
+ return `New Borg cube-log activity arrived:\n${inboxLine}`;
10
+ }
11
+ // gh#708: STATIC catch-up/drain prompt (zero interpolation — no token/secret/PII/
12
+ // cube-content; the entry bodies are fetched by codex itself via the
13
+ // grant/visibility-gated borg_read-log, never injected into the wake). Delivered
14
+ // once after a wake is deferred (mid-turn thread) or retried (transient miss), to
15
+ // fire the already-shipped drain so no entry is skipped. gh#857 WI-2 reuses it as
16
+ // the periodic heartbeat prompt.
17
+ 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.';
18
+ export function isCodexRemoteWakeEnabled(env = process.env) {
19
+ return env[BORG_CODEX_REMOTE_WAKE_ENV] === '1';
20
+ }
21
+ export { resolveSessionAgentKind } from './agent-runtime.js';
22
+ export function resolveCodexWakeTarget(env = process.env) {
23
+ if (!isCodexRemoteWakeEnabled(env)) {
24
+ return { enabled: false };
25
+ }
26
+ return { enabled: true };
27
+ }
28
+ /**
29
+ * gh#633: resolve a codex drone's transport-agnostic "wake-path-armed" signal
30
+ * from its OWN runtime wake mechanism — the app-server bridge's process
31
+ * liveness, the codex analogue of the claude tail-F Monitor health. Fed into
32
+ * the health beat so the HOP-2 wake-path-deaf classifier reads a
33
+ * transport-agnostic armed signal instead of the claude-shaped monitor_armed
34
+ * (which is false-by-design for codex and falsely flagged them, gh#633).
35
+ *
36
+ * Tri-state (boolean|null; caller maps null→armed for false-deaf-avoidance):
37
+ * - false ONLY on a positively-dead bridge: no wake target registered (the
38
+ * bridge cannot deliver wakes), OR the app-server pid is dead.
39
+ * - true when the wake target resolves AND the app-server pid is alive.
40
+ * - null when the bridge health is indeterminate (target read or pid check
41
+ * could not resolve) → armed (don't false-flag on uncertainty).
42
+ */
43
+ export async function probeCodexBridgeArmed(active, deps = {}) {
44
+ try {
45
+ const resolve = deps.getCodexWakeTarget ?? getCodexWakeTarget;
46
+ const target = await resolve(active.cubeId, active.droneId);
47
+ // No registered wake target → the bridge cannot deliver a wake → not armed.
48
+ if (!target)
49
+ return false;
50
+ const check = deps.checkBridge ?? checkCodexBridgeHealthy;
51
+ return check(target.socketPath);
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ let wakeInFlight = false;
58
+ const pendingWakeRequests = [];
59
+ const deliveredWakeKeys = new Set();
60
+ const deliveredWakeKeyOrder = [];
61
+ const DELIVERED_WAKE_KEY_CAP = 100;
62
+ // gh#708/#857: a single in-flight retry-drain loop coalesces ALL wakes deferred
63
+ // (mid-turn thread) or missed (transient error) into ONE retried-until-delivered
64
+ // drain. The coalesce gate means a burst collapses to one poller, not N.
65
+ let retryDrainInFlight = false;
66
+ // gh#857 WI-2: timestamp of the last SUCCESSFUL wake delivery (per-entry OR
67
+ // retry-drain OR heartbeat). The heartbeat reads this (shouldFireHeartbeat) to
68
+ // skip when a delivery already landed inside the cadence window. Module-scoped
69
+ // because the wake path and the heartbeat run in the same MCP-client child.
70
+ let lastDeliveredAt = null;
71
+ /** gh#857 WI-2: last successful wake delivery time (for the heartbeat gate). */
72
+ export function getLastDeliveredAt() {
73
+ return lastDeliveredAt;
74
+ }
75
+ function markDelivered(deps) {
76
+ lastDeliveredAt = (deps.now ?? Date.now)();
77
+ }
78
+ // gh#857 WI-2: a single-in-flight guard for the heartbeat tick (mirrors
79
+ // wakeInFlight + retryDrainInFlight). Without it, a tick that stalls in IO past
80
+ // the next interval could let a second tick read the stale (pre-markDelivered)
81
+ // lastDeliveredAt, pass its gate, and double-inject the drain — the exact
82
+ // double-fire the design forbids.
83
+ let heartbeatInFlight = false;
84
+ // gh#861 finding 1: a SINGLE module-scoped mutex serializing the resolve+inject
85
+ // critical section ACROSS all three injecting paths (per-entry wake, retry-drain,
86
+ // heartbeat tick). The per-path flags above (wakeInFlight / retryDrainInFlight /
87
+ // heartbeatInFlight) each serialize their OWN path but NOT across paths — so a
88
+ // per-entry WAKE prompt and a heartbeat/retry DRAIN prompt could land in the same
89
+ // codex thread concurrently (double-inject collision). This lock closes that
90
+ // cross-path race: a path that cannot acquire it backs off via its own retry
91
+ // mechanism (heartbeat: skip tick; retry-drain: continue loop; per-entry: schedule
92
+ // a retry-drain so the entry is not lost).
93
+ let injectInFlight = false;
94
+ function tryAcquireInjectLock() {
95
+ if (injectInFlight)
96
+ return false;
97
+ injectInFlight = true;
98
+ return true;
99
+ }
100
+ function releaseInjectLock() {
101
+ injectInFlight = false;
102
+ }
103
+ /**
104
+ * gh#861 finding 3: a positively-dead codex app-server socket. ENOENT means the
105
+ * socket file is gone (the app-server never created it / unlinked it on exit) —
106
+ * the wake path cannot deliver, so the heartbeat timer should be torn down. Kept
107
+ * narrow (ENOENT only): a transient ECONNREFUSED during a momentary blip must NOT
108
+ * tear the backstop down.
109
+ */
110
+ function isAppServerDeadError(err) {
111
+ return err?.code === 'ENOENT';
112
+ }
113
+ function defaultSleep(ms) {
114
+ return new Promise((resolve) => setTimeout(resolve, ms));
115
+ }
116
+ /**
117
+ * gh#855: FRESH wake-target resolution. Prefer THIS drone's live app-server
118
+ * socket (pinned into the child's env at spawn) and re-resolve the loaded thread
119
+ * NOW (loadedThreadIds is re-runnable) — so a missed/stale launch probe or a
120
+ * thread change can never cause permanent deafness. Self-heals the file cache
121
+ * (write-only-on-change) so other readers (probeCodexBridgeArmed / health-beat)
122
+ * stay current. Falls back to the launch-recorded file when the env socket is
123
+ * absent (un-upgraded launch) — no regression. Returns the resolved target, or
124
+ * null (caller skips this wake; the next one retries). Does NOT keep a
125
+ * connection open — the env path opens a short-lived probe client to re-resolve
126
+ * the thread, then closes it, so the caller can dedup BEFORE opening the wake
127
+ * connection (no reconnect on an already-delivered wake).
128
+ */
129
+ function makeCodexClient(sock, deps) {
130
+ return deps.createClient ? deps.createClient(sock) : new CodexAppServerClient(sock);
131
+ }
132
+ async function resolveFreshCodexWakeTarget(active, deps) {
133
+ const envSocket = codexAppServerSocketFromEnv(deps.env ?? process.env);
134
+ if (envSocket) {
135
+ const probe = makeCodexClient(envSocket, deps);
136
+ await probe.connect();
137
+ try {
138
+ const ids = await probe.loadedThreadIds();
139
+ const summaries = [];
140
+ for (const id of ids) {
141
+ const t = await probe.readThread(id);
142
+ if (t)
143
+ summaries.push({ id: t.id, cwd: t.cwd, updatedAt: t.updatedAt });
144
+ }
145
+ const threadId = pickFreshThread(summaries, { cwd: (deps.cwd ?? (() => process.cwd()))() });
146
+ if (!threadId)
147
+ return null; // no loaded thread yet — next wake retries (no permanent fail)
148
+ await maybePersistWakeTarget(active, { socketPath: envSocket, threadId }, deps);
149
+ return { socketPath: envSocket, threadId };
150
+ }
151
+ finally {
152
+ probe.close();
153
+ }
154
+ }
155
+ // Fallback: the launch-recorded file (un-upgraded launch / env absent) — no
156
+ // connect needed to resolve, so the caller dedups before opening any socket.
157
+ const target = await (deps.getCodexWakeTarget ?? getCodexWakeTarget)(active.cubeId, active.droneId);
158
+ if (!target)
159
+ return null;
160
+ return { socketPath: target.socketPath, threadId: target.threadId };
161
+ }
162
+ /** Self-healing cache write — only when the resolved target actually changed. */
163
+ async function maybePersistWakeTarget(active, fresh, deps) {
164
+ try {
165
+ const get = deps.getCodexWakeTarget ?? getCodexWakeTarget;
166
+ const set = deps.setCodexWakeTarget ?? setCodexWakeTarget;
167
+ const existing = await get(active.cubeId, active.droneId);
168
+ const prev = existing ? { socketPath: existing.socketPath, threadId: existing.threadId } : null;
169
+ if (wakeTargetChanged(prev, fresh)) {
170
+ await set(active.cubeId, active.droneId, fresh);
171
+ }
172
+ }
173
+ catch {
174
+ // best-effort cache write; never break the wake path
175
+ }
176
+ }
177
+ export function wakeCodexViaAppServer(reason = CODEX_WAKE_PROMPT, env = process.env, deps = {}) {
178
+ const target = resolveCodexWakeTarget(env);
179
+ if (!target.enabled)
180
+ return;
181
+ pendingWakeRequests.push({ reason, deps });
182
+ if (wakeInFlight)
183
+ return;
184
+ wakeInFlight = true;
185
+ void drainCodexWakeQueue().finally(() => {
186
+ wakeInFlight = false;
187
+ });
188
+ }
189
+ async function drainCodexWakeQueue() {
190
+ while (pendingWakeRequests.length > 0) {
191
+ const request = pendingWakeRequests.shift();
192
+ await wakeCodexTargeted(request.reason, request.deps);
193
+ }
194
+ }
195
+ async function wakeCodexTargeted(reason, deps) {
196
+ // gh#861 finding 1: another path (heartbeat/retry-drain) is mid-inject into the
197
+ // same thread — defer to the retry-drain so this entry isn't double-injected nor
198
+ // lost (the drain re-syncs the whole burst via the server read-cursor).
199
+ if (!tryAcquireInjectLock()) {
200
+ scheduleRetryDrain(deps);
201
+ return;
202
+ }
203
+ try {
204
+ const active = await (deps.getActiveCube ?? getActiveCube)();
205
+ if (!active)
206
+ return;
207
+ // gh#855: resolve FRESH (live env socket + re-resolved thread), falling back
208
+ // to the launch-recorded file only when the env socket is absent.
209
+ const resolved = await resolveFreshCodexWakeTarget(active, deps);
210
+ if (!resolved)
211
+ return;
212
+ const { socketPath, threadId } = resolved;
213
+ const wakeKey = `${threadId}\0${reason}`;
214
+ if (deliveredWakeKeys.has(wakeKey))
215
+ return; // dedup before opening the wake socket
216
+ const client = makeCodexClient(socketPath, deps);
217
+ await client.connect();
218
+ try {
219
+ const thread = await client.readThread(threadId);
220
+ if (thread?.status?.type === 'active') {
221
+ // gh#708/#857: the thread is mid-turn — this per-entry wake can't land
222
+ // now. Schedule the retry-drain (coalesced, retried-until-delivered) so
223
+ // the burst's entries are drained once the thread goes idle; codex has no
224
+ // on-disk tail fallback like Claude's borg-inbox-monitor.
225
+ scheduleRetryDrain(deps);
226
+ return;
227
+ }
228
+ await client.startTurn(threadId, reason);
229
+ rememberDeliveredWake(wakeKey);
230
+ markDelivered(deps);
231
+ }
232
+ finally {
233
+ client.close();
234
+ }
235
+ }
236
+ catch {
237
+ // gh#857: a transient connect/read/startTurn failure must NOT be silently
238
+ // swallowed (the old best-effort drop let a single blip lose an entry).
239
+ // Schedule the retry-drain so the wake is retried-until-delivered; the SSE
240
+ // stream is never broken (this is fire-and-forget).
241
+ scheduleRetryDrain(deps);
242
+ }
243
+ finally {
244
+ releaseInjectLock();
245
+ }
246
+ }
247
+ /**
248
+ * gh#708/#857 WI-1: schedule a single coalesced retry-drain. Multiple wakes
249
+ * deferred (mid-turn) or missed (transient) collapse into ONE loop
250
+ * (retryDrainInFlight gate). The loop retries — with exponential backoff
251
+ * (wakeRetryBackoffMs) — until the thread is reachable+idle and the
252
+ * CODEX_CATCHUP_PROMPT drain is delivered (server read-cursor then drains ALL
253
+ * unread, so one drain covers the whole burst). Durable: unlike the old
254
+ * 15-min-give-up catch-up poller, it retries until a generous age cap
255
+ * (wakeRetryExpired); the gh#857 WI-2 heartbeat is the backstop beyond that.
256
+ * Never throws into the SSE path (fire-and-forget).
257
+ */
258
+ function scheduleRetryDrain(deps) {
259
+ if (retryDrainInFlight)
260
+ return; // coalesce: one loop covers all deferred/missed wakes
261
+ retryDrainInFlight = true;
262
+ void runRetryDrainLoop(deps).finally(() => {
263
+ retryDrainInFlight = false;
264
+ });
265
+ }
266
+ async function runRetryDrainLoop(deps) {
267
+ const sleep = deps.sleep ?? defaultSleep;
268
+ const now = deps.now ?? Date.now;
269
+ const jitter = deps.jitter ?? (() => Math.random() * 500);
270
+ const maxAttempts = deps.maxAttempts ?? WAKE_RETRY_MAX_ATTEMPTS;
271
+ const startedAt = now();
272
+ let attempts = 0;
273
+ // Terminate on the time-based age cap OR a hard iteration ceiling (defensive
274
+ // belt: a non-advancing clock would make the time-only guard hot-spin).
275
+ while (!wakeRetryExpired(startedAt, now()) && attempts < maxAttempts) {
276
+ await sleep(wakeRetryBackoffMs(attempts, jitter()));
277
+ attempts++;
278
+ // gh#861 finding 1: another path (heartbeat/per-entry wake) holds the inject
279
+ // lock — back off and retry rather than double-inject into the same thread.
280
+ if (!tryAcquireInjectLock())
281
+ continue;
282
+ try {
283
+ const active = await (deps.getActiveCube ?? getActiveCube)();
284
+ if (!active)
285
+ continue; // no active cube yet → keep retrying (until age cap)
286
+ // gh#855: same FRESH resolution as the per-entry wake, so a stale launch
287
+ // probe can't defeat the retry-drain either.
288
+ const resolved = await resolveFreshCodexWakeTarget(active, deps);
289
+ if (!resolved)
290
+ continue; // thread not loaded yet → retry (age-capped)
291
+ const { socketPath, threadId } = resolved;
292
+ const client = makeCodexClient(socketPath, deps);
293
+ await client.connect();
294
+ try {
295
+ const thread = await client.readThread(threadId);
296
+ if (thread?.status?.type === 'active') {
297
+ continue; // re-defer: still mid-turn (backoff before next poll)
298
+ }
299
+ await client.startTurn(threadId, CODEX_CATCHUP_PROMPT);
300
+ markDelivered(deps);
301
+ return; // drain delivered → server read-cursor drains all unread → done
302
+ }
303
+ finally {
304
+ client.close();
305
+ }
306
+ }
307
+ catch {
308
+ // transient socket/read error must not abort the loop — keep retrying with
309
+ // backoff until reachable+idle or the age cap; never throws into SSE.
310
+ }
311
+ finally {
312
+ releaseInjectLock();
313
+ }
314
+ }
315
+ // aged out: the gh#857 WI-2 periodic heartbeat is the ultimate backstop.
316
+ }
317
+ /**
318
+ * gh#857 WI-2: codex /loop-equivalent heartbeat cadence. Codex retains this
319
+ * independent 20-minute drain because it has no Claude-style per-entry inbox
320
+ * Monitor. Claude recovery is adaptive: 3h ±30m while the Monitor is healthy
321
+ * or indeterminate, and 15m ±3m only while it is explicitly broken.
322
+ */
323
+ export const CODEX_HEARTBEAT_CADENCE_MS = 20 * 60_000;
324
+ /**
325
+ * gh#857/client#76: one tick of the codex catch-up backstop. The cadence only
326
+ * initiates a token-free unread-state preflight; a DRAIN turn is injected when
327
+ * that authoritative scan finds real work that a per-entry wake missed. Recent
328
+ * delivery still suppresses redundant preflights. Unlike the per-entry path it
329
+ * does not consult deliveredWakeKeys because the unread cursor is authoritative.
330
+ * Best-effort: a failed preflight, mid-turn thread, transient error, or unresolved
331
+ * target skips this tick and lets the next cadence retry. Never throws.
332
+ */
333
+ export async function fireCodexHeartbeatTick(deps = {}, cadenceMs = CODEX_HEARTBEAT_CADENCE_MS) {
334
+ if (heartbeatInFlight)
335
+ return; // a prior tick's IO is still running → no overlap
336
+ const now = (deps.now ?? Date.now)();
337
+ if (!shouldFireHeartbeat(lastDeliveredAt, now, cadenceMs))
338
+ return; // a wake landed recently
339
+ // gh#861 finding 2: a lease-LOSING duplicate child must not tick/inject — mirror
340
+ // the per-entry path, which only fires inside an SSE session holding the stream
341
+ // lease. When the gate is provided and we don't own the lease, skip this tick.
342
+ if (deps.isStreamOwner && !deps.isStreamOwner())
343
+ return;
344
+ // gh#861 finding 1: another path is mid-inject into the thread → skip this tick
345
+ // (next tick retries) rather than collide a DRAIN prompt with an in-flight wake.
346
+ if (!tryAcquireInjectLock())
347
+ return;
348
+ // Set BEFORE the first await — the check+gate+set above are synchronous, so a
349
+ // concurrent tick can't interleave before the flag is set (single-threaded).
350
+ heartbeatInFlight = true;
351
+ try {
352
+ const active = await (deps.getActiveCube ?? getActiveCube)();
353
+ if (!active)
354
+ return;
355
+ // Elapsed time alone must never cross the model boundary. Query the
356
+ // authoritative unread state without advancing its cursor; only then touch
357
+ // the app-server socket or resolve a thread.
358
+ const hasPendingWork = deps.hasPendingWork ?? hasPendingWakeActivity;
359
+ if (!(await hasPendingWork(active)))
360
+ return;
361
+ const resolved = await resolveFreshCodexWakeTarget(active, deps);
362
+ if (!resolved)
363
+ return; // thread not loaded yet → next tick retries
364
+ const client = makeCodexClient(resolved.socketPath, deps);
365
+ await client.connect();
366
+ try {
367
+ const thread = await client.readThread(resolved.threadId);
368
+ if (thread?.status?.type === 'active')
369
+ return; // mid-turn → skip; next tick retries
370
+ await client.startTurn(resolved.threadId, CODEX_CATCHUP_PROMPT);
371
+ // markDelivered updates local heartbeat-gating state only.
372
+ markDelivered(deps);
373
+ }
374
+ finally {
375
+ client.close();
376
+ }
377
+ }
378
+ catch (err) {
379
+ // gh#861 finding 3: a positively-dead app-server socket (ENOENT) → the wake
380
+ // path is gone; signal teardown so the timer stops ticking against a dead
381
+ // socket (re-armed when an active cube returns). Other (transient) errors are
382
+ // best-effort skips — never break the SSE stream; next tick retries.
383
+ if (isAppServerDeadError(err))
384
+ deps.onAppServerSocketDead?.();
385
+ }
386
+ finally {
387
+ heartbeatInFlight = false;
388
+ releaseInjectLock();
389
+ }
390
+ }
391
+ /**
392
+ * gh#857 WI-2: start the codex /loop-equivalent heartbeat — a setInterval firing
393
+ * fireCodexHeartbeatTick every cadence. CODEX-ONLY: claude wakes via the tail-F
394
+ * inbox Monitor + /loop ScheduleWakeup and has NO app-server socket to inject
395
+ * into, so the heartbeat is intrinsically a codex mechanism. The gate reads
396
+ * agentKind and remote-wake capability LOCALLY from this child's own env,
397
+ * never a mutable/server-recorded field, so a mislabel can't silently defeat
398
+ * the backstop (gh#633 lesson). Agent CLI identity and remote transport are
399
+ * separate: a Codex CLI without a live remote transport has no app-server
400
+ * heartbeat to run. The timer is unref'd so it never keeps the process alive.
401
+ * Returns the timer, or null when this is not a remotely-wakeable Codex
402
+ * session. Injectable for tests.
403
+ */
404
+ export function startCodexHeartbeat(opts = {}) {
405
+ const agentKind = opts.agentKind ?? resolveSessionAgentKind();
406
+ const remoteWakeEnabled = opts.remoteWakeEnabled ?? isCodexRemoteWakeEnabled();
407
+ if (agentKind !== 'codex' || !remoteWakeEnabled)
408
+ return null;
409
+ const intervalMs = opts.intervalMs ?? CODEX_HEARTBEAT_CADENCE_MS;
410
+ const tick = opts.tick ?? (() => void fireCodexHeartbeatTick());
411
+ const timer = setInterval(tick, intervalMs);
412
+ timer.unref?.();
413
+ return timer;
414
+ }
415
+ export function resetCodexWakeForTests() {
416
+ wakeInFlight = false;
417
+ pendingWakeRequests.length = 0;
418
+ deliveredWakeKeys.clear();
419
+ deliveredWakeKeyOrder.length = 0;
420
+ retryDrainInFlight = false;
421
+ lastDeliveredAt = null;
422
+ heartbeatInFlight = false;
423
+ injectInFlight = false;
424
+ }
425
+ function rememberDeliveredWake(key) {
426
+ if (deliveredWakeKeys.has(key))
427
+ return;
428
+ deliveredWakeKeys.add(key);
429
+ deliveredWakeKeyOrder.push(key);
430
+ while (deliveredWakeKeyOrder.length > DELIVERED_WAKE_KEY_CAP) {
431
+ const oldKey = deliveredWakeKeyOrder.shift();
432
+ if (oldKey)
433
+ deliveredWakeKeys.delete(oldKey);
434
+ }
435
+ }
436
+ //# 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"}