@tokensrc/codex 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +74 -0
  2. package/assets/codex-shortcut-icon.icns +0 -0
  3. package/assets/codex-shortcut-icon.ico +0 -0
  4. package/dist/account-display.d.ts +16 -0
  5. package/dist/account-display.js +35 -0
  6. package/dist/account-display.js.map +1 -0
  7. package/dist/bin-app.d.ts +2 -0
  8. package/dist/bin-app.js +12 -0
  9. package/dist/bin-app.js.map +1 -0
  10. package/dist/bin-run.d.ts +2 -0
  11. package/dist/bin-run.js +12 -0
  12. package/dist/bin-run.js.map +1 -0
  13. package/dist/branding.d.ts +2 -0
  14. package/dist/branding.js +8 -0
  15. package/dist/branding.js.map +1 -0
  16. package/dist/cli.d.ts +2 -0
  17. package/dist/cli.js +69 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/client.d.ts +27 -0
  20. package/dist/client.js +177 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/command-directory.d.ts +15 -0
  23. package/dist/command-directory.js +28 -0
  24. package/dist/command-directory.js.map +1 -0
  25. package/dist/commands.d.ts +25 -0
  26. package/dist/commands.js +507 -0
  27. package/dist/commands.js.map +1 -0
  28. package/dist/config.d.ts +36 -0
  29. package/dist/config.js +272 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/console-status.d.ts +58 -0
  32. package/dist/console-status.js +84 -0
  33. package/dist/console-status.js.map +1 -0
  34. package/dist/credentials.d.ts +52 -0
  35. package/dist/credentials.js +130 -0
  36. package/dist/credentials.js.map +1 -0
  37. package/dist/errors.d.ts +19 -0
  38. package/dist/errors.js +40 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/index.d.ts +18 -0
  41. package/dist/index.js +67 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/legacy-cleanup.d.ts +5 -0
  44. package/dist/legacy-cleanup.js +36 -0
  45. package/dist/legacy-cleanup.js.map +1 -0
  46. package/dist/oidc.d.ts +26 -0
  47. package/dist/oidc.js +154 -0
  48. package/dist/oidc.js.map +1 -0
  49. package/dist/private-file.d.ts +3 -0
  50. package/dist/private-file.js +30 -0
  51. package/dist/private-file.js.map +1 -0
  52. package/dist/profile.d.ts +29 -0
  53. package/dist/profile.js +253 -0
  54. package/dist/profile.js.map +1 -0
  55. package/dist/protocol.d.ts +752 -0
  56. package/dist/protocol.js +235 -0
  57. package/dist/protocol.js.map +1 -0
  58. package/dist/quota-cache.d.ts +18 -0
  59. package/dist/quota-cache.js +66 -0
  60. package/dist/quota-cache.js.map +1 -0
  61. package/dist/runtime.d.ts +16 -0
  62. package/dist/runtime.js +144 -0
  63. package/dist/runtime.js.map +1 -0
  64. package/dist/selection.d.ts +18 -0
  65. package/dist/selection.js +42 -0
  66. package/dist/selection.js.map +1 -0
  67. package/dist/shortcuts.d.ts +30 -0
  68. package/dist/shortcuts.js +122 -0
  69. package/dist/shortcuts.js.map +1 -0
  70. package/dist/tui.d.ts +29 -0
  71. package/dist/tui.js +278 -0
  72. package/dist/tui.js.map +1 -0
  73. package/dist/types.d.ts +104 -0
  74. package/dist/types.js +2 -0
  75. package/dist/types.js.map +1 -0
  76. package/package.json +92 -0
