@triflux/remote 10.43.0 → 10.45.0

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 (48) hide show
  1. package/cto/hygiene.mjs +1 -1
  2. package/hub/lib/cto-env.mjs +1 -0
  3. package/hub/pipe.mjs +10 -9
  4. package/hub/schema.sql +62 -2
  5. package/hub/server.mjs +276 -132
  6. package/hub/store.mjs +699 -41
  7. package/hub/team/backend.mjs +4 -2
  8. package/hub/team/claude-daemon-control.mjs +2 -0
  9. package/hub/team/cli/commands/start/start-headless.mjs +2 -0
  10. package/hub/team/cli/commands/start/start-mux.mjs +24 -3
  11. package/hub/team/cli/services/runtime-mode.mjs +23 -9
  12. package/hub/team/conductor.mjs +101 -24
  13. package/hub/team/cto-auto-collect.mjs +2 -6
  14. package/hub/team/cto-pull.mjs +4 -0
  15. package/hub/team/dashboard-open.mjs +1 -0
  16. package/hub/team/execution-mode.mjs +50 -9
  17. package/hub/team/headless.mjs +539 -92
  18. package/hub/team/interactive-tui-transport.mjs +15 -1
  19. package/hub/team/intervention.mjs +1 -1
  20. package/hub/team/launcher-template.mjs +17 -1
  21. package/hub/team/notify.mjs +31 -11
  22. package/hub/team/orchestrator.mjs +36 -9
  23. package/hub/team/pane.mjs +176 -14
  24. package/hub/team/psmux.mjs +79 -70
  25. package/hub/team/retry-state-machine.mjs +41 -13
  26. package/hub/team/session.mjs +57 -0
  27. package/hub/team/swarm-hypervisor.mjs +4 -2
  28. package/hub/team/swarm-preflight.mjs +47 -0
  29. package/hub/team/synapse-http.mjs +149 -4
  30. package/hub/team/terminal-opener.mjs +68 -13
  31. package/hub/team/tui-viewer.mjs +65 -14
  32. package/hub/team/worktree-lifecycle.mjs +56 -59
  33. package/hub/tools.mjs +22 -1
  34. package/hub/workers/codex-mcp.mjs +26 -5
  35. package/hub/workers/delegator-mcp.mjs +3 -49
  36. package/package.json +1 -1
  37. package/scripts/lib/agent-route-policy.mjs +367 -0
  38. package/scripts/lib/cli-agy.mjs +24 -4
  39. package/scripts/lib/cli-codex.mjs +22 -160
  40. package/scripts/lib/codex-profile-config.mjs +48 -4
  41. package/scripts/lib/codex-recovery.sh +19 -0
  42. package/scripts/lib/gemini-profiles.mjs +113 -29
  43. package/scripts/lib/keyword-rules.mjs +24 -0
  44. package/scripts/lib/logger.mjs +60 -43
  45. package/scripts/lib/machine-profile.mjs +293 -0
  46. package/scripts/lib/mcp-health.mjs +44 -18
  47. package/cto/steward.mjs +0 -362
  48. package/hub/log-retention.mjs +0 -726
