codex-task 0.2.9 → 0.2.11
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 +1 -1
- package/README.md +2 -2
- package/README_EN.md +3 -3
- package/dist/backends/direct/auth.d.ts +2 -1
- package/dist/backends/direct/auth.d.ts.map +1 -1
- package/dist/backends/direct/auth.js +4 -4
- package/dist/backends/direct/auth.js.map +1 -1
- package/dist/backends/direct/http.d.ts +3 -1
- package/dist/backends/direct/http.d.ts.map +1 -1
- package/dist/backends/direct/http.js +14 -10
- package/dist/backends/direct/http.js.map +1 -1
- package/dist/backends/direct/identity.d.ts +15 -0
- package/dist/backends/direct/identity.d.ts.map +1 -1
- package/dist/backends/direct/identity.js +45 -2
- package/dist/backends/direct/identity.js.map +1 -1
- package/dist/backends/direct/index.d.ts +2 -0
- package/dist/backends/direct/index.d.ts.map +1 -1
- package/dist/backends/direct/index.js +9 -5
- package/dist/backends/direct/index.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +8 -0
- package/dist/doctor.js.map +1 -1
- package/package.json +1 -1
- package/scripts/service/install-ubuntu.sh +25 -1
package/README.md
CHANGED
|
@@ -165,7 +165,7 @@ printf '%s' "总热量控制在 700 kcal 内" | codex-task text "制定调整建
|
|
|
165
165
|
| 本地 Codex skills | 不支持 | 按 Codex 正常发现 |
|
|
166
166
|
| 底层 | 非官方 ChatGPT Codex Responses | 官方 `@openai/codex-sdk` |
|
|
167
167
|
|
|
168
|
-
Direct 复用 `$CODEX_HOME/auth.json`、Codex installation metadata、TLS impersonation 和 ChatGPT 私有 Codex Responses
|
|
168
|
+
Direct 复用 `$CODEX_HOME/auth.json`、Codex installation metadata、TLS impersonation 和 ChatGPT 私有 Codex Responses 接口。每个安装会持久化一个显式的现代 Chrome TLS/HTTP2 profile,避免 native transport 的平台相关 `auto` 指纹在 Linux 上触发 HTML 403;`codex-task doctor` 会显示当前 profile。输入仍会发往 ChatGPT,接口可能随时变化。Direct 只返回生成结果,不能读项目、运行 shell、调用本地 MCP 或使用 worker skills。
|
|
169
169
|
|
|
170
170
|
SDK task 默认权限为:
|
|
171
171
|
|
|
@@ -218,7 +218,7 @@ skilltruck install https://github.com/wangyendt/codex-task --global
|
|
|
218
218
|
| 查询进度 | `GET /v1/jobs/:jobId` |
|
|
219
219
|
| 下载产物 | `GET /v1/jobs/:jobId/artifacts/:index` |
|
|
220
220
|
|
|
221
|
-
已经全局安装 CodexTask 后,运行一次 `codex-task setup` 即可自动识别 macOS、Linux 或 Windows,生成随机 token
|
|
221
|
+
已经全局安装 CodexTask 后,运行一次 `codex-task setup` 即可自动识别 macOS、Linux 或 Windows,生成随机 token、创建用户级自启动项并立即启动服务。Linux 会默认启用当前用户的 systemd linger,让服务在机器启动、用户尚未登录时也能运行;首次设置可能要求输入 `sudo` 密码:
|
|
222
222
|
|
|
223
223
|
```bash
|
|
224
224
|
codex-task setup
|
package/README_EN.md
CHANGED
|
@@ -115,7 +115,7 @@ Text is composed in a stable order: positional prompt, prompt files in command-l
|
|
|
115
115
|
| Local Codex skills | No | Normal Codex discovery |
|
|
116
116
|
| Transport | Unofficial ChatGPT Codex Responses | Official `@openai/codex-sdk` |
|
|
117
117
|
|
|
118
|
-
Direct reuses `$CODEX_HOME/auth.json`, Codex installation metadata, TLS impersonation, and the private ChatGPT Codex Responses endpoint. Inputs are still sent to ChatGPT, and the interface may change without notice. Direct cannot read a repository, run local tools, call local MCP, or use worker skills.
|
|
118
|
+
Direct reuses `$CODEX_HOME/auth.json`, Codex installation metadata, TLS impersonation, and the private ChatGPT Codex Responses endpoint. Each installation persists an explicit modern Chrome TLS/HTTP2 profile instead of relying on the native transport's platform-dependent `auto` fingerprint, which can trigger an HTML 403 on Linux. `codex-task doctor` shows the active profile. Inputs are still sent to ChatGPT, and the interface may change without notice. Direct cannot read a repository, run local tools, call local MCP, or use worker skills.
|
|
119
119
|
|
|
120
120
|
SDK tasks default to `sandbox=danger-full-access`, `approval=never`, and `network=true`. With these settings, the worker can access paths outside the workspace, run commands, and use the network without waiting for approval. Delegate only trusted prompts and projects; use `--sandbox workspace-write` or `--no-network` when needed.
|
|
121
121
|
|
|
@@ -162,7 +162,7 @@ Default stdout is one JSON result; `--stream` produces JSONL item/task progress.
|
|
|
162
162
|
|
|
163
163
|
## Self-hosted service and mobile clients
|
|
164
164
|
|
|
165
|
-
`codex-task serve` exposes text, image, workspace, and resume work as authenticated asynchronous HTTP jobs. After installing CodexTask globally, run `codex-task setup` once to detect macOS, Linux, or Windows, generate a random token, install the native user-level startup entry, and start it immediately.
|
|
165
|
+
`codex-task serve` exposes text, image, workspace, and resume work as authenticated asynchronous HTTP jobs. After installing CodexTask globally, run `codex-task setup` once to detect macOS, Linux, or Windows, generate a random token, install the native user-level startup entry, and start it immediately. On Linux, setup enables systemd user linger by default so the service starts at boot before login; the first setup may request the user's `sudo` password.
|
|
166
166
|
|
|
167
167
|
The default proxy mode is `auto`. Every Direct request checks `ALL_PROXY`, `HTTPS_PROXY`, and `HTTP_PROXY`, then the current operating-system proxy. Toggling the system proxy or changing its port does not require reinstalling the service, and no port such as `7890` is assumed. Use `codex-task setup --proxy socks5h://127.0.0.1:PORT` for a fixed proxy or `codex-task setup --no-proxy` to force direct connections. The command also accepts `--host`, `--port`, and `--max-concurrency`. Running it again updates and restarts the service without replacing its existing token.
|
|
168
168
|
|
|
@@ -208,7 +208,7 @@ npm run verify
|
|
|
208
208
|
|
|
209
209
|
`verify` runs lint, workflow checks, type checking, tests, build, package inspection, and a clean install/import smoke test. Live Direct endpoint tests are manual-only: `RUN_DIRECT_E2E=1 npm run test:e2e`.
|
|
210
210
|
|
|
211
|
-
|
|
211
|
+
Core package changes pushed to `main` publish a patch release; documentation-only changes do not. See [release setup](./docs/RELEASING.md).
|
|
212
212
|
|
|
213
213
|
The Direct backend derives in part from MIT-licensed [`lawrencewzen/imgen`](https://github.com/lawrencewzen/imgen); see [third-party notices](./THIRD_PARTY_NOTICES.md).
|
|
214
214
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { DirectTlsProfile } from "./identity.js";
|
|
1
2
|
export declare function tokenExpiry(accessToken: string): number | undefined;
|
|
2
3
|
export declare function isTokenExpired(accessToken: string): boolean;
|
|
3
|
-
export declare function ensureDirectAuth(codexHome: string, proxy?: string): Promise<{
|
|
4
|
+
export declare function ensureDirectAuth(codexHome: string, proxy?: string, tls?: DirectTlsProfile): Promise<{
|
|
4
5
|
accessToken: string;
|
|
5
6
|
accountId: string;
|
|
6
7
|
expiresAt?: number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/auth.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA2BtD,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,EACd,GAAG,CAAC,EAAE,gBAAgB,GACrB,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"}
|
|
@@ -63,8 +63,8 @@ function tokensFromDocument(document) {
|
|
|
63
63
|
account_id: tokens.account_id ?? "",
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
|
-
async function refreshTokens(refreshToken, proxy) {
|
|
67
|
-
const session = new ImpersonatedSession(15_000, proxy);
|
|
66
|
+
async function refreshTokens(refreshToken, proxy, tls) {
|
|
67
|
+
const session = new ImpersonatedSession(15_000, proxy, tls);
|
|
68
68
|
try {
|
|
69
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
70
|
if (response.status < 200 || response.status >= 300) {
|
|
@@ -84,7 +84,7 @@ async function refreshTokens(refreshToken, proxy) {
|
|
|
84
84
|
session.close();
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
export async function ensureDirectAuth(codexHome, proxy) {
|
|
87
|
+
export async function ensureDirectAuth(codexHome, proxy, tls) {
|
|
88
88
|
const initial = tokensFromDocument(loadAuthDocument(codexHome));
|
|
89
89
|
if (!isTokenExpired(initial.access_token)) {
|
|
90
90
|
return {
|
|
@@ -109,7 +109,7 @@ export async function ensureDirectAuth(codexHome, proxy) {
|
|
|
109
109
|
expiresAt: tokenExpiry(latest.access_token),
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
|
-
const refreshed = await refreshTokens(latest.refresh_token || initial.refresh_token, proxy);
|
|
112
|
+
const refreshed = await refreshTokens(latest.refresh_token || initial.refresh_token, proxy, tls);
|
|
113
113
|
if (!refreshed.access_token) {
|
|
114
114
|
throw new CodexTaskError("AUTH_REFRESH_FAILED", "Codex token refresh returned no access token");
|
|
115
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/backends/direct/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/backends/direct/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { type DirectTlsProfile } from "./identity.js";
|
|
1
2
|
export declare function directTransportAvailable(): boolean;
|
|
2
3
|
export interface HttpResponse {
|
|
3
4
|
status: number;
|
|
4
5
|
text: string;
|
|
5
6
|
}
|
|
7
|
+
export declare function directSessionOptions(timeoutMs: number, proxy: string | undefined, tls: DirectTlsProfile): Record<string, unknown>;
|
|
6
8
|
export declare class ImpersonatedSession {
|
|
7
9
|
private readonly session;
|
|
8
|
-
constructor(timeoutMs: number, proxy?: string);
|
|
10
|
+
constructor(timeoutMs: number, proxy?: string, tls?: DirectTlsProfile);
|
|
9
11
|
post(url: string, headers: Record<string, string>, body: string): Promise<HttpResponse>;
|
|
10
12
|
close(): void;
|
|
11
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/http.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAsCvB,wBAAgB,wBAAwB,IAAI,OAAO,CAOlD;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,gBAAgB,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAGtC,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,GAAE,gBAA6C;IAK9C,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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import { CodexTaskError } from "../../errors.js";
|
|
3
3
|
import { resolveEffectiveProxy } from "../../system-proxy.js";
|
|
4
|
+
import { DEFAULT_DIRECT_TLS_PROFILE, } from "./identity.js";
|
|
4
5
|
const require = createRequire(import.meta.url);
|
|
5
6
|
let requests;
|
|
6
7
|
function loadRequests() {
|
|
@@ -26,18 +27,21 @@ export function directTransportAvailable() {
|
|
|
26
27
|
return false;
|
|
27
28
|
}
|
|
28
29
|
}
|
|
30
|
+
export function directSessionOptions(timeoutMs, proxy, tls) {
|
|
31
|
+
const effectiveProxy = resolveEffectiveProxy({ configuredProxy: proxy });
|
|
32
|
+
return {
|
|
33
|
+
ja3: tls.ja3,
|
|
34
|
+
akamai: tls.akamai,
|
|
35
|
+
httpVersion: "http2",
|
|
36
|
+
redirect: false,
|
|
37
|
+
timeout: Math.max(1, Math.ceil(timeoutMs / 1000)),
|
|
38
|
+
...(effectiveProxy ? { proxy: effectiveProxy } : {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
29
41
|
export class ImpersonatedSession {
|
|
30
42
|
session;
|
|
31
|
-
constructor(timeoutMs, proxy) {
|
|
32
|
-
|
|
33
|
-
this.session = loadRequests().session({
|
|
34
|
-
ja3: "auto",
|
|
35
|
-
akamai: "auto",
|
|
36
|
-
httpVersion: "http2",
|
|
37
|
-
redirect: false,
|
|
38
|
-
timeout: Math.max(1, Math.ceil(timeoutMs / 1000)),
|
|
39
|
-
...(effectiveProxy ? { proxy: effectiveProxy } : {}),
|
|
40
|
-
});
|
|
43
|
+
constructor(timeoutMs, proxy, tls = DEFAULT_DIRECT_TLS_PROFILE) {
|
|
44
|
+
this.session = loadRequests().session(directSessionOptions(timeoutMs, proxy, tls));
|
|
41
45
|
}
|
|
42
46
|
async post(url, headers, body) {
|
|
43
47
|
const response = await this.session.post(url, { headers, data: body });
|
|
@@ -1 +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;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
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;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACL,0BAA0B,GAE3B,MAAM,eAAe,CAAC;AAEvB,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,UAAU,oBAAoB,CAClC,SAAiB,EACjB,KAAyB,EACzB,GAAqB;IAErB,MAAM,cAAc,GAAG,qBAAqB,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,WAAW,EAAE,OAAO;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACjD,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,mBAAmB;IACb,OAAO,CAAgB;IAExC,YACE,SAAiB,EACjB,KAAc,EACd,MAAwB,0BAA0B;QAElD,IAAI,CAAC,OAAO,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACrF,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"}
|
|
@@ -1,10 +1,25 @@
|
|
|
1
1
|
export interface DirectIdentity {
|
|
2
|
+
tls: DirectTlsProfile;
|
|
2
3
|
installationId: string;
|
|
3
4
|
codexVersion: string;
|
|
4
5
|
osType: string;
|
|
5
6
|
osVersion: string;
|
|
6
7
|
arch: string;
|
|
7
8
|
}
|
|
9
|
+
export interface DirectTlsProfile {
|
|
10
|
+
label: string;
|
|
11
|
+
ja3: string;
|
|
12
|
+
akamai: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Explicit profiles supported by @ossiana/node-libcurl. `auto` is intentionally
|
|
16
|
+
* avoided: its platform-dependent choice is rejected by ChatGPT's frontend on
|
|
17
|
+
* some Linux hosts even when the same OAuth account and proxy work in Codex CLI.
|
|
18
|
+
*/
|
|
19
|
+
export declare const DIRECT_TLS_PROFILES: readonly DirectTlsProfile[];
|
|
20
|
+
export declare const DEFAULT_DIRECT_TLS_PROFILE: DirectTlsProfile;
|
|
21
|
+
/** Returns the persisted profile, or the profile a future Direct request will persist. */
|
|
22
|
+
export declare function inspectDirectTlsProfile(): DirectTlsProfile;
|
|
8
23
|
export declare function loadOrCreateIdentity(codexHome: string): DirectIdentity;
|
|
9
24
|
export declare function buildUserAgent(identity: DirectIdentity): string;
|
|
10
25
|
export declare function platformSandboxTag(): string;
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/backends/direct/identity.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,gBAAgB,CAAC;IACtB,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;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,gBAAgB,EAI1D,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,gBAA8C,CAAC;AAcxF,0FAA0F;AAC1F,wBAAgB,uBAAuB,IAAI,gBAAgB,CAW1D;AA+CD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAuBtE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAE/D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C"}
|
|
@@ -5,6 +5,43 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { appPaths } from "../../paths.js";
|
|
7
7
|
import { atomicWrite } from "../../fs-utils.js";
|
|
8
|
+
/**
|
|
9
|
+
* Explicit profiles supported by @ossiana/node-libcurl. `auto` is intentionally
|
|
10
|
+
* avoided: its platform-dependent choice is rejected by ChatGPT's frontend on
|
|
11
|
+
* some Linux hosts even when the same OAuth account and proxy work in Codex CLI.
|
|
12
|
+
*/
|
|
13
|
+
export const DIRECT_TLS_PROFILES = [
|
|
14
|
+
{ label: "chrome131", ja3: "chrome131", akamai: "chrome119" },
|
|
15
|
+
{ label: "chrome133", ja3: "chrome133", akamai: "chrome119" },
|
|
16
|
+
{ label: "chrome150", ja3: "chrome150", akamai: "chrome119" },
|
|
17
|
+
];
|
|
18
|
+
export const DEFAULT_DIRECT_TLS_PROFILE = DIRECT_TLS_PROFILES.at(-1);
|
|
19
|
+
function pickTlsProfile() {
|
|
20
|
+
return { ...DEFAULT_DIRECT_TLS_PROFILE };
|
|
21
|
+
}
|
|
22
|
+
function isTlsProfile(value) {
|
|
23
|
+
if (!value || typeof value !== "object")
|
|
24
|
+
return false;
|
|
25
|
+
const profile = value;
|
|
26
|
+
return typeof profile["label"] === "string" &&
|
|
27
|
+
typeof profile["ja3"] === "string" && profile["ja3"] !== "auto" &&
|
|
28
|
+
typeof profile["akamai"] === "string" && profile["akamai"] !== "auto";
|
|
29
|
+
}
|
|
30
|
+
/** Returns the persisted profile, or the profile a future Direct request will persist. */
|
|
31
|
+
export function inspectDirectTlsProfile() {
|
|
32
|
+
const path = appPaths().identityPath;
|
|
33
|
+
if (existsSync(path)) {
|
|
34
|
+
try {
|
|
35
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
36
|
+
if (isTlsProfile(value.tls))
|
|
37
|
+
return value.tls;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Report the migration default without mutating invalid state.
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { ...DEFAULT_DIRECT_TLS_PROFILE };
|
|
44
|
+
}
|
|
8
45
|
function detectCodexVersion(codexHome) {
|
|
9
46
|
try {
|
|
10
47
|
const versionPath = join(codexHome, "version.json");
|
|
@@ -59,14 +96,20 @@ export function loadOrCreateIdentity(codexHome) {
|
|
|
59
96
|
if (existsSync(path)) {
|
|
60
97
|
try {
|
|
61
98
|
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
62
|
-
if (value.installationId && value.codexVersion)
|
|
63
|
-
|
|
99
|
+
if (value.installationId && value.codexVersion && value.osType && value.osVersion && value.arch) {
|
|
100
|
+
if (isTlsProfile(value.tls))
|
|
101
|
+
return value;
|
|
102
|
+
const migrated = { ...value, tls: pickTlsProfile() };
|
|
103
|
+
atomicWrite(path, JSON.stringify(migrated, null, 2), 0o600);
|
|
104
|
+
return migrated;
|
|
105
|
+
}
|
|
64
106
|
}
|
|
65
107
|
catch {
|
|
66
108
|
// Replace invalid state.
|
|
67
109
|
}
|
|
68
110
|
}
|
|
69
111
|
const identity = {
|
|
112
|
+
tls: pickTlsProfile(),
|
|
70
113
|
installationId: detectInstallationId(codexHome),
|
|
71
114
|
codexVersion: detectCodexVersion(codexHome),
|
|
72
115
|
...platformInfo(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/backends/direct/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/backends/direct/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ResolvedDirectModel } from "./models.js";
|
|
2
|
+
import { CodexTaskError } from "../../errors.js";
|
|
2
3
|
import type { Artifact, ImageOptions, TextOptions, UsageSummary } from "../../types.js";
|
|
3
4
|
export interface DirectTextExecution {
|
|
4
5
|
text: string;
|
|
@@ -10,6 +11,7 @@ export interface DirectImageExecution {
|
|
|
10
11
|
model: ResolvedDirectModel;
|
|
11
12
|
usage?: UsageSummary | undefined;
|
|
12
13
|
}
|
|
14
|
+
export declare function mapDirectHttpError(status: number, body: string): CodexTaskError;
|
|
13
15
|
export declare function executeDirectText(taskId: string, options: TextOptions & {
|
|
14
16
|
prompt: string;
|
|
15
17
|
}): Promise<DirectTextExecution>;
|
|
@@ -1 +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;
|
|
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;AAKpG,OAAO,EAAE,cAAc,EAAgB,MAAM,iBAAiB,CAAC;AAE/D,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;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAmC/E;AA8ED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA+B/H;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyFlI"}
|
|
@@ -11,8 +11,11 @@ import { validateImageOptions, writePngArtifact } from "../../images.js";
|
|
|
11
11
|
function emit(callback, event) {
|
|
12
12
|
callback?.(event);
|
|
13
13
|
}
|
|
14
|
-
function
|
|
14
|
+
export function mapDirectHttpError(status, body) {
|
|
15
15
|
const detail = body.slice(0, 500);
|
|
16
|
+
if (status === 403 && /^\s*(?:<!doctype\s+html|<html)\b/i.test(body)) {
|
|
17
|
+
return new CodexTaskError("DIRECT_UPSTREAM_BLOCKED", "Direct request was blocked by the ChatGPT frontend with HTTP 403", { details: detail });
|
|
18
|
+
}
|
|
16
19
|
if (status === 401 || status === 403) {
|
|
17
20
|
return new CodexTaskError("DIRECT_AUTH_FAILED", `Direct authentication failed with HTTP ${status}`, {
|
|
18
21
|
details: detail,
|
|
@@ -50,7 +53,7 @@ function normalizeDirectError(error) {
|
|
|
50
53
|
async function sendOnce(context, spec, timeoutMs, proxy, signal) {
|
|
51
54
|
if (signal?.aborted)
|
|
52
55
|
throw new DOMException("The operation was aborted", "AbortError");
|
|
53
|
-
const session = new ImpersonatedSession(timeoutMs, proxy);
|
|
56
|
+
const session = new ImpersonatedSession(timeoutMs, proxy, context.identity.tls);
|
|
54
57
|
const abort = () => session.close();
|
|
55
58
|
signal?.addEventListener("abort", abort, { once: true });
|
|
56
59
|
try {
|
|
@@ -59,7 +62,7 @@ async function sendOnce(context, spec, timeoutMs, proxy, signal) {
|
|
|
59
62
|
if (signal?.aborted)
|
|
60
63
|
throw new DOMException("The operation was aborted", "AbortError");
|
|
61
64
|
if (response.status !== 200)
|
|
62
|
-
throw
|
|
65
|
+
throw mapDirectHttpError(response.status, response.text);
|
|
63
66
|
const parsed = parseDirectResponse(response.text);
|
|
64
67
|
if (!parsed.text && !parsed.image) {
|
|
65
68
|
throw new CodexTaskError("DIRECT_EMPTY_RESPONSE", "Direct backend returned an empty response", {
|
|
@@ -92,11 +95,12 @@ async function sendWithRetry(taskId, context, spec, timeoutMs, retries, proxy, s
|
|
|
92
95
|
}
|
|
93
96
|
}
|
|
94
97
|
async function contextForRequest(codexHome, proxy) {
|
|
95
|
-
const
|
|
98
|
+
const identity = loadOrCreateIdentity(codexHome);
|
|
99
|
+
const auth = await ensureDirectAuth(codexHome, proxy, identity.tls);
|
|
96
100
|
return {
|
|
97
101
|
accessToken: auth.accessToken,
|
|
98
102
|
accountId: auth.accountId,
|
|
99
|
-
identity
|
|
103
|
+
identity,
|
|
100
104
|
sessionId: randomUUID(),
|
|
101
105
|
threadId: randomUUID(),
|
|
102
106
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/direct/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAA4B,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAA0B,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAA6B,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAezE,SAAS,IAAI,CAAC,QAAkD,EAAE,KAAgB;IAChF,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/direct/index.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAsB5D,wBAAgB,SAAS,CAAC,SAAS,SAAqB,GAAG,YAAY,CA6EtE"}
|
package/dist/doctor.js
CHANGED
|
@@ -6,6 +6,7 @@ import { appPaths, defaultCodexHome } from "./paths.js";
|
|
|
6
6
|
import { directTransportAvailable } from "./backends/direct/http.js";
|
|
7
7
|
import { inspectDirectAuth } from "./backends/direct/auth.js";
|
|
8
8
|
import { resolveDirectImageModel, resolveDirectModel } from "./backends/direct/models.js";
|
|
9
|
+
import { inspectDirectTlsProfile } from "./backends/direct/identity.js";
|
|
9
10
|
function codexVersion() {
|
|
10
11
|
try {
|
|
11
12
|
return execFileSync("codex", ["--version"], { timeout: 3000, encoding: "utf8" }).trim();
|
|
@@ -35,6 +36,13 @@ export function runDoctor(codexHome = defaultCodexHome()) {
|
|
|
35
36
|
? "Native Direct transport is available"
|
|
36
37
|
: "Native Direct transport is unavailable; SDK backend can still be used",
|
|
37
38
|
});
|
|
39
|
+
const tls = inspectDirectTlsProfile();
|
|
40
|
+
checks.push({
|
|
41
|
+
name: "direct-fingerprint",
|
|
42
|
+
status: "ok",
|
|
43
|
+
message: `${tls.label} TLS / ${tls.akamai} HTTP/2`,
|
|
44
|
+
details: { ja3: tls.ja3, akamai: tls.akamai },
|
|
45
|
+
});
|
|
38
46
|
const auth = inspectDirectAuth(codexHome);
|
|
39
47
|
checks.push({
|
|
40
48
|
name: "codex-oauth",
|
package/dist/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -13,6 +13,30 @@ unit_file="$user_unit_dir/codex-task.service"
|
|
|
13
13
|
|
|
14
14
|
command -v npm >/dev/null 2>&1 || { echo "npm is required" >&2; exit 1; }
|
|
15
15
|
command -v systemctl >/dev/null 2>&1 || { echo "systemd user services are required" >&2; exit 1; }
|
|
16
|
+
command -v loginctl >/dev/null 2>&1 || { echo "systemd loginctl is required" >&2; exit 1; }
|
|
17
|
+
|
|
18
|
+
current_user="$(id -un)"
|
|
19
|
+
linger_state="$(loginctl show-user "$current_user" -p Linger --value 2>/dev/null || true)"
|
|
20
|
+
if [[ "$linger_state" != "yes" ]]; then
|
|
21
|
+
echo "Enabling systemd user linger for $current_user so CodexTask starts before login."
|
|
22
|
+
if loginctl enable-linger "$current_user"; then
|
|
23
|
+
:
|
|
24
|
+
elif command -v sudo >/dev/null 2>&1 && sudo -n loginctl enable-linger "$current_user"; then
|
|
25
|
+
:
|
|
26
|
+
elif command -v sudo >/dev/null 2>&1 && [[ -t 0 ]]; then
|
|
27
|
+
sudo loginctl enable-linger "$current_user"
|
|
28
|
+
else
|
|
29
|
+
echo "Could not enable systemd user linger for $current_user." >&2
|
|
30
|
+
echo "Run codex-task setup from an interactive terminal with sudo access." >&2
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
linger_state="$(loginctl show-user "$current_user" -p Linger --value 2>/dev/null || true)"
|
|
35
|
+
if [[ "$linger_state" != "yes" ]]; then
|
|
36
|
+
echo "systemd did not report Linger=yes for $current_user after setup." >&2
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
fi
|
|
16
40
|
|
|
17
41
|
if [[ "${CODEX_TASK_SKIP_GLOBAL_INSTALL:-0}" != "1" ]]; then
|
|
18
42
|
npm install -g codex-task@latest
|
|
@@ -66,7 +90,7 @@ echo "URL: http://$service_host:$service_port"
|
|
|
66
90
|
echo "Token: $(<"$token_file")"
|
|
67
91
|
echo "Token file: $token_file"
|
|
68
92
|
echo "Status: systemctl --user status codex-task.service"
|
|
69
|
-
echo "
|
|
93
|
+
echo "User linger: enabled for $current_user (service starts before login)."
|
|
70
94
|
case "$service_proxy" in
|
|
71
95
|
auto|AUTO) echo "Proxy: automatic environment/system detection." ;;
|
|
72
96
|
direct|DIRECT|none|NONE|off|OFF) echo "Proxy: disabled; Direct requests connect directly." ;;
|