@ai-zen/cli 1.0.0-alpha.20 → 1.0.0-alpha.22
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 +158 -0
- package/README.md +43 -17
- package/README.zh.md +43 -17
- package/dist/agent-creator.d.ts.map +1 -1
- package/dist/agent-creator.js +32 -10
- 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 +6 -1
- package/dist/agents-store.js.map +1 -1
- package/dist/auto-migrate-confirm.d.ts.map +1 -1
- package/dist/auto-migrate-confirm.js +2 -1
- package/dist/auto-migrate-confirm.js.map +1 -1
- package/dist/config-editor.d.ts +9 -1
- package/dist/config-editor.d.ts.map +1 -1
- package/dist/config-editor.js +30 -19
- package/dist/config-editor.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -13
- package/dist/config.js.map +1 -1
- package/dist/conversation-commands/registry.d.ts +123 -4
- package/dist/conversation-commands/registry.d.ts.map +1 -1
- package/dist/conversation-commands/registry.js +92 -17
- package/dist/conversation-commands/registry.js.map +1 -1
- package/dist/conversation-persist-plugin.d.ts.map +1 -1
- package/dist/conversation-persist-plugin.js +6 -14
- package/dist/conversation-persist-plugin.js.map +1 -1
- package/dist/conversation-repository.d.ts +68 -14
- package/dist/conversation-repository.d.ts.map +1 -1
- package/dist/conversation-repository.js +81 -23
- package/dist/conversation-repository.js.map +1 -1
- package/dist/cwd-tracker-plugin.d.ts.map +1 -1
- package/dist/cwd-tracker-plugin.js +6 -2
- 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.map +1 -1
- package/dist/handoff-service.js +22 -19
- package/dist/handoff-service.js.map +1 -1
- 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 +290 -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 +224 -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 +34 -0
- package/dist/i18n/preferences.d.ts.map +1 -0
- package/dist/i18n/preferences.js +69 -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 +293 -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 +228 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/index.js +41 -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.map +1 -1
- package/dist/model-switch.js +5 -4
- package/dist/model-switch.js.map +1 -1
- package/dist/reasoning-effort.d.ts +23 -4
- package/dist/reasoning-effort.d.ts.map +1 -1
- package/dist/reasoning-effort.js +51 -24
- package/dist/reasoning-effort.js.map +1 -1
- package/dist/sdk-log.d.ts +23 -16
- package/dist/sdk-log.d.ts.map +1 -1
- package/dist/sdk-log.js +43 -19
- package/dist/sdk-log.js.map +1 -1
- package/dist/stdio-runner.d.ts.map +1 -1
- package/dist/stdio-runner.js +19 -19
- package/dist/stdio-runner.js.map +1 -1
- package/dist/tui/chat-session.d.ts +27 -0
- package/dist/tui/chat-session.d.ts.map +1 -1
- package/dist/tui/chat-session.js +120 -28
- package/dist/tui/chat-session.js.map +1 -1
- package/dist/tui/components.d.ts +43 -2
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +97 -4
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/config-wizard/detail.d.ts +12 -6
- package/dist/tui/config-wizard/detail.d.ts.map +1 -1
- package/dist/tui/config-wizard/detail.js +33 -32
- package/dist/tui/config-wizard/detail.js.map +1 -1
- package/dist/tui/config-wizard/engine.d.ts.map +1 -1
- package/dist/tui/config-wizard/engine.js +26 -20
- package/dist/tui/config-wizard/engine.js.map +1 -1
- package/dist/tui/config-wizard/fields.d.ts.map +1 -1
- package/dist/tui/config-wizard/fields.js +176 -164
- package/dist/tui/config-wizard/fields.js.map +1 -1
- package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/kv-editor.js +9 -5
- package/dist/tui/config-wizard/kv-editor.js.map +1 -1
- package/dist/tui/config-wizard/list.d.ts.map +1 -1
- package/dist/tui/config-wizard/list.js +2 -1
- 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 +32 -19
- package/dist/tui/config-wizard/menu.js.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.js +4 -3
- 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 +29 -20
- 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 +21 -17
- 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 +16 -6
- 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 +17 -19
- 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 +41 -26
- 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/index.d.ts +17 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +25 -14
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/input-editing.d.ts +4 -1
- package/dist/tui/input-editing.d.ts.map +1 -1
- package/dist/tui/input-editing.js +7 -3
- package/dist/tui/input-editing.js.map +1 -1
- 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/chat-commands.d.ts +54 -3
- package/dist/tui/screens/chat-commands.d.ts.map +1 -1
- package/dist/tui/screens/chat-commands.js +469 -330
- package/dist/tui/screens/chat-commands.js.map +1 -1
- package/dist/tui/screens/chat.d.ts +8 -0
- package/dist/tui/screens/chat.d.ts.map +1 -1
- package/dist/tui/screens/chat.js +206 -405
- 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/handoff-choice.d.ts.map +1 -1
- package/dist/tui/screens/handoff-choice.js +4 -3
- package/dist/tui/screens/handoff-choice.js.map +1 -1
- package/dist/tui/screens/index.d.ts +1 -1
- package/dist/tui/screens/index.d.ts.map +1 -1
- package/dist/tui/screens/index.js +1 -1
- 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 +11 -1
- package/dist/tui/screens/input.d.ts.map +1 -1
- package/dist/tui/screens/input.js +21 -12
- package/dist/tui/screens/input.js.map +1 -1
- package/dist/tui/screens/layout.d.ts +8 -0
- package/dist/tui/screens/layout.d.ts.map +1 -1
- package/dist/tui/screens/layout.js +6 -2
- package/dist/tui/screens/layout.js.map +1 -1
- 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.map +1 -1
- package/dist/tui/screens/messages-view.js +5 -4
- 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 +15 -0
- package/dist/tui/screens/notice-bar.js.map +1 -0
- package/dist/tui/screens/notice.d.ts +40 -8
- 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 +3 -2
- package/dist/tui/screens/overlays.js.map +1 -1
- package/dist/tui/screens/splash.d.ts +1 -1
- package/dist/tui/screens/splash.d.ts.map +1 -1
- package/dist/tui/screens/splash.js +5 -2
- package/dist/tui/screens/splash.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 +44 -0
- package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
- package/dist/tui/screens/use-input-editing.js +192 -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 +35 -0
- package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
- package/dist/tui/screens/use-wizard-host.js +103 -0
- package/dist/tui/screens/use-wizard-host.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 +8 -5
- package/dist/tui/text.d.ts.map +1 -1
- package/dist/tui/text.js +95 -35
- package/dist/tui/text.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 +0 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -3
package/dist/i18n/zh.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 中文词条(默认兜底语言之外的另一半)。
|
|
3
|
+
*
|
|
4
|
+
* 约定:
|
|
5
|
+
* - 扁平 key,`域.语义` 分组;
|
|
6
|
+
* - `{name}` 为插值占位;
|
|
7
|
+
* - `\u00a0`(不换行空格)用于把「数字 + 单位」绑成一格,窄屏折行时不会被拆开;
|
|
8
|
+
*/
|
|
9
|
+
export const zh = {
|
|
10
|
+
// ---------- 输入行 ----------
|
|
11
|
+
"input.placeholder": "输入消息,/ 查看命令…",
|
|
12
|
+
"input.hint.ready": "Enter 发送 · Ctrl+J 换行 · / 命令 · PgUp 看历史",
|
|
13
|
+
"input.hint.scrolling": "↕ 滚动中 · PgUp/PgDn 翻页 · 发送回到底部",
|
|
14
|
+
"input.hint.initializing": "初始化中…",
|
|
15
|
+
// ---------- 状态栏 ----------
|
|
16
|
+
"status.agent": " · agent ",
|
|
17
|
+
"status.effort": " · 思考 ",
|
|
18
|
+
"status.lastTokens": "本轮\u00a0{n}\u00a0tok",
|
|
19
|
+
"status.totalTokens": "累计\u00a0{n}\u00a0tok",
|
|
20
|
+
"status.avgRate": "⚡\u00a0均\u00a0{rate}",
|
|
21
|
+
// ---------- 思考档位 ----------
|
|
22
|
+
"effort.off": "关",
|
|
23
|
+
"effort.none": "关",
|
|
24
|
+
"effort.minimal": "极低",
|
|
25
|
+
"effort.low": "低",
|
|
26
|
+
"effort.medium": "中",
|
|
27
|
+
"effort.high": "高",
|
|
28
|
+
"effort.xhigh": "极高",
|
|
29
|
+
"effort.max": "最高",
|
|
30
|
+
"effort.custom": "自定义",
|
|
31
|
+
"effort.default": "默认",
|
|
32
|
+
"effort.unsupported": "—",
|
|
33
|
+
// ---------- 生成阶段(消息栏 spinner;六态见 `tui/phase.ts`) ----------
|
|
34
|
+
"phase.working": "处理中…",
|
|
35
|
+
"phase.connecting": "连接中…",
|
|
36
|
+
"phase.queued": "排队中…",
|
|
37
|
+
"phase.thinking": "思考中…",
|
|
38
|
+
"phase.toolCalling": "调用工具…",
|
|
39
|
+
"phase.toolCallingWith": "调用工具 {name}…",
|
|
40
|
+
"phase.toolWaiting": "等待工具返回…",
|
|
41
|
+
"phase.toolWaitingWith": "等待 {name} 返回…",
|
|
42
|
+
"phase.streaming": "输出中…",
|
|
43
|
+
// ---------- 通知 ----------
|
|
44
|
+
"notice.reloaded": "已按新配置重建会话(消息与上下文保留)",
|
|
45
|
+
"notice.draftSaved": "已暂存输入(Ctrl+S 恢复)",
|
|
46
|
+
"notice.draftRestored": "已恢复暂存的输入",
|
|
47
|
+
"notice.pasteImageUnsupported": "暂不支持粘贴图片(Ctrl+V 预留给图片粘贴,当前未实现)",
|
|
48
|
+
"notice.inputCleared": "已清空输入 · 再按一次 Ctrl+C 退出",
|
|
49
|
+
"notice.pressCtrlDAgain": "再按一次 Ctrl+D 退出",
|
|
50
|
+
"notice.languageChanged": "界面语言已切换为中文",
|
|
51
|
+
// ---------- 命令说明(/help 与斜杠菜单) ----------
|
|
52
|
+
"cmd.save.desc": "保存对话",
|
|
53
|
+
"cmd.load.desc": "加载对话(替换当前会话)",
|
|
54
|
+
"cmd.new.desc": "重置会话(清空历史)",
|
|
55
|
+
"cmd.back.desc": "撤回上一条(可修改重发)",
|
|
56
|
+
"cmd.editor.desc": "用外部编辑器写长消息",
|
|
57
|
+
"cmd.clear.desc": "清屏",
|
|
58
|
+
"cmd.config.desc": "打开配置中心(模型 / 端点)",
|
|
59
|
+
"cmd.model.desc": "切换模型(写入配置)",
|
|
60
|
+
"cmd.agent.desc": "切换主 Agent(重建会话)",
|
|
61
|
+
"cmd.reload.desc": "刷新运行环境(重新发现工具 / MCP)",
|
|
62
|
+
"cmd.mcp.desc": "管理 MCP 服务器(增删改 / 启停)",
|
|
63
|
+
"cmd.lang.desc": "切换界面语言",
|
|
64
|
+
"cmd.think.desc": "切换思考强度",
|
|
65
|
+
"cmd.key.desc": "设置端点 API Key",
|
|
66
|
+
"cmd.handoff.desc": "生成交接文档(不切换会话)",
|
|
67
|
+
"cmd.migrate.desc": "交接并开启新会话",
|
|
68
|
+
"cmd.help.desc": "显示帮助",
|
|
69
|
+
"cmd.exit.desc": "退出对话(提示保存)",
|
|
70
|
+
// ---------- 命令交互文案(通知 / 选择器) ----------
|
|
71
|
+
"common.current": "(当前)",
|
|
72
|
+
"cmd.model.noModels": "配置里还没有任何模型,请用 /config 添加端点与模型",
|
|
73
|
+
"cmd.model.title": "切换模型(会写入配置)",
|
|
74
|
+
"cmd.model.cancelled": "已取消切换模型",
|
|
75
|
+
"cmd.agent.noAgents": "还没有任何主 Agent,请用 /config 创建",
|
|
76
|
+
"cmd.agent.unavailable": " · 不可用",
|
|
77
|
+
"cmd.agent.title": "切换主 Agent(会写入默认 Agent)",
|
|
78
|
+
"cmd.agent.cancelled": "已取消切换主 Agent",
|
|
79
|
+
"cmd.reload.done": "已刷新运行环境:配置 / 工具 / Skill / MCP 已重新发现(消息与上下文保留)",
|
|
80
|
+
"cmd.think.followDefault": "跟随模型默认",
|
|
81
|
+
"cmd.think.clearHint": "删除 Agent 上的思考参数",
|
|
82
|
+
"cmd.think.cancelled": "已取消切换思考强度",
|
|
83
|
+
"cmd.think.unchanged": "思考强度未变化",
|
|
84
|
+
"cmd.help.title": "可用命令:",
|
|
85
|
+
"cmd.new.archived": "旧对话已存档:{id}\n已开始新对话",
|
|
86
|
+
"cmd.new.started": "已开始新对话",
|
|
87
|
+
"cmd.load.none": "还没有已保存的对话",
|
|
88
|
+
"cmd.load.title": "加载已保存的对话",
|
|
89
|
+
"cmd.load.titleReplacing": "选择要加载的对话(当前会话将被替换)",
|
|
90
|
+
"cmd.load.cancelled": "已取消加载",
|
|
91
|
+
"cmd.handoff.empty": "当前对话还没有可交接的内容",
|
|
92
|
+
"cmd.handoff.title": "编写交接文档 · 选择交接方式",
|
|
93
|
+
"cmd.handoff.cancelled": "已取消交接",
|
|
94
|
+
"cmd.migrate.empty": "当前对话还没有可迁移的内容",
|
|
95
|
+
"cmd.migrate.title": "任务迁移 · 选择交接方式(完成后开启新会话)",
|
|
96
|
+
"cmd.migrate.cancelled": "已取消迁移",
|
|
97
|
+
"cmd.back.empty": "还没有可撤回的消息",
|
|
98
|
+
"cmd.back.title": "选择要撤回到的消息(其后内容将被移除)",
|
|
99
|
+
"cmd.back.cancelled": "已取消撤回",
|
|
100
|
+
"cmd.model.unknown": "未知模型:{id}(可选:{options})",
|
|
101
|
+
"cmd.model.already": "已经是当前模型:{id}",
|
|
102
|
+
"cmd.model.endpointMissing": "模型 {id} 引用的端点 {endpoint} 不存在,请用 /config 检查",
|
|
103
|
+
"cmd.model.noApiKey": "端点「{name}」还没有 API Key,请先用 /config 配置后再切换",
|
|
104
|
+
"cmd.model.failed": "切换模型失败:{error}",
|
|
105
|
+
"cmd.agent.unknown": "未知 Agent:{id}(可选:{options})",
|
|
106
|
+
"cmd.agent.unavailableReason": "Agent「{name}」不可用:{reason}",
|
|
107
|
+
"cmd.agent.alreadyOn": "{summary}(当前会话已在该 Agent 上)",
|
|
108
|
+
"cmd.agent.failed": "切换主 Agent 失败:{error}",
|
|
109
|
+
"cmd.mcp.unknownScope": "未知作用域:{scope}(可选 global / project,或不带参数)",
|
|
110
|
+
"cmd.lang.unknown": "未知语言:{lang}(可选 zh / en,或不带参数切换)",
|
|
111
|
+
"cmd.reload.failed": "刷新失败:{error}",
|
|
112
|
+
"cmd.think.noModel": "Agent「{id}」未绑定模型,请用 /config 为它选择模型",
|
|
113
|
+
"cmd.think.modelMissing": "模型 {id} 不存在,请用 /model 或 /config 检查",
|
|
114
|
+
"cmd.think.notAdjustable": "模型 {id} 未关联可用的思考策略(缺 reasoningPreset,或策略表里没这一档),无法调整",
|
|
115
|
+
"cmd.think.unknown": "未知强度:{level}(可选 {options} / default)",
|
|
116
|
+
"cmd.think.title": "思考强度(当前:{level})",
|
|
117
|
+
"cmd.think.failed": "切换思考强度失败:{error}",
|
|
118
|
+
"cmd.save.done": "对话已保存:{id}",
|
|
119
|
+
"cmd.save.failed": "保存失败:{error}",
|
|
120
|
+
"cmd.load.tooMany": "选择要加载的对话(仅显示最近 {n} 条)",
|
|
121
|
+
"cmd.load.readFailed": "对话不存在或读取失败:{id}",
|
|
122
|
+
"cmd.handoff.unknownMode": "未知的执行者:{who}(可选 self / summary)",
|
|
123
|
+
"cmd.handoff.done": "交接文档已生成:{path}",
|
|
124
|
+
"cmd.handoff.failed": "编写交接文档失败:{error}",
|
|
125
|
+
"cmd.migrate.done": "任务迁移完成,已开启新会话\n📄 交接文档:{path}",
|
|
126
|
+
"cmd.migrate.failed": "任务迁移失败:{error}",
|
|
127
|
+
"cmd.back.tooMany": "选择要撤回到的消息(仅显示最近 {n} 条)",
|
|
128
|
+
"cmd.editor.failed": "编辑器打开失败:{error}",
|
|
129
|
+
"cmd.unknown": "未知命令:{cmd}(输入 /help 查看可用命令)",
|
|
130
|
+
// ---------- 交接选择器 / 子任务通知 / 启动屏 / 消息占位 ----------
|
|
131
|
+
"handoff.pickTitle": "上下文即将超限({used}/{limit} tokens)· 选择交接方式",
|
|
132
|
+
"handoff.modeSelf": "当前会话自己写交接文档",
|
|
133
|
+
"handoff.modeSelfHint": "保真 · 可核实真实状态",
|
|
134
|
+
"handoff.modeSummary": "单独 Agent 写交接文档",
|
|
135
|
+
"handoff.modeSummaryHint": "独立摘要 · 快且省,不核实文件",
|
|
136
|
+
"handoff.modeSkip": "不交接",
|
|
137
|
+
"handoff.modeSkipHint": "跳过本次",
|
|
138
|
+
"chat.subagentLabel": "子任务",
|
|
139
|
+
"chat.subagentRunning": "🧩 子任务 {name} 运行中…",
|
|
140
|
+
"chat.subagentDone": "✓ 子任务 {name} 完成",
|
|
141
|
+
"chat.noMigratable": "当前对话还没有可迁移的内容",
|
|
142
|
+
"chat.noHandoffable": "当前对话还没有可交接的内容",
|
|
143
|
+
"chat.configReadFailed": "读取配置失败:{error}",
|
|
144
|
+
"chat.modelNoEndpoint": "模型 {id} 未绑定可用端点,请用 /config 检查配置",
|
|
145
|
+
"chat.configUpdated": "配置已更新:{line}",
|
|
146
|
+
// 一次改了多项时合成一条多行通知(逐条 push 会互相覆盖 / 占满通知栏)
|
|
147
|
+
"chat.configUpdatedMulti": "配置已更新:\n{lines}",
|
|
148
|
+
"chat.sessionReloadFailed": "重建会话失败:{error}",
|
|
149
|
+
"chat.bootFailed": "✖ 无法启动对话:{error}",
|
|
150
|
+
"chat.bootHint": "按 k 打开配置中心(可设置 API Key / 端点地址)· Enter 返回",
|
|
151
|
+
"splash.tagline": "终端里的 AI 协作台",
|
|
152
|
+
"splash.pressAnyKey": "按任意键开始…",
|
|
153
|
+
"splash.preparing": "正在准备",
|
|
154
|
+
"msg.image": "[图片: {url}]",
|
|
155
|
+
"msg.file": "[文件: {name}]",
|
|
156
|
+
"msg.inlineFile": "内联文件",
|
|
157
|
+
"msg.userHeader": "❯ 你",
|
|
158
|
+
"msg.aiHeader": "✦ AI",
|
|
159
|
+
"confirm.hint": "← → 选择 · y/n · Enter 确认",
|
|
160
|
+
// ---------- 业务模块返回的 summary / 报错(思考档位 / 切模型 / 切 Agent / 交接) ----------
|
|
161
|
+
"effort.err.agentMissing": "Agent \"{id}\" 不存在",
|
|
162
|
+
"effort.err.noModel": "Agent \"{id}\" 未绑定模型,请先为它选择模型",
|
|
163
|
+
"effort.err.modelMissing": "模型 \"{id}\" 不存在,请先用 /model 或 /config 检查",
|
|
164
|
+
"effort.err.noPreset": "模型 \"{id}\" 未关联可用的思考策略(reasoningPreset),无法设置思考强度",
|
|
165
|
+
"effort.err.unknownLevel": "策略 \"{preset}\" 没有档位 \"{level}\"(可选:{options})",
|
|
166
|
+
"effort.followDefault": "跟随模型默认",
|
|
167
|
+
"effort.quoted": "「{label}」",
|
|
168
|
+
"effort.summary": "思考强度已设为 {label} · 写入 Agent「{id}」(模型 {model})",
|
|
169
|
+
"modelSwitch.err.modelMissing": "模型 \"{id}\" 不存在",
|
|
170
|
+
"modelSwitch.err.agentMissing": "Agent \"{id}\" 不存在",
|
|
171
|
+
"modelSwitch.resetHint": " · 思考强度已重置为模型默认",
|
|
172
|
+
"modelSwitch.summary": "已切换模型:{name}({id})· 已写入 Agent「{agent}」{hint}",
|
|
173
|
+
"agentSwitch.err.noModel": "未绑定模型",
|
|
174
|
+
"agentSwitch.err.modelMissing": "模型 {id} 不存在",
|
|
175
|
+
"agentSwitch.err.missingKey": "端点「{endpoint}」缺 API Key",
|
|
176
|
+
"agentSwitch.err.agentMissing": "Agent \"{id}\" 不存在",
|
|
177
|
+
"agentSwitch.err.agentNoModel": "Agent「{name}」未绑定模型,请先用 /config 为它选择模型",
|
|
178
|
+
"agentSwitch.err.modelGone": "Agent「{name}」绑定的模型“{id}”已不在配置中,请用 /model 或 /config 重新选择",
|
|
179
|
+
"agentSwitch.err.noKey": "端点「{endpoint}」还没有 API Key,请先用 /config 配置后再切换",
|
|
180
|
+
"agentSwitch.summary": "已切换主 Agent:{name}({id})· 模型 {model}({modelId})",
|
|
181
|
+
"handoff.mode.self": "原 agent 自交接",
|
|
182
|
+
"handoff.mode.summary": "独立摘要",
|
|
183
|
+
"handoff.autoDetected": "📋 检测到上下文即将超限({used}/{limit} tokens),正在交接({mode})…",
|
|
184
|
+
"handoff.writing": "📋 正在编写任务交接文档({mode})…",
|
|
185
|
+
"handoff.degraded": "⚠️ {requested}未能产出文档,已降级为{mode}",
|
|
186
|
+
"handoff.path": "📄 交接文档:{path}",
|
|
187
|
+
"handoff.savedConversation": "✅ 原对话已保存:{name}",
|
|
188
|
+
"handoff.migrated": "🚀 任务迁移完成,已开启新会话(共 {n} 条消息)",
|
|
189
|
+
"handoff.migratedHint": "💡 新助手会先读取交接文档,随后即可继续推进任务。",
|
|
190
|
+
"handoff.persistFailed": "⚠️ 迁移后会话落盘失败:{error}",
|
|
191
|
+
// ---------- 入口 / 退出 / 时间格式 ----------
|
|
192
|
+
"app.goodbye": "\n再见 👋\n",
|
|
193
|
+
"app.agentNoModel": "Agent「{id}」未绑定模型,请用 /config 为它选择模型",
|
|
194
|
+
"app.agentModelGone": "Agent「{id}」绑定的模型“{model}”已不在配置中,请用 /config 重新选择",
|
|
195
|
+
"app.noAgents": "没有可用的 Agent,请先在配置中创建(配置文件 config.json)",
|
|
196
|
+
"app.bootFailed": "✖ 无法启动对话:{error}",
|
|
197
|
+
"app.unexpected": "✖ 意外错误: {error}",
|
|
198
|
+
"chat.persistFailed": "⚠️ 会话落盘失败:{error}",
|
|
199
|
+
"migrate.skipped": "⏭️ 已跳过本次任务迁移;可随时输入 /migrate 手动迁移,若继续增长至严重超限对话会被安全护栏中断。",
|
|
200
|
+
"time.yesterday": "昨天 {time}",
|
|
201
|
+
"time.pattern.thisYear": "M月D日 HH:mm",
|
|
202
|
+
"time.pattern.older": "YYYY年M月D日 HH:mm",
|
|
203
|
+
"time.pattern.full": "YYYY年M月D日 HH:mm:ss",
|
|
204
|
+
"time.messageCount": "{n} 条消息, {time}",
|
|
205
|
+
// ---------- `ai --help`(在 TUI 之外打印,故单独在 help 分支初始化语言) ----------
|
|
206
|
+
"cli.help.title": "ai — AI-Zen CLI v{version}",
|
|
207
|
+
"cli.help.usage": "\n用法:\n ai 进入交互式界面(TUI,需 stdin/stdout 为 TTY)\n ai <提示词> 以纯 stdio 模式提问,结果写入 stdout\n cat 文件 | ai “总结要点” 通过管道传入内容,参数作为指令\n ai hook install 安装 shell 兜底钩子(命令不存在时转发给 AI)\n ai hook uninstall 卸载 shell 兜底钩子",
|
|
208
|
+
"cli.help.options": "\n选项:\n --save 保存本次对话到存档(默认不落盘)\n --tui [提示词…] 强制进入交互界面,提示词作为首条消息自动发送(shell 钩子用)\n --new 进入交互界面时开新会话,不续接上一轮对话\n -h, --help 显示本帮助\n -v, --version 显示版本号",
|
|
209
|
+
"cli.help.notes": "\n说明:\n stdio 模式无任何交互,结果走 stdout、日志走 stderr,成功退出码 0。",
|
|
210
|
+
// ---------- `ai hook install / uninstall`(非 TUI 输出,同 help 一样在分支内先初始化语言) ----------
|
|
211
|
+
"cli.hookUsage": "用法: ai hook install|uninstall",
|
|
212
|
+
"cli.hookUnknownAction": "用法中不认识的子动作:{action}",
|
|
213
|
+
"hook.unsupportedShell": "❌ 不支持的 shell(仅支持 bash / zsh)",
|
|
214
|
+
"hook.alreadyInstalled": "ℹ️ ai hook 已安装,无需重复操作",
|
|
215
|
+
"hook.installed": "✅ ai hook 已安装到 {file}",
|
|
216
|
+
"hook.updated": "✅ ai hook 已更新到最新版本({file})",
|
|
217
|
+
"hook.upgraded": " (已自动升级旧版 aiz hook)",
|
|
218
|
+
"hook.restartHint": " 重启终端或执行 source {file} 即可生效",
|
|
219
|
+
"hook.forwardHint": " 之后输入不存在的命令会自动转发给 AI 处理",
|
|
220
|
+
"hook.notInstalledNoFile": "ℹ️ ai hook 未安装(文件不存在)",
|
|
221
|
+
"hook.notInstalled": "ℹ️ ai hook 未安装",
|
|
222
|
+
"hook.uninstalled": "✅ ai hook 已从 {file} 卸载",
|
|
223
|
+
// ---------- 其他共用 ----------
|
|
224
|
+
"agent.subAgentTaskParam": "完整的任务描述",
|
|
225
|
+
"app.mkdirFailed": "⚠️ 无法创建目录: {dir}({error})",
|
|
226
|
+
"time.pattern.short": "YYYY年MM月DD日HH时mm分ss秒",
|
|
227
|
+
};
|
|
228
|
+
//# sourceMappingURL=zh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zh.js","sourceRoot":"","sources":["../../src/i18n/zh.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,8 @@ import { installHook, uninstallHook } from "./hook.js";
|
|
|
3
3
|
import { resolveInvocation } from "./mode.js";
|
|
4
4
|
import { runStdio } from "./stdio-runner.js";
|
|
5
5
|
import { CLI_VERSION } from "./version.js";
|
|
6
|
+
import { initLocale } from "./i18n/preferences.js";
|
|
7
|
+
import { t } from "./i18n/index.js";
|
|
6
8
|
// ⚠️ 必须在加载 React/Ink 之前把 NODE_ENV 定为 production。
|
|
7
9
|
//
|
|
8
10
|
// 背景(OOM 根因):Node 官方分发版没有内置“production” React,react/react-reconciler
|
|
@@ -27,23 +29,18 @@ process.env.NODE_ENV ||= "production";
|
|
|
27
29
|
*
|
|
28
30
|
* 模式判定与参数解析集中在 ./mode.ts(纯函数,单测覆盖),本文件只做分发。
|
|
29
31
|
*/
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
-v, --version 显示版本号
|
|
43
|
-
|
|
44
|
-
说明:
|
|
45
|
-
stdio 模式无任何交互,结果走 stdout、日志走 stderr,成功退出码 0。
|
|
46
|
-
`;
|
|
32
|
+
/**
|
|
33
|
+
* 帮助文本按当前语言现拼(**不能**写成模块级常量:那会把“模块求值那一刻的语言”定死)。
|
|
34
|
+
* stdio 模式刻意不做 i18n,但 `--help` 属终端交互文案,要跟随界面语言。
|
|
35
|
+
*/
|
|
36
|
+
function helpText() {
|
|
37
|
+
return ([
|
|
38
|
+
t("cli.help.title", { version: CLI_VERSION }),
|
|
39
|
+
t("cli.help.usage"),
|
|
40
|
+
t("cli.help.options"),
|
|
41
|
+
t("cli.help.notes"),
|
|
42
|
+
].join("\n") + "\n");
|
|
43
|
+
}
|
|
47
44
|
async function main() {
|
|
48
45
|
const tty = {
|
|
49
46
|
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
@@ -52,20 +49,30 @@ async function main() {
|
|
|
52
49
|
const invocation = resolveInvocation(process.argv.slice(2), tty);
|
|
53
50
|
switch (invocation.kind) {
|
|
54
51
|
case "help":
|
|
55
|
-
|
|
52
|
+
// 帮助是用户可见的终端文案,跟随界面语言(偏好 / 系统语言);其余非 TUI 路径(stdio)不初始化语言
|
|
53
|
+
await initLocale();
|
|
54
|
+
process.stdout.write(helpText());
|
|
56
55
|
return;
|
|
57
56
|
case "version":
|
|
58
57
|
process.stdout.write(`${CLI_VERSION}\n`);
|
|
59
58
|
return;
|
|
60
59
|
case "hook":
|
|
60
|
+
// hook 的输出是给人看的终端文案,与 help 同理:先初始化语言,再打印
|
|
61
|
+
await initLocale();
|
|
61
62
|
if (invocation.action === "install")
|
|
62
63
|
await installHook();
|
|
63
64
|
else if (invocation.action === "uninstall")
|
|
64
65
|
await uninstallHook();
|
|
65
|
-
else {
|
|
66
|
-
|
|
66
|
+
else if (invocation.invalidAction) {
|
|
67
|
+
// 认不出的子动作:报错 + 非零退出码(脚本可据此判断),同时给出正确用法
|
|
68
|
+
process.stderr.write(`${t("cli.hookUnknownAction", { action: invocation.invalidAction })}\n`);
|
|
69
|
+
process.stderr.write(`${t("cli.hookUsage")}\n`);
|
|
67
70
|
process.exitCode = 1;
|
|
68
71
|
}
|
|
72
|
+
else {
|
|
73
|
+
// 只想看用法(`ai hook` / `ai hook --help`):正常输出、退出码 0
|
|
74
|
+
process.stdout.write(`${t("cli.hookUsage")}\n`);
|
|
75
|
+
}
|
|
69
76
|
return;
|
|
70
77
|
case "stdio":
|
|
71
78
|
process.exitCode = await runStdio({
|
|
@@ -74,21 +81,32 @@ async function main() {
|
|
|
74
81
|
});
|
|
75
82
|
return;
|
|
76
83
|
case "tui": {
|
|
77
|
-
// 无参数且均为 TTY
|
|
84
|
+
// 无参数且均为 TTY,或显式 `--tui`:进入全屏交互界面(Ink)。
|
|
78
85
|
// 流式统一走 Ink —— 由 `RENDER_OPTIONS.incrementalRendering`(只重绘变化的行)
|
|
79
86
|
// 压低输出量,SSH / 弱网下实测稳定。
|
|
80
87
|
//
|
|
81
88
|
// 动态 import:确保 React/Ink 的求值发生在上方 `process.env.NODE_ENV ||= "production"`
|
|
82
89
|
// 之后,从而加载 production 版 reconciler(避免 DEV 版 performance.measure 缓冲撑爆堆)。
|
|
83
90
|
const { runTui } = await import("./tui/index.js");
|
|
84
|
-
|
|
91
|
+
// `initialPrompt`(来自 shell 钩子 `ai --tui --new "$@"`)会作为首条消息自动发送;
|
|
92
|
+
// `newSession`(`--new`)要求跳过续接、开一条新会话
|
|
93
|
+
await runTui({
|
|
94
|
+
initialPrompt: invocation.initialPrompt,
|
|
95
|
+
newSession: invocation.newSession,
|
|
96
|
+
});
|
|
85
97
|
return;
|
|
86
98
|
}
|
|
99
|
+
case "tui-rejected":
|
|
100
|
+
// `--tui` 明确要求交互界面,但 stdin/stdout 不是 TTY(如被写进脚本或管道):
|
|
101
|
+
// 不悄悄降级成管道模式(那会把整屏界面内容写进管道),直接报错。
|
|
102
|
+
process.stderr.write("ai: --tui requires an interactive terminal (stdin and stdout must be TTYs)\n");
|
|
103
|
+
process.exitCode = 2;
|
|
104
|
+
return;
|
|
87
105
|
}
|
|
88
106
|
}
|
|
89
107
|
main().catch((error) => {
|
|
90
108
|
const message = error instanceof Error ? error.message : String(error);
|
|
91
|
-
process.stderr.write(`\n❌
|
|
109
|
+
process.stderr.write(`\n❌ Unexpected error: ${message}\n`);
|
|
92
110
|
process.exitCode = 1;
|
|
93
111
|
});
|
|
94
112
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/mcp` 的入口决策 —— 纯逻辑,可单测
|
|
3
|
+
*
|
|
4
|
+
* `/mcp` 不自己做一套 MCP 编辑界面(那样「删除」和「新增」迟早长歪成两套实现),
|
|
5
|
+
* 只负责把用户送进配置中心里已有的 MCP 界面(`{ kind: "mcp", scope }`):
|
|
6
|
+
* 增、删、改、启用/禁用、作用域切换都在那一个屏里,改完由宿主统一
|
|
7
|
+
* `session.reload()` 让新工具生效。
|
|
8
|
+
*
|
|
9
|
+
* 于是这里只剩一个真问题:**默认进哪个作用域**。
|
|
10
|
+
*/
|
|
11
|
+
import type { McpConfig, McpScope } from "./config.js";
|
|
12
|
+
/** MCP 两个作用域的配置快照 */
|
|
13
|
+
export interface McpSnapshotLike {
|
|
14
|
+
global: McpConfig;
|
|
15
|
+
project: McpConfig;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 解析 `/mcp` 的作用域参数(`/mcp global`、`/mcp project`,大小写不敏感,可缩写为 `g` / `p`)。
|
|
19
|
+
*
|
|
20
|
+
* 返回 `null` 表示「没有可用值」——**没给参数**和**给错了**都返回 null,
|
|
21
|
+
* 调用方靠 `args[0]` 是否存在区分这两种情况(前者走默认判断,后者报错)。
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseMcpScope(raw?: string): McpScope | null;
|
|
24
|
+
/**
|
|
25
|
+
* 无参数时挑一个入口作用域:
|
|
26
|
+
* - 项目级有服务器 → 进项目级(会话内临时加的 MCP 通常只对本项目生效,改它最常见);
|
|
27
|
+
* - 否则进全局(共享位置,多数人把 MCP 配在这里;项目级为空时进去只会看到空列表)。
|
|
28
|
+
*
|
|
29
|
+
* 两边都空时进全局:新建的东西默认落在共享位置,比落在当前目录更容易被下一次启动用到。
|
|
30
|
+
*/
|
|
31
|
+
export declare function pickStartScope(mcp: McpSnapshotLike): McpScope;
|
|
32
|
+
//# sourceMappingURL=mcp-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-command.d.ts","sourceRoot":"","sources":["../src/mcp-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvD,qBAAqB;AACrB,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAM3D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,QAAQ,CAE7D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/mcp` 的入口决策 —— 纯逻辑,可单测
|
|
3
|
+
*
|
|
4
|
+
* `/mcp` 不自己做一套 MCP 编辑界面(那样「删除」和「新增」迟早长歪成两套实现),
|
|
5
|
+
* 只负责把用户送进配置中心里已有的 MCP 界面(`{ kind: "mcp", scope }`):
|
|
6
|
+
* 增、删、改、启用/禁用、作用域切换都在那一个屏里,改完由宿主统一
|
|
7
|
+
* `session.reload()` 让新工具生效。
|
|
8
|
+
*
|
|
9
|
+
* 于是这里只剩一个真问题:**默认进哪个作用域**。
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 解析 `/mcp` 的作用域参数(`/mcp global`、`/mcp project`,大小写不敏感,可缩写为 `g` / `p`)。
|
|
13
|
+
*
|
|
14
|
+
* 返回 `null` 表示「没有可用值」——**没给参数**和**给错了**都返回 null,
|
|
15
|
+
* 调用方靠 `args[0]` 是否存在区分这两种情况(前者走默认判断,后者报错)。
|
|
16
|
+
*/
|
|
17
|
+
export function parseMcpScope(raw) {
|
|
18
|
+
const value = raw?.trim().toLowerCase();
|
|
19
|
+
if (!value)
|
|
20
|
+
return null;
|
|
21
|
+
if (value === "global" || value === "g")
|
|
22
|
+
return "global";
|
|
23
|
+
if (value === "project" || value === "p")
|
|
24
|
+
return "project";
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 无参数时挑一个入口作用域:
|
|
29
|
+
* - 项目级有服务器 → 进项目级(会话内临时加的 MCP 通常只对本项目生效,改它最常见);
|
|
30
|
+
* - 否则进全局(共享位置,多数人把 MCP 配在这里;项目级为空时进去只会看到空列表)。
|
|
31
|
+
*
|
|
32
|
+
* 两边都空时进全局:新建的东西默认落在共享位置,比落在当前目录更容易被下一次启动用到。
|
|
33
|
+
*/
|
|
34
|
+
export function pickStartScope(mcp) {
|
|
35
|
+
return Object.keys(mcp.project.mcpServers).length > 0 ? "project" : "global";
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=mcp-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-command.js","sourceRoot":"","sources":["../src/mcp-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC;IACzD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/E,CAAC"}
|
package/dist/mode.d.ts
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
|
* 便于单测(模式判定与路由是改造中风险最高的逻辑,必须被测覆盖)。
|
|
@@ -24,9 +31,16 @@ export interface TtyState {
|
|
|
24
31
|
* 子命令(hook/help/version)与运行模式正交:命中子命令时短路模式判定,
|
|
25
32
|
* 不进入 stdio/TUI 任一路径。
|
|
26
33
|
*/
|
|
27
|
-
export type Invocation =
|
|
34
|
+
export type Invocation =
|
|
35
|
+
/**
|
|
36
|
+
* `invalidAction`:给了子动作但不认识(如 `ai hook boom`)。与「只想看用法」
|
|
37
|
+
* (`ai hook` / `ai hook --help`,此时无该字段)区分开 —— 前者该报错退出,
|
|
38
|
+
* 后者是正常的信息请求,退出码必须是 0。
|
|
39
|
+
*/
|
|
40
|
+
{
|
|
28
41
|
kind: "hook";
|
|
29
42
|
action: "install" | "uninstall" | "usage";
|
|
43
|
+
invalidAction?: string;
|
|
30
44
|
} | {
|
|
31
45
|
kind: "help";
|
|
32
46
|
} | {
|
|
@@ -35,8 +49,19 @@ export type Invocation = {
|
|
|
35
49
|
kind: "stdio";
|
|
36
50
|
instruction: string;
|
|
37
51
|
save: boolean;
|
|
38
|
-
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* `initialPrompt`:进 TUI 后**自动作为首条消息**发送的内容(shell 钩子用)
|
|
55
|
+
* `newSession`:`--new` 要求**开新会话**,跳过「续接该目录上一轮对话」
|
|
56
|
+
*/
|
|
57
|
+
| {
|
|
39
58
|
kind: "tui";
|
|
59
|
+
initialPrompt?: string;
|
|
60
|
+
newSession?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/** `--tui` 明确要求交互界面,但终端不支持:报错退出,**绝不**降级成 stdio */
|
|
63
|
+
| {
|
|
64
|
+
kind: "tui-rejected";
|
|
40
65
|
};
|
|
41
66
|
/**
|
|
42
67
|
* 模式判定(纯函数)。
|
|
@@ -44,6 +69,8 @@ export type Invocation = {
|
|
|
44
69
|
* - 有位置参数 → stdio(脚本/管道优先,绝不进 TUI)
|
|
45
70
|
* - 无参数但 stdin 或 stdout 非 TTY → stdio(管道、重定向、CI)
|
|
46
71
|
* - 无参数且 stdin/stdout 均为 TTY → TUI
|
|
72
|
+
*
|
|
73
|
+
* `--tui` 不经过本函数:它是显式覆盖,在 `resolveInvocation()` 里优先处理。
|
|
47
74
|
*/
|
|
48
75
|
export declare function decideMode(tty: TtyState, hasArgs: boolean): RunMode;
|
|
49
76
|
/**
|
package/dist/mode.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../src/mode.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../src/mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,WAAW;AACX,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAEtC,yBAAyB;AACzB,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU;AACpB;;;;GAIG;AACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE;AACvD;;;GAGG;GACD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE;AAC/D,mDAAmD;GACjD;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AAK7B;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAInE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,GAAG,UAAU,CAqE3E"}
|
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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"}
|