oh-my-codex 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +44 -0
  2. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  3. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts +2 -0
  4. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts.map +1 -0
  5. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +135 -0
  6. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -0
  7. package/dist/mcp/__tests__/state-server-schema.test.js +2 -1
  8. package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
  9. package/dist/team/__tests__/mcp-comm.test.js +117 -7
  10. package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
  11. package/dist/team/__tests__/runtime.test.js +41 -1
  12. package/dist/team/__tests__/runtime.test.js.map +1 -1
  13. package/dist/team/__tests__/state.test.js +76 -1
  14. package/dist/team/__tests__/state.test.js.map +1 -1
  15. package/dist/team/contracts.d.ts +1 -1
  16. package/dist/team/contracts.d.ts.map +1 -1
  17. package/dist/team/contracts.js +1 -0
  18. package/dist/team/contracts.js.map +1 -1
  19. package/dist/team/mcp-comm.d.ts +28 -4
  20. package/dist/team/mcp-comm.d.ts.map +1 -1
  21. package/dist/team/mcp-comm.js +172 -6
  22. package/dist/team/mcp-comm.js.map +1 -1
  23. package/dist/team/runtime.d.ts.map +1 -1
  24. package/dist/team/runtime.js +367 -41
  25. package/dist/team/runtime.js.map +1 -1
  26. package/dist/team/scaling.d.ts.map +1 -1
  27. package/dist/team/scaling.js +90 -13
  28. package/dist/team/scaling.js.map +1 -1
  29. package/dist/team/state.d.ts +53 -0
  30. package/dist/team/state.d.ts.map +1 -1
  31. package/dist/team/state.js +300 -5
  32. package/dist/team/state.js.map +1 -1
  33. package/dist/team/team-ops.d.ts +8 -1
  34. package/dist/team/team-ops.d.ts.map +1 -1
  35. package/dist/team/team-ops.js +7 -0
  36. package/dist/team/team-ops.js.map +1 -1
  37. package/package.json +1 -1
  38. package/scripts/notify-fallback-watcher.js +4 -0
  39. package/scripts/notify-hook/team-dispatch.js +274 -0
  40. package/scripts/notify-hook.js +11 -0
  41. package/skills/team/SKILL.md +3 -2
  42. package/skills/worker/SKILL.md +4 -0
@@ -5,6 +5,7 @@ import { tmpdir } from 'node:os';
5
5
  import { join } from 'node:path';
6
6
  import { spawn, spawnSync } from 'node:child_process';
7
7
  import { randomUUID } from 'node:crypto';
8
+ import { initTeamState, enqueueDispatchRequest, readDispatchRequest } from '../../team/state.js';
8
9
  async function appendLine(path, line) {
9
10
  const prev = await readFile(path, 'utf-8');
10
11
  const content = prev + `${JSON.stringify(line)}\n`;
@@ -138,5 +139,48 @@ describe('notify-fallback watcher', () => {
138
139
  await rm(rolloutPath, { force: true });
139
140
  }
140
141
  });
