thatgfsj-code 0.2.2 → 0.3.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/CHANGELOG.md CHANGED
@@ -15,6 +15,104 @@ All notable changes to **Thatgfsj Code** are documented here. The format follows
15
15
 
16
16
  ---
17
17
 
18
+ ## [0.3.1] - 2026-07-06
19
+
20
+ ### Added
21
+ - **「已保存的模型」作为 `/model` 主视图**:0.2.x 进 `/model` 先列内置模型,
22
+ 这版改为先列 `~/.thatgfsj/models.json` 里**已经保存的模型**(显示 id +
23
+ `ctx` + `thinking` + `note/provider`),与 1.0.4 的 `ModelSelector` 行为
24
+ 对齐。内置 provider 模型列表作为辅助信息保留在底部。
25
+ - **`+ 添加新模型` 向导**:在 `/model` 选 `a` / `add` / `+` 启动完整向导:
26
+ 1. **步骤 1/6: 选择 provider**(10 个:8 个内置 + `custom_openai` + `custom_anthropic`)
27
+ 2. **步骤 2/6: 输入 API Key**(custom_* 可选跳过)
28
+ 3. **步骤 3/6: 输入 baseUrl**(仅 custom_*;要求 `https://.../v1` 形式)
29
+ 4. **步骤 4/6: 输入模型 id**
30
+ 5. **步骤 5/6: 上下文长度 (MiB)**(默认 8;常见 8 / 32 / 128 / 200)
31
+ 6. **步骤 6/6: 思考强度**(`none` / `low` / `medium` / `high` / `max`,默认 `none`)
32
+ 完成后:写入 `~/.thatgfsj/models.json`,同步切换到新模型(更新
33
+ `AIEngine` + `~/.thatgfsj/config.json`),并把 `[system: model ... added]`
34
+ 注入 `SessionManager`,让 LLM 下一轮看到。
35
+ - **`/edit` 修改已保存模型**:1.0.4 时代就期望的能力,本次补齐:
36
+ - `/edit` 列出全部已保存模型,输入编号或完整 id 进入
37
+ - `/edit 1` / `/edit Qwen3-32B` 直接跳到对应模型
38
+ - 修改 `ctx` / `thinking` / `note`,空回车保留旧值,`-` 清空字段
39
+ - **`/provider` 支持自定义 provider**:
40
+ - 新增 `custom_openai`(OpenAI 兼容中转站)与 `custom_anthropic`
41
+ (Anthropic 兼容中转站)两项
42
+ - 选中后立刻提示输入 baseUrl,跳过内置的 `envKey` 校验
43
+ - 自动跟进 `/model` 让你顺便挑 / 添加一个模型
44
+ - **`SavedModel` 类型导出**(`src/repl/loop.ts`):
45
+ ```ts
46
+ interface SavedModel {
47
+ id: string;
48
+ addedAt?: number;
49
+ ctx?: number; // 上下文长度,单位 MiB
50
+ thinking?: 'none' | 'low' | 'medium' | 'high' | 'max';
51
+ note?: string; // 备注(如 provider id、quant 说明等)
52
+ }
53
+ ```
54
+ - **6 个新单元测试**(`tests/unit-wizard.test.js`):覆盖 v0.2.x → v0.3.x
55
+ history 形状的透明迁移、`appendSavedModel` 大小写不敏感去重 + canonical
56
+ casing 保留、`replaceSavedModel` 单条更新、`SavedModel` 形状 JSON 往返。
57
+
58
+ ### Fixed
59
+ - **appendSavedModel casing**:之前大小写不一致的同一模型会被当成两条;
60
+ 现在若已经存了 `Qwen3-32B`,再次输入 `qwen3-32b` 仍然只保留 `Qwen3-32B`
61
+ (原始拼写规范)。
62
+
63
+ > ⚠️ 上游 npm 上 `0.3.0` 已经被 1.0.4 时代占用过,因此本次发布使用 `0.3.1`,
64
+ > 仅是 patch 编号变化,feature 内容就是上面这份。
65
+
66
+ ---
67
+
68
+ ## [0.2.3] - 2026-07-06
69
+
70
+ ### Added
71
+ - **中文命令别名**:1.0.4 老版本支持的 `/模型`、`/提供商`、`/提供商切换`、
72
+ `/帮助`、`/退出`、`/清除`、`/清屏`、`/历史`、`/工具`、`/上下文`、
73
+ `/模型列表` 现在都被识别。同时支持全角斜杠 `/模型`。详见
74
+ `src/repl/loop.ts::handleCommand`。
75
+ - **`/model`「当前」标记**:即使当前模型不在内置列表里(老配置 / 自定义 id),
76
+ `/model` 现在会在顶部显示一行 `⮕ 当前 (非内置): <id>`,并保留内置 / 历史
77
+ 列表中的 `✓` 标记逻辑。
78
+ - **3 个新单元测试**(`tests/unit-config.test.js`):验证 0.2.3 的
79
+ `ConfigManager` 行为契约(不再有 silent fallback 警告、从 `CUSTOM_BASE_URL`
80
+ / `OPENAI_API_KEY` 派生 baseUrl、识别 8 个 provider name)。
81
+
82
+ ### Fixed
83
+ - **legacy provider 名称崩溃**:0.2.2 的 `ConfigManager.resolveProvider` 对
84
+ 任何不在白名单的 provider(如 1.0.4 的 `custom_openai`)会强行 overwrite
85
+ 成 `siliconflow` 并打印 `Unknown provider: custom_openai, falling back to
86
+ siliconflow` 警告,结果用户的 `MiniMax-M3` 等真实配置被悄悄丢掉,下一个
87
+ AI 请求直接撞上 401。0.2.3 改为:
88
+ - 保留用户的 provider id 不动。
89
+ - 从 `CUSTOM_BASE_URL` / `BASE_URL` 环境变量派生 baseUrl,如果都没有则
90
+ 退到 `https://api.openai.com/v1`。
91
+ - API Key 从 `OPENAI_API_KEY` / `CUSTOM_API_KEY` / config 里取。
92
+ - 不再打「Unknown provider」警告。
93
+ - **空 prompt / 引号包裹 prompt**:`REPLInput.prompt()` 收到被意外粘贴成
94
+ `""` 或 `''` 的内容时,0.2.3 会在 loop 里剥离外层引号再判断是否为空。
95
+ 这避免了用户从 markdown 复制示例时把空串丢给 LLM(命中 `[API Error: 401]`)。
96
+ - **DEFAULT_CONFIG 太老**:`ConfigManager` 默认从 `Qwen2.5-7B-Instruct`
97
+ 升级到 `Qwen3-235B-A22B-Instruct-2507`(或 `Qwen3-32B` 作为
98
+ `PROVIDERS.siliconflow.defaultModel`)。
99
+
100
+ ### Changed
101
+ - **刷新内置模型列表**(`src/repl/welcome.ts` + `src/core/types.ts`):
102
+ - SiliconFlow:Qwen3-235B / Qwen3-Coder-480B / Kimi-K2 / DeepSeek-V3.2 /
103
+ ERNIE-4.5 等。
104
+ - MiniMax:M3(推荐)、M2.5、M2.1(默认从 `MiniMax-M2.5` 升到 `MiniMax-M3`)。
105
+ - OpenAI:GPT-4.1 / GPT-4.1-mini / GPT-4o / o4-mini / GPT-5。
106
+ - Anthropic:Claude-Haiku-4.5 / Claude-Sonnet-4.5 / Claude-Opus-4.1。
107
+ - Gemini:Gemini-2.5-Flash / Gemini-2.5-Pro / Gemini-2.0-Flash。
108
+ - Kimi:Moonshot-V1-128K / Kimi-K2。
109
+ - DeepSeek:DeepSeek-V3(带 R1 推理)。
110
+ - ERNIE:ERNIE-4.5-8K(百度最新旗舰)。
111
+ - **`PROVIDERS` 默认模型**全部更新到 2025+ 推荐(Qwen3-32B、MiniMax-M3、
112
+ GPT-4.1-mini、Claude-Haiku-4.5、Llama3、Gemini-2.5-Flash、Kimi-K2 等)。
113
+
114
+ ---
115
+
18
116
  ## [0.2.2] - 2026-07-06
