@numa-tech/numa 1.11.10

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 (99) hide show
  1. package/README.md +602 -0
  2. package/THIRD_PARTY_NOTICES.md +13 -0
  3. package/assets/codex-shortcut-icon.icns +0 -0
  4. package/assets/codex-shortcut-icon.ico +0 -0
  5. package/dist/app-config.d.ts +26 -0
  6. package/dist/app-config.js +135 -0
  7. package/dist/app-config.js.map +1 -0
  8. package/dist/backend.d.ts +16 -0
  9. package/dist/backend.js +106 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/branding.d.ts +7 -0
  12. package/dist/branding.js +13 -0
  13. package/dist/branding.js.map +1 -0
  14. package/dist/chatgpt-console.d.ts +53 -0
  15. package/dist/chatgpt-console.js +105 -0
  16. package/dist/chatgpt-console.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +451 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/codex-auth-agent.d.ts +60 -0
  21. package/dist/codex-auth-agent.js +331 -0
  22. package/dist/codex-auth-agent.js.map +1 -0
  23. package/dist/codex-commands.d.ts +2 -0
  24. package/dist/codex-commands.js +528 -0
  25. package/dist/codex-commands.js.map +1 -0
  26. package/dist/codex-legacy-cleanup.d.ts +5 -0
  27. package/dist/codex-legacy-cleanup.js +77 -0
  28. package/dist/codex-legacy-cleanup.js.map +1 -0
  29. package/dist/codex-process.d.ts +13 -0
  30. package/dist/codex-process.js +193 -0
  31. package/dist/codex-process.js.map +1 -0
  32. package/dist/codex-protocol.d.ts +352 -0
  33. package/dist/codex-protocol.js +116 -0
  34. package/dist/codex-protocol.js.map +1 -0
  35. package/dist/codex-quota-cache.d.ts +20 -0
  36. package/dist/codex-quota-cache.js +82 -0
  37. package/dist/codex-quota-cache.js.map +1 -0
  38. package/dist/codex-selection.d.ts +18 -0
  39. package/dist/codex-selection.js +47 -0
  40. package/dist/codex-selection.js.map +1 -0
  41. package/dist/codex-service-client.d.ts +11 -0
  42. package/dist/codex-service-client.js +91 -0
  43. package/dist/codex-service-client.js.map +1 -0
  44. package/dist/codex-shortcuts.d.ts +43 -0
  45. package/dist/codex-shortcuts.js +429 -0
  46. package/dist/codex-shortcuts.js.map +1 -0
  47. package/dist/codex-tui.d.ts +15 -0
  48. package/dist/codex-tui.js +235 -0
  49. package/dist/codex-tui.js.map +1 -0
  50. package/dist/command-catalog.d.ts +9 -0
  51. package/dist/command-catalog.js +206 -0
  52. package/dist/command-catalog.js.map +1 -0
  53. package/dist/config-page.d.ts +2 -0
  54. package/dist/config-page.js +51 -0
  55. package/dist/config-page.js.map +1 -0
  56. package/dist/config.d.ts +22 -0
  57. package/dist/config.js +99 -0
  58. package/dist/config.js.map +1 -0
  59. package/dist/identity.d.ts +23 -0
  60. package/dist/identity.js +78 -0
  61. package/dist/identity.js.map +1 -0
  62. package/dist/media/client.d.ts +79 -0
  63. package/dist/media/client.js +175 -0
  64. package/dist/media/client.js.map +1 -0
  65. package/dist/media/commands.d.ts +2 -0
  66. package/dist/media/commands.js +193 -0
  67. package/dist/media/commands.js.map +1 -0
  68. package/dist/media/errors.d.ts +8 -0
  69. package/dist/media/errors.js +37 -0
  70. package/dist/media/errors.js.map +1 -0
  71. package/dist/media/schemas.d.ts +62 -0
  72. package/dist/media/schemas.js +71 -0
  73. package/dist/media/schemas.js.map +1 -0
  74. package/dist/media/transfers.d.ts +38 -0
  75. package/dist/media/transfers.js +169 -0
  76. package/dist/media/transfers.js.map +1 -0
  77. package/dist/oauth.d.ts +30 -0
  78. package/dist/oauth.js +295 -0
  79. package/dist/oauth.js.map +1 -0
  80. package/dist/private-file.d.ts +3 -0
  81. package/dist/private-file.js +51 -0
  82. package/dist/private-file.js.map +1 -0
  83. package/dist/server.d.ts +2 -0
  84. package/dist/server.js +197 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/types.d.ts +40 -0
  87. package/dist/types.js +2 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/web-console-page.d.ts +3 -0
  90. package/dist/web-console-page.js +59 -0
  91. package/dist/web-console-page.js.map +1 -0
  92. package/dist/web-console.d.ts +22 -0
  93. package/dist/web-console.js +335 -0
  94. package/dist/web-console.js.map +1 -0
  95. package/examples/claude-desktop-installed-binary.json +11 -0
  96. package/examples/claude-desktop-npx.json +12 -0
  97. package/examples/codex-installed-binary.json +11 -0
  98. package/examples/codex-npx.json +12 -0
  99. package/package.json +67 -0
