oh-my-codex 0.19.0 → 0.19.1
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 +5 -0
- package/dist/cli/__tests__/mission.test.d.ts +2 -0
- package/dist/cli/__tests__/mission.test.d.ts.map +1 -0
- package/dist/cli/__tests__/mission.test.js +239 -0
- package/dist/cli/__tests__/mission.test.js.map +1 -0
- package/dist/cli/__tests__/session-scoped-runtime.test.js +67 -0
- package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +30 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mission.d.ts +36 -0
- package/dist/cli/mission.d.ts.map +1 -0
- package/dist/cli/mission.js +443 -0
- package/dist/cli/mission.js.map +1 -0
- package/dist/hud/__tests__/state.test.js +31 -6
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +7 -3
- package/dist/hud/state.js.map +1 -1
- package/dist/mcp/__tests__/state-paths.test.js +32 -1
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/state-paths.d.ts +4 -0
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +6 -15
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/ralplan/__tests__/consensus-gate.test.js +193 -0
- package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
- package/dist/ralplan/consensus-gate.js +24 -3
- package/dist/ralplan/consensus-gate.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +330 -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 +68 -10
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/generate-catalog-docs.js +1 -0
- package/dist/scripts/generate-catalog-docs.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +287 -0
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.js +59 -0
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +8 -6
- package/dist/state/operations.js.map +1 -1
- package/dist/state/skill-active.js +3 -3
- package/dist/state/skill-active.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +14 -4
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +70 -5
- 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/src/scripts/__tests__/codex-native-hook.test.ts +340 -0
- package/src/scripts/codex-native-hook.ts +75 -9
- package/src/scripts/generate-catalog-docs.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-native-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-native-hook.ts"],"names":[],"mappings":"AA8CA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AAiCtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAoDlE,KAAK,kBAAkB,GACnB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,MAAM,CAAC;AAEX,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,UAAU,yBAAyB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B,CAAC,EAAE,OAAO,2BAA2B,CAAC;CACpE;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AAmfD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,kBAAkB,GAAG,IAAI,GACvC,MAAM,GAAG,IAAI,CAmBf;AAsxBD,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC,GACL,MAAM,GAAG,IAAI,CAuBf;AA2mCD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMnE;
|
|
1
|
+
{"version":3,"file":"codex-native-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-native-hook.ts"],"names":[],"mappings":"AA8CA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AAiCtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAoDlE,KAAK,kBAAkB,GACnB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,MAAM,CAAC;AAEX,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,UAAU,yBAAyB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B,CAAC,EAAE,OAAO,2BAA2B,CAAC;CACpE;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AAmfD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,kBAAkB,GAAG,IAAI,GACvC,MAAM,GAAG,IAAI,CAmBf;AAsxBD,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC,GACL,MAAM,GAAG,IAAI,CAuBf;AA2mCD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMnE;AAymKD,wBAAsB,wCAAwC,CAC5D,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAyCzC;AA83CD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CA4VnC;AA6BD,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAGT;AAyOD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyC3D"}
|
|
@@ -2821,6 +2821,15 @@ function isActiveDeepInterviewPhase(state) {
|
|
|
2821
2821
|
return false;
|
|
2822
2822
|
return true;
|
|
2823
2823
|
}
|
|
2824
|
+
function isInactiveCompletedDeepInterviewPhase(state) {
|
|
2825
|
+
if (!state || state.active !== false)
|
|
2826
|
+
return false;
|
|
2827
|
+
const mode = safeString(state.mode).trim();
|
|
2828
|
+
if (mode && mode !== "deep-interview")
|
|
2829
|
+
return false;
|
|
2830
|
+
const phase = safeString(state.current_phase ?? state.currentPhase).trim().toLowerCase();
|
|
2831
|
+
return phase === "complete" || phase === "completed";
|
|
2832
|
+
}
|
|
2824
2833
|
function isActiveRalplanPhase(state) {
|
|
2825
2834
|
if (!state || state.active !== true)
|
|
2826
2835
|
return false;
|
|
@@ -6030,6 +6039,8 @@ async function readActiveDeepInterviewStateForPreToolUse(cwd, stateDir, sessionI
|
|
|
6030
6039
|
if (hasActiveDeepInterviewSkill)
|
|
6031
6040
|
return modeState;
|
|
6032
6041
|
}
|
|
6042
|
+
if (isInactiveCompletedDeepInterviewPhase(modeState))
|
|
6043
|
+
return null;
|
|
6033
6044
|
const autopilotState = sessionId
|
|
6034
6045
|
? await readStopSessionPinnedState("autopilot-state.json", cwd, sessionId, stateDir)
|
|
6035
6046
|
: await readJsonIfExists(join(stateDir, "autopilot-state.json"));
|
|
@@ -6174,7 +6185,7 @@ function buildDeepInterviewBashBlockedDetail(cwd, command) {
|
|
|
6174
6185
|
}
|
|
6175
6186
|
async function buildRalplanPreToolUseBoundaryOutput(payload, cwd, stateDir, resolvedSessionId) {
|
|
6176
6187
|
const sessionId = safeString(resolvedSessionId ?? readPayloadSessionId(payload)).trim();
|
|
6177
|
-
if (await
|
|
6188
|
+
if (await hasTrustedTypedSubagentProvenanceForPreToolUse(payload, cwd, sessionId))
|
|
6178
6189
|
return null;
|
|
6179
6190
|
const threadId = readPayloadThreadId(payload);
|
|
6180
6191
|
const activeState = await readActiveRalplanStateForPreToolUse(cwd, stateDir, sessionId, threadId);
|
|
@@ -6233,7 +6244,7 @@ async function buildRalplanPreToolUseBoundaryOutput(payload, cwd, stateDir, reso
|
|
|
6233
6244
|
}
|
|
6234
6245
|
async function buildDeepInterviewPreToolUseBoundaryOutput(payload, cwd, stateDir, resolvedSessionId) {
|
|
6235
6246
|
const sessionId = safeString(resolvedSessionId ?? readPayloadSessionId(payload)).trim();
|
|
6236
|
-
if (await
|
|
6247
|
+
if (await hasTrustedTypedSubagentProvenanceForPreToolUse(payload, cwd, sessionId))
|
|
6237
6248
|
return null;
|
|
6238
6249
|
const threadId = readPayloadThreadId(payload);
|
|
6239
6250
|
const activeState = await readActiveDeepInterviewStateForPreToolUse(cwd, stateDir, sessionId, threadId);
|
|
@@ -6351,9 +6362,18 @@ async function buildPlanningRootPointerConflictPreToolUseOutput(payload, cwd, st
|
|
|
6351
6362
|
}
|
|
6352
6363
|
return blocked ? buildRalplanRootPointerConflictBlock(ralplanState) : null;
|
|
6353
6364
|
}
|
|
6354
|
-
async function
|
|
6365
|
+
async function hasTrustedTypedSubagentProvenanceForPreToolUse(payload, cwd, sessionId) {
|
|
6355
6366
|
if (hasTeamWorkerEnvironment())
|
|
6356
6367
|
return true;
|
|
6368
|
+
if (!isTypedAgentRolePayload(payload))
|
|
6369
|
+
return false;
|
|
6370
|
+
const trackingState = await readSubagentTrackingState(cwd).catch(() => null);
|
|
6371
|
+
const session = trackingState?.sessions?.[sessionId];
|
|
6372
|
+
if (!session)
|
|
6373
|
+
return false;
|
|
6374
|
+
const payloadThreadId = readPayloadThreadId(payload);
|
|
6375
|
+
if (payloadThreadId && isTrustedSubagentThread(session, payloadThreadId))
|
|
6376
|
+
return true;
|
|
6357
6377
|
const source = safeObject(payload.source);
|
|
6358
6378
|
const subagent = safeObject(source.subagent);
|
|
6359
6379
|
const threadSpawn = safeObject(subagent.thread_spawn);
|
|
@@ -6363,13 +6383,10 @@ async function hasTrustedTypedSubagentThreadSpawnProvenanceForPreToolUse(payload
|
|
|
6363
6383
|
?? threadSpawn.leaderThreadId).trim();
|
|
6364
6384
|
if (!parentThreadId)
|
|
6365
6385
|
return false;
|
|
6366
|
-
|
|
6367
|
-
|
|
6368
|
-
const trackingState = await readSubagentTrackingState(cwd).catch(() => null);
|
|
6369
|
-
const session = trackingState?.sessions?.[sessionId];
|
|
6370
|
-
if (!session)
|
|
6386
|
+
const leaderThreadId = safeString(session.leader_thread_id).trim();
|
|
6387
|
+
if (payloadThreadId && leaderThreadId && payloadThreadId === leaderThreadId)
|
|
6371
6388
|
return false;
|
|
6372
|
-
return
|
|
6389
|
+
return leaderThreadId === parentThreadId || parentThreadId in session.threads;
|
|
6373
6390
|
}
|
|
6374
6391
|
function isActiveConductorModeState(state, mode, sessionId) {
|
|
6375
6392
|
if (!state || state.active !== true)
|
|
@@ -6396,7 +6413,7 @@ async function readActiveMainRootConductorStateForPreToolUse(payload, cwd, state
|
|
|
6396
6413
|
const threadId = readPayloadThreadId(payload);
|
|
6397
6414
|
if (!sessionId)
|
|
6398
6415
|
return null;
|
|
6399
|
-
if (await
|
|
6416
|
+
if (await hasTrustedTypedSubagentProvenanceForPreToolUse(payload, cwd, sessionId))
|
|
6400
6417
|
return null;
|
|
6401
6418
|
const canonicalState = await readVisibleSkillActiveStateForStateDir(stateDir, sessionId);
|
|
6402
6419
|
if (!canonicalState)
|
|
@@ -7380,6 +7397,44 @@ function modeStateHasExplicitMatchingCwd(state, cwd) {
|
|
|
7380
7397
|
return false;
|
|
7381
7398
|
}
|
|
7382
7399
|
}
|
|
7400
|
+
async function clearNativeStopSessionEntries(stateDir, payload, canonicalSessionId) {
|
|
7401
|
+
const statePath = join(stateDir, NATIVE_STOP_STATE_FILE);
|
|
7402
|
+
const state = await readJsonIfExists(statePath);
|
|
7403
|
+
if (!state)
|
|
7404
|
+
return;
|
|
7405
|
+
const sessions = safeObject(state.sessions);
|
|
7406
|
+
const keys = new Set(uniqueNonEmpty([
|
|
7407
|
+
readNativeStopSessionKey(payload, canonicalSessionId),
|
|
7408
|
+
canonicalSessionId,
|
|
7409
|
+
readPayloadSessionId(payload),
|
|
7410
|
+
readPayloadThreadId(payload),
|
|
7411
|
+
]));
|
|
7412
|
+
let changed = false;
|
|
7413
|
+
for (const key of keys) {
|
|
7414
|
+
if (Object.prototype.hasOwnProperty.call(sessions, key)) {
|
|
7415
|
+
delete sessions[key];
|
|
7416
|
+
changed = true;
|
|
7417
|
+
}
|
|
7418
|
+
}
|
|
7419
|
+
if (!changed)
|
|
7420
|
+
return;
|
|
7421
|
+
await writeFile(statePath, JSON.stringify({ ...state, sessions }, null, 2));
|
|
7422
|
+
}
|
|
7423
|
+
async function hasAuthoritativeInactiveSkillStopState(cwd, stateDir, skill, sessionId, threadId) {
|
|
7424
|
+
const sessionModeState = await readStopSessionPinnedState(`${skill}-state.json`, cwd, sessionId, stateDir);
|
|
7425
|
+
if (!sessionModeState || !isTerminalOrInactiveModeState(sessionModeState))
|
|
7426
|
+
return false;
|
|
7427
|
+
const canonicalState = await readVisibleSkillActiveStateForStateDir(stateDir, sessionId);
|
|
7428
|
+
if (canonicalState && !rootSkillStateHasNoActiveSkillForStopContext(canonicalState, skill, sessionId, threadId)) {
|
|
7429
|
+
return false;
|
|
7430
|
+
}
|
|
7431
|
+
const rootModeState = await readJsonIfExists(join(stateDir, `${skill}-state.json`));
|
|
7432
|
+
if (!rootModeState)
|
|
7433
|
+
return true;
|
|
7434
|
+
if (!modeStateMatchesSkillStopContext(rootModeState, cwd, sessionId))
|
|
7435
|
+
return true;
|
|
7436
|
+
return isTerminalOrInactiveModeState(rootModeState);
|
|
7437
|
+
}
|
|
7383
7438
|
async function readBlockingSkillForStop(cwd, stateDir, sessionId, threadId, requiredSkill) {
|
|
7384
7439
|
const canonicalState = await readVisibleSkillActiveStateForStateDir(stateDir, sessionId);
|
|
7385
7440
|
const visibleEntries = canonicalState ? listActiveSkills(canonicalState) : [];
|
|
@@ -8029,6 +8084,9 @@ async function buildStopHookOutput(payload, cwd, stateDir, options = {}) {
|
|
|
8029
8084
|
const suppressParentWorkflowStop = shouldSuppressParentWorkflowStopForSideConversation(payload);
|
|
8030
8085
|
if (canonicalSessionId) {
|
|
8031
8086
|
await reconcileStaleRootSkillActiveStateForStop(cwd, stateDir, canonicalSessionId);
|
|
8087
|
+
if (await hasAuthoritativeInactiveSkillStopState(cwd, stateDir, "ralplan", canonicalSessionId, threadId)) {
|
|
8088
|
+
await clearNativeStopSessionEntries(stateDir, payload, canonicalSessionId);
|
|
8089
|
+
}
|
|
8032
8090
|
}
|
|
8033
8091
|
if (suppressParentWorkflowStop) {
|
|
8034
8092
|
return null;
|