@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
@@ -0,0 +1,19 @@
1
+ export type CodexErrorCode = "auth_error" | "login_required" | "http_error" | "insecure_codex_service" | "codex_service_unavailable" | "invalid_codex_service_response" | "codex_access_denied" | "codex_service_error" | "codex_account_not_found" | "codex_assignment_not_found" | "codex_account_reference_ambiguous" | "codex_account_needs_reauth" | "codex_runtime_missing" | "invalid_configuration" | (string & {});
2
+ export declare function isCodexError(error: unknown): error is CodexError;
3
+ export declare class CodexError extends Error {
4
+ readonly code: CodexErrorCode;
5
+ readonly status?: number | undefined;
6
+ constructor(message: string, code: CodexErrorCode, status?: number | undefined, options?: ErrorOptions);
7
+ }
8
+ export declare class CodexAuthError extends CodexError {
9
+ constructor(message: string, code?: "auth_error" | "login_required" | "http_error" | "issuer_mismatch", options?: ErrorOptions);
10
+ }
11
+ export declare class CodexLoginRequiredError extends CodexAuthError {
12
+ constructor(message?: string);
13
+ }
14
+ export declare class CodexServiceError extends CodexError {
15
+ constructor(message: string, code: CodexErrorCode, status?: number, options?: ErrorOptions);
16
+ }
17
+ export declare class CodexRuntimeError extends CodexError {
18
+ constructor(message: string, options?: ErrorOptions);
19
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,40 @@
1
+ export function isCodexError(error) {
2
+ return error instanceof CodexError || Boolean(error && typeof error === "object" &&
3
+ typeof error.code === "string" &&
4
+ typeof error.message === "string");
5
+ }
6
+ export class CodexError extends Error {
7
+ code;
8
+ status;
9
+ constructor(message, code, status, options) {
10
+ super(message, options);
11
+ this.code = code;
12
+ this.status = status;
13
+ this.name = "CodexError";
14
+ }
15
+ }
16
+ export class CodexAuthError extends CodexError {
17
+ constructor(message, code = "auth_error", options) {
18
+ super(message, code, undefined, options);
19
+ this.name = "CodexAuthError";
20
+ }
21
+ }
22
+ export class CodexLoginRequiredError extends CodexAuthError {
23
+ constructor(message = "No usable OIDC login is available.") {
24
+ super(message, "login_required");
25
+ this.name = "CodexLoginRequiredError";
26
+ }
27
+ }
28
+ export class CodexServiceError extends CodexError {
29
+ constructor(message, code, status, options) {
30
+ super(message, code, status, options);
31
+ this.name = "CodexServiceError";
32
+ }
33
+ }
34
+ export class CodexRuntimeError extends CodexError {
35
+ constructor(message, options) {
36
+ super(message, "codex_runtime_missing", undefined, options);
37
+ this.name = "CodexRuntimeError";
38
+ }
39
+ }
40
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,UAAU,IAAI,OAAO,CAC3C,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAClC,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ;QACtD,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ,CAC7D,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGjB,IAAI;IACJ,MAAM;IAHxB,YACE,OAAe,EACC,IAAoB,EACpB,MAAe,EAC/B,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAJR,IAAI;sBACJ,MAAM;QAItB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,YACE,OAAe,EACf,IAAI,GAAuE,YAAY,EACvF,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,cAAc;IACzD,YAAY,OAAO,GAAG,oCAAoC;QACxD,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C,YAAY,OAAe,EAAE,IAAoB,EAAE,MAAe,EAAE,OAAsB;QACxF,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { CodexModule, CodexModuleOptions } from "./types.js";
2
+ export declare function createCodexModule(options?: CodexModuleOptions): Promise<CodexModule>;
3
+ export type * from "./types.js";
4
+ export * from "./errors.js";
5
+ export * from "./protocol.js";
6
+ export * from "./client.js";
7
+ export * from "./runtime.js";
8
+ export * from "./console-status.js";
9
+ export * from "./command-directory.js";
10
+ export * from "./selection.js";
11
+ export * from "./credentials.js";
12
+ export * from "./shortcuts.js";
13
+ export * from "./tui.js";
14
+ export * from "./config.js";
15
+ export * from "./quota-cache.js";
16
+ export * from "./legacy-cleanup.js";
17
+ export * from "./profile.js";
18
+ export { registerCodexCommands } from "./commands.js";
package/dist/index.js ADDED
@@ -0,0 +1,67 @@
1
+ import { CodexServiceClient } from "./client.js";
2
+ import { registerCodexCommands } from "./commands.js";
3
+ import { resolveCodexConfig } from "./config.js";
4
+ import { createCodexStatusLoader } from "./console-status.js";
5
+ import { createAuthController } from "./oidc.js";
6
+ import { resolveCodexRuntime, runCodexLaunch } from "./runtime.js";
7
+ export async function createCodexModule(options = {}) {
8
+ const config = await resolveCodexConfig(options);
9
+ const env = options.env ?? process.env;
10
+ const fetchImpl = options.fetch ?? fetch;
11
+ const auth = createAuthController(config.auth, fetchImpl);
12
+ const client = new CodexServiceClient(config, auth, fetchImpl);
13
+ const clientFor = (connection = {}) => Object.keys(connection).length
14
+ ? new CodexServiceClient({ ...config, connection: { ...config.connection, ...connection } }, auth, fetchImpl)
15
+ : client;
16
+ const status = createCodexStatusLoader(config.persistence.configDirectory, client, env);
17
+ const resolveRuntime = (args = []) => resolveCodexRuntime(args, {
18
+ env,
19
+ binary: config.launcher.codexBinary,
20
+ binaryEnvNames: config.launcher.binaryEnvNames,
21
+ bundledEnvNames: config.launcher.bundledEnvNames,
22
+ launchMode: config.launcher.launchMode,
23
+ packageName: "@openai/codex"
24
+ });
25
+ const run = async (args = []) => runCodexLaunch(await resolveRuntime(args), env, config.launcher.binaryEnvNames[0]);
26
+ const app = (workspace = ".") => run(["app", workspace]);
27
+ const module = {
28
+ config,
29
+ client,
30
+ status,
31
+ registerCommands(program, commandOptions = {}) {
32
+ return registerCodexCommands(program, {
33
+ config,
34
+ auth,
35
+ client,
36
+ clientFor,
37
+ status,
38
+ run,
39
+ app,
40
+ output: options.output ?? process.stdout,
41
+ errorOutput: options.errorOutput ?? process.stderr,
42
+ jsonEnabled: options.jsonEnabled
43
+ }, commandOptions);
44
+ },
45
+ getConsoleStatus: () => status.load(),
46
+ resolveRuntime,
47
+ run,
48
+ app
49
+ };
50
+ return module;
51
+ }
52
+ export * from "./errors.js";
53
+ export * from "./protocol.js";
54
+ export * from "./client.js";
55
+ export * from "./runtime.js";
56
+ export * from "./console-status.js";
57
+ export * from "./command-directory.js";
58
+ export * from "./selection.js";
59
+ export * from "./credentials.js";
60
+ export * from "./shortcuts.js";
61
+ export * from "./tui.js";
62
+ export * from "./config.js";
63
+ export * from "./quota-cache.js";
64
+ export * from "./legacy-cleanup.js";
65
+ export * from "./profile.js";
66
+ export { registerCodexCommands } from "./commands.js";
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAO,GAAuB,EAAE;IACtE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACzC,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,CAAC,UAAU,GAAwD,EAAE,EAAE,EAAE,CACzF,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM;QAC5B,CAAC,CAAC,IAAI,kBAAkB,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC;QAC7G,CAAC,CAAC,MAAM,CAAC;IACb,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACxF,MAAM,cAAc,GAAG,CAAC,IAAI,GAAa,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE;QACxE,GAAG;QACH,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;QACnC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc;QAC9C,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe;QAChD,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACtC,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,GAAa,EAAE,EAAmB,EAAE,CAAC,cAAc,CACxE,MAAM,cAAc,CAAC,IAAI,CAAC,EAC1B,GAAG,EACH,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAClC,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAgB;QAC1B,MAAM;QACN,MAAM;QACN,MAAM;QACN,gBAAgB,CAAC,OAAgB,EAAE,cAAc,GAAG,EAAE;YACpD,OAAO,qBAAqB,CAAC,OAAO,EAAE;gBACpC,MAAM;gBACN,IAAI;gBACJ,MAAM;gBACN,SAAS;gBACT,MAAM;gBACN,GAAG;gBACH,GAAG;gBACH,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;gBACxC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM;gBAClD,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,EAAE,cAAc,CAAC,CAAC;QACrB,CAAC;QACD,gBAAgB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;QACrC,cAAc;QACd,GAAG;QACH,GAAG;KACJ,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface LegacyCodexProviderCleanup {
2
+ changed: boolean;
3
+ configPath: string;
4
+ }
5
+ export declare function cleanupLegacyCodexProvider(configPath?: string): Promise<LegacyCodexProviderCleanup>;
@@ -0,0 +1,36 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { getCodexCliConfigPath } from "codex-multi-auth/cli";
3
+ import { writePrivateText } from "./private-file.js";
4
+ export async function cleanupLegacyCodexProvider(configPath = getCodexCliConfigPath()) {
5
+ let source;
6
+ try {
7
+ source = await readFile(configPath, "utf8");
8
+ }
9
+ catch (error) {
10
+ if (error.code === "ENOENT")
11
+ return { changed: false, configPath };
12
+ throw error;
13
+ }
14
+ const lines = source.split(/(?<=\n)/u);
15
+ let insideLegacy = false;
16
+ let changed = false;
17
+ const kept = [];
18
+ for (const line of lines) {
19
+ const section = line.match(/^\s*\[([^\]]+)\]\s*(?:#.*)?(?:\r?\n)?$/u)?.[1]?.trim();
20
+ if (section)
21
+ insideLegacy = section === "model_providers.mcex-codex";
22
+ if (insideLegacy) {
23
+ changed = true;
24
+ continue;
25
+ }
26
+ if (/^\s*model_provider\s*=\s*["']mcex-codex["']/u.test(line)) {
27
+ changed = true;
28
+ continue;
29
+ }
30
+ kept.push(line);
31
+ }
32
+ if (changed)
33
+ await writePrivateText(configPath, kept.join("").replace(/\n{3,}/g, "\n\n"));
34
+ return { changed, configPath };
35
+ }
36
+ //# sourceMappingURL=legacy-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-cleanup.js","sourceRoot":"","sources":["../src/legacy-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAOrD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,UAAU,GAAG,qBAAqB,EAAE;IAEpC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QAAC,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IACpD,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC9F,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACnF,IAAI,OAAO;YAAE,YAAY,GAAG,OAAO,KAAK,4BAA4B,CAAC;QACrE,IAAI,YAAY,EAAE,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QAC/C,IAAI,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QAC5F,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO;QAAE,MAAM,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1F,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC"}
package/dist/oidc.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import type { CodexAuthOptions } from "./types.js";
2
+ export interface ResolvedOidcOptions {
3
+ discoveryUrl: string;
4
+ issuerUrl?: string;
5
+ clientId: string;
6
+ tenantId?: string;
7
+ audience?: string;
8
+ clientSecret?: string;
9
+ scope: string;
10
+ redirectHost: string;
11
+ redirectPort: number;
12
+ redirectPath: string;
13
+ openBrowser: boolean;
14
+ tokenFile: string;
15
+ }
16
+ export interface OidcLoginResult {
17
+ expiresAt: number;
18
+ scope: string;
19
+ }
20
+ export interface CodexAuthController {
21
+ readonly kind: "static" | "provider" | "oidc";
22
+ getAccessToken(forceRefresh?: boolean): Promise<string>;
23
+ login?(): Promise<OidcLoginResult>;
24
+ logout?(): Promise<void>;
25
+ }
26
+ export declare function createAuthController(auth: CodexAuthOptions, fetchImpl?: typeof fetch): CodexAuthController;
package/dist/oidc.js ADDED
@@ -0,0 +1,154 @@
1
+ import { AuthError as SharedAuthError, blockingBrowserLogin, deleteTokenCache, ensureAccessToken, LoginRequiredError as SharedLoginRequiredError, readTokenCache } from "@numa-tech/cli-auth";
2
+ import { CodexAuthError, CodexLoginRequiredError } from "./errors.js";
3
+ function normalizeProviderToken(value) {
4
+ const token = typeof value === "string" ? value : value.accessToken;
5
+ if (!token.trim())
6
+ throw new CodexLoginRequiredError("The access token provider returned an empty token.");
7
+ return token;
8
+ }
9
+ class StaticAuthController {
10
+ token;
11
+ kind = "static";
12
+ constructor(token) {
13
+ this.token = token;
14
+ }
15
+ async getAccessToken() {
16
+ if (!this.token.trim())
17
+ throw new CodexLoginRequiredError("The configured access token is empty.");
18
+ return this.token;
19
+ }
20
+ }
21
+ class ProviderAuthController {
22
+ provider;
23
+ loginProvider;
24
+ isLoginRequired;
25
+ loginHint;
26
+ kind = "provider";
27
+ constructor(provider, loginProvider, isLoginRequired, loginHint) {
28
+ this.provider = provider;
29
+ this.loginProvider = loginProvider;
30
+ this.isLoginRequired = isLoginRequired;
31
+ this.loginHint = loginHint;
32
+ }
33
+ async getAccessToken(forceRefresh = false) {
34
+ try {
35
+ return normalizeProviderToken(await this.provider({ forceRefresh }));
36
+ }
37
+ catch (error) {
38
+ const required = this.isLoginRequired?.(error)
39
+ ?? (error?.code === "login_required");
40
+ if (!required || !this.loginProvider)
41
+ throw error;
42
+ await this.loginProvider();
43
+ try {
44
+ return normalizeProviderToken(await this.provider({ forceRefresh: false }));
45
+ }
46
+ catch (retryError) {
47
+ const retryRequired = this.isLoginRequired?.(retryError)
48
+ ?? (retryError?.code === "login_required");
49
+ if (retryRequired) {
50
+ throw new CodexLoginRequiredError(this.loginHint ?? "Login is required.");
51
+ }
52
+ throw retryError;
53
+ }
54
+ }
55
+ }
56
+ }
57
+ function sharedConfig(options) {
58
+ return {
59
+ discoveryUrl: options.discoveryUrl,
60
+ ...(options.issuerUrl ? { issuerUrl: options.issuerUrl } : {}),
61
+ clientId: options.clientId,
62
+ ...(options.tenantId ? { profileTenantId: options.tenantId } : {}),
63
+ ...(options.audience ? { resourceAudience: options.audience } : {}),
64
+ ...(options.clientSecret ? { clientSecret: options.clientSecret } : {}),
65
+ scope: options.scope,
66
+ tokenFile: options.tokenFile,
67
+ redirectHost: options.redirectHost,
68
+ redirectPort: options.redirectPort,
69
+ redirectPath: options.redirectPath,
70
+ openBrowser: options.openBrowser
71
+ };
72
+ }
73
+ function translateSharedAuthError(error) {
74
+ if (error instanceof SharedLoginRequiredError) {
75
+ throw new CodexLoginRequiredError(error.message);
76
+ }
77
+ if (error instanceof SharedAuthError) {
78
+ const code = error.code === "http_error"
79
+ ? "http_error"
80
+ : error.code === "issuer_mismatch" ? "issuer_mismatch" : "auth_error";
81
+ throw new CodexAuthError(error.message, code, { cause: error });
82
+ }
83
+ throw error;
84
+ }
85
+ class OidcAuthController {
86
+ fetchImpl;
87
+ kind = "oidc";
88
+ config;
89
+ constructor(options, fetchImpl) {
90
+ this.fetchImpl = fetchImpl;
91
+ this.config = sharedConfig(options);
92
+ }
93
+ async getAccessToken(forceRefresh = false) {
94
+ try {
95
+ return await ensureAccessToken(this.config, forceRefresh, { fetch: this.fetchImpl });
96
+ }
97
+ catch (error) {
98
+ translateSharedAuthError(error);
99
+ }
100
+ }
101
+ async login() {
102
+ try {
103
+ await blockingBrowserLogin(this.config, { loadUserinfo: false }, { fetch: this.fetchImpl });
104
+ const cache = await readTokenCache(this.config);
105
+ if (!cache)
106
+ throw new CodexLoginRequiredError("OIDC login did not create a token cache.");
107
+ return { expiresAt: cache.expiresAt, scope: cache.scope };
108
+ }
109
+ catch (error) {
110
+ if (error instanceof CodexLoginRequiredError)
111
+ throw error;
112
+ translateSharedAuthError(error);
113
+ }
114
+ }
115
+ async logout() {
116
+ try {
117
+ await deleteTokenCache(this.config);
118
+ }
119
+ catch (error) {
120
+ translateSharedAuthError(error);
121
+ }
122
+ }
123
+ }
124
+ function resolveOidcOptions(options) {
125
+ const issuerUrl = options.issuerUrl?.replace(/\/+$/, "");
126
+ const discoveryUrl = options.discoveryUrl
127
+ ?? (issuerUrl ? `${issuerUrl}/.well-known/openid-configuration` : undefined);
128
+ if (!discoveryUrl || !options.clientId || !options.tokenFile) {
129
+ throw new CodexAuthError("OIDC discoveryUrl, clientId and tokenFile are required.", "auth_error");
130
+ }
131
+ return {
132
+ discoveryUrl,
133
+ ...(issuerUrl ? { issuerUrl } : {}),
134
+ clientId: options.clientId,
135
+ ...(options.tenantId ? { tenantId: options.tenantId } : {}),
136
+ ...(options.audience ? { audience: options.audience } : {}),
137
+ ...(options.clientSecret ? { clientSecret: options.clientSecret } : {}),
138
+ scope: options.scope ?? "openid profile email offline_access",
139
+ redirectHost: options.redirectHost ?? "127.0.0.1",
140
+ redirectPort: options.redirectPort ?? 8765,
141
+ redirectPath: options.redirectPath ?? "/callback",
142
+ openBrowser: options.openBrowser ?? true,
143
+ tokenFile: options.tokenFile
144
+ };
145
+ }
146
+ export function createAuthController(auth, fetchImpl = fetch) {
147
+ if ("accessToken" in auth)
148
+ return new StaticAuthController(auth.accessToken);
149
+ if ("tokenProvider" in auth) {
150
+ return new ProviderAuthController(auth.tokenProvider, auth.loginProvider, auth.isLoginRequired, auth.loginHint);
151
+ }
152
+ return new OidcAuthController(resolveOidcOptions(auth.oidc), fetchImpl);
153
+ }
154
+ //# sourceMappingURL=oidc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.js","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function writePrivateText(path: string, content: string): Promise<void>;
2
+ export declare function writePrivateJson(path: string, value: unknown): Promise<void>;
3
+ export declare function readJsonIfExists(path: string): Promise<unknown | undefined>;
@@ -0,0 +1,30 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ export async function writePrivateText(path, content) {
5
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
6
+ const temporaryPath = `${path}.${process.pid}.${randomBytes(8).toString("hex")}.tmp`;
7
+ try {
8
+ await writeFile(temporaryPath, content, { encoding: "utf8", mode: 0o600 });
9
+ await rename(temporaryPath, path);
10
+ if (process.platform !== "win32")
11
+ await chmod(path, 0o600);
12
+ }
13
+ finally {
14
+ await rm(temporaryPath, { force: true }).catch(() => undefined);
15
+ }
16
+ }
17
+ export async function writePrivateJson(path, value) {
18
+ await writePrivateText(path, `${JSON.stringify(value, null, 2)}\n`);
19
+ }
20
+ export async function readJsonIfExists(path) {
21
+ try {
22
+ return JSON.parse(await readFile(path, "utf8"));
23
+ }
24
+ catch (error) {
25
+ if (error.code === "ENOENT")
26
+ return undefined;
27
+ throw error;
28
+ }
29
+ }
30
+ //# sourceMappingURL=private-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-file.js","sourceRoot":"","sources":["../src/private-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAe;IAClE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACrF,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,MAAM,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAc;IACjE,MAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface ResolvedCodexProfile {
2
+ sourceUrl: string;
3
+ profileId: string;
4
+ revision: number;
5
+ environment: string;
6
+ tenantId: string;
7
+ tenantHeaderName: string;
8
+ serverUrl: string;
9
+ resource: string;
10
+ audience: string;
11
+ roleClientId: string;
12
+ authority: {
13
+ issuer: string;
14
+ discoveryUrl: string;
15
+ clientId: string;
16
+ scope: string;
17
+ };
18
+ stale: boolean;
19
+ }
20
+ export interface ResolveCodexProfileOptions {
21
+ profileUrl?: string;
22
+ serverUrl?: string;
23
+ tenantId?: string;
24
+ fetch?: typeof globalThis.fetch;
25
+ configDirectory?: string;
26
+ now?: () => number;
27
+ onWarning?: (message: string) => void;
28
+ }
29
+ export declare function resolveCodexProfile(options: ResolveCodexProfileOptions): Promise<ResolvedCodexProfile>;