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.
Files changed (92) hide show
  1. package/.codex-plugin/plugin.json +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +273 -0
  4. package/README.zh-CN.md +209 -0
  5. package/THIRD_PARTY_NOTICES.md +37 -0
  6. package/dist/api.d.ts +8 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +355 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/backends/direct/auth.d.ts +14 -0
  11. package/dist/backends/direct/auth.d.ts.map +1 -0
  12. package/dist/backends/direct/auth.js +152 -0
  13. package/dist/backends/direct/auth.js.map +1 -0
  14. package/dist/backends/direct/http.d.ts +12 -0
  15. package/dist/backends/direct/http.d.ts.map +1 -0
  16. package/dist/backends/direct/http.js +62 -0
  17. package/dist/backends/direct/http.js.map +1 -0
  18. package/dist/backends/direct/identity.d.ts +11 -0
  19. package/dist/backends/direct/identity.d.ts.map +1 -0
  20. package/dist/backends/direct/identity.js +89 -0
  21. package/dist/backends/direct/identity.js.map +1 -0
  22. package/dist/backends/direct/index.d.ts +15 -0
  23. package/dist/backends/direct/index.d.ts.map +1 -0
  24. package/dist/backends/direct/index.js +201 -0
  25. package/dist/backends/direct/index.js.map +1 -0
  26. package/dist/backends/direct/models.d.ts +14 -0
  27. package/dist/backends/direct/models.d.ts.map +1 -0
  28. package/dist/backends/direct/models.js +83 -0
  29. package/dist/backends/direct/models.js.map +1 -0
  30. package/dist/backends/direct/protocol.d.ts +24 -0
  31. package/dist/backends/direct/protocol.d.ts.map +1 -0
  32. package/dist/backends/direct/protocol.js +131 -0
  33. package/dist/backends/direct/protocol.js.map +1 -0
  34. package/dist/backends/direct/sse.d.ts +15 -0
  35. package/dist/backends/direct/sse.d.ts.map +1 -0
  36. package/dist/backends/direct/sse.js +93 -0
  37. package/dist/backends/direct/sse.js.map +1 -0
  38. package/dist/backends/sdk.d.ts +54 -0
  39. package/dist/backends/sdk.d.ts.map +1 -0
  40. package/dist/backends/sdk.js +173 -0
  41. package/dist/backends/sdk.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +224 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config.d.ts +29 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +77 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/doctor.d.ts +3 -0
  51. package/dist/doctor.d.ts.map +1 -0
  52. package/dist/doctor.js +94 -0
  53. package/dist/doctor.js.map +1 -0
  54. package/dist/errors.d.ts +16 -0
  55. package/dist/errors.d.ts.map +1 -0
  56. package/dist/errors.js +30 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/events.d.ts +10 -0
  59. package/dist/events.d.ts.map +1 -0
  60. package/dist/events.js +30 -0
  61. package/dist/events.js.map +1 -0
  62. package/dist/fs-utils.d.ts +7 -0
  63. package/dist/fs-utils.d.ts.map +1 -0
  64. package/dist/fs-utils.js +56 -0
  65. package/dist/fs-utils.js.map +1 -0
  66. package/dist/images.d.ts +18 -0
  67. package/dist/images.d.ts.map +1 -0
  68. package/dist/images.js +102 -0
  69. package/dist/images.js.map +1 -0
  70. package/dist/index.d.ts +7 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +6 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/paths.d.ts +14 -0
  75. package/dist/paths.d.ts.map +1 -0
  76. package/dist/paths.js +61 -0
  77. package/dist/paths.js.map +1 -0
  78. package/dist/skill.d.ts +2 -0
  79. package/dist/skill.d.ts.map +1 -0
  80. package/dist/skill.js +6 -0
  81. package/dist/skill.js.map +1 -0
  82. package/dist/state.d.ts +20 -0
  83. package/dist/state.d.ts.map +1 -0
  84. package/dist/state.js +134 -0
  85. package/dist/state.js.map +1 -0
  86. package/dist/types.d.ts +167 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/package.json +89 -0
  91. package/skills/codex-task/SKILL.md +79 -0
  92. package/skills/codex-task/agents/openai.yaml +4 -0
