ai-zero-token 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -120,6 +120,20 @@ azt ask --model gpt-5.3-codex "请只回复 OK"
120
120
  azt serve
121
121
  ```
122
122
 
123
+ 如果你要让本地网页直接从浏览器请求这个网关,现在已经默认开启 CORS。
124
+
125
+ 如需限制来源,可以在启动前指定:
126
+
127
+ ```bash
128
+ AZT_CORS_ORIGIN=http://127.0.0.1:8124 azt serve
129
+ ```
130
+
131
+ 多个来源可用英文逗号分隔:
132
+
133
+ ```bash
134
+ AZT_CORS_ORIGIN=http://127.0.0.1:8124,http://localhost:3000 azt serve
135
+ ```
136
+
123
137
  清空本地状态:
124
138
 
125
139
  ```bash
@@ -164,6 +178,12 @@ CLI 一旦执行 `serve`,就会进入本地网关模式。
164
178
  http://127.0.0.1:8787
165
179
  ```
166
180
 
181
+ 默认 CORS 来源:
182
+
183
+ ```text
184
+ *
185
+ ```
186
+
167
187
  ### 3. 先确认网关状态
168
188
 
169
189
  健康检查:
@@ -9,6 +9,7 @@ async function runServeCommand(args) {
9
9
  const server = await startServer({ host, port });
10
10
  console.log("\u672C\u5730\u7F51\u5173\u5DF2\u542F\u52A8\u3002");
11
11
  console.log(`url: http://${server.host}:${server.port}`);
12
+ console.log(`corsOrigin: ${server.corsOrigin}`);
12
13
  console.log(`activeProvider: ${status.activeProvider ?? "none"}`);
13
14
  console.log(`defaultModel: ${status.defaultModel}`);
14
15
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/serve.ts"],"sourcesContent":["import { createGatewayContext } from \"../../core/context.js\";\nimport { startServer } from \"../../server/index.js\";\nimport { parseServeArgs } from \"../shared.js\";\n\nexport async function runServeCommand(args: string[]): Promise<void> {\n const { host, port } = parseServeArgs(args);\n const ctx = createGatewayContext();\n const status = await ctx.authService.getStatus();\n const server = await startServer({ host, port });\n console.log(\"本地网关已启动。\");\n console.log(`url: http://${server.host}:${server.port}`);\n console.log(`activeProvider: ${status.activeProvider ?? \"none\"}`);\n console.log(`defaultModel: ${status.defaultModel}`);\n}\n"],"mappings":";AAAA,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAE/B,eAAsB,gBAAgB,MAA+B;AACnE,QAAM,EAAE,MAAM,KAAK,IAAI,eAAe,IAAI;AAC1C,QAAM,MAAM,qBAAqB;AACjC,QAAM,SAAS,MAAM,IAAI,YAAY,UAAU;AAC/C,QAAM,SAAS,MAAM,YAAY,EAAE,MAAM,KAAK,CAAC;AAC/C,UAAQ,IAAI,kDAAU;AACtB,UAAQ,IAAI,eAAe,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE;AACvD,UAAQ,IAAI,mBAAmB,OAAO,kBAAkB,MAAM,EAAE;AAChE,UAAQ,IAAI,iBAAiB,OAAO,YAAY,EAAE;AACpD;","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/serve.ts"],"sourcesContent":["import { createGatewayContext } from \"../../core/context.js\";\nimport { startServer } from \"../../server/index.js\";\nimport { parseServeArgs } from \"../shared.js\";\n\nexport async function runServeCommand(args: string[]): Promise<void> {\n const { host, port } = parseServeArgs(args);\n const ctx = createGatewayContext();\n const status = await ctx.authService.getStatus();\n const server = await startServer({ host, port });\n console.log(\"本地网关已启动。\");\n console.log(`url: http://${server.host}:${server.port}`);\n console.log(`corsOrigin: ${server.corsOrigin}`);\n console.log(`activeProvider: ${status.activeProvider ?? \"none\"}`);\n console.log(`defaultModel: ${status.defaultModel}`);\n}\n"],"mappings":";AAAA,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAE/B,eAAsB,gBAAgB,MAA+B;AACnE,QAAM,EAAE,MAAM,KAAK,IAAI,eAAe,IAAI;AAC1C,QAAM,MAAM,qBAAqB;AACjC,QAAM,SAAS,MAAM,IAAI,YAAY,UAAU;AAC/C,QAAM,SAAS,MAAM,YAAY,EAAE,MAAM,KAAK,CAAC;AAC/C,UAAQ,IAAI,kDAAU;AACtB,UAAQ,IAAI,eAAe,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE;AACvD,UAAQ,IAAI,eAAe,OAAO,UAAU,EAAE;AAC9C,UAAQ,IAAI,mBAAmB,OAAO,kBAAkB,MAAM,EAAE;AAChE,UAAQ,IAAI,iBAAiB,OAAO,YAAY,EAAE;AACpD;","names":[]}
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import Fastify from "fastify";
3
+ import cors from "@fastify/cors";
3
4
  import { z } from "zod";
