oh-my-codex 0.21.2 → 0.21.3
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/Cargo.toml +1 -1
- package/dist/cli/__tests__/index.test.js +21 -2
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/index.d.ts +5 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +32 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.js +6 -2
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.js +6 -2
- package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker.js +10 -2
- package/dist/scripts/notify-hook/team-worker.js.map +1 -1
- package/dist/team/__tests__/notice-ledger.test.js +66 -5
- package/dist/team/__tests__/notice-ledger.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +83 -1
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/shutdown-fallback.test.js +11 -1
- package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +195 -2
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/team-ops-contract.test.js +1 -0
- package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
- package/dist/team/__tests__/worker-runtime-identity.test.js +11 -1
- package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
- package/dist/team/mcp-comm.d.ts.map +1 -1
- package/dist/team/mcp-comm.js +130 -125
- package/dist/team/mcp-comm.js.map +1 -1
- package/dist/team/notice-ledger.d.ts +5 -0
- package/dist/team/notice-ledger.d.ts.map +1 -1
- package/dist/team/notice-ledger.js +82 -4
- package/dist/team/notice-ledger.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +44 -13
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/state/mailbox.js +22 -22
- package/dist/team/state/mailbox.js.map +1 -1
- package/dist/team/state.d.ts +2 -0
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +100 -4
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-ops.d.ts +1 -0
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +1 -0
- package/dist/team/team-ops.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/src/scripts/notify-hook/team-leader-nudge.ts +6 -2
- package/src/scripts/notify-hook/team-worker-stop.ts +6 -2
- package/src/scripts/notify-hook/team-worker.ts +10 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
1
|
+
import { afterEach, beforeEach, describe, it } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { execFileSync } from 'node:child_process';
|
|
4
4
|
import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
@@ -7,6 +7,16 @@ import { tmpdir } from 'node:os';
|
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { readTeamConfig, saveTeamConfig } from '../state.js';
|
|
9
9
|
import { shutdownTeam, startTeam } from '../runtime.js';
|
|
10
|
+
const ORIGINAL_OMX_RUNTIME_BRIDGE = process.env.OMX_RUNTIME_BRIDGE;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
process.env.OMX_RUNTIME_BRIDGE = '0';
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
if (typeof ORIGINAL_OMX_RUNTIME_BRIDGE === 'string')
|
|
16
|
+
process.env.OMX_RUNTIME_BRIDGE = ORIGINAL_OMX_RUNTIME_BRIDGE;
|
|
17
|
+
else
|
|
18
|
+
delete process.env.OMX_RUNTIME_BRIDGE;
|
|
19
|
+
});
|
|
10
20
|
async function initRepo() {
|
|
11
21
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-shutdown-fallback-'));
|
|
12
22
|
execFileSync('git', ['init'], { cwd, stdio: 'ignore' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shutdown-fallback.test.js","sourceRoot":"","sources":["../../../src/team/__tests__/shutdown-fallback.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"shutdown-fallback.test.js","sourceRoot":"","sources":["../../../src/team/__tests__/shutdown-fallback.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, it } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { chmod, mkdtemp, rm, writeFile, readFile, mkdir, open, rename, utimes, symlink } from 'fs/promises';
|
|
3
|
+
import { chmod, mkdtemp, rm, unlink, writeFile, readFile, mkdir, open, rename, utimes, symlink } from 'fs/promises';
|
|
4
4
|
import { join } from 'path';
|
|
5
5
|
import { tmpdir } from 'os';
|
|
6
6
|
import { existsSync, readFileSync } from 'fs';
|
|
7
|
-
import { ABSOLUTE_MAX_WORKERS, DEFAULT_MAX_WORKERS, cleanupTeamState, createTask, claimTask, computeTaskReadiness, getTeamSummary, initTeamState, listTasks, migrateV1ToV2, readTask, readTeamConfig, saveTeamConfig, recoverTeamMembershipTaskTransaction, commitTeamMembershipTaskTransaction, withTeamTaskBarrier, readTeamManifestV2, transitionTaskStatus, releaseTaskClaim, reclaimExpiredTaskClaim, sendDirectMessage, broadcastMessage, markMessageDelivered, markMessageNotified, listMailboxMessages, writeTaskApproval, readTaskApproval, readWorkerHeartbeat, readWorkerStatus, updateTask, updateWorkerHeartbeat, writeAtomic, setWriteAtomicRenameForTests, resetWriteAtomicRenameForTests, setWriteAtomicOpenForTests, resetWriteAtomicOpenForTests, setWriteAtomicPlatformForTests, resetWriteAtomicPlatformForTests, writeWorkerInbox, enqueueDispatchRequest, listDispatchRequests, markDispatchRequestNotified, markDispatchRequestDelivered, transitionDispatchRequest, readDispatchRequest, readMonitorSnapshot, resolveDispatchLockTimeoutMs, writeTeamManifestV2, removeDispatchRequestsForWorkers, withScalingLock, } from '../state.js';
|
|
7
|
+
import { ABSOLUTE_MAX_WORKERS, DEFAULT_MAX_WORKERS, cleanupTeamState, createTask, claimTask, computeTaskReadiness, getTeamSummary, initTeamState, listTasks, migrateV1ToV2, readTask, readTeamConfig, saveTeamConfig, recoverTeamMembershipTaskTransaction, commitTeamMembershipTaskTransaction, withTeamTaskBarrier, readTeamManifestV2, transitionTaskStatus, releaseTaskClaim, reclaimExpiredTaskClaim, sendDirectMessage, broadcastMessage, markMessageDelivered, markMessageNotified, listMailboxMessages, writeTaskApproval, readTaskApproval, readWorkerHeartbeat, readWorkerStatus, updateTask, updateWorkerHeartbeat, writeAtomic, setWriteAtomicRenameForTests, resetWriteAtomicRenameForTests, setWriteAtomicOpenForTests, resetWriteAtomicOpenForTests, setWriteAtomicPlatformForTests, resetWriteAtomicPlatformForTests, writeWorkerInbox, enqueueDispatchRequest, listDispatchRequests, markDispatchRequestNotified, markDispatchRequestDelivered, transitionDispatchRequest, readDispatchRequest, readMonitorSnapshot, resolveDispatchLockTimeoutMs, writeTeamManifestV2, removeDispatchRequestsForWorkers, retireTeamMailboxMessages, withScalingLock, } from '../state.js';
|
|
8
8
|
import { normalizeDispatchRequest } from '../state/dispatch.js';
|
|
9
9
|
import { claimTask as claimTaskWithDeps } from '../state/tasks.js';
|
|
10
10
|
import { withScalingLock as withScalingLeaseLock, withTeamLock } from '../state/locks.js';
|
|
@@ -1629,6 +1629,199 @@ exit 1
|
|
|
1629
1629
|
await rm(cwd, { recursive: true, force: true });
|
|
1630
1630
|
}
|
|
1631
1631
|
});
|
|
1632
|
+
it('retires only mailbox IDs proven by the selected Team shadow', async () => {
|
|
1633
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-mailbox-retire-'));
|
|
1634
|
+
const previousRuntimeBridge = process.env.OMX_RUNTIME_BRIDGE;
|
|
1635
|
+
try {
|
|
1636
|
+
process.env.OMX_RUNTIME_BRIDGE = '0';
|
|
1637
|
+
await Promise.all([
|
|
1638
|
+
initTeamState('team-retire-a', 't', 'executor', 1, cwd),
|
|
1639
|
+
initTeamState('team-retire-b', 't', 'executor', 1, cwd),
|
|
1640
|
+
]);
|
|
1641
|
+
const alpha = await sendDirectMessage('team-retire-a', 'leader-fixed', 'worker-1', 'alpha', cwd);
|
|
1642
|
+
const bravo = await sendDirectMessage('team-retire-b', 'leader-fixed', 'worker-1', 'bravo', cwd);
|
|
1643
|
+
assert.equal(await retireTeamMailboxMessages('team-retire-a', [], cwd), 1);
|
|
1644
|
+
const alphaMailbox = await listMailboxMessages('team-retire-a', 'worker-1', cwd);
|
|
1645
|
+
const bravoMailbox = await listMailboxMessages('team-retire-b', 'worker-1', cwd);
|
|
1646
|
+
assert.equal(typeof alphaMailbox.find((message) => message.message_id === alpha.message_id)?.delivered_at, 'string');
|
|
1647
|
+
assert.equal(bravoMailbox.find((message) => message.message_id === bravo.message_id)?.delivered_at, undefined);
|
|
1648
|
+
}
|
|
1649
|
+
finally {
|
|
1650
|
+
if (typeof previousRuntimeBridge === 'string')
|
|
1651
|
+
process.env.OMX_RUNTIME_BRIDGE = previousRuntimeBridge;
|
|
1652
|
+
else
|
|
1653
|
+
delete process.env.OMX_RUNTIME_BRIDGE;
|
|
1654
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1655
|
+
}
|
|
1656
|
+
});
|
|
1657
|
+
it('retires a proven Team mailbox message through the authoritative bridge', async () => {
|
|
1658
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-mailbox-retire-bridge-'));
|
|
1659
|
+
const previousRuntimeBinary = process.env.OMX_RUNTIME_BINARY;
|
|
1660
|
+
const previousRuntimeBridge = process.env.OMX_RUNTIME_BRIDGE;
|
|
1661
|
+
try {
|
|
1662
|
+
await initTeamState('team-retire-bridge', 't', 'executor', 1, cwd);
|
|
1663
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
1664
|
+
const runtimeLogPath = join(cwd, 'runtime.log');
|
|
1665
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
1666
|
+
await writeCompatRuntimeFixture(join(fakeBinDir, 'omx-runtime'), runtimeLogPath);
|
|
1667
|
+
process.env.OMX_RUNTIME_BINARY = join(fakeBinDir, 'omx-runtime');
|
|
1668
|
+
process.env.OMX_RUNTIME_BRIDGE = '1';
|
|
1669
|
+
const message = await sendDirectMessage('team-retire-bridge', 'leader-fixed', 'worker-1', 'done', cwd);
|
|
1670
|
+
assert.equal(await retireTeamMailboxMessages('team-retire-bridge', ['worker-1'], cwd), 1);
|
|
1671
|
+
const compat = JSON.parse(await readFile(join(cwd, '.omx', 'state', 'mailbox.json'), 'utf8'));
|
|
1672
|
+
assert.equal(typeof compat.records.find((record) => record.message_id === message.message_id)?.delivered_at, 'string');
|
|
1673
|
+
assert.match(await readFile(runtimeLogPath, 'utf8'), /MarkMailboxDelivered/);
|
|
1674
|
+
}
|
|
1675
|
+
finally {
|
|
1676
|
+
if (typeof previousRuntimeBinary === 'string')
|
|
1677
|
+
process.env.OMX_RUNTIME_BINARY = previousRuntimeBinary;
|
|
1678
|
+
else
|
|
1679
|
+
delete process.env.OMX_RUNTIME_BINARY;
|
|
1680
|
+
if (typeof previousRuntimeBridge === 'string')
|
|
1681
|
+
process.env.OMX_RUNTIME_BRIDGE = previousRuntimeBridge;
|
|
1682
|
+
else
|
|
1683
|
+
delete process.env.OMX_RUNTIME_BRIDGE;
|
|
1684
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1685
|
+
}
|
|
1686
|
+
});
|
|
1687
|
+
it('converges when the authoritative mailbox record was already delivered', async () => {
|
|
1688
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-mailbox-retire-already-delivered-'));
|
|
1689
|
+
const previousRuntimeBinary = process.env.OMX_RUNTIME_BINARY;
|
|
1690
|
+
const previousRuntimeBridge = process.env.OMX_RUNTIME_BRIDGE;
|
|
1691
|
+
try {
|
|
1692
|
+
await initTeamState('team-retire-already-delivered', 't', 'executor', 1, cwd);
|
|
1693
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
1694
|
+
const runtimeLogPath = join(cwd, 'runtime.log');
|
|
1695
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
1696
|
+
await writeCompatRuntimeFixture(join(fakeBinDir, 'omx-runtime'), runtimeLogPath);
|
|
1697
|
+
process.env.OMX_RUNTIME_BINARY = join(fakeBinDir, 'omx-runtime');
|
|
1698
|
+
process.env.OMX_RUNTIME_BRIDGE = '1';
|
|
1699
|
+
const message = await sendDirectMessage('team-retire-already-delivered', 'leader-fixed', 'worker-1', 'done', cwd);
|
|
1700
|
+
const compatPath = join(cwd, '.omx', 'state', 'mailbox.json');
|
|
1701
|
+
const compat = JSON.parse(await readFile(compatPath, 'utf8'));
|
|
1702
|
+
const record = compat.records.find((entry) => entry.message_id === message.message_id);
|
|
1703
|
+
assert.ok(record);
|
|
1704
|
+
record.delivered_at = new Date().toISOString();
|
|
1705
|
+
await writeFile(compatPath, JSON.stringify(compat, null, 2));
|
|
1706
|
+
assert.equal(await retireTeamMailboxMessages('team-retire-already-delivered', ['worker-1'], cwd), 1);
|
|
1707
|
+
const shadow = await listMailboxMessages('team-retire-already-delivered', 'worker-1', cwd);
|
|
1708
|
+
assert.equal(typeof shadow.find((entry) => entry.message_id === message.message_id)?.delivered_at, 'string');
|
|
1709
|
+
const deliveredCalls = (await readFile(runtimeLogPath, 'utf8')).split('MarkMailboxDelivered').length - 1;
|
|
1710
|
+
assert.equal(deliveredCalls, 0);
|
|
1711
|
+
}
|
|
1712
|
+
finally {
|
|
1713
|
+
if (typeof previousRuntimeBinary === 'string')
|
|
1714
|
+
process.env.OMX_RUNTIME_BINARY = previousRuntimeBinary;
|
|
1715
|
+
else
|
|
1716
|
+
delete process.env.OMX_RUNTIME_BINARY;
|
|
1717
|
+
if (typeof previousRuntimeBridge === 'string')
|
|
1718
|
+
process.env.OMX_RUNTIME_BRIDGE = previousRuntimeBridge;
|
|
1719
|
+
else
|
|
1720
|
+
delete process.env.OMX_RUNTIME_BRIDGE;
|
|
1721
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1722
|
+
}
|
|
1723
|
+
});
|
|
1724
|
+
it('fails closed when a matching authoritative mailbox record is malformed', async () => {
|
|
1725
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-mailbox-retire-malformed-record-'));
|
|
1726
|
+
const previousRuntimeBinary = process.env.OMX_RUNTIME_BINARY;
|
|
1727
|
+
const previousRuntimeBridge = process.env.OMX_RUNTIME_BRIDGE;
|
|
1728
|
+
try {
|
|
1729
|
+
await initTeamState('team-retire-malformed-record', 't', 'executor', 1, cwd);
|
|
1730
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
1731
|
+
const runtimeLogPath = join(cwd, 'runtime.log');
|
|
1732
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
1733
|
+
await writeCompatRuntimeFixture(join(fakeBinDir, 'omx-runtime'), runtimeLogPath);
|
|
1734
|
+
process.env.OMX_RUNTIME_BINARY = join(fakeBinDir, 'omx-runtime');
|
|
1735
|
+
process.env.OMX_RUNTIME_BRIDGE = '1';
|
|
1736
|
+
const message = await sendDirectMessage('team-retire-malformed-record', 'leader-fixed', 'worker-1', 'pending', cwd);
|
|
1737
|
+
const compatPath = join(cwd, '.omx', 'state', 'mailbox.json');
|
|
1738
|
+
const compat = JSON.parse(await readFile(compatPath, 'utf8'));
|
|
1739
|
+
const record = compat.records.find((entry) => entry.message_id === message.message_id);
|
|
1740
|
+
assert.ok(record);
|
|
1741
|
+
record.body = null;
|
|
1742
|
+
await writeFile(compatPath, JSON.stringify(compat, null, 2));
|
|
1743
|
+
await assert.rejects(retireTeamMailboxMessages('team-retire-malformed-record', ['worker-1'], cwd), /authoritative_mailbox_retirement_discovery_failed/);
|
|
1744
|
+
assert.equal((await readFile(runtimeLogPath, 'utf8')).split('MarkMailboxDelivered').length - 1, 0);
|
|
1745
|
+
}
|
|
1746
|
+
finally {
|
|
1747
|
+
if (typeof previousRuntimeBinary === 'string')
|
|
1748
|
+
process.env.OMX_RUNTIME_BINARY = previousRuntimeBinary;
|
|
1749
|
+
else
|
|
1750
|
+
delete process.env.OMX_RUNTIME_BINARY;
|
|
1751
|
+
if (typeof previousRuntimeBridge === 'string')
|
|
1752
|
+
process.env.OMX_RUNTIME_BRIDGE = previousRuntimeBridge;
|
|
1753
|
+
else
|
|
1754
|
+
delete process.env.OMX_RUNTIME_BRIDGE;
|
|
1755
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1756
|
+
}
|
|
1757
|
+
});
|
|
1758
|
+
it('reconciles an authoritative pending record after a delivered shadow fallback', async () => {
|
|
1759
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-mailbox-retire-shadow-fallback-'));
|
|
1760
|
+
const previousRuntimeBinary = process.env.OMX_RUNTIME_BINARY;
|
|
1761
|
+
const previousRuntimeBridge = process.env.OMX_RUNTIME_BRIDGE;
|
|
1762
|
+
try {
|
|
1763
|
+
await initTeamState('team-retire-shadow-fallback', 't', 'executor', 1, cwd);
|
|
1764
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
1765
|
+
const runtimeLogPath = join(cwd, 'runtime.log');
|
|
1766
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
1767
|
+
await writeCompatRuntimeFixture(join(fakeBinDir, 'omx-runtime'), runtimeLogPath);
|
|
1768
|
+
process.env.OMX_RUNTIME_BINARY = join(fakeBinDir, 'omx-runtime');
|
|
1769
|
+
process.env.OMX_RUNTIME_BRIDGE = '1';
|
|
1770
|
+
const message = await sendDirectMessage('team-retire-shadow-fallback', 'leader-fixed', 'worker-1', 'pending', cwd);
|
|
1771
|
+
const shadowPath = join(cwd, '.omx', 'state', 'team', 'team-retire-shadow-fallback', 'mailbox', 'worker-1.json');
|
|
1772
|
+
const shadow = JSON.parse(await readFile(shadowPath, 'utf8'));
|
|
1773
|
+
shadow.messages.find((entry) => entry.message_id === message.message_id).delivered_at = new Date().toISOString();
|
|
1774
|
+
await writeFile(shadowPath, JSON.stringify(shadow, null, 2));
|
|
1775
|
+
assert.equal(await retireTeamMailboxMessages('team-retire-shadow-fallback', ['worker-1'], cwd), 0);
|
|
1776
|
+
const compat = JSON.parse(await readFile(join(cwd, '.omx', 'state', 'mailbox.json'), 'utf8'));
|
|
1777
|
+
assert.equal(typeof compat.records.find((record) => record.message_id === message.message_id)?.delivered_at, 'string');
|
|
1778
|
+
assert.equal((await readFile(runtimeLogPath, 'utf8')).split('MarkMailboxDelivered').length - 1, 1);
|
|
1779
|
+
}
|
|
1780
|
+
finally {
|
|
1781
|
+
if (typeof previousRuntimeBinary === 'string')
|
|
1782
|
+
process.env.OMX_RUNTIME_BINARY = previousRuntimeBinary;
|
|
1783
|
+
else
|
|
1784
|
+
delete process.env.OMX_RUNTIME_BINARY;
|
|
1785
|
+
if (typeof previousRuntimeBridge === 'string')
|
|
1786
|
+
process.env.OMX_RUNTIME_BRIDGE = previousRuntimeBridge;
|
|
1787
|
+
else
|
|
1788
|
+
delete process.env.OMX_RUNTIME_BRIDGE;
|
|
1789
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1790
|
+
}
|
|
1791
|
+
});
|
|
1792
|
+
it('fails closed when authoritative mailbox compatibility output is absent', async () => {
|
|
1793
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-mailbox-retire-missing-compat-'));
|
|
1794
|
+
const previousRuntimeBinary = process.env.OMX_RUNTIME_BINARY;
|
|
1795
|
+
const previousRuntimeBridge = process.env.OMX_RUNTIME_BRIDGE;
|
|
1796
|
+
const teamName = 'team-retire-missing-compat';
|
|
1797
|
+
try {
|
|
1798
|
+
await initTeamState(teamName, 't', 'executor', 1, cwd);
|
|
1799
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
1800
|
+
const runtimeLogPath = join(cwd, 'runtime.log');
|
|
1801
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
1802
|
+
await writeCompatRuntimeFixture(join(fakeBinDir, 'omx-runtime'), runtimeLogPath);
|
|
1803
|
+
process.env.OMX_RUNTIME_BINARY = join(fakeBinDir, 'omx-runtime');
|
|
1804
|
+
process.env.OMX_RUNTIME_BRIDGE = '1';
|
|
1805
|
+
const message = await sendDirectMessage(teamName, 'leader-fixed', 'worker-1', 'pending', cwd);
|
|
1806
|
+
const compatPath = join(cwd, '.omx', 'state', 'mailbox.json');
|
|
1807
|
+
await unlink(compatPath);
|
|
1808
|
+
await assert.rejects(retireTeamMailboxMessages(teamName, ['worker-1'], cwd), /authoritative_mailbox_retirement_discovery_failed/);
|
|
1809
|
+
const shadow = await listMailboxMessages(teamName, 'worker-1', cwd);
|
|
1810
|
+
assert.equal(shadow.find((entry) => entry.message_id === message.message_id)?.delivered_at, undefined);
|
|
1811
|
+
assert.doesNotMatch(await readFile(runtimeLogPath, 'utf8'), /MarkMailboxDelivered/);
|
|
1812
|
+
}
|
|
1813
|
+
finally {
|
|
1814
|
+
if (typeof previousRuntimeBinary === 'string')
|
|
1815
|
+
process.env.OMX_RUNTIME_BINARY = previousRuntimeBinary;
|
|
1816
|
+
else
|
|
1817
|
+
delete process.env.OMX_RUNTIME_BINARY;
|
|
1818
|
+
if (typeof previousRuntimeBridge === 'string')
|
|
1819
|
+
process.env.OMX_RUNTIME_BRIDGE = previousRuntimeBridge;
|
|
1820
|
+
else
|
|
1821
|
+
delete process.env.OMX_RUNTIME_BRIDGE;
|
|
1822
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1823
|
+
}
|
|
1824
|
+
});
|
|
1632
1825
|
it('uses bridge-authored mailbox records while shadowing legacy mailbox bodies for recovery', async () => {
|
|
1633
1826
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-team-mailbox-bridge-authority-'));
|
|
1634
1827
|
const previousRuntimeBinary = process.env.OMX_RUNTIME_BINARY;
|