@@ -0,0 +1,367 @@
1
+ // Canonical Codex role policy. Concrete model IDs stay in profile config files.
2
+
3
+ import {
4
+ normalizeCodexProfileName,
5
+ resolveCodexProfileConfigValues,
6
+ } from "./codex-profile-config.mjs";
7
+
8
+ const policy = {
9
+ executor: {
10
+ profile: "gpt56_terra_high",
11
+ timeoutSec: 1080,
12
+ runMode: "fg",
13
+ opusOversight: false,
14
+ mcpHint: "implement",
15
+ subcommand: "exec",
16
+ },
17
+ codex: {
18
+ profile: "gpt56_terra_high",
19
+ timeoutSec: 1080,
20
+ runMode: "fg",
21
+ opusOversight: false,
22
+ mcpHint: "implement",
23
+ subcommand: "exec",
24
+ },
25
+ "build-fixer": {
26
+ profile: "gpt56_luna_low",
27
+ timeoutSec: 540,
28
+ runMode: "fg",
29
+ opusOversight: false,
30
+ mcpHint: "implement",
31
+ subcommand: "exec",
32
+ },
33
+ cleanup: {
34
+ profile: "gpt56_terra_med",
35
+ timeoutSec: 540,
36
+ runMode: "fg",
37
+ opusOversight: false,
38
+ mcpHint: "implement",
39
+ subcommand: "exec",
40
+ },
41
+ deslop: {
42
+ profile: "gpt56_terra_med",
43
+ timeoutSec: 540,
44
+ runMode: "fg",
45
+ opusOversight: false,
46
+ mcpHint: "implement",
47
+ subcommand: "exec",
48
+ },
49
+ debugger: {
50
+ profile: "gpt6_astra_xhigh",
51
+ timeoutSec: 900,
52
+ runMode: "bg",
53
+ opusOversight: false,
54
+ mcpHint: "implement",
55
+ subcommand: "exec",
56
+ },
57
+ "deep-executor": {
58
+ profile: "gpt6_astra_xhigh",
59
+ timeoutSec: 3600,
60
+ runMode: "bg",
61
+ opusOversight: true,
62
+ mcpHint: "implement",
63
+ subcommand: "exec",
64
+ },
65
+ architect: {
66
+ profile: "gpt6_astra_xhigh",
67
+ timeoutSec: 3600,
68
+ runMode: "bg",
69
+ opusOversight: true,
70
+ mcpHint: "analyze",
71
+ subcommand: "exec",
72
+ },
73
+ critic: {
74
+ profile: "gpt6_astra_xhigh",
75
+ timeoutSec: 3600,
76
+ runMode: "bg",
77
+ opusOversight: true,
78
+ mcpHint: "analyze",
79
+ subcommand: "exec",
80
+ },
81
+ planner: {
82
+ profile: "gpt6_astra_xhigh",
83
+ timeoutSec: 3600,
84
+ runMode: "fg",
85
+ opusOversight: true,
86
+ mcpHint: "analyze",
87
+ subcommand: "exec",
88
+ },
89
+ analyst: {
90
+ profile: "gpt6_astra_xhigh",
91
+ timeoutSec: 3600,
92
+ runMode: "fg",
93
+ opusOversight: true,
94
+ mcpHint: "analyze",
95
+ subcommand: "exec",
96
+ },
97
+ "code-reviewer": {
98
+ profile: "gpt56_terra_high",
99
+ timeoutSec: 1800,
100
+ runMode: "bg",
101
+ opusOversight: false,
102
+ mcpHint: "review",
103
+ subcommand: "review",
104
+ },
105
+ "quality-reviewer": {
106
+ profile: "gpt56_terra_high",
107
+ timeoutSec: 1800,
108
+ runMode: "bg",
109
+ opusOversight: false,
110
+ mcpHint: "review",
111
+ subcommand: "review",
112
+ },
113
+ "security-reviewer": {
114
+ profile: "gpt6_astra_xhigh",
115
+ timeoutSec: 1800,
116
+ runMode: "bg",
117
+ opusOversight: true,
118
+ mcpHint: "review",
119
+ subcommand: "review",
120
+ },
121
+ scientist: {
122
+ profile: "gpt56_terra_high",
123
+ timeoutSec: 1440,
124
+ runMode: "bg",
125
+ opusOversight: false,
126
+ mcpHint: "analyze",
127
+ subcommand: "exec",
128
+ },
129
+ "document-specialist": {
130
+ profile: "gpt56_terra_high",
131
+ timeoutSec: 1440,
132
+ runMode: "bg",
133
+ opusOversight: false,
134
+ mcpHint: "analyze",
135
+ subcommand: "exec",
136
+ },
137
+ "scientist-deep": {
138
+ profile: "gpt6_astra_xhigh",
139
+ timeoutSec: 3600,
140
+ runMode: "bg",
141
+ opusOversight: false,
142
+ mcpHint: "analyze",
143
+ subcommand: "exec",
144
+ },
145
+ verifier: {
146
+ profile: "gpt56_terra_high",
147
+ timeoutSec: 1200,
148
+ runMode: "fg",
149
+ opusOversight: false,
150
+ mcpHint: "review",
151
+ subcommand: "review",
152
+ },
153
+ "test-engineer": {
154
+ profile: "gpt56_terra_high",
155
+ timeoutSec: 1200,
156
+ runMode: "bg",
157
+ opusOversight: false,
158
+ mcpHint: "implement",
159
+ subcommand: "exec",
160
+ },
161
+ "qa-tester": {
162
+ profile: "gpt56_terra_high",
163
+ timeoutSec: 1200,
164
+ runMode: "bg",
165
+ opusOversight: false,
166
+ mcpHint: "review",
167
+ subcommand: "review",
168
+ },
169
+ spark: {
170
+ profile: "gpt56_luna_low",
171
+ timeoutSec: 180,
172
+ runMode: "fg",
173
+ opusOversight: false,
174
+ mcpHint: "implement",
175
+ subcommand: "exec",
176
+ },
177
+ // These entries are only for explicit direct-Codex overrides. agent-map.json
178
+ // remains the provider-selection authority for their normal execution.
179
+ designer: {
180
+ profile: "gpt6_astra_xhigh",
181
+ timeoutSec: 900,
182
+ runMode: "bg",
183
+ opusOversight: false,
184
+ mcpHint: "implement",
185
+ subcommand: "exec",
186
+ },
187
+ writer: {
188
+ profile: "gpt56_luna_low",
189
+ timeoutSec: 900,
190
+ runMode: "bg",
191
+ opusOversight: false,
192
+ mcpHint: "implement",
193
+ subcommand: "exec",
194
+ },
195
+ };
196
+
197
+ function freezePolicy(entry) {
198
+ return Object.freeze({ ...entry });
199
+ }
200
+
201
+ export const CODEX_AGENT_POLICY = Object.freeze(
202
+ Object.fromEntries(
203
+ Object.entries(policy).map(([agent, entry]) => [
204
+ agent,
205
+ freezePolicy(entry),
206
+ ]),
207
+ ),
208
+ );
209
+ export const DEFAULT_CODEX_AGENT = "executor";
210
+
211
+ export const CANONICAL_CODEX_PROFILE_OVERRIDES = Object.freeze(
212
+ new Set([
213
+ "gpt56_luna_low",
214
+ "gpt56_terra_med",
215
+ "gpt56_terra_high",
216
+ "gpt6_astra_xhigh",
217
+ "gpt6_astra_max",
218
+ "gpt6_astra_ultra",
219
+ ]),
220
+ );
221
+ export const ULTRA_ELIGIBLE_CODEX_AGENTS = Object.freeze(
222
+ new Set(["deep-executor", "scientist-deep"]),
223
+ );
224
+
225
+ const NESTED_GLOBAL_PROFILE_OVERRIDES = new Set([
226
+ "max",
227
+ "ultra",
228
+ "gpt6_astra_max",
229
+ "gpt6_astra_ultra",
230
+ ]);
231
+
232
+ export function resolveCodexAgentPolicy(agent) {
233
+ return freezePolicy(
234
+ CODEX_AGENT_POLICY[agent] ?? CODEX_AGENT_POLICY[DEFAULT_CODEX_AGENT],
235
+ );
236
+ }
237
+
238
+ /**
239
+ * Resolves a requested Codex profile against the canonical role policy.
240
+ *
241
+ * `retryProfile` intentionally wins over `profileOverride`: retry snapshots
242
+ * represent an already-selected escalation step and must not be replaced by a
243
+ * later process-level `TFX_CODEX_PROFILE`. Ultra is reserved for an eligible
244
+ * top-level role; every nested/sandboxed or ineligible request is max.
245
+ */
246
+ export function resolveCodexAgentProfile(
247
+ agent,
248
+ {
249
+ profileOverride = "auto",
250
+ retryProfile = null,
251
+ nested = false,
252
+ allowCustom = false,
253
+ } = {},
254
+ ) {
255
+ const defaultProfile = resolveCodexAgentPolicy(agent).profile;
256
+ const retryRequested = String(retryProfile ?? "").trim();
257
+ const requested = normalizeCodexProfileName(
258
+ retryRequested || String(profileOverride || "auto").trim(),
259
+ );
260
+ if (!requested || requested === "auto") return defaultProfile;
261
+
262
+ const canonical =
263
+ requested === "max"
264
+ ? "gpt6_astra_max"
265
+ : requested === "ultra"
266
+ ? "gpt6_astra_ultra"
267
+ : requested;
268
+ if (!CANONICAL_CODEX_PROFILE_OVERRIDES.has(canonical)) {
269
+ if (allowCustom) return requested;
270
+ throw new Error(
271
+ `[agent-route-policy] unsupported profile override: ${requested}`,
272
+ );
273
+ }
274
+ if (canonical !== "gpt6_astra_ultra") return canonical;
275
+ return nested || !ULTRA_ELIGIBLE_CODEX_AGENTS.has(agent)
276
+ ? "gpt6_astra_max"
277
+ : canonical;
278
+ }
279
+
280
+ /**
281
+ * Nested headless, team, worker, and delegator launches always select an
282
+ * explicit role profile rather than inheriting the global Codex config. A
283
+ * custom profile that resolves to ultra is also downgraded to max.
284
+ */
285
+ export function resolveNestedCodexAgentProfile(
286
+ agent,
287
+ {
288
+ profileOverride = "auto",
289
+ globalProfile = "auto",
290
+ retryProfile = null,
291
+ codexHome,
292
+ } = {},
293
+ ) {
294
+ const explicitProfile = String(profileOverride || "auto").trim();
295
+ const globalOverride = normalizeCodexProfileName(
296
+ String(globalProfile || "auto").trim(),
297
+ );
298
+ // Headless lanes must select their role policy explicitly. Only the max and
299
+ // ultra exception lanes may cross the process environment boundary.
300
+ const effectiveOverride =
301
+ explicitProfile !== "auto"
302
+ ? explicitProfile
303
+ : NESTED_GLOBAL_PROFILE_OVERRIDES.has(globalOverride)
304
+ ? globalOverride
305
+ : "auto";
306
+ const fallback = resolveCodexAgentProfile(agent);
307
+ const candidate = resolveCodexAgentProfile(agent, {
308
+ profileOverride: effectiveOverride,
309
+ retryProfile,
310
+ nested: true,
311
+ allowCustom: true,
312
+ });
313
+ const { effort } = resolveCodexProfileConfigValues(candidate, { codexHome });
314
+ if (!effort) return fallback;
315
+ return effort.toLowerCase() === "ultra" ? "gpt6_astra_max" : candidate;
316
+ }
317
+
318
+ export function describeCodexAgentPolicy() {
319
+ return {
320
+ defaultAgent: DEFAULT_CODEX_AGENT,
321
+ agents: Object.keys(CODEX_AGENT_POLICY),
322
+ };
323
+ }
324
+
325
+ function parseCliArgs(argv) {
326
+ const args = [...argv];
327
+ let format = "json";
328
+ let agent = DEFAULT_CODEX_AGENT;
329
+ while (args.length > 0) {
330
+ const flag = args.shift();
331
+ if (flag === "--format") format = args.shift() || "";
332
+ else if (flag === "--agent") agent = args.shift() || "";
333
+ else throw new Error(`unknown argument: ${flag}`);
334
+ }
335
+ if (!new Set(["json", "tsv"]).has(format)) {
336
+ throw new Error(`unsupported format: ${format}`);
337
+ }
338
+ return { format, agent };
339
+ }
340
+
341
+ function runCli() {
342
+ const { format, agent } = parseCliArgs(process.argv.slice(2));
343
+ const resolved = resolveCodexAgentPolicy(agent);
344
+ if (format === "tsv") {
345
+ process.stdout.write(
346
+ [
347
+ resolved.profile,
348
+ resolved.timeoutSec,
349
+ resolved.runMode,
350
+ resolved.opusOversight,
351
+ resolved.mcpHint,
352
+ resolved.subcommand,
353
+ ].join("\t"),
354
+ );
355
+ return;
356
+ }
357
+ process.stdout.write(`${JSON.stringify(resolved)}\n`);
358
+ }
359
+
360
+ if (import.meta.url === new URL(process.argv[1], "file:").href) {
361
+ try {
362
+ runCli();
363
+ } catch (error) {
364
+ process.stderr.write(`[agent-route-policy] ${error.message}\n`);
365
+ process.exitCode = 1;
366
+ }
367
+ }
@@ -1,12 +1,18 @@
1
1
  // cli-agy.mjs — Antigravity (agy) CLI adapter (Phase 0 PoC).
