oh-my-codex 0.21.0 → 0.21.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 (346) hide show
  1. package/Cargo.toml +1 -1
  2. package/README.md +4 -2
  3. package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.d.ts +2 -0
  4. package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.d.ts.map +1 -0
  5. package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.js +592 -0
  6. package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.js.map +1 -0
  7. package/dist/cli/__tests__/detached-leader-teardown.test.js +270 -33
  8. package/dist/cli/__tests__/detached-leader-teardown.test.js.map +1 -1
  9. package/dist/cli/__tests__/doctor-warning-copy.test.js +133 -5
  10. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  11. package/dist/cli/__tests__/index.test.js +543 -2
  12. package/dist/cli/__tests__/index.test.js.map +1 -1
  13. package/dist/cli/__tests__/issue-windows-cancel-identity.test.d.ts +2 -0
  14. package/dist/cli/__tests__/issue-windows-cancel-identity.test.d.ts.map +1 -0
  15. package/dist/cli/__tests__/issue-windows-cancel-identity.test.js +17 -0
  16. package/dist/cli/__tests__/issue-windows-cancel-identity.test.js.map +1 -0
  17. package/dist/cli/__tests__/launch-fallback.test.js +15 -3
  18. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  19. package/dist/cli/__tests__/package-bin-contract.test.js +20 -0
  20. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  21. package/dist/cli/__tests__/plugin-cache-stale-lock.test.d.ts +2 -0
  22. package/dist/cli/__tests__/plugin-cache-stale-lock.test.d.ts.map +1 -0
  23. package/dist/cli/__tests__/plugin-cache-stale-lock.test.js +76 -0
  24. package/dist/cli/__tests__/plugin-cache-stale-lock.test.js.map +1 -0
  25. package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.d.ts +2 -0
  26. package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.d.ts.map +1 -0
  27. package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.js +1662 -0
  28. package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.js.map +1 -0
  29. package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.d.ts +2 -0
  30. package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.d.ts.map +1 -0
  31. package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.js +522 -0
  32. package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.js.map +1 -0
  33. package/dist/cli/__tests__/ralplan-advisory.test.d.ts +2 -0
  34. package/dist/cli/__tests__/ralplan-advisory.test.d.ts.map +1 -0
  35. package/dist/cli/__tests__/ralplan-advisory.test.js +301 -0
  36. package/dist/cli/__tests__/ralplan-advisory.test.js.map +1 -0
  37. package/dist/cli/__tests__/ralplan.test.js +39 -0
  38. package/dist/cli/__tests__/ralplan.test.js.map +1 -1
  39. package/dist/cli/__tests__/resume.test.js +81 -6
  40. package/dist/cli/__tests__/resume.test.js.map +1 -1
  41. package/dist/cli/__tests__/session-scoped-runtime.test.js +423 -4
  42. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  43. package/dist/cli/__tests__/setup-install-mode.test.js +60 -3
  44. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  45. package/dist/cli/__tests__/setup-refresh.test.js +9 -0
  46. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  47. package/dist/cli/__tests__/sparkshell-cli.test.js +4 -0
  48. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
  49. package/dist/cli/__tests__/ultragoal.test.js +71 -0
  50. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  51. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +30 -4
  52. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
  53. package/dist/cli/doctor.d.ts.map +1 -1
  54. package/dist/cli/doctor.js +57 -8
  55. package/dist/cli/doctor.js.map +1 -1
  56. package/dist/cli/index.d.ts +113 -7
  57. package/dist/cli/index.d.ts.map +1 -1
  58. package/dist/cli/index.js +1850 -185
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli/native-assets.d.ts +2 -1
  61. package/dist/cli/native-assets.d.ts.map +1 -1
  62. package/dist/cli/native-assets.js +7 -7
  63. package/dist/cli/native-assets.js.map +1 -1
  64. package/dist/cli/plugin-marketplace.d.ts +89 -4
  65. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  66. package/dist/cli/plugin-marketplace.js +2135 -118
  67. package/dist/cli/plugin-marketplace.js.map +1 -1
  68. package/dist/cli/ralplan.d.ts +2 -1
  69. package/dist/cli/ralplan.d.ts.map +1 -1
  70. package/dist/cli/ralplan.js +149 -9
  71. package/dist/cli/ralplan.js.map +1 -1
  72. package/dist/cli/setup.d.ts.map +1 -1
  73. package/dist/cli/setup.js +7 -1
  74. package/dist/cli/setup.js.map +1 -1
  75. package/dist/cli/sparkshell.d.ts.map +1 -1
  76. package/dist/cli/sparkshell.js +9 -10
  77. package/dist/cli/sparkshell.js.map +1 -1
  78. package/dist/cli/update-worker.js +9 -0
  79. package/dist/cli/update-worker.js.map +1 -1
  80. package/dist/cli/update.d.ts +1 -0
  81. package/dist/cli/update.d.ts.map +1 -1
  82. package/dist/cli/update.js +9 -0
  83. package/dist/cli/update.js.map +1 -1
  84. package/dist/config/__tests__/generator-idempotent.test.js +118 -0
  85. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  86. package/dist/config/generator.d.ts.map +1 -1
  87. package/dist/config/generator.js +74 -4
  88. package/dist/config/generator.js.map +1 -1
  89. package/dist/hooks/__tests__/keyword-detector.test.js +74 -0
  90. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  91. package/dist/hooks/__tests__/ralplan-advisory-keyword.test.d.ts +2 -0
  92. package/dist/hooks/__tests__/ralplan-advisory-keyword.test.d.ts.map +1 -0
  93. package/dist/hooks/__tests__/ralplan-advisory-keyword.test.js +250 -0
  94. package/dist/hooks/__tests__/ralplan-advisory-keyword.test.js.map +1 -0
  95. package/dist/hooks/__tests__/session.test.js +10 -1
  96. package/dist/hooks/__tests__/session.test.js.map +1 -1
  97. package/dist/hooks/keyword-detector.d.ts +8 -1
  98. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  99. package/dist/hooks/keyword-detector.js +130 -9
  100. package/dist/hooks/keyword-detector.js.map +1 -1
  101. package/dist/hooks/session.d.ts +5 -0
  102. package/dist/hooks/session.d.ts.map +1 -1
  103. package/dist/hooks/session.js +17 -3
  104. package/dist/hooks/session.js.map +1 -1
  105. package/dist/hud/__tests__/index.test.js +16 -1
  106. package/dist/hud/__tests__/index.test.js.map +1 -1
  107. package/dist/hud/__tests__/reconcile.test.js +134 -7
  108. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  109. package/dist/hud/__tests__/render.test.js +57 -0
  110. package/dist/hud/__tests__/render.test.js.map +1 -1
  111. package/dist/hud/__tests__/session-attached.test.d.ts +2 -0
  112. package/dist/hud/__tests__/session-attached.test.d.ts.map +1 -0
  113. package/dist/hud/__tests__/session-attached.test.js +82 -0
  114. package/dist/hud/__tests__/session-attached.test.js.map +1 -0
  115. package/dist/hud/__tests__/state.test.js +94 -2
  116. package/dist/hud/__tests__/state.test.js.map +1 -1
  117. package/dist/hud/__tests__/tmux-split-realtmux.test.js +169 -2
  118. package/dist/hud/__tests__/tmux-split-realtmux.test.js.map +1 -1
  119. package/dist/hud/__tests__/tmux.test.js +104 -22
  120. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  121. package/dist/hud/__tests__/types.test.js +9 -0
  122. package/dist/hud/__tests__/types.test.js.map +1 -1
  123. package/dist/hud/__tests__/watch-detached.test.d.ts +2 -0
  124. package/dist/hud/__tests__/watch-detached.test.d.ts.map +1 -0
  125. package/dist/hud/__tests__/watch-detached.test.js +383 -0
  126. package/dist/hud/__tests__/watch-detached.test.js.map +1 -0
  127. package/dist/hud/__tests__/watch-realtmux.test.d.ts +2 -0
  128. package/dist/hud/__tests__/watch-realtmux.test.d.ts.map +1 -0
  129. package/dist/hud/__tests__/watch-realtmux.test.js +322 -0
  130. package/dist/hud/__tests__/watch-realtmux.test.js.map +1 -0
  131. package/dist/hud/index.d.ts +3 -0
  132. package/dist/hud/index.d.ts.map +1 -1
  133. package/dist/hud/index.js +98 -20
  134. package/dist/hud/index.js.map +1 -1
  135. package/dist/hud/reconcile.d.ts.map +1 -1
  136. package/dist/hud/reconcile.js +68 -24
  137. package/dist/hud/reconcile.js.map +1 -1
  138. package/dist/hud/render.d.ts.map +1 -1
  139. package/dist/hud/render.js +20 -0
  140. package/dist/hud/render.js.map +1 -1
  141. package/dist/hud/session-attached.d.ts +15 -0
  142. package/dist/hud/session-attached.d.ts.map +1 -0
  143. package/dist/hud/session-attached.js +47 -0
  144. package/dist/hud/session-attached.js.map +1 -0
  145. package/dist/hud/state.d.ts +9 -1
  146. package/dist/hud/state.d.ts.map +1 -1
  147. package/dist/hud/state.js +140 -3
  148. package/dist/hud/state.js.map +1 -1
  149. package/dist/hud/tmux.d.ts +4 -0
  150. package/dist/hud/tmux.d.ts.map +1 -1
  151. package/dist/hud/tmux.js +86 -23
  152. package/dist/hud/tmux.js.map +1 -1
  153. package/dist/hud/types.d.ts +20 -0
  154. package/dist/hud/types.d.ts.map +1 -1
  155. package/dist/hud/types.js +3 -0
  156. package/dist/hud/types.js.map +1 -1
  157. package/dist/modes/base.d.ts +15 -2
  158. package/dist/modes/base.d.ts.map +1 -1
  159. package/dist/modes/base.js +105 -16
  160. package/dist/modes/base.js.map +1 -1
  161. package/dist/question/autopilot-wait.js +2 -2
  162. package/dist/question/autopilot-wait.js.map +1 -1
  163. package/dist/question/deep-interview.js +2 -2
  164. package/dist/question/deep-interview.js.map +1 -1
  165. package/dist/ralplan/__tests__/advisory-activation.test.d.ts +2 -0
  166. package/dist/ralplan/__tests__/advisory-activation.test.d.ts.map +1 -0
  167. package/dist/ralplan/__tests__/advisory-activation.test.js +700 -0
  168. package/dist/ralplan/__tests__/advisory-activation.test.js.map +1 -0
  169. package/dist/ralplan/__tests__/advisory-detached-transition.test.d.ts +2 -0
  170. package/dist/ralplan/__tests__/advisory-detached-transition.test.d.ts.map +1 -0
  171. package/dist/ralplan/__tests__/advisory-detached-transition.test.js +88 -0
  172. package/dist/ralplan/__tests__/advisory-detached-transition.test.js.map +1 -0
  173. package/dist/ralplan/__tests__/advisory.test.d.ts +2 -0
  174. package/dist/ralplan/__tests__/advisory.test.d.ts.map +1 -0
  175. package/dist/ralplan/__tests__/advisory.test.js +1087 -0
  176. package/dist/ralplan/__tests__/advisory.test.js.map +1 -0
  177. package/dist/ralplan/__tests__/runtime.test.js +416 -7
  178. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  179. package/dist/ralplan/advisory-activation-verifier.d.ts +19 -0
  180. package/dist/ralplan/advisory-activation-verifier.d.ts.map +1 -0
  181. package/dist/ralplan/advisory-activation-verifier.js +77 -0
  182. package/dist/ralplan/advisory-activation-verifier.js.map +1 -0
  183. package/dist/ralplan/advisory-activation.d.ts +34 -0
  184. package/dist/ralplan/advisory-activation.d.ts.map +1 -0
  185. package/dist/ralplan/advisory-activation.js +205 -0
  186. package/dist/ralplan/advisory-activation.js.map +1 -0
  187. package/dist/ralplan/advisory-contract.d.ts +103 -0
  188. package/dist/ralplan/advisory-contract.d.ts.map +1 -0
  189. package/dist/ralplan/advisory-contract.js +83 -0
  190. package/dist/ralplan/advisory-contract.js.map +1 -0
  191. package/dist/ralplan/advisory-detached-transition.d.ts +11 -0
  192. package/dist/ralplan/advisory-detached-transition.d.ts.map +1 -0
  193. package/dist/ralplan/advisory-detached-transition.js +21 -0
  194. package/dist/ralplan/advisory-detached-transition.js.map +1 -0
  195. package/dist/ralplan/advisory-evidence.d.ts +91 -0
  196. package/dist/ralplan/advisory-evidence.d.ts.map +1 -0
  197. package/dist/ralplan/advisory-evidence.js +393 -0
  198. package/dist/ralplan/advisory-evidence.js.map +1 -0
  199. package/dist/ralplan/advisory-lifecycle-validation.d.ts +11 -0
  200. package/dist/ralplan/advisory-lifecycle-validation.d.ts.map +1 -0
  201. package/dist/ralplan/advisory-lifecycle-validation.js +72 -0
  202. package/dist/ralplan/advisory-lifecycle-validation.js.map +1 -0
  203. package/dist/ralplan/advisory-postconditions.d.ts +3 -0
  204. package/dist/ralplan/advisory-postconditions.d.ts.map +1 -0
  205. package/dist/ralplan/advisory-postconditions.js +33 -0
  206. package/dist/ralplan/advisory-postconditions.js.map +1 -0
  207. package/dist/ralplan/advisory-recovery-journal.d.ts +56 -0
  208. package/dist/ralplan/advisory-recovery-journal.d.ts.map +1 -0
  209. package/dist/ralplan/advisory-recovery-journal.js +136 -0
  210. package/dist/ralplan/advisory-recovery-journal.js.map +1 -0
  211. package/dist/ralplan/advisory-storage.d.ts +24 -0
  212. package/dist/ralplan/advisory-storage.d.ts.map +1 -0
  213. package/dist/ralplan/advisory-storage.js +106 -0
  214. package/dist/ralplan/advisory-storage.js.map +1 -0
  215. package/dist/ralplan/advisory.d.ts +99 -0
  216. package/dist/ralplan/advisory.d.ts.map +1 -0
  217. package/dist/ralplan/advisory.js +914 -0
  218. package/dist/ralplan/advisory.js.map +1 -0
  219. package/dist/ralplan/documented-leader-preflight.d.ts +8 -0
  220. package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -1
  221. package/dist/ralplan/documented-leader-preflight.js +60 -2
  222. package/dist/ralplan/documented-leader-preflight.js.map +1 -1
  223. package/dist/ralplan/runtime-advisory-lifecycle.d.ts +74 -0
  224. package/dist/ralplan/runtime-advisory-lifecycle.d.ts.map +1 -0
  225. package/dist/ralplan/runtime-advisory-lifecycle.js +352 -0
  226. package/dist/ralplan/runtime-advisory-lifecycle.js.map +1 -0
  227. package/dist/ralplan/runtime-contract.d.ts +126 -0
  228. package/dist/ralplan/runtime-contract.d.ts.map +1 -0
  229. package/dist/ralplan/runtime-contract.js +2 -0
  230. package/dist/ralplan/runtime-contract.js.map +1 -0
  231. package/dist/ralplan/runtime.d.ts +6 -109
  232. package/dist/ralplan/runtime.d.ts.map +1 -1
  233. package/dist/ralplan/runtime.js +174 -56
  234. package/dist/ralplan/runtime.js.map +1 -1
  235. package/dist/scripts/__tests__/postinstall.test.js +26 -0
  236. package/dist/scripts/__tests__/postinstall.test.js.map +1 -1
  237. package/dist/scripts/__tests__/ralplan-advisory-hook.test.d.ts +2 -0
  238. package/dist/scripts/__tests__/ralplan-advisory-hook.test.d.ts.map +1 -0
  239. package/dist/scripts/__tests__/ralplan-advisory-hook.test.js +299 -0
  240. package/dist/scripts/__tests__/ralplan-advisory-hook.test.js.map +1 -0
  241. package/dist/scripts/__tests__/smoke-packed-install.test.js +102 -8
  242. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
  243. package/dist/scripts/codex-native-hook.d.ts +20 -0
  244. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  245. package/dist/scripts/codex-native-hook.js +226 -15
  246. package/dist/scripts/codex-native-hook.js.map +1 -1
  247. package/dist/scripts/postinstall.d.ts +7 -0
  248. package/dist/scripts/postinstall.d.ts.map +1 -1
  249. package/dist/scripts/postinstall.js +40 -0
  250. package/dist/scripts/postinstall.js.map +1 -1
  251. package/dist/scripts/smoke-packed-install.d.ts +21 -5
  252. package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
  253. package/dist/scripts/smoke-packed-install.js +157 -57
  254. package/dist/scripts/smoke-packed-install.js.map +1 -1
  255. package/dist/state/__tests__/mode-binding-lease.test.d.ts +2 -0
  256. package/dist/state/__tests__/mode-binding-lease.test.d.ts.map +1 -0
  257. package/dist/state/__tests__/mode-binding-lease.test.js +498 -0
  258. package/dist/state/__tests__/mode-binding-lease.test.js.map +1 -0
  259. package/dist/state/__tests__/operations.test.js +1 -0
  260. package/dist/state/__tests__/operations.test.js.map +1 -1
  261. package/dist/state/__tests__/pinned-atomic-file.test.d.ts +2 -0
  262. package/dist/state/__tests__/pinned-atomic-file.test.d.ts.map +1 -0
  263. package/dist/state/__tests__/pinned-atomic-file.test.js +438 -0
  264. package/dist/state/__tests__/pinned-atomic-file.test.js.map +1 -0
  265. package/dist/state/__tests__/skill-active-exact-session-transaction.test.d.ts +2 -0
  266. package/dist/state/__tests__/skill-active-exact-session-transaction.test.d.ts.map +1 -0
  267. package/dist/state/__tests__/skill-active-exact-session-transaction.test.js +179 -0
  268. package/dist/state/__tests__/skill-active-exact-session-transaction.test.js.map +1 -0
  269. package/dist/state/__tests__/skill-active.test.js +29 -1
  270. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  271. package/dist/state/mode-binding-lease-helper.d.ts +2 -0
  272. package/dist/state/mode-binding-lease-helper.d.ts.map +1 -0
  273. package/dist/state/mode-binding-lease-helper.js +623 -0
  274. package/dist/state/mode-binding-lease-helper.js.map +1 -0
  275. package/dist/state/mode-binding-lease.d.ts +25 -0
  276. package/dist/state/mode-binding-lease.d.ts.map +1 -0
  277. package/dist/state/mode-binding-lease.js +380 -0
  278. package/dist/state/mode-binding-lease.js.map +1 -0
  279. package/dist/state/operations.d.ts +29 -1
  280. package/dist/state/operations.d.ts.map +1 -1
  281. package/dist/state/operations.js +203 -122
  282. package/dist/state/operations.js.map +1 -1
  283. package/dist/state/pinned-atomic-file-darwin-client.d.ts +34 -0
  284. package/dist/state/pinned-atomic-file-darwin-client.d.ts.map +1 -0
  285. package/dist/state/pinned-atomic-file-darwin-client.js +174 -0
  286. package/dist/state/pinned-atomic-file-darwin-client.js.map +1 -0
  287. package/dist/state/pinned-atomic-file-darwin-helper.d.ts +2 -0
  288. package/dist/state/pinned-atomic-file-darwin-helper.d.ts.map +1 -0
  289. package/dist/state/pinned-atomic-file-darwin-helper.js +275 -0
  290. package/dist/state/pinned-atomic-file-darwin-helper.js.map +1 -0
  291. package/dist/state/pinned-atomic-file-darwin-janitor.d.ts +2 -0
  292. package/dist/state/pinned-atomic-file-darwin-janitor.d.ts.map +1 -0
  293. package/dist/state/pinned-atomic-file-darwin-janitor.js +272 -0
  294. package/dist/state/pinned-atomic-file-darwin-janitor.js.map +1 -0
  295. package/dist/state/pinned-atomic-file.d.ts +29 -0
  296. package/dist/state/pinned-atomic-file.d.ts.map +1 -0
  297. package/dist/state/pinned-atomic-file.js +536 -0
  298. package/dist/state/pinned-atomic-file.js.map +1 -0
  299. package/dist/state/process-identity.d.ts +30 -0
  300. package/dist/state/process-identity.d.ts.map +1 -0
  301. package/dist/state/process-identity.js +99 -0
  302. package/dist/state/process-identity.js.map +1 -0
  303. package/dist/state/skill-active.d.ts +18 -1
  304. package/dist/state/skill-active.d.ts.map +1 -1
  305. package/dist/state/skill-active.js +82 -5
  306. package/dist/state/skill-active.js.map +1 -1
  307. package/dist/state/workflow-transition-reconcile.js +1 -1
  308. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  309. package/dist/team/__tests__/tmux-session.test.js +109 -0
  310. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  311. package/dist/team/tmux-session.d.ts.map +1 -1
  312. package/dist/team/tmux-session.js +10 -1
  313. package/dist/team/tmux-session.js.map +1 -1
  314. package/dist/utils/__tests__/file-durability.test.js +20 -0
  315. package/dist/utils/__tests__/file-durability.test.js.map +1 -1
  316. package/dist/utils/file-durability.d.ts +1 -1
  317. package/dist/utils/file-durability.d.ts.map +1 -1
  318. package/dist/utils/file-durability.js.map +1 -1
  319. package/dist/verification/__tests__/ci-rust-gates.test.js +12 -4
  320. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  321. package/dist/verification/__tests__/ci-trusted-publish.test.d.ts +2 -0
  322. package/dist/verification/__tests__/ci-trusted-publish.test.d.ts.map +1 -0
  323. package/dist/verification/__tests__/ci-trusted-publish.test.js +205 -0
  324. package/dist/verification/__tests__/ci-trusted-publish.test.js.map +1 -0
  325. package/dist/verification/__tests__/explore-harness-release-workflow.test.js +10 -5
  326. package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
  327. package/dist/verification/__tests__/publish-npm-manual-retired.test.d.ts +2 -0
  328. package/dist/verification/__tests__/publish-npm-manual-retired.test.d.ts.map +1 -0
  329. package/dist/verification/__tests__/publish-npm-manual-retired.test.js +22 -0
  330. package/dist/verification/__tests__/publish-npm-manual-retired.test.js.map +1 -0
  331. package/package.json +1 -1
  332. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  333. package/plugins/oh-my-codex/skills/doctor/SKILL.md +1 -1
  334. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
  335. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +10 -1
  336. package/plugins/oh-my-codex/skills/team/SKILL.md +2 -0
  337. package/skills/doctor/SKILL.md +1 -1
  338. package/skills/omx-setup/SKILL.md +1 -1
  339. package/skills/ralplan/SKILL.md +10 -1
  340. package/skills/team/SKILL.md +2 -0
  341. package/src/scripts/__tests__/postinstall.test.ts +28 -0
  342. package/src/scripts/__tests__/ralplan-advisory-hook.test.ts +320 -0
  343. package/src/scripts/__tests__/smoke-packed-install.test.ts +120 -7
  344. package/src/scripts/codex-native-hook.ts +220 -10
  345. package/src/scripts/postinstall.ts +46 -0
  346. package/src/scripts/smoke-packed-install.ts +175 -70
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detached-launch-diagnostics-3578.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/detached-launch-diagnostics-3578.test.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { join, dirname } from 'node:path';
6
6
  import { randomUUID } from 'node:crypto';