142
+ it('runs bounded non-turn team dispatch drain tick in leader context', async () => {
143
+ const wd = await mkdtemp(join(tmpdir(), 'omx-fallback-dispatch-'));
144
+ try {
145
+ await initTeamState('dispatch-team', 'task', 'executor', 1, wd);
146
+ const queued = await enqueueDispatchRequest('dispatch-team', {
147
+ kind: 'inbox',
148
+ to_worker: 'worker-1',
149
+ worker_index: 1,
150
+ trigger_message: 'dispatch ping',
151
+ }, wd);
152
+ const watcherScript = new URL('../../../scripts/notify-fallback-watcher.js', import.meta.url).pathname;
153
+ const notifyHook = new URL('../../../scripts/notify-hook.js', import.meta.url).pathname;
154
+ const result = spawnSync(process.execPath, [watcherScript, '--once', '--cwd', wd, '--notify-script', notifyHook, '--poll-ms', '50', '--dispatch-max-per-tick', '1'], { encoding: 'utf-8' });
155
+ assert.equal(result.status, 0, result.stderr || result.stdout);
156
+ const request = await readDispatchRequest('dispatch-team', queued.request.request_id, wd);
157
+ assert.ok(request);
158
+ assert.notEqual(request?.status, 'pending');
159
+ }
160
+ finally {
161
+ await rm(wd, { recursive: true, force: true });
162
+ }
163
+ });
164
+ it('skips dispatch drain in worker context (leader-only guard)', async () => {
165
+ const wd = await mkdtemp(join(tmpdir(), 'omx-fallback-dispatch-worker-'));
166
+ try {
167
+ await initTeamState('dispatch-team', 'task', 'executor', 1, wd);
168
+ const queued = await enqueueDispatchRequest('dispatch-team', {
169
+ kind: 'inbox',
170
+ to_worker: 'worker-1',
171
+ worker_index: 1,
172
+ trigger_message: 'dispatch ping',
173
+ }, wd);
174
+ const watcherScript = new URL('../../../scripts/notify-fallback-watcher.js', import.meta.url).pathname;
175
+ const notifyHook = new URL('../../../scripts/notify-hook.js', import.meta.url).pathname;
176
+ const result = spawnSync(process.execPath, [watcherScript, '--once', '--cwd', wd, '--notify-script', notifyHook, '--poll-ms', '50', '--dispatch-max-per-tick', '1'], { encoding: 'utf-8', env: { ...process.env, OMX_TEAM_WORKER: 'dispatch-team/worker-1' } });
177
+ assert.equal(result.status, 0, result.stderr || result.stdout);
178
+ const request = await readDispatchRequest('dispatch-team', queued.request.request_id, wd);
179
+ assert.equal(request?.status, 'pending');
180
+ }
181
+ finally {
182
+ await rm(wd, { recursive: true, force: true });
183
+ }
184
+ });
141
185
  });
142
186
  //# sourceMappingURL=notify-fallback-watcher.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notify-fallback-watcher.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-fallback-watcher.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notify-fallback-watcher.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-fallback-watcher.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=notify-hook-team-dispatch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify-hook-team-dispatch.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-team-dispatch.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,135 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtemp, rm } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { initTeamState, enqueueDispatchRequest, readDispatchRequest, listMailboxMessages, sendDirectMessage, } from '../../team/state.js';
