@whispering233/ai-editor-server 0.0.30 → 0.0.33

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 (48) hide show
  1. package/client-dist/assets/{index-BBkKfUUn.css → index-oxaM6dHH.css} +1 -1
  2. package/client-dist/assets/index-tfvJfexp.js +523 -0
  3. package/client-dist/index.html +3 -3
  4. package/client-dist/provider-icons.svg +54 -0
  5. package/dist/backup.d.ts +8 -7
  6. package/dist/backup.d.ts.map +1 -1
  7. package/dist/backup.js +61 -45
  8. package/dist/backup.js.map +1 -1
  9. package/dist/chat-runtime.d.ts +44 -0
  10. package/dist/chat-runtime.d.ts.map +1 -0
  11. package/dist/chat-runtime.js +102 -0
  12. package/dist/chat-runtime.js.map +1 -0
  13. package/dist/debug.d.ts +1 -1
  14. package/dist/debug.d.ts.map +1 -1
  15. package/dist/debug.js +3 -3
  16. package/dist/debug.js.map +1 -1
  17. package/dist/http-dispatcher.d.ts +30 -0
  18. package/dist/http-dispatcher.d.ts.map +1 -0
  19. package/dist/http-dispatcher.js +101 -0
  20. package/dist/http-dispatcher.js.map +1 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +30 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/last-project.d.ts +7 -0
  25. package/dist/last-project.d.ts.map +1 -0
  26. package/dist/last-project.js +48 -0
  27. package/dist/last-project.js.map +1 -0
  28. package/dist/middleware/project.d.ts.map +1 -1
  29. package/dist/middleware/project.js +4 -0
  30. package/dist/middleware/project.js.map +1 -1
  31. package/dist/model-runtime.d.ts +41 -0
  32. package/dist/model-runtime.d.ts.map +1 -0
  33. package/dist/model-runtime.js +81 -0
  34. package/dist/model-runtime.js.map +1 -0
  35. package/dist/routes/chat.d.ts +35 -72
  36. package/dist/routes/chat.d.ts.map +1 -1
  37. package/dist/routes/chat.js +390 -373
  38. package/dist/routes/chat.js.map +1 -1
  39. package/dist/routes/names.js +2 -2
  40. package/dist/routes/project.d.ts.map +1 -1
  41. package/dist/routes/project.js +6 -0
  42. package/dist/routes/project.js.map +1 -1
  43. package/dist/routes/settings.d.ts +0 -53
  44. package/dist/routes/settings.d.ts.map +1 -1
  45. package/dist/routes/settings.js +161 -194
  46. package/dist/routes/settings.js.map +1 -1
  47. package/package.json +8 -6
  48. package/client-dist/assets/index-ygCEt46m.js +0 -523
@@ -1,218 +1,185 @@
1
- // 设置路由(S1.3 + 多 provider):GET/PUT /api/v1/settings/llm
2
- // 关键约束:各 provider key 只走三级解析链(不入项目文件):
3
- // 环境变量(deepseek DEEPSEEK_API_KEY;opencode-go OPENCODE_API_KEY)
4
- // ② 用户级配置 ~/.ai-editor/config.json api_keys[<provider>](HOME 可覆盖——测试隔离依赖;
5
- // v1 api_key 字段仅对 deepseek 生效)
6
- // pi-agent 配置 ~/.pi/agent/auth.json(**只读兜底**:条目 type=api_key key 非空才生效,
7
- // 文件不存在/非法/无该项 跳过;绝不写回)
8
- // 模型解析不变式:model 属于激活 provider 目录;撞名模型(deepseek-v4-flash/pro 两家都有)
9
- // provider 消歧;跨 provider 激活由 PUT 携带 provider+model 成对完成(见 PUT 校验)。
10
- import { mkdirSync, readFileSync } from "node:fs";
11
- import { homedir } from "node:os";
12
- import { dirname, join } from "node:path";
1
+ // 设置路由:GET/PUT /api/v1/settings/llm(pi 数据源)
2
+ //
3
+ // 契约 = docs/api/90-api-settings.md;配置载体与读写边界 = docs/design/config.md。
4
+ //
5
+ // **本模块不持有任何配置**:模型目录 / 凭据 / 运行参数全部来自 pi(`ModelRuntime` +
6
+ // `~/.pi/agent` auth.json / models.json / settings.json),本端点只做「读快照 + pi」。
7
+ // 凭据解析顺序(pi 0.85.1,`pi-ai` auth/resolve.js)——**auth.json 存量凭据优先**(一家一条,值可
8
+ // 为字面 key / `$ENV_VAR` 引用 / `!命令`)→ 该家无条目时才回落到 provider 内置环境变量
9
+ // (`DEEPSEEK_API_KEY` 等)——环境变量是兜底,不是与凭据并存的第二个来源。
10
+ //
11
+ // 写入语义(两个入口互不影响):
12
+ // - provider/model/thinking_level pi settings(`~/.pi/agent/settings.json`)
13
+ // - api_key(单家)→ pi credential store(`~/.pi/agent/auth.json`);空串 = 清除该家存量的 API key 凭据
14
+ //
15
+ // 绝不写入项目文件(项目目录内的 `.pi/` 同样不参与:settings 实例 projectTrusted=false)。
13
16
  import { Hono } from "hono";
