oh-my-codex 0.18.3 → 0.18.5
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 +1 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js +61 -3
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +8 -7
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +63 -5
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/question.test.js +81 -0
- package/dist/cli/__tests__/question.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +56 -17
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-scope.test.js +1 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js +2 -2
- package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +60 -1
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +111 -14
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/explore.d.ts +1 -0
- package/dist/cli/explore.d.ts.map +1 -1
- package/dist/cli/explore.js +6 -0
- package/dist/cli/explore.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 +11 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/question.d.ts.map +1 -1
- package/dist/cli/question.js +31 -1
- package/dist/cli/question.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +18 -54
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +18 -4
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +5 -5
- package/dist/config/generator.d.ts +8 -2
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +48 -4
- package/dist/config/generator.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +9 -9
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +10 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/code-review-skill-contract.test.js +11 -2
- package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js +13 -0
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/hooks/__tests__/explore-routing.test.js +10 -13
- package/dist/hooks/__tests__/explore-routing.test.js.map +1 -1
- package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.js +13 -15
- package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +33 -0
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +60 -0
- package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -1
- package/dist/hooks/explore-routing.d.ts.map +1 -1
- package/dist/hooks/explore-routing.js +8 -14
- package/dist/hooks/explore-routing.js.map +1 -1
- package/dist/hud/__tests__/hud-tmux-injection.test.js +15 -10
- package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +125 -1
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +32 -8
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/render.test.js +160 -4
- package/dist/hud/__tests__/render.test.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +120 -0
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.js +32 -1
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/constants.d.ts +2 -2
- package/dist/hud/constants.js +2 -2
- package/dist/hud/index.d.ts +1 -1
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +27 -3
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +15 -0
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +42 -20
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +18 -0
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/tmux.d.ts +1 -0
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +8 -0
- package/dist/hud/tmux.js.map +1 -1
- package/dist/hud/types.d.ts +2 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js.map +1 -1
- package/dist/question/__tests__/deep-interview.test.js +80 -7
- package/dist/question/__tests__/deep-interview.test.js.map +1 -1
- package/dist/question/__tests__/policy.test.js +115 -9
- package/dist/question/__tests__/policy.test.js.map +1 -1
- package/dist/question/autopilot-wait.d.ts +11 -0
- package/dist/question/autopilot-wait.d.ts.map +1 -0
- package/dist/question/autopilot-wait.js +140 -0
- package/dist/question/autopilot-wait.js.map +1 -0
- package/dist/question/deep-interview.d.ts.map +1 -1
- package/dist/question/deep-interview.js +4 -0
- package/dist/question/deep-interview.js.map +1 -1
- package/dist/question/policy.d.ts +1 -0
- package/dist/question/policy.d.ts.map +1 -1
- package/dist/question/policy.js +21 -0
- package/dist/question/policy.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +335 -3
- 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 +45 -3
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/notify-hook.js +13 -0
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/subagents/__tests__/tracker.test.js +69 -0
- package/dist/subagents/__tests__/tracker.test.js.map +1 -1
- package/dist/subagents/tracker.d.ts +5 -0
- package/dist/subagents/tracker.d.ts.map +1 -1
- package/dist/subagents/tracker.js +16 -0
- package/dist/subagents/tracker.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +1 -0
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +3 -3
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +9 -4
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +208 -1
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js +5 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
- package/dist/ultragoal/artifacts.d.ts +11 -0
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +157 -12
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/skills/autopilot/SKILL.md +2 -2
- package/plugins/oh-my-codex/skills/code-review/SKILL.md +8 -4
- package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +4 -4
- package/plugins/oh-my-codex/skills/plan/SKILL.md +5 -5
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +5 -5
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +10 -2
- package/prompts/executor.md +1 -1
- package/prompts/explore-harness.md +2 -2
- package/prompts/explore.md +1 -1
- package/prompts/planner.md +1 -1
- package/prompts/sisyphus-lite.md +1 -1
- package/skills/autopilot/SKILL.md +2 -2
- package/skills/code-review/SKILL.md +8 -4
- package/skills/deep-interview/SKILL.md +1 -1
- package/skills/omx-setup/SKILL.md +4 -4
- package/skills/plan/SKILL.md +5 -5
- package/skills/ralph/SKILL.md +1 -1
- package/skills/ralplan/SKILL.md +5 -5
- package/skills/ultragoal/SKILL.md +10 -2
- package/src/scripts/__tests__/codex-native-hook.test.ts +372 -3
- package/src/scripts/codex-native-hook.ts +50 -2
- package/src/scripts/notify-hook.ts +15 -0
- package/templates/AGENTS.md +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-interview.js","sourceRoot":"","sources":["../../src/question/deep-interview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EACL,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"deep-interview.js","sourceRoot":"","sources":["../../src/question/deep-interview.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ export interface EvaluateQuestionPolicyOptions {
|
|
|
13
13
|
cwd: string;
|
|
14
14
|
explicitSessionId?: string;
|
|
15
15
|
env?: NodeJS.ProcessEnv;
|
|
16
|
+
questionSource?: string;
|
|
16
17
|
}
|
|
17
18
|
export declare function evaluateQuestionPolicy(options: EvaluateQuestionPolicyOptions): Promise<QuestionPolicyDecision>;
|
|
18
19
|
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/question/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/question/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAkBvH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,gBAAgB,GAAG,cAAc,GAAG,+BAA+B,CAAC;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,yBAAyB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,6BAA6B;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAcD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,sBAAsB,CAAC,CAqFjC"}
|
package/dist/question/policy.js
CHANGED
|
@@ -2,6 +2,7 @@ import { listNotifyCanonicalActiveTeams } from '../scripts/notify-hook/active-te
|
|
|
2
2
|
import { readCurrentSessionId } from '../mcp/state-paths.js';
|
|
3
3
|
import { listActiveSkills, readVisibleSkillActiveState } from '../state/skill-active.js';
|
|
4
4
|
import { readActiveWorkflowModes } from '../state/workflow-transition.js';
|
|
5
|
+
import { canStartAutopilotDeepInterviewQuestion, readAutopilotDeepInterviewQuestionWaitState, } from './autopilot-wait.js';
|
|
5
6
|
const BLOCKED_EXECUTION_SKILLS = new Set([
|
|
6
7
|
'autopilot',
|
|
7
8
|
'autoresearch',
|
|
@@ -16,6 +17,9 @@ function safeString(value) {
|
|
|
16
17
|
function hasWorkerContext(env) {
|
|
17
18
|
return safeString(env.OMX_TEAM_WORKER).trim() !== '';
|
|
18
19
|
}
|
|
20
|
+
function onlyControlledAutopilotQuestionBlock(blocked) {
|
|
21
|
+
return blocked.length > 0 && blocked.every((entry) => entry === 'autopilot');
|
|
22
|
+
}
|
|
19
23
|
export async function evaluateQuestionPolicy(options) {
|
|
20
24
|
const env = options.env ?? process.env;
|
|
21
25
|
const sessionId = options.explicitSessionId || await readCurrentSessionId(options.cwd);
|
|
@@ -54,6 +58,23 @@ export async function evaluateQuestionPolicy(options) {
|
|
|
54
58
|
const blockedSkills = activeSkills.filter((skill) => BLOCKED_EXECUTION_SKILLS.has(skill));
|
|
55
59
|
const blocked = [...new Set([...blockedModes, ...blockedSkills])];
|
|
56
60
|
if (blocked.length > 0) {
|
|
61
|
+
const source = safeString(options.questionSource).trim();
|
|
62
|
+
if (source === 'deep-interview' && onlyControlledAutopilotQuestionBlock(blocked)) {
|
|
63
|
+
const autopilotWait = await readAutopilotDeepInterviewQuestionWaitState(options.cwd, sessionId);
|
|
64
|
+
const canStartAutopilotQuestion = autopilotWait
|
|
65
|
+
? true
|
|
66
|
+
: await canStartAutopilotDeepInterviewQuestion(options.cwd, sessionId);
|
|
67
|
+
if (canStartAutopilotQuestion) {
|
|
68
|
+
return {
|
|
69
|
+
allowed: true,
|
|
70
|
+
fallbackAllowed: true,
|
|
71
|
+
sessionId,
|
|
72
|
+
activeModes,
|
|
73
|
+
activeSkills,
|
|
74
|
+
activeTeams,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
57
78
|
return {
|
|
58
79
|
allowed: false,
|
|
59
80
|
sessionId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/question/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAkC,MAAM,uCAAuC,CAAC;AACvH,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/question/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { dispatchCodexNativeHook, isCodexNativeHookMainModule, looksLikeGoalComp
|
|
|
13
13
|
import { writeSessionStart } from "../../hooks/session.js";
|
|
14
14
|
import { resetTriageConfigCache } from "../../hooks/triage-config.js";
|
|
15
15
|
import { executeStateOperation } from "../../state/operations.js";
|
|
16
|
+
import { HUD_TMUX_HEIGHT_LINES } from "../../hud/constants.js";
|
|
16
17
|
import { OMX_TMUX_HUD_OWNER_ENV } from "../../hud/reconcile.js";
|
|
17
18
|
import { OMX_TMUX_HUD_LEADER_PANE_ENV } from "../../hud/tmux.js";
|
|
18
19
|
import { readAllState } from "../../hud/state.js";
|
|
@@ -43,6 +44,18 @@ async function writeJson(path, value) {
|
|
|
43
44
|
await mkdir(dirname(path), { recursive: true }).catch(() => { });
|
|
44
45
|
await writeFile(path, JSON.stringify(value, null, 2));
|
|
45
46
|
}
|
|
47
|
+
async function setTeamPaneIds(cwd, teamName, paneIds) {
|
|
48
|
+
for (const fileName of ["config.json", "manifest.v2.json"]) {
|
|
49
|
+
const filePath = join(cwd, ".omx", "state", "team", teamName, fileName);
|
|
50
|
+
const parsed = JSON.parse(await readFile(filePath, "utf-8"));
|
|
51
|
+
parsed.leader_pane_id = paneIds.leaderPaneId;
|
|
52
|
+
parsed.workers = (parsed.workers ?? []).map((worker) => ({
|
|
53
|
+
...worker,
|
|
54
|
+
pane_id: worker.name ? paneIds.workerPaneIds[worker.name] ?? worker.pane_id ?? null : worker.pane_id ?? null,
|
|
55
|
+
}));
|
|
56
|
+
await writeJson(filePath, parsed);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
46
59
|
async function withIsolatedHome(prefix, run) {
|
|
47
60
|
const homeDir = await mkdtemp(join(tmpdir(), `omx-native-hook-home-${prefix}-`));
|
|
48
61
|
const previousHome = process.env.HOME;
|
|
@@ -192,6 +205,7 @@ const TEAM_STOP_COMMIT_GUIDANCE = " If system-generated worker auto-checkpoint c
|
|
|
192
205
|
const DEFAULT_AUTO_NUDGE_RESPONSE = "continue with the current task only if it is already authorized";
|
|
193
206
|
const TEAM_ENV_KEYS = [
|
|
194
207
|
"OMX_TEAM_WORKER",
|
|
208
|
+
"OMX_TEAM_INTERNAL_WORKER",
|
|
195
209
|
"OMX_TEAM_STATE_ROOT",
|
|
196
210
|
"OMX_TEAM_LEADER_CWD",
|
|
197
211
|
"OMX_SESSION_ID",
|
|
@@ -1923,6 +1937,36 @@ standardMaxRounds = 15
|
|
|
1923
1937
|
await rm(cwd, { recursive: true, force: true });
|
|
1924
1938
|
}
|
|
1925
1939
|
});
|
|
1940
|
+
it("does not repeat ultragoal Stop recovery after a safe completed-aggregate microgoal blocker is recorded", async () => {
|
|
1941
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ultragoal-aggregate-blocked-stop-"));
|
|
1942
|
+
try {
|
|
1943
|
+
await writeJson(join(cwd, ".omx", "ultragoal", "goals.json"), {
|
|
1944
|
+
version: 1,
|
|
1945
|
+
codexGoalMode: "aggregate",
|
|
1946
|
+
activeGoalId: "G001-demo",
|
|
1947
|
+
goals: [{
|
|
1948
|
+
id: "G001-demo",
|
|
1949
|
+
status: "in_progress",
|
|
1950
|
+
objective: "Demo goal",
|
|
1951
|
+
failureReason: "aggregate Codex goal already complete and unreconcilable while repo-native .omx/ultragoal/goals.json still has an in-progress microgoal; stop the recovery loop",
|
|
1952
|
+
}],
|
|
1953
|
+
});
|
|
1954
|
+
const result = await dispatchCodexNativeHook({
|
|
1955
|
+
hook_event_name: "Stop",
|
|
1956
|
+
cwd,
|
|
1957
|
+
session_id: "sess-ultragoal-aggregate-blocked-stop",
|
|
1958
|
+
thread_id: "thread-ultragoal-aggregate-blocked-stop",
|
|
1959
|
+
stop_hook_active: true,
|
|
1960
|
+
last_assistant_message: "Goal complete.",
|
|
1961
|
+
}, { cwd });
|
|
1962
|
+
assert.notEqual(result.outputJson?.decision, "block");
|
|
1963
|
+
assert.notEqual(result.outputJson?.stopReason, "ultragoal_codex_goal_snapshot_required");
|
|
1964
|
+
assert.doesNotMatch(JSON.stringify(result.outputJson), /omx ultragoal checkpoint --goal-id G001-demo --status complete/);
|
|
1965
|
+
}
|
|
1966
|
+
finally {
|
|
1967
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1968
|
+
}
|
|
1969
|
+
});
|
|
1926
1970
|
it("does not block ultragoal Stop after task-scoped reconciliation finishes exploded bookkeeping", async () => {
|
|
1927
1971
|
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ultragoal-reconciled-stop-"));
|
|
1928
1972
|
try {
|
|
@@ -3170,6 +3214,178 @@ export async function onHookEvent(event) {
|
|
|
3170
3214
|
await rm(cwd, { recursive: true, force: true });
|
|
3171
3215
|
}
|
|
3172
3216
|
});
|
|
3217
|
+
it("skips prompt-submit HUD reconciliation for confirmed team worker panes", async () => {
|
|
3218
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-hud-team-worker-skip-"));
|
|
3219
|
+
try {
|
|
3220
|
+
const teamName = "hud-worker-skip";
|
|
3221
|
+
await initTeamState(teamName, "skip worker HUD reconcile", "executor", 1, cwd);
|
|
3222
|
+
await setTeamPaneIds(cwd, teamName, {
|
|
3223
|
+
leaderPaneId: "%42",
|
|
3224
|
+
workerPaneIds: { "worker-1": "%10" },
|
|
3225
|
+
});
|
|
3226
|
+
process.env.TMUX = "1";
|
|
3227
|
+
process.env.TMUX_PANE = "%10";
|
|
3228
|
+
process.env.OMX_TEAM_INTERNAL_WORKER = `${teamName}/worker-1`;
|
|
3229
|
+
process.env.OMX_TEAM_WORKER = `${teamName}/worker-1`;
|
|
3230
|
+
process.env[OMX_TMUX_HUD_OWNER_ENV] = "1";
|
|
3231
|
+
let reconcileCalls = 0;
|
|
3232
|
+
const result = await dispatchCodexNativeHook({
|
|
3233
|
+
hook_event_name: "UserPromptSubmit",
|
|
3234
|
+
cwd,
|
|
3235
|
+
session_id: "sess-hud-team-worker",
|
|
3236
|
+
prompt: "$ralplan prepare plan",
|
|
3237
|
+
}, {
|
|
3238
|
+
cwd,
|
|
3239
|
+
reconcileHudForPromptSubmitFn: async () => {
|
|
3240
|
+
reconcileCalls += 1;
|
|
3241
|
+
return { status: "recreated", paneId: "%9", desiredHeight: 3, duplicateCount: 0 };
|
|
3242
|
+
},
|
|
3243
|
+
});
|
|
3244
|
+
assert.equal(result.omxEventName, "keyword-detector");
|
|
3245
|
+
assert.equal(reconcileCalls, 0);
|
|
3246
|
+
}
|
|
3247
|
+
finally {
|
|
3248
|
+
await rm(cwd, { recursive: true, force: true });
|
|
3249
|
+
}
|
|
3250
|
+
});
|
|
3251
|
+
it("preserves prompt-submit HUD reconciliation for team leader panes", async () => {
|
|
3252
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-hud-team-leader-preserve-"));
|
|
3253
|
+
try {
|
|
3254
|
+
const teamName = "hud-leader-keep";
|
|
3255
|
+
await initTeamState(teamName, "preserve leader HUD reconcile", "executor", 1, cwd);
|
|
3256
|
+
await setTeamPaneIds(cwd, teamName, {
|
|
3257
|
+
leaderPaneId: "%42",
|
|
3258
|
+
workerPaneIds: { "worker-1": "%10" },
|
|
3259
|
+
});
|
|
3260
|
+
process.env.TMUX = "1";
|
|
3261
|
+
process.env.TMUX_PANE = "%42";
|
|
3262
|
+
process.env[OMX_TMUX_HUD_OWNER_ENV] = "1";
|
|
3263
|
+
let reconcileCall = null;
|
|
3264
|
+
const result = await dispatchCodexNativeHook({
|
|
3265
|
+
hook_event_name: "UserPromptSubmit",
|
|
3266
|
+
cwd,
|
|
3267
|
+
session_id: "sess-hud-team-leader",
|
|
3268
|
+
prompt: "$ralplan prepare plan",
|
|
3269
|
+
}, {
|
|
3270
|
+
cwd,
|
|
3271
|
+
reconcileHudForPromptSubmitFn: async (hookCwd, deps = {}) => {
|
|
3272
|
+
reconcileCall = { cwd: hookCwd, sessionId: deps.sessionId };
|
|
3273
|
+
return { status: "recreated", paneId: "%9", desiredHeight: 3, duplicateCount: 0 };
|
|
3274
|
+
},
|
|
3275
|
+
});
|
|
3276
|
+
assert.equal(result.omxEventName, "keyword-detector");
|
|
3277
|
+
assert.deepEqual(reconcileCall, { cwd, sessionId: "sess-hud-team-leader" });
|
|
3278
|
+
}
|
|
3279
|
+
finally {
|
|
3280
|
+
await rm(cwd, { recursive: true, force: true });
|
|
3281
|
+
}
|
|
3282
|
+
});
|
|
3283
|
+
it("preserves prompt-submit HUD reconciliation when worker pane detection is ambiguous", async () => {
|
|
3284
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-hud-team-worker-ambiguous-"));
|
|
3285
|
+
try {
|
|
3286
|
+
const teamName = "hud-worker-ambiguous";
|
|
3287
|
+
await initTeamState(teamName, "fail closed for ambiguous worker HUD reconcile", "executor", 1, cwd);
|
|
3288
|
+
await setTeamPaneIds(cwd, teamName, {
|
|
3289
|
+
leaderPaneId: "%42",
|
|
3290
|
+
workerPaneIds: { "worker-1": "%10" },
|
|
3291
|
+
});
|
|
3292
|
+
process.env.TMUX = "1";
|
|
3293
|
+
process.env.TMUX_PANE = "%99";
|
|
3294
|
+
process.env.OMX_TEAM_INTERNAL_WORKER = `${teamName}/worker-1`;
|
|
3295
|
+
process.env.OMX_TEAM_WORKER = `${teamName}/worker-1`;
|
|
3296
|
+
process.env[OMX_TMUX_HUD_OWNER_ENV] = "1";
|
|
3297
|
+
let reconcileCalls = 0;
|
|
3298
|
+
const result = await dispatchCodexNativeHook({
|
|
3299
|
+
hook_event_name: "UserPromptSubmit",
|
|
3300
|
+
cwd,
|
|
3301
|
+
session_id: "sess-hud-team-worker-ambiguous",
|
|
3302
|
+
prompt: "$ralplan prepare plan",
|
|
3303
|
+
}, {
|
|
3304
|
+
cwd,
|
|
3305
|
+
reconcileHudForPromptSubmitFn: async () => {
|
|
3306
|
+
reconcileCalls += 1;
|
|
3307
|
+
return { status: "recreated", paneId: "%9", desiredHeight: 3, duplicateCount: 0 };
|
|
3308
|
+
},
|
|
3309
|
+
});
|
|
3310
|
+
assert.equal(result.omxEventName, "keyword-detector");
|
|
3311
|
+
assert.equal(reconcileCalls, 1);
|
|
3312
|
+
}
|
|
3313
|
+
finally {
|
|
3314
|
+
await rm(cwd, { recursive: true, force: true });
|
|
3315
|
+
}
|
|
3316
|
+
});
|
|
3317
|
+
it("preserves prompt-submit HUD reconciliation for native subagents even with worker pane env", async () => {
|
|
3318
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-hud-subagent-worker-preserve-"));
|
|
3319
|
+
try {
|
|
3320
|
+
const teamName = "hud-subagent-keep";
|
|
3321
|
+
await initTeamState(teamName, "preserve subagent HUD reconcile", "executor", 1, cwd);
|
|
3322
|
+
await setTeamPaneIds(cwd, teamName, {
|
|
3323
|
+
leaderPaneId: "%42",
|
|
3324
|
+
workerPaneIds: { "worker-1": "%10" },
|
|
3325
|
+
});
|
|
3326
|
+
const stateDir = join(cwd, ".omx", "state");
|
|
3327
|
+
const canonicalSessionId = "sess-subagent-hud-parent";
|
|
3328
|
+
const leaderNativeSessionId = "native-subagent-hud-parent";
|
|
3329
|
+
const childNativeSessionId = "native-subagent-hud-child";
|
|
3330
|
+
const nowIso = new Date().toISOString();
|
|
3331
|
+
await writeJson(join(stateDir, "session.json"), {
|
|
3332
|
+
session_id: canonicalSessionId,
|
|
3333
|
+
native_session_id: leaderNativeSessionId,
|
|
3334
|
+
});
|
|
3335
|
+
await writeJson(join(stateDir, "subagent-tracking.json"), {
|
|
3336
|
+
schemaVersion: 1,
|
|
3337
|
+
sessions: {
|
|
3338
|
+
[canonicalSessionId]: {
|
|
3339
|
+
session_id: canonicalSessionId,
|
|
3340
|
+
leader_thread_id: leaderNativeSessionId,
|
|
3341
|
+
updated_at: nowIso,
|
|
3342
|
+
threads: {
|
|
3343
|
+
[leaderNativeSessionId]: {
|
|
3344
|
+
thread_id: leaderNativeSessionId,
|
|
3345
|
+
kind: "leader",
|
|
3346
|
+
first_seen_at: nowIso,
|
|
3347
|
+
last_seen_at: nowIso,
|
|
3348
|
+
turn_count: 1,
|
|
3349
|
+
},
|
|
3350
|
+
[childNativeSessionId]: {
|
|
3351
|
+
thread_id: childNativeSessionId,
|
|
3352
|
+
kind: "subagent",
|
|
3353
|
+
first_seen_at: nowIso,
|
|
3354
|
+
last_seen_at: nowIso,
|
|
3355
|
+
turn_count: 1,
|
|
3356
|
+
mode: "verifier",
|
|
3357
|
+
},
|
|
3358
|
+
},
|
|
3359
|
+
},
|
|
3360
|
+
},
|
|
3361
|
+
});
|
|
3362
|
+
process.env.TMUX = "1";
|
|
3363
|
+
process.env.TMUX_PANE = "%10";
|
|
3364
|
+
process.env.OMX_TEAM_INTERNAL_WORKER = `${teamName}/worker-1`;
|
|
3365
|
+
process.env.OMX_TEAM_WORKER = `${teamName}/worker-1`;
|
|
3366
|
+
process.env[OMX_TMUX_HUD_OWNER_ENV] = "1";
|
|
3367
|
+
let reconcileCall = null;
|
|
3368
|
+
const result = await dispatchCodexNativeHook({
|
|
3369
|
+
hook_event_name: "UserPromptSubmit",
|
|
3370
|
+
cwd,
|
|
3371
|
+
session_id: childNativeSessionId,
|
|
3372
|
+
thread_id: childNativeSessionId,
|
|
3373
|
+
turn_id: "turn-subagent-hud-child",
|
|
3374
|
+
prompt: "Review the worker patch literally; do not activate $ralplan.",
|
|
3375
|
+
}, {
|
|
3376
|
+
cwd,
|
|
3377
|
+
reconcileHudForPromptSubmitFn: async (hookCwd, deps = {}) => {
|
|
3378
|
+
reconcileCall = { cwd: hookCwd, sessionId: deps.sessionId };
|
|
3379
|
+
return { status: "recreated", paneId: "%9", desiredHeight: 3, duplicateCount: 0 };
|
|
3380
|
+
},
|
|
3381
|
+
});
|
|
3382
|
+
assert.equal(result.outputJson, null);
|
|
3383
|
+
assert.deepEqual(reconcileCall, { cwd, sessionId: canonicalSessionId });
|
|
3384
|
+
}
|
|
3385
|
+
finally {
|
|
3386
|
+
await rm(cwd, { recursive: true, force: true });
|
|
3387
|
+
}
|
|
3388
|
+
});
|
|
3173
3389
|
it("runs prompt-submit HUD reconciliation as a best-effort tmux-only side effect", async () => {
|
|
3174
3390
|
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-hud-reconcile-"));
|
|
3175
3391
|
const originalTmux = process.env.TMUX;
|
|
@@ -3214,8 +3430,8 @@ esac
|
|
|
3214
3430
|
assert.equal(result.omxEventName, "keyword-detector");
|
|
3215
3431
|
const tmuxCalls = await readFile(tmuxLog, "utf-8");
|
|
3216
3432
|
assert.match(tmuxCalls, /list-panes -t %1 -F/);
|
|
3217
|
-
assert.match(tmuxCalls,
|
|
3218
|
-
assert.match(tmuxCalls,
|
|
3433
|
+
assert.match(tmuxCalls, new RegExp(`split-window -v -l ${HUD_TMUX_HEIGHT_LINES} -d -t %1 -c`));
|
|
3434
|
+
assert.match(tmuxCalls, new RegExp(`resize-pane -t %9 -y ${HUD_TMUX_HEIGHT_LINES}`));
|
|
3219
3435
|
assert.match(tmuxCalls, /dist\/cli\/omx\.js' hud --watch --preset=focused/);
|
|
3220
3436
|
assert.doesNotMatch(tmuxCalls, /\/tmp\/codex-host-binary' hud --watch/);
|
|
3221
3437
|
}
|
|
@@ -3290,7 +3506,7 @@ esac
|
|
|
3290
3506
|
assert.equal(result.omxEventName, "keyword-detector");
|
|
3291
3507
|
const tmuxCalls = await readFile(tmuxLog, "utf-8");
|
|
3292
3508
|
assert.match(tmuxCalls, /list-panes -t %1 -F/);
|
|
3293
|
-
assert.match(tmuxCalls,
|
|
3509
|
+
assert.match(tmuxCalls, new RegExp(`resize-pane -t %2 -y ${HUD_TMUX_HEIGHT_LINES}`));
|
|
3294
3510
|
assert.doesNotMatch(tmuxCalls, /split-window/);
|
|
3295
3511
|
assert.equal(existsSync(join(cwd, ".omx", "state", "sessions", canonicalSessionId, "ralplan-state.json")), true);
|
|
3296
3512
|
assert.equal(existsSync(join(cwd, ".omx", "state", "sessions", nativeSessionId, "ralplan-state.json")), false);
|
|
@@ -7650,6 +7866,65 @@ exit 0
|
|
|
7650
7866
|
await rm(cwd, { recursive: true, force: true });
|
|
7651
7867
|
}
|
|
7652
7868
|
});
|
|
7869
|
+
it("does not report ralplan subagent waiting when notify-fallback already recorded completion", async () => {
|
|
7870
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-stop-skill-subagent-complete-"));
|
|
7871
|
+
try {
|
|
7872
|
+
const stateDir = join(cwd, ".omx", "state");
|
|
7873
|
+
const now = new Date().toISOString();
|
|
7874
|
+
await mkdir(join(stateDir, "sessions", "sess-stop-skill-subagent-complete"), { recursive: true });
|
|
7875
|
+
await writeJson(join(stateDir, "session.json"), { session_id: "sess-stop-skill-subagent-complete" });
|
|
7876
|
+
await writeJson(join(stateDir, "sessions", "sess-stop-skill-subagent-complete", "skill-active-state.json"), {
|
|
7877
|
+
active: true,
|
|
7878
|
+
skill: "ralplan",
|
|
7879
|
+
phase: "planning",
|
|
7880
|
+
});
|
|
7881
|
+
await writeJson(join(stateDir, "sessions", "sess-stop-skill-subagent-complete", "ralplan-state.json"), {
|
|
7882
|
+
active: true,
|
|
7883
|
+
current_phase: "planning",
|
|
7884
|
+
});
|
|
7885
|
+
await writeJson(join(stateDir, "subagent-tracking.json"), {
|
|
7886
|
+
schemaVersion: 1,
|
|
7887
|
+
sessions: {
|
|
7888
|
+
"sess-stop-skill-subagent-complete": {
|
|
7889
|
+
session_id: "sess-stop-skill-subagent-complete",
|
|
7890
|
+
leader_thread_id: "leader-1",
|
|
7891
|
+
updated_at: now,
|
|
7892
|
+
threads: {
|
|
7893
|
+
"leader-1": {
|
|
7894
|
+
thread_id: "leader-1",
|
|
7895
|
+
kind: "leader",
|
|
7896
|
+
first_seen_at: now,
|
|
7897
|
+
last_seen_at: now,
|
|
7898
|
+
turn_count: 1,
|
|
7899
|
+
},
|
|
7900
|
+
"sub-1": {
|
|
7901
|
+
thread_id: "sub-1",
|
|
7902
|
+
kind: "subagent",
|
|
7903
|
+
first_seen_at: now,
|
|
7904
|
+
last_seen_at: now,
|
|
7905
|
+
completed_at: now,
|
|
7906
|
+
last_completed_turn_id: "turn-complete-1",
|
|
7907
|
+
completion_source: "notify-fallback-watcher",
|
|
7908
|
+
turn_count: 2,
|
|
7909
|
+
},
|
|
7910
|
+
},
|
|
7911
|
+
},
|
|
7912
|
+
},
|
|
7913
|
+
});
|
|
7914
|
+
const result = await dispatchCodexNativeHook({
|
|
7915
|
+
hook_event_name: "Stop",
|
|
7916
|
+
cwd,
|
|
7917
|
+
session_id: "sess-stop-skill-subagent-complete",
|
|
7918
|
+
}, { cwd });
|
|
7919
|
+
assert.equal(result.omxEventName, "stop");
|
|
7920
|
+
assert.equal(result.outputJson?.decision, "block");
|
|
7921
|
+
assert.doesNotMatch(String(result.outputJson?.reason ?? ""), /waiting for 1 active native subagent thread/);
|
|
7922
|
+
assert.equal(result.outputJson?.stopReason, "skill_ralplan_planning_continue_artifact");
|
|
7923
|
+
}
|
|
7924
|
+
finally {
|
|
7925
|
+
await rm(cwd, { recursive: true, force: true });
|
|
7926
|
+
}
|
|
7927
|
+
});
|
|
7653
7928
|
it("does not block on stale root ralplan skill when the explicit session-scoped canonical skill state is absent", async () => {
|
|
7654
7929
|
const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-stop-stale-root-skill-"));
|
|
7655
7930
|
try {
|
|
@@ -11368,4 +11643,61 @@ describe("codex native hook triage integration", () => {
|
|
|
11368
11643
|
}
|
|
11369
11644
|
});
|
|
11370
11645
|
});
|
|
11646
|
+
describe('native Stop autopilot deep-interview wait', () => {
|
|
11647
|
+
it('does not force continued execution while autopilot is waiting on a deep-interview omx question', async () => {
|
|
11648
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-native-hook-autopilot-question-wait-'));
|
|
11649
|
+
try {
|
|
11650
|
+
const sessionId = 'sess-autopilot-wait';
|
|
11651
|
+
const sessionDir = join(cwd, '.omx', 'state', 'sessions', sessionId);
|
|
11652
|
+
await writeJson(join(cwd, '.omx', 'state', 'session.json'), { session_id: sessionId });
|
|
11653
|
+
await writeJson(join(sessionDir, 'autopilot-state.json'), {
|
|
11654
|
+
mode: 'autopilot',
|
|
11655
|
+
active: true,
|
|
11656
|
+
current_phase: 'waiting-for-user',
|
|
11657
|
+
run_outcome: 'blocked_on_user',
|
|
11658
|
+
lifecycle_outcome: 'askuserQuestion',
|
|
11659
|
+
session_id: sessionId,
|
|
11660
|
+
state: {
|
|
11661
|
+
deep_interview_question: {
|
|
11662
|
+
status: 'waiting_for_user',
|
|
11663
|
+
source: 'omx-question',
|
|
11664
|
+
obligation_id: 'obligation-stop-1',
|
|
11665
|
+
previous_phase: 'deep-interview',
|
|
11666
|
+
},
|
|
11667
|
+
},
|
|
11668
|
+
});
|
|
11669
|
+
await writeJson(join(sessionDir, 'deep-interview-state.json'), {
|
|
11670
|
+
mode: 'deep-interview',
|
|
11671
|
+
active: false,
|
|
11672
|
+
current_phase: 'intent-first',
|
|
11673
|
+
lifecycle_outcome: 'askuserQuestion',
|
|
11674
|
+
run_outcome: 'blocked_on_user',
|
|
11675
|
+
session_id: sessionId,
|
|
11676
|
+
question_enforcement: {
|
|
11677
|
+
obligation_id: 'obligation-stop-1',
|
|
11678
|
+
source: 'omx-question',
|
|
11679
|
+
status: 'pending',
|
|
11680
|
+
lifecycle_outcome: 'askuserQuestion',
|
|
11681
|
+
requested_at: '2026-04-19T00:00:00.000Z',
|
|
11682
|
+
},
|
|
11683
|
+
});
|
|
11684
|
+
await writeJson(join(sessionDir, 'skill-active-state.json'), {
|
|
11685
|
+
active: true,
|
|
11686
|
+
skill: 'autopilot',
|
|
11687
|
+
phase: 'deep-interview',
|
|
11688
|
+
session_id: sessionId,
|
|
11689
|
+
active_skills: [{ skill: 'autopilot', phase: 'deep-interview', active: true, session_id: sessionId }],
|
|
11690
|
+
});
|
|
11691
|
+
const result = await dispatchCodexNativeHook({
|
|
11692
|
+
hook_event_name: 'Stop',
|
|
11693
|
+
session_id: sessionId,
|
|
11694
|
+
thread_id: 'thread-autopilot-wait',
|
|
11695
|
+
}, { cwd });
|
|
11696
|
+
assert.equal(result.outputJson, null);
|
|
11697
|
+
}
|
|
11698
|
+
finally {
|
|
11699
|
+
await rm(cwd, { recursive: true, force: true });
|
|
11700
|
+
}
|
|
11701
|
+
});
|
|
11702
|
+
});
|
|
11371
11703
|
//# sourceMappingURL=codex-native-hook.test.js.map
|