package/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # @tokensrc/codex
2
+
3
+ Standalone Codex account selection, OIDC authentication and official Codex launcher.
4
+
5
+ ```sh
6
+ npx @tokensrc/codex list
7
+ npx @tokensrc/codex --server https://mail.tokensource.top --tenant-id numa-realm list
8
+ npx @tokensrc/codex --profile-url https://mail.tokensource.top/public/v1/tenants/numa-realm/client-configuration list
9
+ npx @tokensrc/codex use
10
+ npx @tokensrc/codex run
11
+ ```
12
+
13
+ The standalone command tree includes `login`, `logout`, `list`, `upload`, `use`,
14
+ `run`, `app`, `auth-agent`, `admin`, `shortcut`, `status`, and `reset`. The
15
+ `admin accounts` subtree lists tenant accounts, shows redacted credential-version
16
+ diagnostics, and requests one server-side refresh; it never receives refresh
17
+ tokens, ciphertext, or credential fingerprints. `admin assignments` lists
18
+ bindings, binds an account to a verified Keycloak subject, and unbinds by
19
+ assignment ID:
20
+
21
+ ```sh
22
+ numa codex admin accounts list
23
+ numa codex admin accounts credential-versions acct_xxx
24
+ numa codex admin accounts refresh acct_xxx
25
+ numa codex admin assignments list
26
+ numa codex admin assignments bind acct_xxx keycloak-subject --default
27
+ numa codex admin assignments unbind assignment_xxx
28
+ ```
29
+
30
+ The client connects to
31
+ `X-Tenant-Id: numa-realm`. With `--server` and `--tenant-id` it resolves RFC 9728
32
+ protected-resource metadata, the tenant client-configuration, and OIDC discovery
33
+ before login. `--profile-url` and `TOKENSRC_CODEX_PROFILE_URL` select the public
34
+ configuration directly. Configuration priority is SDK/command options,
35
+ `TOKENSRC_CODEX_*` environment variables, an explicit profile, local settings,
36
+ automatic discovery, then legacy built-in defaults. Settings live under
37
+ `~/.config/tokensrc-codex` on Unix-like systems and
38
+ `%APPDATA%\tokensrc-codex` on Windows.
39
+
40
+ Embedding applications can register the same commands with a Commander program:
41
+
42
+ ```ts
43
+ import { createCodexModule } from "@tokensrc/codex";
44
+
45
+ const codex = await createCodexModule({
46
+ auth: {
47
+ tokenProvider: async ({ forceRefresh }) => getAccessToken(forceRefresh)
48
+ },
49
+ connection: {
50
+ serverUrl: "https://platform.example/api",
51
+ tenantId: "numa-realm"
52
+ },
53
+ persistence: { configDirectory: applicationConfigDirectory }
54
+ });
55
+
56
+ codex.registerCommands(program, { nested: true });
57
+ const local = await codex.status.loadLocal();
58
+ const remote = await codex.status.loadRemote();
59
+ ```
60
+
61
+ Hosts may instead inject a static access token or standalone OIDC settings, and
62
+ can customize branding and launcher behavior. Injected access tokens and provider
63
+ results remain in memory and are never persisted or included in log messages. A
64
+ provider is forcibly refreshed once after HTTP 401; a second failure is returned
65
+ without another retry. Numa and standalone OIDC settings delegate to the shared
66
+ `@numa-tech/cli-auth` lifecycle, which serializes refresh-token rotation across
67
+ processes. A rejected refresh grant becomes `login_required`; standalone users
68
+ are directed to `tokensrc-codex login`, while transient identity-provider errors
69
+ retain the cached session.
70
+
71
+ The main export includes `createCodexModule`, stable error types, status/runtime
72
+ helpers, `resolveCodexProfile`, and protocol types. Focused exports are also available at `./commands`,
73
+ `./command-directory`, `./console-status`, `./runtime`, `./errors`, `./protocol`,
74
+ `./config`, `./profile`, `./shortcuts`, and `./tui`.
Binary file
Binary file
@@ -0,0 +1,16 @@
1
+ export interface CodexAccountDisplayInput {
2
+ accountId: string;
3
+ label?: string | null;
4
+ loginUsername?: string | null;
5
+ email?: string | null;
6
+ providerAccountId?: string | null;
7
+ }
8
+ export interface CodexAdminAccountIdentity {
9
+ id: string;
10
+ label?: string | null;
11
+ providerAccountId?: string | null;
12
+ }
13
+ export declare function shortCodexAccountId(accountId: string): string;
14
+ export declare function resolveCodexAccountDisplayName(input: CodexAccountDisplayInput): string;
15
+ export declare function formatCodexAccountDisplayIdentity(input: CodexAccountDisplayInput): string;
16
+ export declare function resolveCodexAdminAccount<T extends CodexAdminAccountIdentity>(accounts: readonly T[], requested: string): T;
@@ -0,0 +1,35 @@
1
+ import { CodexServiceError } from "./errors.js";
2
+ function present(value) {
3
+ const trimmed = value?.trim();
4
+ return trimmed || undefined;
5
+ }
6
+ export function shortCodexAccountId(accountId) {
7
+ const normalized = accountId.trim();
8
+ return normalized.length > 8 ? `${normalized.slice(0, 8)}…` : normalized;
9
+ }
10
+ export function resolveCodexAccountDisplayName(input) {
11
+ return present(input.label)
12
+ ?? present(input.loginUsername)
13
+ ?? present(input.email)
14
+ ?? present(input.providerAccountId)
15
+ ?? shortCodexAccountId(input.accountId);
16
+ }
17
+ export function formatCodexAccountDisplayIdentity(input) {
18
+ const displayName = resolveCodexAccountDisplayName(input);
19
+ const shortId = shortCodexAccountId(input.accountId);
20
+ return displayName === shortId ? shortId : `${displayName} (${shortId})`;
21
+ }
22
+ export function resolveCodexAdminAccount(accounts, requested) {
23
+ const key = requested.trim();
24
+ const exact = accounts.find((account) => account.id === key);
25
+ if (exact)
26
+ return exact;
27
+ const aliases = accounts.filter((account) => present(account.providerAccountId) === key || present(account.label) === key);
28
+ if (aliases.length === 1)
29
+ return aliases[0];
30
+ if (aliases.length > 1) {
31
+ throw new CodexServiceError(`账号选择 ${key} 不唯一,请使用完整 account id。`, "codex_account_reference_ambiguous", 409);
32
+ }
33
+ throw new CodexServiceError(`未找到 Codex 管理账号: ${key}`, "codex_account_not_found", 404);
34
+ }
35
+ //# sourceMappingURL=account-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-display.js","sourceRoot":"","sources":["../src/account-display.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAgBhD,SAAS,OAAO,CAAC,KAAgC;IAC/C,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACpC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAA+B;IAC5E,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;WACtB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;WAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;WACpB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;WAChC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,KAA+B;IAC/E,MAAM,WAAW,GAAG,8BAA8B,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,OAAO,GAAG,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAsB,EACtB,SAAiB;IAEjB,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAC7D,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAC7B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAC1F,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,iBAAiB,CACzB,QAAQ,GAAG,wBAAwB,EACnC,mCAAmC,EACnC,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,iBAAiB,CACzB,mBAAmB,GAAG,EAAE,EACxB,yBAAyB,EACzB,GAAG,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { fileURLToPath } from "node:url";
4
+ const child = spawn(process.execPath, [fileURLToPath(new URL("./cli.js", import.meta.url)), "app", ...process.argv.slice(2)], {
5
+ stdio: "inherit",
6
+ env: process.env
7
+ });
8
+ process.exitCode = await new Promise((resolve, reject) => {
9
+ child.once("error", reject);
10
+ child.once("exit", (code, signal) => resolve(signal ? 128 : (code ?? 1)));
11
+ });
12
+ //# sourceMappingURL=bin-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin-app.js","sourceRoot":"","sources":["../src/bin-app.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;IAC5H,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,OAAO,CAAC,GAAG;CACjB,CAAC,CAAC;AACH,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC/D,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { fileURLToPath } from "node:url";
4
+ const child = spawn(process.execPath, [fileURLToPath(new URL("./cli.js", import.meta.url)), "run", ...process.argv.slice(2)], {
5
+ stdio: "inherit",
6
+ env: process.env
7
+ });
8
+ process.exitCode = await new Promise((resolve, reject) => {
9
+ child.once("error", reject);
10
+ child.once("exit", (code, signal) => resolve(signal ? 128 : (code ?? 1)));
11
+ });
12
+ //# sourceMappingURL=bin-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin-run.js","sourceRoot":"","sources":["../src/bin-run.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;IAC5H,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,OAAO,CAAC,GAAG;CACjB,CAAC,CAAC;AACH,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC/D,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const PACKAGE_NAME = "@tokensrc/codex";
2
+ export declare const PACKAGE_VERSION: string;
@@ -0,0 +1,8 @@
1
+ import { readFileSync } from "node:fs";
2
+ const manifest = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
3
+ export const PACKAGE_NAME = "@tokensrc/codex";
4
+ export const PACKAGE_VERSION = manifest.version ?? "0.0.0";
5
+ if (manifest.name !== PACKAGE_NAME) {
6
+ throw new Error(`Package identity mismatch: expected ${PACKAGE_NAME}, received ${manifest.name ?? "unset"}`);
7
+ }
8
+ //# sourceMappingURL=branding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branding.js","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAOvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC/C,CAAC;AAErB,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC;AAE3D,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;IACnC,MAAM,IAAI,KAAK,CAAC,uCAAuC,YAAY,cAAc,QAAQ,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;AAC/G,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { PACKAGE_VERSION } from "./branding.js";
4
+ import { createCodexModule } from "./index.js";
5
+ import { isCodexError } from "./errors.js";
6
+ import { CODEX_DISTRIBUTION_SCHEMA_VERSION } from "./protocol.js";
7
+ function value(argv, option) {
8
+ const index = argv.indexOf(option);
9
+ if (index >= 0)
10
+ return argv[index + 1];
11
+ const prefix = `${option}=`;
12
+ return argv.find((item) => item.startsWith(prefix))?.slice(prefix.length);
13
+ }
14
+ const argv = process.argv.slice(2);
15
+ const allowInsecureHttp = argv.includes("--insecure-http") || argv.includes("--insecure-poc");
16
+ async function main() {
17
+ const module = await createCodexModule({
18
+ discoverProfile: true,
19
+ ...(value(argv, "--profile-url") ? { profileUrl: value(argv, "--profile-url") } : {}),
20
+ connection: {
21
+ ...(value(argv, "--server") ? { serverUrl: value(argv, "--server") } : {}),
22
+ ...(value(argv, "--tenant-id") ? { tenantId: value(argv, "--tenant-id") } : {}),
23
+ ...(value(argv, "--tenant-header-name")
24
+ ? { tenantHeaderName: value(argv, "--tenant-header-name") }
25
+ : {}),
26
+ ...(allowInsecureHttp ? { allowInsecureHttp: true } : {})
27
+ },
28
+ persistence: value(argv, "--config-dir")
29
+ ? { configDirectory: value(argv, "--config-dir") }
30
+ : undefined
31
+ });
32
+ const program = new Command()
33
+ .name("tokensrc-codex")
34
+ .description("Standalone Codex account selection and launcher")
35
+ .version(PACKAGE_VERSION)
36
+ .option("--json", "emit JSON")
37
+ .option("--server <url>", "Codex account service URL")
38
+ .option("--profile-url <url>", "public client-configuration URL")
39
+ .option("--tenant-id <id>", "tenant identifier")
40
+ .option("--tenant-header-name <name>", "tenant request header")
41
+ .option("--insecure-http", "allow non-loopback HTTP")
42
+ .option("--insecure-poc", "alias for --insecure-http")
43
+ .option("--config-dir <path>", "configuration directory");
44
+ module.registerCommands(program, { nested: false });
45
+ await program.parseAsync(process.argv);
46
+ }
47
+ try {
48
+ await main();
49
+ }
50
+ catch (error) {
51
+ const detail = isCodexError(error)
52
+ ? { code: error.code, message: error.message, status: error.status ?? null }
53
+ : { code: "command_failed", message: error instanceof Error ? error.message : String(error), status: null };
54
+ const result = {
55
+ schemaVersion: CODEX_DISTRIBUTION_SCHEMA_VERSION,
56
+ ok: false,
57
+ error: detail
58
+ };
59
+ if (argv.includes("--json"))
60
+ process.stderr.write(`${JSON.stringify(result)}\n`);
61
+ else {
62
+ process.stderr.write(`Error [${detail.code}]: ${detail.message}\n`);
63
+ if (detail.code === "login_required") {
64
+ process.stderr.write("Run: tokensrc-codex login\n");
65
+ }
66
+ }
67
+ process.exitCode = 1;
68
+ }
69
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { CodexAuthController } from "./oidc.js";
2
+ import { type CodexAdminAccountListResponse, type CodexAdminAssignmentDeleteResponse, type CodexAdminAssignmentListResponse, type CodexAdminAssignmentMutationResponse, type CodexAccountListResponse, type CodexCredentialVersionListResponse, type CodexImportResult, type CodexLoginCredentialsResponse, type CodexManualRefreshResponse, type CodexUploadBatch } from "./protocol.js";
3
+ import type { ResolvedCodexConfig } from "./types.js";
4
+ export declare function normalizeCodexServiceUrl(rawUrl: string, allowInsecureHttp?: boolean): string;
5
+ export declare class CodexServiceClient {
6
+ private readonly config;
7
+ private readonly auth;
8
+ private readonly fetchImpl;
9
+ private readonly baseUrl;
10
+ get serviceUrl(): string;
11
+ constructor(config: ResolvedCodexConfig, auth: CodexAuthController, fetchImpl?: typeof fetch);
12
+ private request;
13
+ listAccounts(): Promise<CodexAccountListResponse>;
14
+ getLoginCredentials(accountId: string): Promise<CodexLoginCredentialsResponse>;
15
+ uploadAccounts(payload: CodexUploadBatch): Promise<CodexImportResult>;
16
+ listAdminAccounts(): Promise<CodexAdminAccountListResponse>;
17
+ listCredentialVersions(accountId: string): Promise<CodexCredentialVersionListResponse>;
18
+ refreshAdminAccount(accountId: string): Promise<CodexManualRefreshResponse>;
19
+ listAdminAssignments(): Promise<CodexAdminAssignmentListResponse>;
20
+ bindAdminAssignment(input: {
21
+ accountId: string;
22
+ userSubject: string;
23
+ isDefault: boolean;
24
+ }): Promise<CodexAdminAssignmentMutationResponse>;
25
+ unbindAdminAssignment(assignmentId: string): Promise<CodexAdminAssignmentDeleteResponse>;
26
+ }
27
+ export declare function codexImportRequestTimeoutMs(baseTimeoutMs: number, accountCount: number): number;
package/dist/client.js ADDED
@@ -0,0 +1,177 @@
1
+ import { CodexAuthError, CodexLoginRequiredError, CodexServiceError } from "./errors.js";
2
+ import { CODEX_ACCOUNTS_IMPORT_PATH, CODEX_ACCOUNTS_LIST_PATH, CODEX_ADMIN_ACCOUNTS_PATH, CODEX_ADMIN_ASSIGNMENTS_PATH, CodexAdminAssignmentDeleteResponseSchema, CodexAdminAssignmentListResponseSchema, CodexAdminAssignmentMutationResponseSchema, CodexAdminAccountListResponseSchema, CodexAccountListResponseSchema, CodexCredentialVersionListResponseSchema, CodexImportResultSchema, CodexLoginCredentialsResponseSchema, CodexManualRefreshResponseSchema, codexAccountLoginCredentialsPath, codexAdminAssignmentPath, codexAdminCredentialVersionsPath, codexAdminRefreshPath } from "./protocol.js";
3
+ export function normalizeCodexServiceUrl(rawUrl, allowInsecureHttp = false) {
4
+ const url = new URL(rawUrl);
5
+ const loopback = ["127.0.0.1", "localhost", "::1", "[::1]"].includes(url.hostname);
6
+ if (url.username || url.password) {
7
+ throw new CodexServiceError("Codex service URLs must not contain credentials.", "insecure_codex_service");
8
+ }
9
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && (loopback || allowInsecureHttp))) {
10
+ throw new CodexServiceError("Codex account service must use HTTPS; non-loopback HTTP requires allowInsecureHttp.", "insecure_codex_service");
11
+ }
12
+ if (!["http:", "https:"].includes(url.protocol)) {
13
+ throw new CodexServiceError("Codex account service must use HTTP(S).", "insecure_codex_service");
14
+ }
15
+ url.hash = "";
16
+ url.search = "";
17
+ return url.toString().replace(/\/+$/, "");
18
+ }
19
+ async function responseBody(response) {
20
+ const text = await response.text();
21
+ try {
22
+ return text ? JSON.parse(text) : {};
23
+ }
24
+ catch {
25
+ throw new CodexServiceError(`Codex service returned a non-JSON response (HTTP ${response.status}).`, "invalid_codex_service_response", response.status);
26
+ }
27
+ }
28
+ export class CodexServiceClient {
29
+ config;
30
+ auth;
31
+ fetchImpl;
32
+ baseUrl;
33
+ get serviceUrl() {
34
+ return this.baseUrl;
35
+ }
36
+ constructor(config, auth, fetchImpl = fetch) {
37
+ this.config = config;
38
+ this.auth = auth;
39
+ this.fetchImpl = fetchImpl;
40
+ this.baseUrl = normalizeCodexServiceUrl(config.connection.serverUrl, config.connection.allowInsecureHttp);
41
+ }
42
+ async request(path, request) {
43
+ const send = async (forceRefresh) => {
44
+ const token = await this.auth.getAccessToken(forceRefresh);
45
+ const headers = new Headers({
46
+ Accept: "application/json",
47
+ Authorization: `Bearer ${token}`,
48
+ [this.config.connection.tenantHeaderName]: this.config.connection.tenantId
49
+ });
50
+ if (request?.body !== undefined)
51
+ headers.set("Content-Type", "application/json");
52
+ return this.fetchImpl(`${this.baseUrl}${path}`, {
53
+ method: request?.method ?? "GET",
54
+ headers,
55
+ ...(request?.body !== undefined ? { body: JSON.stringify(request.body) } : {}),
56
+ signal: AbortSignal.timeout(request?.timeoutMs ?? this.config.connection.requestTimeoutMs)
57
+ });
58
+ };
59
+ let response;
60
+ try {
61
+ response = await send(false);
62
+ if (response.status === 401 && this.auth.kind !== "static") {
63
+ await response.body?.cancel().catch(() => undefined);
64
+ response = await send(true);
65
+ }
66
+ }
67
+ catch (error) {
68
+ if (error instanceof CodexAuthError)
69
+ throw error;
70
+ if (error?.code === "login_required") {
71
+ throw new CodexLoginRequiredError(error instanceof Error ? error.message : "Login is required.");
72
+ }
73
+ throw new CodexServiceError(`Unable to reach Codex account service: ${error instanceof Error ? error.message : String(error)}`, "codex_service_unavailable", undefined, { cause: error });
74
+ }
75
+ const body = await responseBody(response);
76
+ if (!response.ok) {
77
+ const problem = body && typeof body === "object"
78
+ ? body
79
+ : undefined;
80
+ const serviceCode = typeof problem?.code === "string" ? problem.code : undefined;
81
+ const detail = [problem?.detail, problem?.error, problem?.title]
82
+ .find((value) => typeof value === "string" && value.trim().length > 0)
83
+ ?? response.statusText;
84
+ const safeServiceCode = serviceCode && /^[a-z][a-z0-9_.-]{0,127}$/i.test(serviceCode)
85
+ ? serviceCode
86
+ : undefined;
87
+ const code = safeServiceCode
88
+ ?? (response.status === 401 || response.status === 403
89
+ ? "codex_access_denied"
90
+ : "codex_service_error");
91
+ throw new CodexServiceError(safeServiceCode === "codex_account_needs_reauth"
92
+ ? "ChatGPT account credentials are invalid and must be re-imported by an administrator."
93
+ : `Codex account service request failed (HTTP ${response.status}): ${detail}`, code, response.status);
94
+ }
95
+ return body;
96
+ }
97
+ async listAccounts() {
98
+ const parsed = CodexAccountListResponseSchema.safeParse(await this.request(CODEX_ACCOUNTS_LIST_PATH));
99
+ if (!parsed.success) {
100
+ throw new CodexServiceError("Invalid Codex account list response.", "invalid_codex_service_response");
101
+ }
102
+ return parsed.data;
103
+ }
104
+ async getLoginCredentials(accountId) {
105
+ const parsed = CodexLoginCredentialsResponseSchema.safeParse(await this.request(codexAccountLoginCredentialsPath(accountId)));
106
+ if (!parsed.success || parsed.data.account.id !== accountId) {
107
+ throw new CodexServiceError("Invalid or mismatched Codex login credentials response.", "invalid_codex_service_response");
108
+ }
109
+ return parsed.data;
110
+ }
111
+ async uploadAccounts(payload) {
112
+ const parsed = CodexImportResultSchema.safeParse(await this.request(CODEX_ACCOUNTS_IMPORT_PATH, {
113
+ method: "POST",
114
+ body: payload,
115
+ timeoutMs: codexImportRequestTimeoutMs(this.config.connection.requestTimeoutMs, payload.accounts.length)
116
+ }));
117
+ if (!parsed.success) {
118
+ throw new CodexServiceError("Invalid Codex account import response.", "invalid_codex_service_response");
119
+ }
120
+ if (parsed.data.accountIds.length !== payload.accounts.length
121
+ || parsed.data.credentials.length !== payload.accounts.length
122
+ || parsed.data.created + parsed.data.updated !== payload.accounts.length
123
+ || parsed.data.credentials.some((credential, index) => (credential.accountId !== parsed.data.accountIds[index]))) {
124
+ throw new CodexServiceError("Invalid or mismatched Codex account import response.", "invalid_codex_service_response");
125
+ }
126
+ return parsed.data;
127
+ }
128
+ async listAdminAccounts() {
129
+ const parsed = CodexAdminAccountListResponseSchema.safeParse(await this.request(CODEX_ADMIN_ACCOUNTS_PATH));
130
+ if (!parsed.success) {
131
+ throw new CodexServiceError("Invalid Codex admin account list response.", "invalid_codex_service_response");
132
+ }
133
+ return parsed.data;
134
+ }
135
+ async listCredentialVersions(accountId) {
136
+ const parsed = CodexCredentialVersionListResponseSchema.safeParse(await this.request(codexAdminCredentialVersionsPath(accountId)));
137
+ if (!parsed.success || parsed.data.account.id !== accountId
138
+ || parsed.data.credentials.some((credential) => credential.accountId !== accountId)) {
139
+ throw new CodexServiceError("Invalid or mismatched Codex credential version response.", "invalid_codex_service_response");
140
+ }
141
+ return parsed.data;
142
+ }
143
+ async refreshAdminAccount(accountId) {
144
+ const parsed = CodexManualRefreshResponseSchema.safeParse(await this.request(codexAdminRefreshPath(accountId), { method: "POST" }));
145
+ if (!parsed.success || parsed.data.accountId !== accountId) {
146
+ throw new CodexServiceError("Invalid or mismatched Codex manual refresh response.", "invalid_codex_service_response");
147
+ }
148
+ return parsed.data;
149
+ }
150
+ async listAdminAssignments() {
151
+ const parsed = CodexAdminAssignmentListResponseSchema.safeParse(await this.request(CODEX_ADMIN_ASSIGNMENTS_PATH));
152
+ if (!parsed.success) {
153
+ throw new CodexServiceError("Invalid Codex assignment list response.", "invalid_codex_service_response");
154
+ }
155
+ return parsed.data;
156
+ }
157
+ async bindAdminAssignment(input) {
158
+ const parsed = CodexAdminAssignmentMutationResponseSchema.safeParse(await this.request(CODEX_ADMIN_ASSIGNMENTS_PATH, { method: "POST", body: input }));
159
+ if (!parsed.success || parsed.data.assignment.accountId !== input.accountId
160
+ || parsed.data.assignment.userSubject !== input.userSubject) {
161
+ throw new CodexServiceError("Invalid or mismatched Codex assignment response.", "invalid_codex_service_response");
162
+ }
163
+ return parsed.data;
164
+ }
165
+ async unbindAdminAssignment(assignmentId) {
166
+ const parsed = CodexAdminAssignmentDeleteResponseSchema.safeParse(await this.request(codexAdminAssignmentPath(assignmentId), { method: "DELETE" }));
167
+ if (!parsed.success || parsed.data.assignmentId !== assignmentId) {
168
+ throw new CodexServiceError("Invalid or mismatched Codex assignment deletion response.", "invalid_codex_service_response");
169
+ }
170
+ return parsed.data;
171
+ }
172
+ }
173
+ export function codexImportRequestTimeoutMs(baseTimeoutMs, accountCount) {
174
+ const validationWaves = Math.max(1, Math.ceil(accountCount / 8));
175
+ return Math.max(baseTimeoutMs, 30_000, validationWaves * 25_000);
176
+ }
177
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface CodexCommandDescriptor {
2
+ name: string;
3
+ description: string;
4
+ command: string;
5
+ summary: string;
6
+ access: "public" | "authenticated";
7
+ examples: string[];
8
+ standaloneOnly?: boolean;
9
+ }
10
+ export declare function createCodexCommandDirectory(options?: {
11
+ nested?: boolean;
12
+ cliName?: string;
13
+ }): readonly CodexCommandDescriptor[];
14
+ export declare const CODEX_COMMAND_DIRECTORY: readonly CodexCommandDescriptor[];
15
+ export declare const NESTED_CODEX_COMMAND_DIRECTORY: readonly CodexCommandDescriptor[];
@@ -0,0 +1,28 @@
1
+ const definitions = [
2
+ { name: "login", description: "Log in to the standalone OIDC provider", command: "login", summary: "登录独立 Codex CLI", access: "public", examples: ["tokensrc-codex login"], standaloneOnly: true },
3
+ { name: "logout", description: "Remove the standalone OIDC token cache", command: "logout", summary: "退出独立 Codex CLI", access: "public", examples: ["tokensrc-codex logout"], standaloneOnly: true },
4
+ { name: "list", description: "List available Codex accounts", command: "codex list [-u|--server <url>]", summary: "列出服务端 Codex 账号元数据,不传输 refresh token", access: "authenticated", examples: ["numa codex list --server https://platform.example/api"] },
5
+ { name: "upload", description: "Upload the local codex-multi-auth account pool", command: "codex upload [-u|--server <url>]", summary: "把 codex-multi-auth 管理的本地账号池批量上传到平台", access: "authenticated", examples: ["numa codex upload --server https://platform.example/api", "numa codex upload --storage ~/.codex/multi-auth/openai-codex-accounts.json"] },
6
+ { name: "use", description: "Select an account and install official Codex credentials", command: "codex use [account]", summary: "选择服务端账号并写入官方 ChatGPT auth.json", access: "authenticated", examples: ["numa codex use acct_xxx"] },
7
+ { name: "run", description: "Launch the official Codex CLI", command: "codex run [-s|--select-account|-a|--account <id>] [-u|--server <url>] [--] [codexArgs...]", summary: "选择或复用 ChatGPT 账号后启动官方 Codex;模型流量不经过宿主", access: "authenticated", examples: ["numa codex run -s", "numa codex run --account acct_xxx", "numa codex run -- exec \"完成长任务\""] },
8
+ { name: "app", description: "Launch the official Codex desktop app", command: "codex app [workspace] [-s|--select-account|-a|--account <id>] [-u|--server <url>]", summary: "使用官方 ChatGPT 登录启动 macOS/Windows 官方 Codex 桌面 App", access: "authenticated", examples: ["numa codex app . -s", "numa codex app . --account acct_xxx"] },
9
+ { name: "shortcut", description: "Install or remove launcher shortcuts", command: "codex shortcut [install|remove] [-t|--target run|app|both] [-s|--select-account]", summary: "安装或删除 macOS/Windows 的 Codex 快捷命令与桌面入口", access: "public", examples: ["numa codex shortcut install", "numa codex shortcut install --target app --workspace .", "numa codex shortcut remove"] },
10
+ { name: "auth-agent", description: "Continuously renew official Codex credentials", command: "codex auth-agent [account]", summary: "前台刷新短效 token 到官方 Codex 登录并输出完整状态日志", access: "authenticated", examples: ["numa codex auth-agent acct_xxx --replace-login", "numa codex auth-agent --replace-login --once"] },
11
+ { name: "admin", description: "Manage server-side Codex accounts and assignments", command: "codex admin <accounts|assignments>", summary: "管理员查看账号与凭据版本、触发刷新,并管理 Keycloak 用户账号绑定", access: "authenticated", examples: ["numa codex admin accounts list", "numa codex admin accounts credential-versions acct_xxx", "numa codex admin accounts refresh acct_xxx", "numa codex admin assignments list", "numa codex admin assignments bind acct_xxx user-subject --default", "numa codex admin assignments unbind assignment_xxx"] },
12
+ { name: "status", description: "Show selection and official credential status", command: "codex status", summary: "查看当前账号选择与官方 ChatGPT auth.json 状态", access: "public", examples: ["numa codex status --json"] },
13
+ { name: "reset", description: "Reset selection and managed credentials", command: "codex reset", summary: "重置本地账号选择和登录,并清理废弃的 provider 残留", access: "public", examples: ["numa codex reset"] }
14
+ ];
15
+ export function createCodexCommandDirectory(options = {}) {
16
+ const nested = options.nested ?? false;
17
+ const cliName = options.cliName ?? (nested ? "numa" : "tokensrc-codex");
18
+ return definitions
19
+ .filter((item) => !nested || !item.standaloneOnly)
20
+ .map((item) => ({
21
+ ...item,
22
+ command: nested ? item.command : item.command.replace(/^codex\s+/u, ""),
23
+ examples: item.examples.map((example) => example.replace(/^numa\b/u, cliName))
24
+ }));
25
+ }
26
+ export const CODEX_COMMAND_DIRECTORY = createCodexCommandDirectory();
27
+ export const NESTED_CODEX_COMMAND_DIRECTORY = createCodexCommandDirectory({ nested: true });
28
+ //# sourceMappingURL=command-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-directory.js","sourceRoot":"","sources":["../src/command-directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Command } from "commander";
2
+ import type { CodexServiceClient } from "./client.js";
3
+ import type { CodexStatusLoader } from "./console-status.js";
4
+ import type { CodexAuthController } from "./oidc.js";
5
+ import type { ResolvedCodexConfig } from "./types.js";
6
+ export interface CodexCommandDependencies {
7
+ config: ResolvedCodexConfig;
8
+ auth: CodexAuthController;
9
+ client: CodexServiceClient;
10
+ clientFor(connection?: {
11
+ serverUrl?: string;
12
+ allowInsecureHttp?: boolean;
13
+ }): CodexServiceClient;
14
+ status: CodexStatusLoader;
15
+ run(args: string[]): Promise<number>;
16
+ app(workspace?: string): Promise<number>;
17
+ output: NodeJS.WritableStream;
18
+ errorOutput: NodeJS.WritableStream;
19
+ jsonEnabled?: (command: Command) => boolean | Promise<boolean>;
20
+ }
21
+ export declare const NO_AVAILABLE_CHATGPT_ACCOUNT_MESSAGE = "\u5F53\u524D\u7528\u6237\u6CA1\u6709\u7ED1\u5B9A\u53EF\u7528\u7684 ChatGPT \u8D26\u53F7\u3002\u8BF7\u524D\u5F80 OA \u7CFB\u7EDF\u63D0\u4EA4 IT11 \u5DE5\u5355\uFF0C\u7533\u8BF7\u72EC\u4EAB\u6216\u5171\u4EAB\u7684 ChatGPT \u4E2A\u4EBA\u8D26\u53F7\u3002";
22
+ export declare function registerCodexCommands(program: Command, deps: CodexCommandDependencies, options?: {
23
+ nested?: boolean;
24
+ includeAuthCommands?: boolean;
25
+ }): Command;