oh-my-codex 0.11.12 → 0.11.13

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 (248) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +23 -0
  4. package/README.vi.md +144 -185
  5. package/crates/omx-runtime-core/src/engine.rs +122 -4
  6. package/crates/omx-runtime-core/src/lib.rs +17 -0
  7. package/dist/cli/__tests__/autoresearch.test.js +11 -0
  8. package/dist/cli/__tests__/autoresearch.test.js.map +1 -1
  9. package/dist/cli/__tests__/cleanup.test.js +117 -4
  10. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  11. package/dist/cli/__tests__/error-handling-warnings.test.js +13 -0
  12. package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -1
  13. package/dist/cli/__tests__/exec.test.js +6 -0
  14. package/dist/cli/__tests__/exec.test.js.map +1 -1
  15. package/dist/cli/__tests__/index.test.js +94 -1
  16. package/dist/cli/__tests__/index.test.js.map +1 -1
  17. package/dist/cli/__tests__/launch-fallback.test.js +3 -0
  18. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  19. package/dist/cli/__tests__/package-bin-contract.test.js +10 -0
  20. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  21. package/dist/cli/__tests__/packaged-script-resolution.test.js +4 -3
  22. package/dist/cli/__tests__/packaged-script-resolution.test.js.map +1 -1
  23. package/dist/cli/__tests__/resume.test.js +6 -0
  24. package/dist/cli/__tests__/resume.test.js.map +1 -1
  25. package/dist/cli/__tests__/setup-refresh.test.js +29 -12
  26. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  27. package/dist/cli/__tests__/star-prompt.test.js +16 -0
  28. package/dist/cli/__tests__/star-prompt.test.js.map +1 -1
  29. package/dist/cli/__tests__/uninstall.test.js +112 -1
  30. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  31. package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts +2 -0
  32. package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts.map +1 -0
  33. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +30 -0
  34. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -0
  35. package/dist/cli/cleanup.d.ts +2 -0
  36. package/dist/cli/cleanup.d.ts.map +1 -1
  37. package/dist/cli/cleanup.js +26 -1
  38. package/dist/cli/cleanup.js.map +1 -1
  39. package/dist/cli/index.d.ts +7 -0
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +161 -50
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/cli/setup.d.ts.map +1 -1
  44. package/dist/cli/setup.js +15 -14
  45. package/dist/cli/setup.js.map +1 -1
  46. package/dist/cli/star-prompt.d.ts.map +1 -1
  47. package/dist/cli/star-prompt.js +1 -0
  48. package/dist/cli/star-prompt.js.map +1 -1
  49. package/dist/cli/team.d.ts.map +1 -1
  50. package/dist/cli/team.js +5 -1
  51. package/dist/cli/team.js.map +1 -1
  52. package/dist/cli/uninstall.d.ts.map +1 -1
  53. package/dist/cli/uninstall.js +26 -0
  54. package/dist/cli/uninstall.js.map +1 -1
  55. package/dist/cli/update.d.ts.map +1 -1
  56. package/dist/cli/update.js +1 -0
  57. package/dist/cli/update.js.map +1 -1
  58. package/dist/config/__tests__/generator-idempotent.test.js +4 -4
  59. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  60. package/dist/config/__tests__/mcp-registry.test.js +13 -16
  61. package/dist/config/__tests__/mcp-registry.test.js.map +1 -1
  62. package/dist/config/mcp-registry.d.ts +1 -0
  63. package/dist/config/mcp-registry.d.ts.map +1 -1
  64. package/dist/config/mcp-registry.js +4 -4
  65. package/dist/config/mcp-registry.js.map +1 -1
  66. package/dist/config/models.d.ts +1 -0
  67. package/dist/config/models.d.ts.map +1 -1
  68. package/dist/config/models.js +39 -1
  69. package/dist/config/models.js.map +1 -1
  70. package/dist/hooks/__tests__/keyword-detector.test.js +12 -1
  71. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  72. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +499 -17
  73. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  74. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +140 -14
  75. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  76. package/dist/hooks/__tests__/notify-hook-modules.test.js +5 -0
  77. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
  78. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts +2 -0
  79. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts.map +1 -0
  80. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +597 -0
  81. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -0
  82. package/dist/hooks/__tests__/notify-hook-regression-205.test.js +15 -1
  83. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
  84. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +73 -53
  85. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  86. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +193 -2
  87. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  88. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +183 -0
  89. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  90. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +255 -97
  91. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  92. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +0 -0
  93. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
  94. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +46 -0
  95. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  96. package/dist/hooks/keyword-detector.d.ts +1 -0
  97. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  98. package/dist/hooks/keyword-detector.js +48 -0
  99. package/dist/hooks/keyword-detector.js.map +1 -1
  100. package/dist/hooks/session.d.ts.map +1 -1
  101. package/dist/hooks/session.js +1 -0
  102. package/dist/hooks/session.js.map +1 -1
  103. package/dist/hud/__tests__/state.test.js +70 -1
  104. package/dist/hud/__tests__/state.test.js.map +1 -1
  105. package/dist/hud/state.d.ts.map +1 -1
  106. package/dist/hud/state.js +10 -37
  107. package/dist/hud/state.js.map +1 -1
  108. package/dist/mcp/state-server.d.ts.map +1 -1
  109. package/dist/mcp/state-server.js +5 -0
  110. package/dist/mcp/state-server.js.map +1 -1
  111. package/dist/modes/__tests__/base-session-scope.test.js +46 -0
  112. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
  113. package/dist/modes/base.d.ts.map +1 -1
  114. package/dist/modes/base.js +4 -0
  115. package/dist/modes/base.js.map +1 -1
  116. package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts +2 -0
  117. package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts.map +1 -0
  118. package/dist/notifications/__tests__/custom-alias-enablement.test.js +84 -0
  119. package/dist/notifications/__tests__/custom-alias-enablement.test.js.map +1 -0
  120. package/dist/notifications/__tests__/idle-cooldown.test.js +55 -0
  121. package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -1
  122. package/dist/notifications/idle-cooldown.d.ts +8 -6
  123. package/dist/notifications/idle-cooldown.d.ts.map +1 -1
  124. package/dist/notifications/idle-cooldown.js +53 -22
  125. package/dist/notifications/idle-cooldown.js.map +1 -1
  126. package/dist/notifications/notifier.js +1 -1
  127. package/dist/notifications/notifier.js.map +1 -1
  128. package/dist/notifications/reply-listener.d.ts.map +1 -1
  129. package/dist/notifications/reply-listener.js +1 -0
  130. package/dist/notifications/reply-listener.js.map +1 -1
  131. package/dist/openclaw/config.js +2 -2
  132. package/dist/openclaw/config.js.map +1 -1
  133. package/dist/runtime/bridge.d.ts +1 -0
  134. package/dist/runtime/bridge.d.ts.map +1 -1
  135. package/dist/runtime/bridge.js +2 -6
  136. package/dist/runtime/bridge.js.map +1 -1
  137. package/dist/scripts/notify-fallback-watcher.js +97 -59
  138. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  139. package/dist/scripts/notify-hook/auto-nudge.d.ts +2 -1
  140. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  141. package/dist/scripts/notify-hook/auto-nudge.js +72 -238
  142. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  143. package/dist/scripts/notify-hook/managed-tmux.d.ts +19 -0
  144. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -0
  145. package/dist/scripts/notify-hook/managed-tmux.js +320 -0
  146. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -0
  147. package/dist/scripts/notify-hook/ralph-session-resume.d.ts +22 -0
  148. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -0
  149. package/dist/scripts/notify-hook/ralph-session-resume.js +277 -0
  150. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -0
  151. package/dist/scripts/notify-hook/state-io.d.ts +1 -1
  152. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  153. package/dist/scripts/notify-hook/state-io.js +2 -10
  154. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  155. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  156. package/dist/scripts/notify-hook/team-dispatch.js +60 -59
  157. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  158. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +2 -1
  159. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  160. package/dist/scripts/notify-hook/team-leader-nudge.js +13 -5
  161. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  162. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  163. package/dist/scripts/notify-hook/team-tmux-guard.js +1 -19
  164. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  165. package/dist/scripts/notify-hook/team-worker.js +4 -4
  166. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  167. package/dist/scripts/notify-hook/tmux-injection.d.ts +1 -1
  168. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  169. package/dist/scripts/notify-hook/tmux-injection.js +102 -35
  170. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  171. package/dist/scripts/notify-hook.js +144 -20
  172. package/dist/scripts/notify-hook.js.map +1 -1
  173. package/dist/scripts/tmux-hook-engine.d.ts +1 -0
  174. package/dist/scripts/tmux-hook-engine.d.ts.map +1 -1
  175. package/dist/scripts/tmux-hook-engine.js +3 -0
  176. package/dist/scripts/tmux-hook-engine.js.map +1 -1
  177. package/dist/team/__tests__/api-interop.test.js +96 -4
  178. package/dist/team/__tests__/api-interop.test.js.map +1 -1
  179. package/dist/team/__tests__/leader-activity.test.js +107 -2
  180. package/dist/team/__tests__/leader-activity.test.js.map +1 -1
  181. package/dist/team/__tests__/runtime-cli.test.js +32 -0
  182. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  183. package/dist/team/__tests__/runtime.test.js +148 -0
  184. package/dist/team/__tests__/runtime.test.js.map +1 -1
  185. package/dist/team/__tests__/shutdown-fallback.test.js +13 -0
  186. package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -1
  187. package/dist/team/__tests__/state-root.test.js +11 -1
  188. package/dist/team/__tests__/state-root.test.js.map +1 -1
  189. package/dist/team/__tests__/state.test.js +16 -5
  190. package/dist/team/__tests__/state.test.js.map +1 -1
  191. package/dist/team/__tests__/tmux-session.test.js +460 -2
  192. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  193. package/dist/team/api-interop.d.ts.map +1 -1
  194. package/dist/team/api-interop.js +34 -7
  195. package/dist/team/api-interop.js.map +1 -1
  196. package/dist/team/commit-hygiene.d.ts +60 -0
  197. package/dist/team/commit-hygiene.d.ts.map +1 -0
  198. package/dist/team/commit-hygiene.js +232 -0
  199. package/dist/team/commit-hygiene.js.map +1 -0
  200. package/dist/team/leader-activity.d.ts.map +1 -1
  201. package/dist/team/leader-activity.js +17 -35
  202. package/dist/team/leader-activity.js.map +1 -1
  203. package/dist/team/runtime-cli.d.ts +9 -1
  204. package/dist/team/runtime-cli.d.ts.map +1 -1
  205. package/dist/team/runtime-cli.js +15 -6
  206. package/dist/team/runtime-cli.js.map +1 -1
  207. package/dist/team/runtime.d.ts +7 -2
  208. package/dist/team/runtime.d.ts.map +1 -1
  209. package/dist/team/runtime.js +391 -63
  210. package/dist/team/runtime.js.map +1 -1
  211. package/dist/team/state/dispatch.js +1 -1
  212. package/dist/team/state/dispatch.js.map +1 -1
  213. package/dist/team/state/mailbox.d.ts +1 -0
  214. package/dist/team/state/mailbox.d.ts.map +1 -1
  215. package/dist/team/state/mailbox.js +54 -8
  216. package/dist/team/state/mailbox.js.map +1 -1
  217. package/dist/team/state-root.d.ts +1 -1
  218. package/dist/team/state-root.d.ts.map +1 -1
  219. package/dist/team/state-root.js +8 -3
  220. package/dist/team/state-root.js.map +1 -1
  221. package/dist/team/state.d.ts.map +1 -1
  222. package/dist/team/state.js +66 -3
  223. package/dist/team/state.js.map +1 -1
  224. package/dist/team/tmux-session.d.ts.map +1 -1
  225. package/dist/team/tmux-session.js +69 -27
  226. package/dist/team/tmux-session.js.map +1 -1
  227. package/dist/utils/__tests__/platform-command.test.js +101 -2
  228. package/dist/utils/__tests__/platform-command.test.js.map +1 -1
  229. package/dist/utils/git-layout.d.ts +8 -0
  230. package/dist/utils/git-layout.d.ts.map +1 -0
  231. package/dist/utils/git-layout.js +58 -0
  232. package/dist/utils/git-layout.js.map +1 -0
  233. package/dist/utils/platform-command.d.ts.map +1 -1
  234. package/dist/utils/platform-command.js +32 -1
  235. package/dist/utils/platform-command.js.map +1 -1
  236. package/package.json +6 -6
  237. package/src/scripts/notify-fallback-watcher.ts +96 -58
  238. package/src/scripts/notify-hook/auto-nudge.ts +75 -230
  239. package/src/scripts/notify-hook/managed-tmux.ts +324 -0
  240. package/src/scripts/notify-hook/ralph-session-resume.ts +337 -0
  241. package/src/scripts/notify-hook/state-io.ts +2 -10
  242. package/src/scripts/notify-hook/team-dispatch.ts +70 -54
  243. package/src/scripts/notify-hook/team-leader-nudge.ts +19 -5
  244. package/src/scripts/notify-hook/team-tmux-guard.ts +0 -20
  245. package/src/scripts/notify-hook/team-worker.ts +4 -4
  246. package/src/scripts/notify-hook/tmux-injection.ts +103 -33
  247. package/src/scripts/notify-hook.ts +150 -21
  248. package/src/scripts/tmux-hook-engine.ts +4 -0
