oh-my-codex 0.18.2 → 0.18.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/Cargo.toml +1 -1
  2. package/dist/agents/__tests__/definitions.test.js +9 -0
  3. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  4. package/dist/agents/__tests__/native-config.test.js +1 -0
  5. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  6. package/dist/agents/definitions.d.ts.map +1 -1
  7. package/dist/agents/definitions.js +10 -0
  8. package/dist/agents/definitions.js.map +1 -1
  9. package/dist/auth/__tests__/config-sessions.test.d.ts +2 -0
  10. package/dist/auth/__tests__/config-sessions.test.d.ts.map +1 -0
  11. package/dist/auth/__tests__/config-sessions.test.js +48 -0
  12. package/dist/auth/__tests__/config-sessions.test.js.map +1 -0
  13. package/dist/auth/__tests__/quota-rotation.test.d.ts +2 -0
  14. package/dist/auth/__tests__/quota-rotation.test.d.ts.map +1 -0
  15. package/dist/auth/__tests__/quota-rotation.test.js +33 -0
  16. package/dist/auth/__tests__/quota-rotation.test.js.map +1 -0
  17. package/dist/auth/__tests__/redact.test.d.ts +2 -0
  18. package/dist/auth/__tests__/redact.test.d.ts.map +1 -0
  19. package/dist/auth/__tests__/redact.test.js +20 -0
  20. package/dist/auth/__tests__/redact.test.js.map +1 -0
  21. package/dist/auth/__tests__/storage.test.d.ts +2 -0
  22. package/dist/auth/__tests__/storage.test.d.ts.map +1 -0
  23. package/dist/auth/__tests__/storage.test.js +108 -0
  24. package/dist/auth/__tests__/storage.test.js.map +1 -0
  25. package/dist/auth/config.d.ts +9 -0
  26. package/dist/auth/config.d.ts.map +1 -0
  27. package/dist/auth/config.js +77 -0
  28. package/dist/auth/config.js.map +1 -0
  29. package/dist/auth/hotswap.d.ts +36 -0
  30. package/dist/auth/hotswap.d.ts.map +1 -0
  31. package/dist/auth/hotswap.js +159 -0
  32. package/dist/auth/hotswap.js.map +1 -0
  33. package/dist/auth/index.d.ts +8 -0
  34. package/dist/auth/index.d.ts.map +1 -0
  35. package/dist/auth/index.js +8 -0
  36. package/dist/auth/index.js.map +1 -0
  37. package/dist/auth/paths.d.ts +12 -0
  38. package/dist/auth/paths.d.ts.map +1 -0
  39. package/dist/auth/paths.js +78 -0
  40. package/dist/auth/paths.js.map +1 -0
  41. package/dist/auth/quota-detector.d.ts +10 -0
  42. package/dist/auth/quota-detector.d.ts.map +1 -0
  43. package/dist/auth/quota-detector.js +40 -0
  44. package/dist/auth/quota-detector.js.map +1 -0
  45. package/dist/auth/redact.d.ts +2 -0
  46. package/dist/auth/redact.d.ts.map +1 -0
  47. package/dist/auth/redact.js +26 -0
  48. package/dist/auth/redact.js.map +1 -0
  49. package/dist/auth/rotation.d.ts +9 -0
  50. package/dist/auth/rotation.d.ts.map +1 -0
  51. package/dist/auth/rotation.js +26 -0
  52. package/dist/auth/rotation.js.map +1 -0
  53. package/dist/auth/sessions.d.ts +15 -0
  54. package/dist/auth/sessions.d.ts.map +1 -0
  55. package/dist/auth/sessions.js +62 -0
  56. package/dist/auth/sessions.js.map +1 -0
  57. package/dist/auth/storage.d.ts +27 -0
  58. package/dist/auth/storage.d.ts.map +1 -0
  59. package/dist/auth/storage.js +111 -0
  60. package/dist/auth/storage.js.map +1 -0
  61. package/dist/cli/__tests__/auth.test.d.ts +2 -0
  62. package/dist/cli/__tests__/auth.test.d.ts.map +1 -0
  63. package/dist/cli/__tests__/auth.test.js +168 -0
  64. package/dist/cli/__tests__/auth.test.js.map +1 -0
  65. package/dist/cli/__tests__/doctor-warning-copy.test.js +51 -0
  66. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  67. package/dist/cli/__tests__/explore.test.js +20 -0
  68. package/dist/cli/__tests__/explore.test.js.map +1 -1
  69. package/dist/cli/__tests__/index.test.js +10 -0
  70. package/dist/cli/__tests__/index.test.js.map +1 -1
  71. package/dist/cli/__tests__/nested-help-routing.test.js +1 -0
  72. package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -1
  73. package/dist/cli/__tests__/setup-agents-overwrite.test.js +30 -1
  74. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  75. package/dist/cli/__tests__/setup-install-mode.test.js +47 -0
  76. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  77. package/dist/cli/auth.d.ts +4 -0
  78. package/dist/cli/auth.d.ts.map +1 -0
  79. package/dist/cli/auth.js +89 -0
  80. package/dist/cli/auth.js.map +1 -0
  81. package/dist/cli/doctor.d.ts.map +1 -1
  82. package/dist/cli/doctor.js +19 -7
  83. package/dist/cli/doctor.js.map +1 -1
  84. package/dist/cli/explore.d.ts.map +1 -1
  85. package/dist/cli/explore.js +12 -0
  86. package/dist/cli/explore.js.map +1 -1
  87. package/dist/cli/index.d.ts +20 -2
  88. package/dist/cli/index.d.ts.map +1 -1
  89. package/dist/cli/index.js +104 -6
  90. package/dist/cli/index.js.map +1 -1
  91. package/dist/cli/setup.d.ts.map +1 -1
  92. package/dist/cli/setup.js +11 -3
  93. package/dist/cli/setup.js.map +1 -1
  94. package/dist/config/__tests__/deep-interview.test.d.ts +2 -0
  95. package/dist/config/__tests__/deep-interview.test.d.ts.map +1 -0
  96. package/dist/config/__tests__/deep-interview.test.js +239 -0
  97. package/dist/config/__tests__/deep-interview.test.js.map +1 -0
  98. package/dist/config/__tests__/generator-idempotent.test.js +123 -0
  99. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  100. package/dist/config/deep-interview.d.ts +22 -0
  101. package/dist/config/deep-interview.d.ts.map +1 -0
  102. package/dist/config/deep-interview.js +151 -0
  103. package/dist/config/deep-interview.js.map +1 -0
  104. package/dist/config/generator.d.ts +5 -2
  105. package/dist/config/generator.d.ts.map +1 -1
  106. package/dist/config/generator.js +106 -36
  107. package/dist/config/generator.js.map +1 -1
  108. package/dist/hooks/__tests__/agents-overlay.test.js +2 -0
  109. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  110. package/dist/hooks/__tests__/explore-routing.test.js +1 -0
  111. package/dist/hooks/__tests__/explore-routing.test.js.map +1 -1
  112. package/dist/hooks/__tests__/keyword-detector.test.js +301 -0
  113. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  114. package/dist/hooks/deep-interview-config-instruction.d.ts +3 -0
  115. package/dist/hooks/deep-interview-config-instruction.d.ts.map +1 -0
  116. package/dist/hooks/deep-interview-config-instruction.js +47 -0
  117. package/dist/hooks/deep-interview-config-instruction.js.map +1 -0
  118. package/dist/hooks/explore-routing.d.ts.map +1 -1
  119. package/dist/hooks/explore-routing.js +1 -0
  120. package/dist/hooks/explore-routing.js.map +1 -1
  121. package/dist/hooks/keyword-detector.d.ts +5 -0
  122. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  123. package/dist/hooks/keyword-detector.js +52 -8
  124. package/dist/hooks/keyword-detector.js.map +1 -1
  125. package/dist/hud/__tests__/hud-tmux-injection.test.js +4 -4
  126. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  127. package/dist/hud/__tests__/reconcile.test.js +94 -9
  128. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  129. package/dist/hud/__tests__/tmux.test.js +103 -1
  130. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  131. package/dist/hud/reconcile.d.ts +1 -1
  132. package/dist/hud/reconcile.d.ts.map +1 -1
  133. package/dist/hud/reconcile.js +8 -0
  134. package/dist/hud/reconcile.js.map +1 -1
  135. package/dist/hud/tmux.d.ts +7 -0
  136. package/dist/hud/tmux.d.ts.map +1 -1
  137. package/dist/hud/tmux.js +46 -9
  138. package/dist/hud/tmux.js.map +1 -1
  139. package/dist/question/deep-interview.d.ts +2 -0
  140. package/dist/question/deep-interview.d.ts.map +1 -1
  141. package/dist/question/deep-interview.js.map +1 -1
  142. package/dist/scripts/__tests__/codex-native-hook.test.js +387 -0
  143. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  144. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  145. package/dist/scripts/codex-native-hook.js +24 -2
  146. package/dist/scripts/codex-native-hook.js.map +1 -1
  147. package/dist/state/__tests__/planning-gate.test.d.ts +2 -0
  148. package/dist/state/__tests__/planning-gate.test.d.ts.map +1 -0
  149. package/dist/state/__tests__/planning-gate.test.js +219 -0
  150. package/dist/state/__tests__/planning-gate.test.js.map +1 -0
  151. package/dist/state/workflow-transition.d.ts +23 -0
  152. package/dist/state/workflow-transition.d.ts.map +1 -1
  153. package/dist/state/workflow-transition.js +63 -0
  154. package/dist/state/workflow-transition.js.map +1 -1
  155. package/dist/team/__tests__/tmux-session.test.js +86 -0
  156. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  157. package/dist/team/tmux-session.d.ts.map +1 -1
  158. package/dist/team/tmux-session.js +7 -0
  159. package/dist/team/tmux-session.js.map +1 -1
  160. package/package.json +1 -1
  161. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  162. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +10 -0
  163. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +6 -2
  164. package/prompts/scholastic.md +11 -0
  165. package/skills/deep-interview/SKILL.md +10 -0
  166. package/skills/ralplan/SKILL.md +6 -2
  167. package/src/scripts/__tests__/codex-native-hook.test.ts +485 -0
  168. package/src/scripts/codex-native-hook.ts +23 -1
  169. package/templates/catalog-manifest.json +5 -0
