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.
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +44 -0
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts +2 -0
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +135 -0
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -0
- package/dist/mcp/__tests__/state-server-schema.test.js +2 -1
- package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
- package/dist/team/__tests__/mcp-comm.test.js +117 -7
- package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +41 -1
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +76 -1
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/contracts.d.ts +1 -1
- package/dist/team/contracts.d.ts.map +1 -1
- package/dist/team/contracts.js +1 -0
- package/dist/team/contracts.js.map +1 -1
- package/dist/team/mcp-comm.d.ts +28 -4
- package/dist/team/mcp-comm.d.ts.map +1 -1
- package/dist/team/mcp-comm.js +172 -6
- package/dist/team/mcp-comm.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +367 -41
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +90 -13
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state.d.ts +53 -0
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +300 -5
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-ops.d.ts +8 -1
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +7 -0
- package/dist/team/team-ops.js.map +1 -1
- package/package.json +1 -1
- package/scripts/notify-fallback-watcher.js +4 -0
- package/scripts/notify-hook/team-dispatch.js +274 -0
- package/scripts/notify-hook.js +11 -0
- package/skills/team/SKILL.md +3 -2
- 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
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 @@
|
|
|
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,
|
|
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
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AAExB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,
|
|
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
|