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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mode-binding-lease.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-binding-lease.test.d.ts","sourceRoot":"","sources":["../../../src/state/__tests__/mode-binding-lease.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,498 @@
1
+ import { afterEach, describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { spawn } from 'node:child_process';
4
+ import { existsSync } from 'node:fs';
5
+ import { mkdir, mkdtemp, readFile, readdir, rename, rm, stat, symlink, unlink, utimes, writeFile } from 'node:fs/promises';
6
+ import { tmpdir } from 'node:os';
7
+ import { join } from 'node:path';
8
+ import { startMode } from '../../modes/base.js';
9
+ import { __setStateOperationTestHooksForTests, executeStateOperation, withStateFileWriteTransaction, writeStateFile } from '../operations.js';
10
+ import { __setCanonicalModeBindingLeaseTestHooksForTests, resolveValidatedCanonicalModeBinding } from '../mode-binding-lease.js';
11
+ import { JsonChildClient } from '../pinned-atomic-file-darwin-client.js';
12
+ import { formatProcessOwnerToken, hashHistoricalProcessStartIdentity, parseProcessOwnerToken, readHistoricalProcessStartIdentity, readProcessStartIdentity, } from '../process-identity.js';
13
+ const roots = [];
14
+ const operationsModuleUrl = new URL('../operations.js', import.meta.url).href;
15
+ async function runTransactionProcess(path) {
16
+ const source = [
17
+ `import { withStateFileWriteTransaction } from ${JSON.stringify(operationsModuleUrl)};`,
18
+ 'await withStateFileWriteTransaction(process.argv[1], async () => undefined);',
19
+ ].join('\n');
20
+ const child = spawn(process.execPath, ['--input-type=module', '--eval', source, path], {
21
+ stdio: ['ignore', 'ignore', 'pipe'], windowsHide: true,
22
+ });
23
+ let stderr = '';
24
+ child.stderr.setEncoding('utf8');
25
+ child.stderr.on('data', (chunk) => { stderr += chunk; });
26
+ const result = await new Promise((resolveExit) => {
27
+ child.once('exit', (code, signal) => resolveExit({ code, signal }));
28
+ });
29
+ assert.deepEqual(result, { code: 0, signal: null }, stderr);
30
+ }
31
+ afterEach(async () => {
32
+ __setStateOperationTestHooksForTests({});
33
+ __setCanonicalModeBindingLeaseTestHooksForTests({});
34
+ delete process.env.OMX_TEST_MODE_BINDING_RECLAIM_CRASH_PHASE;
35
+ delete process.env.OMX_TEST_MODE_BINDING_RECLAIM_CRASH_SENTINEL;
36
+ await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
37
+ });
38
+ describe('canonical mode binding lease', () => {
39
+ it('uses a longer initialization timeout without weakening later request timeouts', async () => {
40
+ const source = [
41
+ "process.stdin.resume();",
42
+ "setTimeout(() => process.stdout.write(JSON.stringify({ id: 0, ok: true, ready: true }) + '\\n'), 60);",
43
+ ].join('\n');
44
+ const child = spawn(process.execPath, ['--eval', source], { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true });
45
+ const client = new JsonChildClient(child, 'timeout-scope-test');
46
+ await client.initialize({ timeoutMs: 250 });
47
+ const started = Date.now();
48
+ await assert.rejects(client.request({ op: 'ignored' }, { timeoutMs: 40 }), /request timed out/);
49
+ assert.ok(Date.now() - started < 500);
50
+ await client.close();
51
+ });
52
+ it('clean release is ownerless and the next acquire does not depend on the prior PID', async () => {
53
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-clean-release-'));
54
+ roots.push(cwd);
55
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
56
+ await withStateFileWriteTransaction(path, async () => undefined);
57
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
58
+ assert.deepEqual(await readdir(lockPath), []);
59
+ let ran = false;
60
+ await withStateFileWriteTransaction(path, async () => { ran = true; });
61
+ assert.equal(ran, true);
62
+ assert.deepEqual(await readdir(lockPath), []);
63
+ });
64
+ it('does not steal a valid owner whose foreign PID is still live', async () => {
65
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-live-foreign-owner-'));
66
+ roots.push(cwd);
67
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
68
+ await withStateFileWriteTransaction(path, async () => undefined);
69
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
70
+ const liveToken = `${process.pid}-${Date.now()}-${'9'.repeat(24)}`;
71
+ const liveOwner = join(lockPath, `owner-${liveToken}`);
72
+ await writeFile(liveOwner, liveToken);
73
+ let ran = false;
74
+ const contender = withStateFileWriteTransaction(path, async () => { ran = true; });
75
+ await new Promise((resolveDelay) => setTimeout(resolveDelay, 150));
76
+ assert.equal(ran, false);
77
+ assert.equal(await readFile(liveOwner, 'utf8'), liveToken);
78
+ await unlink(liveOwner);
79
+ await contender;
80
+ assert.equal(ran, true);
81
+ assert.deepEqual(await readdir(lockPath), []);
82
+ });
83
+ it('parses legacy owners and emits v3 owners bound to process start identity', async () => {
84
+ const legacy = `${process.pid}-${Date.now()}-${'1'.repeat(24)}`;
85
+ assert.deepEqual(parseProcessOwnerToken(legacy), {
86
+ version: 'legacy', pid: process.pid, issuedAtMs: Number(legacy.split('-')[1]), nonce: '1'.repeat(24),
87
+ });
88
+ const identity = await readProcessStartIdentity(process.pid);
89
+ const token = formatProcessOwnerToken({ pid: process.pid, issuedAtMs: Date.now(), nonce: '2'.repeat(24), processStartIdentity: identity });
90
+ assert.equal(parseProcessOwnerToken(token)?.version, 'v3');
91
+ assert.match(token, /^v3-\d+-\d+-[0-9a-f]{24}-(?:[0-9a-f]{24}|unavailable)$/u);
92
+ });
93
+ for (const ownerCase of ['live', 'reused', 'dead', 'unavailable', 'dead-unavailable']) {
94
+ it(`${ownerCase === 'live' || ownerCase === 'unavailable' ? 'preserves' : 'reclaims'} a v3 ${ownerCase} owner`, async () => {
95
+ const cwd = await mkdtemp(join(tmpdir(), `omx-mode-lease-v3-${ownerCase}-`));
96
+ roots.push(cwd);
97
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
98
+ await withStateFileWriteTransaction(path, async () => undefined);
99
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
100
+ const liveIdentity = await readProcessStartIdentity(process.pid);
101
+ const pid = ownerCase === 'dead' || ownerCase === 'dead-unavailable' ? 99_999_999 : process.pid;
102
+ const processStartIdentity = ownerCase === 'reused' ? 'definitely-not-this-process'
103
+ : ownerCase === 'unavailable' || ownerCase === 'dead-unavailable' ? null : liveIdentity;
104
+ const token = formatProcessOwnerToken({
105
+ pid, issuedAtMs: Date.now() - 10_000, nonce: '3'.repeat(24), processStartIdentity,
106
+ });
107
+ const ownerPath = join(lockPath, `owner-${token}`);
108
+ await writeFile(ownerPath, token);
109
+ let ran = false;
110
+ const contender = withStateFileWriteTransaction(path, async () => { ran = true; });
111
+ if (ownerCase === 'live' || ownerCase === 'unavailable') {
112
+ await new Promise((resolveDelay) => setTimeout(resolveDelay, 150));
113
+ assert.equal(ran, false);
114
+ assert.equal(await readFile(ownerPath, 'utf8'), token);
115
+ await unlink(ownerPath);
116
+ }
117
+ await contender;
118
+ assert.equal(ran, true);
119
+ assert.deepEqual(await readdir(lockPath), []);
120
+ });
121
+ }
122
+ for (const ownerCase of ['live', 'reused', 'dead', 'unknown', 'dead-unknown']) {
123
+ it(`${ownerCase === 'live' || ownerCase === 'unknown' ? 'preserves' : 'reclaims'} a persisted historical v2 ${ownerCase} owner`, async () => {
124
+ const cwd = await mkdtemp(join(tmpdir(), `omx-mode-lease-historical-v2-${ownerCase}-`));
125
+ roots.push(cwd);
126
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
127
+ await withStateFileWriteTransaction(path, async () => undefined);
128
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
129
+ const pid = ownerCase === 'dead' || ownerCase === 'dead-unknown' ? 99_999_999 : process.pid;
130
+ const historicalIdentity = await readHistoricalProcessStartIdentity(process.pid);
131
+ const hash = ownerCase === 'unknown' || ownerCase === 'dead-unknown' ? 'unknown'
132
+ : ownerCase === 'reused' ? hashHistoricalProcessStartIdentity('different-process-start')
133
+ : ownerCase === 'dead' ? 'a'.repeat(16)
134
+ : historicalIdentity ? hashHistoricalProcessStartIdentity(historicalIdentity) : 'unknown';
135
+ const token = `v2-${pid}-${hash}-${Date.now() - 10_000}-${'4'.repeat(24)}`;
136
+ assert.equal(parseProcessOwnerToken(token)?.version, 'v2');
137
+ const ownerPath = join(lockPath, `owner-${token}`);
138
+ await writeFile(ownerPath, token);
139
+ let ran = false;
140
+ const contender = withStateFileWriteTransaction(path, async () => { ran = true; });
141
+ if (ownerCase === 'live' || ownerCase === 'unknown') {
142
+ await new Promise((resolveDelay) => setTimeout(resolveDelay, 150));
143
+ assert.equal(ran, false);
144
+ assert.equal(await readFile(ownerPath, 'utf8'), token);
145
+ await unlink(ownerPath);
146
+ }
147
+ await contender;
148
+ assert.equal(ran, true);
149
+ assert.deepEqual(await readdir(lockPath), []);
150
+ });
151
+ }
152
+ it('keeps persistent namespace identity evidence out of git worktree status', async () => {
153
+ const ignore = await readFile(join(process.cwd(), '.gitignore'), 'utf8');
154
+ assert.match(ignore, /^\.omx-state-locks\/\s*$/mu);
155
+ assert.match(ignore, /^\.omx-state-locks\.identity\.json\s*$/mu);
156
+ });
157
+ it('supports the authorized arbitrary OMX_TEAM_STATE_ROOT binding surface', async () => {
158
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-team-cwd-'));
159
+ const shared = await mkdtemp(join(tmpdir(), 'omx-mode-lease-team-root-'));
160
+ roots.push(cwd, shared);
161
+ const teamRoot = join(shared, 'team-state');
162
+ await mkdir(teamRoot);
163
+ const previous = [process.env.OMX_TEAM_STATE_ROOT, process.env.OMX_ROOT, process.env.OMX_STATE_ROOT];
164
+ try {
165
+ process.env.OMX_TEAM_STATE_ROOT = teamRoot;
166
+ delete process.env.OMX_ROOT;
167
+ delete process.env.OMX_STATE_ROOT;
168
+ await startMode('ralplan', 'team-root', 10, cwd, 'session-a');
169
+ const state = JSON.parse(await readFile(join(teamRoot, 'sessions', 'session-a', 'ralplan-state.json'), 'utf8'));
170
+ assert.equal(state.active, true);
171
+ }
172
+ finally {
173
+ for (const [key, value] of [['OMX_TEAM_STATE_ROOT', previous[0]], ['OMX_ROOT', previous[1]], ['OMX_STATE_ROOT', previous[2]]]) {
174
+ if (value === undefined)
175
+ delete process.env[key];
176
+ else
177
+ process.env[key] = value;
178
+ }
179
+ }
180
+ });
181
+ it('derives one structural root/session lease when an authorized root itself contains sessions components', async () => {
182
+ const parent = await mkdtemp(join(tmpdir(), 'omx-mode-lease-structural-root-'));
183
+ roots.push(parent);
184
+ const stateRoot = join(parent, 'sessions', 'outer', 'sessions', 'team-state');
185
+ await mkdir(stateRoot, { recursive: true });
186
+ const rootPath = join(stateRoot, 'ralplan-state.json');
187
+ const sessionPath = join(stateRoot, 'sessions', 'session-a', 'ralplan-state.json');
188
+ const rootBinding = await resolveValidatedCanonicalModeBinding(rootPath, stateRoot);
189
+ const sessionBinding = await resolveValidatedCanonicalModeBinding(sessionPath, stateRoot);
190
+ assert.equal(rootBinding.leasePath, sessionBinding.leasePath);
191
+ let concurrent = 0;
192
+ let maximum = 0;
193
+ const run = (path) => withStateFileWriteTransaction(path, async () => {
194
+ concurrent += 1;
195
+ maximum = Math.max(maximum, concurrent);
196
+ await new Promise((resolve) => setTimeout(resolve, 50));
197
+ concurrent -= 1;
198
+ }, stateRoot);
199
+ await Promise.all([run(rootPath), run(sessionPath)]);
200
+ assert.equal(maximum, 1);
201
+ });
202
+ it('supports authorized OMX_ROOT and OMX_STATE_ROOT boxed roots', async () => {
203
+ for (const selector of ['OMX_ROOT', 'OMX_STATE_ROOT']) {
204
+ const cwd = await mkdtemp(join(tmpdir(), `omx-mode-lease-${selector}-cwd-`));
205
+ const boxed = await mkdtemp(join(tmpdir(), `omx-mode-lease-${selector}-root-`));
206
+ roots.push(cwd, boxed);
207
+ const previous = [process.env.OMX_TEAM_STATE_ROOT, process.env.OMX_ROOT, process.env.OMX_STATE_ROOT];
208
+ try {
209
+ delete process.env.OMX_TEAM_STATE_ROOT;
210
+ delete process.env.OMX_ROOT;
211
+ delete process.env.OMX_STATE_ROOT;
212
+ process.env[selector] = boxed;
213
+ await startMode('ralplan', selector, 10, cwd, 'session-a');
214
+ const state = JSON.parse(await readFile(join(boxed, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json'), 'utf8'));
215
+ assert.equal(state.active, true);
216
+ }
217
+ finally {
218
+ for (const [key, value] of [['OMX_TEAM_STATE_ROOT', previous[0]], ['OMX_ROOT', previous[1]], ['OMX_STATE_ROOT', previous[2]]]) {
219
+ if (value === undefined)
220
+ delete process.env[key];
221
+ else
222
+ process.env[key] = value;
223
+ }
224
+ }
225
+ }
226
+ });
227
+ it('serializes symlink aliases under one canonical workspace identity', async () => {
228
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-alias-'));
229
+ const aliasRoot = await mkdtemp(join(tmpdir(), 'omx-mode-lease-alias-parent-'));
230
+ roots.push(cwd, aliasRoot);
231
+ const alias = join(aliasRoot, 'workspace');
232
+ await symlink(cwd, alias);
233
+ const direct = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
234
+ const throughAlias = join(alias, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
235
+ let concurrent = 0;
236
+ let maximum = 0;
237
+ const run = (path) => withStateFileWriteTransaction(path, async () => {
238
+ concurrent += 1;
239
+ maximum = Math.max(maximum, concurrent);
240
+ await new Promise((resolve) => setTimeout(resolve, 75));
241
+ concurrent -= 1;
242
+ });
243
+ await Promise.all([run(direct), run(throughAlias)]);
244
+ assert.equal(maximum, 1);
245
+ });
246
+ it('rejects traversal before creating a lease namespace or running work', async () => {
247
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-traversal-'));
248
+ roots.push(cwd);
249
+ const traversal = join(cwd, '.omx', 'state', 'sessions', '..', '..', 'foreign.json');
250
+ let ran = false;
251
+ await assert.rejects(withStateFileWriteTransaction(traversal, async () => { ran = true; }), /canonical \.omx\/state/);
252
+ assert.equal(ran, false);
253
+ assert.equal(existsSync(join(cwd, '.omx-state-locks')), false);
254
+ });
255
+ it('keeps standard sanctioned writers on the legacy local queue on unsupported platforms', async () => {
256
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-unsupported-'));
257
+ roots.push(cwd);
258
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
259
+ let ran = false;
260
+ __setCanonicalModeBindingLeaseTestHooksForTests({ platform: 'win32' });
261
+ await Promise.race([
262
+ withStateFileWriteTransaction(path, async () => {
263
+ await withStateFileWriteTransaction(path, async () => { ran = true; });
264
+ }),
265
+ new Promise((_, reject) => setTimeout(() => reject(new Error('nested fallback timed out')), 500)),
266
+ ]);
267
+ assert.equal(ran, true);
268
+ await startMode('team', 'win32 standard', 10, cwd, 'session-a');
269
+ const state = JSON.parse(await readFile(join(cwd, '.omx', 'state', 'sessions', 'session-a', 'team-state.json'), 'utf8'));
270
+ assert.equal(state.active, true);
271
+ assert.equal(existsSync(join(cwd, '.omx-state-locks')), false);
272
+ assert.equal(existsSync(join(cwd, '.omx-state-locks.identity.json')), false);
273
+ });
274
+ it('never reclaims an ambiguous lock owner', async () => {
275
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-ambiguous-'));
276
+ roots.push(cwd);
277
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
278
+ await withStateFileWriteTransaction(path, async () => undefined);
279
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
280
+ await writeFile(join(lockPath, 'foreign-metadata'), 'do-not-delete');
281
+ await assert.rejects(withStateFileWriteTransaction(path, async () => undefined), /owner ambiguous/);
282
+ assert.equal(await readFile(join(lockPath, 'foreign-metadata'), 'utf8'), 'do-not-delete');
283
+ });
284
+ it('recovers an old malformed partial owner only after pinning its inode', async () => {
285
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-partial-owner-'));
286
+ roots.push(cwd);
287
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
288
+ await withStateFileWriteTransaction(path, async () => undefined);
289
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
290
+ const deadToken = `99999999-${Date.now() - 10_000}-${'a'.repeat(24)}`;
291
+ const ownerPath = join(lockPath, `owner-${deadToken}`);
292
+ await writeFile(ownerPath, deadToken.slice(0, 12));
293
+ const stale = new Date(Date.now() - 10_000);
294
+ await utimes(ownerPath, stale, stale);
295
+ let ran = false;
296
+ await withStateFileWriteTransaction(path, async () => { ran = true; });
297
+ assert.equal(ran, true);
298
+ assert.deepEqual(await readdir(lockPath), []);
299
+ });
300
+ it('fails closed on old owner bytes that are not a published token prefix', async () => {
301
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-tampered-owner-'));
302
+ roots.push(cwd);
303
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
304
+ await withStateFileWriteTransaction(path, async () => undefined);
305
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
306
+ const deadToken = `99999999-${Date.now() - 10_000}-${'c'.repeat(24)}`;
307
+ const ownerPath = join(lockPath, `owner-${deadToken}`);
308
+ await writeFile(ownerPath, 'tampered');
309
+ const stale = new Date(Date.now() - 10_000);
310
+ await utimes(ownerPath, stale, stale);
311
+ let ran = false;
312
+ await assert.rejects(withStateFileWriteTransaction(path, async () => { ran = true; }), /owner ambiguous/);
313
+ assert.equal(ran, false);
314
+ assert.equal(await readFile(ownerPath, 'utf8'), 'tampered');
315
+ });
316
+ for (const phase of ['after-quarantine', 'after-successor-publish', 'before-cleanup']) {
317
+ it(`converges without stealing a live successor after SIGKILL ${phase}`, async () => {
318
+ const cwd = await mkdtemp(join(tmpdir(), `omx-mode-lease-reclaim-${phase}-`));
319
+ roots.push(cwd);
320
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
321
+ await withStateFileWriteTransaction(path, async () => undefined);
322
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
323
+ const deadToken = `99999999-${Date.now() - 10_000}-${'b'.repeat(24)}`;
324
+ const ownerPath = join(lockPath, `owner-${deadToken}`);
325
+ await writeFile(ownerPath, deadToken.slice(0, 7));
326
+ const stale = new Date(Date.now() - 10_000);
327
+ await utimes(ownerPath, stale, stale);
328
+ const sentinel = join(cwd, `${phase}.sentinel`);
329
+ process.env.OMX_TEST_MODE_BINDING_RECLAIM_CRASH_PHASE = phase;
330
+ process.env.OMX_TEST_MODE_BINDING_RECLAIM_CRASH_SENTINEL = sentinel;
331
+ await withStateFileWriteTransaction(path, async () => {
332
+ const entries = await readdir(lockPath);
333
+ assert.equal(entries.length, 1);
334
+ assert.match(entries[0], /^owner-v3-\d+-\d+-[0-9a-f]{24}-(?:[0-9a-f]{24}|unavailable)$/u);
335
+ const token = entries[0].slice('owner-'.length);
336
+ assert.equal(await readFile(join(lockPath, entries[0]), 'utf8'), token);
337
+ const parsed = parseProcessOwnerToken(token);
338
+ assert.ok(parsed);
339
+ assert.doesNotThrow(() => process.kill(parsed.pid, 0));
340
+ });
341
+ assert.equal(await readFile(sentinel, 'utf8'), phase);
342
+ assert.deepEqual(await readdir(lockPath), []);
343
+ });
344
+ }
345
+ it('converges quarantine-only state across repeated 20, 32, and 64 process stress', async () => {
346
+ for (const count of [20, 32, 64]) {
347
+ for (let round = 0; round < 2; round += 1) {
348
+ const cwd = await mkdtemp(join(tmpdir(), `omx-mode-lease-quarantine-${count}-${round}-`));
349
+ roots.push(cwd);
350
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
351
+ await withStateFileWriteTransaction(path, async () => undefined);
352
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
353
+ const deadToken = `99999999-${Date.now() - 10_000}-${'d'.repeat(24)}`;
354
+ const ownerPath = join(lockPath, `owner-${deadToken}`);
355
+ await writeFile(ownerPath, deadToken);
356
+ await rename(ownerPath, join(lockPath, `.owner-reclaim-${deadToken}`));
357
+ await Promise.all(Array.from({ length: count }, () => runTransactionProcess(path)));
358
+ assert.deepEqual(await readdir(lockPath), []);
359
+ }
360
+ }
361
+ });
362
+ it('recovers quarantine plus an aged dead partial successor', async () => {
363
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-partial-successor-'));
364
+ roots.push(cwd);
365
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
366
+ await withStateFileWriteTransaction(path, async () => undefined);
367
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
368
+ const displacedToken = `99999999-${Date.now() - 10_000}-${'e'.repeat(24)}`;
369
+ const successorToken = `99999998-${Date.now() - 10_000}-${'f'.repeat(24)}`;
370
+ await writeFile(join(lockPath, `.owner-reclaim-${displacedToken}`), displacedToken);
371
+ const partialPath = join(lockPath, `owner-${successorToken}`);
372
+ await writeFile(partialPath, successorToken.slice(0, 10));
373
+ const stale = new Date(Date.now() - 10_000);
374
+ await utimes(partialPath, stale, stale);
375
+ await withStateFileWriteTransaction(path, async () => undefined);
376
+ assert.deepEqual(await readdir(lockPath), []);
377
+ });
378
+ it('atomically repairs a partial namespace marker against the pinned namespace identity', async () => {
379
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-partial-marker-'));
380
+ roots.push(cwd);
381
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
382
+ const binding = await resolveValidatedCanonicalModeBinding(path);
383
+ await mkdir(binding.namespacePath);
384
+ const markerPath = `${binding.namespacePath}.identity.json`;
385
+ await writeFile(markerPath, '{"dev":');
386
+ await withStateFileWriteTransaction(path, async () => undefined);
387
+ const namespace = await stat(binding.namespacePath);
388
+ const marker = JSON.parse(await readFile(markerPath, 'utf8'));
389
+ assert.deepEqual(marker, { dev: namespace.dev, ino: namespace.ino });
390
+ });
391
+ it('fails closed without mutating an arbitrary malformed namespace marker', async () => {
392
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-tampered-marker-'));
393
+ roots.push(cwd);
394
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
395
+ const binding = await resolveValidatedCanonicalModeBinding(path);
396
+ await mkdir(binding.namespacePath);
397
+ const markerPath = `${binding.namespacePath}.identity.json`;
398
+ const tampered = '{"dev":"not-a-published-partial"';
399
+ await writeFile(markerPath, tampered);
400
+ await assert.rejects(withStateFileWriteTransaction(path, async () => undefined), /namespace marker malformed/);
401
+ assert.equal(await readFile(markerPath, 'utf8'), tampered);
402
+ });
403
+ it('initializes one canonical namespace marker across twenty processes', async () => {
404
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-marker-contenders-'));
405
+ roots.push(cwd);
406
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
407
+ const binding = await resolveValidatedCanonicalModeBinding(path);
408
+ await Promise.all(Array.from({ length: 20 }, () => runTransactionProcess(path)));
409
+ const namespace = await stat(binding.namespacePath);
410
+ const marker = await readFile(`${binding.namespacePath}.identity.json`, 'utf8');
411
+ assert.equal(marker, `${JSON.stringify({ dev: namespace.dev, ino: namespace.ino })}\n`);
412
+ });
413
+ it('rejects a lock-directory symlink swap without dereferencing or deleting the external owner', async () => {
414
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-lock-swap-'));
415
+ const external = await mkdtemp(join(tmpdir(), 'omx-mode-lease-lock-external-'));
416
+ roots.push(cwd, external);
417
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
418
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
419
+ const displaced = `${lockPath}.displaced`;
420
+ await writeFile(join(external, 'owner-external'), 'external');
421
+ await assert.rejects(withStateFileWriteTransaction(path, async () => {
422
+ await rename(lockPath, displaced);
423
+ await symlink(external, lockPath);
424
+ }), /lock ownership lost/);
425
+ assert.equal(await readFile(join(external, 'owner-external'), 'utf8'), 'external');
426
+ assert.equal((await readdir(displaced)).length, 1);
427
+ });
428
+ it('never follows a stale lock symlink while attempting reclaim', async () => {
429
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-stale-symlink-'));
430
+ const external = await mkdtemp(join(tmpdir(), 'omx-mode-lease-stale-external-'));
431
+ roots.push(cwd, external);
432
+ const path = join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json');
433
+ await withStateFileWriteTransaction(path, async () => undefined);
434
+ const lockPath = (await resolveValidatedCanonicalModeBinding(path)).leasePath;
435
+ await rm(lockPath, { recursive: true, force: true });
436
+ await writeFile(join(external, 'owner-external'), 'external');
437
+ await symlink(external, lockPath);
438
+ let ran = false;
439
+ await assert.rejects(withStateFileWriteTransaction(path, async () => { ran = true; }), /lock invalid/);
440
+ assert.equal(ran, false);
441
+ assert.equal(await readFile(join(external, 'owner-external'), 'utf8'), 'external');
442
+ });
443
+ it('rejects a state-root swap before a nested sanctioned write', async () => {
444
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-root-swap-'));
445
+ roots.push(cwd);
446
+ const stateRoot = join(cwd, '.omx', 'state');
447
+ const displaced = join(cwd, '.omx', 'state.displaced');
448
+ const path = join(stateRoot, 'sessions', 'session-a', 'ralplan-state.json');
449
+ await mkdir(join(stateRoot, 'sessions', 'session-a'), { recursive: true });
450
+ await assert.rejects(withStateFileWriteTransaction(path, async () => {
451
+ await rename(stateRoot, displaced);
452
+ await mkdir(join(stateRoot, 'sessions', 'session-a'), { recursive: true });
453
+ await writeStateFile(path, '{}');
454
+ }), /state root identity changed/);
455
+ assert.equal(existsSync(path), false);
456
+ assert.equal(existsSync(join(displaced, 'sessions', 'session-a', 'ralplan-state.json')), false);
457
+ });
458
+ it('serializes a new session start until session clear finishes all mirrors', async () => {
459
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-clear-'));
460
+ roots.push(cwd);
461
+ await startMode('ralplan', 'old', 10, cwd, 'session-a');
462
+ let successor;
463
+ __setStateOperationTestHooksForTests({
464
+ afterStateClearPrimary: () => {
465
+ successor ??= startMode('ralplan', 'successor', 10, cwd, 'session-a');
466
+ },
467
+ });
468
+ const cleared = await executeStateOperation('state_clear', {
469
+ workingDirectory: cwd, session_id: 'session-a', mode: 'ralplan',
470
+ });
471
+ assert.equal(cleared.isError, undefined);
472
+ await successor;
473
+ const state = JSON.parse(await readFile(join(cwd, '.omx', 'state', 'sessions', 'session-a', 'ralplan-state.json'), 'utf8'));
474
+ assert.equal(state.active, true);
475
+ assert.equal(state.task_description, 'successor');
476
+ });
477
+ it('uses the root lease as an umbrella across every session during all-sessions clear', async () => {
478
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mode-lease-clear-all-'));
479
+ roots.push(cwd);
480
+ await startMode('ralplan', 'session-a', 10, cwd, 'session-a');
481
+ await startMode('ralplan', 'session-b', 10, cwd, 'session-b');
482
+ let successor;
483
+ __setStateOperationTestHooksForTests({
484
+ afterStateClearPrimary: () => {
485
+ successor ??= startMode('ralplan', 'session-b-successor', 10, cwd, 'session-b');
486
+ },
487
+ });
488
+ const cleared = await executeStateOperation('state_clear', {
489
+ workingDirectory: cwd, mode: 'ralplan', all_sessions: true,
490
+ });
491
+ assert.equal(cleared.isError, undefined);
492
+ await successor;
493
+ const state = JSON.parse(await readFile(join(cwd, '.omx', 'state', 'sessions', 'session-b', 'ralplan-state.json'), 'utf8'));
494
+ assert.equal(state.active, true);
495
+ assert.equal(state.task_description, 'session-b-successor');
496
+ });
497
+ });
498
+ //# sourceMappingURL=mode-binding-lease.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-binding-lease.test.js","sourceRoot":"","sources":["../../../src/state/__tests__/mode-binding-lease.test.ts"],"names":[],"mappings":"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"}
@@ -2984,6 +2984,7 @@ describe('state operations directory initialization', () => {
2984
2984
  await writeFile(join(sessionDir, 'native-stop-state.json'), JSON.stringify({ sessions: { [sessionId]: {} } }));
2985
2985
  installScopeTakeover(stateDir, [2, 'native-stop.root'], JSON.stringify({ session_id: 'sess-replacement', cwd: wd, state_root: stateDir }));
2986
2986
  const rejected = await executeStateOperation('state_clear', { workingDirectory: wd, mode: 'autoresearch' });
2987
+ assert.equal(rejected.isError, true);
2987
2988
  assert.deepEqual(rejected.payload, { error: WRITABLE_STATE_SCOPE_ERRORS.scopeChangedDuringWrite });
2988
2989
  }
2989
2990
  finally {