@@ -0,0 +1,116 @@
1
+ import { z } from "zod";
2
+ export const CODEX_DISTRIBUTION_SCHEMA_VERSION = 1;
3
+ export const CODEX_ACCOUNTS_PATH = "/v1/codex/accounts";
4
+ export const CODEX_ACCOUNTS_LIST_PATH = CODEX_ACCOUNTS_PATH;
5
+ const CodexQuotaInstantSchema = z.union([
6
+ z.number().int().positive(),
7
+ z.string().datetime({ offset: true })
8
+ ]);
9
+ function quotaInstantIsPresent(value) {
10
+ if (typeof value === "number")
11
+ return Number.isFinite(value) && value > 0;
12
+ return typeof value === "string" && Number.isFinite(Date.parse(value));
13
+ }
14
+ export function codexQuotaWindowHasData(window) {
15
+ if (!window)
16
+ return false;
17
+ const hasWindowDuration = typeof window.windowMinutes === "number" &&
18
+ Number.isFinite(window.windowMinutes) &&
19
+ window.windowMinutes > 0;
20
+ const hasObservedUsage = typeof window.usedPercent === "number" &&
21
+ Number.isFinite(window.usedPercent) &&
22
+ window.usedPercent > 0;
23
+ return hasWindowDuration || quotaInstantIsPresent(window.resetAt) || hasObservedUsage;
24
+ }
25
+ const CodexQuotaWindowFieldsSchema = z.object({
26
+ usedPercent: z.number().min(0).max(100).nullable().optional(),
27
+ windowMinutes: z.number().int().nonnegative().nullable().optional(),
28
+ resetAt: CodexQuotaInstantSchema.nullable().optional()
29
+ });
30
+ export const CodexQuotaWindowViewSchema = CodexQuotaWindowFieldsSchema.transform((window) => codexQuotaWindowHasData(window) ? window : null);
31
+ export const CodexQuotaSnapshotViewSchema = z.object({
32
+ updatedAt: CodexQuotaInstantSchema.nullable().optional(),
33
+ status: z.number().int().nullable().optional(),
34
+ model: z.string().max(180).nullable().optional(),
35
+ planType: z.string().max(80).nullable().optional(),
36
+ activeLimit: z.number().int().nonnegative().nullable().optional(),
37
+ primary: CodexQuotaWindowViewSchema.nullable().optional(),
38
+ secondary: CodexQuotaWindowViewSchema.nullable().optional()
39
+ });
40
+ export const CodexAccountSummarySchema = z.object({
41
+ id: z.string().min(1).max(128),
42
+ accountId: z.string().min(1).max(512),
43
+ label: z.string().min(1).max(256),
44
+ isDefault: z.boolean(),
45
+ accessExpiresAt: z.number().int().positive().optional(),
46
+ credentialStatus: z.enum([
47
+ "AVAILABLE",
48
+ "NEEDS_REAUTH",
49
+ "TEMPORARILY_UNAVAILABLE"
50
+ ]).optional(),
51
+ quota: CodexQuotaSnapshotViewSchema.nullable().optional()
52
+ });
53
+ export const CodexAccountListResponseSchema = z.object({
54
+ schemaVersion: z.literal(CODEX_DISTRIBUTION_SCHEMA_VERSION),
55
+ accounts: z.array(CodexAccountSummarySchema),
56
+ defaultAccountId: z.string().min(1).max(128).nullable().optional()
57
+ });
58
+ export const CodexAdminAccountSummarySchema = z.object({
59
+ publicId: z.string().min(1).max(128),
60
+ accountId: z.string().min(1).max(512),
61
+ label: z.string().min(1).max(256),
62
+ accessExpiresAt: z.string().datetime({ offset: true }).nullable().optional(),
63
+ quota: CodexQuotaSnapshotViewSchema.nullable().optional()
64
+ });
65
+ export const CodexAdminAccountListResponseSchema = z.array(CodexAdminAccountSummarySchema);
66
+ export const CodexLoginCredentialsResponseSchema = z.object({
67
+ schemaVersion: z.literal(CODEX_DISTRIBUTION_SCHEMA_VERSION),
68
+ account: CodexAccountSummarySchema,
69
+ accessToken: z.string().min(1),
70
+ idToken: z.string().min(1),
71
+ expiresAt: z.number().int().positive()
72
+ });
73
+ export const CodexUploadAccountSchema = z.object({
74
+ sourceKey: z.string().min(1).max(160),
75
+ accountId: z.string().min(1).max(512).optional(),
76
+ label: z.string().min(1).max(256),
77
+ email: z.string().max(512).optional(),
78
+ refreshToken: z.string().min(1),
79
+ accessToken: z.string().min(1).optional(),
80
+ idToken: z.string().min(1).optional(),
81
+ expiresAt: z.number().int().positive().optional(),
82
+ enabled: z.boolean(),
83
+ quota: z
84
+ .object({
85
+ updatedAt: z.number().int().positive(),
86
+ status: z.number().int(),
87
+ model: z.string().min(1).max(180),
88
+ planType: z.string().max(80).optional(),
89
+ activeLimit: z.number().int().nonnegative().optional(),
90
+ primary: z.object({
91
+ usedPercent: z.number().min(0).max(100).optional(),
92
+ windowMinutes: z.number().int().positive().optional(),
93
+ resetAt: z.number().int().positive().optional()
94
+ }),
95
+ secondary: z.object({
96
+ usedPercent: z.number().min(0).max(100).optional(),
97
+ windowMinutes: z.number().int().positive().optional(),
98
+ resetAt: z.number().int().positive().optional()
99
+ })
100
+ })
101
+ .optional()
102
+ });
103
+ export const CodexUploadBatchSchema = z.object({
104
+ source: z.string().min(1).max(128),
105
+ accounts: z.array(CodexUploadAccountSchema).min(1)
106
+ });
107
+ export const CodexImportResultSchema = z.object({
108
+ created: z.number().int().nonnegative(),
109
+ updated: z.number().int().nonnegative(),
110
+ accountIds: z.array(z.string().min(1))
111
+ });
112
+ export function codexAccountLoginCredentialsPath(accountId) {
113
+ return `${CODEX_ACCOUNTS_PATH}/${encodeURIComponent(accountId)}/login-credentials`;
114
+ }
115
+ export const CODEX_ACCOUNTS_IMPORT_PATH = "/v1/admin/codex/accounts/import";
116
+ //# sourceMappingURL=codex-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-protocol.js","sourceRoot":"","sources":["../src/codex-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface CodexQuotaWindowUpload {
2
+ usedPercent?: number;
3
+ windowMinutes?: number;
4
+ resetAt?: number;
5
+ }
6
+ export interface CodexQuotaUpload {
7
+ updatedAt: number;
8
+ status: number;
9
+ model: string;
10
+ planType?: string;
11
+ activeLimit?: number;
12
+ primary: CodexQuotaWindowUpload;
13
+ secondary: CodexQuotaWindowUpload;
14
+ }
15
+ interface AccountIdentity {
16
+ accountId?: string;
17
+ email?: string;
18
+ }
19
+ export declare function loadCodexQuotaUploads(storagePath: string, accounts: readonly AccountIdentity[]): Promise<Array<CodexQuotaUpload | undefined>>;
20
+ export {};
@@ -0,0 +1,82 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ function record(value) {
4
+ return value !== null && typeof value === "object" && !Array.isArray(value)
5
+ ? value
6
+ : undefined;
7
+ }
8
+ function finite(value) {
9
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
10
+ }
11
+ function quotaWindow(value) {
12
+ const source = record(value);
13
+ if (!source)
14
+ return {};
15
+ const used = finite(source.usedPercent);
16
+ const minutes = finite(source.windowMinutes);
17
+ const resetAt = finite(source.resetAtMs);
18
+ return {
19
+ ...(used === undefined ? {} : { usedPercent: Math.max(0, Math.min(100, used)) }),
20
+ ...(minutes === undefined || minutes <= 0 ? {} : { windowMinutes: Math.round(minutes) }),
21
+ ...(resetAt === undefined || resetAt <= 0 ? {} : { resetAt: Math.round(resetAt) })
22
+ };
23
+ }
24
+ function quotaSnapshot(value) {
25
+ const source = record(value);
26
+ if (!source)
27
+ return undefined;
28
+ const updatedAt = finite(source.updatedAt);
29
+ const status = finite(source.status);
30
+ const activeLimit = finite(source.activeLimit);
31
+ const model = typeof source.model === "string" ? source.model.trim() : "";
32
+ if (!updatedAt || status === undefined || !model)
33
+ return undefined;
34
+ return {
35
+ updatedAt: Math.round(updatedAt),
36
+ status: Math.round(status),
37
+ model,
38
+ ...(typeof source.planType === "string" && source.planType.trim()
39
+ ? { planType: source.planType.trim() }
40
+ : {}),
41
+ ...(activeLimit === undefined || activeLimit < 0
42
+ ? {}
43
+ : { activeLimit: Math.round(activeLimit) }),
44
+ primary: quotaWindow(source.primary),
45
+ secondary: quotaWindow(source.secondary)
46
+ };
47
+ }
48
+ export async function loadCodexQuotaUploads(storagePath, accounts) {
49
+ try {
50
+ const content = await fs.readFile(join(dirname(storagePath), "quota-cache.json"), "utf8");
51
+ const parsed = record(JSON.parse(content));
52
+ if (!parsed || parsed.version !== 1)
53
+ return accounts.map(() => undefined);
54
+ const byAccountId = record(parsed.byAccountId) ?? {};
55
+ const byEmail = record(parsed.byEmail) ?? {};
56
+ const normalized = accounts.map((account) => ({
57
+ accountId: account.accountId?.trim() || undefined,
58
+ email: account.email?.trim().toLowerCase() || undefined
59
+ }));
60
+ return normalized.map((account) => {
61
+ const accountIdCount = account.accountId
62
+ ? normalized.filter((candidate) => candidate.accountId === account.accountId).length
63
+ : 0;
64
+ if (account.accountId && accountIdCount === 1) {
65
+ const byId = byAccountId[account.accountId];
66
+ if (byId)
67
+ return quotaSnapshot(byId);
68
+ }
69
+ if (!account.email)
70
+ return undefined;
71
+ const emailMatches = normalized.filter((candidate) => candidate.email === account.email);
72
+ const distinctAccountIds = new Set(emailMatches.flatMap((candidate) => candidate.accountId ? [candidate.accountId] : []));
73
+ return emailMatches.length === 1 && distinctAccountIds.size <= 1
74
+ ? quotaSnapshot(byEmail[account.email])
75
+ : undefined;
76
+ });
77
+ }
78
+ catch {
79
+ return accounts.map(() => undefined);
80
+ }
81
+ }
82
+ //# sourceMappingURL=codex-quota-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-quota-cache.js","sourceRoot":"","sources":["../src/codex-quota-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ declare const CodexSelectionSchema: z.ZodObject<{
3
+ schemaVersion: z.ZodLiteral<1>;
4
+ serviceUrl: z.ZodString;
5
+ allowInsecurePoc: z.ZodBoolean;
6
+ account: z.ZodObject<{
7
+ id: z.ZodString;
8
+ accountId: z.ZodString;
9
+ label: z.ZodString;
10
+ }, z.core.$strip>;
11
+ updatedAt: z.ZodString;
12
+ }, z.core.$strip>;
13
+ export type CodexSelection = z.infer<typeof CodexSelectionSchema>;
14
+ export declare function codexSelectionPath(): string;
15
+ export declare function loadCodexSelection(): Promise<CodexSelection | undefined>;
16
+ export declare function saveCodexSelection(selection: Omit<CodexSelection, "schemaVersion" | "updatedAt">): Promise<CodexSelection>;
17
+ export declare function clearCodexSelection(): Promise<void>;
18
+ export {};
@@ -0,0 +1,47 @@
1
+ import { rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
4
+ import { appConfigDirectory } from "./app-config.js";
5
+ import { readJsonIfExists, writePrivateJson } from "./private-file.js";
6
+ const CodexSelectionSchema = z.object({
7
+ schemaVersion: z.literal(1),
8
+ serviceUrl: z.string().url(),
9
+ allowInsecurePoc: z.boolean(),
10
+ account: z.object({
11
+ id: z.string().min(1),
12
+ accountId: z.string().min(1),
13
+ label: z.string().min(1)
14
+ }),
15
+ updatedAt: z.string().datetime()
16
+ });
17
+ export function codexSelectionPath() {
18
+ return join(appConfigDirectory(), "codex-selection.json");
19
+ }
20
+ function legacyCodexTokenCachePath() {
21
+ return join(appConfigDirectory(), "codex-access-token.json");
22
+ }
23
+ export async function loadCodexSelection() {
24
+ const raw = await readJsonIfExists(codexSelectionPath());
25
+ if (raw === undefined)
26
+ return undefined;
27
+ const parsed = CodexSelectionSchema.safeParse(raw);
28
+ if (!parsed.success) {
29
+ throw new Error(`Codex 账号选择文件格式无效: ${codexSelectionPath()}`);
30
+ }
31
+ return parsed.data;
32
+ }
33
+ export async function saveCodexSelection(selection) {
34
+ const saved = {
35
+ schemaVersion: 1,
36
+ ...selection,
37
+ updatedAt: new Date().toISOString()
38
+ };
39
+ await writePrivateJson(codexSelectionPath(), saved);
40
+ await rm(legacyCodexTokenCachePath(), { force: true });
41
+ return saved;
42
+ }
43
+ export async function clearCodexSelection() {
44
+ await rm(codexSelectionPath(), { force: true });
45
+ await rm(legacyCodexTokenCachePath(), { force: true });
46
+ }
47
+ //# sourceMappingURL=codex-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-selection.js","sourceRoot":"","sources":["../src/codex-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC5B,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAIH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,kBAAkB,EAAE,EAAE,sBAAsB,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO,IAAI,CAAC,kBAAkB,EAAE,EAAE,yBAAyB,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAA8D;IAE9D,MAAM,KAAK,GAAmB;QAC5B,aAAa,EAAE,CAAC;QAChB,GAAG,SAAS;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,MAAM,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,yBAAyB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,EAAE,CAAC,kBAAkB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,yBAAyB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { AuthConfig } from "./config.js";
2
+ import { type CodexAccountListResponse, type CodexImportResult, type CodexUploadBatch, type CodexLoginCredentialsResponse } from "./codex-protocol.js";
3
+ export declare class CodexServiceError extends Error {
4
+ readonly code: string;
5
+ readonly status?: number | undefined;
6
+ constructor(message: string, code: string, status?: number | undefined);
7
+ }
8
+ export declare function normalizeCodexServiceUrl(rawUrl: string, allowInsecurePoc?: boolean): string;
9
+ export declare function uploadRemoteCodexAccounts(authConfig: AuthConfig, serviceUrl: string, payload: CodexUploadBatch, allowInsecurePoc?: boolean, fetchImpl?: typeof fetch): Promise<CodexImportResult>;
10
+ export declare function listRemoteCodexAccounts(authConfig: AuthConfig, serviceUrl: string, allowInsecurePoc?: boolean, fetchImpl?: typeof fetch): Promise<CodexAccountListResponse>;
11
+ export declare function fetchRemoteCodexLoginCredentials(authConfig: AuthConfig, serviceUrl: string, accountId: string, allowInsecurePoc?: boolean, fetchImpl?: typeof fetch): Promise<CodexLoginCredentialsResponse>;
@@ -0,0 +1,91 @@
1
+ import { AuthError, fetchWithKeycloakIdentity } from "./oauth.js";
2
+ import { CODEX_ACCOUNTS_LIST_PATH, CODEX_ACCOUNTS_IMPORT_PATH, CodexAccountListResponseSchema, CodexImportResultSchema, CodexLoginCredentialsResponseSchema, codexAccountLoginCredentialsPath } from "./codex-protocol.js";
3
+ export class CodexServiceError extends Error {
4
+ code;
5
+ status;
6
+ constructor(message, code, status) {
7
+ super(message);
8
+ this.code = code;
9
+ this.status = status;
10
+ }
11
+ }
12
+ export function normalizeCodexServiceUrl(rawUrl, allowInsecurePoc = false) {
13
+ const url = new URL(rawUrl);
14
+ const loopback = ["127.0.0.1", "localhost", "::1", "[::1]"].includes(url.hostname);
15
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && (loopback || allowInsecurePoc))) {
16
+ throw new CodexServiceError("Codex 账号服务必须使用 HTTPS;非回环 HTTP 仅可与 --insecure-poc 一起用于隔离网络联调。", "insecure_codex_service");
17
+ }
18
+ url.hash = "";
19
+ url.search = "";
20
+ return url.toString().replace(/\/+$/, "");
21
+ }
22
+ async function requestCodexService(authConfig, serviceUrl, path, allowInsecurePoc, fetchImpl = fetch, request) {
23
+ const normalized = normalizeCodexServiceUrl(serviceUrl, allowInsecurePoc);
24
+ const requestBody = request ? JSON.stringify(request.body) : undefined;
25
+ let response;
26
+ try {
27
+ response = await fetchWithKeycloakIdentity(authConfig, `${normalized}${path}`, () => ({
28
+ method: request?.method ?? "GET",
29
+ headers: {
30
+ Accept: "application/json",
31
+ ...(request ? { "Content-Type": "application/json" } : {})
32
+ },
33
+ ...(requestBody !== undefined ? { body: requestBody } : {}),
34
+ signal: AbortSignal.timeout(10_000)
35
+ }), { fetch: fetchImpl });
36
+ }
37
+ catch (error) {
38
+ if (error instanceof AuthError)
39
+ throw error;
40
+ throw new CodexServiceError(`无法连接 Codex 账号服务: ${error instanceof Error ? error.message : String(error)}`, "codex_service_unavailable");
41
+ }
42
+ const text = await response.text();
43
+ let body;
44
+ try {
45
+ body = text ? JSON.parse(text) : {};
46
+ }
47
+ catch {
48
+ throw new CodexServiceError(`Codex 账号服务返回了非 JSON 响应 (HTTP ${response.status})`, "invalid_codex_service_response", response.status);
49
+ }
50
+ if (!response.ok) {
51
+ const problem = body && typeof body === "object"
52
+ ? body
53
+ : undefined;
54
+ const serviceCode = typeof problem?.code === "string" ? problem.code : undefined;
55
+ const detail = [problem?.detail, problem?.error, problem?.title]
56
+ .find((value) => typeof value === "string" && value.trim().length > 0)
57
+ ?? response.statusText;
58
+ if (serviceCode === "codex_account_needs_reauth") {
59
+ throw new CodexServiceError("ChatGPT 账号凭据已失效,需要管理员重新导入或更新登录凭据。", serviceCode, response.status);
60
+ }
61
+ throw new CodexServiceError(`Codex 账号服务请求失败 (HTTP ${response.status}): ${detail}`, serviceCode
62
+ ?? (response.status === 401 || response.status === 403
63
+ ? "codex_access_denied"
64
+ : "codex_service_error"), response.status);
65
+ }
66
+ return body;
67
+ }
68
+ export async function uploadRemoteCodexAccounts(authConfig, serviceUrl, payload, allowInsecurePoc = false, fetchImpl = fetch) {
69
+ const raw = await requestCodexService(authConfig, serviceUrl, CODEX_ACCOUNTS_IMPORT_PATH, allowInsecurePoc, fetchImpl, { method: "POST", body: payload });
70
+ const parsed = CodexImportResultSchema.safeParse(raw);
71
+ if (!parsed.success) {
72
+ throw new CodexServiceError("Codex 账号上传响应格式无效。", "invalid_codex_service_response");
73
+ }
74
+ return parsed.data;
75
+ }
76
+ export async function listRemoteCodexAccounts(authConfig, serviceUrl, allowInsecurePoc = false, fetchImpl = fetch) {
77
+ const raw = await requestCodexService(authConfig, serviceUrl, CODEX_ACCOUNTS_LIST_PATH, allowInsecurePoc, fetchImpl);
78
+ const parsed = CodexAccountListResponseSchema.safeParse(raw);
79
+ if (parsed.success)
80
+ return parsed.data;
81
+ throw new CodexServiceError("Codex 账号列表响应格式无效。", "invalid_codex_service_response");
82
+ }
83
+ export async function fetchRemoteCodexLoginCredentials(authConfig, serviceUrl, accountId, allowInsecurePoc = false, fetchImpl = fetch) {
84
+ const raw = await requestCodexService(authConfig, serviceUrl, codexAccountLoginCredentialsPath(accountId), allowInsecurePoc, fetchImpl);
85
+ const parsed = CodexLoginCredentialsResponseSchema.safeParse(raw);
86
+ if (!parsed.success || parsed.data.account.id !== accountId) {
87
+ throw new CodexServiceError("Codex 登录凭据响应格式或账号不匹配。", "invalid_codex_service_response");
88
+ }
89
+ return parsed.data;
90
+ }
91
+ //# sourceMappingURL=codex-service-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-service-client.js","sourceRoot":"","sources":["../src/codex-service-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export type CodexShortcutTarget = "run" | "app" | "both";
2
+ export type CodexShortcutPlatform = "darwin" | "win32";
3
+ export type CodexShortcutScope = "auto" | "system" | "user";
4
+ export interface CodexShortcutOptions {
5
+ target?: CodexShortcutTarget;
6
+ commandName?: string;
7
+ appName?: string;
8
+ workspace?: string;
9
+ account?: string;
10
+ selectAccount?: boolean;
11
+ server?: string;
12
+ insecurePoc?: boolean;
13
+ force?: boolean;
14
+ scope?: CodexShortcutScope;
15
+ registryUrl?: string;
16
+ }
17
+ export interface CodexShortcutArtifact {
18
+ kind: "run-command" | "app-command" | "app-icon" | "app-shortcut";
19
+ path: string;
20
+ }
21
+ export interface CodexShortcutResult {
22
+ platform: CodexShortcutPlatform;
23
+ action: "installed" | "removed";
24
+ artifacts: CodexShortcutArtifact[];
25
+ commandDirectory: string;
26
+ pathReady: boolean;
27
+ pathHint?: string;
28
+ scope: Exclude<CodexShortcutScope, "auto">;
29
+ }
30
+ interface ShortcutDependencies {
31
+ platform?: NodeJS.Platform;
32
+ homeDirectory?: string;
33
+ cwd?: string;
34
+ env?: NodeJS.ProcessEnv;
35
+ createWindowsLink?: (linkPath: string, commandPath: string, workspace: string, iconPath: string) => Promise<void>;
36
+ macSystemCommandDirectory?: string;
37
+ macSystemApplicationsDirectory?: string;
38
+ canUseMacSystemPaths?: boolean;
39
+ }
40
+ export declare function installCodexShortcuts(options?: CodexShortcutOptions, dependencies?: ShortcutDependencies): Promise<CodexShortcutResult>;
41
+ export declare function removeCodexShortcuts(options?: Pick<CodexShortcutOptions, "target" | "commandName" | "appName" | "scope">, dependencies?: ShortcutDependencies): Promise<CodexShortcutResult>;
42
+ export declare function codexShortcutInstallHintNeeded(dependencies?: ShortcutDependencies): Promise<boolean>;
43
+ export {};