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.
- package/LICENSE +21 -0
- package/README.md +262 -0
- package/dist/api.js +6 -0
- package/dist/api.js.map +1 -0
- package/dist/cli/commands/ask.js +15 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/clear.js +11 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/help.js +26 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/login.js +21 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/models.js +14 -0
- package/dist/cli/commands/models.js.map +1 -0
- package/dist/cli/commands/serve.js +18 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.js +32 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/shared.js +50 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/context.js +24 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/models/openai-codex-models.js +34 -0
- package/dist/core/models/openai-codex-models.js.map +1 -0
- package/dist/core/providers/http-client.js +84 -0
- package/dist/core/providers/http-client.js.map +1 -0
- package/dist/core/providers/openai-codex/chat.js +102 -0
- package/dist/core/providers/openai-codex/chat.js.map +1 -0
- package/dist/core/providers/openai-codex/oauth.js +284 -0
- package/dist/core/providers/openai-codex/oauth.js.map +1 -0
- package/dist/core/providers/openai-codex/pkce.js +21 -0
- package/dist/core/providers/openai-codex/pkce.js.map +1 -0
- package/dist/core/services/auth-service.js +73 -0
- package/dist/core/services/auth-service.js.map +1 -0
- package/dist/core/services/chat-service.js +28 -0
- package/dist/core/services/chat-service.js.map +1 -0
- package/dist/core/services/config-service.js +69 -0
- package/dist/core/services/config-service.js.map +1 -0
- package/dist/core/services/model-service.js +42 -0
- package/dist/core/services/model-service.js.map +1 -0
- package/dist/core/store/profile-store.js +74 -0
- package/dist/core/store/profile-store.js.map +1 -0
- package/dist/core/store/settings-store.js +51 -0
- package/dist/core/store/settings-store.js.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/http.js +6 -0
- package/dist/http.js.map +1 -0
- package/dist/models.js +14 -0
- package/dist/models.js.map +1 -0
- package/dist/oauth.js +10 -0
- package/dist/oauth.js.map +1 -0
- package/dist/pkce.js +6 -0
- package/dist/pkce.js.map +1 -0
- package/dist/server/app.js +115 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/index.js +23 -0
- package/dist/server/index.js.map +1 -0
- package/dist/store.js +20 -0
- package/dist/store.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/http.js
ADDED
package/dist/http.js.map
ADDED
|
@@ -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 @@
|
|
|
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
package/dist/pkce.js.map
ADDED
|
@@ -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
|
+
}
|