ai-zero-token 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +262 -0
  3. package/dist/api.js +6 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/cli/commands/ask.js +15 -0
  6. package/dist/cli/commands/ask.js.map +1 -0
  7. package/dist/cli/commands/clear.js +11 -0
  8. package/dist/cli/commands/clear.js.map +1 -0
  9. package/dist/cli/commands/help.js +26 -0
  10. package/dist/cli/commands/help.js.map +1 -0
  11. package/dist/cli/commands/login.js +21 -0
  12. package/dist/cli/commands/login.js.map +1 -0
  13. package/dist/cli/commands/models.js +14 -0
  14. package/dist/cli/commands/models.js.map +1 -0
  15. package/dist/cli/commands/serve.js +18 -0
  16. package/dist/cli/commands/serve.js.map +1 -0
  17. package/dist/cli/commands/status.js +32 -0
  18. package/dist/cli/commands/status.js.map +1 -0
  19. package/dist/cli/index.js +43 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/shared.js +50 -0
  22. package/dist/cli/shared.js.map +1 -0
  23. package/dist/cli.js +8 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/core/context.js +24 -0
  26. package/dist/core/context.js.map +1 -0
  27. package/dist/core/models/openai-codex-models.js +34 -0
  28. package/dist/core/models/openai-codex-models.js.map +1 -0
  29. package/dist/core/providers/http-client.js +84 -0
  30. package/dist/core/providers/http-client.js.map +1 -0
  31. package/dist/core/providers/openai-codex/chat.js +102 -0
  32. package/dist/core/providers/openai-codex/chat.js.map +1 -0
  33. package/dist/core/providers/openai-codex/oauth.js +284 -0
  34. package/dist/core/providers/openai-codex/oauth.js.map +1 -0
  35. package/dist/core/providers/openai-codex/pkce.js +21 -0
  36. package/dist/core/providers/openai-codex/pkce.js.map +1 -0
  37. package/dist/core/services/auth-service.js +73 -0
  38. package/dist/core/services/auth-service.js.map +1 -0
  39. package/dist/core/services/chat-service.js +28 -0
  40. package/dist/core/services/chat-service.js.map +1 -0
  41. package/dist/core/services/config-service.js +69 -0
  42. package/dist/core/services/config-service.js.map +1 -0
  43. package/dist/core/services/model-service.js +42 -0
  44. package/dist/core/services/model-service.js.map +1 -0
  45. package/dist/core/store/profile-store.js +74 -0
  46. package/dist/core/store/profile-store.js.map +1 -0
  47. package/dist/core/store/settings-store.js +51 -0
  48. package/dist/core/store/settings-store.js.map +1 -0
  49. package/dist/core/types.js +2 -0
  50. package/dist/core/types.js.map +1 -0
  51. package/dist/http.js +6 -0
  52. package/dist/http.js.map +1 -0
  53. package/dist/models.js +14 -0
  54. package/dist/models.js.map +1 -0
  55. package/dist/oauth.js +10 -0
  56. package/dist/oauth.js.map +1 -0
  57. package/dist/pkce.js +6 -0
  58. package/dist/pkce.js.map +1 -0
  59. package/dist/server/app.js +115 -0
  60. package/dist/server/app.js.map +1 -0
  61. package/dist/server/index.js +23 -0
  62. package/dist/server/index.js.map +1 -0
  63. package/dist/store.js +20 -0
  64. package/dist/store.js.map +1 -0
  65. package/package.json +55 -0
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ import { askOpenAICodex } from "../providers/openai-codex/chat.js";
3
+ class ChatService {
4
+ constructor(deps) {
5
+ this.deps = deps;
6
+ }
7
+ async chat(request) {
8
+ const provider = request.provider ?? "openai-codex";
9
+ const model = await this.deps.modelService.resolveModel(provider, request.model);
10
+ const profile = await this.deps.authService.requireUsableProfile(provider);
11
+ const result = await askOpenAICodex({
12
+ profile,
13
+ prompt: request.input,
14
+ model,
15
+ system: request.system
16
+ });
17
+ return {
18
+ provider,
19
+ model,
20
+ text: result.text,
21
+ raw: result.raw
22
+ };
23
+ }
24
+ }
25
+ export {
26
+ ChatService
27
+ };
28
+ //# sourceMappingURL=chat-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/services/chat-service.ts"],"sourcesContent":["import type { ChatRequest, ChatResult } from \"../types.js\";\nimport { askOpenAICodex } from \"../providers/openai-codex/chat.js\";\nimport { AuthService } from \"./auth-service.js\";\nimport { ModelService } from \"./model-service.js\";\n\ntype ChatServiceDeps = {\n authService: AuthService;\n modelService: ModelService;\n};\n\nexport class ChatService {\n constructor(private readonly deps: ChatServiceDeps) {}\n\n async chat(request: ChatRequest): Promise<ChatResult> {\n const provider = request.provider ?? \"openai-codex\";\n const model = await this.deps.modelService.resolveModel(provider, request.model);\n const profile = await this.deps.authService.requireUsableProfile(provider);\n const result = await askOpenAICodex({\n profile,\n prompt: request.input,\n model,\n system: request.system,\n });\n\n return {\n provider,\n model,\n text: result.text,\n raw: result.raw,\n };\n }\n}\n"],"mappings":";AACA,SAAS,sBAAsB;AASxB,MAAM,YAAY;AAAA,EACvB,YAA6B,MAAuB;AAAvB;AAAA,EAAwB;AAAA,EAErD,MAAM,KAAK,SAA2C;AACpD,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,QAAQ,MAAM,KAAK,KAAK,aAAa,aAAa,UAAU,QAAQ,KAAK;AAC/E,UAAM,UAAU,MAAM,KAAK,KAAK,YAAY,qBAAqB,QAAQ;AACzE,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM,OAAO;AAAA,MACb,KAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ import { DEFAULT_CODEX_MODEL, isSupportedCodexModel } from "../models/openai-codex-models.js";
3
+ import {
4
+ createDefaultSettings,
5
+ loadSettings,
6
+ saveSettings
7
+ } from "../store/settings-store.js";
8
+ class ConfigService {
9
+ async getSettings() {
10
+ return this.ensureSettings();
11
+ }
12
+ async ensureSettings() {
13
+ const settings = await loadSettings();
14
+ await saveSettings(settings);
15
+ return settings;
16
+ }
17
+ async getDefaultProvider() {
18
+ const settings = await this.getSettings();
19
+ return settings.defaultProvider;
20
+ }
21
+ async getDefaultModel(provider = "openai-codex") {
22
+ const settings = await this.getSettings();
23
+ if (provider !== "openai-codex") {
24
+ throw new Error(`\u6682\u4E0D\u652F\u6301 provider: ${provider}`);
25
+ }
26
+ return isSupportedCodexModel(settings.defaultModel) ? settings.defaultModel : DEFAULT_CODEX_MODEL;
27
+ }
28
+ async setDefaultModel(model, provider = "openai-codex") {
29
+ if (provider !== "openai-codex") {
30
+ throw new Error(`\u6682\u4E0D\u652F\u6301 provider: ${provider}`);
31
+ }
32
+ if (!isSupportedCodexModel(model)) {
33
+ throw new Error(`\u5F53\u524D demo \u672A\u5185\u7F6E\u6A21\u578B: ${model}`);
34
+ }
35
+ const settings = await this.getSettings();
36
+ const next = {
37
+ ...settings,
38
+ defaultProvider: provider,
39
+ defaultModel: model
40
+ };
41
+ await saveSettings(next);
42
+ return next;
43
+ }
44
+ async getServerConfig() {
45
+ const settings = await this.getSettings();
46
+ return settings.server;
47
+ }
48
+ async setServerConfig(params) {
49
+ const settings = await this.getSettings();
50
+ const next = {
51
+ ...settings,
52
+ server: {
53
+ host: params.host ?? settings.server.host,
54
+ port: params.port ?? settings.server.port
55
+ }
56
+ };
57
+ await saveSettings(next);
58
+ return next;
59
+ }
60
+ async resetSettings() {
61
+ const defaults = createDefaultSettings();
62
+ await saveSettings(defaults);
63
+ return defaults;
64
+ }
65
+ }
66
+ export {
67
+ ConfigService
68
+ };
69
+ //# sourceMappingURL=config-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/services/config-service.ts"],"sourcesContent":["import type { GatewaySettings, ProviderId } from \"../types.js\";\nimport { DEFAULT_CODEX_MODEL, isSupportedCodexModel } from \"../models/openai-codex-models.js\";\nimport {\n createDefaultSettings,\n loadSettings,\n saveSettings,\n} from \"../store/settings-store.js\";\n\nexport class ConfigService {\n async getSettings(): Promise<GatewaySettings> {\n return this.ensureSettings();\n }\n\n async ensureSettings(): Promise<GatewaySettings> {\n const settings = await loadSettings();\n await saveSettings(settings);\n return settings;\n }\n\n async getDefaultProvider(): Promise<ProviderId> {\n const settings = await this.getSettings();\n return settings.defaultProvider;\n }\n\n async getDefaultModel(provider: ProviderId = \"openai-codex\"): Promise<string> {\n const settings = await this.getSettings();\n if (provider !== \"openai-codex\") {\n throw new Error(`暂不支持 provider: ${provider}`);\n }\n return isSupportedCodexModel(settings.defaultModel) ? settings.defaultModel : DEFAULT_CODEX_MODEL;\n }\n\n async setDefaultModel(model: string, provider: ProviderId = \"openai-codex\"): Promise<GatewaySettings> {\n if (provider !== \"openai-codex\") {\n throw new Error(`暂不支持 provider: ${provider}`);\n }\n if (!isSupportedCodexModel(model)) {\n throw new Error(`当前 demo 未内置模型: ${model}`);\n }\n\n const settings = await this.getSettings();\n const next = {\n ...settings,\n defaultProvider: provider,\n defaultModel: model,\n };\n await saveSettings(next);\n return next;\n }\n\n async getServerConfig(): Promise<{ host: string; port: number }> {\n const settings = await this.getSettings();\n return settings.server;\n }\n\n async setServerConfig(params: { host?: string; port?: number }): Promise<GatewaySettings> {\n const settings = await this.getSettings();\n const next = {\n ...settings,\n server: {\n host: params.host ?? settings.server.host,\n port: params.port ?? settings.server.port,\n },\n };\n await saveSettings(next);\n return next;\n }\n\n async resetSettings(): Promise<GatewaySettings> {\n const defaults = createDefaultSettings();\n await saveSettings(defaults);\n return defaults;\n }\n}\n"],"mappings":";AACA,SAAS,qBAAqB,6BAA6B;AAC3D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,cAAc;AAAA,EACzB,MAAM,cAAwC;AAC5C,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,MAAM,iBAA2C;AAC/C,UAAM,WAAW,MAAM,aAAa;AACpC,UAAM,aAAa,QAAQ;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,qBAA0C;AAC9C,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,gBAAgB,WAAuB,gBAAiC;AAC5E,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,QAAI,aAAa,gBAAgB;AAC/B,YAAM,IAAI,MAAM,sCAAkB,QAAQ,EAAE;AAAA,IAC9C;AACA,WAAO,sBAAsB,SAAS,YAAY,IAAI,SAAS,eAAe;AAAA,EAChF;AAAA,EAEA,MAAM,gBAAgB,OAAe,WAAuB,gBAA0C;AACpG,QAAI,aAAa,gBAAgB;AAC/B,YAAM,IAAI,MAAM,sCAAkB,QAAQ,EAAE;AAAA,IAC9C;AACA,QAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,YAAM,IAAI,MAAM,qDAAkB,KAAK,EAAE;AAAA,IAC3C;AAEA,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,UAAM,OAAO;AAAA,MACX,GAAG;AAAA,MACH,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB;AACA,UAAM,aAAa,IAAI;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAA2D;AAC/D,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,gBAAgB,QAAoE;AACxF,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,UAAM,OAAO;AAAA,MACX,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,MAAM,OAAO,QAAQ,SAAS,OAAO;AAAA,QACrC,MAAM,OAAO,QAAQ,SAAS,OAAO;AAAA,MACvC;AAAA,IACF;AACA,UAAM,aAAa,IAAI;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAA0C;AAC9C,UAAM,WAAW,sBAAsB;AACvC,UAAM,aAAa,QAAQ;AAC3B,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ CODEX_MODEL_INFOS,
4
+ isSupportedCodexModel
5
+ } from "../models/openai-codex-models.js";
6
+ class ModelService {
7
+ constructor(configService) {
8
+ this.configService = configService;
9
+ }
10
+ async listModels(provider = "openai-codex") {
11
+ if (provider !== "openai-codex") {
12
+ throw new Error(`\u6682\u4E0D\u652F\u6301 provider: ${provider}`);
13
+ }
14
+ const defaultModel = await this.configService.getDefaultModel(provider);
15
+ return CODEX_MODEL_INFOS.map((model) => ({
16
+ ...model,
17
+ isDefault: model.id === defaultModel
18
+ }));
19
+ }
20
+ async getDefaultModel(provider = "openai-codex") {
21
+ if (provider !== "openai-codex") {
22
+ throw new Error(`\u6682\u4E0D\u652F\u6301 provider: ${provider}`);
23
+ }
24
+ return this.configService.getDefaultModel(provider);
25
+ }
26
+ async resolveModel(provider = "openai-codex", requested) {
27
+ if (provider !== "openai-codex") {
28
+ throw new Error(`\u6682\u4E0D\u652F\u6301 provider: ${provider}`);
29
+ }
30
+ if (!requested) {
31
+ return this.configService.getDefaultModel(provider);
32
+ }
33
+ if (!isSupportedCodexModel(requested)) {
34
+ throw new Error(`\u5F53\u524D demo \u672A\u5185\u7F6E\u6A21\u578B: ${requested}`);
35
+ }
36
+ return requested;
37
+ }
38
+ }
39
+ export {
40
+ ModelService
41
+ };
42
+ //# sourceMappingURL=model-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/services/model-service.ts"],"sourcesContent":["import {\n CODEX_MODEL_INFOS,\n isSupportedCodexModel,\n} from \"../models/openai-codex-models.js\";\nimport type { ModelInfo, ProviderId } from \"../types.js\";\nimport { ConfigService } from \"./config-service.js\";\n\nexport class ModelService {\n constructor(private readonly configService: ConfigService) {}\n\n async listModels(provider: ProviderId = \"openai-codex\"): Promise<ModelInfo[]> {\n if (provider !== \"openai-codex\") {\n throw new Error(`暂不支持 provider: ${provider}`);\n }\n\n const defaultModel = await this.configService.getDefaultModel(provider);\n return CODEX_MODEL_INFOS.map((model) => ({\n ...model,\n isDefault: model.id === defaultModel,\n }));\n }\n\n async getDefaultModel(provider: ProviderId = \"openai-codex\"): Promise<string> {\n if (provider !== \"openai-codex\") {\n throw new Error(`暂不支持 provider: ${provider}`);\n }\n\n return this.configService.getDefaultModel(provider);\n }\n\n async resolveModel(provider: ProviderId = \"openai-codex\", requested?: string): Promise<string> {\n if (provider !== \"openai-codex\") {\n throw new Error(`暂不支持 provider: ${provider}`);\n }\n\n if (!requested) {\n return this.configService.getDefaultModel(provider);\n }\n\n if (!isSupportedCodexModel(requested)) {\n throw new Error(`当前 demo 未内置模型: ${requested}`);\n }\n\n return requested;\n }\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAIA,MAAM,aAAa;AAAA,EACxB,YAA6B,eAA8B;AAA9B;AAAA,EAA+B;AAAA,EAE5D,MAAM,WAAW,WAAuB,gBAAsC;AAC5E,QAAI,aAAa,gBAAgB;AAC/B,YAAM,IAAI,MAAM,sCAAkB,QAAQ,EAAE;AAAA,IAC9C;AAEA,UAAM,eAAe,MAAM,KAAK,cAAc,gBAAgB,QAAQ;AACtE,WAAO,kBAAkB,IAAI,CAAC,WAAW;AAAA,MACvC,GAAG;AAAA,MACH,WAAW,MAAM,OAAO;AAAA,IAC1B,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,gBAAgB,WAAuB,gBAAiC;AAC5E,QAAI,aAAa,gBAAgB;AAC/B,YAAM,IAAI,MAAM,sCAAkB,QAAQ,EAAE;AAAA,IAC9C;AAEA,WAAO,KAAK,cAAc,gBAAgB,QAAQ;AAAA,EACpD;AAAA,EAEA,MAAM,aAAa,WAAuB,gBAAgB,WAAqC;AAC7F,QAAI,aAAa,gBAAgB;AAC/B,YAAM,IAAI,MAAM,sCAAkB,QAAQ,EAAE;AAAA,IAC9C;AAEA,QAAI,CAAC,WAAW;AACd,aAAO,KAAK,cAAc,gBAAgB,QAAQ;AAAA,IACpD;AAEA,QAAI,CAAC,sBAAsB,SAAS,GAAG;AACrC,YAAM,IAAI,MAAM,qDAAkB,SAAS,EAAE;AAAA,IAC/C;AAEA,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const projectDir = path.dirname(fileURLToPath(new URL("../../../package.json", import.meta.url)));
6
+ const stateDir = path.join(projectDir, ".state");
7
+ const storePath = path.join(stateDir, "store.json");
8
+ function createEmptyStore() {
9
+ return {
10
+ version: 1,
11
+ profiles: {}
12
+ };
13
+ }
14
+ function getStateDir() {
15
+ return stateDir;
16
+ }
17
+ function getStorePath() {
18
+ return storePath;
19
+ }
20
+ async function loadStore() {
21
+ try {
22
+ const raw = await fs.readFile(storePath, "utf8");
23
+ const parsed = JSON.parse(raw);
24
+ const normalizedProfiles = Object.fromEntries(
25
+ Object.entries(parsed.profiles ?? {}).map(([profileId, profile]) => [
26
+ profileId,
27
+ {
28
+ ...profile,
29
+ mode: "oauth_account"
30
+ }
31
+ ])
32
+ );
33
+ return {
34
+ version: 1,
35
+ activeProfileId: parsed.activeProfileId,
36
+ profiles: normalizedProfiles
37
+ };
38
+ } catch {
39
+ return createEmptyStore();
40
+ }
41
+ }
42
+ async function saveStore(store) {
43
+ await fs.mkdir(stateDir, { recursive: true });
44
+ await fs.writeFile(storePath, `${JSON.stringify(store, null, 2)}
45
+ `, "utf8");
46
+ }
47
+ async function saveProfile(profile) {
48
+ const store = await loadStore();
49
+ store.profiles[profile.profileId] = profile;
50
+ store.activeProfileId = profile.profileId;
51
+ await saveStore(store);
52
+ }
53
+ async function getActiveProfile() {
54
+ const store = await loadStore();
55
+ const activeId = store.activeProfileId?.trim();
56
+ if (activeId && store.profiles[activeId]) {
57
+ return store.profiles[activeId] ?? null;
58
+ }
59
+ const first = Object.values(store.profiles)[0];
60
+ return first ?? null;
61
+ }
62
+ async function clearStore() {
63
+ await fs.rm(stateDir, { recursive: true, force: true });
64
+ }
65
+ export {
66
+ clearStore,
67
+ getActiveProfile,
68
+ getStateDir,
69
+ getStorePath,
70
+ loadStore,
71
+ saveProfile,
72
+ saveStore
73
+ };
74
+ //# sourceMappingURL=profile-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/store/profile-store.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { OAuthProfile } from \"../types.js\";\n\ntype DemoStore = {\n version: 1;\n activeProfileId?: string;\n profiles: Record<string, OAuthProfile>;\n};\n\nconst projectDir = path.dirname(fileURLToPath(new URL(\"../../../package.json\", import.meta.url)));\nconst stateDir = path.join(projectDir, \".state\");\nconst storePath = path.join(stateDir, \"store.json\");\n\nfunction createEmptyStore(): DemoStore {\n return {\n version: 1,\n profiles: {},\n };\n}\n\nexport function getStateDir(): string {\n return stateDir;\n}\n\nexport function getStorePath(): string {\n return storePath;\n}\n\nexport async function loadStore(): Promise<DemoStore> {\n try {\n const raw = await fs.readFile(storePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<DemoStore>;\n const normalizedProfiles = Object.fromEntries(\n Object.entries(parsed.profiles ?? {}).map(([profileId, profile]) => [\n profileId,\n {\n ...profile,\n mode: \"oauth_account\" as const,\n },\n ]),\n );\n return {\n version: 1,\n activeProfileId: parsed.activeProfileId,\n profiles: normalizedProfiles,\n };\n } catch {\n return createEmptyStore();\n }\n}\n\nexport async function saveStore(store: DemoStore): Promise<void> {\n await fs.mkdir(stateDir, { recursive: true });\n await fs.writeFile(storePath, `${JSON.stringify(store, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function saveProfile(profile: OAuthProfile): Promise<void> {\n const store = await loadStore();\n store.profiles[profile.profileId] = profile;\n store.activeProfileId = profile.profileId;\n await saveStore(store);\n}\n\nexport async function getActiveProfile(): Promise<OAuthProfile | null> {\n const store = await loadStore();\n const activeId = store.activeProfileId?.trim();\n if (activeId && store.profiles[activeId]) {\n return store.profiles[activeId] ?? null;\n }\n\n const first = Object.values(store.profiles)[0];\n return first ?? null;\n}\n\nexport async function clearStore(): Promise<void> {\n await fs.rm(stateDir, { recursive: true, force: true });\n}\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAS9B,MAAM,aAAa,KAAK,QAAQ,cAAc,IAAI,IAAI,yBAAyB,YAAY,GAAG,CAAC,CAAC;AAChG,MAAM,WAAW,KAAK,KAAK,YAAY,QAAQ;AAC/C,MAAM,YAAY,KAAK,KAAK,UAAU,YAAY;AAElD,SAAS,mBAA8B;AACrC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,EACb;AACF;AAEO,SAAS,cAAsB;AACpC,SAAO;AACT;AAEO,SAAS,eAAuB;AACrC,SAAO;AACT;AAEA,eAAsB,YAAgC;AACpD,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,SAAS,WAAW,MAAM;AAC/C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,qBAAqB,OAAO;AAAA,MAChC,OAAO,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,WAAW,OAAO,MAAM;AAAA,QAClE;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,iBAAiB,OAAO;AAAA,MACxB,UAAU;AAAA,IACZ;AAAA,EACF,QAAQ;AACN,WAAO,iBAAiB;AAAA,EAC1B;AACF;AAEA,eAAsB,UAAU,OAAiC;AAC/D,QAAM,GAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAM,GAAG,UAAU,WAAW,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC7E;AAEA,eAAsB,YAAY,SAAsC;AACtE,QAAM,QAAQ,MAAM,UAAU;AAC9B,QAAM,SAAS,QAAQ,SAAS,IAAI;AACpC,QAAM,kBAAkB,QAAQ;AAChC,QAAM,UAAU,KAAK;AACvB;AAEA,eAAsB,mBAAiD;AACrE,QAAM,QAAQ,MAAM,UAAU;AAC9B,QAAM,WAAW,MAAM,iBAAiB,KAAK;AAC7C,MAAI,YAAY,MAAM,SAAS,QAAQ,GAAG;AACxC,WAAO,MAAM,SAAS,QAAQ,KAAK;AAAA,EACrC;AAEA,QAAM,QAAQ,OAAO,OAAO,MAAM,QAAQ,EAAE,CAAC;AAC7C,SAAO,SAAS;AAClB;AAEA,eAAsB,aAA4B;AAChD,QAAM,GAAG,GAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACxD;","names":[]}
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const projectDir = path.dirname(fileURLToPath(new URL("../../../package.json", import.meta.url)));
6
+ const stateDir = path.join(projectDir, ".state");
7
+ const settingsPath = path.join(stateDir, "settings.json");
8
+ function createDefaultSettings() {
9
+ return {
10
+ version: 1,
11
+ defaultProvider: "openai-codex",
12
+ defaultModel: "gpt-5.4",
13
+ server: {
14
+ host: "127.0.0.1",
15
+ port: 8787
16
+ }
17
+ };
18
+ }
19
+ function getSettingsPath() {
20
+ return settingsPath;
21
+ }
22
+ async function loadSettings() {
23
+ try {
24
+ const raw = await fs.readFile(settingsPath, "utf8");
25
+ const parsed = JSON.parse(raw);
26
+ const defaults = createDefaultSettings();
27
+ return {
28
+ version: 1,
29
+ defaultProvider: parsed.defaultProvider ?? defaults.defaultProvider,
30
+ defaultModel: parsed.defaultModel ?? defaults.defaultModel,
31
+ server: {
32
+ host: parsed.server?.host ?? defaults.server.host,
33
+ port: parsed.server?.port ?? defaults.server.port
34
+ }
35
+ };
36
+ } catch {
37
+ return createDefaultSettings();
38
+ }
39
+ }
40
+ async function saveSettings(settings) {
41
+ await fs.mkdir(stateDir, { recursive: true });
42
+ await fs.writeFile(settingsPath, `${JSON.stringify(settings, null, 2)}
43
+ `, "utf8");
44
+ }
45
+ export {
46
+ createDefaultSettings,
47
+ getSettingsPath,
48
+ loadSettings,
49
+ saveSettings
50
+ };
51
+ //# sourceMappingURL=settings-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/store/settings-store.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { GatewaySettings } from \"../types.js\";\n\nconst projectDir = path.dirname(fileURLToPath(new URL(\"../../../package.json\", import.meta.url)));\nconst stateDir = path.join(projectDir, \".state\");\nconst settingsPath = path.join(stateDir, \"settings.json\");\n\nexport function createDefaultSettings(): GatewaySettings {\n return {\n version: 1,\n defaultProvider: \"openai-codex\",\n defaultModel: \"gpt-5.4\",\n server: {\n host: \"127.0.0.1\",\n port: 8787,\n },\n };\n}\n\nexport function getSettingsPath(): string {\n return settingsPath;\n}\n\nexport async function loadSettings(): Promise<GatewaySettings> {\n try {\n const raw = await fs.readFile(settingsPath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<GatewaySettings>;\n const defaults = createDefaultSettings();\n return {\n version: 1,\n defaultProvider: parsed.defaultProvider ?? defaults.defaultProvider,\n defaultModel: parsed.defaultModel ?? defaults.defaultModel,\n server: {\n host: parsed.server?.host ?? defaults.server.host,\n port: parsed.server?.port ?? defaults.server.port,\n },\n };\n } catch {\n return createDefaultSettings();\n }\n}\n\nexport async function saveSettings(settings: GatewaySettings): Promise<void> {\n await fs.mkdir(stateDir, { recursive: true });\n await fs.writeFile(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`, \"utf8\");\n}\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAG9B,MAAM,aAAa,KAAK,QAAQ,cAAc,IAAI,IAAI,yBAAyB,YAAY,GAAG,CAAC,CAAC;AAChG,MAAM,WAAW,KAAK,KAAK,YAAY,QAAQ;AAC/C,MAAM,eAAe,KAAK,KAAK,UAAU,eAAe;AAEjD,SAAS,wBAAyC;AACvD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,kBAA0B;AACxC,SAAO;AACT;AAEA,eAAsB,eAAyC;AAC7D,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,SAAS,cAAc,MAAM;AAClD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,WAAW,sBAAsB;AACvC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,iBAAiB,OAAO,mBAAmB,SAAS;AAAA,MACpD,cAAc,OAAO,gBAAgB,SAAS;AAAA,MAC9C,QAAQ;AAAA,QACN,MAAM,OAAO,QAAQ,QAAQ,SAAS,OAAO;AAAA,QAC7C,MAAM,OAAO,QAAQ,QAAQ,SAAS,OAAO;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,sBAAsB;AAAA,EAC/B;AACF;AAEA,eAAsB,aAAa,UAA0C;AAC3E,QAAM,GAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAM,GAAG,UAAU,cAAc,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACnF;","names":[]}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/http.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { requestText } from "./core/providers/http-client.js";
3
+ export {
4
+ requestText
5
+ };
6
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http.ts"],"sourcesContent":["export { requestText } from \"./core/providers/http-client.js\";\n"],"mappings":";AAAA,SAAS,mBAAmB;","names":[]}
package/dist/models.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ CODEX_MODEL_INFOS,
4
+ DEFAULT_CODEX_MODEL,
5
+ SUPPORTED_CODEX_MODELS,
6
+ isSupportedCodexModel
7
+ } from "./core/models/openai-codex-models.js";
8
+ export {
9
+ CODEX_MODEL_INFOS,
10
+ DEFAULT_CODEX_MODEL,
11
+ SUPPORTED_CODEX_MODELS,
12
+ isSupportedCodexModel
13
+ };
14
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/models.ts"],"sourcesContent":["export {\n CODEX_MODEL_INFOS,\n DEFAULT_CODEX_MODEL,\n SUPPORTED_CODEX_MODELS,\n isSupportedCodexModel,\n} from \"./core/models/openai-codex-models.js\";\nexport type { SupportedCodexModel } from \"./core/models/openai-codex-models.js\";\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
package/dist/oauth.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ loginOpenAICodex,
4
+ refreshOpenAICodexToken
5
+ } from "./core/providers/openai-codex/oauth.js";
6
+ export {
7
+ loginOpenAICodex,
8
+ refreshOpenAICodexToken
9
+ };
10
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/oauth.ts"],"sourcesContent":["export {\n loginOpenAICodex,\n refreshOpenAICodexToken,\n} from \"./core/providers/openai-codex/oauth.js\";\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;","names":[]}
package/dist/pkce.js ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { generatePKCE } from "./core/providers/openai-codex/pkce.js";
3
+ export {
4
+ generatePKCE
5
+ };
6
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pkce.ts"],"sourcesContent":["export { generatePKCE } from \"./core/providers/openai-codex/pkce.js\";\n"],"mappings":";AAAA,SAAS,oBAAoB;","names":[]}
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+ import Fastify from "fastify";
3
+ import { z } from "zod";
4
+ import { createGatewayContext } from "../core/context.js";
5
+ const responsesBodySchema = z.object({
6
+ model: z.string().optional(),
7
+ input: z.union([
8
+ z.string(),
9
+ z.array(
10
+ z.object({
11
+ role: z.string().optional(),
12
+ content: z.array(
13
+ z.object({
14
+ type: z.string().optional(),
15
+ text: z.string().optional()
16
+ })
17
+ ).optional()
18
+ })
19
+ )
20
+ ]),
21
+ instructions: z.string().optional(),
22
+ stream: z.boolean().optional()
23
+ });
24
+ function extractTextInput(input) {
25
+ if (typeof input === "string") {
26
+ return input;
27
+ }
28
+ const chunks = [];
29
+ for (const item of input) {
30
+ for (const part of item.content ?? []) {
31
+ if (typeof part.text === "string" && part.text.trim()) {
32
+ chunks.push(part.text.trim());
33
+ }
34
+ }
35
+ }
36
+ return chunks.join("\n").trim();
37
+ }
38
+ function createApp() {
39
+ const app = Fastify({
40
+ logger: false
41
+ });
42
+ const ctx = createGatewayContext();
43
+ app.get("/_gateway/health", async () => ({ ok: true }));
44
+ app.get("/_gateway/status", async () => ctx.authService.getStatus());
45
+ app.get("/_gateway/models", async () => ({
46
+ data: await ctx.modelService.listModels()
47
+ }));
48
+ app.get("/v1/models", async () => ({
49
+ object: "list",
50
+ data: (await ctx.modelService.listModels()).map((model) => ({
51
+ id: model.id,
52
+ object: "model",
53
+ owned_by: model.provider
54
+ }))
55
+ }));
56
+ app.post("/v1/responses", async (request, reply) => {
57
+ const parsed = responsesBodySchema.safeParse(request.body);
58
+ if (!parsed.success) {
59
+ reply.code(400);
60
+ return {
61
+ error: {
62
+ type: "validation_error",
63
+ message: parsed.error.issues[0]?.message ?? "\u8BF7\u6C42\u4F53\u683C\u5F0F\u9519\u8BEF"
64
+ }
65
+ };
66
+ }
67
+ if (parsed.data.stream) {
68
+ reply.code(501);
69
+ return {
70
+ error: {
71
+ type: "not_supported",
72
+ message: "\u7B2C\u4E00\u9636\u6BB5\u6682\u4E0D\u652F\u6301 stream=true"
73
+ }
74
+ };
75
+ }
76
+ const input = extractTextInput(parsed.data.input);
77
+ if (!input) {
78
+ reply.code(400);
79
+ return {
80
+ error: {
81
+ type: "validation_error",
82
+ message: "\u6CA1\u6709\u89E3\u6790\u51FA\u6709\u6548\u7684 input \u6587\u672C"
83
+ }
84
+ };
85
+ }
86
+ const result = await ctx.chatService.chat({
87
+ model: parsed.data.model,
88
+ input,
89
+ system: parsed.data.instructions
90
+ });
91
+ return {
92
+ object: "response",
93
+ provider: result.provider,
94
+ model: result.model,
95
+ output_text: result.text,
96
+ output: [
97
+ {
98
+ type: "message",
99
+ role: "assistant",
100
+ content: [
101
+ {
102
+ type: "output_text",
103
+ text: result.text
104
+ }
105
+ ]
106
+ }
107
+ ]
108
+ };
109
+ });
110
+ return app;
111
+ }
112
+ export {
113
+ createApp
114
+ };
115
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/app.ts"],"sourcesContent":["import Fastify from \"fastify\";\nimport { z } from \"zod\";\nimport { createGatewayContext } from \"../core/context.js\";\n\nconst responsesBodySchema = z.object({\n model: z.string().optional(),\n input: z.union([\n z.string(),\n z.array(\n z.object({\n role: z.string().optional(),\n content: z\n .array(\n z.object({\n type: z.string().optional(),\n text: z.string().optional(),\n }),\n )\n .optional(),\n }),\n ),\n ]),\n instructions: z.string().optional(),\n stream: z.boolean().optional(),\n});\n\nfunction extractTextInput(input: z.infer<typeof responsesBodySchema>[\"input\"]): string {\n if (typeof input === \"string\") {\n return input;\n }\n\n const chunks: string[] = [];\n for (const item of input) {\n for (const part of item.content ?? []) {\n if (typeof part.text === \"string\" && part.text.trim()) {\n chunks.push(part.text.trim());\n }\n }\n }\n\n return chunks.join(\"\\n\").trim();\n}\n\nexport function createApp() {\n const app = Fastify({\n logger: false,\n });\n const ctx = createGatewayContext();\n\n app.get(\"/_gateway/health\", async () => ({ ok: true }));\n\n app.get(\"/_gateway/status\", async () => ctx.authService.getStatus());\n\n app.get(\"/_gateway/models\", async () => ({\n data: await ctx.modelService.listModels(),\n }));\n\n app.get(\"/v1/models\", async () => ({\n object: \"list\",\n data: (await ctx.modelService.listModels()).map((model) => ({\n id: model.id,\n object: \"model\",\n owned_by: model.provider,\n })),\n }));\n\n app.post(\"/v1/responses\", async (request, reply) => {\n const parsed = responsesBodySchema.safeParse(request.body);\n if (!parsed.success) {\n reply.code(400);\n return {\n error: {\n type: \"validation_error\",\n message: parsed.error.issues[0]?.message ?? \"请求体格式错误\",\n },\n };\n }\n\n if (parsed.data.stream) {\n reply.code(501);\n return {\n error: {\n type: \"not_supported\",\n message: \"第一阶段暂不支持 stream=true\",\n },\n };\n }\n\n const input = extractTextInput(parsed.data.input);\n if (!input) {\n reply.code(400);\n return {\n error: {\n type: \"validation_error\",\n message: \"没有解析出有效的 input 文本\",\n },\n };\n }\n\n const result = await ctx.chatService.chat({\n model: parsed.data.model,\n input,\n system: parsed.data.instructions,\n });\n\n return {\n object: \"response\",\n provider: result.provider,\n model: result.model,\n output_text: result.text,\n output: [\n {\n type: \"message\",\n role: \"assistant\",\n content: [\n {\n type: \"output_text\",\n text: result.text,\n },\n ],\n },\n ],\n };\n });\n\n return app;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import { ConfigService } from "../core/services/config-service.js";
3
+ import { createApp } from "./app.js";
4
+ async function startServer(params) {
5
+ const app = createApp();
6
+ const configService = new ConfigService();
7
+ const defaults = await configService.getServerConfig();
8
+ const host = params?.host ?? defaults.host;
9
+ const port = params?.port ?? defaults.port;
10
+ await app.listen({
11
+ host,
12
+ port
13
+ });
14
+ return {
15
+ app,
16
+ host,
17
+ port
18
+ };
19
+ }
20
+ export {
21
+ startServer
22
+ };
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/index.ts"],"sourcesContent":["import { ConfigService } from \"../core/services/config-service.js\";\nimport { createApp } from \"./app.js\";\n\nexport async function startServer(params?: { host?: string; port?: number }) {\n const app = createApp();\n const configService = new ConfigService();\n const defaults = await configService.getServerConfig();\n const host = params?.host ?? defaults.host;\n const port = params?.port ?? defaults.port;\n\n await app.listen({\n host,\n port,\n });\n\n return {\n app,\n host,\n port,\n };\n}\n"],"mappings":";AAAA,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAE1B,eAAsB,YAAY,QAA2C;AAC3E,QAAM,MAAM,UAAU;AACtB,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,WAAW,MAAM,cAAc,gBAAgB;AACrD,QAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,QAAM,OAAO,QAAQ,QAAQ,SAAS;AAEtC,QAAM,IAAI,OAAO;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
package/dist/store.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ clearStore,
4
+ getActiveProfile,
5
+ getStateDir,
6
+ getStorePath,
7
+ loadStore,
8
+ saveProfile,
9
+ saveStore
10
+ } from "./core/store/profile-store.js";
11
+ export {
12
+ clearStore,
13
+ getActiveProfile,
14
+ getStateDir,
15
+ getStorePath,
16
+ loadStore,
17
+ saveProfile,
18
+ saveStore
19
+ };
20
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store.ts"],"sourcesContent":["export type { OAuthProfile as OpenAICodexProfile } from \"./core/types.js\";\nexport {\n clearStore,\n getActiveProfile,\n getStateDir,\n getStorePath,\n loadStore,\n saveProfile,\n saveStore,\n} from \"./core/store/profile-store.js\";\n"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "ai-zero-token",
3
+ "version": "1.0.0",
4
+ "description": "A local-first single-user AI CLI and gateway with OpenAI Codex OAuth support.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/fchangjun/AI-Zero-Token.git"
10
+ },
11
+ "homepage": "https://github.com/fchangjun/AI-Zero-Token#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/fchangjun/AI-Zero-Token/issues"
14
+ },
15
+ "bin": {
16
+ "azt": "dist/cli.js",
17
+ "ai-zero-token": "dist/cli.js"
18
+ },
19
+ "keywords": [
20
+ "ai",
21
+ "cli",
22
+ "gateway",
23
+ "oauth",
24
+ "openai",
25
+ "codex"
26
+ ],
27
+ "engines": {
28
+ "node": ">=22"
29
+ },
30
+ "scripts": {
31
+ "login": "bun src/cli.ts login",
32
+ "status": "bun src/cli.ts status",
33
+ "ask": "bun src/cli.ts ask",
34
+ "serve": "bun src/cli.ts serve",
35
+ "build": "tsup",
36
+ "typecheck": "bunx tsc -p tsconfig.json --noEmit",
37
+ "pack:dry": "npm pack --dry-run",
38
+ "whoami:npm": "sh -c 'test -f .env.publish || { echo \"Missing .env.publish\"; exit 1; }; set -a; . ./.env.publish; set +a; npm whoami'",
39
+ "publish:npm": "sh -c 'test -f .env.publish || { echo \"Missing .env.publish\"; exit 1; }; set -a; . ./.env.publish; set +a; npm publish'"
40
+ },
41
+ "dependencies": {
42
+ "fastify": "^5.8.2",
43
+ "zod": "^4.3.6"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^25.5.0",
47
+ "tsup": "^8.5.1",
48
+ "typescript": "^5.9.3"
49
+ },
50
+ "files": [
51
+ "dist",
52
+ "README.md",
53
+ "package.json"
54
+ ]
55
+ }