codex-task 0.2.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.
- package/.codex-plugin/plugin.json +36 -0
- package/LICENSE +21 -0
- package/README.md +273 -0
- package/README.zh-CN.md +209 -0
- package/THIRD_PARTY_NOTICES.md +37 -0
- package/dist/api.d.ts +8 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +355 -0
- package/dist/api.js.map +1 -0
- package/dist/backends/direct/auth.d.ts +14 -0
- package/dist/backends/direct/auth.d.ts.map +1 -0
- package/dist/backends/direct/auth.js +152 -0
- package/dist/backends/direct/auth.js.map +1 -0
- package/dist/backends/direct/http.d.ts +12 -0
- package/dist/backends/direct/http.d.ts.map +1 -0
- package/dist/backends/direct/http.js +62 -0
- package/dist/backends/direct/http.js.map +1 -0
- package/dist/backends/direct/identity.d.ts +11 -0
- package/dist/backends/direct/identity.d.ts.map +1 -0
- package/dist/backends/direct/identity.js +89 -0
- package/dist/backends/direct/identity.js.map +1 -0
- package/dist/backends/direct/index.d.ts +15 -0
- package/dist/backends/direct/index.d.ts.map +1 -0
- package/dist/backends/direct/index.js +201 -0
- package/dist/backends/direct/index.js.map +1 -0
- package/dist/backends/direct/models.d.ts +14 -0
- package/dist/backends/direct/models.d.ts.map +1 -0
- package/dist/backends/direct/models.js +83 -0
- package/dist/backends/direct/models.js.map +1 -0
- package/dist/backends/direct/protocol.d.ts +24 -0
- package/dist/backends/direct/protocol.d.ts.map +1 -0
- package/dist/backends/direct/protocol.js +131 -0
- package/dist/backends/direct/protocol.js.map +1 -0
- package/dist/backends/direct/sse.d.ts +15 -0
- package/dist/backends/direct/sse.d.ts.map +1 -0
- package/dist/backends/direct/sse.js +93 -0
- package/dist/backends/direct/sse.js.map +1 -0
- package/dist/backends/sdk.d.ts +54 -0
- package/dist/backends/sdk.d.ts.map +1 -0
- package/dist/backends/sdk.js +173 -0
- package/dist/backends/sdk.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +77 -0
- package/dist/config.js.map +1 -0
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +94 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +10 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +30 -0
- package/dist/events.js.map +1 -0
- package/dist/fs-utils.d.ts +7 -0
- package/dist/fs-utils.d.ts.map +1 -0
- package/dist/fs-utils.js +56 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/images.d.ts +18 -0
- package/dist/images.d.ts.map +1 -0
- package/dist/images.js +102 -0
- package/dist/images.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/paths.d.ts +14 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +61 -0
- package/dist/paths.js.map +1 -0
- package/dist/skill.d.ts +2 -0
- package/dist/skill.d.ts.map +1 -0
- package/dist/skill.js +6 -0
- package/dist/skill.js.map +1 -0
- package/dist/state.d.ts +20 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +134 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +167 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +89 -0
- package/skills/codex-task/SKILL.md +79 -0
- package/skills/codex-task/agents/openai.yaml +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/identity.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AA+CD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAiBtE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAE/D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { arch, platform, release } from "node:os";
|
|
4
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { appPaths } from "../../paths.js";
|
|
7
|
+
import { atomicWrite } from "../../fs-utils.js";
|
|
8
|
+
function detectCodexVersion(codexHome) {
|
|
9
|
+
try {
|
|
10
|
+
const versionPath = join(codexHome, "version.json");
|
|
11
|
+
if (existsSync(versionPath)) {
|
|
12
|
+
const value = JSON.parse(readFileSync(versionPath, "utf8"));
|
|
13
|
+
if (typeof value["latest_version"] === "string")
|
|
14
|
+
return value["latest_version"];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Continue to the installed binary.
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const output = execFileSync("codex", ["--version"], { timeout: 3000, encoding: "utf8" });
|
|
22
|
+
return output.match(/\d+\.\d+\.\d+/)?.[0] ?? "0.147.0";
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return "0.147.0";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function detectInstallationId(codexHome) {
|
|
29
|
+
try {
|
|
30
|
+
const path = join(codexHome, "installation_id");
|
|
31
|
+
if (existsSync(path)) {
|
|
32
|
+
const value = readFileSync(path, "utf8").trim();
|
|
33
|
+
if (value)
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Use a private stable identity.
|
|
39
|
+
}
|
|
40
|
+
return randomUUID();
|
|
41
|
+
}
|
|
42
|
+
function platformInfo() {
|
|
43
|
+
const architecture = arch() === "arm64" ? "aarch64" : arch() === "x64" ? "x86_64" : arch();
|
|
44
|
+
if (platform() === "darwin") {
|
|
45
|
+
try {
|
|
46
|
+
const version = execFileSync("sw_vers", ["-productVersion"], { timeout: 2000, encoding: "utf8" }).trim();
|
|
47
|
+
return { osType: "macOS", osVersion: version, arch: architecture };
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return { osType: "macOS", osVersion: release(), arch: architecture };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (platform() === "win32")
|
|
54
|
+
return { osType: "Windows", osVersion: release(), arch: architecture };
|
|
55
|
+
return { osType: "Linux", osVersion: release(), arch: architecture };
|
|
56
|
+
}
|
|
57
|
+
export function loadOrCreateIdentity(codexHome) {
|
|
58
|
+
const path = appPaths().identityPath;
|
|
59
|
+
if (existsSync(path)) {
|
|
60
|
+
try {
|
|
61
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
62
|
+
if (value.installationId && value.codexVersion)
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Replace invalid state.
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const identity = {
|
|
70
|
+
installationId: detectInstallationId(codexHome),
|
|
71
|
+
codexVersion: detectCodexVersion(codexHome),
|
|
72
|
+
...platformInfo(),
|
|
73
|
+
};
|
|
74
|
+
atomicWrite(path, JSON.stringify(identity, null, 2), 0o600);
|
|
75
|
+
return identity;
|
|
76
|
+
}
|
|
77
|
+
export function buildUserAgent(identity) {
|
|
78
|
+
return `codex_cli_rs/${identity.codexVersion} (${identity.osType} ${identity.osVersion}; ${identity.arch})`;
|
|
79
|
+
}
|
|
80
|
+
export function platformSandboxTag() {
|
|
81
|
+
if (platform() === "darwin")
|
|
82
|
+
return "seatbelt";
|
|
83
|
+
if (platform() === "linux")
|
|
84
|
+
return "seccomp";
|
|
85
|
+
if (platform() === "win32")
|
|
86
|
+
return "windows_sandbox";
|
|
87
|
+
return "none";
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/backends/direct/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ResolvedDirectModel } from "./models.js";
|
|
2
|
+
import type { Artifact, ImageOptions, TextOptions, UsageSummary } from "../../types.js";
|
|
3
|
+
export interface DirectTextExecution {
|
|
4
|
+
text: string;
|
|
5
|
+
model: ResolvedDirectModel;
|
|
6
|
+
usage?: UsageSummary | undefined;
|
|
7
|
+
}
|
|
8
|
+
export interface DirectImageExecution {
|
|
9
|
+
artifacts: Artifact[];
|
|
10
|
+
model: ResolvedDirectModel;
|
|
11
|
+
usage?: UsageSummary | undefined;
|
|
12
|
+
}
|
|
13
|
+
export declare function executeDirectText(taskId: string, options: TextOptions): Promise<DirectTextExecution>;
|
|
14
|
+
export declare function executeDirectImage(taskId: string, options: ImageOptions): Promise<DirectImageExecution>;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAA+C,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOpG,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAa,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CAClC;AA+GD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8B1G;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwF7G"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { ensureDirectAuth } from "./auth.js";
|
|
3
|
+
import { loadOrCreateIdentity } from "./identity.js";
|
|
4
|
+
import { resolveDirectImageModel, resolveDirectModel } from "./models.js";
|
|
5
|
+
import { buildDirectRequest, RESPONSES_URL } from "./protocol.js";
|
|
6
|
+
import { ImpersonatedSession } from "./http.js";
|
|
7
|
+
import { parseDirectResponse } from "./sse.js";
|
|
8
|
+
import { loadConfig } from "../../config.js";
|
|
9
|
+
import { CodexTaskError, isAbortError } from "../../errors.js";
|
|
10
|
+
import { validateImageOptions, writePngArtifact } from "../../images.js";
|
|
11
|
+
function emit(callback, event) {
|
|
12
|
+
callback?.(event);
|
|
13
|
+
}
|
|
14
|
+
function mapHttpError(status, body) {
|
|
15
|
+
const detail = body.slice(0, 500);
|
|
16
|
+
if (status === 401 || status === 403) {
|
|
17
|
+
return new CodexTaskError("DIRECT_AUTH_FAILED", `Direct authentication failed with HTTP ${status}`, {
|
|
18
|
+
details: detail,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (status === 429) {
|
|
22
|
+
return new CodexTaskError("DIRECT_RATE_LIMITED", "Direct backend is rate limited", {
|
|
23
|
+
retryable: true,
|
|
24
|
+
details: detail,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (status >= 500) {
|
|
28
|
+
return new CodexTaskError("DIRECT_SERVER_ERROR", `Direct backend returned HTTP ${status}`, {
|
|
29
|
+
retryable: true,
|
|
30
|
+
details: detail,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (status === 400) {
|
|
34
|
+
return new CodexTaskError("DIRECT_REQUEST_REJECTED", "Direct backend rejected the request", {
|
|
35
|
+
details: detail,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return new CodexTaskError("DIRECT_HTTP_ERROR", `Direct backend returned HTTP ${status}`, {
|
|
39
|
+
retryable: status === 0,
|
|
40
|
+
details: detail,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function normalizeDirectError(error) {
|
|
44
|
+
if (error instanceof CodexTaskError)
|
|
45
|
+
return error;
|
|
46
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
47
|
+
const retryable = /timeout|timed out|econnreset|socket|network|empty response/i.test(message);
|
|
48
|
+
return new CodexTaskError("DIRECT_TRANSPORT_ERROR", message, { retryable, cause: error });
|
|
49
|
+
}
|
|
50
|
+
async function sendOnce(context, spec, timeoutMs, proxy, signal) {
|
|
51
|
+
if (signal?.aborted)
|
|
52
|
+
throw new DOMException("The operation was aborted", "AbortError");
|
|
53
|
+
const session = new ImpersonatedSession(timeoutMs, proxy);
|
|
54
|
+
const abort = () => session.close();
|
|
55
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
56
|
+
try {
|
|
57
|
+
const request = buildDirectRequest(context, spec);
|
|
58
|
+
const response = await session.post(RESPONSES_URL, request.headers, JSON.stringify(request.body));
|
|
59
|
+
if (signal?.aborted)
|
|
60
|
+
throw new DOMException("The operation was aborted", "AbortError");
|
|
61
|
+
if (response.status !== 200)
|
|
62
|
+
throw mapHttpError(response.status, response.text);
|
|
63
|
+
const parsed = parseDirectResponse(response.text);
|
|
64
|
+
if (!parsed.text && !parsed.image) {
|
|
65
|
+
throw new CodexTaskError("DIRECT_EMPTY_RESPONSE", "Direct backend returned an empty response", {
|
|
66
|
+
retryable: true,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return parsed;
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
signal?.removeEventListener("abort", abort);
|
|
73
|
+
session.close();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function sendWithRetry(taskId, context, spec, timeoutMs, retries, proxy, signal, onEvent) {
|
|
77
|
+
const delays = [2_000, 6_000, 15_000];
|
|
78
|
+
for (let attempt = 0;; attempt += 1) {
|
|
79
|
+
try {
|
|
80
|
+
return await sendOnce(context, spec, timeoutMs, proxy, signal);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (isAbortError(error))
|
|
84
|
+
throw error;
|
|
85
|
+
const normalized = normalizeDirectError(error);
|
|
86
|
+
if (!normalized.retryable || attempt >= retries)
|
|
87
|
+
throw normalized;
|
|
88
|
+
const delayMs = delays[Math.min(attempt, delays.length - 1)] ?? 15_000;
|
|
89
|
+
emit(onEvent, { type: "retrying", taskId, attempt: attempt + 1, delayMs, error: normalized.message });
|
|
90
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function contextForRequest(codexHome, proxy) {
|
|
95
|
+
const auth = await ensureDirectAuth(codexHome, proxy);
|
|
96
|
+
return {
|
|
97
|
+
accessToken: auth.accessToken,
|
|
98
|
+
accountId: auth.accountId,
|
|
99
|
+
identity: loadOrCreateIdentity(codexHome),
|
|
100
|
+
sessionId: randomUUID(),
|
|
101
|
+
threadId: randomUUID(),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export async function executeDirectText(taskId, options) {
|
|
105
|
+
const config = loadConfig({
|
|
106
|
+
codexHome: options.codexHome,
|
|
107
|
+
directModel: options.model,
|
|
108
|
+
directReasoning: options.reasoning,
|
|
109
|
+
directTextTimeoutMs: options.timeoutMs,
|
|
110
|
+
retries: options.retries,
|
|
111
|
+
});
|
|
112
|
+
const model = resolveDirectModel(config.codexHome, config.directModel, config.directReasoning);
|
|
113
|
+
const context = await contextForRequest(config.codexHome, config.proxy);
|
|
114
|
+
const response = await sendWithRetry(taskId, context, {
|
|
115
|
+
kind: "text",
|
|
116
|
+
prompt: options.prompt,
|
|
117
|
+
instructions: options.instructions,
|
|
118
|
+
model,
|
|
119
|
+
outputSchema: options.outputSchema,
|
|
120
|
+
}, config.directTextTimeoutMs, config.retries, config.proxy, options.signal, options.onEvent);
|
|
121
|
+
if (!response.text) {
|
|
122
|
+
throw new CodexTaskError("DIRECT_EMPTY_TEXT", "Direct backend returned no text", { retryable: true });
|
|
123
|
+
}
|
|
124
|
+
return { text: response.text, model, usage: response.usage };
|
|
125
|
+
}
|
|
126
|
+
export async function executeDirectImage(taskId, options) {
|
|
127
|
+
const validated = validateImageOptions(options);
|
|
128
|
+
const config = loadConfig({
|
|
129
|
+
codexHome: options.codexHome,
|
|
130
|
+
directModel: options.model,
|
|
131
|
+
directReasoning: options.reasoning,
|
|
132
|
+
directImageTimeoutMs: options.timeoutMs,
|
|
133
|
+
retries: options.retries,
|
|
134
|
+
});
|
|
135
|
+
const resolution = resolveDirectImageModel(config.codexHome, config.directModel, config.directReasoning);
|
|
136
|
+
const model = resolution.model;
|
|
137
|
+
if (resolution.replacedLiteModel) {
|
|
138
|
+
emit(options.onEvent, {
|
|
139
|
+
type: "progress",
|
|
140
|
+
taskId,
|
|
141
|
+
message: `${resolution.replacedLiteModel} uses Responses Lite, which cannot expose hosted image_generation; using ${model.model} before sending the request`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const context = await contextForRequest(config.codexHome, config.proxy);
|
|
145
|
+
const artifacts = [];
|
|
146
|
+
const usage = {};
|
|
147
|
+
let nextIndex = 0;
|
|
148
|
+
const worker = async (workerContext) => {
|
|
149
|
+
while (true) {
|
|
150
|
+
const index = nextIndex;
|
|
151
|
+
nextIndex += 1;
|
|
152
|
+
if (index >= validated.count)
|
|
153
|
+
return;
|
|
154
|
+
try {
|
|
155
|
+
emit(options.onEvent, {
|
|
156
|
+
type: "progress",
|
|
157
|
+
taskId,
|
|
158
|
+
message: `Generating image ${index + 1}/${validated.count}`,
|
|
159
|
+
});
|
|
160
|
+
const response = await sendWithRetry(taskId, workerContext, {
|
|
161
|
+
kind: "image",
|
|
162
|
+
prompt: options.prompt,
|
|
163
|
+
instructions: options.instructions,
|
|
164
|
+
model,
|
|
165
|
+
imageOptions: validated,
|
|
166
|
+
}, config.directImageTimeoutMs, config.retries, config.proxy, options.signal, options.onEvent);
|
|
167
|
+
if (!response.image) {
|
|
168
|
+
throw new CodexTaskError("DIRECT_EMPTY_IMAGE", "Direct backend returned no image", {
|
|
169
|
+
retryable: !response.text,
|
|
170
|
+
details: response.text ? { text: response.text } : undefined,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
const artifact = writePngArtifact(taskId, response.image, options.output, index, validated.count, validated.overwrite);
|
|
174
|
+
artifacts[index] = artifact;
|
|
175
|
+
emit(options.onEvent, { type: "artifact", taskId, artifact });
|
|
176
|
+
if (response.usage?.inputTokens)
|
|
177
|
+
usage.inputTokens = (usage.inputTokens ?? 0) + response.usage.inputTokens;
|
|
178
|
+
if (response.usage?.outputTokens)
|
|
179
|
+
usage.outputTokens = (usage.outputTokens ?? 0) + response.usage.outputTokens;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
const normalized = normalizeDirectError(error);
|
|
183
|
+
throw new CodexTaskError(normalized.code, normalized.message, {
|
|
184
|
+
retryable: normalized.retryable,
|
|
185
|
+
exitCode: normalized.exitCode,
|
|
186
|
+
details: { upstream: normalized.details, artifacts: artifacts.filter(Boolean) },
|
|
187
|
+
cause: normalized,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const workerCount = Math.min(validated.concurrency, validated.count);
|
|
193
|
+
const contexts = Array.from({ length: workerCount }, () => ({
|
|
194
|
+
...context,
|
|
195
|
+
sessionId: randomUUID(),
|
|
196
|
+
threadId: randomUUID(),
|
|
197
|
+
}));
|
|
198
|
+
await Promise.all(contexts.map((workerContext) => worker(workerContext)));
|
|
199
|
+
return { artifacts: artifacts.filter(Boolean), model, usage };
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/direct/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReasoningEffort } from "../../types.js";
|
|
2
|
+
export interface ResolvedDirectModel {
|
|
3
|
+
model: string;
|
|
4
|
+
useResponsesLite: boolean;
|
|
5
|
+
reasoning: ReasoningEffort;
|
|
6
|
+
supportedReasoning: ReasoningEffort[];
|
|
7
|
+
source: "explicit" | "codex-config" | "model-cache" | "fallback";
|
|
8
|
+
}
|
|
9
|
+
export declare function resolveDirectModel(codexHome: string, explicitModel: string | undefined, requestedReasoning?: ReasoningEffort): ResolvedDirectModel;
|
|
10
|
+
export declare function resolveDirectImageModel(codexHome: string, explicitModel: string | undefined, requestedReasoning?: ReasoningEffort): {
|
|
11
|
+
model: ResolvedDirectModel;
|
|
12
|
+
replacedLiteModel?: string | undefined;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/models.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAmBtD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,eAAe,CAAC;IAC3B,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,aAAa,GAAG,UAAU,CAAC;CAClE;AA+BD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,kBAAkB,GAAE,eAA0B,GAC7C,mBAAmB,CAyCrB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,kBAAkB,GAAE,eAA0B,GAC7C;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAOxE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { usageError } from "../../errors.js";
|
|
4
|
+
function readModelCache(codexHome) {
|
|
5
|
+
try {
|
|
6
|
+
const path = join(codexHome, "models_cache.json");
|
|
7
|
+
if (!existsSync(path))
|
|
8
|
+
return [];
|
|
9
|
+
return JSON.parse(readFileSync(path, "utf8")).models ?? [];
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function readConfiguredModel(codexHome) {
|
|
16
|
+
try {
|
|
17
|
+
const path = join(codexHome, "config.toml");
|
|
18
|
+
if (!existsSync(path))
|
|
19
|
+
return undefined;
|
|
20
|
+
const match = readFileSync(path, "utf8").match(/^model\s*=\s*["']([^"']+)["']/m);
|
|
21
|
+
return match?.[1];
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function modelInfo(model, models) {
|
|
28
|
+
return models.find((entry) => entry.slug === model);
|
|
29
|
+
}
|
|
30
|
+
function heuristicLite(model) {
|
|
31
|
+
return model === "gpt-5.6-sol";
|
|
32
|
+
}
|
|
33
|
+
export function resolveDirectModel(codexHome, explicitModel, requestedReasoning = "medium") {
|
|
34
|
+
const models = readModelCache(codexHome);
|
|
35
|
+
const configured = readConfiguredModel(codexHome);
|
|
36
|
+
const preferred = [...models]
|
|
37
|
+
.filter((entry) => entry.visibility === "list" && entry.supported_in_api !== false)
|
|
38
|
+
.sort((left, right) => (left.priority ?? Number.MAX_SAFE_INTEGER) - (right.priority ?? Number.MAX_SAFE_INTEGER))[0];
|
|
39
|
+
let model;
|
|
40
|
+
let source;
|
|
41
|
+
if (explicitModel) {
|
|
42
|
+
model = explicitModel;
|
|
43
|
+
source = "explicit";
|
|
44
|
+
}
|
|
45
|
+
else if (configured) {
|
|
46
|
+
model = configured;
|
|
47
|
+
source = "codex-config";
|
|
48
|
+
}
|
|
49
|
+
else if (preferred) {
|
|
50
|
+
model = preferred.slug;
|
|
51
|
+
source = "model-cache";
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
model = "gpt-5.6-sol";
|
|
55
|
+
source = "fallback";
|
|
56
|
+
}
|
|
57
|
+
const info = modelInfo(model, models);
|
|
58
|
+
const supportedReasoning = info?.supported_reasoning_levels?.map((entry) => entry.effort) ?? [
|
|
59
|
+
"low",
|
|
60
|
+
"medium",
|
|
61
|
+
"high",
|
|
62
|
+
];
|
|
63
|
+
if (!supportedReasoning.includes(requestedReasoning)) {
|
|
64
|
+
throw usageError(`reasoning ${requestedReasoning} is not supported by ${model}; choose ${supportedReasoning.join(", ")}`);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
model,
|
|
68
|
+
useResponsesLite: info?.use_responses_lite ?? heuristicLite(model),
|
|
69
|
+
reasoning: requestedReasoning,
|
|
70
|
+
supportedReasoning,
|
|
71
|
+
source,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function resolveDirectImageModel(codexHome, explicitModel, requestedReasoning = "medium") {
|
|
75
|
+
const selected = resolveDirectModel(codexHome, explicitModel, requestedReasoning);
|
|
76
|
+
if (!selected.useResponsesLite)
|
|
77
|
+
return { model: selected };
|
|
78
|
+
return {
|
|
79
|
+
model: resolveDirectModel(codexHome, "gpt-5.5", requestedReasoning),
|
|
80
|
+
replacedLiteModel: selected.model,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/backends/direct/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DirectIdentity } from "./identity.js";
|
|
2
|
+
import type { ResolvedDirectModel } from "./models.js";
|
|
3
|
+
import { type ValidatedImageOptions } from "../../images.js";
|
|
4
|
+
export declare const RESPONSES_URL = "https://chatgpt.com/backend-api/codex/responses";
|
|
5
|
+
export interface DirectRequestContext {
|
|
6
|
+
accessToken: string;
|
|
7
|
+
accountId: string;
|
|
8
|
+
identity: DirectIdentity;
|
|
9
|
+
sessionId: string;
|
|
10
|
+
threadId: string;
|
|
11
|
+
}
|
|
12
|
+
export interface DirectRequestSpec {
|
|
13
|
+
kind: "text" | "image";
|
|
14
|
+
prompt: string;
|
|
15
|
+
instructions?: string | undefined;
|
|
16
|
+
model: ResolvedDirectModel;
|
|
17
|
+
outputSchema?: Record<string, unknown> | undefined;
|
|
18
|
+
imageOptions?: ValidatedImageOptions | undefined;
|
|
19
|
+
}
|
|
20
|
+
export declare function buildDirectRequest(context: DirectRequestContext, spec: DirectRequestSpec): {
|
|
21
|
+
headers: Record<string, string>;
|
|
22
|
+
body: Record<string, unknown>;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/protocol.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,eAAO,MAAM,aAAa,oDAAoD,CAAC;AAqB/E,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACnD,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;CAClD;AA+DD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,iBAAiB,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CA4DpE"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { buildUserAgent, platformSandboxTag } from "./identity.js";
|
|
4
|
+
import { imageMimeType } from "../../images.js";
|
|
5
|
+
export const RESPONSES_URL = "https://chatgpt.com/backend-api/codex/responses";
|
|
6
|
+
const TEXT_INSTRUCTIONS = `You are a focused single-turn task worker called by another AI agent.
|
|
7
|
+
Return the requested deliverable directly with minimal ceremony.
|
|
8
|
+
You do not have access to the caller's local shell, files, MCP servers, or skills.
|
|
9
|
+
Never claim that you executed local tools or changed local files.
|
|
10
|
+
If the request is underspecified, make a reasonable assumption and state it briefly.`;
|
|
11
|
+
const IMAGE_INSTRUCTIONS = `You are a focused image-generation worker called by another AI agent.
|
|
12
|
+
Use the provided image_generation tool to produce the requested image.
|
|
13
|
+
When reference images are present, preserve the user's requested identity, composition, and constraints.
|
|
14
|
+
Do not return a prose-only answer when image generation is requested.`;
|
|
15
|
+
function turnContext(context) {
|
|
16
|
+
return {
|
|
17
|
+
turnId: randomUUID(),
|
|
18
|
+
sessionId: context.sessionId,
|
|
19
|
+
threadId: context.threadId,
|
|
20
|
+
windowId: `${context.threadId}:0`,
|
|
21
|
+
timestampMs: Date.now(),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function turnMetadata(turn) {
|
|
25
|
+
return JSON.stringify({
|
|
26
|
+
turn_id: turn.turnId,
|
|
27
|
+
turn_started_at_unix_ms: turn.timestampMs,
|
|
28
|
+
session_id: turn.sessionId,
|
|
29
|
+
thread_id: turn.threadId,
|
|
30
|
+
sandbox: platformSandboxTag(),
|
|
31
|
+
request_kind: "turn",
|
|
32
|
+
window_id: turn.windowId,
|
|
33
|
+
workspace_kind: "local",
|
|
34
|
+
has_changes: false,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function imageTool(options) {
|
|
38
|
+
return {
|
|
39
|
+
type: "image_generation",
|
|
40
|
+
...(options.size !== "auto" ? { size: options.size } : {}),
|
|
41
|
+
...(options.quality !== "auto" ? { quality: options.quality } : {}),
|
|
42
|
+
...(options.background !== "auto" ? { background: options.background } : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function userContent(spec) {
|
|
46
|
+
const content = [{ type: "input_text", text: spec.prompt }];
|
|
47
|
+
for (const path of spec.imageOptions?.imagePaths ?? []) {
|
|
48
|
+
const mimeType = imageMimeType(path);
|
|
49
|
+
content.push({
|
|
50
|
+
type: "input_image",
|
|
51
|
+
image_url: `data:${mimeType};base64,${readFileSync(path).toString("base64")}`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return content;
|
|
55
|
+
}
|
|
56
|
+
function textConfig(spec) {
|
|
57
|
+
return {
|
|
58
|
+
verbosity: "low",
|
|
59
|
+
...(spec.outputSchema
|
|
60
|
+
? {
|
|
61
|
+
format: {
|
|
62
|
+
type: "json_schema",
|
|
63
|
+
name: "codex_task_result",
|
|
64
|
+
strict: true,
|
|
65
|
+
schema: spec.outputSchema,
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
: {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function buildDirectRequest(context, spec) {
|
|
72
|
+
const turn = turnContext(context);
|
|
73
|
+
const instructions = [spec.kind === "image" ? IMAGE_INSTRUCTIONS : TEXT_INSTRUCTIONS, spec.instructions]
|
|
74
|
+
.filter(Boolean)
|
|
75
|
+
.join("\n\n");
|
|
76
|
+
const tools = spec.kind === "image" && spec.imageOptions ? [imageTool(spec.imageOptions)] : [];
|
|
77
|
+
const userMessage = { type: "message", role: "user", content: userContent(spec) };
|
|
78
|
+
const base = {
|
|
79
|
+
model: spec.model.model,
|
|
80
|
+
tool_choice: "auto",
|
|
81
|
+
parallel_tool_calls: false,
|
|
82
|
+
stream: true,
|
|
83
|
+
store: false,
|
|
84
|
+
reasoning: {
|
|
85
|
+
effort: spec.model.reasoning,
|
|
86
|
+
...(spec.model.useResponsesLite ? { context: "all_turns" } : {}),
|
|
87
|
+
},
|
|
88
|
+
text: textConfig(spec),
|
|
89
|
+
include: ["reasoning.encrypted_content"],
|
|
90
|
+
prompt_cache_key: context.threadId,
|
|
91
|
+
client_metadata: { "x-codex-installation-id": context.identity.installationId },
|
|
92
|
+
};
|
|
93
|
+
const body = spec.model.useResponsesLite
|
|
94
|
+
? {
|
|
95
|
+
...base,
|
|
96
|
+
instructions: "",
|
|
97
|
+
input: [
|
|
98
|
+
{ type: "additional_tools", role: "developer", tools },
|
|
99
|
+
{ type: "message", role: "developer", content: [{ type: "input_text", text: instructions }] },
|
|
100
|
+
userMessage,
|
|
101
|
+
],
|
|
102
|
+
}
|
|
103
|
+
: {
|
|
104
|
+
...base,
|
|
105
|
+
instructions,
|
|
106
|
+
input: [userMessage],
|
|
107
|
+
tools,
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
headers: {
|
|
111
|
+
Authorization: `Bearer ${context.accessToken}`,
|
|
112
|
+
...(context.accountId ? { "ChatGPT-Account-Id": context.accountId } : {}),
|
|
113
|
+
"Content-Type": "application/json",
|
|
114
|
+
Accept: "text/event-stream",
|
|
115
|
+
"OpenAI-Beta": "responses_websockets=2026-02-06",
|
|
116
|
+
originator: "codex_cli_rs",
|
|
117
|
+
"User-Agent": buildUserAgent(context.identity),
|
|
118
|
+
"OAI-Product-Sku": "codex",
|
|
119
|
+
"x-codex-installation-id": context.identity.installationId,
|
|
120
|
+
"x-codex-window-id": turn.windowId,
|
|
121
|
+
"x-responses": "api-include-timing-metrics",
|
|
122
|
+
"session-id": turn.sessionId,
|
|
123
|
+
"thread-id": turn.threadId,
|
|
124
|
+
"x-client-request-id": turn.turnId,
|
|
125
|
+
"x-codex-turn-metadata": turnMetadata(turn),
|
|
126
|
+
...(spec.model.useResponsesLite ? { "x-openai-internal-codex-responses-lite": "true" } : {}),
|
|
127
|
+
},
|
|
128
|
+
body,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/backends/direct/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { UsageSummary } from "../../types.js";
|
|
2
|
+
interface SseEvent {
|
|
3
|
+
type?: string;
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
export interface ParsedDirectResponse {
|
|
7
|
+
text?: string | undefined;
|
|
8
|
+
image?: Buffer | undefined;
|
|
9
|
+
imageSize?: string | undefined;
|
|
10
|
+
usage?: UsageSummary | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseSse(text: string): SseEvent[];
|
|
13
|
+
export declare function parseDirectResponse(text: string): ParsedDirectResponse;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/sse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAajD;AAiED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAStE"}
|