7
+ import { pathToFileURL } from 'node:url';
8
+ describe('notify-hook team dispatch consumer', () => {
9
+ it('marks pending request as notified and preserves mailbox notified_at semantics', async () => {
10
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-hook-team-dispatch-'));
11
+ try {
12
+ await initTeamState('alpha', 'task', 'executor', 1, cwd);
13
+ const msg = await sendDirectMessage('alpha', 'worker-1', 'worker-1', 'hello', cwd);
14
+ const queued = await enqueueDispatchRequest('alpha', {
15
+ kind: 'mailbox',
16
+ to_worker: 'worker-1',
17
+ worker_index: 1,
18
+ message_id: msg.message_id,
19
+ trigger_message: 'check mailbox',
20
+ }, cwd);
21
+ const modulePath = new URL('../../../scripts/notify-hook/team-dispatch.js', import.meta.url).pathname;
22
+ const mod = await import(pathToFileURL(modulePath).href);
23
+ const result = await mod.drainPendingTeamDispatch({
24
+ cwd,
25
+ maxPerTick: 5,
26
+ injector: async () => ({ ok: true, reason: 'injected_for_test' }),
27
+ });
28
+ assert.equal(result.processed, 1);
29
+ const request = await readDispatchRequest('alpha', queued.request.request_id, cwd);
30
+ assert.equal(request?.status, 'notified');
31
+ const mailbox = await listMailboxMessages('alpha', 'worker-1', cwd);
32
+ assert.ok(mailbox[0]?.notified_at);
33
+ }
34
+ finally {
35
+ await rm(cwd, { recursive: true, force: true });
36
+ }
37
+ });
38
+ it('uses explicit stateDir when marking mailbox notified_at', async () => {
39
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-hook-team-dispatch-'));
40
+ const stateDir = join(cwd, 'custom-state-root');
41
+ const previousStateRoot = process.env.OMX_TEAM_STATE_ROOT;
42
+ try {
43
+ process.env.OMX_TEAM_STATE_ROOT = './custom-state-root';
44
+ await initTeamState('alpha', 'task', 'executor', 1, cwd);
45
+ const msg = await sendDirectMessage('alpha', 'worker-1', 'worker-1', 'hello', cwd);
46
+ const queued = await enqueueDispatchRequest('alpha', {
47
+ kind: 'mailbox',
48
+ to_worker: 'worker-1',
49
+ worker_index: 1,
50
+ message_id: msg.message_id,
51
+ trigger_message: 'check mailbox',
52
+ }, cwd);
53
+ const modulePath = new URL('../../../scripts/notify-hook/team-dispatch.js', import.meta.url).pathname;
54
+ const mod = await import(pathToFileURL(modulePath).href);
55
+ const result = await mod.drainPendingTeamDispatch({
56
+ cwd,
57
+ stateDir,
58
+ maxPerTick: 5,
59
+ injector: async () => ({ ok: true, reason: 'injected_for_test' }),
60
+ });
61
+ assert.equal(result.processed, 1);
62
+ const request = await readDispatchRequest('alpha', queued.request.request_id, cwd);
63
+ assert.equal(request?.status, 'notified');
64
+ const mailbox = await listMailboxMessages('alpha', 'worker-1', cwd);
65
+ assert.ok(mailbox[0]?.notified_at);
66
+ }
67
+ finally {
68
+ if (typeof previousStateRoot === 'string')
69
+ process.env.OMX_TEAM_STATE_ROOT = previousStateRoot;
70
+ else
71
+ delete process.env.OMX_TEAM_STATE_ROOT;
72
+ await rm(cwd, { recursive: true, force: true });
73
+ }
74
+ });
75
+ it('is idempotent across repeated ticks (no duplicate processing)', async () => {
76
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-hook-team-dispatch-'));
77
+ try {
78
+ await initTeamState('alpha', 'task', 'executor', 1, cwd);
79
+ const queued = await enqueueDispatchRequest('alpha', {
80
+ kind: 'inbox',
81
+ to_worker: 'worker-1',
82
+ worker_index: 1,
83
+ trigger_message: 'ping',
84
+ }, cwd);
85
+ const modulePath = new URL('../../../scripts/notify-hook/team-dispatch.js', import.meta.url).pathname;
86
+ const mod = await import(pathToFileURL(modulePath).href);
87
+ await mod.drainPendingTeamDispatch({
88
+ cwd,
89
+ maxPerTick: 5,
90
+ injector: async () => ({ ok: true, reason: 'injected_for_test' }),
91
+ });
92
+ const second = await mod.drainPendingTeamDispatch({
93
+ cwd,
94
+ maxPerTick: 5,
95
+ injector: async () => ({ ok: true, reason: 'injected_for_test' }),
96
+ });
97
+ assert.equal(second.processed, 0);
98
+ const request = await readDispatchRequest('alpha', queued.request.request_id, cwd);
99
+ assert.equal(request?.status, 'notified');
100
+ }
101
+ finally {
102
+ await rm(cwd, { recursive: true, force: true });
103
+ }
104
+ });
105
+ it('skips non-hook transport preferences in hook consumer', async () => {
106
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-hook-team-dispatch-'));
107
+ try {
108
+ await initTeamState('alpha', 'task', 'executor', 1, cwd);
109
+ const queued = await enqueueDispatchRequest('alpha', {
110
+ kind: 'inbox',
111
+ to_worker: 'worker-1',
112
+ worker_index: 1,
113
+ trigger_message: 'ping',
114
+ transport_preference: 'transport_direct',
115
+ fallback_allowed: false,
116
+ }, cwd);
117
+ const modulePath = new URL('../../../scripts/notify-hook/team-dispatch.js', import.meta.url).pathname;
118
+ const mod = await import(pathToFileURL(modulePath).href);
119
+ const result = await mod.drainPendingTeamDispatch({
120
+ cwd,
121
+ maxPerTick: 5,
122
+ injector: async () => ({ ok: true, reason: 'injected_for_test' }),
123
+ });
124
+ assert.equal(result.processed, 0);
125
+ assert.equal(result.failed, 0);
126
+ assert.ok(result.skipped >= 1);
127
+ const request = await readDispatchRequest('alpha', queued.request.request_id, cwd);
128
+ assert.equal(request?.status, 'pending');
129
+ }
130
+ finally {
131
+ await rm(cwd, { recursive: true, force: true });
132
+ }
133
+ });
134
+ });
135
+ //# sourceMappingURL=notify-hook-team-dispatch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify-hook-team-dispatch.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-team-dispatch.test.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ const ALL_EVENT_TYPES = [
10
10
  'worker_stopped',
