subharness 0.0.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/LICENSE +21 -0
- package/README.md +158 -0
- package/dist/adapters/claude-auth.d.ts +7 -0
- package/dist/adapters/claude-auth.js +87 -0
- package/dist/adapters/claude-auth.js.map +1 -0
- package/dist/adapters/claude-config.d.ts +6 -0
- package/dist/adapters/claude-config.js +37 -0
- package/dist/adapters/claude-config.js.map +1 -0
- package/dist/adapters/claude-input.d.ts +9 -0
- package/dist/adapters/claude-input.js +32 -0
- package/dist/adapters/claude-input.js.map +1 -0
- package/dist/adapters/claude-permissions.d.ts +3 -0
- package/dist/adapters/claude-permissions.js +24 -0
- package/dist/adapters/claude-permissions.js.map +1 -0
- package/dist/adapters/claude-settings.d.ts +14 -0
- package/dist/adapters/claude-settings.js +43 -0
- package/dist/adapters/claude-settings.js.map +1 -0
- package/dist/adapters/claude-tools.d.ts +9 -0
- package/dist/adapters/claude-tools.js +47 -0
- package/dist/adapters/claude-tools.js.map +1 -0
- package/dist/adapters/claude.d.ts +22 -0
- package/dist/adapters/claude.js +295 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex-config.d.ts +25 -0
- package/dist/adapters/codex-config.js +66 -0
- package/dist/adapters/codex-config.js.map +1 -0
- package/dist/adapters/codex.d.ts +2 -0
- package/dist/adapters/codex.js +238 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/fx-auth.d.ts +4 -0
- package/dist/adapters/fx-auth.js +116 -0
- package/dist/adapters/fx-auth.js.map +1 -0
- package/dist/adapters/fx-rpc.d.ts +29 -0
- package/dist/adapters/fx-rpc.js +124 -0
- package/dist/adapters/fx-rpc.js.map +1 -0
- package/dist/adapters/fx-tools.d.ts +19 -0
- package/dist/adapters/fx-tools.js +119 -0
- package/dist/adapters/fx-tools.js.map +1 -0
- package/dist/adapters/fx.d.ts +3 -0
- package/dist/adapters/fx.js +302 -0
- package/dist/adapters/fx.js.map +1 -0
- package/dist/adapters/mcp-tool-content.d.ts +12 -0
- package/dist/adapters/mcp-tool-content.js +8 -0
- package/dist/adapters/mcp-tool-content.js.map +1 -0
- package/dist/adapters/rpc.d.ts +28 -0
- package/dist/adapters/rpc.js +101 -0
- package/dist/adapters/rpc.js.map +1 -0
- package/dist/adapters/types.d.ts +28 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli/args.d.ts +18 -0
- package/dist/cli/args.js +118 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/catalog-worker.d.ts +1 -0
- package/dist/cli/catalog-worker.js +22 -0
- package/dist/cli/catalog-worker.js.map +1 -0
- package/dist/cli/catalog.d.ts +26 -0
- package/dist/cli/catalog.js +41 -0
- package/dist/cli/catalog.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.js +68 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/input.d.ts +5 -0
- package/dist/cli/input.js +69 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +105 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.d.ts +7 -0
- package/dist/cli/output.js +43 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/config/access.d.ts +21 -0
- package/dist/config/access.js +97 -0
- package/dist/config/access.js.map +1 -0
- package/dist/config/loader.d.ts +13 -0
- package/dist/config/loader.js +80 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/oidc.d.ts +1 -0
- package/dist/config/oidc.js +53 -0
- package/dist/config/oidc.js.map +1 -0
- package/dist/config/project.d.ts +5 -0
- package/dist/config/project.js +56 -0
- package/dist/config/project.js.map +1 -0
- package/dist/config/resolve-access.d.ts +4 -0
- package/dist/config/resolve-access.js +42 -0
- package/dist/config/resolve-access.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/client.d.ts +9 -0
- package/dist/runtime/client.js +91 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/coordinator.d.ts +61 -0
- package/dist/runtime/coordinator.js +296 -0
- package/dist/runtime/coordinator.js.map +1 -0
- package/dist/runtime/daemon.d.ts +1 -0
- package/dist/runtime/daemon.js +28 -0
- package/dist/runtime/daemon.js.map +1 -0
- package/dist/runtime/definition.d.ts +6 -0
- package/dist/runtime/definition.js +19 -0
- package/dist/runtime/definition.js.map +1 -0
- package/dist/runtime/native-owner.d.ts +8 -0
- package/dist/runtime/native-owner.js +25 -0
- package/dist/runtime/native-owner.js.map +1 -0
- package/dist/runtime/observation.d.ts +1 -0
- package/dist/runtime/observation.js +15 -0
- package/dist/runtime/observation.js.map +1 -0
- package/dist/runtime/select-native.d.ts +3 -0
- package/dist/runtime/select-native.js +34 -0
- package/dist/runtime/select-native.js.map +1 -0
- package/dist/runtime/service.d.ts +5 -0
- package/dist/runtime/service.js +90 -0
- package/dist/runtime/service.js.map +1 -0
- package/dist/runtime/session-launcher.d.ts +6 -0
- package/dist/runtime/session-launcher.js +29 -0
- package/dist/runtime/session-launcher.js.map +1 -0
- package/dist/runtime/state.d.ts +14 -0
- package/dist/runtime/state.js +69 -0
- package/dist/runtime/state.js.map +1 -0
- package/dist/runtime/types.d.ts +81 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/worker-client.d.ts +3 -0
- package/dist/runtime/worker-client.js +81 -0
- package/dist/runtime/worker-client.js.map +1 -0
- package/dist/runtime/worker.d.ts +1 -0
- package/dist/runtime/worker.js +67 -0
- package/dist/runtime/worker.js.map +1 -0
- package/dist/sdk/definitions.d.ts +6 -0
- package/dist/sdk/definitions.js +72 -0
- package/dist/sdk/definitions.js.map +1 -0
- package/dist/sdk/tool-result.d.ts +23 -0
- package/dist/sdk/tool-result.js +95 -0
- package/dist/sdk/tool-result.js.map +1 -0
- package/dist/sdk/tools.d.ts +9 -0
- package/dist/sdk/tools.js +73 -0
- package/dist/sdk/tools.js.map +1 -0
- package/dist/sdk/types.d.ts +49 -0
- package/dist/sdk/types.js +2 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/sdk/validation.d.ts +5 -0
- package/dist/sdk/validation.js +20 -0
- package/dist/sdk/validation.js.map +1 -0
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +5 -0
- package/dist/shell.js.map +1 -0
- package/package.json +61 -0
- package/sdk/access-config.md +52 -0
- package/sdk/adapter-contract.md +33 -0
- package/sdk/agent.md +52 -0
- package/sdk/authentication.md +11 -0
- package/sdk/cli/index.md +67 -0
- package/sdk/cli/output.md +28 -0
- package/sdk/completion-notifications.md +29 -0
- package/sdk/config.md +41 -0
- package/sdk/distribution.md +31 -0
- package/sdk/fx.md +71 -0
- package/sdk/harnesses.md +32 -0
- package/sdk/index.md +22 -0
- package/sdk/message-delivery.md +39 -0
- package/sdk/plugins/sub-agents.md +57 -0
- package/sdk/project-team.md +57 -0
- package/sdk/sessions.md +31 -0
- package/sdk/tools.md +73 -0
- package/sdk/v1-runtime.md +63 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { delimiter, join } from "node:path";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { query, resolveSettings } from "@anthropic-ai/claude-agent-sdk";
|
|
6
|
+
import { AgentError } from "../errors.js";
|
|
7
|
+
import { privateClaudeConfig } from "./claude-config.js";
|
|
8
|
+
import { claudeTools } from "./claude-tools.js";
|
|
9
|
+
import { ClaudeInput } from "./claude-input.js";
|
|
10
|
+
import { claudeDelegationPermissions } from "./claude-permissions.js";
|
|
11
|
+
import { claudeSettings, verifyClaudeAccess, verifyClaudePolicy, verifyClaudeOptions } from "./claude-auth.js";
|
|
12
|
+
import { ClaudeSettingsUnavailable, claudeDefaultUnavailable, readClaudeAppliedSettings, verifyAppliedClaudeEffort } from "./claude-settings.js";
|
|
13
|
+
const dependencies = {
|
|
14
|
+
query,
|
|
15
|
+
async managedSettings(cwd) {
|
|
16
|
+
const settings = await resolveSettings({ cwd, settingSources: ["user", "project", "local"] });
|
|
17
|
+
return settings.sources.filter(source => source.source === "managed").map(source => source.settings);
|
|
18
|
+
},
|
|
19
|
+
async executable(env) {
|
|
20
|
+
for (const directory of (env.PATH ?? "").split(delimiter)) {
|
|
21
|
+
const file = join(directory, "claude");
|
|
22
|
+
try {
|
|
23
|
+
await access(file, constants.X_OK);
|
|
24
|
+
return file;
|
|
25
|
+
}
|
|
26
|
+
catch { /* Try the next PATH entry. */ }
|
|
27
|
+
}
|
|
28
|
+
throw new AgentError("HARNESS_UNAVAILABLE", "Install Claude Code and make claude available on PATH.");
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
function addCatalogEquivalentModels(expected, models, selected) {
|
|
32
|
+
expected.add(selected);
|
|
33
|
+
for (const model of models) {
|
|
34
|
+
if (model.value !== selected && model.resolvedModel !== selected)
|
|
35
|
+
continue;
|
|
36
|
+
expected.add(model.value);
|
|
37
|
+
if (model.resolvedModel)
|
|
38
|
+
expected.add(model.resolvedModel);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export const openClaude = createClaudeOpener(dependencies);
|
|
42
|
+
/** Dependency injection is internal and replaces only the external SDK boundary in tests. */
|
|
43
|
+
export function createClaudeOpener(deps) {
|
|
44
|
+
return async (options) => {
|
|
45
|
+
const settings = claudeSettings(options);
|
|
46
|
+
const executable = await deps.executable(options.env);
|
|
47
|
+
verifyClaudePolicy(await deps.managedSettings(options.cwd), settings.settings);
|
|
48
|
+
const tools = claudeTools(options.agent);
|
|
49
|
+
const allowedTools = [...(tools.config.allowedTools ?? []), ...claudeDelegationPermissions(options)];
|
|
50
|
+
const config = await privateClaudeConfig(settings.settings);
|
|
51
|
+
const input = new ClaudeInput();
|
|
52
|
+
let inputFailure;
|
|
53
|
+
const requireInput = (toolName) => {
|
|
54
|
+
tools.stopAdmission();
|
|
55
|
+
const subject = toolName && /^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(toolName)
|
|
56
|
+
? `approval for native tool ${toolName}`
|
|
57
|
+
: "interactive input";
|
|
58
|
+
inputFailure = new AgentError("INPUT_REQUIRED", `Claude Code needs ${subject}. Configure its native permissions before retrying.`);
|
|
59
|
+
};
|
|
60
|
+
let native;
|
|
61
|
+
try {
|
|
62
|
+
native = deps.query({ prompt: input, options: {
|
|
63
|
+
pathToClaudeCodeExecutable: executable,
|
|
64
|
+
cwd: options.cwd,
|
|
65
|
+
...settings,
|
|
66
|
+
...tools.config,
|
|
67
|
+
...(allowedTools.length ? { allowedTools } : {}),
|
|
68
|
+
settings: config.path,
|
|
69
|
+
stderr: () => { },
|
|
70
|
+
...(options.harness.model ? { model: options.harness.model } : {}),
|
|
71
|
+
systemPrompt: options.agent.instructions
|
|
72
|
+
? { type: "preset", preset: "claude_code", append: options.agent.instructions }
|
|
73
|
+
: { type: "preset", preset: "claude_code" },
|
|
74
|
+
settingSources: ["user", "project", "local"],
|
|
75
|
+
canUseTool: async (toolName) => {
|
|
76
|
+
requireInput(toolName);
|
|
77
|
+
return { behavior: "deny", message: inputFailure.message, interrupt: true };
|
|
78
|
+
},
|
|
79
|
+
onElicitation: async () => {
|
|
80
|
+
requireInput();
|
|
81
|
+
try {
|
|
82
|
+
await native.interrupt();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
native.close();
|
|
86
|
+
}
|
|
87
|
+
return { action: "decline" };
|
|
88
|
+
},
|
|
89
|
+
} });
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
await config.cleanup();
|
|
93
|
+
throw new AgentError("HARNESS_UNAVAILABLE", "Claude Code could not start.");
|
|
94
|
+
}
|
|
95
|
+
const expectedModels = new Set();
|
|
96
|
+
let retainedModel;
|
|
97
|
+
try {
|
|
98
|
+
verifyClaudeAccess(await native.accountInfo(), options.access);
|
|
99
|
+
const models = await native.supportedModels();
|
|
100
|
+
if (options.harness.model) {
|
|
101
|
+
addCatalogEquivalentModels(expectedModels, models, options.harness.model);
|
|
102
|
+
verifyClaudeOptions(models, options);
|
|
103
|
+
try {
|
|
104
|
+
const applied = await readClaudeAppliedSettings(native);
|
|
105
|
+
if (!expectedModels.has(applied.model))
|
|
106
|
+
throw new AgentError("INVALID_CONFIG", "Claude Code selected a different model than requested.");
|
|
107
|
+
verifyAppliedClaudeEffort(applied.effort, options.harness.effort);
|
|
108
|
+
retainedModel = applied.model;
|
|
109
|
+
expectedModels.add(applied.model);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (!(error instanceof ClaudeSettingsUnavailable))
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
if (!native.getSettings || !native.setModel)
|
|
118
|
+
throw claudeDefaultUnavailable();
|
|
119
|
+
let selected;
|
|
120
|
+
try {
|
|
121
|
+
selected = await readClaudeAppliedSettings(native);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error instanceof ClaudeSettingsUnavailable)
|
|
125
|
+
throw claudeDefaultUnavailable();
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
verifyClaudeOptions(models, options, selected.model);
|
|
129
|
+
verifyAppliedClaudeEffort(selected.effort, options.harness.effort);
|
|
130
|
+
addCatalogEquivalentModels(expectedModels, models, selected.model);
|
|
131
|
+
try {
|
|
132
|
+
await native.setModel(selected.model);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
throw claudeDefaultUnavailable();
|
|
136
|
+
}
|
|
137
|
+
let pinned;
|
|
138
|
+
try {
|
|
139
|
+
pinned = await readClaudeAppliedSettings(native);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
if (error instanceof ClaudeSettingsUnavailable)
|
|
143
|
+
throw claudeDefaultUnavailable();
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
if (!expectedModels.has(pinned.model))
|
|
147
|
+
throw claudeDefaultUnavailable();
|
|
148
|
+
verifyAppliedClaudeEffort(pinned.effort, options.harness.effort);
|
|
149
|
+
retainedModel = pinned.model;
|
|
150
|
+
addCatalogEquivalentModels(expectedModels, models, pinned.model);
|
|
151
|
+
}
|
|
152
|
+
if (inputFailure)
|
|
153
|
+
throw inputFailure;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
input.close();
|
|
157
|
+
native.close();
|
|
158
|
+
await config.cleanup();
|
|
159
|
+
if (error instanceof AgentError)
|
|
160
|
+
throw error;
|
|
161
|
+
throw new AgentError("ACCESS_UNAVAILABLE", "Claude Code authentication could not be verified.");
|
|
162
|
+
}
|
|
163
|
+
let closed = false;
|
|
164
|
+
let preflight;
|
|
165
|
+
let sessionFailure;
|
|
166
|
+
let active;
|
|
167
|
+
const reading = (async () => {
|
|
168
|
+
try {
|
|
169
|
+
for await (const message of native) {
|
|
170
|
+
if (message.type === "system" && message.subtype === "init" && !expectedModels.has(message.model)) {
|
|
171
|
+
sessionFailure = new AgentError("INVALID_CONFIG", "Claude Code selected a different model than requested.");
|
|
172
|
+
tools.stopAdmission();
|
|
173
|
+
native.close();
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
if (message.type !== "result" || !active)
|
|
177
|
+
continue;
|
|
178
|
+
const current = active;
|
|
179
|
+
await tools.drain();
|
|
180
|
+
active = undefined;
|
|
181
|
+
current.stop();
|
|
182
|
+
if (inputFailure)
|
|
183
|
+
current.reject(inputFailure);
|
|
184
|
+
else if (current.interrupted)
|
|
185
|
+
current.reject(new AgentError("INTERRUPTED", "The native turn was interrupted."));
|
|
186
|
+
else if (message.subtype === "success" && !message.is_error) {
|
|
187
|
+
if (Buffer.byteLength(message.result, "utf8") > 1024 * 1024) {
|
|
188
|
+
current.reject(new AgentError("RESPONSE_TOO_LARGE", "The Claude Code response exceeds 1 MiB."));
|
|
189
|
+
}
|
|
190
|
+
else
|
|
191
|
+
current.resolve(message.result);
|
|
192
|
+
}
|
|
193
|
+
else
|
|
194
|
+
current.reject(new AgentError("HARNESS_ERROR", "Claude Code could not complete the turn."));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Native diagnostics may contain credentials; return a stable safe message.
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
const code = closed ? "SESSION_CLOSED" : "HARNESS_ERROR";
|
|
202
|
+
closed = true;
|
|
203
|
+
input.close();
|
|
204
|
+
await tools.drain();
|
|
205
|
+
active?.reject(sessionFailure ?? inputFailure ?? new AgentError(code, "The Claude Code process stopped before completing the turn."));
|
|
206
|
+
active?.stop();
|
|
207
|
+
active = undefined;
|
|
208
|
+
await config.cleanup();
|
|
209
|
+
}
|
|
210
|
+
})();
|
|
211
|
+
return {
|
|
212
|
+
async turn(prompt) {
|
|
213
|
+
if (closed)
|
|
214
|
+
return Promise.reject(sessionFailure ?? new AgentError("SESSION_CLOSED", "The native session has closed."));
|
|
215
|
+
if (active || preflight)
|
|
216
|
+
return Promise.reject(new AgentError("SESSION_BUSY", "A native turn is already active."));
|
|
217
|
+
let cancel, stop;
|
|
218
|
+
const currentPreflight = {
|
|
219
|
+
cancellation: new Promise((_resolve, reject) => { cancel = reject; }),
|
|
220
|
+
cancel(error) { cancel(error); },
|
|
221
|
+
stopped: new Promise(resolve => { stop = resolve; }),
|
|
222
|
+
stop() { stop(); },
|
|
223
|
+
};
|
|
224
|
+
preflight = currentPreflight;
|
|
225
|
+
try {
|
|
226
|
+
if (native.getSettings && retainedModel) {
|
|
227
|
+
let applied;
|
|
228
|
+
try {
|
|
229
|
+
applied = await Promise.race([readClaudeAppliedSettings(native), currentPreflight.cancellation]);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
if (error instanceof ClaudeSettingsUnavailable)
|
|
233
|
+
throw new AgentError("INVALID_CONFIG", "Claude Code could not verify the retained session model before submission.");
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
if (!expectedModels.has(applied.model))
|
|
237
|
+
throw new AgentError("INVALID_CONFIG", "Claude Code changed the retained session model before submission.");
|
|
238
|
+
verifyAppliedClaudeEffort(applied.effort, options.harness.effort);
|
|
239
|
+
}
|
|
240
|
+
if (closed)
|
|
241
|
+
throw sessionFailure ?? new AgentError("SESSION_CLOSED", "The native session has closed.");
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
if (preflight === currentPreflight)
|
|
245
|
+
preflight = undefined;
|
|
246
|
+
currentPreflight.stop();
|
|
247
|
+
}
|
|
248
|
+
return await new Promise((resolve, reject) => {
|
|
249
|
+
inputFailure = undefined;
|
|
250
|
+
tools.start();
|
|
251
|
+
let stop;
|
|
252
|
+
const stopped = new Promise(resolve => { stop = resolve; });
|
|
253
|
+
active = { resolve, reject, stopped, stop, interrupted: false };
|
|
254
|
+
input.push({ type: "user", message: { role: "user", content: prompt }, parent_tool_use_id: null, uuid: randomUUID() });
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
async steer() { throw new AgentError("UNSUPPORTED_DELIVERY", "Claude Code does not expose verified active steering."); },
|
|
258
|
+
async interrupt() {
|
|
259
|
+
const pending = preflight;
|
|
260
|
+
if (pending) {
|
|
261
|
+
pending.cancel(new AgentError("INTERRUPTED", "The native turn was interrupted before submission."));
|
|
262
|
+
await pending.stopped;
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const current = active;
|
|
266
|
+
if (!current)
|
|
267
|
+
return;
|
|
268
|
+
current.interrupted = true;
|
|
269
|
+
tools.stopAdmission();
|
|
270
|
+
try {
|
|
271
|
+
await native.interrupt();
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
current.interrupted = false;
|
|
275
|
+
throw new AgentError("CANCEL_FAILED", "Claude Code did not confirm interruption.");
|
|
276
|
+
}
|
|
277
|
+
await current.stopped;
|
|
278
|
+
},
|
|
279
|
+
async resume() { throw new AgentError("RECOVERY_UNSUPPORTED", "Claude Code cannot retry failed execution without replaying input."); },
|
|
280
|
+
async close() {
|
|
281
|
+
closed = true;
|
|
282
|
+
const pending = preflight;
|
|
283
|
+
if (pending) {
|
|
284
|
+
pending.cancel(new AgentError("SESSION_CLOSED", "The native session closed before submission."));
|
|
285
|
+
await pending.stopped;
|
|
286
|
+
}
|
|
287
|
+
tools.stopAdmission();
|
|
288
|
+
input.close();
|
|
289
|
+
native.close();
|
|
290
|
+
await reading;
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"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","sourcesContent":["import { access } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { query, resolveSettings, type AccountInfo, type Options, type SDKMessage, type SDKUserMessage, type Settings, type ModelInfo } from \"@anthropic-ai/claude-agent-sdk\";\nimport { AgentError } from \"../errors.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\nimport { privateClaudeConfig } from \"./claude-config.js\";\nimport { claudeTools } from \"./claude-tools.js\";\nimport { ClaudeInput } from \"./claude-input.js\";\nimport { claudeDelegationPermissions } from \"./claude-permissions.js\";\nimport { claudeSettings, verifyClaudeAccess, verifyClaudePolicy, verifyClaudeOptions } from \"./claude-auth.js\";\nimport { ClaudeSettingsUnavailable, claudeDefaultUnavailable, readClaudeAppliedSettings, verifyAppliedClaudeEffort } from \"./claude-settings.js\";\n\ninterface ClaudeQuery extends AsyncIterable<SDKMessage> {\n accountInfo(): Promise<AccountInfo>;\n supportedModels(): Promise<ModelInfo[]>;\n interrupt(): Promise<unknown>;\n close(): void;\n getSettings?(): Promise<unknown>;\n setModel?(model?: string): Promise<void>;\n}\nexport interface ClaudeDependencies {\n query(args: {prompt: AsyncIterable<SDKUserMessage>; options: Options}): ClaudeQuery;\n executable(env: NodeJS.ProcessEnv): Promise<string>;\n managedSettings(cwd: string): Promise<Settings[]>;\n}\n\nconst dependencies: ClaudeDependencies = {\n query,\n async managedSettings(cwd) {\n const settings = await resolveSettings({cwd, settingSources:[\"user\", \"project\", \"local\"]});\n return settings.sources.filter(source => source.source === \"managed\").map(source => source.settings);\n },\n async executable(env) {\n for (const directory of (env.PATH ?? \"\").split(delimiter)) {\n const file = join(directory, \"claude\");\n try { await access(file, constants.X_OK); return file; } catch { /* Try the next PATH entry. */ }\n }\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Install Claude Code and make claude available on PATH.\");\n },\n};\n\nfunction addCatalogEquivalentModels(expected: Set<string>, models: ModelInfo[], selected: string): void {\n expected.add(selected);\n for (const model of models) {\n if (model.value !== selected && model.resolvedModel !== selected) continue;\n expected.add(model.value);\n if (model.resolvedModel) expected.add(model.resolvedModel);\n }\n}\n\nexport const openClaude = createClaudeOpener(dependencies);\n\n/** Dependency injection is internal and replaces only the external SDK boundary in tests. */\nexport function createClaudeOpener(deps: ClaudeDependencies) {\n return async (options: AdapterOptions): Promise<NativeSession> => {\n const settings = claudeSettings(options);\n const executable = await deps.executable(options.env);\n verifyClaudePolicy(await deps.managedSettings(options.cwd), settings.settings as Settings);\n const tools = claudeTools(options.agent);\n const allowedTools = [...(tools.config.allowedTools ?? []), ...claudeDelegationPermissions(options)];\n const config = await privateClaudeConfig(settings.settings as Settings);\n const input = new ClaudeInput<SDKUserMessage>();\n let inputFailure: AgentError | undefined;\n const requireInput = (toolName?: string) => {\n tools.stopAdmission();\n const subject = toolName && /^[A-Za-z_][A-Za-z0-9_-]{0,127}$/u.test(toolName)\n ? `approval for native tool ${toolName}`\n : \"interactive input\";\n inputFailure = new AgentError(\"INPUT_REQUIRED\", `Claude Code needs ${subject}. Configure its native permissions before retrying.`);\n };\n let native: ClaudeQuery;\n try { native = deps.query({prompt: input, options: {\n pathToClaudeCodeExecutable: executable,\n cwd: options.cwd,\n ...settings,\n ...tools.config,\n ...(allowedTools.length ? {allowedTools} : {}),\n settings: config.path,\n stderr: () => {},\n ...(options.harness.model ? {model: options.harness.model} : {}),\n systemPrompt: options.agent.instructions\n ? {type: \"preset\", preset: \"claude_code\", append: options.agent.instructions}\n : {type: \"preset\", preset: \"claude_code\"},\n settingSources: [\"user\", \"project\", \"local\"],\n canUseTool: async (toolName) => {\n requireInput(toolName);\n return {behavior: \"deny\", message: inputFailure!.message, interrupt: true};\n },\n onElicitation: async () => {\n requireInput();\n try { await native.interrupt(); } catch { native.close(); }\n return {action: \"decline\"};\n },\n }}); }\n catch {\n await config.cleanup();\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Claude Code could not start.\");\n }\n const expectedModels = new Set<string>();\n let retainedModel: string | undefined;\n try {\n verifyClaudeAccess(await native.accountInfo(), options.access);\n const models = await native.supportedModels();\n if (options.harness.model) {\n addCatalogEquivalentModels(expectedModels, models, options.harness.model);\n verifyClaudeOptions(models, options);\n try {\n const applied = await readClaudeAppliedSettings(native);\n if (!expectedModels.has(applied.model)) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code selected a different model than requested.\");\n verifyAppliedClaudeEffort(applied.effort, options.harness.effort);\n retainedModel = applied.model;\n expectedModels.add(applied.model);\n } catch (error) {\n if (!(error instanceof ClaudeSettingsUnavailable)) throw error;\n }\n } else {\n if (!native.getSettings || !native.setModel) throw claudeDefaultUnavailable();\n let selected;\n try { selected = await readClaudeAppliedSettings(native); }\n catch (error) { if (error instanceof ClaudeSettingsUnavailable) throw claudeDefaultUnavailable(); throw error; }\n verifyClaudeOptions(models, options, selected.model);\n verifyAppliedClaudeEffort(selected.effort, options.harness.effort);\n addCatalogEquivalentModels(expectedModels, models, selected.model);\n try { await native.setModel(selected.model); } catch { throw claudeDefaultUnavailable(); }\n let pinned;\n try { pinned = await readClaudeAppliedSettings(native); }\n catch (error) { if (error instanceof ClaudeSettingsUnavailable) throw claudeDefaultUnavailable(); throw error; }\n if (!expectedModels.has(pinned.model)) throw claudeDefaultUnavailable();\n verifyAppliedClaudeEffort(pinned.effort, options.harness.effort);\n retainedModel = pinned.model;\n addCatalogEquivalentModels(expectedModels, models, pinned.model);\n }\n if (inputFailure) throw inputFailure;\n }\n catch (error) {\n input.close();\n native.close();\n await config.cleanup();\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"ACCESS_UNAVAILABLE\", \"Claude Code authentication could not be verified.\");\n }\n let closed = false;\n let preflight: {\n cancellation: Promise<never>;\n cancel(error: AgentError): void;\n stopped: Promise<void>;\n stop(): void;\n } | undefined;\n let sessionFailure: AgentError | undefined;\n let active: {\n resolve(text: string): void; reject(error: unknown): void;\n stopped: Promise<void>; stop(): void; interrupted: boolean;\n } | undefined;\n const reading = (async () => {\n try {\n for await (const message of native) {\n if (message.type === \"system\" && message.subtype === \"init\" && !expectedModels.has(message.model)) {\n sessionFailure = new AgentError(\"INVALID_CONFIG\", \"Claude Code selected a different model than requested.\");\n tools.stopAdmission();\n native.close();\n break;\n }\n if (message.type !== \"result\" || !active) continue;\n const current = active;\n await tools.drain();\n active = undefined;\n current.stop();\n if (inputFailure) current.reject(inputFailure);\n else if (current.interrupted) current.reject(new AgentError(\"INTERRUPTED\", \"The native turn was interrupted.\"));\n else if (message.subtype === \"success\" && !message.is_error) {\n if (Buffer.byteLength(message.result, \"utf8\") > 1024 * 1024) {\n current.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"The Claude Code response exceeds 1 MiB.\"));\n } else current.resolve(message.result);\n }\n else current.reject(new AgentError(\"HARNESS_ERROR\", \"Claude Code could not complete the turn.\"));\n }\n } catch {\n // Native diagnostics may contain credentials; return a stable safe message.\n } finally {\n const code = closed ? \"SESSION_CLOSED\" : \"HARNESS_ERROR\";\n closed = true;\n input.close();\n await tools.drain();\n active?.reject(sessionFailure ?? inputFailure ?? new AgentError(code, \"The Claude Code process stopped before completing the turn.\"));\n active?.stop();\n active = undefined;\n await config.cleanup();\n }\n })();\n return {\n async turn(prompt) {\n if (closed) return Promise.reject(sessionFailure ?? new AgentError(\"SESSION_CLOSED\", \"The native session has closed.\"));\n if (active || preflight) return Promise.reject(new AgentError(\"SESSION_BUSY\", \"A native turn is already active.\"));\n let cancel!: (error: AgentError) => void, stop!: () => void;\n const currentPreflight = {\n cancellation: new Promise<never>((_resolve, reject) => { cancel = reject; }),\n cancel(error: AgentError) { cancel(error); },\n stopped: new Promise<void>(resolve => { stop = resolve; }),\n stop() { stop(); },\n };\n preflight = currentPreflight;\n try {\n if (native.getSettings && retainedModel) {\n let applied;\n try { applied = await Promise.race([readClaudeAppliedSettings(native), currentPreflight.cancellation]); }\n catch (error) {\n if (error instanceof ClaudeSettingsUnavailable) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code could not verify the retained session model before submission.\");\n throw error;\n }\n if (!expectedModels.has(applied.model)) throw new AgentError(\"INVALID_CONFIG\", \"Claude Code changed the retained session model before submission.\");\n verifyAppliedClaudeEffort(applied.effort, options.harness.effort);\n }\n if (closed) throw sessionFailure ?? new AgentError(\"SESSION_CLOSED\", \"The native session has closed.\");\n } finally {\n if (preflight === currentPreflight) preflight = undefined;\n currentPreflight.stop();\n }\n return await new Promise((resolve, reject) => {\n inputFailure = undefined;\n tools.start();\n let stop!: () => void;\n const stopped = new Promise<void>(resolve => { stop = resolve; });\n active = {resolve, reject, stopped, stop, interrupted:false};\n input.push({type:\"user\",message:{role:\"user\",content:prompt},parent_tool_use_id:null,uuid:randomUUID()});\n });\n },\n async steer() { throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"Claude Code does not expose verified active steering.\"); },\n async interrupt() {\n const pending = preflight;\n if (pending) {\n pending.cancel(new AgentError(\"INTERRUPTED\", \"The native turn was interrupted before submission.\"));\n await pending.stopped;\n return;\n }\n const current = active;\n if (!current) return;\n current.interrupted = true;\n tools.stopAdmission();\n try { await native.interrupt(); }\n catch {\n current.interrupted = false;\n throw new AgentError(\"CANCEL_FAILED\", \"Claude Code did not confirm interruption.\");\n }\n await current.stopped;\n },\n async resume() { throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"Claude Code cannot retry failed execution without replaying input.\"); },\n async close() {\n closed = true;\n const pending = preflight;\n if (pending) {\n pending.cancel(new AgentError(\"SESSION_CLOSED\", \"The native session closed before submission.\"));\n await pending.stopped;\n }\n tools.stopAdmission();\n input.close();\n native.close();\n await reading;\n },\n };\n };\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AdapterOptions } from "./types.js";
|
|
2
|
+
import type { NativeRpc } from "./rpc.js";
|
|
3
|
+
export declare function codexEnvironment(options: AdapterOptions): NodeJS.ProcessEnv;
|
|
4
|
+
export declare function codexConfiguration(rpc: NativeRpc, options: AdapterOptions): Promise<{
|
|
5
|
+
modelProvider: string;
|
|
6
|
+
config: {
|
|
7
|
+
forced_login_method: string;
|
|
8
|
+
"model_providers.subharness"?: undefined;
|
|
9
|
+
};
|
|
10
|
+
developerInstructions: string;
|
|
11
|
+
} | {
|
|
12
|
+
modelProvider: string;
|
|
13
|
+
config: {
|
|
14
|
+
forced_login_method?: undefined;
|
|
15
|
+
"model_providers.subharness": {
|
|
16
|
+
name: string;
|
|
17
|
+
base_url: string;
|
|
18
|
+
env_key: string;
|
|
19
|
+
wire_api: string;
|
|
20
|
+
requires_openai_auth: boolean;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
developerInstructions: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function validateCodexModel(rpc: NativeRpc, options: AdapterOptions, selectedModel: string): Promise<void>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { AgentError } from "../errors.js";
|
|
2
|
+
const privateToken = "SUBHARNESS_CODEX_TOKEN";
|
|
3
|
+
const provider = "subharness";
|
|
4
|
+
export function codexEnvironment(options) {
|
|
5
|
+
const env = { ...options.env };
|
|
6
|
+
for (const key of ["OPENAI_API_KEY", "CODEX_API_KEY", "CODEX_ACCESS_TOKEN", "OPENAI_BASE_URL", "CHATGPT_BASE_URL", "CODEX_CHATGPT_BASE_URL", "OPENAI_FEDERATION_RULE_ID", "OPENAI_IDENTITY_TOKEN_FILE", "AGENT_DRAFT_CODEX_TOKEN", privateToken])
|
|
7
|
+
delete env[key];
|
|
8
|
+
if (options.access.type !== "subscription") {
|
|
9
|
+
if (!options.access.token)
|
|
10
|
+
throw new AgentError("ACCESS_UNAVAILABLE", "The selected Codex connection has no credential.");
|
|
11
|
+
env[privateToken] = options.access.token;
|
|
12
|
+
}
|
|
13
|
+
return env;
|
|
14
|
+
}
|
|
15
|
+
export async function codexConfiguration(rpc, options) {
|
|
16
|
+
const { config } = await rpc.request("config/read", { cwd: options.cwd, includeLayers: false });
|
|
17
|
+
if (options.access.type === "subscription") {
|
|
18
|
+
const account = await rpc.request("account/read", { refreshToken: false });
|
|
19
|
+
if (account.account?.type !== "chatgpt")
|
|
20
|
+
throw new AgentError("ACCESS_UNAVAILABLE", "Codex requires a native ChatGPT login. Run codex login first.");
|
|
21
|
+
if ((config.model_provider && config.model_provider !== "openai") || config.model_providers?.openai ||
|
|
22
|
+
(config.openai_base_url && !/^https:\/\/api\.openai\.com\/v1\/?$/.test(config.openai_base_url)) ||
|
|
23
|
+
(config.chatgpt_base_url && !/^https:\/\/chatgpt\.com\/backend-api\/?$/.test(config.chatgpt_base_url))) {
|
|
24
|
+
throw new AgentError("ACCESS_UNAVAILABLE", "Codex has a custom provider or endpoint. Select explicit API access or restore its native subscription route.");
|
|
25
|
+
}
|
|
26
|
+
return { modelProvider: "openai", config: { forced_login_method: "chatgpt" }, developerInstructions: instructions(config, options) };
|
|
27
|
+
}
|
|
28
|
+
if (config.model_providers?.[provider])
|
|
29
|
+
throw new AgentError("INVALID_CONFIG", "The native Codex configuration uses the reserved subharness provider name.");
|
|
30
|
+
const baseUrl = options.access.type === "api-key" ? "https://api.openai.com/v1" : "https://ai-gateway.vercel.sh/codex/v1";
|
|
31
|
+
return {
|
|
32
|
+
modelProvider: provider,
|
|
33
|
+
config: { [`model_providers.${provider}`]: { name: "Subharness selected access", base_url: baseUrl, env_key: privateToken, wire_api: "responses", requires_openai_auth: false } },
|
|
34
|
+
developerInstructions: instructions(config, options),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function instructions(config, options) {
|
|
38
|
+
return [config.developer_instructions, options.agent.instructions].filter(Boolean).join("\n\n");
|
|
39
|
+
}
|
|
40
|
+
export async function validateCodexModel(rpc, options, selectedModel) {
|
|
41
|
+
// External provider model catalogs can differ from the native ChatGPT catalog.
|
|
42
|
+
if (options.access.type !== "subscription")
|
|
43
|
+
return;
|
|
44
|
+
let cursor;
|
|
45
|
+
const seen = new Set();
|
|
46
|
+
do {
|
|
47
|
+
const page = await rpc.request("model/list", { cursor, includeHidden: true });
|
|
48
|
+
const model = page.data?.find((m) => m.model === selectedModel || m.id === selectedModel);
|
|
49
|
+
if (model) {
|
|
50
|
+
if (options.harness.effort && !model.supportedReasoningEfforts?.some((e) => e.reasoningEffort === options.harness.effort))
|
|
51
|
+
throw new AgentError("INVALID_CONFIG", "The requested Codex effort is not supported by this model.");
|
|
52
|
+
if (options.harness.fast && !model.serviceTiers?.some((tier) => tier.id === "fast") && !model.additionalSpeedTiers?.includes("fast"))
|
|
53
|
+
throw new AgentError("INVALID_CONFIG", "The requested Codex model does not support fast mode.");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
cursor = page.nextCursor ?? undefined;
|
|
57
|
+
if (cursor && seen.has(cursor))
|
|
58
|
+
throw new AgentError("PROTOCOL_ERROR", "Codex returned a repeated model catalog cursor.");
|
|
59
|
+
if (cursor)
|
|
60
|
+
seen.add(cursor);
|
|
61
|
+
} while (cursor);
|
|
62
|
+
throw new AgentError("INVALID_CONFIG", options.harness.model
|
|
63
|
+
? "The requested model is not in the native Codex model catalog."
|
|
64
|
+
: "Codex could not select a verifiable native default for this connection. Supply --model <model>.");
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=codex-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-config.js","sourceRoot":"","sources":["../../src/adapters/codex-config.ts"],"names":[],"mappings":"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","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport type { AdapterOptions } from \"./types.js\";\nimport type { NativeRpc } from \"./rpc.js\";\n\nconst privateToken = \"SUBHARNESS_CODEX_TOKEN\";\nconst provider = \"subharness\";\n\nexport function codexEnvironment(options: AdapterOptions): NodeJS.ProcessEnv {\n const env = { ...options.env };\n for (const key of [\"OPENAI_API_KEY\", \"CODEX_API_KEY\", \"CODEX_ACCESS_TOKEN\", \"OPENAI_BASE_URL\", \"CHATGPT_BASE_URL\", \"CODEX_CHATGPT_BASE_URL\", \"OPENAI_FEDERATION_RULE_ID\", \"OPENAI_IDENTITY_TOKEN_FILE\", \"AGENT_DRAFT_CODEX_TOKEN\", privateToken]) delete env[key];\n if (options.access.type !== \"subscription\") {\n if (!options.access.token) throw new AgentError(\"ACCESS_UNAVAILABLE\", \"The selected Codex connection has no credential.\");\n env[privateToken] = options.access.token;\n }\n return env;\n}\n\nexport async function codexConfiguration(rpc: NativeRpc, options: AdapterOptions) {\n const { config } = await rpc.request(\"config/read\", { cwd: options.cwd, includeLayers: false });\n if (options.access.type === \"subscription\") {\n const account = await rpc.request(\"account/read\", { refreshToken: false });\n if (account.account?.type !== \"chatgpt\") throw new AgentError(\"ACCESS_UNAVAILABLE\", \"Codex requires a native ChatGPT login. Run codex login first.\");\n if ((config.model_provider && config.model_provider !== \"openai\") || config.model_providers?.openai ||\n (config.openai_base_url && !/^https:\\/\\/api\\.openai\\.com\\/v1\\/?$/.test(config.openai_base_url)) ||\n (config.chatgpt_base_url && !/^https:\\/\\/chatgpt\\.com\\/backend-api\\/?$/.test(config.chatgpt_base_url))) {\n throw new AgentError(\"ACCESS_UNAVAILABLE\", \"Codex has a custom provider or endpoint. Select explicit API access or restore its native subscription route.\");\n }\n return { modelProvider: \"openai\", config: { forced_login_method: \"chatgpt\" }, developerInstructions: instructions(config, options) };\n }\n if (config.model_providers?.[provider]) throw new AgentError(\"INVALID_CONFIG\", \"The native Codex configuration uses the reserved subharness provider name.\");\n const baseUrl = options.access.type === \"api-key\" ? \"https://api.openai.com/v1\" : \"https://ai-gateway.vercel.sh/codex/v1\";\n return {\n modelProvider: provider,\n config: { [`model_providers.${provider}`]: { name: \"Subharness selected access\", base_url: baseUrl, env_key: privateToken, wire_api: \"responses\", requires_openai_auth: false } },\n developerInstructions: instructions(config, options),\n };\n}\n\nfunction instructions(config: any, options: AdapterOptions): string {\n return [config.developer_instructions, options.agent.instructions].filter(Boolean).join(\"\\n\\n\");\n}\n\nexport async function validateCodexModel(rpc: NativeRpc, options: AdapterOptions, selectedModel: string): Promise<void> {\n // External provider model catalogs can differ from the native ChatGPT catalog.\n if (options.access.type !== \"subscription\") return;\n let cursor: string | undefined;\n const seen = new Set<string>();\n do {\n const page = await rpc.request(\"model/list\", { cursor, includeHidden: true });\n const model = page.data?.find((m: any) => m.model === selectedModel || m.id === selectedModel);\n if (model) {\n if (options.harness.effort && !model.supportedReasoningEfforts?.some((e: any) => e.reasoningEffort === options.harness.effort)) throw new AgentError(\"INVALID_CONFIG\", \"The requested Codex effort is not supported by this model.\");\n if (options.harness.fast && !model.serviceTiers?.some((tier: any) => tier.id === \"fast\") && !model.additionalSpeedTiers?.includes(\"fast\")) throw new AgentError(\"INVALID_CONFIG\", \"The requested Codex model does not support fast mode.\");\n return;\n }\n cursor = page.nextCursor ?? undefined;\n if (cursor && seen.has(cursor)) throw new AgentError(\"PROTOCOL_ERROR\", \"Codex returned a repeated model catalog cursor.\");\n if (cursor) seen.add(cursor);\n } while (cursor);\n throw new AgentError(\"INVALID_CONFIG\", options.harness.model\n ? \"The requested model is not in the native Codex model catalog.\"\n : \"Codex could not select a verifiable native default for this connection. Supply --model <model>.\");\n}\n"]}
|