@@ -0,0 +1,151 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { parse as parseToml } from '@iarna/toml';
5
+ import { findGitLayout } from '../utils/git-layout.js';
6
+ const DEFAULT_PROFILE = 'standard';
7
+ const DEFAULT_ENABLE_CHALLENGE_MODES = true;
8
+ const PROFILE_SPECS = {
9
+ quick: {
10
+ thresholdKey: 'quickThreshold',
11
+ maxRoundsKey: 'quickMaxRounds',
12
+ defaults: { threshold: 0.30, maxRounds: 5 },
13
+ },
14
+ standard: {
15
+ thresholdKey: 'standardThreshold',
16
+ maxRoundsKey: 'standardMaxRounds',
17
+ defaults: { threshold: 0.20, maxRounds: 12 },
18
+ },
19
+ deep: {
20
+ thresholdKey: 'deepThreshold',
21
+ maxRoundsKey: 'deepMaxRounds',
22
+ defaults: { threshold: 0.15, maxRounds: 20 },
23
+ },
24
+ };
25
+ const DEEP_INTERVIEW_INVOCATION_PATTERN = /(?:^|\s)(?:\$(?:[A-Za-z0-9_-]+:)?deep-interview|deep[-\s]interview)(?=\s|$)/i;
26
+ const PROFILE_FLAG_TOKEN_PATTERN = /^--(quick|standard|deep)$/i;
27
+ function isRecord(value) {
28
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
29
+ }
30
+ function normalizeProfile(value) {
31
+ if (typeof value !== 'string')
32
+ return undefined;
33
+ const normalized = value.toLowerCase();
34
+ return normalized === 'quick' || normalized === 'standard' || normalized === 'deep'
35
+ ? normalized
36
+ : undefined;
37
+ }
38
+ function normalizeFiniteNumber(value) {
39
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
40
+ }
41
+ function normalizeThreshold(value) {
42
+ const normalized = normalizeFiniteNumber(value);
43
+ return normalized !== undefined && normalized > 0 && normalized <= 1 ? normalized : undefined;
44
+ }
45
+ function normalizeMaxRounds(value) {
46
+ const normalized = normalizeFiniteNumber(value);
47
+ return normalized !== undefined && Number.isInteger(normalized) && normalized > 0 ? normalized : undefined;
48
+ }
49
+ function warnMalformedConfig(configPath, error) {
50
+ const message = error instanceof Error ? error.message : String(error);
51
+ console.warn(`[omx] warning: ignoring malformed deep-interview config at ${configPath}: ${message}`);
52
+ }
53
+ function extractDeepInterviewTable(parsed) {
54
+ if (!isRecord(parsed) || !isRecord(parsed.omx) || !isRecord(parsed.omx.deepInterview))
55
+ return null;
56
+ return parsed.omx.deepInterview;
57
+ }
58
+ function readDeepInterviewConfigTable(configPath) {
59
+ if (!existsSync(configPath))
60
+ return { status: 'missing' };
61
+ try {
62
+ const table = extractDeepInterviewTable(parseToml(readFileSync(configPath, 'utf-8')));
63
+ return table ? { status: 'table', table } : { status: 'no-table' };
64
+ }
65
+ catch (error) {
66
+ warnMalformedConfig(configPath, error);
67
+ return { status: 'malformed' };
68
+ }
69
+ }
70
+ function resolveProfile(table, text) {
71
+ return parseDeepInterviewProfileFromText(text)
72
+ ?? normalizeProfile(table.defaultProfile)
73
+ ?? DEFAULT_PROFILE;
74
+ }
75
+ function resolveProfileConfig(table, profile) {
76
+ const spec = PROFILE_SPECS[profile];
77
+ return {
78
+ threshold: normalizeThreshold(table[spec.thresholdKey]) ?? spec.defaults.threshold,
79
+ maxRounds: normalizeMaxRounds(table[spec.maxRoundsKey]) ?? spec.defaults.maxRounds,
80
+ };
81
+ }
82
+ function resolveEnableChallengeModes(table) {
83
+ return typeof table.enableChallengeModes === 'boolean'
84
+ ? table.enableChallengeModes
85
+ : DEFAULT_ENABLE_CHALLENGE_MODES;
86
+ }
87
+ function buildRuntimeConfig(candidate, table, options) {
88
+ const profile = resolveProfile(table, options.text);
89
+ return {
90
+ profile,
91
+ ...resolveProfileConfig(table, profile),
92
+ enableChallengeModes: resolveEnableChallengeModes(table),
93
+ sourcePath: candidate.path,
94
+ };
95
+ }
96
+ export function parseDeepInterviewProfileFromText(text) {
97
+ const input = text ?? '';
98
+ const invocationMatch = DEEP_INTERVIEW_INVOCATION_PATTERN.exec(input);
99
+ if (!invocationMatch)
100
+ return undefined;
101
+ const afterInvocation = input.slice((invocationMatch.index ?? 0) + invocationMatch[0].length).trimStart();
102
+ for (const token of afterInvocation.split(/\s+/)) {
103
+ if (!token)
104
+ continue;
105
+ if (!token.startsWith('--'))
106
+ return undefined;
107
+ const profile = normalizeProfile(PROFILE_FLAG_TOKEN_PATTERN.exec(token)?.[1]);
108
+ if (profile)
109
+ return profile;
110
+ }
111
+ return undefined;
112
+ }
113
+ export function getDeepInterviewConfigCandidatePaths(options) {
114
+ const home = options.homeDir || homedir();
115
+ const projectRoot = findGitLayout(options.cwd)?.worktreeRoot ?? options.cwd;
116
+ return [
117
+ { path: join(projectRoot, '.omx', 'config.toml'), precedence: 'project-omx' },
118
+ { path: join(projectRoot, 'omx.toml'), precedence: 'project-root' },
119
+ { path: join(home, '.omx', 'config.toml'), precedence: 'user' },
120
+ ];
121
+ }
122
+ export function resolveDeepInterviewRuntimeConfig(options) {
123
+ for (const candidate of getDeepInterviewConfigCandidatePaths(options)) {
124
+ const result = readDeepInterviewConfigTable(candidate.path);
125
+ if (result.status === 'malformed' || result.status === 'no-table')
126
+ return null;
127
+ if (result.status === 'table')
128
+ return buildRuntimeConfig(candidate, result.table, options);
129
+ }
130
+ return null;
131
+ }
132
+ export function buildDeepInterviewConfigStateFields(config) {
133
+ if (!config)
134
+ return {};
135
+ const deepInterviewConfig = {
136
+ profile: config.profile,
137
+ threshold: config.threshold,
138
+ maxRounds: config.maxRounds,
139
+ enableChallengeModes: config.enableChallengeModes,
140
+ sourcePath: config.sourcePath,
141
+ };
142
+ return {
143
+ deep_interview_config: deepInterviewConfig,
144
+ profile: deepInterviewConfig.profile,
145
+ threshold: deepInterviewConfig.threshold,
146
+ max_rounds: deepInterviewConfig.maxRounds,
147
+ enable_challenge_modes: deepInterviewConfig.enableChallengeModes,
148
+ config_source: deepInterviewConfig.sourcePath,
149
+ };
150
+ }
151
+ //# sourceMappingURL=deep-interview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-interview.js","sourceRoot":"","sources":["../../src/config/deep-interview.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@
11
11
  */