7
7
  import { fileURLToPath } from 'node:url';
8
8
  import { describe, it } from 'node:test';
9
- import { applyDetachedTerminalExitStatus, buildDetachedSessionBootstrapSteps, DETACHED_LEADER_READY_TIMEOUT_MS, cleanupDetachedPreReportSession, cleanupDetachedHudPane, decodeDetachedLeaderPayload, describeDetachedLeaderFailure, discoverDetachedHudAuthority, publishDetachedReleaseMarker, parseDetachedLeaderPaneIdByPid, isDetachedReadyReportAuthorized, probeExactDetachedSessionExists, resolveDetachedAttachExitStatus, } from '../index.js';
9
+ import { applyDetachedTerminalExitStatus, buildDetachedSessionBootstrapSteps, DETACHED_LEADER_READY_TIMEOUT_MS, cleanupDetachedPreReportSession, cleanupDetachedHudPane, cleanupFinalizedDetachedHud, decodeDetachedLeaderPayload, describeDetachedLeaderFailure, publishDetachedReleaseMarker, parseDetachedLeaderPaneIdByPid, isDetachedReadyReportAuthorized, probeExactDetachedSessionExists, resolveDetachedAttachExitStatus, } from '../index.js';
10
10
  import { isRealTmuxAvailable, tmuxSessionExists, withTempTmuxSession } from '../../team/__tests__/tmux-test-fixture.js';