2
2
  //
3
- // 책임: agy --print 는 stdin-only 이므로 plan() 에서 stdinMode="pipe" 시그널을 반환한다.
4
- // positional prompt 패턴은 환영 메시지 폴백을 유발하므로 사용 금지.
3
+ // 책임: agy 1.1.27 부터 --print 는 값(프롬프트)이 필수이고 stdin 프롬프트는 거부되므로
4
+ // plan() 은 프롬프트를 args 의 --print 값으로 넣고 stdinMode="argv" 를 돌려준다.
5
+ // --print 뒤에 다른 플래그가 오면 그 플래그를 프롬프트로 삼키므로 항상 마지막에 둔다.
5
6
  //
6
7
  // 출처: scripts/tfx-route.sh route_agent() L1052-L1059, run_codex_exec() L2036-L2046.
7
8
  // .claude/rules/tfx-update-logic.md Antigravity CLI 1.0.0 정밀 sanity matrix.
8
9
  // timeoutSec은 lane 예상 소요 시간(advisory)이다. hard ceiling 집행은 Bash route가 소유한다.
9
10
 
11
+ import {
12
+ resolveGeminiModel,
13
+ resolveGeminiProfileForPurpose,
14
+ } from "./gemini-profiles.mjs";
15
+
10
16
  export const id = "agy";
