oh-my-codex 0.18.13 → 0.18.14
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 +6 -6
- package/Cargo.toml +1 -1
- package/README.md +31 -11
- package/dist/agents/__tests__/native-config.test.js +25 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/native-config.d.ts.map +1 -1
- package/dist/agents/native-config.js +5 -1
- package/dist/agents/native-config.js.map +1 -1
- package/dist/autopilot/__tests__/fsm.test.js +7 -0
- package/dist/autopilot/__tests__/fsm.test.js.map +1 -1
- package/dist/autopilot/__tests__/planner-routing.test.d.ts +2 -0
- package/dist/autopilot/__tests__/planner-routing.test.d.ts.map +1 -0
- package/dist/autopilot/__tests__/planner-routing.test.js +74 -0
- package/dist/autopilot/__tests__/planner-routing.test.js.map +1 -0
- package/dist/autopilot/__tests__/ralplan-gate.test.js +315 -0
- package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
- package/dist/autopilot/completion-gate.js +1 -1
- package/dist/autopilot/completion-gate.js.map +1 -1
- package/dist/autopilot/fsm.d.ts +2 -2
- package/dist/autopilot/fsm.d.ts.map +1 -1
- package/dist/autopilot/fsm.js +3 -0
- package/dist/autopilot/fsm.js.map +1 -1
- package/dist/autopilot/planner-routing.d.ts +21 -0
- package/dist/autopilot/planner-routing.d.ts.map +1 -0
- package/dist/autopilot/planner-routing.js +59 -0
- package/dist/autopilot/planner-routing.js.map +1 -0
- package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
- package/dist/autopilot/ralplan-gate.js +30 -0
- package/dist/autopilot/ralplan-gate.js.map +1 -1
- package/dist/autoresearch/goal.d.ts.map +1 -1
- package/dist/autoresearch/goal.js +10 -1
- package/dist/autoresearch/goal.js.map +1 -1
- package/dist/cli/__tests__/autoresearch-goal.test.js +33 -0
- package/dist/cli/__tests__/autoresearch-goal.test.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +30 -0
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-artifact-ownership.test.d.ts +2 -0
- package/dist/cli/__tests__/doctor-artifact-ownership.test.d.ts.map +1 -0
- package/dist/cli/__tests__/doctor-artifact-ownership.test.js +158 -0
- package/dist/cli/__tests__/doctor-artifact-ownership.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-spark-routing.test.js +13 -0
- package/dist/cli/__tests__/doctor-spark-routing.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +1 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +5 -0
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/nested-help-routing.test.js +4 -0
- package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.js +7 -1
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
- package/dist/cli/__tests__/performance-goal.test.js +22 -0
- package/dist/cli/__tests__/performance-goal.test.js.map +1 -1
- package/dist/cli/__tests__/resume.test.js +96 -0
- package/dist/cli/__tests__/resume.test.js.map +1 -1
- package/dist/cli/__tests__/session-scoped-runtime.test.js +162 -0
- package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
- package/dist/cli/__tests__/session-search.test.js +36 -0
- package/dist/cli/__tests__/session-search.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +35 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +33 -0
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +17 -3
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +37 -0
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/update.test.js +1 -0
- package/dist/cli/__tests__/update.test.js.map +1 -1
- package/dist/cli/autoresearch-goal.d.ts.map +1 -1
- package/dist/cli/autoresearch-goal.js +2 -1
- package/dist/cli/autoresearch-goal.js.map +1 -1
- package/dist/cli/doctor.d.ts +22 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +263 -4
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +65 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/performance-goal.d.ts.map +1 -1
- package/dist/cli/performance-goal.js +4 -2
- package/dist/cli/performance-goal.js.map +1 -1
- package/dist/cli/plugin-marketplace.d.ts +1 -0
- package/dist/cli/plugin-marketplace.d.ts.map +1 -1
- package/dist/cli/plugin-marketplace.js +67 -5
- package/dist/cli/plugin-marketplace.js.map +1 -1
- package/dist/cli/project-runtime-codex-homes.d.ts +2 -0
- package/dist/cli/project-runtime-codex-homes.d.ts.map +1 -1
- package/dist/cli/project-runtime-codex-homes.js +112 -5
- package/dist/cli/project-runtime-codex-homes.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +15 -6
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +5 -1
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +3 -0
- package/dist/cli/update.js.map +1 -1
- package/dist/config/__tests__/models.test.js +21 -1
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/models.d.ts +5 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +23 -0
- package/dist/config/models.js.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.d.ts +2 -0
- package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.js +10 -0
- package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +7 -0
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +46 -0
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +100 -0
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +75 -0
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +225 -0
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +75 -0
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +200 -0
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +187 -12
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +225 -0
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +0 -0
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +75 -0
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +4 -0
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +137 -2
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +107 -0
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.js +17 -0
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +21 -7
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +9 -0
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +43 -5
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/types.d.ts +6 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js.map +1 -1
- package/dist/modes/__tests__/base-autopilot-gates.test.js +48 -0
- package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -1
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +1 -0
- package/dist/modes/base.js.map +1 -1
- package/dist/performance-goal/artifacts.d.ts.map +1 -1
- package/dist/performance-goal/artifacts.js +10 -1
- package/dist/performance-goal/artifacts.js.map +1 -1
- package/dist/ralplan/__tests__/consensus-gate.test.js +112 -0
- package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
- package/dist/ralplan/consensus-gate.d.ts +23 -0
- package/dist/ralplan/consensus-gate.d.ts.map +1 -1
- package/dist/ralplan/consensus-gate.js +133 -21
- package/dist/ralplan/consensus-gate.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +831 -2
- 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 +486 -21
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js +87 -8
- package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/scripts/run-compiled-ci.d.ts +2 -0
- package/dist/scripts/run-compiled-ci.d.ts.map +1 -0
- package/dist/scripts/run-compiled-ci.js +77 -0
- package/dist/scripts/run-compiled-ci.js.map +1 -0
- package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
- package/dist/scripts/sync-plugin-mirror.js +1 -0
- package/dist/scripts/sync-plugin-mirror.js.map +1 -1
- package/dist/session-history/search.d.ts.map +1 -1
- package/dist/session-history/search.js +24 -9
- package/dist/session-history/search.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +107 -3
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +57 -2
- package/dist/state/operations.js.map +1 -1
- package/dist/team/__tests__/delivery-e2e-smoke.test.js +22 -1
- package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +57 -1
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +1468 -110
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +63 -0
- package/dist/team/__tests__/scaling.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +24 -1
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +512 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +42 -9
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/model-contract.d.ts +16 -0
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +41 -1
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +116 -30
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +9 -1
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/types.d.ts +2 -0
- package/dist/team/state/types.d.ts.map +1 -1
- package/dist/team/state/types.js.map +1 -1
- package/dist/team/state.d.ts +3 -0
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +20 -0
- package/dist/team/state.js.map +1 -1
- package/dist/team/tmux-session.d.ts +38 -3
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +275 -36
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +26 -1
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +238 -0
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js +3 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
- package/dist/ultragoal/artifacts.d.ts +15 -0
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +167 -4
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/utils/__tests__/agents-md.test.js +39 -1
- package/dist/utils/__tests__/agents-md.test.js.map +1 -1
- package/dist/utils/__tests__/agents-model-table.test.js +28 -0
- package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
- package/dist/utils/agents-md.d.ts +4 -0
- package/dist/utils/agents-md.d.ts.map +1 -1
- package/dist/utils/agents-md.js +25 -0
- package/dist/utils/agents-md.js.map +1 -1
- package/dist/utils/agents-model-table.d.ts +7 -3
- package/dist/utils/agents-model-table.d.ts.map +1 -1
- package/dist/utils/agents-model-table.js +16 -8
- package/dist/utils/agents-model-table.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +4 -0
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/package.json +2 -2
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +59 -8
- package/plugins/oh-my-codex/skills/autopilot/SKILL.md +9 -5
- package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +3 -0
- package/plugins/oh-my-codex/skills/performance-goal/SKILL.md +3 -0
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +22 -4
- package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +2 -2
- package/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md +61 -0
- package/skills/autopilot/SKILL.md +9 -5
- package/skills/autoresearch-goal/SKILL.md +3 -0
- package/skills/ecomode/SKILL.md +1 -1
- package/skills/ecomode/references/agent-tiers.md +61 -0
- package/skills/performance-goal/SKILL.md +3 -0
- package/skills/ralplan/SKILL.md +1 -1
- package/skills/ultragoal/SKILL.md +22 -4
- package/skills/ultrawork/SKILL.md +2 -2
- package/skills/ultrawork/references/agent-tiers.md +61 -0
- package/src/scripts/__tests__/codex-native-hook.test.ts +975 -40
- package/src/scripts/codex-native-hook.ts +529 -22
- package/src/scripts/notify-hook/team-tmux-guard.ts +92 -8
- package/src/scripts/notify-hook/tmux-injection.ts +1 -1
- package/src/scripts/run-compiled-ci.ts +85 -0
- package/src/scripts/sync-plugin-mirror.ts +1 -0
- package/templates/AGENTS.md +6 -0
package/dist/team/runtime.js
CHANGED
|
@@ -3,7 +3,7 @@ import { existsSync, appendFileSync, mkdirSync } from 'fs';
|
|
|
3
3
|
import { mkdir, readdir, readFile, writeFile } from 'fs/promises';
|
|
4
4
|
import { performance } from 'perf_hooks';
|
|
5
5
|
import { spawn, spawnSync } from 'child_process';
|
|
6
|
-
import { sanitizeTeamName, isTmuxAvailable, hasCurrentTmuxClientContext, createTeamSession, buildWorkerProcessLaunchSpec, scrubTeamWorkerHudOwnershipEnv, resolveTeamWorkerCli, resolveTeamWorkerCliPlan, resolveTeamWorkerLaunchMode, waitForWorkerReady, waitForWorkerReadyAsync, dismissTrustPromptIfPresent, evaluateStartupDirectTriggerSafety, sendToWorker, sendToWorkerStdin, isWorkerAlive, isWorkerPaneOpen, getWorkerPanePid, killWorkerByPaneIdAsync, restoreStandaloneHudPane, teardownWorkerPanes, unregisterResizeHook, destroyTeamSession, listPaneIds, listTeamSessions, resolveSharedSessionShutdownTopology, } from './tmux-session.js';
|
|
6
|
+
import { sanitizeTeamName, isTmuxAvailable, hasCurrentTmuxClientContext, createTeamSession, buildWorkerProcessLaunchSpec, scrubTeamWorkerHudOwnershipEnv, resolveTeamWorkerCli, resolveTeamWorkerCliPlan, resolveTeamWorkerLaunchMode, waitForWorkerReady, waitForWorkerReadyAsync, dismissTrustPromptIfPresent, evaluateStartupDirectTriggerSafety, sendToWorker, sendToWorkerStdin, isWorkerAlive, isWorkerPaneOpen, getWorkerPanePid, killWorkerByPaneIdAsync, paneHasOmxInstanceTag, readPaneTeamOwnerTagResult, restoreStandaloneHudPane, teardownWorkerPanes, unregisterResizeHook, destroyTeamSession, listPaneIds, listTeamSessions, resolveSharedSessionShutdownTopology, } from './tmux-session.js';
|
|
7
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, teamUpdateTask as updateTask, teamReadManifest as readTeamManifestV2, teamNormalizeGovernance as normalizeTeamGovernance, teamNormalizePolicy as normalizeTeamPolicy, teamClaimTask as claimTask, teamReleaseTaskClaim as releaseTaskClaim, teamReclaimExpiredTaskClaim as reclaimExpiredTaskClaim, teamAppendEvent as appendTeamEvent, teamReadTaskApproval as readTaskApproval, teamListMailbox as listMailboxMessages, teamMarkMessageDelivered as markMessageDelivered, 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, teamWriteWorkerStatus as writeWorkerStatus, writeAtomic, } from './team-ops.js';
|
|
8
8
|
import { queueInboxInstruction, queueDirectMailboxMessage, queueBroadcastMailboxMessage, waitForDispatchReceipt, } from './mcp-comm.js';
|
|
9
9
|
import { appendTeamDeliveryLogForCwd } from './delivery-log.js';
|
|
@@ -16,7 +16,7 @@ import { loadRolePrompt } from './role-router.js';
|
|
|
16
16
|
import { composeRoleInstructionsForRole } from '../agents/native-config.js';
|
|
17
17
|
import { codexPromptsDir } from '../utils/paths.js';
|
|
18
18
|
import { isTerminalPhase } from './orchestrator.js';
|
|
19
|
-
import { resolveTeamWorkerLaunchArgs, TEAM_LOW_COMPLEXITY_DEFAULT_MODEL, parseTeamWorkerLaunchArgs,
|
|
19
|
+
import { resolveTeamWorkerLaunchArgs, resolveTeamWorkerLaunchDiagnostics, TEAM_LOW_COMPLEXITY_DEFAULT_MODEL, parseTeamWorkerLaunchArgs, resolveAgentDefaultModel, resolveAgentReasoningEffort, } from './model-contract.js';
|
|
20
20
|
import { resolveCanonicalTeamStateRoot } from './state-root.js';
|
|
21
21
|
import { buildInternalTeamName, resolveTeamIdentityScope, resolveTeamNameForCurrentContext } from './team-identity.js';
|
|
22
22
|
import { inferPhaseTargetFromTaskCounts, reconcilePhaseStateForMonitor } from './phase-controller.js';
|
|
@@ -131,6 +131,7 @@ export function applyCreatedInteractiveSessionToConfig(config, createdSession, w
|
|
|
131
131
|
config.tmux_session = createdSession.name;
|
|
132
132
|
config.leader_pane_id = createdSession.leaderPaneId;
|
|
133
133
|
config.hud_pane_id = createdSession.hudPaneId;
|
|
134
|
+
config.tmux_pane_owner_id = createdSession.teamPaneOwnerId;
|
|
134
135
|
config.resize_hook_name = createdSession.resizeHookName;
|
|
135
136
|
config.resize_hook_target = createdSession.resizeHookTarget;
|
|
136
137
|
for (let i = 0; i < createdSession.workerPaneIds.length; i++) {
|
|
@@ -142,7 +143,7 @@ export function applyCreatedInteractiveSessionToConfig(config, createdSession, w
|
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
function collectShutdownPaneIds(params) {
|
|
145
|
-
const { config,
|
|
146
|
+
const { config, candidatePaneIds = [], includePersistedWorkerPaneIds = true, restoredStandaloneHudPaneId = null, leaderPaneId = config.leader_pane_id, hudPaneId = config.hud_pane_id, } = params;
|
|
146
147
|
const excludedPaneIds = new Set([
|
|
147
148
|
leaderPaneId,
|
|
148
149
|
hudPaneId,
|
|
@@ -150,8 +151,8 @@ function collectShutdownPaneIds(params) {
|
|
|
150
151
|
].filter((paneId) => typeof paneId === 'string' && paneId.trim().startsWith('%')));
|
|
151
152
|
const paneIds = new Set();
|
|
152
153
|
for (const paneId of [
|
|
153
|
-
...config.workers.map((worker) => worker.pane_id),
|
|
154
|
-
...
|
|
154
|
+
...(includePersistedWorkerPaneIds ? config.workers.map((worker) => worker.pane_id) : []),
|
|
155
|
+
...candidatePaneIds,
|
|
155
156
|
]) {
|
|
156
157
|
if (typeof paneId !== 'string')
|
|
157
158
|
continue;
|
|
@@ -164,6 +165,55 @@ function collectShutdownPaneIds(params) {
|
|
|
164
165
|
}
|
|
165
166
|
return [...paneIds];
|
|
166
167
|
}
|
|
168
|
+
function filterSharedSessionShutdownWorkerPaneIdsByOwner(paneIds, teamPaneOwnerId, legacyPersistedWorkerPaneIds = new Set(), onOwnerReadError) {
|
|
169
|
+
const expectedOwnerId = teamPaneOwnerId.trim();
|
|
170
|
+
if (!expectedOwnerId)
|
|
171
|
+
return [];
|
|
172
|
+
return paneIds.filter((paneId) => {
|
|
173
|
+
const actualOwnerId = readPaneTeamOwnerTagResult(paneId);
|
|
174
|
+
if (actualOwnerId.status === 'value')
|
|
175
|
+
return actualOwnerId.value === expectedOwnerId;
|
|
176
|
+
if (actualOwnerId.status === 'missing') {
|
|
177
|
+
// Legacy, already-running Team panes may not have @omx_team_pane_owner_id.
|
|
178
|
+
// Keep that compatibility path explicitly bounded to panes that are both
|
|
179
|
+
// live worker-command candidates and persisted in this team's state. This
|
|
180
|
+
// preserves old Team cleanup without letting arbitrary worker-looking
|
|
181
|
+
// panes become kill candidates merely because the owner tag is absent.
|
|
182
|
+
return legacyPersistedWorkerPaneIds.has(paneId);
|
|
183
|
+
}
|
|
184
|
+
onOwnerReadError?.(paneId, actualOwnerId.error);
|
|
185
|
+
return false;
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
function isSharedSessionHudPaneReclaimable(params) {
|
|
189
|
+
const { paneId, persistedHudPaneId, leaderOwnedHudPaneIds, teamPaneOwnerId, onOwnerReadError } = params;
|
|
190
|
+
const expectedOwnerId = teamPaneOwnerId.trim();
|
|
191
|
+
if (!expectedOwnerId)
|
|
192
|
+
return false;
|
|
193
|
+
const owner = readPaneTeamOwnerTagResult(paneId);
|
|
194
|
+
if (owner.status === 'value')
|
|
195
|
+
return owner.value === expectedOwnerId;
|
|
196
|
+
if (paneId !== persistedHudPaneId)
|
|
197
|
+
return false;
|
|
198
|
+
if (owner.status === 'missing')
|
|
199
|
+
return leaderOwnedHudPaneIds.includes(paneId);
|
|
200
|
+
onOwnerReadError?.(paneId, owner.error);
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
function isTrustedSharedSessionLeaderPaneForHudRestore(params) {
|
|
204
|
+
const { paneId, teamPaneOwnerId, legacyInstanceId } = params;
|
|
205
|
+
if (!paneId)
|
|
206
|
+
return false;
|
|
207
|
+
const expectedOwnerId = teamPaneOwnerId.trim();
|
|
208
|
+
if (expectedOwnerId) {
|
|
209
|
+
const owner = readPaneTeamOwnerTagResult(paneId);
|
|
210
|
+
if (owner.status === 'value')
|
|
211
|
+
return owner.value === expectedOwnerId;
|
|
212
|
+
if (owner.status === 'error')
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
return paneHasOmxInstanceTag(paneId, legacyInstanceId);
|
|
216
|
+
}
|
|
167
217
|
export function shouldPrekillInteractiveShutdownProcessTrees(sessionName) {
|
|
168
218
|
// Shared-window tmux sessions can expose overlapping ancestry around the
|
|
169
219
|
// invoking leader client. Rely on pane-targeted teardown there so shutdown
|
|
@@ -1623,24 +1673,24 @@ export function resolveWorkerLaunchArgsFromEnv(env, agentType, inheritedLeaderMo
|
|
|
1623
1673
|
? ['--model', inheritedLeaderModel.trim()]
|
|
1624
1674
|
: [];
|
|
1625
1675
|
const fallbackModel = resolveAgentDefaultModel(agentType, env.CODEX_HOME);
|
|
1626
|
-
|
|
1627
|
-
const preEnvArgs = splitWorkerLaunchArgs(env.OMX_TEAM_WORKER_LAUNCH_ARGS);
|
|
1628
|
-
const preAllArgs = [...preEnvArgs, ...inheritedArgs];
|
|
1629
|
-
const hasExplicitReasoning = parseTeamWorkerLaunchArgs(preAllArgs).reasoningOverride !== null;
|
|
1630
|
-
const resolved = resolveTeamWorkerLaunchArgs({
|
|
1676
|
+
const diagnostics = resolveTeamWorkerLaunchDiagnostics({
|
|
1631
1677
|
existingRaw: env.OMX_TEAM_WORKER_LAUNCH_ARGS,
|
|
1632
1678
|
inheritedArgs,
|
|
1633
1679
|
fallbackModel,
|
|
1634
1680
|
preferredReasoning,
|
|
1681
|
+
requestedAgentType: agentType,
|
|
1635
1682
|
});
|
|
1636
|
-
|
|
1637
|
-
const
|
|
1638
|
-
const
|
|
1639
|
-
const
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1683
|
+
const resolved = diagnostics.actualLaunchArgs;
|
|
1684
|
+
const resolvedModel = diagnostics.actualModel ?? diagnostics.requestedDefaultModel ?? 'default';
|
|
1685
|
+
const thinkingLevel = diagnostics.actualReasoning ?? 'none';
|
|
1686
|
+
const source = diagnostics.reasoningSource === 'none'
|
|
1687
|
+
? 'none/default-none'
|
|
1688
|
+
: diagnostics.reasoningSource;
|
|
1689
|
+
const modelSource = diagnostics.modelSource;
|
|
1690
|
+
const inheritedParentModel = diagnostics.inheritedParentModel ? 'yes' : 'no';
|
|
1691
|
+
const requestedRole = diagnostics.requestedAgentType ?? 'unknown';
|
|
1692
|
+
const requestedDefaultModel = diagnostics.requestedDefaultModel ?? 'none';
|
|
1693
|
+
const requestedDefaultReasoning = diagnostics.requestedDefaultReasoning ?? 'none';
|
|
1644
1694
|
const effectiveWorkerCli = workerCliOverride ?? resolveEffectiveWorkerCliForStartupLog(resolved, env);
|
|
1645
1695
|
if (effectiveWorkerCli === 'claude') {
|
|
1646
1696
|
console.log('[omx:team] worker startup resolution: model=claude source=local-settings');
|
|
@@ -1649,7 +1699,7 @@ export function resolveWorkerLaunchArgsFromEnv(env, agentType, inheritedLeaderMo
|
|
|
1649
1699
|
console.log('[omx:team] worker startup resolution: model=gemini source=local-settings');
|
|
1650
1700
|
}
|
|
1651
1701
|
else {
|
|
1652
|
-
console.log(`[omx:team] worker startup resolution:
|
|
1702
|
+
console.log(`[omx:team] worker startup resolution: requested_role=${requestedRole} requested_default_model=${requestedDefaultModel} requested_default_reasoning=${requestedDefaultReasoning} actual_model=${resolvedModel} thinking_level=${thinkingLevel} model_source=${modelSource} reasoning_source=${source} inherited_parent_model=${inheritedParentModel}`);
|
|
1653
1703
|
}
|
|
1654
1704
|
return resolved;
|
|
1655
1705
|
}
|
|
@@ -2071,7 +2121,7 @@ export async function startTeam(teamName, task, agentType, workerCount, tasks, c
|
|
|
2071
2121
|
});
|
|
2072
2122
|
const startupTiming = createStartupTimingRecorder(sanitized, leaderCwd);
|
|
2073
2123
|
if (workerLaunchMode === 'interactive') {
|
|
2074
|
-
const createdSession = createTeamSession(sanitized, workerCount, leaderCwd, sharedWorkerLaunchArgs, workerStartups);
|
|
2124
|
+
const createdSession = createTeamSession(sanitized, workerCount, leaderCwd, sharedWorkerLaunchArgs, workerStartups, { ownerSessionId: leaderSessionId, teamPaneOwnerId: config.tmux_pane_owner_id });
|
|
2075
2125
|
sessionName = createdSession.name;
|
|
2076
2126
|
sessionCreated = true;
|
|
2077
2127
|
createdWorkerPaneIds.push(...createdSession.workerPaneIds);
|
|
@@ -2881,16 +2931,44 @@ export async function shutdownTeam(teamName, cwd, options = {}) {
|
|
|
2881
2931
|
const hudPaneId = config.hud_pane_id;
|
|
2882
2932
|
if (config.worker_launch_mode === 'interactive') {
|
|
2883
2933
|
const sharedSessionTopology = sessionName.includes(':')
|
|
2884
|
-
? resolveSharedSessionShutdownTopology(sessionName, leaderPaneId)
|
|
2934
|
+
? resolveSharedSessionShutdownTopology(sessionName, leaderPaneId, sanitized)
|
|
2885
2935
|
: null;
|
|
2886
|
-
const effectiveLeaderPaneId = sharedSessionTopology
|
|
2887
|
-
const
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2936
|
+
const effectiveLeaderPaneId = sharedSessionTopology ? sharedSessionTopology.leaderPaneId : leaderPaneId;
|
|
2937
|
+
const tmuxPaneOwnerId = typeof config.tmux_pane_owner_id === 'string' ? config.tmux_pane_owner_id.trim() : '';
|
|
2938
|
+
const legacyPersistedWorkerPaneIds = new Set(config.workers
|
|
2939
|
+
.map((worker) => (typeof worker.pane_id === 'string' ? worker.pane_id.trim() : ''))
|
|
2940
|
+
.filter((paneId) => paneId.startsWith('%')));
|
|
2941
|
+
const ownerReadWarnings = new Set();
|
|
2942
|
+
const warnOwnerReadError = (kind, paneId, error) => {
|
|
2943
|
+
const key = `${kind}:${paneId}:${error}`;
|
|
2944
|
+
if (ownerReadWarnings.has(key))
|
|
2945
|
+
return;
|
|
2946
|
+
ownerReadWarnings.add(key);
|
|
2947
|
+
console.warn(`[team shutdown] ${sanitized}: skipped shared-session ${kind} ${paneId} because team owner tag could not be read: ${error}`);
|
|
2948
|
+
};
|
|
2949
|
+
const trustedHudRestoreLeaderPaneId = sharedSessionTopology
|
|
2950
|
+
? (isTrustedSharedSessionLeaderPaneForHudRestore({
|
|
2951
|
+
paneId: effectiveLeaderPaneId,
|
|
2952
|
+
teamPaneOwnerId: tmuxPaneOwnerId,
|
|
2953
|
+
legacyInstanceId: leaderSessionId,
|
|
2954
|
+
}) ? effectiveLeaderPaneId : null)
|
|
2955
|
+
: effectiveLeaderPaneId;
|
|
2956
|
+
const effectiveHudPaneId = sharedSessionTopology
|
|
2957
|
+
? (sharedSessionTopology.hudPaneIds.find((paneId) => isSharedSessionHudPaneReclaimable({
|
|
2958
|
+
paneId,
|
|
2959
|
+
persistedHudPaneId: hudPaneId,
|
|
2960
|
+
leaderOwnedHudPaneIds: sharedSessionTopology.leaderOwnedHudPaneIds,
|
|
2961
|
+
teamPaneOwnerId: tmuxPaneOwnerId,
|
|
2962
|
+
onOwnerReadError: (hudPaneId, error) => warnOwnerReadError('HUD pane', hudPaneId, error),
|
|
2963
|
+
})) ?? null)
|
|
2964
|
+
: hudPaneId;
|
|
2965
|
+
const shutdownCandidatePaneIds = sharedSessionTopology
|
|
2966
|
+
? filterSharedSessionShutdownWorkerPaneIdsByOwner(sharedSessionTopology.teamWorkerPaneIds, tmuxPaneOwnerId, legacyPersistedWorkerPaneIds, (paneId, error) => warnOwnerReadError('worker pane', paneId, error))
|
|
2967
|
+
: listPaneIds(sessionName);
|
|
2891
2968
|
let shutdownPaneIds = collectShutdownPaneIds({
|
|
2892
2969
|
config,
|
|
2893
|
-
|
|
2970
|
+
candidatePaneIds: shutdownCandidatePaneIds,
|
|
2971
|
+
includePersistedWorkerPaneIds: !sharedSessionTopology,
|
|
2894
2972
|
leaderPaneId: effectiveLeaderPaneId,
|
|
2895
2973
|
hudPaneId: effectiveHudPaneId,
|
|
2896
2974
|
});
|
|
@@ -2924,15 +3002,23 @@ export async function shutdownTeam(teamName, cwd, options = {}) {
|
|
|
2924
3002
|
if (effectiveHudPaneId) {
|
|
2925
3003
|
await killWorkerByPaneIdAsync(effectiveHudPaneId, effectiveLeaderPaneId ?? undefined);
|
|
2926
3004
|
if (sessionName.includes(':')) {
|
|
2927
|
-
restoredHudPaneId = restoreStandaloneHudPane(
|
|
3005
|
+
restoredHudPaneId = restoreStandaloneHudPane(trustedHudRestoreLeaderPaneId, cwd, {
|
|
3006
|
+
sessionId: leaderSessionId,
|
|
3007
|
+
});
|
|
2928
3008
|
if (!restoredHudPaneId) {
|
|
2929
|
-
|
|
3009
|
+
const reason = trustedHudRestoreLeaderPaneId
|
|
3010
|
+
? 'failed to restore standalone HUD pane'
|
|
3011
|
+
: 'skipped standalone HUD restore because leader pane ownership could not be verified';
|
|
3012
|
+
console.warn(`[team shutdown] ${sanitized}: ${reason}`);
|
|
2930
3013
|
}
|
|
2931
3014
|
}
|
|
2932
3015
|
}
|
|
2933
3016
|
shutdownPaneIds = collectShutdownPaneIds({
|
|
2934
3017
|
config,
|
|
2935
|
-
|
|
3018
|
+
candidatePaneIds: sessionName.includes(':')
|
|
3019
|
+
? filterSharedSessionShutdownWorkerPaneIdsByOwner(resolveSharedSessionShutdownTopology(sessionName, effectiveLeaderPaneId, sanitized).teamWorkerPaneIds, tmuxPaneOwnerId, legacyPersistedWorkerPaneIds, (paneId, error) => warnOwnerReadError('worker pane', paneId, error))
|
|
3020
|
+
: listPaneIds(sessionName),
|
|
3021
|
+
includePersistedWorkerPaneIds: !sessionName.includes(':'),
|
|
2936
3022
|
restoredStandaloneHudPaneId: restoredHudPaneId,
|
|
2937
3023
|
leaderPaneId: effectiveLeaderPaneId,
|
|
2938
3024
|
hudPaneId: effectiveHudPaneId,
|