11
11
  const TEST_TIMEOUT_MS = 45_000;
12
12
  const POLL_INTERVAL_MS = 50;
@@ -46,6 +46,18 @@ async function readReportWhen(path, predicate) {
46
46
  function paneExists(fixture, paneId) {
47
47
  return fixture.run(['list-panes', '-a', '-F', '#{pane_id}']).split('\n').includes(paneId);
48
48
  }
49
+ function createOwnedHud(fixture, ownerId) {
50
+ const operationMarker = randomUUID();
51
+ const [paneId, panePidRaw, sessionName, sessionId, sessionCreated, windowId] = fixture.run([
52
+ 'split-window', '-d', '-P', '-F', '#{pane_id}\t#{pane_pid}\t#{session_name}\t#{session_id}\t#{session_created}\t#{window_id}',
53
+ '-t', fixture.sessionName, `env OMX_DETACHED_HUD_OPERATION=${operationMarker} sleep 120`,
54
+ ]).trim().split('\t');
55
+ const panePid = Number(panePidRaw);
56
+ assert.ok(paneId && sessionName && sessionId && sessionCreated && windowId);
57
+ assert.equal(Number.isSafeInteger(panePid) && panePid > 0, true);
58
+ fixture.run(['set-option', '-pq', '-t', paneId, '@omx_hud_owner', ownerId]);
59
+ return { paneId, panePid, sessionName, sessionId, sessionCreated, windowId, operationMarker };
60
+ }
49
61
  function assertProcessDead(pid) {
50
62
  assert.throws(() => process.kill(pid, 0), (error) => error.code === 'ESRCH');
51
63
  }
@@ -93,20 +105,25 @@ async function startDetachedLeader(fixture, wd, sessionName, sessionId, nonce, f
93
105
  const operationMarker = randomUUID();
94
106
  const splitArgs = [...splitHud.args];
95
107
  splitArgs[splitArgs.length - 1] = `env OMX_DETACHED_HUD_OPERATION=${operationMarker} ${splitArgs.at(-1)}`;
96
- const hudPaneId = fixture.run(splitArgs);
97
- const [paneId, panePidRaw, hudSessionId, windowId] = fixture.run([
98
- 'display-message', '-p', '-t', hudPaneId, '#{pane_id}\t#{pane_pid}\t#{session_id}\t#{window_id}',
99
- ]).split('\t');
108
+ const splitFormatIndex = splitArgs.indexOf('-F');
109
+ assert.ok(splitFormatIndex >= 0 && splitArgs[splitFormatIndex + 1] === '#{pane_id}');
110
+ splitArgs[splitFormatIndex + 1] = '#{pane_id}\t#{pane_pid}\t#{session_name}\t#{session_id}\t#{session_created}\t#{window_id}\tRECEIPT';
111
+ const splitReceipt = fixture.run(splitArgs).trim().split('\t');
112
+ assert.equal(splitReceipt.length, 7, 'the HUD split must return the seven-field production receipt');
113
+ const [paneId, panePidRaw, hudSessionName, hudSessionId, sessionCreated, windowId, observedReceipt] = splitReceipt;
114
+ assert.match(observedReceipt ?? '', /^RECEIPT$/, 'the HUD split receipt must terminate with the literal receipt marker');
100
115
  const panePid = Number(panePidRaw);
101
- assert.equal(paneId, hudPaneId);
102
116
  assert.equal(Number.isSafeInteger(panePid) && panePid > 0, true);
103
117
  assert.notEqual(windowId, '');
118
+ // The production split sink tags the created HUD pane with the session owner
119
+ // before any finalize step runs.
120
+ fixture.run(['set-option', '-pq', '-t', paneId, '@omx_hud_owner', sessionId]);
104
121
  const ready = await readReportWhen(releaseMarkerPath, (report) => report.kind === 'ready');
105
122
  assert.equal(ready.nonce, nonce);
106
123
  assert.equal(ready.sessionId, sessionId);
107
124
  assert.equal(ready.sessionName, sessionName);
108
125
  assert.equal(Number.isSafeInteger(ready.leaderPid) && ready.leaderPid > 0, true);
109
- const hud = { paneId, panePid, sessionId: hudSessionId, windowId, operationMarker };
126
+ const hud = { paneId, panePid, sessionName: hudSessionName, sessionId: hudSessionId, sessionCreated, windowId, operationMarker };
110
127
  publishDetachedReleaseMarker(releaseMarkerPath, nonce, sessionId, sessionName, ready.leaderPid, hud);
111
128
  return { releaseMarkerPath, leaderPaneId, hud };
112
129
  }
@@ -175,7 +192,7 @@ describe('detached leader HUD teardown', () => {
175
192
  assert.equal(isDetachedReadyReportAuthorized(report, { ...expected, shouldAttach: false }), true);
176
193
  assert.equal(isDetachedReadyReportAuthorized({ ...report, paneId: '%8' }, { ...expected, shouldAttach: false }), false);
177
194
  });
178
- it('cleans an exact retained dead pane without an owner tag and rejects changed topology', async (t) => {
195
+ it('cleans an exact retained dead pane with its owner tag and rejects changed identity', async (t) => {
179
196
  if (!skipUnlessTmux(t))
180
197
  return;
181
198
  await withTempTmuxSession(async (fixture) => {
@@ -189,15 +206,17 @@ describe('detached leader HUD teardown', () => {
189
206
  if (!sessionName || !sessionId || !sessionCreated || !windowId || !paneId || !Number.isSafeInteger(panePid)) {
190
207
  throw new Error('invalid retained-pane topology fixture');
191
208
  }
192
- fixture.runResult(['unset-option', '-t', fixture.sessionName, '@omx_instance_id']);
209
+ fixture.run(['set-option', '-t', fixture.sessionName, '@omx_instance_id', 'missing-owner-tag']);
193
210
  process.kill(panePid, 'SIGTERM');
194
211
  await poll('retained dead pane', () => fixture.run(['display-message', '-p', '-t', paneId, '#{pane_dead}']) === '1' ? true : undefined);
195
212
  const authority = {
196
213
  paneId, panePid, sessionName, sessionId, sessionCreated, windowId,
197
214
  windowIndex: '0', ownerId: 'missing-owner-tag',
198
215
  };
199
- assert.throws(() => cleanupDetachedPreReportSession({ ...authority, windowId: '@999999' }), /topology changed before cleanup/);
216
+ fixture.run(['set-option', '-t', fixture.sessionName, '@omx_instance_id', 'foreign-owner']);
217
+ assert.throws(() => cleanupDetachedPreReportSession(authority), /topology changed before cleanup/);
200
218
  assert.equal(fixture.sessionExists(sessionName), true);
219
+ fixture.run(['set-option', '-t', fixture.sessionName, '@omx_instance_id', authority.ownerId]);
201
220
  cleanupDetachedPreReportSession(authority);
202
221
  await poll('pre-report session destruction', () => !fixture.sessionExists(sessionName) ? true : undefined);
203
222
  });
@@ -209,18 +228,11 @@ describe('detached leader HUD teardown', () => {
209
228
  const [leaderPaneId, leaderPidRaw] = fixture.run([
210
229
  'display-message', '-p', '-t', fixture.sessionName, '#{pane_id}\t#{pane_pid}',
211
230
  ]).split('\t');
212
- const [paneId, panePidRaw, sessionId, windowId] = fixture.run([
213
- 'split-window', '-d', '-P', '-F', '#{pane_id}\t#{pane_pid}\t#{session_id}\t#{window_id}',
214
- '-t', fixture.sessionName, 'sleep 120',
215
- ]).split('\t');
216
- if (!leaderPaneId || !paneId || !sessionId || !windowId)
231
+ const hud = createOwnedHud(fixture, 'owner-zero');
232
+ if (!leaderPaneId)
217
233
  throw new Error('invalid HUD teardown fixture');
218
- fixture.run(['set-option', '-pq', '-t', paneId, '@omx_hud_owner', 'owner-zero']);
219
- const discovered = discoverDetachedHudAuthority(fixture.sessionName, 'owner-zero');
220
- assert.equal(discovered?.paneId, paneId);
221
- assert.equal(discovered?.panePid, Number(panePidRaw));
222
- cleanupDetachedHudPane({ paneId, panePid: Number(panePidRaw), sessionId, windowId, operationMarker: randomUUID() }, 'owner-zero');
223
- await poll('proven HUD pane removal', () => !fixture.run(['list-panes', '-a', '-F', '#{pane_id}']).split('\n').includes(paneId) ? true : undefined);
234
+ assert.equal(cleanupDetachedHudPane(hud, 'owner-zero'), true);
235
+ await poll('proven HUD pane removal', () => !fixture.run(['list-panes', '-a', '-F', '#{pane_id}']).split('\n').includes(hud.paneId) ? true : undefined);
224
236
  process.kill(Number(leaderPidRaw), 'SIGTERM');
225
237
  await poll('last-pane session destruction', () => !fixture.sessionExists() ? true : undefined);
226
238
  });
@@ -228,29 +240,175 @@ describe('detached leader HUD teardown', () => {
228
240
  const [, leaderPidRaw] = fixture.run([
229
241
  'display-message', '-p', '-t', fixture.sessionName, '#{pane_id}\t#{pane_pid}',
230
242
  ]).split('\t');
231
- const [paneId, panePidRaw, sessionId, windowId] = fixture.run([
232
- 'split-window', '-d', '-P', '-F', '#{pane_id}\t#{pane_pid}\t#{session_id}\t#{window_id}',
233
- '-t', fixture.sessionName, 'sleep 120',
234
- ]).split('\t');
235
243
  const userPaneId = fixture.run([
236
244
  'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
237
245
  ]);
238
- if (!paneId || !sessionId || !windowId)
239
- throw new Error('invalid unrelated-pane fixture');
240
- fixture.run(['set-option', '-pq', '-t', paneId, '@omx_hud_owner', 'owner-user-pane']);
241
- assert.equal(discoverDetachedHudAuthority(fixture.sessionName, 'owner-user-pane')?.paneId, paneId);
242
- const staleHudProof = { paneId, panePid: Number(panePidRaw), sessionId, windowId, operationMarker: randomUUID() };
243
- cleanupDetachedHudPane(staleHudProof, 'owner-user-pane');
246
+ const staleHudProof = createOwnedHud(fixture, 'owner-user-pane');
247
+ assert.equal(cleanupDetachedHudPane(staleHudProof, 'owner-user-pane'), true);
244
248
  const replacementPaneId = fixture.run([
245
249
  'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
246
250
  ]);
247
- assert.throws(() => cleanupDetachedHudPane(staleHudProof, 'owner-user-pane'));
251
+ // A stale proof must be an ordinary fail-closed preserve, never a throw.
252
+ assert.equal(cleanupDetachedHudPane(staleHudProof, 'owner-user-pane'), false, 'a stale proof must fail closed as a boolean false');
248
253
  assert.equal(fixture.run(['display-message', '-p', '-t', replacementPaneId, '#{pane_id}']), replacementPaneId);
249
254
  process.kill(Number(leaderPidRaw), 'SIGTERM');
250
255
  await poll('unrelated pane survives leader exit', () => fixture.sessionExists() ? true : undefined);
251
256
  assert.equal(fixture.run(['display-message', '-p', '-t', userPaneId, '#{pane_id}']), userPaneId);
252
257
  });
253
258
  });
259
+ it('treats a stale or missing HUD proof target as an ordinary preserved mismatch without destroying the server', async (t) => {
260
+ if (!skipUnlessTmux(t))
261
+ return;
262
+ // Stale proof after the proven HUD was already removed and the pane id was
263
+ // replaced by a new pane. The stale `-t %N` target must resolve to an
264
+ // ordinary fail-closed preserve result: no throw, no server/session loss,
265
+ // and no harm to the replacement or foreign panes.
266
+ await withTempTmuxSession(async (fixture) => {
267
+ const [, leaderPidRaw] = fixture.run([
268
+ 'display-message', '-p', '-t', fixture.sessionName, '#{pane_id}\t#{pane_pid}',
269
+ ]).split('\t');
270
+ const userPaneId = fixture.run([
271
+ 'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
272
+ ]);
273
+ const staleHudProof = createOwnedHud(fixture, 'stale-proof-owner');
274
+ assert.equal(cleanupDetachedHudPane(staleHudProof, 'stale-proof-owner'), true);
275
+ await poll('proven HUD removal', () => !paneExists(fixture, staleHudProof.paneId) ? true : undefined);
276
+ const replacementPaneId = fixture.run([
277
+ 'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
278
+ ]);
279
+ assert.equal(cleanupDetachedHudPane(staleHudProof, 'stale-proof-owner'), false, 'a stale proof must fail closed as a boolean false');
280
+ assert.doesNotThrow(() => cleanupDetachedHudPane(staleHudProof, 'stale-proof-owner'));
281
+ assert.equal(paneExists(fixture, replacementPaneId), true, 'the replacement pane must survive a stale proof');
282
+ assert.equal(fixture.sessionExists(), true, 'the private fixture session must survive a stale proof');
283
+ assert.equal(fixture.run(['display-message', '-p', '-t', userPaneId, '#{pane_id}']), userPaneId);
284
+ process.kill(Number(leaderPidRaw), 'SIGTERM');
285
+ });
286
+ // Missing proof target: the proof pane id no longer exists anywhere.
287
+ await withTempTmuxSession(async (fixture) => {
288
+ const missingProof = createOwnedHud(fixture, 'missing-proof-owner');
289
+ assert.equal(cleanupDetachedHudPane(missingProof, 'missing-proof-owner'), true);
290
+ await poll('proven HUD removal', () => !paneExists(fixture, missingProof.paneId) ? true : undefined);
291
+ const ghostProof = { ...missingProof, paneId: '%999999' };
292
+ assert.equal(cleanupDetachedHudPane(ghostProof, 'missing-proof-owner'), false, 'a missing proof target must fail closed as a boolean false');
293
+ assert.equal(fixture.sessionExists(), true, 'the private fixture session must survive a missing proof target');
294
+ });
295
+ });
296
+ it('preserves the tmux server, leader, replacement pane, and foreign session across a stale HUD proof attack', async (t) => {
297
+ if (!skipUnlessTmux(t))
298
+ return;
299
+ const fixtureServer = await withTempTmuxSession(async (fixture) => {
300
+ const [leaderPaneId, leaderPidRaw] = fixture.run([
301
+ 'display-message', '-p', '-t', fixture.sessionName, '#{pane_id}\t#{pane_pid}',
302
+ ]).split('\t');
303
+ const staleProof = createOwnedHud(fixture, 'attack-owner');
304
+ // Remove the proven HUD and let its pane id be recycled by a replacement pane.
305
+ assert.equal(cleanupDetachedHudPane(staleProof, 'attack-owner'), true);
306
+ await poll('proven HUD removal', () => !paneExists(fixture, staleProof.paneId) ? true : undefined);
307
+ const replacementPaneId = fixture.run([
308
+ 'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', fixture.sessionName, 'sleep 120',
309
+ ]);
310
+ const foreignSessionName = `${fixture.sessionName}-foreign`;
311
+ fixture.run(['new-session', '-d', '-s', foreignSessionName, '-c', fixture.sessionName, 'sleep 120']);
312
+ // The stale proof must fail closed without killing the server, session, or panes.
313
+ assert.equal(cleanupDetachedHudPane(staleProof, 'attack-owner'), false, 'a stale proof must fail closed as a boolean false');
314
+ assert.equal(fixture.sessionExists(), true, 'leader session must survive');
315
+ assert.equal(tmuxSessionExists(foreignSessionName, fixture.serverName), true, 'foreign session must survive');
316
+ assert.equal(paneExists(fixture, leaderPaneId), true, 'leader pane must survive');
317
+ assert.equal(paneExists(fixture, replacementPaneId), true, 'replacement pane must survive');
318
+ // The server must still be reachable for ordinary commands after the attack.
319
+ assert.ok(fixture.run(['list-sessions', '-F', '#{session_name}']).includes(fixture.sessionName));
320
+ return fixture.serverName;
321
+ });
322
+ // Server liveness must persist past the fixture scope: the cleanup kill-server
323
+ // in withTempTmuxSession proves termination is fixture-owned, not attack-owned.
324
+ assert.ok(typeof fixtureServer === 'string');
325
+ });
326
+ it('preserves the leader, session, and foreign panes across normal child-exit teardown with a recycled HUD proof', async (t) => {
327
+ if (!skipUnlessTmux(t))
328
+ return;
329
+ const wd = mkdtempSync(join(tmpdir(), 'omx-detached-leader-stale-seam-'));
330
+ // This subtest preserves every leader-session pane (remain-on-exit keeps the
331
+ // dead leader visible), so the HUD watcher keeps running until fixture teardown.
332
+ let hudPanePid;
333
+ try {
334
+ await withTempTmuxSession(async (fixture) => {
335
+ const sessionName = 'omx-detached-stale-seam';
336
+ const sessionId = 'detached-stale-seam-session';
337
+ const sentinel = join(wd, 'child-release');
338
+ // The child blocks on a sentinel so the HUD proof can be recycled before
339
+ // the leader reaches normal child-exit teardown.
340
+ const fakeChild = writeChild(wd, 'while [ ! -f child-release ]; do sleep 0.1; done\nexit 0');
341
+ const started = await startDetachedLeader(fixture, wd, sessionName, sessionId, 'stale-seam-nonce', fakeChild);
342
+ hudPanePid = started.hud.panePid;
343
+ // Retain the dead leader pane: with remain-on-exit on, an executed
344
+ // `kill-pane -t leaderPaneId` destroys the pane (and the session when it
345
+ // is the last one), while a preserved zero-mutation teardown leaves it
346
+ // visible as dead. This makes the leader kill observable even after the
347
+ // leader process has exited normally.
348
+ fixture.run(['set-option', '-t', sessionName, 'remain-on-exit', 'on']);
349
+ // Remove the proven HUD out from under the leader's retained proof and
350
+ // recycle its pane id, exactly like the stale-proof attack, then add a
351
+ // replacement pane and a foreign session that must all survive teardown.
352
+ assert.equal(cleanupDetachedHudPane(started.hud, sessionId), true);
353
+ await poll('proven HUD removal', () => !paneExists(fixture, started.hud.paneId) ? true : undefined);
354
+ const replacementPaneId = fixture.run([
355
+ 'split-window', '-d', '-P', '-F', '#{pane_id}', '-t', sessionName, '-c', wd, 'sleep 300',
356
+ ]);
357
+ const foreignSessionName = `${sessionName}-foreign`;
358
+ fixture.run(['new-session', '-d', '-s', foreignSessionName, '-c', wd, 'sleep 300']);
359
+ // Release the child into its normal exit and let the leader finalize.
360
+ writeFileSync(sentinel, 'released\n');
361
+ const terminal = await readReportWhen(started.releaseMarkerPath, (report) => report.kind === 'terminal');
362
+ assert.equal(terminal.finalized, true);
363
+ assert.equal(terminal.exitStatus, 0);
364
+ await poll('retained dead leader pane', () => fixture.run([
365
+ 'display-message', '-p', '-t', started.leaderPaneId, '#{pane_dead}',
366
+ ]) === '1' ? true : undefined);
367
+ // Fail-closed teardown: the recycled HUD proof must suppress the leader
368
+ // kill entirely, leaving the leader, session, and every bystander intact.
369
+ assert.equal(paneExists(fixture, started.leaderPaneId), true, 'the dead leader pane must be retained, not killed');
370
+ assert.equal(tmuxSessionExists(sessionName, fixture.serverName), true, 'the leader session must survive zero-mutation teardown');
371
+ assert.equal(paneExists(fixture, replacementPaneId), true, 'the replacement pane must survive zero-mutation teardown');
372
+ assert.equal(tmuxSessionExists(foreignSessionName, fixture.serverName), true, 'the foreign session must survive zero-mutation teardown');
373
+ assert.equal(fixture.sessionExists(), true, 'the private fixture session must survive zero-mutation teardown');
374
+ });
375
+ }
376
+ finally {
377
+ await cleanupDetachedWorkdir(wd, hudPanePid);
378
+ }
379
+ });
380
+ it('removes only the matching bootstrap HUD after a finalized leader failure', async (t) => {
381
+ if (!skipUnlessTmux(t))
382
+ return;
383
+ await withTempTmuxSession(async (fixture) => {
384
+ const ownerId = 'finalized-failure-owner';
385
+ const expected = createOwnedHud(fixture, ownerId);
386
+ assert.equal(cleanupFinalizedDetachedHud(expected, ownerId), true);
387
+ await poll('bootstrap HUD removal', () => !paneExists(fixture, expected.paneId) ? true : undefined);
388
+ });
389
+ });
390
+ it('preserves a bootstrap HUD when its proof or owner changes before finalized failure cleanup', async (t) => {
391
+ if (!skipUnlessTmux(t))
392
+ return;
393
+ const mutations = [
394
+ ['owner', (fixture, proof) => {
395
+ fixture.run(['set-option', '-pq', '-t', proof.paneId, '@omx_hud_owner', 'foreign-owner']);
396
+ return proof;
397
+ }],
398
+ ['pane PID', (_fixture, proof) => ({ ...proof, panePid: proof.panePid + 1 })],
399
+ ['session creation', (_fixture, proof) => ({ ...proof, sessionCreated: `${Number(proof.sessionCreated) + 1}` })],
400
+ ['window topology', (_fixture, proof) => ({ ...proof, windowId: '@999999' })],
401
+ ['operation marker', (_fixture, proof) => ({ ...proof, operationMarker: randomUUID() })],
402
+ ];
403
+ for (const [name, mutate] of mutations) {
404
+ await withTempTmuxSession(async (fixture) => {
405
+ const ownerId = `finalized-failure-${name}`;
406
+ const expected = createOwnedHud(fixture, ownerId);
407
+ assert.equal(cleanupFinalizedDetachedHud(mutate(fixture, expected), ownerId), false, name);
408
+ assert.equal(paneExists(fixture, expected.paneId), true, name);
409
+ });
410
+ }
411
+ });
254
412
  it('tears down the proven HUD pane and session after a zero-status child exit', async (t) => {
255
413
  if (!skipUnlessTmux(t))
256
414
  return;
@@ -261,10 +419,15 @@ describe('detached leader HUD teardown', () => {
261
419
  const sessionId = 'detached-zero-session';
262
420
  const fakeChild = writeChild(wd, 'sleep 1\nexit 0');
263
421
  const started = await startDetachedLeader(fixture, wd, sessionName, sessionId, 'zero-nonce', fakeChild);
422
+ // Retain the dead leader pane: the teardown must still kill it, proving
423
+ // the leader kill runs when and only when HUD cleanup succeeded.
424
+ fixture.run(['set-option', '-t', sessionName, 'remain-on-exit', 'on']);
264
425
  const terminal = await readReportWhen(started.releaseMarkerPath, (report) => report.kind === 'terminal');
265
426
  assert.equal(terminal.finalized, true);
266
427
  assert.equal(terminal.exitStatus, 0);
267
428
  await poll('leader pane removal', () => !paneExists(fixture, started.leaderPaneId) ? true : undefined);
429
+ // Under remain-on-exit retention, only the teardown's own leader
430
+ // kill-pane can destroy this pane: natural exit would retain it dead.
268
431
  await poll('HUD pane removal', () => !paneExists(fixture, started.hud.paneId) ? true : undefined);
269
432
  await poll('leader session destruction', () => !tmuxSessionExists(sessionName, fixture.serverName) ? true : undefined);
270
433
  await poll('HUD process exit', () => !processAlive(started.hud.panePid) ? true : undefined);
@@ -362,6 +525,80 @@ describe('detached leader HUD teardown', () => {
362
525
  await cleanupDetachedWorkdir(wd);
363
526
  }
364
527
  });
528
+ it('tears down the matching HUD and leader from a non-current window while preserving foreign windows and sessions', async (t) => {
529
+ if (!skipUnlessTmux(t))
530
+ return;
531
+ const wd = mkdtempSync(join(tmpdir(), 'omx-detached-leader-cross-window-'));
532
+ try {
533
+ await withTempTmuxSession(async (fixture) => {
534
+ const sessionName = 'omx-detached-cross-window';
535
+ const sessionId = 'detached-cross-window-session';
536
+ const sentinel = join(wd, 'child-release');
537
+ // Block the child on a sentinel so the session topology can change
538
+ // before the leader reaches normal child-exit teardown.
539
+ const fakeChild = writeChild(wd, 'while [ ! -f child-release ]; do sleep 0.1; done\nexit 0');
540
+ const started = await startDetachedLeader(fixture, wd, sessionName, sessionId, 'cross-window-nonce', fakeChild);
541
+ // Retain the dead leader pane so the leader kill stays observable under
542
+ // remain-on-exit even after the leader process exits normally.
543
+ fixture.run(['set-option', '-t', sessionName, 'remain-on-exit', 'on']);
544
+ // An attached user creates and selects another window in the leader
545
+ // session: the proven HUD stays in the original (now non-current)
546
+ // window while the session's current window moves to window 1.
547
+ const foreignWindowPaneId = fixture.run([
548
+ 'new-window', '-d', '-P', '-F', '#{pane_id}', '-t', `${sessionName}:`, '-c', wd, 'sleep 300',
549
+ ]);
550
+ fixture.run(['select-window', '-t', `${sessionName}:1`]);
551
+ assert.equal(fixture.run(['display-message', '-p', '-t', sessionName, '#{window_id}']), fixture.run(['display-message', '-p', '-t', foreignWindowPaneId, '#{window_id}']), 'the selected window must be the foreign window, not the HUD window');
552
+ assert.equal(fixture.run(['list-panes', '-t', sessionName, '-F', '#{pane_id}']).split('\n').includes(started.hud.paneId), false, 'a window-scoped listing must not see the HUD in the non-current window');
553
+ const foreignSessionName = `${sessionName}-foreign`;
554
+ fixture.run(['new-session', '-d', '-s', foreignSessionName, '-c', wd, 'sleep 300']);
555
+ // Release the child into its normal exit and let the leader finalize.
556
+ writeFileSync(sentinel, 'released\n');
557
+ const terminal = await readReportWhen(started.releaseMarkerPath, (report) => report.kind === 'terminal');
558
+ assert.equal(terminal.finalized, true);
559
+ assert.equal(terminal.exitStatus, 0);
560
+ // Session-wide proof enumeration must still authenticate the HUD in the
561
+ // non-current window, so teardown removes the HUD and the gated leader.
562
+ await poll('leader pane removal', () => !paneExists(fixture, started.leaderPaneId) ? true : undefined);
563
+ await poll('HUD pane removal', () => !paneExists(fixture, started.hud.paneId) ? true : undefined);
564
+ await poll('HUD process exit', () => !processAlive(started.hud.panePid) ? true : undefined);
565
+ assertProcessDead(started.hud.panePid);
566
+ // The user-added window keeps its live pane, so the leader session is
567
+ // deliberately preserved (#3266 contract): natural closure happens only
568
+ // when no other panes remain. The foreign window pane, the foreign
569
+ // session on the same server, and the private fixture session survive.
570
+ assert.equal(paneExists(fixture, foreignWindowPaneId), true, 'the foreign window pane must survive cross-window teardown');
571
+ assert.equal(tmuxSessionExists(sessionName, fixture.serverName), true, 'the leader session must survive with a preserved user pane');
572
+ assert.equal(tmuxSessionExists(foreignSessionName, fixture.serverName), true, 'the foreign session must survive cross-window teardown');
573
+ assert.equal(fixture.sessionExists(), true, 'the private fixture session must survive cross-window teardown');
574
+ });
575
+ }
576
+ finally {
577
+ await cleanupDetachedWorkdir(wd);
578
+ }
579
+ });
580
+ it('removes the proven HUD from a non-current window without harming an impostor pane in another window', async (t) => {
581
+ if (!skipUnlessTmux(t))
582
+ return;
583
+ await withTempTmuxSession(async (fixture) => {
584
+ const ownerId = 'cross-window-impostor-owner';
585
+ const expected = createOwnedHud(fixture, ownerId);
586
+ // Create an impostor pane in another window carrying the same operation
587
+ // marker text and the same owner tag but none of the proof's pane
588
+ // identity: it must not become an authority match, must not be harmed,
589
+ // and must not stop the exact proof from authorizing the real HUD.
590
+ const impostorWindowPaneId = fixture.run([
591
+ 'new-window', '-d', '-P', '-F', '#{pane_id}', '-t', `${fixture.sessionName}:`,
592
+ `env OMX_DETACHED_HUD_OPERATION=${expected.operationMarker} sleep 120`,
593
+ ]);
594
+ fixture.run(['set-option', '-pq', '-t', impostorWindowPaneId, '@omx_hud_owner', ownerId]);
595
+ fixture.run(['select-window', '-t', `${fixture.sessionName}:1`]);
596
+ assert.equal(fixture.run(['display-message', '-p', '-t', fixture.sessionName, '#{window_id}']), fixture.run(['display-message', '-p', '-t', impostorWindowPaneId, '#{window_id}']), 'the selected window must be the impostor window, not the HUD window');
597
+ assert.equal(cleanupDetachedHudPane(expected, ownerId), true, 'the exact proof must still authorize the real HUD');
598
+ await poll('proven HUD removal', () => !paneExists(fixture, expected.paneId) ? true : undefined);
599
+ assert.equal(paneExists(fixture, impostorWindowPaneId), true, 'the impostor pane in the other window must be preserved');
600
+ });
601
+ });
365
602
  it('applies only a matching finalized terminal exit status', () => {
366
603
  const wd = mkdtempSync(join(tmpdir(), 'omx-detached-exit-status-'));
367
604
  const path = join(wd, 'marker.release');
@@ -392,7 +629,7 @@ describe('detached leader HUD teardown', () => {
392
629
  it('publishes an optional HUD authority proof exactly', () => {
393
630
  const wd = mkdtempSync(join(tmpdir(), 'omx-detached-release-marker-'));
394
631
  const path = join(wd, 'marker.release');
395
- const hud = { paneId: '%1', panePid: 123, sessionId: '$1', windowId: '@1', operationMarker: 'operation' };
632
+ const hud = { paneId: '%1', panePid: 123, sessionName: 'session', sessionId: '$1', sessionCreated: '1', windowId: '@1', operationMarker: 'operation' };
396
633
  try {
397
634
  publishDetachedReleaseMarker(path, 'n', 's', 'sn', 456, hud);
398
635
  assert.deepEqual(JSON.parse(readFileSync(`${path}.release`, 'utf-8')), {