11
17
  export const cliType = "antigravity";
12
18
  export const command = "agy";
@@ -38,6 +44,7 @@ export function plan({
38
44
  mcpProfile = "auto",
39
45
  timeoutSec,
40
46
  contextFile,
47
+ geminiProfilesPath,
41
48
  } = {}) {
42
49
  if (!agent) {
43
50
  throw new Error("[cli-agy] agent required");
@@ -49,8 +56,21 @@ export function plan({
49
56
  command,
50
57
  profile: cfg.profile,
51
58
  effort: cfg.profile,
52
- args: ["--print", "--dangerously-skip-permissions"],
53
- stdinMode: "pipe",
59
+ // effort 는 역할별 SSOT(gemini-profiles.mjs): designer → High, writer → Medium ...
60
+ geminiProfile: resolveGeminiProfileForPurpose(agent),
61
+ model: resolveGeminiModel(resolveGeminiProfileForPurpose(agent), {
62
+ profilesPath: geminiProfilesPath,
63
+ }),
64
+ args: [
65
+ "--dangerously-skip-permissions",
66
+ "--model",
67
+ resolveGeminiModel(resolveGeminiProfileForPurpose(agent), {
68
+ profilesPath: geminiProfilesPath,
69
+ }),
70
+ "--print",
71
+ prompt,
72
+ ],
73
+ stdinMode: "argv",
54
74
  timeoutMs: effectiveTimeoutSec * 1000,
55
75
  runMode: cfg.runMode,
56
76
  opusOversight: cfg.opusOversight,
@@ -4,169 +4,23 @@
4
4
  // 산출한다. 실제 spawn 은 Phase 1 에서 이관된다 (현재는 tfx-route.sh 가 수행).
5
5
  //
6
6
  // 진입점: tfx-route.mjs → selectAdapter("codex") → plan({...}).
7
- // 출처: scripts/tfx-route.sh route_agent() L1001-L1079 case 문 미러.
7
+ // 출처: agent-route-policy.mjs 의 canonical Codex role policy.
8
8
  // timeoutSec은 lane 예상 소요 시간(advisory)이다. hard ceiling 집행은 Bash route가 소유한다.
9
9
 
10
10
  export const id = "codex";
11
11
  export const cliType = "codex";
12
12
  export const command = "codex";
13
13
 
14
- const AGENT_PROFILES = {
15
- executor: {
16
- profile: "gpt56_terra_high",
17
- timeoutSec: 1080,
18
- runMode: "fg",
19
- opusOversight: false,
20
- mcpHint: "implement",
21
- },
22
- codex: {
23
- profile: "gpt56_terra_high",
24
- timeoutSec: 1080,
25
- runMode: "fg",
26
- opusOversight: false,
27
- mcpHint: "implement",
28
- },
29
- "build-fixer": {
30
- profile: "gpt56_luna_low",
31
- timeoutSec: 540,
32
- runMode: "fg",
33
- opusOversight: false,
34
- mcpHint: "implement",
35
- },
36
- cleanup: {
37
- profile: "gpt56_terra_med",
38
- timeoutSec: 540,
39
- runMode: "fg",
40
- opusOversight: false,
41
- mcpHint: "implement",
42
- },
43
- deslop: {
44
- profile: "gpt56_terra_med",
45
- timeoutSec: 540,
46
- runMode: "fg",
47
- opusOversight: false,
48
- mcpHint: "implement",
49
- },
50
- debugger: {
51
- profile: "gpt56_sol_xhigh",
52
- timeoutSec: 900,
53
- runMode: "bg",
54
- opusOversight: false,
55
- mcpHint: "implement",
56
- },
57
- "deep-executor": {
58
- profile: "gpt56_sol_xhigh",
59
- timeoutSec: 3600,
60
- runMode: "bg",
61
- opusOversight: true,
62
- mcpHint: "implement",
63
- },
64
- architect: {
65
- profile: "gpt56_sol_xhigh",
66
- timeoutSec: 3600,
67
- runMode: "bg",
68
- opusOversight: true,
69
- mcpHint: "analyze",
70
- },
71
- critic: {
72
- profile: "gpt56_sol_xhigh",
73
- timeoutSec: 3600,
74
- runMode: "bg",
75
- opusOversight: true,
76
- mcpHint: "analyze",
77
- },
78
- planner: {
79
- profile: "gpt56_sol_xhigh",
80
- timeoutSec: 3600,
81
- runMode: "fg",
82
- opusOversight: true,
83
- mcpHint: "analyze",
84
- },
85
- analyst: {
86
- profile: "gpt56_sol_xhigh",
87
- timeoutSec: 3600,
88
- runMode: "fg",
89
- opusOversight: true,
90
- mcpHint: "analyze",
91
- },
92
- "code-reviewer": {
93
- profile: "gpt56_terra_high",
94
- timeoutSec: 1800,
95
- runMode: "bg",
96
- opusOversight: false,
97
- mcpHint: "review",
98
- subcommand: "review",
99
- },
100
- "quality-reviewer": {
101
- profile: "gpt56_terra_high",
102
- timeoutSec: 1800,
103
- runMode: "bg",
104
- opusOversight: false,
105
- mcpHint: "review",
106
- subcommand: "review",
107
- },
108
- "security-reviewer": {
109
- profile: "gpt56_sol_xhigh",
110
- timeoutSec: 1800,
111
- runMode: "bg",
112
- opusOversight: true,
113
- mcpHint: "review",
114
- subcommand: "review",
115
- },
116
- scientist: {
117
- profile: "gpt56_terra_high",
118
- timeoutSec: 1440,
119
- runMode: "bg",
120
- opusOversight: false,
121
- mcpHint: "analyze",
122
- },
123
- "document-specialist": {
124
- profile: "gpt56_terra_high",
125
- timeoutSec: 1440,
126
- runMode: "bg",
127
- opusOversight: false,
128
- mcpHint: "analyze",
129
- },
130
- "scientist-deep": {
131
- profile: "gpt56_sol_xhigh",
132
- timeoutSec: 3600,
133
- runMode: "bg",
134
- opusOversight: false,
135
- mcpHint: "analyze",
136
- },
137
- verifier: {
138
- profile: "gpt56_terra_high",
139
- timeoutSec: 1200,
140
- runMode: "fg",
141
- opusOversight: false,
142
- mcpHint: "review",
143
- subcommand: "review",
144
- },
145
- "test-engineer": {
146
- profile: "gpt56_terra_high",
147
- timeoutSec: 1200,
148
- runMode: "bg",
149
- opusOversight: false,
150
- mcpHint: "implement",
151
- },
152
- "qa-tester": {
153
- profile: "gpt56_terra_high",
154
- timeoutSec: 1200,
155
- runMode: "bg",
156
- opusOversight: false,
157
- mcpHint: "review",
158
- subcommand: "review",
159
- },
160
- spark: {
161
- profile: "gpt56_luna_low",
162
- timeoutSec: 180,
163
- runMode: "fg",
164
- opusOversight: false,
165
- mcpHint: "implement",
166
- },
167
- };
14
+ import {
15
+ CODEX_AGENT_POLICY,
16
+ resolveCodexAgentPolicy,
17
+ resolveCodexAgentProfile,
18
+ resolveNestedCodexAgentProfile,
19
+ } from "./agent-route-policy.mjs";
168
20
 
169
- const DEFAULT_PROFILE = AGENT_PROFILES.executor;
21
+ // Compatibility re-exports for launchers which historically imported these
22
+ // helpers from this adapter. The policy module owns the semantics.
23
+ export { resolveCodexAgentProfile, resolveNestedCodexAgentProfile };
170
24
 
171
25
  export function plan({
172
26
  agent,
@@ -174,18 +28,26 @@ export function plan({
174
28
  mcpProfile = "auto",
175
29
  timeoutSec,
176
30
  contextFile,
31
+ profileOverride = "auto",
32
+ retryProfile = null,
33
+ nested = false,
177
34
  } = {}) {
178
35
  if (!agent) {
179
36
  throw new Error("[cli-codex] agent required");
180
37
  }
181
- const cfg = AGENT_PROFILES[agent] ?? DEFAULT_PROFILE;
38
+ const cfg = resolveCodexAgentPolicy(agent);
39
+ const profile = resolveCodexAgentProfile(agent, {
40
+ profileOverride,
41
+ retryProfile,
42
+ nested,
43
+ });
182
44
  const effectiveTimeoutSec =
183
45
  Number.isFinite(timeoutSec) && timeoutSec > 0 ? timeoutSec : cfg.timeoutSec;
184
46
  return {
185
47
  command,
186
48
  subcommand: cfg.subcommand ?? "exec",
187
- profile: cfg.profile,
188
- effort: cfg.profile,
49
+ profile,
50
+ effort: profile,
189
51
  timeoutMs: effectiveTimeoutSec * 1000,
190
52
  runMode: cfg.runMode,
191
53
  opusOversight: cfg.opusOversight,
@@ -196,5 +58,5 @@ export function plan({
196
58
  }
197
59
 
198
60
  export function describe() {
199
- return { id, cliType, command, agents: Object.keys(AGENT_PROFILES) };
61
+ return { id, cliType, command, agents: Object.keys(CODEX_AGENT_POLICY) };
200
62
  }