oh-my-codex 0.7.0 → 0.7.2

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 (47) hide show
  1. package/dist/cli/__tests__/team.test.js +17 -0
  2. package/dist/cli/__tests__/team.test.js.map +1 -1
  3. package/dist/cli/team.d.ts.map +1 -1
  4. package/dist/cli/team.js +3 -2
  5. package/dist/cli/team.js.map +1 -1
  6. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +44 -0
  7. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  8. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts +2 -0
  9. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts.map +1 -0
  10. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +135 -0
  11. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -0
  12. package/dist/mcp/__tests__/state-server-schema.test.js +2 -1
  13. package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -1
  14. package/dist/team/__tests__/mcp-comm.test.js +117 -7
  15. package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
  16. package/dist/team/__tests__/runtime.test.js +58 -1
  17. package/dist/team/__tests__/runtime.test.js.map +1 -1
  18. package/dist/team/__tests__/state.test.js +76 -1
  19. package/dist/team/__tests__/state.test.js.map +1 -1
  20. package/dist/team/contracts.d.ts +1 -1
  21. package/dist/team/contracts.d.ts.map +1 -1
  22. package/dist/team/contracts.js +2 -0
  23. package/dist/team/contracts.js.map +1 -1
  24. package/dist/team/mcp-comm.d.ts +28 -4
  25. package/dist/team/mcp-comm.d.ts.map +1 -1
  26. package/dist/team/mcp-comm.js +172 -6
  27. package/dist/team/mcp-comm.js.map +1 -1
  28. package/dist/team/runtime.d.ts.map +1 -1
  29. package/dist/team/runtime.js +374 -41
  30. package/dist/team/runtime.js.map +1 -1
  31. package/dist/team/scaling.d.ts.map +1 -1
  32. package/dist/team/scaling.js +90 -13
  33. package/dist/team/scaling.js.map +1 -1
  34. package/dist/team/state.d.ts +54 -1
  35. package/dist/team/state.d.ts.map +1 -1
  36. package/dist/team/state.js +300 -5
  37. package/dist/team/state.js.map +1 -1
  38. package/dist/team/team-ops.d.ts +8 -1
  39. package/dist/team/team-ops.d.ts.map +1 -1
  40. package/dist/team/team-ops.js +7 -0
  41. package/dist/team/team-ops.js.map +1 -1
  42. package/package.json +1 -1
  43. package/scripts/notify-fallback-watcher.js +4 -0
  44. package/scripts/notify-hook/team-dispatch.js +274 -0
  45. package/scripts/notify-hook.js +11 -0
  46. package/skills/team/SKILL.md +3 -2
  47. package/skills/worker/SKILL.md +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-comm.js","sourceRoot":"","sources":["../../src/team/mcp-comm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,IAAI,gBAAgB,EACxC,eAAe,IAAI,iBAAiB,EACpC,aAAa,IAAI,gBAAgB,EACjC,uBAAuB,IAAI,mBAAmB,GAC/C,MAAM,eAAe,CAAC;AAqBvB,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAwB;IAClE,MAAM,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACrF,OAAO,MAAM,MAAM,CAAC,MAAM,CACxB,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EACzF,MAAM,CAAC,cAAc,CACtB,CAAC;AACJ,CAAC;AAcD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,MAAgC;IAC9E,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACtH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAClC,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAC3F,MAAM,CAAC,cAAc,CACtB,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,MAA4B;IAC7E,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACrG,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAClC,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,EAClG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CACxC,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"mcp-comm.js","sourceRoot":"","sources":["../../src/team/mcp-comm.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/team/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/team/runtime.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,8 @@ import { readdir, readFile } from 'fs/promises';
4
4
  import { performance } from 'perf_hooks';
5
5
  import { spawn } from 'child_process';
6
6
  import { sanitizeTeamName, isTmuxAvailable, createTeamSession, buildWorkerProcessLaunchSpec, resolveTeamWorkerCli, resolveTeamWorkerCliPlan, resolveTeamWorkerLaunchMode, waitForWorkerReady, sendToWorker, sendToWorkerStdin, notifyLeaderStatus, isWorkerAlive, getWorkerPanePid, killWorker, killWorkerByPaneId, unregisterResizeHook, destroyTeamSession, listTeamSessions, } from './tmux-session.js';
7
- import { teamInit as initTeamState, DEFAULT_MAX_WORKERS, teamReadConfig as readTeamConfig, teamWriteWorkerIdentity as writeWorkerIdentity, teamReadWorkerHeartbeat as readWorkerHeartbeat, teamReadWorkerStatus as readWorkerStatus, teamWriteWorkerInbox as writeWorkerInbox, teamCreateTask as createStateTask, teamReadTask as readTask, teamListTasks as listTasks, teamReadManifest as readTeamManifestV2, teamClaimTask as claimTask, teamReleaseTaskClaim as releaseTaskClaim, teamAppendEvent as appendTeamEvent, teamReadTaskApproval as readTaskApproval, teamListMailbox as listMailboxMessages, teamMarkMessageNotified as markMessageNotified, teamCleanup as cleanupTeamState, teamSaveConfig as saveTeamConfig, teamWriteShutdownRequest as writeShutdownRequest, teamReadShutdownAck as readShutdownAck, teamReadMonitorSnapshot as readMonitorSnapshot, teamWriteMonitorSnapshot as writeMonitorSnapshot, teamReadPhase as readTeamPhaseState, teamWritePhase as writeTeamPhaseState, } from './team-ops.js';
8
- import { queueInboxInstruction, queueDirectMailboxMessage, queueBroadcastMailboxMessage, } from './mcp-comm.js';
7
+ import { teamInit as initTeamState, DEFAULT_MAX_WORKERS, teamReadConfig as readTeamConfig, teamWriteWorkerIdentity as writeWorkerIdentity, teamReadWorkerHeartbeat as readWorkerHeartbeat, teamReadWorkerStatus as readWorkerStatus, teamWriteWorkerInbox as writeWorkerInbox, teamCreateTask as createStateTask, teamReadTask as readTask, teamListTasks as listTasks, teamReadManifest as readTeamManifestV2, teamNormalizePolicy as normalizeTeamPolicy, teamClaimTask as claimTask, teamReleaseTaskClaim as releaseTaskClaim, teamAppendEvent as appendTeamEvent, teamReadTaskApproval as readTaskApproval, teamListMailbox as listMailboxMessages, teamMarkMessageNotified as markMessageNotified, teamEnqueueDispatchRequest as enqueueDispatchRequest, teamMarkDispatchRequestNotified as markDispatchRequestNotified, teamTransitionDispatchRequest as transitionDispatchRequest, teamReadDispatchRequest as readDispatchRequest, teamCleanup as cleanupTeamState, teamSaveConfig as saveTeamConfig, teamWriteShutdownRequest as writeShutdownRequest, teamReadShutdownAck as readShutdownAck, teamReadMonitorSnapshot as readMonitorSnapshot, teamWriteMonitorSnapshot as writeMonitorSnapshot, teamReadPhase as readTeamPhaseState, teamWritePhase as writeTeamPhaseState, } from './team-ops.js';
8
+ import { queueInboxInstruction, queueDirectMailboxMessage, queueBroadcastMailboxMessage, waitForDispatchReceipt, } from './mcp-comm.js';
9
9
  import { generateWorkerOverlay, writeTeamWorkerInstructionsFile, removeTeamWorkerInstructionsFile, generateInitialInbox, generateTaskAssignmentInbox, generateShutdownInbox, generateTriggerMessage, generateMailboxTriggerMessage, } from './worker-bootstrap.js';
10
10
  import { isLowComplexityAgentType, resolveTeamWorkerLaunchArgs, TEAM_LOW_COMPLEXITY_DEFAULT_MODEL, resolveTeamLowComplexityDefaultModel, parseTeamWorkerLaunchArgs, splitWorkerLaunchArgs, } from './model-contract.js';
11
11
  import { inferPhaseTargetFromTaskCounts, reconcilePhaseStateForMonitor } from './phase-controller.js';
@@ -393,6 +393,8 @@ export async function startTeam(teamName, task, agentType, workerCount, tasks, c
393
393
  await saveTeamConfig(config, leaderCwd);
394
394
  // 7. Wait for all workers to be ready (interactive mode), then bootstrap them
395
395
  const allTasks = await listTasks(sanitized, leaderCwd);
396
+ const manifest = await readTeamManifestV2(sanitized, leaderCwd);
397
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, workerLaunchMode);
396
398
  for (let i = 1; i <= workerCount; i++) {
397
399
  const workerName = `worker-${i}`;
398
400
  const paneId = workerPaneIds[i - 1];
@@ -446,17 +448,19 @@ export async function startTeam(teamName, task, agentType, workerCount, tasks, c
446
448
  leaderCwd,
447
449
  });
448
450
  const trigger = generateTriggerMessage(workerName, sanitized);
449
- const notified = await queueInboxInstruction({
451
+ const dispatchOutcome = await dispatchCriticalInboxInstruction({
450
452
  teamName: sanitized,
453
+ config: config,
451
454
  workerName,
452
455
  workerIndex: i,
453
456
  paneId,
454
457
  inbox,
455
458
  triggerMessage: trigger,
456
459
  cwd: leaderCwd,
457
- notify: (_target, message) => notifyWorker(config, i, message, paneId),
460
+ dispatchPolicy,
461
+ inboxCorrelationKey: `startup:${workerName}`,
458
462
  });
459
- if (!notified) {
463
+ if (!dispatchOutcome.ok) {
460
464
  throw new Error(`worker_notify_failed:${workerName}`);
461
465
  }
462
466
  }
@@ -568,6 +572,8 @@ export async function monitorTeam(teamName, cwd) {
568
572
  const config = await readTeamConfig(sanitized, cwd);
569
573
  if (!config)
570
574
  return null;
575
+ const manifest = await readTeamManifestV2(sanitized, cwd);
576
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
571
577
  const previousSnapshot = await readMonitorSnapshot(sanitized, cwd);
572
578
  const sessionName = config.tmux_session;
573
579
  const listTasksStartMs = performance.now();
@@ -660,7 +666,7 @@ export async function monitorTeam(teamName, cwd) {
660
666
  const phase = phaseState.current_phase;
661
667
  await emitMonitorDerivedEvents(sanitized, allTasks, workers, previousSnapshot, cwd);
662
668
  const mailboxDeliveryStartMs = performance.now();
663
- const mailboxNotifiedByMessageId = await deliverPendingMailboxMessages(sanitized, config, workers, previousSnapshot?.mailboxNotifiedByMessageId ?? {}, cwd);
669
+ const mailboxNotifiedByMessageId = await deliverPendingMailboxMessages(sanitized, config, workers, previousSnapshot?.mailboxNotifiedByMessageId ?? {}, dispatchPolicy, cwd);
664
670
  const mailboxDeliveryMs = performance.now() - mailboxDeliveryStartMs;
665
671
  const updatedAt = new Date().toISOString();
666
672
  const totalMs = performance.now() - monitorStartMs;
@@ -725,6 +731,7 @@ export async function assignTask(teamName, workerName, taskId, cwd) {
725
731
  const workerInfo = config.workers.find(w => w.name === workerName);
726
732
  if (!workerInfo)
727
733
  throw new Error(`Worker ${workerName} not found in team`);
734
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
728
735
  const claim = await claimTask(sanitized, taskId, workerName, task.version ?? 1, cwd);
729
736
  if (!claim.ok) {
730
737
  if (claim.error === 'blocked_dependency') {
@@ -734,17 +741,19 @@ export async function assignTask(teamName, workerName, taskId, cwd) {
734
741
  }
735
742
  try {
736
743
  const inbox = generateTaskAssignmentInbox(workerName, sanitized, taskId, task.description);
737
- const notified = await queueInboxInstruction({
744
+ const outcome = await dispatchCriticalInboxInstruction({
738
745
  teamName: sanitized,
746
+ config,
739
747
  workerName,
740
748
  workerIndex: workerInfo.index,
741
749
  paneId: workerInfo.pane_id,
742
750
  inbox,
743
751
  triggerMessage: generateTriggerMessage(workerName, sanitized),
744
752
  cwd,
745
- notify: (_target, message) => notifyWorker(config, workerInfo.index, message, workerInfo.pane_id),
753
+ dispatchPolicy,
754
+ inboxCorrelationKey: `assign:${taskId}:${workerName}`,
746
755
  });
747
- if (!notified) {
756
+ if (!outcome.ok) {
748
757
  throw new Error('worker_notify_failed');
749
758
  }
750
759
  }
@@ -812,7 +821,16 @@ export async function shutdownTeam(teamName, cwd, options = {}) {
812
821
  throw new Error(`shutdown_gate_blocked:pending=${gate.pending},blocked=${gate.blocked},in_progress=${gate.in_progress},failed=${gate.failed}`);
813
822
  }
814
823
  }
824
+ if (force) {
825
+ await appendTeamEvent(sanitized, {
826
+ type: 'shutdown_gate_forced',
827
+ worker: 'leader-fixed',
828
+ reason: 'force_bypass',
829
+ }, cwd).catch(() => { });
830
+ }
815
831
  const sessionName = config.tmux_session;
832
+ const manifest = await readTeamManifestV2(sanitized, cwd);
833
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
816
834
  const shutdownRequestTimes = new Map();
817
835
  // 1. Send shutdown inbox to each worker
818
836
  for (const w of config.workers) {
@@ -820,19 +838,18 @@ export async function shutdownTeam(teamName, cwd, options = {}) {
820
838
  const requestedAt = new Date().toISOString();
821
839
  await writeShutdownRequest(sanitized, w.name, 'leader-fixed', cwd);
822
840
  shutdownRequestTimes.set(w.name, requestedAt);
823
- const notified = await queueInboxInstruction({
841
+ await dispatchCriticalInboxInstruction({
824
842
  teamName: sanitized,
843
+ config,
825
844
  workerName: w.name,
826
845
  workerIndex: w.index,
827
846
  paneId: w.pane_id,
828
847
  inbox: generateShutdownInbox(sanitized, w.name),
829
848
  triggerMessage: generateTriggerMessage(w.name, sanitized),
830
849
  cwd,
831
- notify: (_target, message) => notifyWorker(config, w.index, message, w.pane_id),
850
+ dispatchPolicy,
851
+ inboxCorrelationKey: `shutdown:${w.name}`,
832
852
  });
833
- if (!notified) {
834
- // best effort: worker may already be gone
835
- }
836
853
  }
837
854
  catch { /* worker might already be dead */ }
838
855
  }
@@ -1088,38 +1105,212 @@ async function emitMonitorDerivedEvents(teamName, tasks, workers, previous, cwd)
1088
1105
  }
1089
1106
  }
1090
1107
  }
1091
- function notifyWorker(config, workerIndex, message, workerPaneId) {
1108
+ function notifyWorkerOutcome(config, workerIndex, message, workerPaneId) {
1092
1109
  const worker = config.workers.find((candidate) => candidate.index === workerIndex);
1093
1110
  if (!worker)
1094
- return false;
1111
+ return { ok: false, transport: 'none', reason: 'worker_not_found' };
1095
1112
  if (config.worker_launch_mode === 'prompt') {
1096
1113
  const handle = getPromptWorkerHandle(config.name, worker.name);
1097
1114
  if (!handle)
1098
- return false;
1115
+ return { ok: false, transport: 'prompt_stdin', reason: 'prompt_worker_handle_missing' };
1099
1116
  try {
1100
1117
  sendToWorkerStdin(handle.child.stdin, message);
1101
- return true;
1118
+ return { ok: true, transport: 'prompt_stdin', reason: 'prompt_stdin_sent' };
1102
1119
  }
1103
- catch {
1104
- return false;
1120
+ catch (error) {
1121
+ return {
1122
+ ok: false,
1123
+ transport: 'prompt_stdin',
1124
+ reason: `prompt_stdin_failed:${error instanceof Error ? error.message : String(error)}`,
1125
+ };
1105
1126
  }
1106
1127
  }
1107
- if (!config.tmux_session || !isTmuxAvailable())
1108
- return false;
1128
+ if (!config.tmux_session || !isTmuxAvailable()) {
1129
+ return { ok: false, transport: 'tmux_send_keys', reason: 'tmux_unavailable' };
1130
+ }
1109
1131
  try {
1110
1132
  sendToWorker(config.tmux_session, workerIndex, message, workerPaneId, worker.worker_cli);
1111
- return true;
1133
+ return { ok: true, transport: 'tmux_send_keys', reason: 'tmux_send_keys_sent' };
1112
1134
  }
1113
- catch {
1114
- return false;
1135
+ catch (error) {
1136
+ return {
1137
+ ok: false,
1138
+ transport: 'tmux_send_keys',
1139
+ reason: `tmux_send_keys_failed:${error instanceof Error ? error.message : String(error)}`,
1140
+ };
1115
1141
  }
1116
1142
  }
1143
+ function resolveDispatchPolicy(manifestPolicy, workerLaunchMode) {
1144
+ return normalizeTeamPolicy(manifestPolicy, {
1145
+ display_mode: manifestPolicy?.display_mode === 'split_pane' ? 'split_pane' : 'auto',
1146
+ worker_launch_mode: workerLaunchMode,
1147
+ });
1148
+ }
1149
+ async function dispatchCriticalInboxInstruction(params) {
1150
+ const { teamName, config, workerName, workerIndex, paneId, inbox, triggerMessage, cwd, dispatchPolicy, inboxCorrelationKey } = params;
1151
+ if (config.worker_launch_mode === 'prompt') {
1152
+ return await queueInboxInstruction({
1153
+ teamName,
1154
+ workerName,
1155
+ workerIndex,
1156
+ paneId,
1157
+ inbox,
1158
+ triggerMessage,
1159
+ cwd,
1160
+ transportPreference: 'prompt_stdin',
1161
+ fallbackAllowed: false,
1162
+ inboxCorrelationKey,
1163
+ notify: (_target, message) => notifyWorkerOutcome(config, workerIndex, message, paneId),
1164
+ });
1165
+ }
1166
+ if (dispatchPolicy.dispatch_mode === 'transport_direct') {
1167
+ return await queueInboxInstruction({
1168
+ teamName,
1169
+ workerName,
1170
+ workerIndex,
1171
+ paneId,
1172
+ inbox,
1173
+ triggerMessage,
1174
+ cwd,
1175
+ transportPreference: 'transport_direct',
1176
+ fallbackAllowed: false,
1177
+ inboxCorrelationKey,
1178
+ notify: (_target, message) => notifyWorkerOutcome(config, workerIndex, message, paneId),
1179
+ });
1180
+ }
1181
+ const queued = await queueInboxInstruction({
1182
+ teamName,
1183
+ workerName,
1184
+ workerIndex,
1185
+ paneId,
1186
+ inbox,
1187
+ triggerMessage,
1188
+ cwd,
1189
+ transportPreference: 'hook_preferred_with_fallback',
1190
+ fallbackAllowed: true,
1191
+ inboxCorrelationKey,
1192
+ notify: () => ({ ok: true, transport: 'hook', reason: 'queued_for_hook_dispatch' }),
1193
+ });
1194
+ if (!queued.request_id)
1195
+ return { ...queued, ok: false, reason: 'dispatch_request_missing_id' };
1196
+ const receipt = await waitForDispatchReceipt(teamName, queued.request_id, cwd, {
1197
+ timeoutMs: dispatchPolicy.dispatch_ack_timeout_ms,
1198
+ pollMs: 50,
1199
+ });
1200
+ if (receipt && (receipt.status === 'notified' || receipt.status === 'delivered')) {
1201
+ return { ok: true, transport: 'hook', reason: `hook_receipt_${receipt.status}`, request_id: queued.request_id };
1202
+ }
1203
+ if (receipt?.status === 'failed') {
1204
+ const fallback = notifyWorkerOutcome(config, workerIndex, triggerMessage, paneId);
1205
+ if (fallback.ok) {
1206
+ await transitionDispatchRequest(teamName, queued.request_id, 'failed', 'failed', { last_reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}` }, cwd).catch(() => { });
1207
+ return {
1208
+ ok: true,
1209
+ transport: fallback.transport,
1210
+ reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}`,
1211
+ request_id: queued.request_id,
1212
+ };
1213
+ }
1214
+ await transitionDispatchRequest(teamName, queued.request_id, receipt.status, 'failed', { last_reason: `fallback_attempted_but_unconfirmed:${fallback.reason}` }, cwd).catch(() => { });
1215
+ return {
1216
+ ok: false,
1217
+ transport: fallback.transport,
1218
+ reason: `fallback_attempted_but_unconfirmed:${fallback.reason}`,
1219
+ request_id: queued.request_id,
1220
+ };
1221
+ }
1222
+ const fallback = notifyWorkerOutcome(config, workerIndex, triggerMessage, paneId);
1223
+ if (fallback.ok) {
1224
+ const marked = await markDispatchRequestNotified(teamName, queued.request_id, { last_reason: `fallback_confirmed:${fallback.reason}` }, cwd);
1225
+ if (!marked) {
1226
+ await transitionDispatchRequest(teamName, queued.request_id, 'failed', 'failed', { last_reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}` }, cwd).catch(() => { });
1227
+ }
1228
+ return {
1229
+ ok: true,
1230
+ transport: fallback.transport,
1231
+ reason: `hook_timeout_fallback_confirmed:${fallback.reason}`,
1232
+ request_id: queued.request_id,
1233
+ };
1234
+ }
1235
+ const current = await readDispatchRequest(teamName, queued.request_id, cwd);
1236
+ if (current && current.status !== 'failed') {
1237
+ await transitionDispatchRequest(teamName, queued.request_id, current.status, 'failed', { last_reason: `fallback_attempted_but_unconfirmed:${fallback.reason}` }, cwd).catch(() => { });
1238
+ }
1239
+ return {
1240
+ ok: false,
1241
+ transport: fallback.transport,
1242
+ reason: `fallback_attempted_but_unconfirmed:${fallback.reason}`,
1243
+ request_id: queued.request_id,
1244
+ };
1245
+ }
1246
+ async function finalizeHookPreferredMailboxDispatch(params) {
1247
+ const { teamName, requestId, workerName, workerIndex, paneId, messageId, triggerMessage, config, dispatchPolicy, cwd, fallbackNotify, } = params;
1248
+ const receipt = await waitForDispatchReceipt(teamName, requestId, cwd, {
1249
+ timeoutMs: dispatchPolicy.dispatch_ack_timeout_ms,
1250
+ pollMs: 50,
1251
+ });
1252
+ if (receipt && (receipt.status === 'notified' || receipt.status === 'delivered')) {
1253
+ await markMessageNotified(teamName, workerName, messageId, cwd).catch(() => false);
1254
+ return { ok: true, transport: 'hook', reason: `hook_receipt_${receipt.status}`, request_id: requestId, message_id: messageId };
1255
+ }
1256
+ const fallback = fallbackNotify
1257
+ ? fallbackNotify()
1258
+ : (typeof workerIndex === 'number'
1259
+ ? notifyWorkerOutcome(config, workerIndex, triggerMessage, paneId)
1260
+ : { ok: false, transport: 'none', reason: 'missing_worker_index' });
1261
+ if (receipt?.status === 'failed') {
1262
+ if (fallback.ok) {
1263
+ await markMessageNotified(teamName, workerName, messageId, cwd).catch(() => false);
1264
+ await transitionDispatchRequest(teamName, requestId, 'failed', 'failed', { message_id: messageId, last_reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}` }, cwd).catch(() => { });
1265
+ return {
1266
+ ok: true,
1267
+ transport: fallback.transport,
1268
+ reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}`,
1269
+ request_id: requestId,
1270
+ message_id: messageId,
1271
+ };
1272
+ }
1273
+ await transitionDispatchRequest(teamName, requestId, 'failed', 'failed', { message_id: messageId, last_reason: `fallback_attempted_but_unconfirmed:${fallback.reason}` }, cwd).catch(() => { });
1274
+ return {
1275
+ ok: false,
1276
+ transport: fallback.transport,
1277
+ reason: `fallback_attempted_but_unconfirmed:${fallback.reason}`,
1278
+ request_id: requestId,
1279
+ message_id: messageId,
1280
+ };
1281
+ }
1282
+ if (fallback.ok) {
1283
+ await markMessageNotified(teamName, workerName, messageId, cwd).catch(() => false);
1284
+ const marked = await markDispatchRequestNotified(teamName, requestId, { message_id: messageId, last_reason: `fallback_confirmed:${fallback.reason}` }, cwd);
1285
+ if (!marked) {
1286
+ await transitionDispatchRequest(teamName, requestId, 'failed', 'failed', { message_id: messageId, last_reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}` }, cwd).catch(() => { });
1287
+ }
1288
+ return {
1289
+ ok: true,
1290
+ transport: fallback.transport,
1291
+ reason: `hook_timeout_fallback_confirmed:${fallback.reason}`,
1292
+ request_id: requestId,
1293
+ message_id: messageId,
1294
+ };
1295
+ }
1296
+ const current = await readDispatchRequest(teamName, requestId, cwd);
1297
+ if (current) {
1298
+ await transitionDispatchRequest(teamName, requestId, current.status, 'failed', { message_id: messageId, last_reason: `fallback_attempted_but_unconfirmed:${fallback.reason}` }, cwd).catch(() => { });
1299
+ }
1300
+ return {
1301
+ ok: false,
1302
+ transport: fallback.transport,
1303
+ reason: `fallback_attempted_but_unconfirmed:${fallback.reason}`,
1304
+ request_id: requestId,
1305
+ message_id: messageId,
1306
+ };
1307
+ }
1117
1308
  function notifyLeader(config, message) {
1118
1309
  if (!config.tmux_session)
1119
1310
  return false;
1120
1311
  return notifyLeaderStatus(config.tmux_session, message);
1121
1312
  }
1122
- async function deliverPendingMailboxMessages(teamName, config, workers, previousNotifications, cwd) {
1313
+ async function deliverPendingMailboxMessages(teamName, config, workers, previousNotifications, dispatchPolicy, cwd) {
1123
1314
  const nextNotifications = {};
1124
1315
  const pendingIdsAcrossTeam = new Set();
1125
1316
  for (const worker of workers) {
@@ -1148,12 +1339,46 @@ async function deliverPendingMailboxMessages(teamName, config, workers, previous
1148
1339
  continue;
1149
1340
  if (!worker.alive)
1150
1341
  continue;
1151
- const notifiedNow = notifyWorker(config, workerInfo.index, generateMailboxTriggerMessage(worker.name, teamName, unnotified.length), workerInfo.pane_id);
1152
- if (!notifiedNow)
1153
- continue;
1154
1342
  for (const msg of unnotified) {
1155
- const notified = await markMessageNotified(teamName, worker.name, msg.message_id, cwd);
1156
- if (notified) {
1343
+ const triggerMessage = generateMailboxTriggerMessage(worker.name, teamName, 1);
1344
+ const transportPreference = config.worker_launch_mode === 'prompt'
1345
+ ? 'prompt_stdin'
1346
+ : (dispatchPolicy.dispatch_mode === 'transport_direct' ? 'transport_direct' : 'hook_preferred_with_fallback');
1347
+ const fallbackAllowed = transportPreference === 'hook_preferred_with_fallback';
1348
+ const queued = await enqueueDispatchRequest(teamName, {
1349
+ kind: 'mailbox',
1350
+ to_worker: worker.name,
1351
+ worker_index: workerInfo.index,
1352
+ pane_id: workerInfo.pane_id,
1353
+ trigger_message: triggerMessage,
1354
+ message_id: msg.message_id,
1355
+ transport_preference: transportPreference,
1356
+ fallback_allowed: fallbackAllowed,
1357
+ }, cwd);
1358
+ let outcome;
1359
+ if (transportPreference === 'hook_preferred_with_fallback') {
1360
+ outcome = await finalizeHookPreferredMailboxDispatch({
1361
+ teamName,
1362
+ requestId: queued.request.request_id,
1363
+ workerName: worker.name,
1364
+ workerIndex: workerInfo.index,
1365
+ paneId: workerInfo.pane_id,
1366
+ messageId: msg.message_id,
1367
+ triggerMessage,
1368
+ config,
1369
+ dispatchPolicy,
1370
+ cwd,
1371
+ });
1372
+ }
1373
+ else {
1374
+ const direct = notifyWorkerOutcome(config, workerInfo.index, triggerMessage, workerInfo.pane_id);
1375
+ outcome = { ...direct, request_id: queued.request.request_id, message_id: msg.message_id };
1376
+ if (outcome.ok) {
1377
+ await markMessageNotified(teamName, worker.name, msg.message_id, cwd).catch(() => false);
1378
+ await markDispatchRequestNotified(teamName, queued.request.request_id, { message_id: msg.message_id, last_reason: outcome.reason }, cwd).catch(() => null);
1379
+ }
1380
+ }
1381
+ if (outcome.ok) {
1157
1382
  nextNotifications[msg.message_id] = new Date().toISOString();
1158
1383
  }
1159
1384
  }
@@ -1170,48 +1395,156 @@ export async function sendWorkerMessage(teamName, fromWorker, toWorker, body, cw
1170
1395
  const config = await readTeamConfig(sanitized, cwd);
1171
1396
  if (!config)
1172
1397
  throw new Error(`Team ${sanitized} not found`);
1398
+ const manifest = await readTeamManifestV2(sanitized, cwd);
1399
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
1173
1400
  if (toWorker === 'leader-fixed') {
1174
- await queueDirectMailboxMessage({
1401
+ const leaderTriggerMessage = `Team ${sanitized}: new worker message for leader from ${fromWorker}`;
1402
+ const leaderTransportPreference = dispatchPolicy.dispatch_mode === 'transport_direct'
1403
+ ? 'transport_direct'
1404
+ : 'hook_preferred_with_fallback';
1405
+ const outcome = await queueDirectMailboxMessage({
1175
1406
  teamName: sanitized,
1176
1407
  fromWorker,
1177
1408
  toWorker,
1409
+ toPaneId: config.leader_pane_id ?? undefined,
1178
1410
  body,
1179
- triggerMessage: `Team ${sanitized}: new worker message for leader from ${fromWorker}`,
1411
+ triggerMessage: leaderTriggerMessage,
1180
1412
  cwd,
1181
- notify: (_target, message) => notifyLeader(config, message),
1413
+ transportPreference: leaderTransportPreference,
1414
+ fallbackAllowed: leaderTransportPreference === 'hook_preferred_with_fallback',
1415
+ notify: (_target, message) => (leaderTransportPreference === 'hook_preferred_with_fallback'
1416
+ ? { ok: true, transport: 'hook', reason: 'queued_for_hook_dispatch' }
1417
+ : { ok: notifyLeader(config, message), transport: 'tmux_send_keys', reason: 'leader_notified' }),
1182
1418
  });
1419
+ let finalOutcome = outcome;
1420
+ const canLeaderFallbackDirectly = Boolean(config.leader_pane_id) && isTmuxAvailable();
1421
+ if (leaderTransportPreference === 'hook_preferred_with_fallback' && canLeaderFallbackDirectly) {
1422
+ if (!outcome.request_id || !outcome.message_id) {
1423
+ throw new Error('mailbox_notify_failed:dispatch_request_missing_id');
1424
+ }
1425
+ finalOutcome = await finalizeHookPreferredMailboxDispatch({
1426
+ teamName: sanitized,
1427
+ requestId: outcome.request_id,
1428
+ workerName: 'leader-fixed',
1429
+ paneId: config.leader_pane_id ?? undefined,
1430
+ messageId: outcome.message_id,
1431
+ triggerMessage: leaderTriggerMessage,
1432
+ config,
1433
+ dispatchPolicy,
1434
+ cwd,
1435
+ fallbackNotify: () => ({
1436
+ ok: notifyLeader(config, leaderTriggerMessage),
1437
+ transport: 'tmux_send_keys',
1438
+ reason: 'leader_notified',
1439
+ }),
1440
+ });
1441
+ }
1442
+ if (!finalOutcome.ok)
1443
+ throw new Error(`mailbox_notify_failed:${finalOutcome.reason}`);
1183
1444
  return;
1184
1445
  }
1185
1446
  const recipient = config.workers.find((w) => w.name === toWorker);
1186
1447
  if (!recipient)
1187
1448
  throw new Error(`Worker ${toWorker} not found in team`);
1188
- await queueDirectMailboxMessage({
1449
+ const triggerMessage = generateMailboxTriggerMessage(toWorker, sanitized, 1);
1450
+ const transportPreference = config.worker_launch_mode === 'prompt'
1451
+ ? 'prompt_stdin'
1452
+ : (dispatchPolicy.dispatch_mode === 'transport_direct' ? 'transport_direct' : 'hook_preferred_with_fallback');
1453
+ const outcome = await queueDirectMailboxMessage({
1189
1454
  teamName: sanitized,
1190
1455
  fromWorker,
1191
1456
  toWorker,
1192
1457
  toWorkerIndex: recipient.index,
1193
1458
  toPaneId: recipient.pane_id,
1194
1459
  body,
1195
- triggerMessage: generateMailboxTriggerMessage(toWorker, sanitized, 1),
1460
+ triggerMessage,
1196
1461
  cwd,
1197
- notify: (_target, message) => notifyWorker(config, recipient.index, message, recipient.pane_id),
1462
+ transportPreference,
1463
+ fallbackAllowed: transportPreference === 'hook_preferred_with_fallback',
1464
+ notify: (_target, message) => (transportPreference === 'hook_preferred_with_fallback'
1465
+ ? { ok: true, transport: 'hook', reason: 'queued_for_hook_dispatch' }
1466
+ : notifyWorkerOutcome(config, recipient.index, message, recipient.pane_id)),
1198
1467
  });
1468
+ let finalOutcome = outcome;
1469
+ if (transportPreference === 'hook_preferred_with_fallback') {
1470
+ if (!outcome.request_id || !outcome.message_id) {
1471
+ throw new Error('mailbox_notify_failed:dispatch_request_missing_id');
1472
+ }
1473
+ finalOutcome = await finalizeHookPreferredMailboxDispatch({
1474
+ teamName: sanitized,
1475
+ requestId: outcome.request_id,
1476
+ workerName: recipient.name,
1477
+ workerIndex: recipient.index,
1478
+ paneId: recipient.pane_id,
1479
+ messageId: outcome.message_id,
1480
+ triggerMessage,
1481
+ config,
1482
+ dispatchPolicy,
1483
+ cwd,
1484
+ });
1485
+ }
1486
+ if (!finalOutcome.ok)
1487
+ throw new Error(`mailbox_notify_failed:${finalOutcome.reason}`);
1199
1488
  }
1200
1489
  export async function broadcastWorkerMessage(teamName, fromWorker, body, cwd) {
1201
1490
  const sanitized = sanitizeTeamName(teamName);
1202
1491
  const config = await readTeamConfig(sanitized, cwd);
1203
1492
  if (!config)
1204
1493
  throw new Error(`Team ${sanitized} not found`);
1205
- await queueBroadcastMailboxMessage({
1494
+ const manifest = await readTeamManifestV2(sanitized, cwd);
1495
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
1496
+ const transportPreference = config.worker_launch_mode === 'prompt'
1497
+ ? 'prompt_stdin'
1498
+ : (dispatchPolicy.dispatch_mode === 'transport_direct' ? 'transport_direct' : 'hook_preferred_with_fallback');
1499
+ const outcomes = await queueBroadcastMailboxMessage({
1206
1500
  teamName: sanitized,
1207
1501
  fromWorker,
1208
1502
  recipients: config.workers.map((w) => ({ workerName: w.name, workerIndex: w.index, paneId: w.pane_id })),
1209
1503
  body,
1210
1504
  cwd,
1211
1505
  triggerFor: (workerName) => generateMailboxTriggerMessage(workerName, sanitized, 1),
1212
- notify: (target, message) => typeof target.workerIndex === 'number'
1213
- ? notifyWorker(config, target.workerIndex, message, target.paneId)
1214
- : false,
1506
+ transportPreference,
1507
+ fallbackAllowed: transportPreference === 'hook_preferred_with_fallback',
1508
+ notify: (target, message) => transportPreference === 'hook_preferred_with_fallback'
1509
+ ? { ok: true, transport: 'hook', reason: 'queued_for_hook_dispatch' }
1510
+ : (typeof target.workerIndex === 'number'
1511
+ ? notifyWorkerOutcome(config, target.workerIndex, message, target.paneId)
1512
+ : { ok: false, transport: 'none', reason: 'missing_worker_index' }),
1215
1513
  });
1514
+ const finalizedOutcomes = [];
1515
+ for (const outcome of outcomes) {
1516
+ if (transportPreference !== 'hook_preferred_with_fallback') {
1517
+ finalizedOutcomes.push(outcome);
1518
+ continue;
1519
+ }
1520
+ if (!outcome.request_id || !outcome.message_id) {
1521
+ finalizedOutcomes.push({ ...outcome, ok: false, reason: 'dispatch_request_missing_id' });
1522
+ continue;
1523
+ }
1524
+ const target = outcome.to_worker
1525
+ ? (config.workers.find((w) => w.name === outcome.to_worker) ?? null)
1526
+ : null;
1527
+ if (!target) {
1528
+ finalizedOutcomes.push({ ...outcome, ok: false, reason: 'missing_worker_index' });
1529
+ continue;
1530
+ }
1531
+ finalizedOutcomes.push(await finalizeHookPreferredMailboxDispatch({
1532
+ teamName: sanitized,
1533
+ requestId: outcome.request_id,
1534
+ workerName: target.name,
1535
+ workerIndex: target.index,
1536
+ paneId: target.pane_id,
1537
+ messageId: outcome.message_id,
1538
+ triggerMessage: generateMailboxTriggerMessage(target.name, sanitized, 1),
1539
+ config,
1540
+ dispatchPolicy,
1541
+ cwd,
1542
+ }));
1543
+ }
1544
+ const results = transportPreference === 'hook_preferred_with_fallback' ? finalizedOutcomes : outcomes;
1545
+ if (results.some((result) => !result.ok)) {
1546
+ const firstFailure = results.find((result) => !result.ok);
1547
+ throw new Error(`mailbox_notify_failed:${firstFailure?.reason ?? 'unknown'}`);
1548
+ }
1216
1549
  }
1217
1550
  //# sourceMappingURL=runtime.js.map