@@ -0,0 +1,597 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'fs/promises';
4
+ import { existsSync } from 'fs';
5
+ import { spawnSync } from 'child_process';
6
+ import { dirname, join } from 'path';
7
+ import { tmpdir } from 'os';
8
+ import { fileURLToPath } from 'url';
9
+ import { reconcileRalphSessionResume } from '../../scripts/notify-hook/ralph-session-resume.js';
10
+ function notifyHookRepoRoot() {
11
+ const testDir = dirname(fileURLToPath(import.meta.url));
12
+ return join(testDir, '..', '..', '..');
13
+ }
14
+ function runNotifyHook(payload, envOverrides = {}) {
15
+ return spawnSync(process.execPath, ['dist/scripts/notify-hook.js', JSON.stringify(payload)], {
16
+ cwd: notifyHookRepoRoot(),
17
+ encoding: 'utf-8',
18
+ env: {
19
+ ...process.env,
20
+ OMX_TEAM_WORKER: '',
21
+ TMUX: '',
22
+ TMUX_PANE: '',
23
+ ...envOverrides,
24
+ },
25
+ });
26
+ }
27
+ async function writeJson(path, value) {
28
+ await mkdir(dirname(path), { recursive: true });
29
+ await writeFile(path, JSON.stringify(value, null, 2));
30
+ }
31
+ function buildPayload(cwd, overrides = {}) {
32
+ return {
33
+ cwd,
34
+ type: 'agent-turn-complete',
35
+ thread_id: 'thread-1',
36
+ turn_id: 'turn-1',
37
+ input_messages: [],
38
+ last_assistant_message: 'continue',
39
+ ...overrides,
40
+ };
41
+ }
42
+ function buildResumeFakeTmux(currentPaneId, cwd, sessionName = 'devsess') {
43
+ return `#!/usr/bin/env bash
44
+ set -eu
45
+ cmd="$1"
46
+ shift || true
47
+ case "$cmd" in
48
+ display-message)
49
+ target=""
50
+ format=""
51
+ while (($#)); do
52
+ case "$1" in
53
+ -p) shift ;;
54
+ -t) target="$2"; shift 2 ;;
55
+ *) format="$1"; shift ;;
56
+ esac
57
+ done
58
+ if [[ "$target" != "${currentPaneId}" ]]; then
59
+ echo "bad display target: $target / $format" >&2
60
+ exit 1
61
+ fi
62
+ case "$format" in
63
+ '#{pane_current_command}') echo "node" ;;
64
+ '#{pane_start_command}') echo "codex" ;;
65
+ '#S') echo "${sessionName}" ;;
66
+ '#{pane_in_mode}') echo "0" ;;
67
+ '#{pane_current_path}') echo "${cwd}" ;;
68
+ *) echo "bad display format: $format" >&2; exit 1 ;;
69
+ esac
70
+ ;;
71
+ list-panes)
72
+ echo "${currentPaneId}\t1\tcodex\tcodex"
73
+ ;;
74
+ capture-pane)
75
+ printf "› ready\\n"
76
+ ;;
77
+ send-keys)
78
+ ;;
79
+ *)
80
+ echo "unsupported cmd: $cmd" >&2
81
+ exit 1
82
+ ;;
83
+ esac
84
+ `;
85
+ }
86
+ async function setupTmuxFixture(wd, currentPaneId) {
87
+ const fakeBinDir = join(wd, 'fake-bin');
88
+ await mkdir(fakeBinDir, { recursive: true });
89
+ await writeFile(join(fakeBinDir, 'tmux'), buildResumeFakeTmux(currentPaneId, wd));
90
+ await chmod(join(fakeBinDir, 'tmux'), 0o755);
91
+ return {
92
+ PATH: `${fakeBinDir}:${process.env.PATH || ''}`,
93
+ TMUX_PANE: currentPaneId,
94
+ };
95
+ }
96
+ async function withPatchedEnv(overrides, run) {
97
+ const keys = Object.keys(overrides);
98
+ const previous = new Map();
99
+ for (const key of keys) {
100
+ previous.set(key, process.env[key]);
101
+ process.env[key] = overrides[key];
102
+ }
103
+ try {
104
+ return await run();
105
+ }
106
+ finally {
107
+ for (const key of keys) {
108
+ const value = previous.get(key);
109
+ if (typeof value === 'string')
110
+ process.env[key] = value;
111
+ else
112
+ delete process.env[key];
113
+ }
114
+ }
115
+ }
116
+ describe('notify-hook Ralph session resume', () => {
117
+ it('resumes a matching prior Ralph into the current OMX session and rebinds the pane', async () => {
118
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-resume-'));
119
+ try {
120
+ const stateDir = join(wd, '.omx', 'state');
121
+ const currentOmxSessionId = 'sess-current';
122
+ const priorOmxSessionId = 'sess-prior';
123
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
124
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
125
+ const currentPaneId = '%99';
126
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
127
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
128
+ active: true,
129
+ iteration: 4,
130
+ max_iterations: 10,
131
+ current_phase: 'executing',
132
+ started_at: '2026-02-22T00:00:00.000Z',
133
+ owner_omx_session_id: priorOmxSessionId,
134
+ owner_codex_session_id: 'codex-session-1',
135
+ tmux_pane_id: '%42',
136
+ });
137
+ const result = runNotifyHook(buildPayload(wd, {
138
+ session_id: 'codex-session-1',
139
+ thread_id: 'thread-resume-1',
140
+ turn_id: 'turn-resume-1',
141
+ }), await setupTmuxFixture(wd, currentPaneId));
142
+ assert.equal(result.status, 0, result.stderr || result.stdout);
143
+ const currentState = JSON.parse(await readFile(join(currentSessionDir, 'ralph-state.json'), 'utf-8'));
144
+ assert.equal(currentState.active, true);
145
+ assert.equal(currentState.iteration, 5);
146
+ assert.equal(currentState.owner_omx_session_id, currentOmxSessionId);
147
+ assert.equal(currentState.owner_codex_session_id, 'codex-session-1');
148
+ assert.equal(currentState.tmux_pane_id, currentPaneId);
149
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
150
+ assert.equal(priorState.active, false);
151
+ assert.equal(priorState.current_phase, 'cancelled');
152
+ assert.equal(priorState.stop_reason, 'ownership_transferred');
153
+ }
154
+ finally {
155
+ await rm(wd, { recursive: true, force: true });
156
+ }
157
+ });
158
+ it('rebinds the current pane for an already-active current-session Ralph state', async () => {
159
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-current-pane-'));
160
+ try {
161
+ const stateDir = join(wd, '.omx', 'state');
162
+ const currentOmxSessionId = 'sess-current';
163
+ const priorOmxSessionId = 'sess-prior';
164
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
165
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
166
+ const currentPaneId = '%77';
167
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
168
+ await writeJson(join(currentSessionDir, 'ralph-state.json'), {
169
+ active: true,
170
+ iteration: 4,
171
+ max_iterations: 10,
172
+ current_phase: 'executing',
173
+ started_at: '2026-02-22T00:00:00.000Z',
174
+ });
175
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
176
+ active: true,
177
+ iteration: 9,
178
+ max_iterations: 10,
179
+ current_phase: 'executing',
180
+ started_at: '2026-02-22T00:00:00.000Z',
181
+ owner_omx_session_id: priorOmxSessionId,
182
+ owner_codex_session_id: 'codex-session-1',
183
+ tmux_pane_id: '%42',
184
+ });
185
+ const result = runNotifyHook(buildPayload(wd, {
186
+ session_id: 'codex-session-1',
187
+ thread_id: 'thread-current-1',
188
+ turn_id: 'turn-current-1',
189
+ }), await setupTmuxFixture(wd, currentPaneId));
190
+ assert.equal(result.status, 0, result.stderr || result.stdout);
191
+ const currentState = JSON.parse(await readFile(join(currentSessionDir, 'ralph-state.json'), 'utf-8'));
192
+ assert.equal(currentState.active, true);
193
+ assert.equal(currentState.owner_omx_session_id, currentOmxSessionId);
194
+ assert.equal(currentState.owner_codex_session_id, 'codex-session-1');
195
+ assert.equal(currentState.tmux_pane_id, currentPaneId);
196
+ assert.ok(typeof currentState.tmux_pane_set_at === 'string' && currentState.tmux_pane_set_at.length > 0);
197
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
198
+ assert.equal(priorState.active, true);
199
+ assert.equal(priorState.iteration, 9);
200
+ assert.equal(priorState.current_phase, 'executing');
201
+ }
202
+ finally {
203
+ await rm(wd, { recursive: true, force: true });
204
+ }
205
+ });
206
+ it('preserves current-session legacy owner_codex_thread_id until owner_codex_session_id is available', async () => {
207
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-current-legacy-owner-'));
208
+ try {
209
+ const stateDir = join(wd, '.omx', 'state');
210
+ const currentOmxSessionId = 'sess-current';
211
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
212
+ const currentPaneId = '%79';
213
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
214
+ await writeJson(join(currentSessionDir, 'ralph-state.json'), {
215
+ active: true,
216
+ iteration: 4,
217
+ max_iterations: 10,
218
+ current_phase: 'executing',
219
+ started_at: '2026-02-22T00:00:00.000Z',
220
+ owner_omx_session_id: currentOmxSessionId,
221
+ owner_codex_thread_id: 'thread-current-legacy-1',
222
+ tmux_pane_id: '%42',
223
+ });
224
+ const result = runNotifyHook(buildPayload(wd, {
225
+ thread_id: 'thread-current-legacy-1',
226
+ turn_id: 'turn-current-legacy-1',
227
+ }), await setupTmuxFixture(wd, currentPaneId));
228
+ assert.equal(result.status, 0, result.stderr || result.stdout);
229
+ const currentState = JSON.parse(await readFile(join(currentSessionDir, 'ralph-state.json'), 'utf-8'));
230
+ assert.equal(currentState.active, true);
231
+ assert.equal(currentState.owner_omx_session_id, currentOmxSessionId);
232
+ assert.equal(currentState.owner_codex_session_id, undefined);
233
+ assert.equal(currentState.owner_codex_thread_id, 'thread-current-legacy-1');
234
+ assert.equal(currentState.tmux_pane_id, currentPaneId);
235
+ }
236
+ finally {
237
+ await rm(wd, { recursive: true, force: true });
238
+ }
239
+ });
240
+ it('does not auto-resume without a unique matching prior Ralph owner', async (t) => {
241
+ const scenarios = [
242
+ {
243
+ name: 'payload session id does not match',
244
+ payloadSessionId: 'codex-session-2',
245
+ priorSessions: ['sess-prior'],
246
+ },
247
+ {
248
+ name: 'multiple prior sessions match the same codex session',
249
+ payloadSessionId: 'codex-session-1',
250
+ priorSessions: ['sess-prior-a', 'sess-prior-b'],
251
+ },
252
+ ];
253
+ for (const scenario of scenarios) {
254
+ await t.test(scenario.name, async () => {
255
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-no-resume-'));
256
+ try {
257
+ const stateDir = join(wd, '.omx', 'state');
258
+ const currentOmxSessionId = 'sess-current';
259
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
260
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
261
+ await mkdir(currentSessionDir, { recursive: true });
262
+ for (const priorSessionId of scenario.priorSessions) {
263
+ await writeJson(join(stateDir, 'sessions', priorSessionId, 'ralph-state.json'), {
264
+ active: true,
265
+ iteration: 4,
266
+ max_iterations: 10,
267
+ current_phase: 'executing',
268
+ started_at: '2026-02-22T00:00:00.000Z',
269
+ owner_omx_session_id: priorSessionId,
270
+ owner_codex_session_id: 'codex-session-1',
271
+ });
272
+ }
273
+ const result = runNotifyHook(buildPayload(wd, {
274
+ session_id: scenario.payloadSessionId,
275
+ thread_id: 'thread-no-resume',
276
+ turn_id: 'turn-no-resume',
277
+ }));
278
+ assert.equal(result.status, 0, result.stderr || result.stdout);
279
+ assert.equal(existsSync(join(currentSessionDir, 'ralph-state.json')), false);
280
+ for (const priorSessionId of scenario.priorSessions) {
281
+ const priorState = JSON.parse(await readFile(join(stateDir, 'sessions', priorSessionId, 'ralph-state.json'), 'utf-8'));
282
+ assert.equal(priorState.active, true);
283
+ assert.equal(priorState.iteration, 4);
284
+ }
285
+ }
286
+ finally {
287
+ await rm(wd, { recursive: true, force: true });
288
+ }
289
+ });
290
+ }
291
+ });
292
+ it('resumes a legacy prior Ralph that only tracks owner_codex_thread_id', async () => {
293
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-thread-resume-'));
294
+ try {
295
+ const stateDir = join(wd, '.omx', 'state');
296
+ const currentOmxSessionId = 'sess-current';
297
+ const priorOmxSessionId = 'sess-prior';
298
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
299
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
300
+ const currentPaneId = '%55';
301
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
302
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
303
+ active: true,
304
+ iteration: 4,
305
+ max_iterations: 10,
306
+ current_phase: 'executing',
307
+ started_at: '2026-02-22T00:00:00.000Z',
308
+ owner_omx_session_id: priorOmxSessionId,
309
+ owner_codex_thread_id: 'thread-legacy-1',
310
+ tmux_pane_id: '%42',
311
+ });
312
+ const result = runNotifyHook(buildPayload(wd, {
313
+ session_id: 'codex-session-1',
314
+ thread_id: 'thread-legacy-1',
315
+ turn_id: 'turn-legacy-1',
316
+ }), await setupTmuxFixture(wd, currentPaneId));
317
+ assert.equal(result.status, 0, result.stderr || result.stdout);
318
+ const currentState = JSON.parse(await readFile(join(currentSessionDir, 'ralph-state.json'), 'utf-8'));
319
+ assert.equal(currentState.active, true);
320
+ assert.equal(currentState.iteration, 5);
321
+ assert.equal(currentState.owner_omx_session_id, currentOmxSessionId);
322
+ assert.equal(currentState.owner_codex_session_id, 'codex-session-1');
323
+ assert.equal(currentState.owner_codex_thread_id, undefined);
324
+ assert.equal(currentState.tmux_pane_id, currentPaneId);
325
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
326
+ assert.equal(priorState.active, false);
327
+ assert.equal(priorState.current_phase, 'cancelled');
328
+ assert.equal(priorState.stop_reason, 'ownership_transferred');
329
+ }
330
+ finally {
331
+ await rm(wd, { recursive: true, force: true });
332
+ }
333
+ });
334
+ it('does not fall back to owner_codex_thread_id when owner_codex_session_id is present and mismatched', async () => {
335
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-session-precedence-'));
336
+ try {
337
+ const stateDir = join(wd, '.omx', 'state');
338
+ const currentOmxSessionId = 'sess-current';
339
+ const priorOmxSessionId = 'sess-prior';
340
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
341
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
342
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
343
+ await mkdir(currentSessionDir, { recursive: true });
344
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
345
+ active: true,
346
+ iteration: 4,
347
+ max_iterations: 10,
348
+ current_phase: 'executing',
349
+ started_at: '2026-02-22T00:00:00.000Z',
350
+ owner_omx_session_id: priorOmxSessionId,
351
+ owner_codex_session_id: 'codex-session-other',
352
+ owner_codex_thread_id: 'thread-shared-1',
353
+ });
354
+ const result = runNotifyHook(buildPayload(wd, {
355
+ session_id: 'codex-session-1',
356
+ thread_id: 'thread-shared-1',
357
+ turn_id: 'turn-session-precedence-1',
358
+ }));
359
+ assert.equal(result.status, 0, result.stderr || result.stdout);
360
+ assert.equal(existsSync(join(currentSessionDir, 'ralph-state.json')), false);
361
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
362
+ assert.equal(priorState.active, true);
363
+ assert.equal(priorState.iteration, 4);
364
+ assert.equal(priorState.current_phase, 'executing');
365
+ }
366
+ finally {
367
+ await rm(wd, { recursive: true, force: true });
368
+ }
369
+ });
370
+ it('does not auto-resume a legacy Ralph when both source and payload thread ids are missing', async () => {
371
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-empty-thread-'));
372
+ try {
373
+ const stateDir = join(wd, '.omx', 'state');
374
+ const currentOmxSessionId = 'sess-current';
375
+ const priorOmxSessionId = 'sess-prior';
376
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
377
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
378
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
379
+ await mkdir(currentSessionDir, { recursive: true });
380
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
381
+ active: true,
382
+ iteration: 4,
383
+ max_iterations: 10,
384
+ current_phase: 'executing',
385
+ started_at: '2026-02-22T00:00:00.000Z',
386
+ owner_omx_session_id: priorOmxSessionId,
387
+ });
388
+ const result = runNotifyHook(buildPayload(wd, {
389
+ session_id: 'codex-session-1',
390
+ turn_id: 'turn-empty-thread-1',
391
+ }));
392
+ assert.equal(result.status, 0, result.stderr || result.stdout);
393
+ assert.equal(existsSync(join(currentSessionDir, 'ralph-state.json')), false);
394
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
395
+ assert.equal(priorState.active, true);
396
+ assert.equal(priorState.iteration, 4);
397
+ assert.equal(priorState.current_phase, 'executing');
398
+ }
399
+ finally {
400
+ await rm(wd, { recursive: true, force: true });
401
+ }
402
+ });
403
+ it('does not auto-resume over an inactive current-session Ralph file', async () => {
404
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-inactive-current-'));
405
+ try {
406
+ const stateDir = join(wd, '.omx', 'state');
407
+ const currentOmxSessionId = 'sess-current';
408
+ const priorOmxSessionId = 'sess-prior';
409
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
410
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
411
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
412
+ await writeJson(join(currentSessionDir, 'ralph-state.json'), {
413
+ active: false,
414
+ iteration: 4,
415
+ max_iterations: 10,
416
+ current_phase: 'cancelled',
417
+ started_at: '2026-02-22T00:00:00.000Z',
418
+ completed_at: '2026-02-22T00:10:00.000Z',
419
+ owner_omx_session_id: currentOmxSessionId,
420
+ });
421
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
422
+ active: true,
423
+ iteration: 6,
424
+ max_iterations: 10,
425
+ current_phase: 'executing',
426
+ started_at: '2026-02-22T00:00:00.000Z',
427
+ owner_omx_session_id: priorOmxSessionId,
428
+ owner_codex_session_id: 'codex-session-1',
429
+ });
430
+ const result = runNotifyHook(buildPayload(wd, {
431
+ session_id: 'codex-session-1',
432
+ thread_id: 'thread-inactive-current-1',
433
+ turn_id: 'turn-inactive-current-1',
434
+ }));
435
+ assert.equal(result.status, 0, result.stderr || result.stdout);
436
+ const currentState = JSON.parse(await readFile(join(currentSessionDir, 'ralph-state.json'), 'utf-8'));
437
+ assert.equal(currentState.active, false);
438
+ assert.equal(currentState.current_phase, 'cancelled');
439
+ assert.equal(currentState.owner_omx_session_id, currentOmxSessionId);
440
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
441
+ assert.equal(priorState.active, true);
442
+ assert.equal(priorState.iteration, 6);
443
+ assert.equal(priorState.current_phase, 'executing');
444
+ }
445
+ finally {
446
+ await rm(wd, { recursive: true, force: true });
447
+ }
448
+ });
449
+ it('does not auto-resume over an unreadable current-session Ralph file', async () => {
450
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-unreadable-current-'));
451
+ try {
452
+ const stateDir = join(wd, '.omx', 'state');
453
+ const currentOmxSessionId = 'sess-current';
454
+ const priorOmxSessionId = 'sess-prior';
455
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
456
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
457
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
458
+ await mkdir(currentSessionDir, { recursive: true });
459
+ await writeFile(join(currentSessionDir, 'ralph-state.json'), '{ "active": true');
460
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
461
+ active: true,
462
+ iteration: 6,
463
+ max_iterations: 10,
464
+ current_phase: 'executing',
465
+ started_at: '2026-02-22T00:00:00.000Z',
466
+ owner_omx_session_id: priorOmxSessionId,
467
+ owner_codex_session_id: 'codex-session-1',
468
+ });
469
+ const result = runNotifyHook(buildPayload(wd, {
470
+ session_id: 'codex-session-1',
471
+ thread_id: 'thread-unreadable-current-1',
472
+ turn_id: 'turn-unreadable-current-1',
473
+ }));
474
+ assert.equal(result.status, 0, result.stderr || result.stdout);
475
+ const currentRaw = await readFile(join(currentSessionDir, 'ralph-state.json'), 'utf-8');
476
+ assert.equal(currentRaw, '{ "active": true');
477
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
478
+ assert.equal(priorState.active, true);
479
+ assert.equal(priorState.iteration, 6);
480
+ assert.equal(priorState.current_phase, 'executing');
481
+ }
482
+ finally {
483
+ await rm(wd, { recursive: true, force: true });
484
+ }
485
+ });
486
+ it('serializes concurrent resume attempts so only one transfer occurs', async () => {
487
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-concurrent-resume-'));
488
+ try {
489
+ const stateDir = join(wd, '.omx', 'state');
490
+ const currentOmxSessionId = 'sess-current';
491
+ const priorOmxSessionId = 'sess-prior';
492
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
493
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
494
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
495
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
496
+ active: true,
497
+ iteration: 4,
498
+ max_iterations: 10,
499
+ current_phase: 'executing',
500
+ started_at: '2026-02-22T00:00:00.000Z',
501
+ owner_omx_session_id: priorOmxSessionId,
502
+ owner_codex_session_id: 'codex-session-1',
503
+ tmux_pane_id: '%42',
504
+ });
505
+ await withPatchedEnv(await setupTmuxFixture(wd, '%88'), async () => {
506
+ let releaseFirstLock = () => { };
507
+ const firstLocked = new Promise((resolve) => {
508
+ releaseFirstLock = resolve;
509
+ });
510
+ let firstInsideLock = false;
511
+ let markFirstInside = () => { };
512
+ const firstEntered = new Promise((resolve) => {
513
+ markFirstInside = resolve;
514
+ });
515
+ const firstResume = reconcileRalphSessionResume({
516
+ stateDir,
517
+ payloadSessionId: 'codex-session-1',
518
+ payloadThreadId: 'thread-concurrent-1',
519
+ env: { ...process.env, TMUX_PANE: '%55' },
520
+ hooks: {
521
+ afterLockAcquired: async () => {
522
+ firstInsideLock = true;
523
+ markFirstInside();
524
+ await firstLocked;
525
+ },
526
+ },
527
+ });
528
+ await firstEntered;
529
+ assert.equal(firstInsideLock, true);
530
+ const secondResume = reconcileRalphSessionResume({
531
+ stateDir,
532
+ payloadSessionId: 'codex-session-1',
533
+ payloadThreadId: 'thread-concurrent-1',
534
+ env: { ...process.env, TMUX_PANE: '%56' },
535
+ });
536
+ releaseFirstLock();
537
+ const [firstResult, secondResult] = await Promise.all([firstResume, secondResume]);
538
+ assert.equal(firstResult.resumed, true);
539
+ assert.equal(secondResult.resumed, false);
540
+ assert.equal(secondResult.reason, 'current_ralph_active');
541
+ const currentState = JSON.parse(await readFile(join(currentSessionDir, 'ralph-state.json'), 'utf-8'));
542
+ assert.equal(currentState.active, true);
543
+ assert.equal(currentState.owner_omx_session_id, currentOmxSessionId);
544
+ assert.equal(currentState.owner_codex_session_id, 'codex-session-1');
545
+ assert.equal(currentState.tmux_pane_id, '%56');
546
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
547
+ assert.equal(priorState.active, false);
548
+ assert.equal(priorState.current_phase, 'cancelled');
549
+ assert.equal(priorState.stop_reason, 'ownership_transferred');
550
+ });
551
+ }
552
+ finally {
553
+ await rm(wd, { recursive: true, force: true });
554
+ }
555
+ });
556
+ it('rolls back the target state when transfer fails after writing the current session', async () => {
557
+ const wd = await mkdtemp(join(tmpdir(), 'omx-notify-ralph-transfer-rollback-'));
558
+ try {
559
+ const stateDir = join(wd, '.omx', 'state');
560
+ const currentOmxSessionId = 'sess-current';
561
+ const priorOmxSessionId = 'sess-prior';
562
+ const currentSessionDir = join(stateDir, 'sessions', currentOmxSessionId);
563
+ const priorSessionDir = join(stateDir, 'sessions', priorOmxSessionId);
564
+ await writeJson(join(stateDir, 'session.json'), { session_id: currentOmxSessionId });
565
+ await writeJson(join(priorSessionDir, 'ralph-state.json'), {
566
+ active: true,
567
+ iteration: 4,
568
+ max_iterations: 10,
569
+ current_phase: 'executing',
570
+ started_at: '2026-02-22T00:00:00.000Z',
571
+ owner_omx_session_id: priorOmxSessionId,
572
+ owner_codex_session_id: 'codex-session-1',
573
+ tmux_pane_id: '%42',
574
+ });
575
+ await assert.rejects(() => reconcileRalphSessionResume({
576
+ stateDir,
577
+ payloadSessionId: 'codex-session-1',
578
+ payloadThreadId: 'thread-rollback-1',
579
+ env: { ...process.env, TMUX_PANE: '%57' },
580
+ hooks: {
581
+ afterTargetWrite: async () => {
582
+ throw new Error('simulated_source_write_failure');
583
+ },
584
+ },
585
+ }), /simulated_source_write_failure/);
586
+ assert.equal(existsSync(join(currentSessionDir, 'ralph-state.json')), false);
587
+ const priorState = JSON.parse(await readFile(join(priorSessionDir, 'ralph-state.json'), 'utf-8'));
588
+ assert.equal(priorState.active, true);
589
+ assert.equal(priorState.current_phase, 'executing');
590
+ assert.equal(priorState.stop_reason, undefined);
591
+ }
592
+ finally {
593
+ await rm(wd, { recursive: true, force: true });
594
+ }
595
+ });
596
+ });
597
+ //# sourceMappingURL=notify-hook-ralph-resume.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify-hook-ralph-resume.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-ralph-resume.test.ts"],"names":[],"mappings":"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"}