package/dist/api.js ADDED
@@ -0,0 +1,355 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { existsSync, statSync } from "node:fs";
3
+ import { dirname, extname, isAbsolute } from "node:path";
4
+ import { executeDirectImage, executeDirectText } from "./backends/direct/index.js";
5
+ import { buildWorkspacePrompt, resolveWorkingDirectory, runSdkTurn } from "./backends/sdk.js";
6
+ import { loadConfig } from "./config.js";
7
+ import { asCodexTaskError, CodexTaskError, isAbortError, usageError } from "./errors.js";
8
+ import { EventQueue } from "./events.js";
9
+ import { ensureDir } from "./fs-utils.js";
10
+ import { outputPathForImage, validateImageOptions } from "./images.js";
11
+ import { deletePendingTask, loadPendingTask, runGarbageCollection, savePendingTask } from "./state.js";
12
+ function emit(callback, event) {
13
+ callback?.(event);
14
+ }
15
+ function opportunisticGc() {
16
+ try {
17
+ runGarbageCollection();
18
+ }
19
+ catch {
20
+ // Garbage collection must never block a task.
21
+ }
22
+ }
23
+ function failedResult(taskId, backend, error, artifacts = []) {
24
+ const normalized = asCodexTaskError(error);
25
+ if (isAbortError(error) || normalized.code === "CANCELLED" || normalized.code === "TIMEOUT") {
26
+ return {
27
+ status: "cancelled",
28
+ taskId,
29
+ backend,
30
+ artifacts,
31
+ error: {
32
+ code: normalized.code === "TIMEOUT" ? "TIMEOUT" : "CANCELLED",
33
+ message: normalized.message,
34
+ retryable: normalized.retryable,
35
+ },
36
+ };
37
+ }
38
+ const detailArtifacts = normalized.details?.artifacts;
39
+ return {
40
+ status: "failed",
41
+ taskId,
42
+ backend,
43
+ artifacts: detailArtifacts ?? artifacts,
44
+ error: {
45
+ code: normalized.code,
46
+ message: normalized.message,
47
+ retryable: normalized.retryable,
48
+ details: normalized.details,
49
+ },
50
+ };
51
+ }
52
+ function reportedArtifacts(execution) {
53
+ if (execution.artifacts.length)
54
+ return execution.artifacts;
55
+ return execution.reportedArtifacts
56
+ .filter((path) => isAbsolute(path) && existsSync(path))
57
+ .map((path) => {
58
+ const extension = extname(path).toLowerCase();
59
+ const mimeType = extension === ".png"
60
+ ? "image/png"
61
+ : extension === ".jpg" || extension === ".jpeg"
62
+ ? "image/jpeg"
63
+ : extension === ".webp"
64
+ ? "image/webp"
65
+ : undefined;
66
+ return {
67
+ path,
68
+ kind: mimeType ? "image" : "file",
69
+ mimeType,
70
+ sizeBytes: statSync(path).size,
71
+ };
72
+ });
73
+ }
74
+ function finalize(callback, result) {
75
+ if (result.status === "completed")
76
+ emit(callback, { type: "completed", taskId: result.taskId, result });
77
+ else if (result.status === "needs_input")
78
+ emit(callback, { type: "needs_input", taskId: result.taskId, result });
79
+ else
80
+ emit(callback, { type: "failed", taskId: result.taskId, result });
81
+ return result;
82
+ }
83
+ export async function generateText(options) {
84
+ opportunisticGc();
85
+ const taskId = randomUUID();
86
+ const backend = options.backend ?? "direct";
87
+ emit(options.onEvent, { type: "started", taskId, backend, kind: "text" });
88
+ try {
89
+ if (backend === "direct") {
90
+ const execution = await executeDirectText(taskId, options);
91
+ return finalize(options.onEvent, {
92
+ status: "completed",
93
+ taskId,
94
+ backend,
95
+ text: execution.text,
96
+ effectiveModel: execution.model.model,
97
+ reasoningEffort: execution.model.reasoning,
98
+ artifacts: [],
99
+ usage: execution.usage,
100
+ });
101
+ }
102
+ const config = loadConfig({ sdkTimeoutMs: options.timeoutMs, codexHome: options.codexHome });
103
+ const structuredResponse = options.outputSchema === undefined;
104
+ const execution = await runSdkTurn({
105
+ taskId,
106
+ prompt: structuredResponse
107
+ ? buildWorkspacePrompt(options.prompt, options.instructions, true)
108
+ : [options.instructions, options.prompt].filter(Boolean).join("\n\n"),
109
+ workingDirectory: resolveWorkingDirectory(options.workingDirectory),
110
+ sandboxMode: "danger-full-access",
111
+ networkAccess: true,
112
+ noFollowup: true,
113
+ model: options.model,
114
+ reasoning: options.reasoning,
115
+ timeoutMs: config.sdkTimeoutMs,
116
+ signal: options.signal,
117
+ onEvent: options.onEvent,
118
+ outputSchema: options.outputSchema,
119
+ structuredResponse,
120
+ });
121
+ return finalize(options.onEvent, completedFromSdk(taskId, execution, options.model));
122
+ }
123
+ catch (error) {
124
+ return finalize(options.onEvent, failedResult(taskId, backend, error));
125
+ }
126
+ }
127
+ export async function generateImage(options) {
128
+ opportunisticGc();
129
+ const taskId = randomUUID();
130
+ const backend = options.backend ?? "direct";
131
+ emit(options.onEvent, { type: "started", taskId, backend, kind: "image" });
132
+ try {
133
+ if (backend === "direct") {
134
+ const execution = await executeDirectImage(taskId, options);
135
+ return finalize(options.onEvent, {
136
+ status: "completed",
137
+ taskId,
138
+ backend,
139
+ text: `Generated ${execution.artifacts.length} image(s).`,
140
+ effectiveModel: execution.model.model,
141
+ reasoningEffort: execution.model.reasoning,
142
+ artifacts: execution.artifacts,
143
+ usage: execution.usage,
144
+ });
145
+ }
146
+ const execution = await executeSdkImage(taskId, options);
147
+ return finalize(options.onEvent, completedFromSdk(taskId, execution, options.model));
148
+ }
149
+ catch (error) {
150
+ return finalize(options.onEvent, failedResult(taskId, backend, error));
151
+ }
152
+ }
153
+ async function executeSdkImage(taskId, options) {
154
+ const validated = validateImageOptions(options);
155
+ const expected = Array.from({ length: validated.count }, (_, index) => outputPathForImage(taskId, options.output, index, validated.count));
156
+ for (const target of expected) {
157
+ if (existsSync(target.path) && !validated.overwrite) {
158
+ throw usageError(`output already exists: ${target.path}; pass --overwrite to replace it`);
159
+ }
160
+ ensureDir(dirname(target.path));
161
+ }
162
+ const config = loadConfig({ sdkTimeoutMs: options.timeoutMs, codexHome: options.codexHome });
163
+ const text = [
164
+ "Use the $imagegen skill to generate or edit images for the request below.",
165
+ `Generate exactly ${validated.count} image(s).`,
166
+ `Requested size=${validated.size}, quality=${validated.quality}, background=${validated.background}.`,
167
+ `Copy the final PNG files to these exact absolute paths:\n${expected.map((item) => `- ${item.path}`).join("\n")}`,
168
+ "Only report those paths in artifacts after verifying the files exist.",
169
+ "Image request:",
170
+ options.prompt,
171
+ ].join("\n\n");
172
+ const input = [
173
+ { type: "text", text: buildWorkspacePrompt(text, options.instructions, true) },
174
+ ...validated.imagePaths.map((path) => ({ type: "local_image", path })),
175
+ ];
176
+ const execution = await runSdkTurn({
177
+ taskId,
178
+ prompt: input,
179
+ workingDirectory: resolveWorkingDirectory(options.workingDirectory),
180
+ sandboxMode: "danger-full-access",
181
+ networkAccess: true,
182
+ noFollowup: true,
183
+ model: options.model,
184
+ reasoning: options.reasoning,
185
+ timeoutMs: config.sdkTimeoutMs,
186
+ signal: options.signal,
187
+ onEvent: options.onEvent,
188
+ });
189
+ const artifacts = [];
190
+ for (const target of expected) {
191
+ if (!existsSync(target.path)) {
192
+ throw new CodexTaskError("SDK_IMAGE_MISSING", `Codex SDK did not create ${target.path}`);
193
+ }
194
+ artifacts.push({
195
+ path: target.path,
196
+ kind: "image",
197
+ mimeType: "image/png",
198
+ sizeBytes: statSync(target.path).size,
199
+ expiresAt: target.temporary ? new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString() : undefined,
200
+ });
201
+ }
202
+ return { ...execution, artifacts };
203
+ }
204
+ export async function runTask(options) {
205
+ opportunisticGc();
206
+ const taskId = randomUUID();
207
+ emit(options.onEvent, { type: "started", taskId, backend: "sdk", kind: "task" });
208
+ try {
209
+ if (options.backend !== "sdk")
210
+ throw usageError("workspace task requires --backend sdk");
211
+ const config = loadConfig({ sdkTimeoutMs: options.timeoutMs, codexHome: options.codexHome });
212
+ const workingDirectory = resolveWorkingDirectory(options.workingDirectory);
213
+ const execution = await runSdkTurn({
214
+ taskId,
215
+ prompt: buildWorkspacePrompt(options.prompt, options.instructions, options.noFollowup ?? false),
216
+ workingDirectory,
217
+ sandboxMode: options.sandboxMode ?? "danger-full-access",
218
+ networkAccess: options.networkAccess ?? true,
219
+ noFollowup: options.noFollowup ?? false,
220
+ model: options.model,
221
+ reasoning: options.reasoning,
222
+ timeoutMs: config.sdkTimeoutMs,
223
+ signal: options.signal,
224
+ onEvent: options.onEvent,
225
+ });
226
+ const result = await resultFromSdkTask(taskId, execution, options, workingDirectory);
227
+ return finalize(options.onEvent, result);
228
+ }
229
+ catch (error) {
230
+ return finalize(options.onEvent, failedResult(taskId, "sdk", error));
231
+ }
232
+ }
233
+ async function resultFromSdkTask(taskId, execution, options, workingDirectory) {
234
+ const base = {
235
+ taskId,
236
+ backend: "sdk",
237
+ threadId: execution.threadId,
238
+ text: execution.text,
239
+ effectiveModel: options.model,
240
+ reasoningEffort: options.reasoning,
241
+ artifacts: reportedArtifacts(execution),
242
+ changes: execution.changes,
243
+ commands: execution.commands,
244
+ usage: execution.usage,
245
+ };
246
+ if (execution.status === "needs_input") {
247
+ await savePendingTask({
248
+ taskId,
249
+ threadId: execution.threadId,
250
+ workingDirectory,
251
+ createdAt: new Date().toISOString(),
252
+ sandboxMode: options.sandboxMode ?? "danger-full-access",
253
+ networkAccess: options.networkAccess ?? true,
254
+ model: options.model,
255
+ reasoning: options.reasoning,
256
+ noFollowup: options.noFollowup ?? false,
257
+ });
258
+ return { ...base, status: "needs_input", questions: execution.questions };
259
+ }
260
+ if (execution.status === "failed") {
261
+ return {
262
+ ...base,
263
+ status: "failed",
264
+ error: { code: "SDK_TASK_REPORTED_FAILURE", message: execution.text, retryable: false },
265
+ };
266
+ }
267
+ return { ...base, status: "completed" };
268
+ }
269
+ export async function resumeTask(options) {
270
+ opportunisticGc();
271
+ const stored = loadPendingTask(options.taskId);
272
+ emit(options.onEvent, { type: "started", taskId: stored.taskId, backend: "sdk", kind: "resume" });
273
+ try {
274
+ const config = loadConfig({ sdkTimeoutMs: options.timeoutMs, codexHome: options.codexHome });
275
+ const noFollowup = options.noFollowup ?? stored.noFollowup;
276
+ const execution = await runSdkTurn({
277
+ taskId: stored.taskId,
278
+ threadId: stored.threadId,
279
+ prompt: buildWorkspacePrompt(`Caller answer:\n${options.answer}\n\nContinue the delegated task.`, options.instructions, noFollowup),
280
+ workingDirectory: stored.workingDirectory,
281
+ sandboxMode: stored.sandboxMode,
282
+ networkAccess: stored.networkAccess,
283
+ noFollowup,
284
+ model: options.model ?? stored.model,
285
+ reasoning: options.reasoning ?? stored.reasoning,
286
+ timeoutMs: config.sdkTimeoutMs,
287
+ signal: options.signal,
288
+ onEvent: options.onEvent,
289
+ });
290
+ const taskOptions = {
291
+ prompt: options.answer,
292
+ backend: "sdk",
293
+ workingDirectory: stored.workingDirectory,
294
+ sandboxMode: stored.sandboxMode,
295
+ networkAccess: stored.networkAccess,
296
+ noFollowup,
297
+ model: options.model ?? stored.model,
298
+ reasoning: options.reasoning ?? stored.reasoning,
299
+ };
300
+ const result = await resultFromSdkTask(stored.taskId, execution, taskOptions, stored.workingDirectory);
301
+ if (result.status !== "needs_input")
302
+ deletePendingTask(stored.taskId);
303
+ return finalize(options.onEvent, result);
304
+ }
305
+ catch (error) {
306
+ return finalize(options.onEvent, failedResult(stored.taskId, "sdk", error));
307
+ }
308
+ }
309
+ function completedFromSdk(taskId, execution, effectiveModel) {
310
+ if (execution.status !== "completed") {
311
+ throw new CodexTaskError("SDK_TASK_INCOMPLETE", execution.text || "SDK task did not complete", {
312
+ details: execution.questions,
313
+ });
314
+ }
315
+ return {
316
+ status: "completed",
317
+ taskId,
318
+ backend: "sdk",
319
+ threadId: execution.threadId,
320
+ text: execution.text,
321
+ effectiveModel,
322
+ artifacts: reportedArtifacts(execution),
323
+ changes: execution.changes,
324
+ commands: execution.commands,
325
+ usage: execution.usage,
326
+ };
327
+ }
328
+ export async function* streamTaskEvents(request) {
329
+ const queue = new EventQueue();
330
+ const original = request.options.onEvent;
331
+ const onEvent = (event) => {
332
+ original?.(event);
333
+ queue.push(event);
334
+ };
335
+ const promise = dispatch({
336
+ ...request,
337
+ options: { ...request.options, onEvent },
338
+ }).finally(() => queue.close());
339
+ for await (const event of queue)
340
+ yield event;
341
+ await promise;
342
+ }
343
+ export function dispatch(request) {
344
+ switch (request.kind) {
345
+ case "text":
346
+ return generateText(request.options);
347
+ case "image":
348
+ return generateImage(request.options);
349
+ case "task":
350
+ return runTask(request.options);
351
+ case "resume":
352
+ return resumeTask(request.options);
353
+ }
354
+ }
355
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare function tokenExpiry(accessToken: string): number | undefined;
2
+ export declare function isTokenExpired(accessToken: string): boolean;
3
+ export declare function ensureDirectAuth(codexHome: string, proxy?: string): Promise<{
4
+ accessToken: string;
5
+ accountId: string;
6
+ expiresAt?: number | undefined;
7
+ }>;
8
+ export declare function inspectDirectAuth(codexHome: string): {
9
+ found: boolean;
10
+ valid: boolean;
11
+ expiresAt?: number | undefined;
12
+ message: string;
13
+ };
14
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/auth.ts"],"names":[],"mappings":"AA+BA,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGnE;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG3D;AA+DD,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAkDrF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB,CAaA"}
@@ -0,0 +1,152 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { atomicWrite, withFileLock } from "../../fs-utils.js";
4
+ import { CodexTaskError } from "../../errors.js";
5
+ import { ImpersonatedSession } from "./http.js";
6
+ const TOKEN_REFRESH_URL = "https://auth.openai.com/oauth/token";
7
+ const OAUTH_CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
8
+ const EXPIRY_BUFFER_MS = 5 * 60 * 1000;
9
+ function authPath(codexHome) {
10
+ return join(codexHome, "auth.json");
11
+ }
12
+ function decodeJwtPayload(jwt) {
13
+ const payload = jwt.split(".")[1];
14
+ if (!payload)
15
+ return undefined;
16
+ try {
17
+ return JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
18
+ }
19
+ catch {
20
+ return undefined;
21
+ }
22
+ }
23
+ export function tokenExpiry(accessToken) {
24
+ const expiry = decodeJwtPayload(accessToken)?.["exp"];
25
+ return typeof expiry === "number" ? expiry * 1000 : undefined;
26
+ }
27
+ export function isTokenExpired(accessToken) {
28
+ const expiry = tokenExpiry(accessToken);
29
+ return expiry === undefined || Date.now() >= expiry - EXPIRY_BUFFER_MS;
30
+ }
31
+ function extractAccountId(accessToken) {
32
+ const auth = decodeJwtPayload(accessToken)?.["https://api.openai.com/auth"];
33
+ if (!auth || typeof auth !== "object")
34
+ return undefined;
35
+ const accountId = auth["chatgpt_account_id"];
36
+ return typeof accountId === "string" ? accountId : undefined;
37
+ }
38
+ function loadAuthDocument(codexHome) {
39
+ const path = authPath(codexHome);
40
+ if (!existsSync(path)) {
41
+ throw new CodexTaskError("AUTH_NOT_FOUND", `No Codex login found at ${path}. Run codex login first.`, {
42
+ exitCode: 2,
43
+ });
44
+ }
45
+ try {
46
+ return JSON.parse(readFileSync(path, "utf8"));
47
+ }
48
+ catch (error) {
49
+ throw new CodexTaskError("AUTH_INVALID", `Could not parse ${path}`, { exitCode: 2, cause: error });
50
+ }
51
+ }
52
+ function tokensFromDocument(document) {
53
+ const tokens = document["tokens"];
54
+ if (!tokens?.access_token) {
55
+ throw new CodexTaskError("AUTH_INVALID", "Codex auth.json has no OAuth access token. Run codex login.", {
56
+ exitCode: 2,
57
+ });
58
+ }
59
+ return {
60
+ access_token: tokens.access_token,
61
+ id_token: tokens.id_token ?? "",
62
+ refresh_token: tokens.refresh_token ?? "",
63
+ account_id: tokens.account_id ?? "",
64
+ };
65
+ }
66
+ async function refreshTokens(refreshToken, proxy) {
67
+ const session = new ImpersonatedSession(15_000, proxy);
68
+ try {
69
+ const response = await session.post(TOKEN_REFRESH_URL, { "Content-Type": "application/json" }, JSON.stringify({ grant_type: "refresh_token", refresh_token: refreshToken, client_id: OAUTH_CLIENT_ID }));
70
+ if (response.status < 200 || response.status >= 300) {
71
+ throw new CodexTaskError("AUTH_REFRESH_FAILED", `Codex token refresh failed with HTTP ${response.status}`, {
72
+ details: response.text.slice(0, 300),
73
+ });
74
+ }
75
+ const value = JSON.parse(response.text);
76
+ return {
77
+ access_token: typeof value["access_token"] === "string" ? value["access_token"] : "",
78
+ id_token: typeof value["id_token"] === "string" ? value["id_token"] : "",
79
+ refresh_token: typeof value["refresh_token"] === "string" ? value["refresh_token"] : refreshToken,
80
+ account_id: "",
81
+ };
82
+ }
83
+ finally {
84
+ session.close();
85
+ }
86
+ }
87
+ export async function ensureDirectAuth(codexHome, proxy) {
88
+ const initial = tokensFromDocument(loadAuthDocument(codexHome));
89
+ if (!isTokenExpired(initial.access_token)) {
90
+ return {
91
+ accessToken: initial.access_token,
92
+ accountId: extractAccountId(initial.access_token) ?? initial.account_id,
93
+ expiresAt: tokenExpiry(initial.access_token),
94
+ };
95
+ }
96
+ if (!initial.refresh_token) {
97
+ throw new CodexTaskError("AUTH_EXPIRED", "Codex OAuth token expired and has no refresh token. Run codex login.", {
98
+ exitCode: 2,
99
+ });
100
+ }
101
+ const path = authPath(codexHome);
102
+ return withFileLock(`${path}.codex-task.lock`, async () => {
103
+ const latestDocument = loadAuthDocument(codexHome);
104
+ const latest = tokensFromDocument(latestDocument);
105
+ if (!isTokenExpired(latest.access_token)) {
106
+ return {
107
+ accessToken: latest.access_token,
108
+ accountId: extractAccountId(latest.access_token) ?? latest.account_id,
109
+ expiresAt: tokenExpiry(latest.access_token),
110
+ };
111
+ }
112
+ const refreshed = await refreshTokens(latest.refresh_token || initial.refresh_token, proxy);
113
+ if (!refreshed.access_token) {
114
+ throw new CodexTaskError("AUTH_REFRESH_FAILED", "Codex token refresh returned no access token");
115
+ }
116
+ const accountId = extractAccountId(refreshed.access_token) ?? latest.account_id;
117
+ const previousTokens = latestDocument["tokens"] ?? {};
118
+ const merged = {
119
+ ...latestDocument,
120
+ tokens: {
121
+ ...previousTokens,
122
+ access_token: refreshed.access_token,
123
+ ...(refreshed.id_token ? { id_token: refreshed.id_token } : {}),
124
+ ...(refreshed.refresh_token ? { refresh_token: refreshed.refresh_token } : {}),
125
+ ...(accountId ? { account_id: accountId } : {}),
126
+ },
127
+ last_refresh: new Date().toISOString(),
128
+ };
129
+ atomicWrite(path, JSON.stringify(merged, null, 2), 0o600);
130
+ return {
131
+ accessToken: refreshed.access_token,
132
+ accountId,
133
+ expiresAt: tokenExpiry(refreshed.access_token),
134
+ };
135
+ });
136
+ }
137
+ export function inspectDirectAuth(codexHome) {
138
+ try {
139
+ const tokens = tokensFromDocument(loadAuthDocument(codexHome));
140
+ const expiresAt = tokenExpiry(tokens.access_token);
141
+ return {
142
+ found: true,
143
+ valid: !isTokenExpired(tokens.access_token),
144
+ expiresAt,
145
+ message: expiresAt ? `OAuth token expires at ${new Date(expiresAt).toISOString()}` : "OAuth token expiry is unreadable",
146
+ };
147
+ }
148
+ catch (error) {
149
+ return { found: false, valid: false, message: error instanceof Error ? error.message : String(error) };
150
+ }
151
+ }
152
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/backends/direct/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare function directTransportAvailable(): boolean;
2
+ export interface HttpResponse {
3
+ status: number;
4
+ text: string;
5
+ }
6
+ export declare class ImpersonatedSession {
7
+ private readonly session;
8
+ constructor(timeoutMs: number, proxy?: string);
9
+ post(url: string, headers: Record<string, string>, body: string): Promise<HttpResponse>;
10
+ close(): void;
11
+ }
12
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/http.ts"],"names":[],"mappings":"AAuCA,wBAAgB,wBAAwB,IAAI,OAAO,CAOlD;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAkBvC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ7F,KAAK,IAAI,IAAI;CAOd"}
@@ -0,0 +1,62 @@
1
+ import { createRequire } from "node:module";
2
+ import { CodexTaskError } from "../../errors.js";
3
+ const require = createRequire(import.meta.url);
4
+ let requests;
5
+ function loadRequests() {
6
+ if (requests)
7
+ return requests;
8
+ try {
9
+ const module = require("@ossiana/node-libcurl");
10
+ if (!module.requests)
11
+ throw new Error("module does not export requests");
12
+ requests = module.requests;
13
+ return requests;
14
+ }
15
+ catch (error) {
16
+ throw new CodexTaskError("DIRECT_UNAVAILABLE", "The Direct native transport is unavailable on this platform. Install @ossiana/node-libcurl or use --backend sdk.", { exitCode: 2, cause: error });
17
+ }
18
+ }
19
+ export function directTransportAvailable() {
20
+ try {
21
+ loadRequests();
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export class ImpersonatedSession {
29
+ session;
30
+ constructor(timeoutMs, proxy) {
31
+ const effectiveProxy = proxy ??
32
+ process.env["CODEX_TASK_PROXY"] ??
33
+ process.env["CODEXERRAND_PROXY"] ??
34
+ process.env["ALL_PROXY"] ??
35
+ process.env["HTTPS_PROXY"] ??
36
+ process.env["https_proxy"];
37
+ this.session = loadRequests().session({
38
+ ja3: "auto",
39
+ akamai: "auto",
40
+ httpVersion: "http2",
41
+ redirect: false,
42
+ timeout: Math.max(1, Math.ceil(timeoutMs / 1000)),
43
+ ...(effectiveProxy ? { proxy: effectiveProxy } : {}),
44
+ });
45
+ }
46
+ async post(url, headers, body) {
47
+ const response = await this.session.post(url, { headers, data: body });
48
+ return {
49
+ status: response.status ?? response.responseStatus ?? 0,
50
+ text: response.text ?? response.responseText ?? "",
51
+ };
52
+ }
53
+ close() {
54
+ try {
55
+ this.session.close();
56
+ }
57
+ catch {
58
+ // Native teardown is best effort.
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/backends/direct/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAkB/C,IAAI,QAAoC,CAAC;AAEzC,SAAS,YAAY;IACnB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAkC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACzE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,cAAc,CACtB,oBAAoB,EACpB,kHAAkH,EAClH,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAC9B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC;QACH,YAAY,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAOD,MAAM,OAAO,mBAAmB;IACb,OAAO,CAAgB;IAExC,YAAY,SAAiB,EAAE,KAAc;QAC3C,MAAM,cAAc,GAClB,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC;YACpC,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,OAAO;YACpB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;YACjD,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,OAA+B,EAAE,IAAY;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,cAAc,IAAI,CAAC;YACvD,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,YAAY,IAAI,EAAE;SACnD,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export interface DirectIdentity {
2
+ installationId: string;
3
+ codexVersion: string;
4
+ osType: string;
5
+ osVersion: string;
6
+ arch: string;
7
+ }
8
+ export declare function loadOrCreateIdentity(codexHome: string): DirectIdentity;
9
+ export declare function buildUserAgent(identity: DirectIdentity): string;
10
+ export declare function platformSandboxTag(): string;
11
+ //# sourceMappingURL=identity.d.ts.map