19
117
 
20
118
  ### Added
@@ -1,6 +1,13 @@
1
1
  /**
2
2
  * Config Manager - Handles configuration loading and saving
3
3
  * Supports multiple AI providers: MiniMax, SiliconFlow, OpenAI, Anthropic
4
+ *
5
+ * 0.2.3: Tolerates unknown / legacy provider names (e.g. `custom_openai`
6
+ * from 1.0.4-era configs) — keeps the user's provider and falls back to
7
+ * deriving a sensible baseUrl from `CUSTOM_BASE_URL` / `BASE_URL` env vars
8
+ * or from the provider id itself, instead of silently overwriting the
9
+ * provider field. Also refreshes default model to current SiliconFlow
10
+ * recommendation (Qwen2.5-72B-Instruct instead of 7B).
4
11
  */
5
12
  import { Config, AIConfig } from './types.js';
6
13
  export declare class ConfigManager {
@@ -16,6 +23,16 @@ export declare class ConfigManager {
16
23
  private loadConfig;
17
24
  /**
18
25
  * Resolve provider and API key from config or environment
26
+ *
27
+ * 0.2.3: tolerate unknown / legacy provider names (e.g. `custom_openai`).
28
+ * - If the provider is in `PROVIDERS`, use its baseUrl + envKeys.
29
+ * - Otherwise keep the user-specified provider id exactly and try to
30
+ * derive a baseUrl from `CUSTOM_BASE_URL` / `BASE_URL` env vars; if
31
+ * neither is set, fall back to the OpenAI-compatible default
32
+ * (https://api.openai.com/v1) so the request still goes through.
33
+ * No silent overwrite of `provider`.
34
+ * - When API key is missing for an unknown provider, we still keep the
35
+ * provider and surface a non-fatal warning.
19
36
  */
20
37
  private resolveProvider;
21
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,MAAM,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWzD,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;;IAQ3B;;OAEG;WACU,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;OAEG;IACH,OAAO,CAAC,eAAe;IAwCvB;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAY7C;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM;CAK/B"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,MAAM,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWzD,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;;IAQ3B;;OAEG;WACU,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,eAAe;IA4DvB;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAY7C;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM;CAK/B"}
@@ -1,13 +1,20 @@
1
1
  /**
2
2
  * Config Manager - Handles configuration loading and saving
3
3
  * Supports multiple AI providers: MiniMax, SiliconFlow, OpenAI, Anthropic
4
+ *
5
+ * 0.2.3: Tolerates unknown / legacy provider names (e.g. `custom_openai`
6
+ * from 1.0.4-era configs) — keeps the user's provider and falls back to
7
+ * deriving a sensible baseUrl from `CUSTOM_BASE_URL` / `BASE_URL` env vars
8
+ * or from the provider id itself, instead of silently overwriting the
9
+ * provider field. Also refreshes default model to current SiliconFlow
10
+ * recommendation (Qwen2.5-72B-Instruct instead of 7B).
4
11
  */
5
12
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
6
13
  import { join, dirname } from 'path';
7
14
  import { homedir } from 'os';
8
15
  import { PROVIDERS } from './types.js';
9
16
  const DEFAULT_CONFIG = {
10
- model: 'Qwen/Qwen2.5-7B-Instruct',
17
+ model: 'Qwen/Qwen2.5-72B-Instruct',
11
18
  apiKey: '',
12
19
  temperature: 0.7,
13
20
  maxTokens: 4096,
@@ -49,27 +56,53 @@ export class ConfigManager {
49
56
  }
50
57
  /**
51
58
  * Resolve provider and API key from config or environment
59
+ *
60
+ * 0.2.3: tolerate unknown / legacy provider names (e.g. `custom_openai`).
61
+ * - If the provider is in `PROVIDERS`, use its baseUrl + envKeys.
62
+ * - Otherwise keep the user-specified provider id exactly and try to
63
+ * derive a baseUrl from `CUSTOM_BASE_URL` / `BASE_URL` env vars; if
64
+ * neither is set, fall back to the OpenAI-compatible default
65
+ * (https://api.openai.com/v1) so the request still goes through.
66
+ * No silent overwrite of `provider`.
67
+ * - When API key is missing for an unknown provider, we still keep the
68
+ * provider and surface a non-fatal warning.
52
69
  */
53
70
  resolveProvider(config) {
54
71
  const provider = config.provider || 'siliconflow';
55
- const providerConfig = (provider !== 'custom' && provider !== undefined) ? PROVIDERS[provider] : null;
72
+ const providerConfig = PROVIDERS[provider];
56
73
  if (!providerConfig) {
57
- console.warn(`Unknown provider: ${provider}, falling back to siliconflow`);
58
- return { ...config, provider: 'siliconflow', baseUrl: PROVIDERS.siliconflow.baseUrl };
74
+ // Unknown / legacy / custom provider keep what the user wrote, but
75
+ // resolve a reasonable baseUrl.
76
+ const envBase = process.env.CUSTOM_BASE_URL || process.env.BASE_URL;
77
+ const baseUrl = config.baseUrl ||
78
+ envBase ||
79
+ // Last-resort: OpenAI-compatible default. The user can override via
80
+ // `gfcode init` or by editing ~/.thatgfsj/config.json.
81
+ 'https://api.openai.com/v1';
82
+ const apiKey = config.apiKey ||
83
+ process.env.OPENAI_API_KEY ||
84
+ process.env.CUSTOM_API_KEY ||
85
+ '';
86
+ // Model: keep user choice, otherwise fall back to env MODEL, otherwise
87
+ // a benign default. No warning spam — this is an expected path.
88
+ const model = config.model || process.env.MODEL || 'gpt-4o-mini';
89
+ return {
90
+ ...config,
91
+ provider: provider,
92
+ baseUrl,
93
+ model,
94
+ apiKey,
95
+ };
59
96
  }
60
- // MODEL environment variable has highest priority
97
+ // Known provider
61
98
  let model = process.env.MODEL || config.model || providerConfig.defaultModel;
62
- // Handle Ollama (local, no API key needed)
63
99
  let apiKey = config.apiKey;
64
100
  let baseUrl = config.baseUrl || providerConfig.baseUrl;
65
101
  if (provider === 'ollama') {
66
- // Ollama doesn't need an API key
67
102
  apiKey = '';
68
- // Allow custom base URL via environment
69
103
  baseUrl = process.env.OLLAMA_BASE_URL || baseUrl;
70
104
  }
71
105
  else {
72
- // Try to get API key from environment
73
106
  for (const envKey of providerConfig.envKeys) {
74
107
  if (process.env[envKey]) {
75
108
  apiKey = process.env[envKey];
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -151,43 +151,43 @@ export declare const PROVIDERS: {
151
151
  readonly minimax: {
152
152
  readonly name: "MiniMax";
153
153
  readonly baseUrl: "https://api.minimax.io/anthropic/v1";
154
- readonly defaultModel: "MiniMax-M2.5";
154
+ readonly defaultModel: "MiniMax-M3";
155
155
  readonly envKeys: readonly ["MINIMAX_API_KEY", "OPENAI_API_KEY"];
156
156
  };
157
157
  readonly siliconflow: {
158
158
  readonly name: "SiliconFlow (硅基流动)";
159
159
  readonly baseUrl: "https://api.siliconflow.cn/v1";
160
- readonly defaultModel: "Qwen/Qwen2.5-7B-Instruct";
160
+ readonly defaultModel: "Qwen/Qwen3-32B";
161
161
  readonly envKeys: readonly ["SILICONFLOW_API_KEY", "OPENAI_API_KEY"];
162
162
  };
163
163
  readonly openai: {
164
164
  readonly name: "OpenAI";
165
165
  readonly baseUrl: "https://api.openai.com/v1";
166
- readonly defaultModel: "gpt-4o-mini";
166
+ readonly defaultModel: "gpt-4.1-mini";
167
167
  readonly envKeys: readonly ["OPENAI_API_KEY"];
168
168
  };
169
169
  readonly anthropic: {
170
170
  readonly name: "Anthropic";
171
171
  readonly baseUrl: "https://api.anthropic.com/v1";
172
- readonly defaultModel: "claude-3-haiku-20240307";
172
+ readonly defaultModel: "claude-haiku-4-5-20251001";
173
173
  readonly envKeys: readonly ["ANTHROPIC_API_KEY"];
174
174
  };
175
175
  readonly ollama: {
176
176
  readonly name: "Ollama (Local)";
177
177
  readonly baseUrl: string;
178
- readonly defaultModel: "llama2";
178
+ readonly defaultModel: "llama3";
179
179
  readonly envKeys: readonly [];
180
180
  };
181
181
  readonly gemini: {
182
182
  readonly name: "Google Gemini";
183
183
  readonly baseUrl: "https://generativelanguage.googleapis.com/v1beta";
184
- readonly defaultModel: "gemini-1.5-flash";
184
+ readonly defaultModel: "gemini-2.5-flash";
185
185
  readonly envKeys: readonly ["GEMINI_API_KEY"];
186
186
  };
187
187
  readonly kimi: {
188
188
  readonly name: "Kimi (Moonshot AI)";
189
189
  readonly baseUrl: "https://api.moonshot.cn/v1";
190
- readonly defaultModel: "moonshot-v1-8k";
190
+ readonly defaultModel: "kimi-k2-instruct";
191
191
  readonly envKeys: readonly ["KIMI_API_KEY", "MOONSHOT_API_KEY"];
192
192
  };
193
193
  readonly deepseek: {
@@ -199,7 +199,7 @@ export declare const PROVIDERS: {
199
199
  readonly ernie: {
200
200
  readonly name: "Baidu ERNIE (文心一言)";
201
201
  readonly baseUrl: "https://aip.baidubce.com/rpc/2.0/ai_custom/v1";
202
- readonly defaultModel: "ernie-4.0-8k";
202
+ readonly defaultModel: "ernie-4.5-8k";
203
203
  readonly envKeys: readonly ["ERNIE_API_KEY", "BAIDU_API_KEY"];
204
204
  };
205
205
  };
@@ -72,43 +72,43 @@ export const PROVIDERS = {
72
72
  minimax: {
73
73
  name: 'MiniMax',
74
74
  baseUrl: 'https://api.minimax.io/anthropic/v1',
75
- defaultModel: 'MiniMax-M2.5',
75
+ defaultModel: 'MiniMax-M3',
76
76
  envKeys: ['MINIMAX_API_KEY', 'OPENAI_API_KEY']
77
77
  },
78
78
  siliconflow: {
79
79
  name: 'SiliconFlow (硅基流动)',
80
80
  baseUrl: 'https://api.siliconflow.cn/v1',
81
- defaultModel: 'Qwen/Qwen2.5-7B-Instruct',
81
+ defaultModel: 'Qwen/Qwen3-32B',
82
82
  envKeys: ['SILICONFLOW_API_KEY', 'OPENAI_API_KEY']
83
83
  },
84
84
  openai: {
85
85
  name: 'OpenAI',
86
86
  baseUrl: 'https://api.openai.com/v1',
87
- defaultModel: 'gpt-4o-mini',
87
+ defaultModel: 'gpt-4.1-mini',
88
88
  envKeys: ['OPENAI_API_KEY']
89
89
  },
90
90
  anthropic: {
91
91
  name: 'Anthropic',
92
92
  baseUrl: 'https://api.anthropic.com/v1',
93
- defaultModel: 'claude-3-haiku-20240307',
93
+ defaultModel: 'claude-haiku-4-5-20251001',
94
94
  envKeys: ['ANTHROPIC_API_KEY']
95
95
  },
96
96
  ollama: {
97
97
  name: 'Ollama (Local)',
98
98
  baseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
99
- defaultModel: 'llama2',
99
+ defaultModel: 'llama3',
100
100
  envKeys: []
101
101
  },
102
102
  gemini: {
103
103
  name: 'Google Gemini',
104
104
  baseUrl: 'https://generativelanguage.googleapis.com/v1beta',
105
- defaultModel: 'gemini-1.5-flash',
105
+ defaultModel: 'gemini-2.5-flash',
106
106
  envKeys: ['GEMINI_API_KEY']
107
107
  },
108
108
  kimi: {
109
109
  name: 'Kimi (Moonshot AI)',
110
110
  baseUrl: 'https://api.moonshot.cn/v1',
111
- defaultModel: 'moonshot-v1-8k',
111
+ defaultModel: 'kimi-k2-instruct',
112
112
  envKeys: ['KIMI_API_KEY', 'MOONSHOT_API_KEY']
113
113
  },
114
114
  deepseek: {
@@ -120,7 +120,7 @@ export const PROVIDERS = {
120
120
  ernie: {
121
121
  name: 'Baidu ERNIE (文心一言)',
122
122
  baseUrl: 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1',
123
- defaultModel: 'ernie-4.0-8k',
123
+ defaultModel: 'ernie-4.5-8k',
124
124
  envKeys: ['ERNIE_API_KEY', 'BAIDU_API_KEY']
125
125
  }
126
126
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,23 @@
7
7
  * - 流式输出保留完整内容(用户可滚动终端查看历史),不跳顶不刷屏
8
8
  * - Ctrl+C 行为:有未提交内容=>清空当前输入;空输入两次=>退出
9
9
  */
10
+ /**
11
+ * One entry in ~/.thatgfsj/models.json (added in 0.3.0).
12
+ */
13
+ export interface SavedModel {
14
+ /** Model id used in API requests, e.g. `Qwen3-32B` or `claude-sonnet-4-5`. */
15
+ id: string;
16
+ /** Unix ms timestamp when this entry was last written. Defaults to 0
17
+ * on legacy entries; `appendSavedModel` always overwrites it with
18
+ * `Date.now()` at write time. */
19
+ addedAt?: number;
20
+ /** Optional context-window length in MiB (the `ctx` field). */
21
+ ctx?: number;
22
+ /** Optional thinking-effort hint: 'none' | 'low' | 'medium' | 'high' | 'max'. */
23
+ thinking?: 'none' | 'low' | 'medium' | 'high' | 'max';
24
+ /** Optional free-form note (e.g. "Q4 quantized via openrouter"). */
25
+ note?: string;
26
+ }
10
27
  export declare class REPLLoop {
11
28
  private input;
12
29
  private output;
@@ -26,6 +43,10 @@ export declare class REPLLoop {
26
43
  start(): Promise<void>;
27
44
  /**
28
45
  * Handle built-in commands
46
+ *
47
+ * Accepts bare words, slash-prefixed forms (`/model`), AND Chinese aliases
48
+ * (`/模型`, `/提供商`, `/帮助`, `/清除`, `/退出`, `/历史`, `/工具`).
49
+ * The Chinese forms mirror thatgfsj-code@1.0.4 behaviour.
29
50
  */
30
51
  private handleCommand;
31
52
  /**
@@ -42,37 +63,86 @@ export declare class REPLLoop {
42
63
  private showTools;
43
64
  private showProviders;
44
65
  /**
45
- * /model — interactive model picker for the currently-active provider.
46
- * Persists the choice to ~/.thatgfsj/config.json and updates the running
47
- * AIEngine so subsequent requests use the new model immediately. Also
48
- * appends the picked model id to ~/.thatgfsj/models.json so it shows up
49
- * as a recent option across sessions (mirrors the 1.0.4 behaviour).
66
+ * /model — main entry point for model management.
50
67
  *
51
- * The user can:
52
- * 1. Enter the numbered index of a built-in choice
53
- * 2. Paste an exact model id (matched against the provider's model list,
54
- * recent history, OR the current model)
55
- * 3. Type any free-form model id to switch to a custom model
56
- * 4. Press Enter with empty input to keep the current model
57
- * 5. Press Ctrl+C to cancel
68
+ * 0.3.0 UX (per user feedback):
69
+ * - 先看到的是**已经保存的模型** (从 ~/.thatgfsj/models.json 读),
70
+ * 而不是内置 provider 列表。
71
+ * - 列表末尾是 `+ 添加新模型` 选项 → 触发完整向导
72
+ * (provider api_key baseUrl(可选,用于中转站) model_name
73
+ * context length (M) thinking effort)。
74
+ * - 顶部有 `edit` 模式,可以重新修改任意已保存模型。
75
+ * - 选某条 saved model 后立即切换并退出;按 Enter 不变。
76
+ * - 兼容 0.2.x / 1.0.4 老 history:
77
+ * - 字符串数组会透明迁移成 {id,...} 形式。
78
+ * - 内置模型 (`Qwen3-32B` 之类) 也可选择,作为「saved + builtin」展示。
58
79
  */
59
80
  private handleModelSwitch;
60
81
  /**
61
- * Read ~/.thatgfsj/models.json — a flat array of model ids the user has
62
- * previously switched to. Order is "most recent last" in the file but the
63
- * caller treats it as time-ordered.
82
+ * Add-model wizard (0.3.0+):
83
+ * Step 1: Provider (内置 / custom_openai / custom_anthropic)
84
+ * Step 2: API Key (内置:给注册链接;custom:无)
85
+ * Step 3: Base URL (仅 custom_*;内置跳过)
86
+ * Step 4: 模型名称 (自由输入)
87
+ * Step 5: 上下文长度 (MiB,数字,默认 8)
88
+ * Step 6: 思考强度 (none / low / medium / high / max,默认 none)
89
+ *
90
+ * 完成后:写入 ~/.thatgfsj/models.json,顺便把新模型切到当前,
91
+ * 更新 AIEngine + 写入 ~/.thatgfsj/config.json model 字段。
92
+ */
93
+ private runAddModelWizard;
94
+ /**
95
+ * Edit-model wizard (0.3.0+): pick a saved model and update ctx /
96
+ * thinking / note without leaving the REPL.
97
+ */
98
+ private runEditModelWizard;
99
+ /**
100
+ * Persist a provider choice + custom baseUrl + apiKey into
101
+ * ~/.thatgfsj/config.json and reload AIEngine config. Differs from
102
+ * applyProviderSwitch in that this also writes a custom baseUrl.
103
+ */
104
+ private applyProviderSwitchInternal;
105
+ /**
106
+ * Read ~/.thatgfsj/models.json — a list of saved models the user has
107
+ * previously switched to or added. Starting from 0.3.0 each entry is
108
+ * `{ id, addedAt, ctx?, thinking?, note? }`. Older releases stored a
109
+ * flat array of strings; we transparently migrate that on read.
64
110
  */
65
111
  private loadModelHistory;
66
112
  /**
67
- * Append a model id to ~/.thatgfsj/models.json, deduping the trailing
68
- * entry. Mirrors the 1.0.4 behaviour: history is "things you switched to".
113
+ * Read ~/.thatgfsj/models.json as a list of SavedModel entries.
114
+ * Migrates v0.2.x's `["id1","id2"]` shape into 0.3.0's `{id,...}` shape
115
+ * on the fly, leaving the on-disk file untouched until a write happens.
116
+ */
117
+ private loadSavedModels;
118
+ /**
119
+ * Legacy helper: append a model id to ~/.thatgfsj/models.json.
120
+ * New callers should prefer `appendSavedModel` so we don't lose
121
+ * ctx / thinking metadata.
69
122
  */
70
123
  private appendModelHistory;
124
+ /**
125
+ * Persist a SavedModel into ~/.thatgfsj/models.json, replacing any
126
+ * existing entry with the same id (case-insensitive). The original
127
+ * casing of the entry is preserved — i.e. if the user already has
128
+ * `Qwen3-32B` saved and types `qwen3-32b`, the canonical `Qwen3-32B`
129
+ * casing is kept. Newest entries go at the tail of the file.
130
+ */
131
+ private appendSavedModel;
132
+ /** Replace an existing saved model entry (matched by id). */
133
+ private replaceSavedModel;
71
134
  /**
72
135
  * /provider — interactive provider picker. After provider selection,
73
136
  * delegates to /model so the user can also pick a new model for the new provider.
74
137
  */
75
138
  private handleProviderSwitch;
139
+ /**
140
+ * /edit [n] — short-hand for the edit wizard.
141
+ * `/edit` → list saved models, ask which to edit.
142
+ * `/edit 1` → jump to wizard for saved model #1.
143
+ * `/edit Qwen3-32B` → jump to wizard for the model whose id matches.
144
+ */
145
+ private runEditShortcut;
76
146
  /**
77
147
  * Persist a model choice and update the running AIEngine.
78
148
  */
@@ -97,6 +167,11 @@ export declare class REPLLoop {
97
167
  * `null` if the user pressed Ctrl+C (does not throw).
98
168
  */
99
169
  private askOnce;
170
+ /**
171
+ * Validate-and-collect a numeric choice within `[min..max]`. Accepts
172
+ * empty input as `defaultValue`. Returns `null` on Ctrl+C.
173
+ */
174
+ private askChoice;
100
175
  /**
101
176
  * Stop the REPL
102
177
  */
@@ -1 +1 @@
1
- {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/repl/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,OAAO,CAAkB;IAEjC,OAAO,CAAC,WAAW,CAAgC;;IAOnD;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C5B;;OAEG;YACW,aAAa;IA0D3B;;;;;;;OAOG;YACW,YAAY;IAsD1B,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,aAAa;IAarB;;;;;;;;;;;;;;OAcG;YACW,iBAAiB;IAsG/B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;;OAGG;YACW,oBAAoB;IAyElC;;OAEG;YACW,gBAAgB;IAS9B;;;OAGG;YACW,mBAAmB;IASjC;;;OAGG;YACW,mBAAmB;YA2BnB,aAAa;IAM3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;;OAGG;IACH,OAAO,CAAC,OAAO;IAoBf;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACH,SAAS,IAAI,IAAI;CAOlB"}
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/repl/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,8EAA8E;IAC9E,EAAE,EAAE,MAAM,CAAC;IACX;;sCAEkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IACtD,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,OAAO,CAAkB;IAEjC,OAAO,CAAC,WAAW,CAAgC;;IAOnD;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C5B;;;;;;OAMG;YACW,aAAa;IA8E3B;;;;;;;OAOG;YACW,YAAY;IAsD1B,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,aAAa;IAarB;;;;;;;;;;;;;;OAcG;YACW,iBAAiB;IA6H/B;;;;;;;;;;;OAWG;YACW,iBAAiB;IA0G/B;;;OAGG;YACW,kBAAkB;IA2ChC;;;;OAIG;YACW,2BAA2B;IAezC;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IA6BvB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAqBxB,6DAA6D;IAC7D,OAAO,CAAC,iBAAiB;IAezB;;;OAGG;YACW,oBAAoB;IAgGlC;;;;;OAKG;YACW,eAAe;IAgC7B;;OAEG;YACW,gBAAgB;IAS9B;;;OAGG;YACW,mBAAmB;IASjC;;;OAGG;YACW,mBAAmB;YA2BnB,aAAa;IAM3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;;OAGG;IACH,OAAO,CAAC,OAAO;IAoBf;;;OAGG;YACW,SAAS;IAWvB;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACH,SAAS,IAAI,IAAI;CAOlB"}