4
5
  import { createGatewayContext } from "../core/context.js";
5
6
  const responsesBodySchema = z.object({
@@ -35,11 +36,15 @@ function extractTextInput(input) {
35
36
  }
36
37
  return chunks.join("\n").trim();
37
38
  }
38
- function createApp() {
39
+ function createApp(params) {
39
40
  const app = Fastify({
40
41
  logger: false
41
42
  });
42
43
  const ctx = createGatewayContext();
44
+ void app.register(cors, {
45
+ origin: params?.corsOrigin ?? true,
46
+ methods: ["GET", "POST", "OPTIONS"]
47
+ });
43
48
  app.get("/_gateway/health", async () => ({ ok: true }));
44
49
  app.get("/_gateway/status", async () => ctx.authService.getStatus());
45
50
  app.get("/_gateway/models", async () => ({
@@ -1 +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":[]}
1
+ {"version":3,"sources":["../../src/server/app.ts"],"sourcesContent":["import Fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\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(params?: {\n corsOrigin?: true | string | RegExp | Array<string | RegExp>;\n}) {\n const app = Fastify({\n logger: false,\n });\n const ctx = createGatewayContext();\n\n void app.register(cors, {\n origin: params?.corsOrigin ?? true,\n methods: [\"GET\", \"POST\", \"OPTIONS\"],\n });\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":[]}
@@ -1,8 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import { ConfigService } from "../core/services/config-service.js";
3
3
  import { createApp } from "./app.js";
4
+ function resolveCorsOrigin() {
5
+ const raw = process.env.AZT_CORS_ORIGIN?.trim();
6
+ if (!raw || raw === "*") {
7
+ return true;
8
+ }
9
+ const values = raw.split(",").map((item) => item.trim()).filter(Boolean);
10
+ return values.length <= 1 ? values[0] ?? true : values;
11
+ }
4
12
  async function startServer(params) {
5
- const app = createApp();
13
+ const app = createApp({
14
+ corsOrigin: resolveCorsOrigin()
15
+ });
6
16
  const configService = new ConfigService();
7
17
  const defaults = await configService.getServerConfig();
8
18
  const host = params?.host ?? defaults.host;
@@ -14,7 +24,8 @@ async function startServer(params) {
14
24
  return {
15
25
  app,
16
26
  host,
17
- port
27
+ port,
28
+ corsOrigin: process.env.AZT_CORS_ORIGIN?.trim() || "*"
18
29
  };
19
30
  }
20
31
  export {
@@ -1 +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":[]}
1
+ {"version":3,"sources":["../../src/server/index.ts"],"sourcesContent":["import { ConfigService } from \"../core/services/config-service.js\";\nimport { createApp } from \"./app.js\";\n\nfunction resolveCorsOrigin(): true | string | RegExp | Array<string | RegExp> {\n const raw = process.env.AZT_CORS_ORIGIN?.trim();\n if (!raw || raw === \"*\") {\n return true;\n }\n\n const values = raw\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n\n return values.length <= 1 ? values[0] ?? true : values;\n}\n\nexport async function startServer(params?: { host?: string; port?: number }) {\n const app = createApp({\n corsOrigin: resolveCorsOrigin(),\n });\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 corsOrigin: process.env.AZT_CORS_ORIGIN?.trim() || \"*\",\n };\n}\n"],"mappings":";AAAA,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAE1B,SAAS,oBAAqE;AAC5E,QAAM,MAAM,QAAQ,IAAI,iBAAiB,KAAK;AAC9C,MAAI,CAAC,OAAO,QAAQ,KAAK;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IACZ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAEjB,SAAO,OAAO,UAAU,IAAI,OAAO,CAAC,KAAK,OAAO;AAClD;AAEA,eAAsB,YAAY,QAA2C;AAC3E,QAAM,MAAM,UAAU;AAAA,IACpB,YAAY,kBAAkB;AAAA,EAChC,CAAC;AACD,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,IACA,YAAY,QAAQ,IAAI,iBAAiB,KAAK,KAAK;AAAA,EACrD;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-zero-token",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "A local-first single-user AI CLI and gateway with OpenAI Codex OAuth support.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -34,11 +34,10 @@
34
34
  "serve": "bun src/cli.ts serve",
35
35
  "build": "tsup",
36
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'"
37
+ "pack:dry": "npm pack --dry-run"
40
38
  },
41
39
  "dependencies": {
40
+ "@fastify/cors": "^11.1.0",
42
41
  "fastify": "^5.8.2",
43
42
  "zod": "^4.3.6"
44
43
  },