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.
Files changed (59) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +5 -0
  4. package/dist/cli/__tests__/mission.test.d.ts +2 -0
  5. package/dist/cli/__tests__/mission.test.d.ts.map +1 -0
  6. package/dist/cli/__tests__/mission.test.js +239 -0
  7. package/dist/cli/__tests__/mission.test.js.map +1 -0
  8. package/dist/cli/__tests__/session-scoped-runtime.test.js +67 -0
  9. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  10. package/dist/cli/__tests__/ultragoal.test.js +1 -1
  11. package/dist/cli/index.d.ts +2 -2
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +30 -4
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/mission.d.ts +36 -0
  16. package/dist/cli/mission.d.ts.map +1 -0
  17. package/dist/cli/mission.js +443 -0
  18. package/dist/cli/mission.js.map +1 -0
  19. package/dist/hud/__tests__/state.test.js +31 -6
  20. package/dist/hud/__tests__/state.test.js.map +1 -1
  21. package/dist/hud/state.d.ts.map +1 -1
  22. package/dist/hud/state.js +7 -3
  23. package/dist/hud/state.js.map +1 -1
  24. package/dist/mcp/__tests__/state-paths.test.js +32 -1
  25. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  26. package/dist/mcp/state-paths.d.ts +4 -0
  27. package/dist/mcp/state-paths.d.ts.map +1 -1
  28. package/dist/mcp/state-paths.js +6 -15
  29. package/dist/mcp/state-paths.js.map +1 -1
  30. package/dist/ralplan/__tests__/consensus-gate.test.js +193 -0
  31. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
  32. package/dist/ralplan/consensus-gate.js +24 -3
  33. package/dist/ralplan/consensus-gate.js.map +1 -1
  34. package/dist/scripts/__tests__/codex-native-hook.test.js +330 -0
  35. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  36. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  37. package/dist/scripts/codex-native-hook.js +68 -10
  38. package/dist/scripts/codex-native-hook.js.map +1 -1
  39. package/dist/scripts/generate-catalog-docs.js +1 -0
  40. package/dist/scripts/generate-catalog-docs.js.map +1 -1
  41. package/dist/state/__tests__/operations.test.js +287 -0
  42. package/dist/state/__tests__/operations.test.js.map +1 -1
  43. package/dist/state/__tests__/skill-active.test.js +59 -0
  44. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  45. package/dist/state/operations.d.ts.map +1 -1
  46. package/dist/state/operations.js +8 -6
  47. package/dist/state/operations.js.map +1 -1
  48. package/dist/state/skill-active.js +3 -3
  49. package/dist/state/skill-active.js.map +1 -1
  50. package/dist/ultragoal/__tests__/artifacts.test.js +14 -4
  51. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  52. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  53. package/dist/ultragoal/artifacts.js +70 -5
  54. package/dist/ultragoal/artifacts.js.map +1 -1
  55. package/package.json +1 -1
  56. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  57. package/src/scripts/__tests__/codex-native-hook.test.ts +340 -0
  58. package/src/scripts/codex-native-hook.ts +75 -9
  59. 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;AA0lKD,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;AA20CD,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"}
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 hasTrustedTypedSubagentThreadSpawnProvenanceForPreToolUse(payload, cwd, sessionId))
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 hasTrustedTypedSubagentThreadSpawnProvenanceForPreToolUse(payload, cwd, sessionId))
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 hasTrustedTypedSubagentThreadSpawnProvenanceForPreToolUse(payload, cwd, sessionId) {
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
- if (!isTypedAgentRolePayload(payload))
6367
- return false;
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 session.leader_thread_id === parentThreadId || parentThreadId in session.threads;
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 hasTrustedTypedSubagentThreadSpawnProvenanceForPreToolUse(payload, cwd, sessionId))
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;