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.
Files changed (53) hide show
  1. package/Cargo.toml +1 -1
  2. package/dist/cli/__tests__/index.test.js +21 -2
  3. package/dist/cli/__tests__/index.test.js.map +1 -1
  4. package/dist/cli/index.d.ts +5 -1
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +32 -4
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  9. package/dist/scripts/notify-hook/team-leader-nudge.js +6 -2
  10. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  11. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
  12. package/dist/scripts/notify-hook/team-worker-stop.js +6 -2
  13. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
  14. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
  15. package/dist/scripts/notify-hook/team-worker.js +10 -2
  16. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  17. package/dist/team/__tests__/notice-ledger.test.js +66 -5
  18. package/dist/team/__tests__/notice-ledger.test.js.map +1 -1
  19. package/dist/team/__tests__/runtime.test.js +83 -1
  20. package/dist/team/__tests__/runtime.test.js.map +1 -1
  21. package/dist/team/__tests__/shutdown-fallback.test.js +11 -1
  22. package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -1
  23. package/dist/team/__tests__/state.test.js +195 -2
  24. package/dist/team/__tests__/state.test.js.map +1 -1
  25. package/dist/team/__tests__/team-ops-contract.test.js +1 -0
  26. package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
  27. package/dist/team/__tests__/worker-runtime-identity.test.js +11 -1
  28. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  29. package/dist/team/mcp-comm.d.ts.map +1 -1
  30. package/dist/team/mcp-comm.js +130 -125
  31. package/dist/team/mcp-comm.js.map +1 -1
  32. package/dist/team/notice-ledger.d.ts +5 -0
  33. package/dist/team/notice-ledger.d.ts.map +1 -1
  34. package/dist/team/notice-ledger.js +82 -4
  35. package/dist/team/notice-ledger.js.map +1 -1
  36. package/dist/team/runtime.d.ts.map +1 -1
  37. package/dist/team/runtime.js +44 -13
  38. package/dist/team/runtime.js.map +1 -1
  39. package/dist/team/state/mailbox.js +22 -22
  40. package/dist/team/state/mailbox.js.map +1 -1
  41. package/dist/team/state.d.ts +2 -0
  42. package/dist/team/state.d.ts.map +1 -1
  43. package/dist/team/state.js +100 -4
  44. package/dist/team/state.js.map +1 -1
  45. package/dist/team/team-ops.d.ts +1 -0
  46. package/dist/team/team-ops.d.ts.map +1 -1
  47. package/dist/team/team-ops.js +1 -0
  48. package/dist/team/team-ops.js.map +1 -1
  49. package/package.json +1 -1
  50. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  51. package/src/scripts/notify-hook/team-leader-nudge.ts +6 -2
  52. package/src/scripts/notify-hook/team-worker-stop.ts +6 -2
  53. 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":"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"}
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;