11
11
  'message_received',
12
12
  'shutdown_ack',
13
+ 'shutdown_gate',
13
14
  'approval_decision',
14
15
  'team_leader_nudge',
15
16
  ];
@@ -19,7 +20,7 @@ describe('team_append_event schema validation', () => {
19
20
  const enumRefMatch = src.match(/name:\s*'team_append_event'[\s\S]*?enum:\s*\[\.\.\.TEAM_EVENT_TYPES\]/);
20
21
  assert.ok(enumRefMatch, 'Expected team_append_event schema to reference TEAM_EVENT_TYPES');
21
22
  const enumValues = [...TEAM_EVENT_TYPES];
22
- assert.equal(enumValues.length, 8, `Expected 8 enum values, got ${enumValues.length}: ${enumValues.join(', ')}`);
23
+ assert.equal(enumValues.length, 9, `Expected 9 enum values, got ${enumValues.length}: ${enumValues.join(', ')}`);
23
24
  for (const eventType of ALL_EVENT_TYPES) {
24
25
  assert.ok(enumValues.includes(eventType), `Expected enum to include '${eventType}', got: ${enumValues.join(', ')}`);
25
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state-server-schema.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/state-server-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,eAAe,GAAG;IACtB,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,mBAAmB;IACnB,mBAAmB;CACX,CAAC;AAEX,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,yBAAyB,CAAC,EAAE,MAAM,CAAC,CAAC;QAEnF,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACxG,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,iEAAiE,CAAC,CAAC;QAE3F,MAAM,UAAU,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAEzC,MAAM,CAAC,KAAK,CACV,UAAU,CAAC,MAAM,EACjB,CAAC,EACD,+BAA+B,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,EAAE,CACP,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC9B,6BAA6B,SAAS,WAAW,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"state-server-schema.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/state-server-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,eAAe,GAAG;IACtB,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,mBAAmB;IACnB,mBAAmB;CACX,CAAC;AAEX,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,yBAAyB,CAAC,EAAE,MAAM,CAAC,CAAC;QAEnF,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACxG,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,iEAAiE,CAAC,CAAC;QAE3F,MAAM,UAAU,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAEzC,MAAM,CAAC,KAAK,CACV,UAAU,CAAC,MAAM,EACjB,CAAC,EACD,+BAA+B,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,EAAE,CACP,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC9B,6BAA6B,SAAS,WAAW,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
3
3
  import { mkdtemp, rm, readFile } from 'fs/promises';
4
4
  import { join } from 'path';
5
5
  import { tmpdir } from 'os';
6
- import { initTeamState, listMailboxMessages, } from '../state.js';
6
+ import { initTeamState, listMailboxMessages, listDispatchRequests, readDispatchRequest, } from '../state.js';
7
7
  import { queueInboxInstruction, queueDirectMailboxMessage, queueBroadcastMailboxMessage, } from '../mcp-comm.js';
8
8
  describe('mcp-comm', () => {
9
9
  it('queueInboxInstruction writes inbox before notifying', async () => {
@@ -11,7 +11,7 @@ describe('mcp-comm', () => {
11
11
  try {
12
12
  await initTeamState('alpha', 't', 'executor', 1, cwd);
13
13
  const events = [];
14
- const ok = await queueInboxInstruction({
14
+ const outcome = await queueInboxInstruction({
15
15
  teamName: 'alpha',
16
16
  workerName: 'worker-1',
17
17
  workerIndex: 1,
@@ -23,10 +23,12 @@ describe('mcp-comm', () => {
23
23
  const inboxPath = join(cwd, '.omx', 'state', 'team', 'alpha', 'workers', 'worker-1', 'inbox.md');
24
24
  const content = await readFile(inboxPath, 'utf-8');
25
25
  assert.match(content, /# hi/);
26
- return true;
26
+ return { ok: true, transport: 'tmux_send_keys', reason: 'sent' };
27
27
  },
28
28
  });
29
- assert.equal(ok, true);
29
+ assert.equal(outcome.ok, true);
30
+ assert.equal(outcome.transport, 'tmux_send_keys');
31
+ assert.ok(outcome.request_id);
30
32
  assert.deepEqual(events, ['notify']);
31
33
  }
32
34
  finally {
@@ -37,7 +39,7 @@ describe('mcp-comm', () => {
37
39
  const cwd = await mkdtemp(join(tmpdir(), 'omx-mcp-comm-'));
38
40
  try {
39
41
  await initTeamState('alpha', 't', 'executor', 2, cwd);
40
- await queueDirectMailboxMessage({
42
+ const outcome = await queueDirectMailboxMessage({
41
43
  teamName: 'alpha',
42
44
  fromWorker: 'worker-1',
43
45
  toWorker: 'worker-2',
@@ -45,12 +47,18 @@ describe('mcp-comm', () => {
45
47
  body: 'hello',
46
48
  triggerMessage: 'check mailbox',
47
49
  cwd,
48
- notify: async () => true,
50
+ notify: async () => ({ ok: true, transport: 'tmux_send_keys', reason: 'sent' }),
49
51
  });
52
+ assert.equal(outcome.ok, true);
53
+ assert.ok(outcome.request_id);
54
+ assert.ok(outcome.message_id);
50
55
  const mailbox = await listMailboxMessages('alpha', 'worker-2', cwd);
51
56
  assert.equal(mailbox.length, 1);
52
57
  assert.equal(mailbox[0]?.body, 'hello');
53
58
  assert.ok(mailbox[0]?.notified_at);
59
+ const requests = await listDispatchRequests('alpha', cwd, { kind: 'mailbox' });
60
+ assert.equal(requests.length, 1);
61
+ assert.equal(requests[0]?.message_id, mailbox[0]?.message_id);
54
62
  }
55
63
  finally {
56
64
  await rm(cwd, { recursive: true, force: true });
@@ -75,7 +83,7 @@ describe('mcp-comm', () => {
75
83
  triggerFor: (workerName) => `check mailbox ${workerName}`,
76
84
  notify: async (target) => {
77
85
  notified.push(target.workerName);
78
- return true;
86
+ return { ok: true, transport: 'tmux_send_keys', reason: 'sent' };
79
87
  },
80
88
  });
81
89
  const m1 = await listMailboxMessages('alpha', 'worker-1', cwd);
@@ -89,5 +97,107 @@ describe('mcp-comm', () => {
89
97
  await rm(cwd, { recursive: true, force: true });
90
98
  }
91
99
  });
100
+ it('prevents duplicate pending mailbox dispatch requests for same message id', async () => {
101
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mcp-comm-'));
102
+ try {
103
+ await initTeamState('alpha', 't', 'executor', 2, cwd);
104
+ const first = await queueDirectMailboxMessage({
105
+ teamName: 'alpha',
106
+ fromWorker: 'worker-1',
107
+ toWorker: 'worker-2',
108
+ toWorkerIndex: 2,
109
+ body: 'hello',
110
+ triggerMessage: 'check mailbox',
111
+ cwd,
112
+ notify: async () => ({ ok: false, transport: 'hook', reason: 'queued_pending' }),
113
+ });
114
+ assert.equal(first.ok, false);
115
+ assert.ok(first.message_id);
116
+ const requests = await listDispatchRequests('alpha', cwd, { kind: 'mailbox' });
117
+ assert.equal(requests.length, 1);
118
+ const second = await queueDirectMailboxMessage({
119
+ teamName: 'alpha',
120
+ fromWorker: 'worker-1',
121
+ toWorker: 'worker-2',
122
+ toWorkerIndex: 2,
123
+ body: 'hello-2',
124
+ triggerMessage: 'check mailbox',
125
+ cwd,
126
+ notify: async () => ({ ok: false, transport: 'hook', reason: 'queued_pending' }),
127
+ });
128
+ assert.equal(second.ok, false);
129
+ const allRequests = await listDispatchRequests('alpha', cwd, { kind: 'mailbox' });
130
+ // second message has distinct message_id -> second request exists
131
+ assert.equal(allRequests.length, 2);
132
+ }
133
+ finally {
134
+ await rm(cwd, { recursive: true, force: true });
135
+ }
136
+ });
137
+ it('marks direct dispatch request failed when notify transport fails (prevents poisoned pending)', async () => {
138
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mcp-comm-'));
139
+ try {
140
+ await initTeamState('alpha', 't', 'executor', 1, cwd);
141
+ const first = await queueInboxInstruction({
142
+ teamName: 'alpha',
143
+ workerName: 'worker-1',
144
+ workerIndex: 1,
145
+ inbox: '# hi',
146
+ triggerMessage: 'trigger',
147
+ cwd,
148
+ transportPreference: 'transport_direct',
149
+ fallbackAllowed: false,
150
+ notify: async () => ({ ok: false, transport: 'tmux_send_keys', reason: 'tmux_unavailable' }),
151
+ });
152
+ assert.equal(first.ok, false);
153
+ assert.ok(first.request_id);
154
+ const firstReq = await readDispatchRequest('alpha', first.request_id, cwd);
155
+ assert.equal(firstReq?.status, 'failed');
156
+ assert.equal(firstReq?.last_reason, 'tmux_unavailable');
157
+ const second = await queueInboxInstruction({
158
+ teamName: 'alpha',
159
+ workerName: 'worker-1',
160
+ workerIndex: 1,
161
+ inbox: '# hi again',
162
+ triggerMessage: 'trigger',
163
+ cwd,
164
+ transportPreference: 'transport_direct',
165
+ fallbackAllowed: false,
166
+ notify: async () => ({ ok: false, transport: 'tmux_send_keys', reason: 'tmux_unavailable' }),
167
+ });
168
+ assert.ok(second.request_id);
169
+ assert.notEqual(second.request_id, first.request_id);
170
+ }
171
+ finally {
172
+ await rm(cwd, { recursive: true, force: true });
173
+ }
174
+ });
175
+ it('marks prompt dispatch request failed when notify throws (prevents poisoned pending)', async () => {
176
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-mcp-comm-'));
177
+ try {
178
+ await initTeamState('alpha', 't', 'executor', 2, cwd);
179
+ const outcome = await queueDirectMailboxMessage({
180
+ teamName: 'alpha',
181
+ fromWorker: 'worker-1',
182
+ toWorker: 'worker-2',
183
+ toWorkerIndex: 2,
184
+ body: 'hello',
185
+ triggerMessage: 'check mailbox',
186
+ cwd,
187
+ transportPreference: 'prompt_stdin',
188
+ fallbackAllowed: false,
189
+ notify: async () => { throw new Error('stdin closed'); },
190
+ });
191
+ assert.equal(outcome.ok, false);
192
+ assert.match(outcome.reason, /^notify_exception:/);
193
+ assert.ok(outcome.request_id);
194
+ const request = await readDispatchRequest('alpha', outcome.request_id, cwd);
195
+ assert.equal(request?.status, 'failed');
196
+ assert.match(request?.last_reason ?? '', /^notify_exception:/);
197
+ }
198
+ finally {
199
+ await rm(cwd, { recursive: true, force: true });
200
+ }
201
+ });
92
202
  });
93
203
  //# sourceMappingURL=mcp-comm.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-comm.test.js","sourceRoot":"","sources":["../../../src/team/__tests__/mcp-comm.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-comm.test.js","sourceRoot":"","sources":["../../../src/team/__tests__/mcp-comm.test.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { join } from 'path';
5
5
  import { tmpdir } from 'os';
6
6
  import { existsSync } from 'fs';
7
7
  import { spawn } from 'child_process';
8
- import { initTeamState, createTask, listMailboxMessages, updateWorkerHeartbeat, writeAtomic, readTask, readMonitorSnapshot, claimTask, transitionTaskStatus, } from '../state.js';
8
+ import { initTeamState, createTask, readTeamConfig, saveTeamConfig, listMailboxMessages, listDispatchRequests, updateWorkerHeartbeat, writeAtomic, readTask, readMonitorSnapshot, claimTask, transitionTaskStatus, } from '../state.js';
9
9
  import { monitorTeam, shutdownTeam, resumeTeam, startTeam, assignTask, sendWorkerMessage, resolveWorkerLaunchArgsFromEnv, resolveCanonicalTeamStateRoot, TEAM_LOW_COMPLEXITY_DEFAULT_MODEL, } from '../runtime.js';
10
10
  function withEmptyPath(fn) {
11
11
  const prev = process.env.PATH;
@@ -890,5 +890,45 @@ esac
890
890
  await rm(cwd, { recursive: true, force: true });
891
891
  }
892
892
  });
893
+ it('sendWorkerMessage hook-preferred path for leader waits for receipt then falls back to direct notify', async () => {
894
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-leader-hook-'));
895
+ const binDir = join(cwd, 'bin');
896
+ const fakeTmuxPath = join(binDir, 'tmux');
897
+ const prevPath = process.env.PATH;
898
+ try {
899
+ await mkdir(binDir, { recursive: true });
900
+ await writeFile(fakeTmuxPath, `#!/usr/bin/env node
901
+ const args = process.argv.slice(2);
902
+ if (args[0] === '-V') {
903
+ console.log('tmux 3.4');
904
+ process.exit(0);
905
+ }
906
+ process.exit(0);
907
+ `, { mode: 0o755 });
908
+ process.env.PATH = `${binDir}:${prevPath ?? ''}`;
909
+ await initTeamState('team-leader-hook', 'leader hook fallback test', 'executor', 1, cwd);
910
+ const cfg = await readTeamConfig('team-leader-hook', cwd);
911
+ assert.ok(cfg);
912
+ if (!cfg)
913
+ throw new Error('missing team config');
914
+ cfg.leader_pane_id = '%999';
915
+ await saveTeamConfig(cfg, cwd);
916
+ await sendWorkerMessage('team-leader-hook', 'worker-1', 'leader-fixed', 'hello leader', cwd);
917
+ const mailbox = await listMailboxMessages('team-leader-hook', 'leader-fixed', cwd);
918
+ assert.equal(mailbox.length, 1);
919
+ assert.ok(mailbox[0]?.notified_at);
920
+ const requests = await listDispatchRequests('team-leader-hook', cwd, { kind: 'mailbox' });
921
+ assert.equal(requests.length, 1);
922
+ assert.equal(requests[0]?.status, 'notified');
923
+ assert.match(requests[0]?.last_reason ?? '', /^fallback_confirmed:/);
924
+ }
925
+ finally {
926
+ if (typeof prevPath === 'string')
927
+ process.env.PATH = prevPath;
928
+ else
929
+ delete process.env.PATH;
930
+ await rm(cwd, { recursive: true, force: true });
931
+ }
932
+ });
893
933
  });
894
934
  //# sourceMappingURL=runtime.test.js.map