oh-my-codex 0.12.2 → 0.12.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.lock +5 -5
- package/Cargo.toml +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +56 -0
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +14 -8
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +26 -0
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +12 -0
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +36 -0
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +24 -7
- package/dist/team/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/scripts/__tests__/codex-native-hook.test.ts +36 -0
- package/src/scripts/codex-native-hook.ts +13 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/team/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAOL,KAAK,aAAa,EAGlB,KAAK,WAAW,EAgBjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAkCL,KAAK,UAAU,EAEf,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,QAAQ,EAOd,MAAM,eAAe,CAAC;AACvB,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AAoBvB,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
|
@@ -11,6 +11,7 @@ import { generateWorkerOverlay, writeTeamWorkerInstructionsFile, removeTeamWorke
|
|
|
11
11
|
import { loadRolePrompt } from './role-router.js';
|
|
12
12
|
import { composeRoleInstructionsForRole } from '../agents/native-config.js';
|
|
13
13
|
import { codexPromptsDir } from '../utils/paths.js';
|
|
14
|
+
import { isTerminalPhase } from './orchestrator.js';
|
|
14
15
|
import { resolveTeamWorkerLaunchArgs, TEAM_LOW_COMPLEXITY_DEFAULT_MODEL, parseTeamWorkerLaunchArgs, splitWorkerLaunchArgs, resolveAgentDefaultModel, resolveAgentReasoningEffort, } from './model-contract.js';
|
|
15
16
|
import { resolveCanonicalTeamStateRoot } from './state-root.js';
|
|
16
17
|
import { inferPhaseTargetFromTaskCounts, reconcilePhaseStateForMonitor } from './phase-controller.js';
|
|
@@ -50,6 +51,26 @@ async function syncRootTeamModeStateOnTerminalPhase(teamName, phase, cwd) {
|
|
|
50
51
|
// Best-effort compatibility sync only.
|
|
51
52
|
}
|
|
52
53
|
}
|
|
54
|
+
async function assertTeamStartupIsNonDestructive(teamName, cwd, leaderSessionId) {
|
|
55
|
+
const activeTeams = await findActiveTeams(cwd, leaderSessionId);
|
|
56
|
+
if (activeTeams.length > 0) {
|
|
57
|
+
throw new Error(`leader_session_conflict: active team exists (${activeTeams.join(', ')})`);
|
|
58
|
+
}
|
|
59
|
+
const [existingConfig, existingManifest, existingPhase] = await Promise.all([
|
|
60
|
+
readTeamConfig(teamName, cwd),
|
|
61
|
+
readTeamManifestV2(teamName, cwd),
|
|
62
|
+
readTeamPhaseState(teamName, cwd),
|
|
63
|
+
]);
|
|
64
|
+
if (!existingConfig && !existingManifest)
|
|
65
|
+
return;
|
|
66
|
+
const currentPhase = existingPhase?.current_phase;
|
|
67
|
+
if (currentPhase && isTerminalPhase(currentPhase))
|
|
68
|
+
return;
|
|
69
|
+
const tmuxSession = existingConfig?.tmux_session ?? existingManifest?.tmux_session ?? `omx-team-${teamName}`;
|
|
70
|
+
const renderedPhase = currentPhase ?? 'team-exec';
|
|
71
|
+
throw new Error(`team_name_conflict: active team state already exists for "${teamName}" (phase: ${renderedPhase}, tmux: ${tmuxSession}). `
|
|
72
|
+
+ `Use "omx team status ${teamName}", "omx team resume ${teamName}", or "omx team shutdown ${teamName}" instead of launching a duplicate team.`);
|
|
73
|
+
}
|
|
53
74
|
export function applyCreatedInteractiveSessionToConfig(config, createdSession, workerPaneIds) {
|
|
54
75
|
config.tmux_session = createdSession.name;
|
|
55
76
|
config.leader_pane_id = createdSession.leaderPaneId;
|
|
@@ -1275,6 +1296,9 @@ export async function startTeam(teamName, task, agentType, workerCount, tasks, c
|
|
|
1275
1296
|
const leaderCwd = resolve(cwd);
|
|
1276
1297
|
await assertNestedTeamAllowed(leaderCwd);
|
|
1277
1298
|
const effectiveWorktreeMode = resolveEffectiveTeamWorktreeMode(leaderCwd, options.worktreeMode);
|
|
1299
|
+
const sanitized = sanitizeTeamName(teamName);
|
|
1300
|
+
const leaderSessionId = await resolveLeaderSessionId(leaderCwd);
|
|
1301
|
+
await assertTeamStartupIsNonDestructive(sanitized, leaderCwd, leaderSessionId);
|
|
1278
1302
|
const workerLaunchMode = resolveTeamWorkerLaunchMode(process.env);
|
|
1279
1303
|
const displayMode = workerLaunchMode === 'interactive' ? 'split_pane' : 'auto';
|
|
1280
1304
|
if (workerLaunchMode === 'interactive') {
|
|
@@ -1285,7 +1309,6 @@ export async function startTeam(teamName, task, agentType, workerCount, tasks, c
|
|
|
1285
1309
|
throw new Error('Team mode requires running inside tmux current leader pane');
|
|
1286
1310
|
}
|
|
1287
1311
|
}
|
|
1288
|
-
const sanitized = sanitizeTeamName(teamName);
|
|
1289
1312
|
const teamStateRoot = resolveCanonicalTeamStateRoot(leaderCwd);
|
|
1290
1313
|
const activeWorktreeMode = effectiveWorktreeMode.enabled
|
|
1291
1314
|
? (effectiveWorktreeMode.detached ? 'detached' : 'named')
|
|
@@ -1321,12 +1344,6 @@ export async function startTeam(teamName, task, agentType, workerCount, tasks, c
|
|
|
1321
1344
|
}
|
|
1322
1345
|
}
|
|
1323
1346
|
}
|
|
1324
|
-
const leaderSessionId = await resolveLeaderSessionId(leaderCwd);
|
|
1325
|
-
// Topology guard: one active team per leader session/process context.
|
|
1326
|
-
const activeTeams = await findActiveTeams(leaderCwd, leaderSessionId);
|
|
1327
|
-
if (activeTeams.length > 0) {
|
|
1328
|
-
throw new Error(`leader_session_conflict: active team exists (${activeTeams.join(', ')})`);
|
|
1329
|
-
}
|
|
1330
1347
|
// 2. Team name is already sanitized above.
|
|
1331
1348
|
let sessionName = `omx-team-${sanitized}`;
|
|
1332
1349
|
const overlay = generateWorkerOverlay(sanitized);
|