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.
- package/dist/cli/__tests__/team.test.js +17 -0
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +3 -2
- package/dist/cli/team.js.map +1 -1
- 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 +58 -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 +2 -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 +374 -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 +54 -1
- 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
|
@@ -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,
|
|
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":"AA0BA,OAAO,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/team/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/team/runtime.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
460
|
+
dispatchPolicy,
|
|
461
|
+
inboxCorrelationKey: `startup:${workerName}`,
|
|
458
462
|
});
|
|
459
|
-
if (!
|
|
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
|
|
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
|
-
|
|
753
|
+
dispatchPolicy,
|
|
754
|
+
inboxCorrelationKey: `assign:${taskId}:${workerName}`,
|
|
746
755
|
});
|
|
747
|
-
if (!
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1156
|
-
|
|
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
|
-
|
|
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:
|
|
1411
|
+
triggerMessage: leaderTriggerMessage,
|
|
1180
1412
|
cwd,
|
|
1181
|
-
|
|
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
|
-
|
|
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
|
|
1460
|
+
triggerMessage,
|
|
1196
1461
|
cwd,
|
|
1197
|
-
|
|
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
|
|
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
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
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
|