14
- import { maskApiKey } from "@whispering233/ai-editor-shared";
15
- import { writeJsonAtomic } from "@whispering233/ai-editor-db";
16
- import { settingsLlmGetResSchema, settingsLlmPutReqSchema, userConfigFileSchema, } from "@whispering233/ai-editor-shared/schemas";
17
- import { DEFAULT_PROVIDER, getAvailableModels, REGISTERED_PROVIDERS } from "@whispering233/ai-editor-llm";
17
+ import { CredentialSynchronizationError } from "@earendil-works/pi-coding-agent";
18
+ import { settingsLlmGetResSchema, settingsLlmPutReqSchema } from "@whispering233/ai-editor-shared/schemas";
18
19
  import { HttpError, ok } from "../middleware/error.js";
19
- /** 默认模型名(settings 端点;两 provider 目录均含该模型——兜底/初始态稳定) */
20
- export const DEFAULT_MODEL = "deepseek-v4-flash";
21
- /** 环境变量(各 provider 解析链第 级;测试经 process.env 注入) */
22
- export const DEEPSEEK_API_KEY_ENV = "DEEPSEEK_API_KEY";
23
- export const OPENCODE_API_KEY_ENV = "OPENCODE_API_KEY";
24
- /** provider id 环境变量名(注册表内 provider 必含;未知 provider 无 env 级) */
25
- const ENV_VAR_OF = {
26
- deepseek: DEEPSEEK_API_KEY_ENV,
27
- "opencode-go": OPENCODE_API_KEY_ENV,
28
- };
29
- /** 用户级配置文件相对 HOME 的路径(不入项目文件) */
30
- export const USER_CONFIG_RELATIVE_PATH = join(".ai-editor", "config.json");
31
- /** pi-agent 凭据文件相对 HOME 的路径(只读兜底;opencode-go 订阅 key 通常在此) */
32
- export const PI_AGENT_AUTH_RELATIVE_PATH = join(".pi", "agent", "auth.json");
33
- /** 缺省思考强度(与 SharedConfig 缺省一致,读侧兜底) */
34
- export const DEFAULT_THINKING_LEVEL = "high";
35
- /** 用户级配置文件绝对路径(os.homedir() 读 $HOME,测试设 HOME 即可隔离) */
36
- export function userConfigPath() {
37
- return join(homedir(), USER_CONFIG_RELATIVE_PATH);
38
- }
39
- /** pi-agent auth.json 绝对路径(只读;测试设 HOME 即可隔离) */
40
- export function piAgentAuthPath() {
41
- return join(homedir(), PI_AGENT_AUTH_RELATIVE_PATH);
20
+ import { PI_DEFAULT_THINKING_LEVEL, getModelRuntime, getSettingsManager, reloadModelRuntime, resolveActiveSelection, } from "../model-runtime.js";
21
+ /** 设置路由(挂载于 /api/v1/settings) */
22
+ export const settingsRoutes = new Hono();
23
+ /** 错误信息文本(不泄露凭据内容:pi 的错误只含 provider id/原因) */
24
+ function messageOf(err) {
25
+ return err instanceof Error ? err.message : String(err);
42
26
  }
27
+ // GET /api/v1/settings/llm —— provider 目录 + 认证状态 + 激活模型(凭据明文永不回传)
28
+ settingsRoutes.get("/llm", async (c) => {
29
+ const modelRuntime = await getModelRuntime();
30
+ const settings = getSettingsManager();
31
+ // 本地重载(不联网):外部编辑 models.json / 环境变量变化在下次读取即可见
32
+ await reloadModelRuntime(modelRuntime);
33
+ const selection = await resolveActiveSelection(modelRuntime, settings);
34
+ const payload = settingsLlmGetResSchema.parse({
35
+ // 未配置任何模型 → 空串(前端展示「未配置」引导)
36
+ provider: selection?.provider ?? "",
37
+ model: selection?.modelId ?? "",
38
+ thinkingLevel: settings.getDefaultThinkingLevel() ?? PI_DEFAULT_THINKING_LEVEL,
39
+ // 全量 provider(含未配置认证者):设置页需要展示并引导录入 key
40
+ providers: modelRuntime.getProviders().map((provider) => {
41
+ const status = modelRuntime.getProviderAuthStatus(provider.id);
42
+ return {
43
+ id: provider.id,
44
+ displayName: provider.name,
45
+ authConfigured: status.configured,
46
+ ...(status.source === undefined ? {} : { authSource: status.source }),
47
+ models: modelRuntime.getModels(provider.id).map((model) => ({
48
+ id: model.id,
49
+ provider: model.provider,
50
+ displayName: model.name,
51
+ contextWindow: model.contextWindow,
52
+ maxTokens: model.maxTokens,
53
+ reasoning: model.reasoning,
54
+ })),
55
+ };
56
+ }),
57
+ });
58
+ return c.json(ok(payload));
59
+ });
43
60
  /**
44
- * 读取用户级配置;文件不存在 / JSON 损坏 / schema 不合法 返回空配置(默认值语义,不抛错)。
45
- * schema 正式化(shared userConfigFileSchema,非 strict 宽松读取——用户自有文件,
46
- * 未来版本追加字段不使整份配置失效);v0/v1 旧格式与 v2 同读侧兼容,不迁移不写回
47
- * (用户下次在设置页保存时自然落新格式)。
61
+ * 解析 PUT 的目标 (provider, model) 对(不变式:model 必须属于目标 provider 目录)。
62
+ * - provider+model 同传:跨 provider 激活(前端恒成对发送)
63
+ * - 只给 model:唯一归属自动定 provider;无归属 / 撞名歧义 400
64
+ * - 只给 provider:当前模型必须仍在其目录(防静默改用户选择)
48
65
  */
49
- export function getUserConfig() {
50
- try {
51
- const raw = readFileSync(userConfigPath(), "utf8");
52
- const parsed = userConfigFileSchema.safeParse(JSON.parse(raw));
53
- return parsed.success ? parsed.data : {};
66
+ function resolveTargetModel(modelRuntime, input) {
67
+ const { provider, model, currentModelId } = input;
68
+ if (provider !== undefined && modelRuntime.getProvider(provider) === undefined) {
69
+ throw new HttpError(400, "VALIDATION_ERROR", `未知 provider: ${provider}`);
54
70
  }
55
- catch {
56
- return {};
71
+ const modelIdsOf = (providerId) => new Set(modelRuntime.getModels(providerId).map((m) => m.id));
72
+ if (model !== undefined) {
73
+ let targetProvider = provider;
74
+ if (targetProvider === undefined) {
75
+ const owners = modelRuntime.getProviders().filter((p) => modelIdsOf(p.id).has(model));
76
+ if (owners.length === 0) {
77
+ throw new HttpError(400, "VALIDATION_ERROR", `模型不在任何 provider 目录: ${model}`);
78
+ }
79
+ if (owners.length > 1) {
80
+ throw new HttpError(400, "VALIDATION_ERROR", `模型在多 provider 目录中存在(撞名),请显式指定 provider: ${owners.map((p) => p.id).join("/")}`);
81
+ }
82
+ targetProvider = owners[0].id;
83
+ }
84
+ if (!modelIdsOf(targetProvider).has(model)) {
85
+ const displayName = modelRuntime.getProvider(targetProvider)?.name ?? targetProvider;
86
+ throw new HttpError(400, "VALIDATION_ERROR", `模型 ${model} 不在 provider ${displayName} 目录`);
87
+ }
88
+ return { provider: targetProvider, modelId: model };
57
89
  }
58
- }
59
- /** 激活 provider:config.provider 已注册才采用;否则缺省 deepseek(配置漂移兜底) */
60
- export function effectiveProvider() {
61
- const p = getUserConfig().provider;
62
- return p !== undefined && REGISTERED_PROVIDERS.some((x) => x.id === p) ? p : DEFAULT_PROVIDER;
63
- }
64
- /** config key:api_keys[provider](含空串 = 显式清除)> v1 旧 api_key(仅 deepseek 读侧兼容) */
65
- function configKeyOf(cfg, provider) {
66
- if (cfg.api_keys !== undefined && Object.prototype.hasOwnProperty.call(cfg.api_keys, provider)) {
67
- return cfg.api_keys[provider] || null; // 空串 = 显式清除(不回落旧字段)
90
+ if (provider !== undefined) {
91
+ const current = currentModelId;
92
+ if (current === undefined || current === "") {
93
+ throw new HttpError(400, "VALIDATION_ERROR", `切换 provider 需显式指定 model(当前无激活模型)`);
94
+ }
95
+ if (!modelIdsOf(provider).has(current)) {
96
+ const displayName = modelRuntime.getProvider(provider)?.name ?? provider;
97
+ throw new HttpError(400, "VALIDATION_ERROR", `当前模型 ${current} 不在 provider ${displayName} 目录,请显式选择模型`);
98
+ }
99
+ return { provider, modelId: current };
68
100
  }
69
- if (provider === "deepseek" && typeof cfg.api_key === "string" && cfg.api_key !== "")
70
- return cfg.api_key;
71
101
  return null;
72
102
  }
73
- /** pi-agent auth.json 只读兜底:条目 type=api_key 且 key 非空才生效;任何异常 → null */
74
- function piAgentKeyOf(provider) {
75
- try {
76
- const obj = JSON.parse(readFileSync(piAgentAuthPath(), "utf8"));
77
- const entry = obj?.[provider];
78
- if (typeof entry !== "object" || entry === null)
79
- return null;
80
- const e = entry;
81
- if (e.type === "api_key" && typeof e.key === "string" && e.key !== "")
82
- return e.key;
83
- return null;
84
- }
85
- catch {
86
- return null;
87
- }
88
- }
89
- /** provider 展示名(错误文案/调试用);未知 provider → 原 id */
90
- export function providerDisplayName(provider) {
91
- return REGISTERED_PROVIDERS.find((p) => p.id === provider)?.displayName ?? provider;
92
- }
93
- /** provider 环境变量名(错误文案用) */
94
- export function providerEnvVar(provider) {
95
- return ENV_VAR_OF[provider];
96
- }
97
103
  /**
98
- * 计算某 provider 的有效 key 与掩码:环境变量 > config.json > pi-agent auth.json(只读兜底)
99
- * 三级都无 null(apiKeySet=false,无掩码)。缺省 provider = deepseek(旧单 provider 语义)。
104
+ * 写入 / 清除单家 API key 凭据(pi credential store)。
105
+ * - 非空 key:走 pi `login("api_key")`——交互式提示由我们不变量地回填本次输入
106
+ * (pi 会把凭据落盘到 auth.json 并做**本地**凭据同步,不联网)
107
+ * - 空 key:删除该家存量的 api_key 凭据(回到 env 解析);OAuth 凭据不在此入口删除
108
+ * (设置页只写 API key,误删会让用户的订阅登录失效)
100
109
  */
101
- export function effectiveApiKey(provider = DEFAULT_PROVIDER) {
102
- const envKey = process.env[ENV_VAR_OF[provider] ?? ""] ?? "";
103
- const fileKey = configKeyOf(getUserConfig(), provider) ?? "";
104
- const ambientKey = piAgentKeyOf(provider) ?? "";
105
- const key = envKey || fileKey || ambientKey || null;
106
- return key === null ? { key, masked: undefined } : { key, masked: maskApiKey(key) };
107
- }
108
- /**
109
- * 写入用户级配置(v2 合并语义:显式 undefined 字段不覆盖已有值)。
110
- * - provider/model/thinking_level 顶层覆盖
111
- * - api_keys 按键合并:提供即覆盖,空字符串 = 删除该键(清空 map 时整个字段移除)
112
- * - 落盘 schema_version=2;v1 旧 api_key 字段保留不迁移(读侧兼容已覆盖)
113
- * 原子写:复用 @whispering233/ai-editor-db 的 writeJsonAtomic(临时文件 wx 独占 +
114
- * 文件 fsync + rename + 目录 fsync)。目标在 $HOME/.ai-editor/ 下,目录 fsync 在部分
115
- * 平台/文件系统受限时由 db 实现静默忽略(主链路已保证文件内容完整)
116
- */
117
- export function saveUserConfig(partial) {
118
- const file = userConfigPath();
119
- const next = { ...getUserConfig() };
120
- if (partial.provider !== undefined)
121
- next.provider = partial.provider;
122
- if (partial.model !== undefined)
123
- next.model = partial.model;
124
- if (partial.thinking_level !== undefined)
125
- next.thinking_level = partial.thinking_level;
126
- if (partial.api_keys !== undefined) {
127
- const map = { ...(next.api_keys ?? {}) };
128
- for (const [k, v] of Object.entries(partial.api_keys)) {
129
- if (v === "")
130
- delete map[k]; // 空字符串 = 清除该家已保存 key
131
- else
132
- map[k] = v;
110
+ async function applyApiKey(modelRuntime, providerId, key) {
111
+ if (modelRuntime.getProvider(providerId) === undefined) {
112
+ throw new HttpError(400, "VALIDATION_ERROR", `未知 provider: ${providerId}`);
113
+ }
114
+ const trimmed = key.trim();
115
+ if (trimmed === "") {
116
+ const stored = (await modelRuntime.listCredentials()).find((entry) => entry.providerId === providerId);
117
+ if (stored?.type === "oauth") {
118
+ throw new HttpError(400, "VALIDATION_ERROR", `${providerId} 当前使用 OAuth 凭据登录,本入口只能清除 API key(请用 pi CLI 管理订阅登录)`);
133
119
  }
134
- if (Object.keys(map).length > 0)
135
- next.api_keys = map;
136
- else
137
- delete next.api_keys;
120
+ await modelRuntime.logout(providerId);
121
+ return;
122
+ }
123
+ // 与清除路径对称:存量 OAuth(订阅登录)不得被一次 API key 写入静默覆盖
124
+ // (pi 每 provider 只存一条凭据;覆盖后用户需用 pi CLI 重新登录才能恢复)
125
+ const existing = (await modelRuntime.listCredentials()).find((entry) => entry.providerId === providerId);
126
+ if (existing?.type === "oauth") {
127
+ throw new HttpError(400, "VALIDATION_ERROR", `${providerId} 当前使用 OAuth 凭据登录,本入口不覆盖订阅登录(请用 pi CLI 管理订阅登录)`);
128
+ }
129
+ const interaction = {
130
+ notify: () => {
131
+ // pi 的登录进度提示(终端向);本入口无 UI,忽略
132
+ },
133
+ prompt: async (prompt) => {
134
+ if (prompt.type === "secret")
135
+ return trimmed;
136
+ if (prompt.type === "select") {
137
+ const option = prompt.options.find((o) => o.id === "api-key" || o.id === "bearer-token");
138
+ if (option !== undefined)
139
+ return option.id;
140
+ }
141
+ throw new Error(`${providerId} 需要交互式认证配置,本入口只支持 API key`);
142
+ },
143
+ };
144
+ try {
145
+ await modelRuntime.login(providerId, "api_key", interaction);
146
+ }
147
+ catch (err) {
148
+ // 凭据已落盘、仅本地状态同步失败:按服务端错误呈现(让用户重试而不是怀疑输入)
149
+ if (err instanceof CredentialSynchronizationError) {
150
+ throw new HttpError(500, "INTERNAL_ERROR", `${providerId} 的凭据已写入,但模型状态同步失败:${messageOf(err)}`);
151
+ }
152
+ throw new HttpError(400, "VALIDATION_ERROR", `保存 ${providerId} 的 API key 失败:${messageOf(err)}`);
138
153
  }
139
- // 保存时落新格式:schema_version=2(读侧兼容已保证 v0/v1 文件零破坏)
140
- next.schema_version = 2;
141
- mkdirSync(dirname(file), { recursive: true }); // writeJsonAtomic 不负责建目录
142
- writeJsonAtomic(file, next);
143
- return next;
144
154
  }
145
- /** 设置路由(挂载于 /api/v1/settings) */
146
- export const settingsRoutes = new Hono();
147
- // GET /api/v1/settings/llm —— 读取 LLM 配置(key 不回传明文,仅掩码;全量 provider 目录 + 各家 key 状态)
148
- settingsRoutes.get("/llm", (c) => {
149
- const cfg = getUserConfig();
150
- const provider = effectiveProvider();
151
- const payload = settingsLlmGetResSchema.parse({
152
- provider,
153
- model: cfg.model ?? DEFAULT_MODEL,
154
- thinkingLevel: cfg.thinking_level ?? DEFAULT_THINKING_LEVEL,
155
- // 全量注册 provider:各家目录 + 有效 key 状态(前端下拉分组 + key 缺失整组禁用的依据)
156
- providers: REGISTERED_PROVIDERS.map((p) => {
157
- const { key, masked } = effectiveApiKey(p.id);
158
- return {
159
- id: p.id,
160
- displayName: p.displayName,
161
- apiKeySet: key !== null,
162
- ...(masked !== undefined ? { apiKeyMasked: masked } : {}),
163
- models: getAvailableModels(p.id).map((m) => ({
164
- id: m.id,
165
- provider: m.provider,
166
- displayName: m.displayName,
167
- contextWindow: m.contextWindow,
168
- maxTokens: m.maxTokens,
169
- reasoning: m.reasoning,
170
- })),
171
- };
172
- }),
173
- });
174
- return c.json(ok(payload));
175
- });
176
- // PUT /api/v1/settings/llm —— 更新 LLM 配置(写入 ~/.ai-editor/config.json,绝不入项目文件)
177
- // 校验不变式:最终 (provider, model) 必须满足 model ∈ provider 目录
178
- // - provider+model 成对(跨 provider 激活,前端恒成对发送);model 不在该目录 → 400
179
- // - 只给 model:唯一归属自动定 provider;撞名(deepseek-v4-flash/pro 两目录都有)歧义 → 400(须显式 provider)
180
- // - 只给 provider:当前 model 不在新目录 → 400(须显式 model;防静默改用户选择)
155
+ // PUT /api/v1/settings/llm —— 写 pi settings(模型/思考强度)+ pi credential store(key
181
156
  settingsRoutes.put("/llm", async (c) => {
182
157
  const raw = await c.req.json().catch(() => null); // 空 body / 非法 JSON → 校验失败
183
158
  const parsed = settingsLlmPutReqSchema.safeParse(raw);
184
- if (!parsed.success) {
159
+ if (!parsed.success)
185
160
  throw parsed.error; // → app.onError → 400 VALIDATION_ERROR(含 fields)
161
+ const { provider, model, thinking_level, api_key } = parsed.data;
162
+ const modelRuntime = await getModelRuntime();
163
+ const settings = getSettingsManager();
164
+ // 本地重载(不联网):PUT 与 GET 看到同一份目录(外部编辑 models.json 后直接 PUT 模型也能校验通过)
165
+ await reloadModelRuntime(modelRuntime);
166
+ // ---- 凭据(独立于模型切换:只保存 key 不改激活模型) ----
167
+ if (api_key !== undefined) {
168
+ await applyApiKey(modelRuntime, api_key.provider, api_key.key);
186
169
  }
187
- const { provider, model, thinking_level, api_keys } = parsed.data;
188
- const cfg = getUserConfig();
189
- let targetProvider = provider ?? effectiveProvider();
190
- const currentModel = cfg.model ?? DEFAULT_MODEL;
191
- if (model !== undefined) {
192
- if (provider === undefined) {
193
- // 只给 model:归属唯一 provider(撞名歧义 → 400,须显式 provider)
194
- const owners = REGISTERED_PROVIDERS.filter((p) => getAvailableModels(p.id).some((m) => m.id === model));
195
- if (owners.length === 1)
196
- targetProvider = owners[0].id;
197
- else if (owners.length === 0)
198
- throw new HttpError(400, "VALIDATION_ERROR", `模型不在任何已注册 provider 目录: ${model}`);
199
- else
200
- throw new HttpError(400, "VALIDATION_ERROR", `模型在多 provider 目录中存在(撞名),请显式指定 provider: ${owners.map((p) => p.id).join("/")}`);
201
- }
202
- if (!getAvailableModels(targetProvider).some((m) => m.id === model)) {
203
- throw new HttpError(400, "VALIDATION_ERROR", `模型 ${model} 不在 provider ${providerDisplayName(targetProvider)} 目录`);
204
- }
205
- }
206
- else if (provider !== undefined && !getAvailableModels(provider).some((m) => m.id === currentModel)) {
207
- // 只给 provider:当前 model 必须仍在新目录(默认模型两目录都有,正常路径恒过)
208
- throw new HttpError(400, "VALIDATION_ERROR", `当前模型 ${currentModel} 不在 provider ${providerDisplayName(provider)} 目录,请显式选择模型`);
170
+ // ---- 激活模型(provider + model 成对;缺省按当前激活模型消歧) ----
171
+ if (provider !== undefined || model !== undefined) {
172
+ const selection = await resolveActiveSelection(modelRuntime, settings);
173
+ const target = resolveTargetModel(modelRuntime, {
174
+ provider,
175
+ model,
176
+ currentModelId: selection?.modelId,
177
+ });
178
+ if (target !== null)
179
+ settings.setDefaultModelAndProvider(target.provider, target.modelId);
209
180
  }
210
- saveUserConfig({
211
- provider: model !== undefined || provider !== undefined ? targetProvider : undefined,
212
- model,
213
- thinking_level,
214
- api_keys,
215
- });
181
+ if (thinking_level !== undefined)
182
+ settings.setDefaultThinkingLevel(thinking_level);
216
183
  return c.json(ok({ saved: true })); // settingsLlmPutResSchema 形状
217
184
  });
218
185
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/routes/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/routes/settings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whispering233/ai-editor-server",
3
- "version": "0.0.30",
3
+ "version": "0.0.33",
4
4
  "license": "MIT",
5
5
  "description": "Hono API 服务端(单进程:API + SPA 静态托管)",
6
6
  "type": "module",
@@ -31,17 +31,19 @@
31
31
  "postpack": "node ../../scripts/restore-package-json.mjs"
32
32
  },
33
33
  "dependencies": {
34
- "@whispering233/ai-editor-agent": "0.0.30",
35
- "@whispering233/ai-editor-db": "0.0.30",
36
- "@whispering233/ai-editor-llm": "0.0.30",
37
- "@whispering233/ai-editor-shared": "0.0.30",
38
- "@whispering233/ai-editor-tools": "0.0.30",
39
34
  "@hono/node-server": "^2.0.12",
35
+ "@whispering233/ai-editor-agent": "0.0.33",
36
+ "@whispering233/ai-editor-db": "0.0.33",
37
+ "@whispering233/ai-editor-shared": "0.0.33",
38
+ "@whispering233/ai-editor-tools": "0.0.33",
40
39
  "fflate": "^0.8.3",
41
40
  "hono": "^4.7.0",
41
+ "undici": "8.5.0",
42
42
  "zod": "^4.4.3"
43
43
  },
44
44
  "devDependencies": {
45
+ "@earendil-works/pi-ai": "0.85.1",
46
+ "@earendil-works/pi-coding-agent": "0.85.1",
45
47
  "@types/node": "^24.13.3",
46
48
  "tsx": "^4.23.1",
47
49
  "typescript": "^5.8.0"