12
12
  import type { UnifiedMcpRegistryServer } from "./mcp-registry.js";
13
13
  import { type CodexHookFeatureFlag } from "./codex-feature-flags.js";
14
- import { type ManagedCodexHookOptions } from "./codex-hooks.js";
14
+ import { type ManagedCodexHookTrustState, type ManagedCodexHookOptions } from "./codex-hooks.js";
15
15
  import type { HudPreset } from "../hud/types.js";
16
16
  interface MergeOptions {
17
17
  includeTui?: boolean;
@@ -71,7 +71,10 @@ export declare function stripOmxTopLevelKeys(config: string): string;
71
71
  * ignoring Codex's NUX counters or other ephemeral runtime-only writes.
72
72
  */
73
73
  export declare function syncProjectScopeTrustStateFromRuntime(projectConfig: string, runtimeConfig: string, projectHooksPath: string): string;
74
- export declare function stripManagedCodexHookTrustState(config: string): string;
74
+ type ManagedCodexHookTrustStateMap = Record<string, ManagedCodexHookTrustState>;
75
+ export declare function stripManagedCodexHookTrustState(config: string, options?: {
76
+ managedTrustState?: ManagedCodexHookTrustStateMap;
77
+ }): string;
75
78
  export declare function upsertManagedCodexHookTrustState(config: string, pkgRoot: string, codexHooksFile: string | undefined, options?: ManagedCodexHookOptions): string;
76
79
  export declare function upsertPluginModeRuntimeFeatureFlags(config: string, codexHookFeatureFlag?: CodexHookFeatureFlag, options?: {
77
80
  pluginScopedHooks?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/config/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAML,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAC1D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC9C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;AAqBD,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,eAAO,MAAM,mBAAmB,YAAyB,CAAC;AAC1D,eAAO,MAAM,kCAAkC,SAAS,CAAC;AACzD,eAAO,MAAM,4CAA4C,SAAS,CAAC;AAEnE,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,GACZ,0BAA0B,GAAG,IAAI,CAQnC;AAMD,eAAO,MAAM,0BAA0B,wmBACgkB,CAAC;AACxmB,eAAO,MAAM,iCAAiC,4oBAC6lB,CAAC;AAqB5oB,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAIpE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,SAAqB,CAAC;AAE/D,wBAAgB,mBAAmB,CACjC,MAAM,GAAE,SAAsC,GAC7C,MAAM,CAKR;AAmCD,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoBrE;AAED,wBAAsB,sCAAsC,CAC1D,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnE;AAyED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAEvE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAgB7E;AA+GD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAC7C,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAgBT;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAC7C,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,EAAE,GAAG,IAAI,CAKjB;AAoED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2CvE;AA4DD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3D;AA8OD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qCAAqC,CACnD,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CA4DR;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6BtE;AAyCD,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAgBR;AAED,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,MAAM,EACd,oBAAoB,GAAE,oBAAsD,EAC5E,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,MAAM,CA8DR;AAoOD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuD3D;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,oBAAoB,GAAE,oBAAsD,GAC3E,MAAM,CA+BR;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAS1D;AAiFD,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAWxE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuBtE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmBpE;AAgMD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAqCA;AAED,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,MAAM,GAAG;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAqCA;AAoCD,wBAAgB,yCAAyC,CAAC,MAAM,EAAE,MAAM,GAAG;IACzE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CA2CA;AA8KD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,wBAAwB,EAAE,EACnC,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAiBR;AA2ED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,MAAM,CA6FR;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/config/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAML,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAGL,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAC1D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC9C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;AAqBD,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,eAAO,MAAM,mBAAmB,YAAyB,CAAC;AAC1D,eAAO,MAAM,kCAAkC,SAAS,CAAC;AACzD,eAAO,MAAM,4CAA4C,SAAS,CAAC;AAEnE,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,GACZ,0BAA0B,GAAG,IAAI,CAQnC;AAMD,eAAO,MAAM,0BAA0B,wmBACgkB,CAAC;AACxmB,eAAO,MAAM,iCAAiC,4oBAC6lB,CAAC;AAqB5oB,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAIpE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,SAAqB,CAAC;AAE/D,wBAAgB,mBAAmB,CACjC,MAAM,GAAE,SAAsC,GAC7C,MAAM,CAKR;AAmCD,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoBrE;AAED,wBAAsB,sCAAsC,CAC1D,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnE;AAyED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAEvE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAgB7E;AA+GD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAC7C,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAgBT;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAC7C,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,EAAE,GAAG,IAAI,CAKjB;AAoED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2CvE;AA4DD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3D;AA8OD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qCAAqC,CACnD,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CA4DR;AAED,KAAK,6BAA6B,GAAG,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;AAkJhF,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,6BAA6B,CAAA;CAAO,GAClE,MAAM,CAER;AA2BD,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAwBR;AAED,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,MAAM,EACd,oBAAoB,GAAE,oBAAsD,EAC5E,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,MAAM,CA8DR;AAoOD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuD3D;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,oBAAoB,GAAE,oBAAsD,GAC3E,MAAM,CA+BR;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAS1D;AAiFD,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAWxE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuBtE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmBpE;AAgMD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAqCA;AAED,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,MAAM,GAAG;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAqCA;AAoCD,wBAAgB,yCAAyC,CAAC,MAAM,EAAE,MAAM,GAAG;IACzE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CA2CA;AA8KD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,wBAAwB,EAAE,EACnC,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAiBR;AA+ED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,MAAM,CAkGR;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -17,7 +17,7 @@ import { AGENT_DEFINITIONS } from "../agents/definitions.js";
17
17
  import { DEFAULT_FRONTIER_MODEL } from "./models.js";
18
18
  import { DEFAULT_CODEX_HOOK_FEATURE_FLAG, CODEX_HOOK_FEATURE_FLAGS, CODEX_PLUGIN_SCOPED_HOOKS_FEATURE_FLAG, formatCodexHookFeatureFlagLine, normalizeCodexHookFeatureFlag, } from "./codex-feature-flags.js";
19
19
  import { OMX_FIRST_PARTY_MCP_SERVER_NAMES, getOmxFirstPartySetupMcpServers, } from "./omx-first-party-mcp.js";
20
- import { buildManagedCodexHookTrustToml, escapeTomlBasicString, } from "./codex-hooks.js";
20
+ import { buildManagedCodexHookTrustState, escapeTomlBasicString, } from "./codex-hooks.js";
21
21
  function escapeTomlString(value) {
22
22
  return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
23
23
  }
@@ -677,59 +677,126 @@ export function syncProjectScopeTrustStateFromRuntime(projectConfig, runtimeConf
677
677
  return block;
678
678
  return `${stripped}\n\n${block}`;
679
679
  }
680
- export function stripManagedCodexHookTrustState(config) {
680
+ function decodeTomlBasicString(raw) {
681
+ try {
682
+ const parsed = TOML.parse(`value = "${raw}"`);
683
+ return typeof parsed.value === "string" ? parsed.value : undefined;
684
+ }
685
+ catch {
686
+ return undefined;
687
+ }
688
+ }
689
+ function parseHooksStateHeader(line) {
690
+ const match = line.match(/^\s*\[hooks\.state\."((?:\\.|[^"\\])*)"\]\s*(#.*)?$/);
691
+ if (!match)
692
+ return undefined;
693
+ const key = decodeTomlBasicString(match[1] ?? "");
694
+ if (key === undefined)
695
+ return undefined;
696
+ return { key, hasInlineComment: match[2] !== undefined };
697
+ }
698
+ function isTomlTableHeader(line) {
699
+ return /^\s*\[\[?[^\]]+\]?\]\s*(?:#.*)?$/.test(line);
700
+ }
701
+ function isExactlyManagedHookTrustBody(bodyLines, expectedHash) {
702
+ const nonBlank = bodyLines.filter((line) => line.trim().length > 0);
703
+ if (nonBlank.length !== 1)
704
+ return false;
705
+ const expected = expectedHash.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
706
+ return new RegExp(`^\\s*trusted_hash\\s*=\\s*"${expected}"\\s*$`).test(nonBlank[0] ?? "");
707
+ }
708
+ function stripProofManagedCodexHookTrustStateTables(config, managedTrustState) {
709
+ if (Object.keys(managedTrustState).length === 0) {
710
+ return { config, preservedConflictKeys: new Set() };
711
+ }
681
712
  const lines = config.split(/\r?\n/);
682
713
  const kept = [];
714
+ const preservedConflictKeys = new Set();
683
715
  for (let i = 0; i < lines.length;) {
684
- const trimmed = lines[i].trim();
685
- if (trimmed !== OMX_HOOK_TRUST_START_MARKER) {
716
+ const header = parseHooksStateHeader(lines[i] ?? "");
717
+ if (!header) {
686
718
  kept.push(lines[i]);
687
719
  i += 1;
688
720
  continue;
689
721
  }
690
- const nextEndIdx = lines.findIndex((line, index) => index > i && line.trim() === OMX_HOOK_TRUST_END_MARKER);
691
- const nextStartIdx = lines.findIndex((line, index) => index > i && line.trim() === OMX_HOOK_TRUST_START_MARKER);
692
- if (nextEndIdx === -1 || (nextStartIdx !== -1 && nextStartIdx < nextEndIdx)) {
693
- kept.push(lines[i]);
694
- i += 1;
722
+ let tableEnd = lines.length;
723
+ for (let next = i + 1; next < lines.length; next += 1) {
724
+ if (isTomlTableHeader(lines[next] ?? "")) {
725
+ tableEnd = next;
726
+ break;
727
+ }
728
+ }
729
+ const expectedState = managedTrustState[header.key];
730
+ const removable = expectedState !== undefined &&
731
+ !header.hasInlineComment &&
732
+ isExactlyManagedHookTrustBody(lines.slice(i + 1, tableEnd), expectedState.trusted_hash);
733
+ if (removable) {
734
+ i = tableEnd;
695
735
  continue;
696
736
  }
697
- i = nextEndIdx + 1;
698
- }
699
- return kept.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd();
700
- }
701
- function managedCodexHookTrustStateHeaders(hookTrustToml) {
702
- const headers = new Set();
703
- for (const line of hookTrustToml.split(/\r?\n/)) {
704
- const trimmed = line.trim();
705
- if (/^\[hooks\.state\./.test(trimmed)) {
706
- headers.add(trimmed);
737
+ if (expectedState !== undefined) {
738
+ preservedConflictKeys.add(header.key);
707
739
  }
740
+ kept.push(...lines.slice(i, tableEnd));
741
+ i = tableEnd;
708
742
  }
709
- return headers;
743
+ return { config: kept.join("\n"), preservedConflictKeys };
710
744
  }
711
- function stripUnfencedManagedCodexHookTrustState(config, hookTrustToml) {
712
- const managedHeaders = managedCodexHookTrustStateHeaders(hookTrustToml);
713
- if (managedHeaders.size === 0)
714
- return config;
745
+ function stripManagedCodexHookTrustStateWithResult(config, options = {}) {
715
746
  const lines = config.split(/\r?\n/);
716
747
  const kept = [];
717
748
  for (let i = 0; i < lines.length;) {
718
- if (!managedHeaders.has(lines[i].trim())) {
749
+ const trimmed = lines[i].trim();
750
+ if (trimmed !== OMX_HOOK_TRUST_START_MARKER) {
719
751
  kept.push(lines[i]);
720
752
  i += 1;
721
753
  continue;
722
754
  }
723
- i += 1;
724
- while (i < lines.length && !TOML_TABLE_HEADER_PATTERN.test(lines[i])) {
755
+ const nextEndIdx = lines.findIndex((line, index) => index > i && line.trim() === OMX_HOOK_TRUST_END_MARKER);
756
+ const nextStartIdx = lines.findIndex((line, index) => index > i && line.trim() === OMX_HOOK_TRUST_START_MARKER);
757
+ if (nextEndIdx === -1 || (nextStartIdx !== -1 && nextStartIdx < nextEndIdx)) {
758
+ kept.push(lines[i]);
725
759
  i += 1;
760
+ continue;
726
761
  }
762
+ i = nextEndIdx + 1;
727
763
  }
728
- return kept.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd();
764
+ const withoutFenced = kept.join("\n");
765
+ const proofStripped = options.managedTrustState
766
+ ? stripProofManagedCodexHookTrustStateTables(withoutFenced, options.managedTrustState)
767
+ : { config: withoutFenced, preservedConflictKeys: new Set() };
768
+ return {
769
+ config: proofStripped.config.replace(/\n{3,}/g, "\n\n").trimEnd(),
770
+ preservedConflictKeys: proofStripped.preservedConflictKeys,
771
+ };
772
+ }
773
+ export function stripManagedCodexHookTrustState(config, options = {}) {
774
+ return stripManagedCodexHookTrustStateWithResult(config, options).config;
775
+ }
776
+ function renderManagedCodexHookTrustToml(managedTrustState, excludedKeys = new Set()) {
777
+ return Object.entries(managedTrustState)
778
+ .filter(([key]) => !excludedKeys.has(key))
779
+ .sort(([left], [right]) => left.localeCompare(right))
780
+ .flatMap(([key, hookState]) => [
781
+ `[hooks.state."${escapeTomlBasicString(key)}"]`,
782
+ `trusted_hash = "${escapeTomlBasicString(hookState.trusted_hash)}"`,
783
+ "",
784
+ ])
785
+ .join("\n")
786
+ .trimEnd();
787
+ }
788
+ function buildManagedCodexHookTrustStateForConfig(codexHooksFile, pkgRoot, options = {}) {
789
+ if (!codexHooksFile)
790
+ return {};
791
+ return buildManagedCodexHookTrustState(codexHooksFile, pkgRoot, options);
729
792
  }
730
793
  export function upsertManagedCodexHookTrustState(config, pkgRoot, codexHooksFile, options = {}) {
731
- const hookTrustToml = buildManagedCodexHookTrustToml(codexHooksFile, pkgRoot, options);
732
- const stripped = stripUnfencedManagedCodexHookTrustState(stripManagedCodexHookTrustState(config), hookTrustToml);
794
+ const managedTrustState = buildManagedCodexHookTrustStateForConfig(codexHooksFile, pkgRoot, options);
795
+ const strippedResult = stripManagedCodexHookTrustStateWithResult(config, {
796
+ managedTrustState,
797
+ });
798
+ const stripped = strippedResult.config;
799
+ const hookTrustToml = renderManagedCodexHookTrustToml(managedTrustState, strippedResult.preservedConflictKeys);
733
800
  if (!hookTrustToml)
734
801
  return `${stripped}\n`;
735
802
  return [
@@ -1560,7 +1627,7 @@ export function mergeSharedMcpRegistryBlock(config, servers, sourcePath) {
1560
1627
  * OMX table-section block (MCP servers, TUI).
1561
1628
  * Contains ONLY [table] sections — no bare keys.
1562
1629
  */
1563
- function getOmxTablesBlock(pkgRoot, includeTui = true, statusLinePreset = DEFAULT_STATUS_LINE_PRESET, codexHooksFile, hookOptions = {}, includeFirstPartyMcp = false) {
1630
+ function getOmxTablesBlock(pkgRoot, includeTui = true, statusLinePreset = DEFAULT_STATUS_LINE_PRESET, codexHooksFile, hookOptions = {}, includeFirstPartyMcp = false, excludedHookTrustStateKeys = new Set()) {
1564
1631
  const lines = [
1565
1632
  "",
1566
1633
  "# ============================================================",
@@ -1583,7 +1650,7 @@ function getOmxTablesBlock(pkgRoot, includeTui = true, statusLinePreset = DEFAUL
1583
1650
  }
1584
1651
  }
1585
1652
  }
1586
- const hookTrustToml = buildManagedCodexHookTrustToml(codexHooksFile, pkgRoot, hookOptions);
1653
+ const hookTrustToml = renderManagedCodexHookTrustToml(buildManagedCodexHookTrustStateForConfig(codexHooksFile, pkgRoot, hookOptions), excludedHookTrustStateKeys);
1587
1654
  if (hookTrustToml) {
1588
1655
  lines.push("");
1589
1656
  lines.push("# OMX-owned Codex hook trust state");
@@ -1649,11 +1716,14 @@ export function buildMergedConfig(existingConfig, pkgRoot, options = {}) {
1649
1716
  existing = `${`notify = ${formatTomlStringArray(userNotifyToPreserve)}`}\n${existing.trimStart()}`;
1650
1717
  }
1651
1718
  existing = stripOrphanedManagedNotify(existing, pkgRoot);
1652
- existing = stripManagedCodexHookTrustState(existing);
1653
- existing = stripUnfencedManagedCodexHookTrustState(existing, buildManagedCodexHookTrustToml(options.codexHooksFile, pkgRoot, {
1719
+ const managedTrustState = buildManagedCodexHookTrustStateForConfig(options.codexHooksFile, pkgRoot, {
1654
1720
  codexHomeDir: options.codexHomeDir,
1655
1721
  platform: options.hookCommandPlatform,
1656
- }));
1722
+ });
1723
+ const hookTrustStrip = stripManagedCodexHookTrustStateWithResult(existing, {
1724
+ managedTrustState,
1725
+ });
1726
+ existing = hookTrustStrip.config;
1657
1727
  if (options.modelOverride) {
1658
1728
  existing = stripRootLevelKeys(existing, ["model"]);
1659
1729
  }
@@ -1676,7 +1746,7 @@ export function buildMergedConfig(existingConfig, pkgRoot, options = {}) {
1676
1746
  const tablesBlock = getOmxTablesBlock(pkgRoot, includeTui && !tuiUpsert.hadExistingTui, statusLinePreset, options.codexHooksFile, {
1677
1747
  codexHomeDir: options.codexHomeDir,
1678
1748
  platform: options.hookCommandPlatform,
1679
- }, options.includeFirstPartyMcp === true);
1749
+ }, options.includeFirstPartyMcp === true, hookTrustStrip.preservedConflictKeys);
1680
1750
  const sharedRegistryBlock = getSharedMcpRegistryBlock(options.sharedMcpServers ?? [], options.sharedMcpRegistrySource, existing);
1681
1751
  let body = existing.trimEnd();
1682
1752
  if (sharedRegistryBlock) {