@ai-zen/cli 1.0.0-alpha.8 → 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/CHANGELOG.md +1340 -269
- package/LICENSE +21 -0
- package/README.md +136 -31
- package/README.zh.md +136 -31
- package/dist/agent-creator.d.ts +11 -0
- package/dist/agent-creator.d.ts.map +1 -1
- package/dist/agent-creator.js +50 -20
- package/dist/agent-creator.js.map +1 -1
- package/dist/agent-switch.d.ts +61 -0
- package/dist/agent-switch.d.ts.map +1 -0
- package/dist/agent-switch.js +83 -0
- package/dist/agent-switch.js.map +1 -0
- package/dist/agents-store.d.ts +6 -1
- package/dist/agents-store.d.ts.map +1 -1
- package/dist/agents-store.js +46 -4
- package/dist/agents-store.js.map +1 -1
- package/dist/auto-migrate-confirm.d.ts +43 -0
- package/dist/auto-migrate-confirm.d.ts.map +1 -0
- package/dist/auto-migrate-confirm.js +47 -0
- package/dist/auto-migrate-confirm.js.map +1 -0
- package/dist/clipboard.d.ts +68 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +177 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/config-editor.d.ts +42 -5
- package/dist/config-editor.d.ts.map +1 -1
- package/dist/config-editor.js +80 -27
- package/dist/config-editor.js.map +1 -1
- package/dist/config.d.ts +76 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +143 -39
- package/dist/config.js.map +1 -1
- package/dist/conversation-commands/registry.d.ts +127 -4
- package/dist/conversation-commands/registry.d.ts.map +1 -1
- package/dist/conversation-commands/registry.js +93 -14
- package/dist/conversation-commands/registry.js.map +1 -1
- package/dist/conversation-persist-plugin.d.ts +0 -1
- package/dist/conversation-persist-plugin.d.ts.map +1 -1
- package/dist/conversation-persist-plugin.js +7 -16
- package/dist/conversation-persist-plugin.js.map +1 -1
- package/dist/conversation-repository.d.ts +79 -18
- package/dist/conversation-repository.d.ts.map +1 -1
- package/dist/conversation-repository.js +96 -30
- package/dist/conversation-repository.js.map +1 -1
- package/dist/cwd-tracker-plugin.d.ts.map +1 -1
- package/dist/cwd-tracker-plugin.js +22 -7
- package/dist/cwd-tracker-plugin.js.map +1 -1
- package/dist/format-time.d.ts +17 -6
- package/dist/format-time.d.ts.map +1 -1
- package/dist/format-time.js +32 -14
- package/dist/format-time.js.map +1 -1
- package/dist/handoff-service.d.ts +19 -0
- package/dist/handoff-service.d.ts.map +1 -0
- package/dist/handoff-service.js +85 -0
- package/dist/handoff-service.js.map +1 -0
- package/dist/hook.d.ts.map +1 -1
- package/dist/hook.js +69 -15
- package/dist/hook.js.map +1 -1
- package/dist/i18n/en-wizard.d.ts +8 -0
- package/dist/i18n/en-wizard.d.ts.map +1 -0
- package/dist/i18n/en-wizard.js +303 -0
- package/dist/i18n/en-wizard.js.map +1 -0
- package/dist/i18n/en.d.ts +7 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +245 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +57 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/preferences.d.ts +37 -0
- package/dist/i18n/preferences.d.ts.map +1 -0
- package/dist/i18n/preferences.js +73 -0
- package/dist/i18n/preferences.js.map +1 -0
- package/dist/i18n/zh-wizard.d.ts +11 -0
- package/dist/i18n/zh-wizard.d.ts.map +1 -0
- package/dist/i18n/zh-wizard.js +306 -0
- package/dist/i18n/zh-wizard.js.map +1 -0
- package/dist/i18n/zh.d.ts +10 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +249 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/index.js +52 -23
- package/dist/index.js.map +1 -1
- package/dist/mcp-command.d.ts +32 -0
- package/dist/mcp-command.d.ts.map +1 -0
- package/dist/mcp-command.js +37 -0
- package/dist/mcp-command.js.map +1 -0
- package/dist/mode.d.ts +31 -4
- package/dist/mode.d.ts.map +1 -1
- package/dist/mode.js +42 -7
- package/dist/mode.js.map +1 -1
- package/dist/model-switch.d.ts +58 -0
- package/dist/model-switch.d.ts.map +1 -0
- package/dist/model-switch.js +62 -0
- package/dist/model-switch.js.map +1 -0
- package/dist/reasoning-effort.d.ts +96 -0
- package/dist/reasoning-effort.d.ts.map +1 -0
- package/dist/reasoning-effort.js +164 -0
- package/dist/reasoning-effort.js.map +1 -0
- package/dist/reasoning-presets.d.ts +34 -0
- package/dist/reasoning-presets.d.ts.map +1 -0
- package/dist/reasoning-presets.js +85 -0
- package/dist/reasoning-presets.js.map +1 -0
- package/dist/sdk-log.d.ts +84 -0
- package/dist/sdk-log.d.ts.map +1 -0
- package/dist/sdk-log.js +167 -0
- package/dist/sdk-log.js.map +1 -0
- package/dist/session-pointer.d.ts.map +1 -1
- package/dist/session-pointer.js +10 -4
- package/dist/session-pointer.js.map +1 -1
- package/dist/stdio-runner.d.ts.map +1 -1
- package/dist/stdio-runner.js +32 -30
- package/dist/stdio-runner.js.map +1 -1
- package/dist/sub-agent-guard-plugin.d.ts +10 -7
- package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
- package/dist/sub-agent-guard-plugin.js +12 -9
- package/dist/sub-agent-guard-plugin.js.map +1 -1
- package/dist/tui/chat-history.d.ts +29 -0
- package/dist/tui/chat-history.d.ts.map +1 -0
- package/dist/tui/chat-history.js +55 -0
- package/dist/tui/chat-history.js.map +1 -0
- package/dist/tui/chat-session.d.ts +144 -13
- package/dist/tui/chat-session.d.ts.map +1 -1
- package/dist/tui/chat-session.js +312 -73
- package/dist/tui/chat-session.js.map +1 -1
- package/dist/tui/components.d.ts +109 -6
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +177 -12
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/config-wizard/detail.d.ts +18 -10
- package/dist/tui/config-wizard/detail.d.ts.map +1 -1
- package/dist/tui/config-wizard/detail.js +53 -46
- package/dist/tui/config-wizard/detail.js.map +1 -1
- package/dist/tui/config-wizard/engine.d.ts +2 -2
- package/dist/tui/config-wizard/engine.d.ts.map +1 -1
- package/dist/tui/config-wizard/engine.js +48 -26
- package/dist/tui/config-wizard/engine.js.map +1 -1
- package/dist/tui/config-wizard/fields.d.ts +3 -1
- package/dist/tui/config-wizard/fields.d.ts.map +1 -1
- package/dist/tui/config-wizard/fields.js +202 -167
- package/dist/tui/config-wizard/fields.js.map +1 -1
- package/dist/tui/config-wizard/frame.js +1 -1
- package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/kv-editor.js +13 -5
- package/dist/tui/config-wizard/kv-editor.js.map +1 -1
- package/dist/tui/config-wizard/list.d.ts +3 -1
- package/dist/tui/config-wizard/list.d.ts.map +1 -1
- package/dist/tui/config-wizard/list.js +4 -4
- package/dist/tui/config-wizard/list.js.map +1 -1
- package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
- package/dist/tui/config-wizard/mcp-helpers.js +4 -3
- package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
- package/dist/tui/config-wizard/menu.d.ts.map +1 -1
- package/dist/tui/config-wizard/menu.js +33 -21
- package/dist/tui/config-wizard/menu.js.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.d.ts +8 -1
- package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.js +11 -7
- package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
- package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
- package/dist/tui/config-wizard/prompt.js +8 -7
- package/dist/tui/config-wizard/prompt.js.map +1 -1
- package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-agents.js +50 -29
- package/dist/tui/config-wizard/step-agents.js.map +1 -1
- package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-defaults.js +77 -27
- package/dist/tui/config-wizard/step-defaults.js.map +1 -1
- package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-endpoints.js +27 -14
- package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
- package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-mcp.js +29 -25
- package/dist/tui/config-wizard/step-mcp.js.map +1 -1
- package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-models.js +98 -43
- package/dist/tui/config-wizard/step-models.js.map +1 -1
- package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
- package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
- package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-simple.js +18 -17
- package/dist/tui/config-wizard/step-simple.js.map +1 -1
- package/dist/tui/config-wizard/types.d.ts +31 -3
- package/dist/tui/config-wizard/types.d.ts.map +1 -1
- package/dist/tui/config-wizard/types.js.map +1 -1
- package/dist/tui/file-index.d.ts +38 -0
- package/dist/tui/file-index.d.ts.map +1 -0
- package/dist/tui/file-index.js +117 -0
- package/dist/tui/file-index.js.map +1 -0
- package/dist/tui/index.d.ts +17 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +105 -49
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/input-editing.d.ts +52 -0
- package/dist/tui/input-editing.d.ts.map +1 -0
- package/dist/tui/input-editing.js +91 -0
- package/dist/tui/input-editing.js.map +1 -0
- package/dist/tui/key-debug.d.ts +62 -0
- package/dist/tui/key-debug.d.ts.map +1 -0
- package/dist/tui/key-debug.js +92 -0
- package/dist/tui/key-debug.js.map +1 -0
- package/dist/tui/mention.d.ts +47 -0
- package/dist/tui/mention.d.ts.map +1 -0
- package/dist/tui/mention.js +152 -0
- package/dist/tui/mention.js.map +1 -0
- package/dist/tui/mouse.d.ts +55 -0
- package/dist/tui/mouse.d.ts.map +1 -0
- package/dist/tui/mouse.js +74 -0
- package/dist/tui/mouse.js.map +1 -0
- package/dist/tui/phase.d.ts +64 -0
- package/dist/tui/phase.d.ts.map +1 -0
- package/dist/tui/phase.js +112 -0
- package/dist/tui/phase.js.map +1 -0
- package/dist/tui/screens/agent-tabs.d.ts +53 -0
- package/dist/tui/screens/agent-tabs.d.ts.map +1 -0
- package/dist/tui/screens/agent-tabs.js +81 -0
- package/dist/tui/screens/agent-tabs.js.map +1 -0
- package/dist/tui/screens/chat-commands.d.ts +78 -1
- package/dist/tui/screens/chat-commands.d.ts.map +1 -1
- package/dist/tui/screens/chat-commands.js +688 -157
- package/dist/tui/screens/chat-commands.js.map +1 -1
- package/dist/tui/screens/chat.d.ts +57 -1
- package/dist/tui/screens/chat.d.ts.map +1 -1
- package/dist/tui/screens/chat.js +751 -265
- package/dist/tui/screens/chat.js.map +1 -1
- package/dist/tui/screens/common-keys.d.ts +36 -0
- package/dist/tui/screens/common-keys.d.ts.map +1 -0
- package/dist/tui/screens/common-keys.js +67 -0
- package/dist/tui/screens/common-keys.js.map +1 -0
- package/dist/tui/screens/frame-buffer.d.ts.map +1 -1
- package/dist/tui/screens/frame-buffer.js.map +1 -1
- package/dist/tui/screens/handoff-choice.d.ts +37 -0
- package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
- package/dist/tui/screens/handoff-choice.js +42 -0
- package/dist/tui/screens/handoff-choice.js.map +1 -0
- package/dist/tui/screens/index.d.ts +7 -5
- package/dist/tui/screens/index.d.ts.map +1 -1
- package/dist/tui/screens/index.js +6 -5
- package/dist/tui/screens/index.js.map +1 -1
- package/dist/tui/screens/input-row.d.ts +64 -0
- package/dist/tui/screens/input-row.d.ts.map +1 -0
- package/dist/tui/screens/input-row.js +67 -0
- package/dist/tui/screens/input-row.js.map +1 -0
- package/dist/tui/screens/input.d.ts +77 -1
- package/dist/tui/screens/input.d.ts.map +1 -1
- package/dist/tui/screens/input.js +125 -8
- package/dist/tui/screens/input.js.map +1 -1
- package/dist/tui/screens/layout.d.ts +49 -0
- package/dist/tui/screens/layout.d.ts.map +1 -1
- package/dist/tui/screens/layout.js +45 -7
- package/dist/tui/screens/layout.js.map +1 -1
- package/dist/tui/screens/lines.d.ts +7 -0
- package/dist/tui/screens/lines.d.ts.map +1 -1
- package/dist/tui/screens/lines.js +6 -6
- package/dist/tui/screens/lines.js.map +1 -1
- package/dist/tui/screens/messages-view.d.ts +20 -1
- package/dist/tui/screens/messages-view.d.ts.map +1 -1
- package/dist/tui/screens/messages-view.js +55 -8
- package/dist/tui/screens/messages-view.js.map +1 -1
- package/dist/tui/screens/notice-bar.d.ts +5 -0
- package/dist/tui/screens/notice-bar.d.ts.map +1 -0
- package/dist/tui/screens/notice-bar.js +21 -0
- package/dist/tui/screens/notice-bar.js.map +1 -0
- package/dist/tui/screens/notice.d.ts +44 -10
- package/dist/tui/screens/notice.d.ts.map +1 -1
- package/dist/tui/screens/notice.js +75 -15
- package/dist/tui/screens/notice.js.map +1 -1
- package/dist/tui/screens/overlays.d.ts.map +1 -1
- package/dist/tui/screens/overlays.js +4 -3
- package/dist/tui/screens/overlays.js.map +1 -1
- package/dist/tui/screens/render.d.ts +1 -1
- package/dist/tui/screens/render.d.ts.map +1 -1
- package/dist/tui/screens/render.js +18 -11
- package/dist/tui/screens/render.js.map +1 -1
- package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
- package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
- package/dist/tui/screens/use-chat-viewport.js +50 -0
- package/dist/tui/screens/use-chat-viewport.js.map +1 -0
- package/dist/tui/screens/use-input-editing.d.ts +69 -0
- package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
- package/dist/tui/screens/use-input-editing.js +220 -0
- package/dist/tui/screens/use-input-editing.js.map +1 -0
- package/dist/tui/screens/use-overlays.d.ts +25 -0
- package/dist/tui/screens/use-overlays.d.ts.map +1 -0
- package/dist/tui/screens/use-overlays.js +32 -0
- package/dist/tui/screens/use-overlays.js.map +1 -0
- package/dist/tui/screens/use-wizard-host.d.ts +46 -0
- package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
- package/dist/tui/screens/use-wizard-host.js +123 -0
- package/dist/tui/screens/use-wizard-host.js.map +1 -0
- package/dist/tui/screens/welcome.d.ts +12 -0
- package/dist/tui/screens/welcome.d.ts.map +1 -0
- package/dist/tui/screens/welcome.js +36 -0
- package/dist/tui/screens/welcome.js.map +1 -0
- package/dist/tui/status-segments.d.ts +37 -0
- package/dist/tui/status-segments.d.ts.map +1 -0
- package/dist/tui/status-segments.js +166 -0
- package/dist/tui/status-segments.js.map +1 -0
- package/dist/tui/text.d.ts +22 -7
- package/dist/tui/text.d.ts.map +1 -1
- package/dist/tui/text.js +110 -39
- package/dist/tui/text.js.map +1 -1
- package/dist/tui/theme.d.ts +2 -0
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +2 -0
- package/dist/tui/theme.js.map +1 -1
- package/dist/tui/token-rate.d.ts +83 -0
- package/dist/tui/token-rate.d.ts.map +1 -0
- package/dist/tui/token-rate.js +195 -0
- package/dist/tui/token-rate.js.map +1 -0
- package/dist/types.d.ts +7 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/user-content.d.ts +41 -0
- package/dist/user-content.d.ts.map +1 -0
- package/dist/user-content.js +37 -0
- package/dist/user-content.js.map +1 -0
- package/dist/version-compare.d.ts +37 -0
- package/dist/version-compare.d.ts.map +1 -0
- package/dist/version-compare.js +105 -0
- package/dist/version-compare.js.map +1 -0
- package/dist/version.js.map +1 -1
- package/package.json +7 -5
- package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
- package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
- package/dist/auto-migrate-confirm-plugin.js +0 -61
- package/dist/auto-migrate-confirm-plugin.js.map +0 -1
- package/dist/migration-service.d.ts +0 -15
- package/dist/migration-service.d.ts.map +0 -1
- package/dist/migration-service.js +0 -59
- package/dist/migration-service.js.map +0 -1
- package/dist/tui/screens/splash.d.ts +0 -5
- package/dist/tui/screens/splash.d.ts.map +0 -1
- package/dist/tui/screens/splash.js +0 -51
- package/dist/tui/screens/splash.js.map +0 -1
package/dist/mode.js
CHANGED
|
@@ -5,8 +5,15 @@
|
|
|
5
5
|
*
|
|
6
6
|
* | 模式 | 触发条件 | 面向对象 |
|
|
7
7
|
* |-------------|--------------------------------------------|------------------------|
|
|
8
|
-
* | 纯 stdio | 带位置参数,或 stdin/stdout 非 TTY |
|
|
9
|
-
* | TUI | 无参数且 stdin/stdout 均为 TTY
|
|
8
|
+
* | 纯 stdio | 带位置参数,或 stdin/stdout 非 TTY | 脚本、管道 |
|
|
9
|
+
* | TUI | 无参数且 stdin/stdout 均为 TTY;或 `--tui` | 人类用户 |
|
|
10
|
+
*
|
|
11
|
+
* `--new` 是 TUI 路径上的修饰项,不改变模式判定:它只表示「跳过续接、开一条新会话」。
|
|
12
|
+
* 出现在 stdio 路径上时被忽略(stdio 本就是一次性会话,不存在续接)。
|
|
13
|
+
*
|
|
14
|
+
* 注意:**shell 钩子不属于纯 stdio**。钩子的发起场景是「人坐在交互终端前敲错了命令」,
|
|
15
|
+
* 因此它走 `ai --tui --new "$@"` 进 TUI,并把原命令作为首条消息自动发送。
|
|
16
|
+
* (早期版本写成 `ai "$@"`,于是钩子会话被当成脚本调用落到管道模式——那是实现错误。)
|
|
10
17
|
*
|
|
11
18
|
* 本模块为纯函数与纯数据,不触碰 stdin/stdout、不 import chalk 等 UI 依赖,
|
|
12
19
|
* 便于单测(模式判定与路由是改造中风险最高的逻辑,必须被测覆盖)。
|
|
@@ -19,6 +26,8 @@ const HOOK_ACTIONS = new Set(["install", "uninstall"]);
|
|
|
19
26
|
* - 有位置参数 → stdio(脚本/管道优先,绝不进 TUI)
|
|
20
27
|
* - 无参数但 stdin 或 stdout 非 TTY → stdio(管道、重定向、CI)
|
|
21
28
|
* - 无参数且 stdin/stdout 均为 TTY → TUI
|
|
29
|
+
*
|
|
30
|
+
* `--tui` 不经过本函数:它是显式覆盖,在 `resolveInvocation()` 里优先处理。
|
|
22
31
|
*/
|
|
23
32
|
export function decideMode(tty, hasArgs) {
|
|
24
33
|
if (hasArgs)
|
|
@@ -38,6 +47,8 @@ export function resolveInvocation(argv, tty) {
|
|
|
38
47
|
let save = false;
|
|
39
48
|
let wantHelp = false;
|
|
40
49
|
let wantVersion = false;
|
|
50
|
+
let wantTui = false;
|
|
51
|
+
let wantNew = false;
|
|
41
52
|
let passthrough = false;
|
|
42
53
|
for (const arg of argv) {
|
|
43
54
|
if (passthrough) {
|
|
@@ -52,6 +63,14 @@ export function resolveInvocation(argv, tty) {
|
|
|
52
63
|
save = true;
|
|
53
64
|
continue;
|
|
54
65
|
}
|
|
66
|
+
if (arg === "--tui") {
|
|
67
|
+
wantTui = true;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (arg === "--new") {
|
|
71
|
+
wantNew = true;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
55
74
|
if (arg === "--help" || arg === "-h") {
|
|
56
75
|
wantHelp = true;
|
|
57
76
|
continue;
|
|
@@ -65,19 +84,35 @@ export function resolveInvocation(argv, tty) {
|
|
|
65
84
|
// 子命令短路(与运行模式无关的管理动作)
|
|
66
85
|
if (positional[0] === "hook") {
|
|
67
86
|
const action = positional[1];
|
|
68
|
-
|
|
69
|
-
kind: "hook",
|
|
70
|
-
|
|
71
|
-
|
|
87
|
+
if (action && HOOK_ACTIONS.has(action))
|
|
88
|
+
return { kind: "hook", action: action };
|
|
89
|
+
// 没给子动作(含 `ai hook --help`,`--help` 已被当选项吃掉):只是要看用法
|
|
90
|
+
if (action === undefined)
|
|
91
|
+
return { kind: "hook", action: "usage" };
|
|
92
|
+
return { kind: "hook", action: "usage", invalidAction: action };
|
|
72
93
|
}
|
|
73
94
|
if (wantHelp)
|
|
74
95
|
return { kind: "help" };
|
|
75
96
|
if (wantVersion)
|
|
76
97
|
return { kind: "version" };
|
|
98
|
+
// `ai help` / `ai version`:单词形式与 `--help` / `--version` 等价。
|
|
99
|
+
// 只在它是**唯一**参数时判定 —— `ai help me refactor this` 仍然是在提问。
|
|
100
|
+
if (positional.length === 1 && positional[0] === "help")
|
|
101
|
+
return { kind: "help" };
|
|
102
|
+
if (positional.length === 1 && positional[0] === "version")
|
|
103
|
+
return { kind: "version" };
|
|
77
104
|
const instruction = positional.join(" ").trim();
|
|
105
|
+
// 显式要求 TUI(shell 钩子走这条):参数不再是「脚本提问」,而是待发送的首条消息。
|
|
106
|
+
// 非 TTY 时宁可报错,也不能默默降级成 stdio—— 否则界面内容会写进管道。
|
|
107
|
+
if (wantTui) {
|
|
108
|
+
if (!tty.stdinIsTTY || !tty.stdoutIsTTY)
|
|
109
|
+
return { kind: "tui-rejected" };
|
|
110
|
+
return { kind: "tui", initialPrompt: instruction || undefined, newSession: wantNew || undefined };
|
|
111
|
+
}
|
|
78
112
|
const mode = decideMode(tty, positional.length > 0);
|
|
113
|
+
// `--new` 只在 TUI 路径有意义;走到 stdio(脚本 / 管道)时静默忽略
|
|
79
114
|
if (mode === "tui")
|
|
80
|
-
return { kind: "tui" };
|
|
115
|
+
return { kind: "tui", newSession: wantNew || undefined };
|
|
81
116
|
return { kind: "stdio", instruction, save };
|
|
82
117
|
}
|
|
83
118
|
//# sourceMappingURL=mode.js.map
|
package/dist/mode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../src/mode.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../src/mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型切换 —— `/model` 的写配置策略(纯逻辑,可单测)
|
|
3
|
+
*
|
|
4
|
+
* ## 唯一真相源
|
|
5
|
+
*
|
|
6
|
+
* 模型只写在 **`AgentDefinition.modelId`** 上:
|
|
7
|
+
*
|
|
8
|
+
* - 配置层没有 `defaultModel`(`AppConfig` 已无此字段);
|
|
9
|
+
* - 会话存档不记模型(`Conversation` 已无 `modelId`);
|
|
10
|
+
* - 运行期 `createAgent` 只读 `definition.modelId`,缺了直接报错。
|
|
11
|
+
*
|
|
12
|
+
* 于是「切换模型」只有一种写法和一种读法,不存在两层分歧导致的
|
|
13
|
+
* 「状态栏显示 A、实际请求发 B」。
|
|
14
|
+
*
|
|
15
|
+
* ## 切换即重置思考强度
|
|
16
|
+
*
|
|
17
|
+
* `AgentDefinition.modelParams` 里的思考参数(`thinking` / `reasoning_effort` 等)是
|
|
18
|
+
* **模型相关**的:DeepSeek 的 `off` 档是 `thinking: { type: "disabled" }`,而智谱 GLM-5.3
|
|
19
|
+
* 根本不接受关闭思考。把旧模型的档位带到新模型上,轻则无意义,重则直接报错。
|
|
20
|
+
*
|
|
21
|
+
* 所以换模型时**直接清空 `modelParams`**(不保留、不迁移、不逐键剔除),让 Agent
|
|
22
|
+
* 回到「不填思考强度」的状态,由目标模型自己的 `defaultParams` 决定。用户想调就
|
|
23
|
+
* 再用 `/think` 选一次。
|
|
24
|
+
*
|
|
25
|
+
* ## 注意
|
|
26
|
+
*
|
|
27
|
+
* **Agent 定义的其它字段不可丢**:SDK 初始化时只同步出厂提示词,
|
|
28
|
+
* 其余字段(权限、`custom` 等)以用户文件为准,因此写入是「读 → 改字段 → 写回」。
|
|
29
|
+
*/
|
|
30
|
+
import type { AgentDefinition } from "@ai-zen/agents-sdk";
|
|
31
|
+
export interface SwitchModelDeps {
|
|
32
|
+
/** 读 Agent 定义(默认:`~/.ai-zen/agents/<id>.json`) */
|
|
33
|
+
readAgent?: (agentId: string) => Promise<AgentDefinition | null>;
|
|
34
|
+
/** 写 Agent 定义 */
|
|
35
|
+
writeAgent?: (definition: AgentDefinition) => Promise<void>;
|
|
36
|
+
/** 当前时间(测试可固定) */
|
|
37
|
+
now?: Date;
|
|
38
|
+
}
|
|
39
|
+
export interface SwitchModelOptions extends SwitchModelDeps {
|
|
40
|
+
config: import("@ai-zen/agents-sdk").AppConfig;
|
|
41
|
+
/** 当前会话的 Agent(缺省视为 default) */
|
|
42
|
+
agentId?: string;
|
|
43
|
+
/** 目标模型 id */
|
|
44
|
+
modelId: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SwitchModelResult {
|
|
47
|
+
/** 面向用户的一句话结果 */
|
|
48
|
+
summary: string;
|
|
49
|
+
/** 变更后的 Agent 定义 */
|
|
50
|
+
definition: AgentDefinition;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 切换模型:把目标模型写进 Agent 定义的 `modelId`,并把思考强度重置为模型默认。
|
|
54
|
+
*
|
|
55
|
+
* 抛错场景:模型不存在、Agent 定义缺失。
|
|
56
|
+
*/
|
|
57
|
+
export declare function switchModel(options: SwitchModelOptions): Promise<SwitchModelResult>;
|
|
58
|
+
//# sourceMappingURL=model-switch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-switch.d.ts","sourceRoot":"","sources":["../src/model-switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACjE,iBAAiB;IACjB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,kBAAkB;IAClB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,MAAM,EAAE,OAAO,oBAAoB,EAAE,SAAS,CAAC;IAC/C,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4BzF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型切换 —— `/model` 的写配置策略(纯逻辑,可单测)
|
|
3
|
+
*
|
|
4
|
+
* ## 唯一真相源
|
|
5
|
+
*
|
|
6
|
+
* 模型只写在 **`AgentDefinition.modelId`** 上:
|
|
7
|
+
*
|
|
8
|
+
* - 配置层没有 `defaultModel`(`AppConfig` 已无此字段);
|
|
9
|
+
* - 会话存档不记模型(`Conversation` 已无 `modelId`);
|
|
10
|
+
* - 运行期 `createAgent` 只读 `definition.modelId`,缺了直接报错。
|
|
11
|
+
*
|
|
12
|
+
* 于是「切换模型」只有一种写法和一种读法,不存在两层分歧导致的
|
|
13
|
+
* 「状态栏显示 A、实际请求发 B」。
|
|
14
|
+
*
|
|
15
|
+
* ## 切换即重置思考强度
|
|
16
|
+
*
|
|
17
|
+
* `AgentDefinition.modelParams` 里的思考参数(`thinking` / `reasoning_effort` 等)是
|
|
18
|
+
* **模型相关**的:DeepSeek 的 `off` 档是 `thinking: { type: "disabled" }`,而智谱 GLM-5.3
|
|
19
|
+
* 根本不接受关闭思考。把旧模型的档位带到新模型上,轻则无意义,重则直接报错。
|
|
20
|
+
*
|
|
21
|
+
* 所以换模型时**直接清空 `modelParams`**(不保留、不迁移、不逐键剔除),让 Agent
|
|
22
|
+
* 回到「不填思考强度」的状态,由目标模型自己的 `defaultParams` 决定。用户想调就
|
|
23
|
+
* 再用 `/think` 选一次。
|
|
24
|
+
*
|
|
25
|
+
* ## 注意
|
|
26
|
+
*
|
|
27
|
+
* **Agent 定义的其它字段不可丢**:SDK 初始化时只同步出厂提示词,
|
|
28
|
+
* 其余字段(权限、`custom` 等)以用户文件为准,因此写入是「读 → 改字段 → 写回」。
|
|
29
|
+
*/
|
|
30
|
+
import { AgentRepository } from "@ai-zen/agents-sdk";
|
|
31
|
+
import { AGENTS_DIR } from "./config.js";
|
|
32
|
+
import { t } from "./i18n/index.js";
|
|
33
|
+
/**
|
|
34
|
+
* 切换模型:把目标模型写进 Agent 定义的 `modelId`,并把思考强度重置为模型默认。
|
|
35
|
+
*
|
|
36
|
+
* 抛错场景:模型不存在、Agent 定义缺失。
|
|
37
|
+
*/
|
|
38
|
+
export async function switchModel(options) {
|
|
39
|
+
const { config, modelId } = options;
|
|
40
|
+
const agentId = options.agentId || "default";
|
|
41
|
+
const now = options.now ?? new Date();
|
|
42
|
+
const model = (config.models ?? []).find((item) => item.id === modelId);
|
|
43
|
+
if (!model)
|
|
44
|
+
throw new Error(t("modelSwitch.err.modelMissing", { id: modelId }));
|
|
45
|
+
const readAgent = options.readAgent ?? ((id) => new AgentRepository(AGENTS_DIR).read(id));
|
|
46
|
+
const writeAgent = options.writeAgent ??
|
|
47
|
+
((definition) => new AgentRepository(AGENTS_DIR).write(definition));
|
|
48
|
+
const definition = await readAgent(agentId);
|
|
49
|
+
if (!definition)
|
|
50
|
+
throw new Error(t("modelSwitch.err.agentMissing", { id: agentId }));
|
|
51
|
+
const next = { ...definition, modelId, updatedAt: now.toISOString() };
|
|
52
|
+
// 换模型 = 重置思考强度:旧模型的档位参数对新模型可能非法(如 GLM-5.3 不接受
|
|
53
|
+
// `thinking.disabled`),所以直接清空,让目标模型走自己的 defaultParams。
|
|
54
|
+
delete next.modelParams;
|
|
55
|
+
await writeAgent(next);
|
|
56
|
+
const resetHint = definition.modelParams ? t("modelSwitch.resetHint") : "";
|
|
57
|
+
return {
|
|
58
|
+
summary: t("modelSwitch.summary", { name: model.name, id: model.id, agent: agentId, hint: resetHint }),
|
|
59
|
+
definition: next,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=model-switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-switch.js","sourceRoot":"","sources":["../src/model-switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AA0BpC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEtC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAEhF,MAAM,SAAS,GACb,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,UAAU,GACd,OAAO,CAAC,UAAU;QAClB,CAAC,CAAC,UAA2B,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvF,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAErF,MAAM,IAAI,GAAoB,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IACvF,8CAA8C;IAC9C,uDAAuD;IACvD,OAAO,IAAI,CAAC,WAAW,CAAC;IACxB,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACtG,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 思考档位(reasoning level)—— CLI 侧读写
|
|
3
|
+
*
|
|
4
|
+
* ## 三层,边界很硬
|
|
5
|
+
*
|
|
6
|
+
* - **协议差异在策略表**(`~/.ai-zen/reasoning-presets.json`):档位名 → 请求参数补丁,
|
|
7
|
+
* 由这张 CLI 自有的表声明,模型用 `reasoningPreset` 引用它。
|
|
8
|
+
* - **档位值存在 Agent 定义**(`AgentDefinition.modelParams`):**存的是展开后的参数**,
|
|
9
|
+
* 不是档位名。于是「配置即事实」——运行期 SDK 只做一次浅合并,不查表、不推导。
|
|
10
|
+
* - **本模块只管 UI 语义**:列可选档位、把参数反查成档位名、写回 Agent 定义。
|
|
11
|
+
*
|
|
12
|
+
* 代价(刻意接受):改了策略表**不会追溯**已配置的 Agent —— 它们存的是当时的参数。
|
|
13
|
+
* 这正是「配置即事实」的含义:表只是写配置那一刻的模板。
|
|
14
|
+
*/
|
|
15
|
+
import type { AgentDefinition, AppConfig, Model } from "@ai-zen/agents-sdk";
|
|
16
|
+
import { type ReasoningPreset, type ReasoningPresets } from "./reasoning-presets.js";
|
|
17
|
+
/**
|
|
18
|
+
* 已知档位名清单。
|
|
19
|
+
*
|
|
20
|
+
* 不设成穷举映射:档位名由策略表定义(用户可自建策略、自定档位名),
|
|
21
|
+
* 未收录的名字直接显示原文,比显示「?」有用得多。
|
|
22
|
+
* 文案本身在 i18n 词典的 `effort.<档位名>` 里(中 / 英各一份)。
|
|
23
|
+
*/
|
|
24
|
+
export declare const KNOWN_EFFORT_LEVELS: readonly string[];
|
|
25
|
+
/** 档位 → 显示文案(未收录的档位名原样显示) */
|
|
26
|
+
export declare function effortLabel(level: string): string;
|
|
27
|
+
/** 模型关联的策略 */
|
|
28
|
+
export declare function presetOf(model: Model | null | undefined, presets: ReasoningPresets): ReasoningPreset | undefined;
|
|
29
|
+
/** 模型可选档位(空数组 = 不可调档) */
|
|
30
|
+
export declare function effortChoices(model?: Model | null, presets?: ReasoningPresets | null): string[];
|
|
31
|
+
/** 一档都用不了的模型 */
|
|
32
|
+
export declare function isAdjustable(model?: Model | null, presets?: ReasoningPresets | null): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 生效中的模型参数 = 模型默认参数 + Agent 级覆盖(与 SDK 的合并语义一致,浅合并)。
|
|
35
|
+
*
|
|
36
|
+
* 注意这里复刻的是**同一份事实**,不是另一套推导:状态栏显示的就是真正会发给 API 的
|
|
37
|
+
* 那几个参数里匹配到的那一档。
|
|
38
|
+
*/
|
|
39
|
+
export declare function effectiveParams(model?: Model | null, definition?: Pick<AgentDefinition, "modelParams"> | null): Record<string, unknown>;
|
|
40
|
+
/**
|
|
41
|
+
* 状态栏文案。
|
|
42
|
+
*
|
|
43
|
+
* - 模型不可调档 → `—`
|
|
44
|
+
* - 生效参数命中某档 → 「低」「中」「高」…(按 `EFFORT_LABELS`)
|
|
45
|
+
* - 有 Agent 级覆盖但不匹配任何档位 → 「自定义」(用户手改过参数)
|
|
46
|
+
* - 没有任何声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂只开思考不指定档位)
|
|
47
|
+
*/
|
|
48
|
+
export declare function describeEffort(model?: Model | null, presets?: ReasoningPresets | null, definition?: Pick<AgentDefinition, "modelParams"> | null): string;
|
|
49
|
+
/**
|
|
50
|
+
* 状态栏用的思考强度视图:文案 + 是否置灰。
|
|
51
|
+
*
|
|
52
|
+
* 合成一个对象返回,是为了让调用方**一次取全**——分成两个函数调用容易出现
|
|
53
|
+
* 「文案更新了、置灰没跟上」这种漂移。
|
|
54
|
+
*/
|
|
55
|
+
export declare function describeEffortView(model?: Model | null, presets?: ReasoningPresets | null, definition?: Pick<AgentDefinition, "modelParams"> | null): {
|
|
56
|
+
text: string;
|
|
57
|
+
dimmed: boolean;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* 状态栏里思考强度是否该置灰 —— **不靠文案判断**。
|
|
61
|
+
*
|
|
62
|
+
* 旧实现是 `effort === "关" || effort === "—"`,而那两个字本身就是显示文案:
|
|
63
|
+
* 一切语言,判断就失效(英文界面下 `"off"` 永远不等于 `"关"`)。
|
|
64
|
+
* 这里改成基于档位值的语义判断:不可调档,或档位是 off / none。
|
|
65
|
+
*/
|
|
66
|
+
export declare function effortDimmed(model?: Model | null, presets?: ReasoningPresets | null, definition?: Pick<AgentDefinition, "modelParams"> | null): boolean;
|
|
67
|
+
export interface SetAgentEffortOptions {
|
|
68
|
+
config: AppConfig;
|
|
69
|
+
/** 思考策略表(`readReasoningPresets()` 的结果) */
|
|
70
|
+
presets: ReasoningPresets;
|
|
71
|
+
/** 目标 Agent(缺省 default) */
|
|
72
|
+
agentId?: string;
|
|
73
|
+
/** 目标档位;`null` 表示清除思考参数、恢复跟随模型默认 */
|
|
74
|
+
effort: string | null;
|
|
75
|
+
/** 注入用(测试) */
|
|
76
|
+
readAgent?: (agentId: string) => Promise<AgentDefinition | null>;
|
|
77
|
+
writeAgent?: (definition: AgentDefinition) => Promise<void>;
|
|
78
|
+
now?: Date;
|
|
79
|
+
}
|
|
80
|
+
export interface SetAgentEffortResult {
|
|
81
|
+
definition: AgentDefinition;
|
|
82
|
+
/** 生效模型 */
|
|
83
|
+
model: Model;
|
|
84
|
+
summary: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 设置某 Agent 的思考档位:查表拿补丁 → 写进 `definition.modelParams`。
|
|
88
|
+
*
|
|
89
|
+
* 写入前先剔除「整张表出现过的键」,所以 `max` → `off` 不会残留上一档的
|
|
90
|
+
* `reasoning_effort`;`effort: null` 就是剔除后若为空则删掉整个 `modelParams`。
|
|
91
|
+
*
|
|
92
|
+
* 抛错场景:Agent 不存在、未绑定可用模型、模型未关联策略、策略里没有该档位。
|
|
93
|
+
* 这些都属于「用户明确要求了一件做不到的事」,宁可报错也不要静默降级。
|
|
94
|
+
*/
|
|
95
|
+
export declare function setAgentEffort(options: SetAgentEffortOptions): Promise<SetAgentEffortResult>;
|
|
96
|
+
//# sourceMappingURL=reasoning-effort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 思考档位(reasoning level)—— CLI 侧读写
|
|
3
|
+
*
|
|
4
|
+
* ## 三层,边界很硬
|
|
5
|
+
*
|
|
6
|
+
* - **协议差异在策略表**(`~/.ai-zen/reasoning-presets.json`):档位名 → 请求参数补丁,
|
|
7
|
+
* 由这张 CLI 自有的表声明,模型用 `reasoningPreset` 引用它。
|
|
8
|
+
* - **档位值存在 Agent 定义**(`AgentDefinition.modelParams`):**存的是展开后的参数**,
|
|
9
|
+
* 不是档位名。于是「配置即事实」——运行期 SDK 只做一次浅合并,不查表、不推导。
|
|
10
|
+
* - **本模块只管 UI 语义**:列可选档位、把参数反查成档位名、写回 Agent 定义。
|
|
11
|
+
*
|
|
12
|
+
* 代价(刻意接受):改了策略表**不会追溯**已配置的 Agent —— 它们存的是当时的参数。
|
|
13
|
+
* 这正是「配置即事实」的含义:表只是写配置那一刻的模板。
|
|
14
|
+
*/
|
|
15
|
+
import { AgentRepository } from "@ai-zen/agents-sdk";
|
|
16
|
+
import { AGENTS_DIR } from "./config.js";
|
|
17
|
+
import { t } from "./i18n/index.js";
|
|
18
|
+
import { levelsOf, matchLevel, ownedKeys, patchOf, presetFor, } from "./reasoning-presets.js";
|
|
19
|
+
/**
|
|
20
|
+
* 已知档位名清单。
|
|
21
|
+
*
|
|
22
|
+
* 不设成穷举映射:档位名由策略表定义(用户可自建策略、自定档位名),
|
|
23
|
+
* 未收录的名字直接显示原文,比显示「?」有用得多。
|
|
24
|
+
* 文案本身在 i18n 词典的 `effort.<档位名>` 里(中 / 英各一份)。
|
|
25
|
+
*/
|
|
26
|
+
export const KNOWN_EFFORT_LEVELS = [
|
|
27
|
+
"off",
|
|
28
|
+
"none",
|
|
29
|
+
"minimal",
|
|
30
|
+
"low",
|
|
31
|
+
"medium",
|
|
32
|
+
"high",
|
|
33
|
+
"xhigh",
|
|
34
|
+
"max",
|
|
35
|
+
];
|
|
36
|
+
/** 档位 → 显示文案(未收录的档位名原样显示) */
|
|
37
|
+
export function effortLabel(level) {
|
|
38
|
+
return KNOWN_EFFORT_LEVELS.includes(level) ? t(`effort.${level}`) : level;
|
|
39
|
+
}
|
|
40
|
+
/** 模型关联的策略 */
|
|
41
|
+
export function presetOf(model, presets) {
|
|
42
|
+
return presetFor(model?.id, model?.reasoningPreset, presets);
|
|
43
|
+
}
|
|
44
|
+
/** 模型可选档位(空数组 = 不可调档) */
|
|
45
|
+
export function effortChoices(model, presets) {
|
|
46
|
+
if (!presets)
|
|
47
|
+
return [];
|
|
48
|
+
return levelsOf(presetOf(model, presets));
|
|
49
|
+
}
|
|
50
|
+
/** 一档都用不了的模型 */
|
|
51
|
+
export function isAdjustable(model, presets) {
|
|
52
|
+
return effortChoices(model, presets).length > 0;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 生效中的模型参数 = 模型默认参数 + Agent 级覆盖(与 SDK 的合并语义一致,浅合并)。
|
|
56
|
+
*
|
|
57
|
+
* 注意这里复刻的是**同一份事实**,不是另一套推导:状态栏显示的就是真正会发给 API 的
|
|
58
|
+
* 那几个参数里匹配到的那一档。
|
|
59
|
+
*/
|
|
60
|
+
export function effectiveParams(model, definition) {
|
|
61
|
+
return { ...(model?.defaultParams ?? {}), ...(definition?.modelParams ?? {}) };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 状态栏文案。
|
|
65
|
+
*
|
|
66
|
+
* - 模型不可调档 → `—`
|
|
67
|
+
* - 生效参数命中某档 → 「低」「中」「高」…(按 `EFFORT_LABELS`)
|
|
68
|
+
* - 有 Agent 级覆盖但不匹配任何档位 → 「自定义」(用户手改过参数)
|
|
69
|
+
* - 没有任何声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂只开思考不指定档位)
|
|
70
|
+
*/
|
|
71
|
+
export function describeEffort(model, presets, definition) {
|
|
72
|
+
if (!presets || !isAdjustable(model, presets))
|
|
73
|
+
return t("effort.unsupported");
|
|
74
|
+
const params = effectiveParams(model, definition);
|
|
75
|
+
const matched = matchLevel(presetOf(model, presets), params);
|
|
76
|
+
if (matched)
|
|
77
|
+
return effortLabel(matched);
|
|
78
|
+
return definition?.modelParams && Object.keys(definition.modelParams).length > 0
|
|
79
|
+
? t("effort.custom")
|
|
80
|
+
: t("effort.default");
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 状态栏用的思考强度视图:文案 + 是否置灰。
|
|
84
|
+
*
|
|
85
|
+
* 合成一个对象返回,是为了让调用方**一次取全**——分成两个函数调用容易出现
|
|
86
|
+
* 「文案更新了、置灰没跟上」这种漂移。
|
|
87
|
+
*/
|
|
88
|
+
export function describeEffortView(model, presets, definition) {
|
|
89
|
+
return {
|
|
90
|
+
text: describeEffort(model, presets, definition),
|
|
91
|
+
dimmed: effortDimmed(model, presets, definition),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 状态栏里思考强度是否该置灰 —— **不靠文案判断**。
|
|
96
|
+
*
|
|
97
|
+
* 旧实现是 `effort === "关" || effort === "—"`,而那两个字本身就是显示文案:
|
|
98
|
+
* 一切语言,判断就失效(英文界面下 `"off"` 永远不等于 `"关"`)。
|
|
99
|
+
* 这里改成基于档位值的语义判断:不可调档,或档位是 off / none。
|
|
100
|
+
*/
|
|
101
|
+
export function effortDimmed(model, presets, definition) {
|
|
102
|
+
if (!presets || !isAdjustable(model, presets))
|
|
103
|
+
return true;
|
|
104
|
+
const level = matchLevel(presetOf(model, presets), effectiveParams(model, definition));
|
|
105
|
+
return level === "off" || level === "none";
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 设置某 Agent 的思考档位:查表拿补丁 → 写进 `definition.modelParams`。
|
|
109
|
+
*
|
|
110
|
+
* 写入前先剔除「整张表出现过的键」,所以 `max` → `off` 不会残留上一档的
|
|
111
|
+
* `reasoning_effort`;`effort: null` 就是剔除后若为空则删掉整个 `modelParams`。
|
|
112
|
+
*
|
|
113
|
+
* 抛错场景:Agent 不存在、未绑定可用模型、模型未关联策略、策略里没有该档位。
|
|
114
|
+
* 这些都属于「用户明确要求了一件做不到的事」,宁可报错也不要静默降级。
|
|
115
|
+
*/
|
|
116
|
+
export async function setAgentEffort(options) {
|
|
117
|
+
const { config, presets, effort } = options;
|
|
118
|
+
const agentId = options.agentId || "default";
|
|
119
|
+
const now = options.now ?? new Date();
|
|
120
|
+
const readAgent = options.readAgent ?? ((id) => new AgentRepository(AGENTS_DIR).read(id));
|
|
121
|
+
const writeAgent = options.writeAgent ??
|
|
122
|
+
((definition) => new AgentRepository(AGENTS_DIR).write(definition));
|
|
123
|
+
const definition = await readAgent(agentId);
|
|
124
|
+
if (!definition)
|
|
125
|
+
throw new Error(t("effort.err.agentMissing", { id: agentId }));
|
|
126
|
+
const modelId = definition.modelId;
|
|
127
|
+
if (!modelId) {
|
|
128
|
+
throw new Error(t("effort.err.noModel", { id: agentId }));
|
|
129
|
+
}
|
|
130
|
+
const model = (config.models ?? []).find((item) => item.id === modelId);
|
|
131
|
+
if (!model)
|
|
132
|
+
throw new Error(t("effort.err.modelMissing", { id: modelId }));
|
|
133
|
+
const preset = presetOf(model, presets);
|
|
134
|
+
const allowed = levelsOf(preset);
|
|
135
|
+
if (allowed.length === 0) {
|
|
136
|
+
throw new Error(t("effort.err.noPreset", { id: model.id }));
|
|
137
|
+
}
|
|
138
|
+
const patch = effort === null ? undefined : patchOf(preset, effort);
|
|
139
|
+
if (effort !== null && !patch) {
|
|
140
|
+
throw new Error(t("effort.err.unknownLevel", { preset: model.reasoningPreset ?? "", level: effort, options: allowed.join(" / ") }));
|
|
141
|
+
}
|
|
142
|
+
// 先剔除思考相关键,再合并新补丁(`null` 即只剔除)
|
|
143
|
+
const owned = ownedKeys(presets);
|
|
144
|
+
const params = {};
|
|
145
|
+
for (const [key, value] of Object.entries(definition.modelParams ?? {})) {
|
|
146
|
+
if (!owned.has(key))
|
|
147
|
+
params[key] = value;
|
|
148
|
+
}
|
|
149
|
+
if (patch)
|
|
150
|
+
Object.assign(params, patch);
|
|
151
|
+
const next = { ...definition, updatedAt: now.toISOString() };
|
|
152
|
+
if (Object.keys(params).length > 0)
|
|
153
|
+
next.modelParams = params;
|
|
154
|
+
else
|
|
155
|
+
delete next.modelParams;
|
|
156
|
+
await writeAgent(next);
|
|
157
|
+
const label = effort === null ? t("effort.followDefault") : t("effort.quoted", { label: effortLabel(effort) });
|
|
158
|
+
return {
|
|
159
|
+
definition: next,
|
|
160
|
+
model,
|
|
161
|
+
summary: t("effort.summary", { label, id: agentId, model: model.id }),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=reasoning-effort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 思考预设 —— CLI 侧的表操作(纯函数)
|
|
3
|
+
*
|
|
4
|
+
* 表的**定义、出厂内容、读写**都在 SDK(`@ai-zen/agents-sdk` 的 `ReasoningPresets` /
|
|
5
|
+
* `FACTORY_REASONING_PRESETS` / `ConfigManager.readReasoningPresets()`),因为桌面端等
|
|
6
|
+
* 其它客户端也要用同一套档位知识。
|
|
7
|
+
*
|
|
8
|
+
* 本模块只负责「**利用**这张表」:CLI 用它限制 `/think` 的可选档位、把选中的档位展开成
|
|
9
|
+
* 请求参数写进 `AgentDefinition.modelParams`、以及把现有参数反查成档位名做展示。
|
|
10
|
+
*
|
|
11
|
+
* 全部是纯函数、不碰文件——SDK 不替我们决定这些,客户端自己掌握「怎么用表」。
|
|
12
|
+
*/
|
|
13
|
+
import type { ReasoningPreset, ReasoningPresets } from "@ai-zen/agents-sdk";
|
|
14
|
+
export type { ReasoningPatch, ReasoningPreset, ReasoningPresets } from "@ai-zen/agents-sdk";
|
|
15
|
+
/** 模型关联的策略(未声明 `reasoningPreset` 或名字不存在 → `undefined`) */
|
|
16
|
+
export declare function presetFor(modelId: string | undefined, presetName: string | undefined, presets: ReasoningPresets): ReasoningPreset | undefined;
|
|
17
|
+
/** 某策略的全部档位(= `levels` 的键,顺序即声明顺序) */
|
|
18
|
+
export declare function levelsOf(preset: ReasoningPreset | undefined): string[];
|
|
19
|
+
/** 某策略某档的参数补丁 */
|
|
20
|
+
export declare function patchOf(preset: ReasoningPreset | undefined, level: string): Record<string, unknown> | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* 整张表出现过的参数键。
|
|
23
|
+
*
|
|
24
|
+
* 换档时按此剔除旧值 —— 这样 `max` → `off` 不会残留上一个档位的 `reasoning_effort`,
|
|
25
|
+
* 而「哪些键属于思考」由表自己声明,代码零硬编码。「表里没有的键」一律当普通参数保留。
|
|
26
|
+
*/
|
|
27
|
+
export declare function ownedKeys(presets: ReasoningPresets): Set<string>;
|
|
28
|
+
/**
|
|
29
|
+
* 反查:现有参数命中哪个档位(多张补丁同时命中取最具体的)。
|
|
30
|
+
*
|
|
31
|
+
* 纯展示用途 —— 状态栏要显示「当前是第几档」。命中不了返回 `undefined`。
|
|
32
|
+
*/
|
|
33
|
+
export declare function matchLevel(preset: ReasoningPreset | undefined, params: Record<string, unknown> | undefined | null): string | undefined;
|
|
34
|
+
//# sourceMappingURL=reasoning-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-presets.d.ts","sourceRoot":"","sources":["../src/reasoning-presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAQ5F,0DAA0D;AAC1D,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,gBAAgB,GACxB,eAAe,GAAG,SAAS,CAG7B;AAED,sCAAsC;AACtC,wBAAgB,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,EAAE,CAEtE;AAED,iBAAiB;AACjB,wBAAgB,OAAO,CACrB,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAErC;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,CAQhE;AAgBD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GACjD,MAAM,GAAG,SAAS,CAYpB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 思考预设 —— CLI 侧的表操作(纯函数)
|
|
3
|
+
*
|
|
4
|
+
* 表的**定义、出厂内容、读写**都在 SDK(`@ai-zen/agents-sdk` 的 `ReasoningPresets` /
|
|
5
|
+
* `FACTORY_REASONING_PRESETS` / `ConfigManager.readReasoningPresets()`),因为桌面端等
|
|
6
|
+
* 其它客户端也要用同一套档位知识。
|
|
7
|
+
*
|
|
8
|
+
* 本模块只负责「**利用**这张表」:CLI 用它限制 `/think` 的可选档位、把选中的档位展开成
|
|
9
|
+
* 请求参数写进 `AgentDefinition.modelParams`、以及把现有参数反查成档位名做展示。
|
|
10
|
+
*
|
|
11
|
+
* 全部是纯函数、不碰文件——SDK 不替我们决定这些,客户端自己掌握「怎么用表」。
|
|
12
|
+
*/
|
|
13
|
+
/** 安全取自有属性(策略名来自用户配置,可能是 `constructor` / `__proto__`) */
|
|
14
|
+
function own(bag, key) {
|
|
15
|
+
if (!bag || !Object.prototype.hasOwnProperty.call(bag, key))
|
|
16
|
+
return undefined;
|
|
17
|
+
return bag[key];
|
|
18
|
+
}
|
|
19
|
+
/** 模型关联的策略(未声明 `reasoningPreset` 或名字不存在 → `undefined`) */
|
|
20
|
+
export function presetFor(modelId, presetName, presets) {
|
|
21
|
+
if (!modelId || !presetName)
|
|
22
|
+
return undefined;
|
|
23
|
+
return own(presets, presetName);
|
|
24
|
+
}
|
|
25
|
+
/** 某策略的全部档位(= `levels` 的键,顺序即声明顺序) */
|
|
26
|
+
export function levelsOf(preset) {
|
|
27
|
+
return preset ? Object.keys(preset.levels ?? {}) : [];
|
|
28
|
+
}
|
|
29
|
+
/** 某策略某档的参数补丁 */
|
|
30
|
+
export function patchOf(preset, level) {
|
|
31
|
+
return own(preset?.levels, level);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 整张表出现过的参数键。
|
|
35
|
+
*
|
|
36
|
+
* 换档时按此剔除旧值 —— 这样 `max` → `off` 不会残留上一个档位的 `reasoning_effort`,
|
|
37
|
+
* 而「哪些键属于思考」由表自己声明,代码零硬编码。「表里没有的键」一律当普通参数保留。
|
|
38
|
+
*/
|
|
39
|
+
export function ownedKeys(presets) {
|
|
40
|
+
const keys = new Set();
|
|
41
|
+
for (const preset of Object.values(presets ?? {})) {
|
|
42
|
+
for (const patch of Object.values(preset?.levels ?? {})) {
|
|
43
|
+
for (const key of Object.keys(patch ?? {}))
|
|
44
|
+
keys.add(key);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return keys;
|
|
48
|
+
}
|
|
49
|
+
/** 结构化相等 —— 补丁是纯 JSON,逐层比对即可 */
|
|
50
|
+
function sameValue(a, b) {
|
|
51
|
+
if (a === b)
|
|
52
|
+
return true;
|
|
53
|
+
if (typeof a !== "object" || typeof b !== "object" || a === null || b === null)
|
|
54
|
+
return false;
|
|
55
|
+
if (Array.isArray(a) !== Array.isArray(b))
|
|
56
|
+
return false;
|
|
57
|
+
const left = a;
|
|
58
|
+
const right = b;
|
|
59
|
+
const leftKeys = Object.keys(left);
|
|
60
|
+
if (leftKeys.length !== Object.keys(right).length)
|
|
61
|
+
return false;
|
|
62
|
+
return leftKeys.every((k) => Object.prototype.hasOwnProperty.call(right, k) && sameValue(left[k], right[k]));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 反查:现有参数命中哪个档位(多张补丁同时命中取最具体的)。
|
|
66
|
+
*
|
|
67
|
+
* 纯展示用途 —— 状态栏要显示「当前是第几档」。命中不了返回 `undefined`。
|
|
68
|
+
*/
|
|
69
|
+
export function matchLevel(preset, params) {
|
|
70
|
+
if (!preset || !params)
|
|
71
|
+
return undefined;
|
|
72
|
+
let best;
|
|
73
|
+
let bestSize = 0;
|
|
74
|
+
for (const [level, patch] of Object.entries(preset.levels ?? {})) {
|
|
75
|
+
const keys = Object.keys(patch ?? {});
|
|
76
|
+
if (keys.length === 0 || keys.length <= bestSize)
|
|
77
|
+
continue;
|
|
78
|
+
if (!keys.every((k) => sameValue(params[k], patch[k])))
|
|
79
|
+
continue;
|
|
80
|
+
best = level;
|
|
81
|
+
bestSize = keys.length;
|
|
82
|
+
}
|
|
83
|
+
return best;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=reasoning-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-presets.js","sourceRoot":"","sources":["../src/reasoning-presets.ts"],"names":[],"mappings":"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"}
|