@ai-zen/cli 1.0.0-alpha.2 → 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 +514 -0
- package/README.md +136 -39
- package/README.zh.md +136 -39
- package/dist/agent-creator.d.ts +11 -0
- package/dist/agent-creator.d.ts.map +1 -1
- package/dist/agent-creator.js +52 -21
- 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/config-editor.d.ts +13 -5
- package/dist/config-editor.d.ts.map +1 -1
- package/dist/config-editor.js +36 -27
- package/dist/config-editor.js.map +1 -1
- package/dist/config.d.ts +24 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +55 -15
- 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 -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 +71 -13
- package/dist/conversation-repository.d.ts.map +1 -1
- package/dist/conversation-repository.js +81 -24
- 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 +19 -0
- package/dist/handoff-service.d.ts.map +1 -0
- package/dist/handoff-service.js +89 -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 +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 +61 -25
- 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 +55 -0
- package/dist/sdk-log.d.ts.map +1 -0
- package/dist/sdk-log.js +91 -0
- package/dist/sdk-log.js.map +1 -0
- package/dist/session-pointer.d.ts +22 -9
- package/dist/session-pointer.d.ts.map +1 -1
- package/dist/session-pointer.js +55 -23
- 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 +5 -5
- package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
- package/dist/sub-agent-guard-plugin.js +7 -7
- package/dist/sub-agent-guard-plugin.js.map +1 -1
- package/dist/tui/chat-session.d.ts +110 -59
- package/dist/tui/chat-session.d.ts.map +1 -1
- package/dist/tui/chat-session.js +268 -120
- package/dist/tui/chat-session.js.map +1 -1
- package/dist/tui/components.d.ts +48 -2
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +96 -3
- 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 +27 -21
- 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 +216 -152
- 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 +33 -21
- 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 +24 -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 +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/config-wizard/types.d.ts +18 -3
- package/dist/tui/config-wizard/types.d.ts.map +1 -1
- package/dist/tui/config-wizard/wizard.d.ts.map +1 -1
- package/dist/tui/config-wizard/wizard.js +4 -3
- package/dist/tui/config-wizard/wizard.js.map +1 -1
- package/dist/tui/highlight.d.ts +3 -2
- package/dist/tui/highlight.d.ts.map +1 -1
- package/dist/tui/highlight.js +3 -2
- package/dist/tui/highlight.js.map +1 -1
- package/dist/tui/index.d.ts +18 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +107 -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/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/chat-commands.d.ts +64 -3
- package/dist/tui/screens/chat-commands.d.ts.map +1 -1
- package/dist/tui/screens/chat-commands.js +483 -157
- package/dist/tui/screens/chat-commands.js.map +1 -1
- package/dist/tui/screens/chat.d.ts +10 -5
- package/dist/tui/screens/chat.d.ts.map +1 -1
- package/dist/tui/screens/chat.js +464 -301
- 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 +47 -0
- package/dist/tui/screens/frame-buffer.d.ts.map +1 -0
- package/dist/tui/screens/frame-buffer.js +78 -0
- package/dist/tui/screens/frame-buffer.js.map +1 -0
- 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 +8 -8
- package/dist/tui/screens/index.d.ts.map +1 -1
- package/dist/tui/screens/index.js +7 -7
- 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 +46 -1
- package/dist/tui/screens/input.d.ts.map +1 -1
- package/dist/tui/screens/input.js +83 -8
- package/dist/tui/screens/input.js.map +1 -1
- package/dist/tui/screens/layout.d.ts +21 -3
- package/dist/tui/screens/layout.d.ts.map +1 -1
- package/dist/tui/screens/layout.js +20 -9
- package/dist/tui/screens/layout.js.map +1 -1
- package/dist/tui/screens/lines.d.ts +12 -41
- package/dist/tui/screens/lines.d.ts.map +1 -1
- package/dist/tui/screens/lines.js +90 -98
- package/dist/tui/screens/lines.js.map +1 -1
- package/dist/tui/screens/messages-view.d.ts +10 -0
- package/dist/tui/screens/messages-view.d.ts.map +1 -0
- package/dist/tui/screens/messages-view.js +116 -0
- package/dist/tui/screens/messages-view.js.map +1 -0
- 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 +64 -0
- package/dist/tui/screens/notice.d.ts.map +1 -0
- package/dist/tui/screens/notice.js +106 -0
- package/dist/tui/screens/notice.js.map +1 -0
- 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/render.d.ts +2 -4
- package/dist/tui/screens/render.d.ts.map +1 -1
- package/dist/tui/screens/render.js +7 -43
- package/dist/tui/screens/render.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 +12 -3
- 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 +20 -7
- package/dist/tui/text.d.ts.map +1 -1
- package/dist/tui/text.js +111 -37
- package/dist/tui/text.js.map +1 -1
- package/dist/tui/theme.d.ts +7 -1
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +15 -3
- 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/package.json +4 -3
- 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/state.d.ts +0 -13
- package/dist/tui/screens/state.d.ts.map +0 -1
- package/dist/tui/screens/state.js +0 -75
- package/dist/tui/screens/state.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 鼠标滚轮支持 —— 终端模式开关 + SGR 上报解析
|
|
3
|
+
*
|
|
4
|
+
* 为什么需要自己实现:Ink 7 没有 `useMouse`(整个 `ink/build` 里 "mouse" 只出现在
|
|
5
|
+
* `measure-element.js` 的一句注释中),终端也默认**不把**鼠标事件发给应用——滚轮被
|
|
6
|
+
* 终端自己拿去滚 scrollback。要收到滚轮,必须由应用主动打开终端上报模式。
|
|
7
|
+
*
|
|
8
|
+
* 两种编码,只认后者:
|
|
9
|
+
* - `DECSET 1000`:上报「按钮按下 / 释放」(滚轮也算按钮),是收到滚轮的前提;
|
|
10
|
+
* - `DECSET 1006`:改用 SGR 扩展坐标 `CSI < b ; x ; y M`(释放为 `m`)。**必须开**:
|
|
11
|
+
* 老的 X10 编码(`CSI M` + 3 个原始字节)会被 Ink 的输入解析器拆成 `[M` 和三个
|
|
12
|
+
* 普通字符两条事件,后者会被当正文插进输入框(已实测重现)。
|
|
13
|
+
*
|
|
14
|
+
* 上报到 Ink 的形态(pty 实测):`useInput` 的 `char` 是 `"[<64;10;5M"`,`key` 的
|
|
15
|
+
* 所有标志位都是 false。也就是说**鼠标序列和用户打字走的是同一条路**——任何可能插入
|
|
16
|
+
* 文本的处理器都必须先拦一道(见 `isTerminalReply` 与各屏守卫)。
|
|
17
|
+
*
|
|
18
|
+
* 取舍(用户已知情并选择开启):
|
|
19
|
+
* - 点击 / 拖拽被应用吃掉,多数终端需按住 `Shift` 才回退到原生选词复制;
|
|
20
|
+
* - tmux / screen 需 `set -g mouse off`,否则滚轮先被多路复用器拦进 copy-mode;
|
|
21
|
+
* - 应用内滚动只动视口,不产生终端 scrollback。
|
|
22
|
+
*/
|
|
23
|
+
/** 开启上报:1000(按钮事件,含滚轮)+ 1006(SGR 扩展坐标) */
|
|
24
|
+
export declare const MOUSE_ENABLE = "\u001B[?1000h\u001B[?1006h";
|
|
25
|
+
/** 关闭上报。任何退出路径都必须下发,否则 shell 提示符后面会开始吐 `^[[<64;…M` */
|
|
26
|
+
export declare const MOUSE_DISABLE = "\u001B[?1000l\u001B[?1006l";
|
|
27
|
+
/** 滚轮一格滚动的行数(各终端应用的通行值) */
|
|
28
|
+
export declare const WHEEL_STEP = 3;
|
|
29
|
+
export interface WheelEvent {
|
|
30
|
+
/** `-1` = 向上滚(回看更早的内容),`1` = 向下滚(回到更新的内容) */
|
|
31
|
+
direction: -1 | 1;
|
|
32
|
+
/** 终端列(1-based),当前仅用于将来做「按鼠标位置定位」 */
|
|
33
|
+
x: number;
|
|
34
|
+
/** 终端行(1-based) */
|
|
35
|
+
y: number;
|
|
36
|
+
}
|
|
37
|
+
/** 是否为鼠标上报序列(滚轮、点击、拖拽、移动都算) */
|
|
38
|
+
export declare function isMouseSequence(input: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 从鼠标序列中解出滚轮事件;不是滚轮(点击 / 拖拽 / 横向滚轮)返回 `null`。
|
|
41
|
+
*
|
|
42
|
+
* SGR 的按钮码:`64` 滚轮上、`65` 滚轮下、`66` / `67` 横向滚轮。横向在这个视口里
|
|
43
|
+
* 没有对应维度,直接丢弃——否则横向滚一下就莫名其妙跳几行。
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseWheel(input: string): WheelEvent | null;
|
|
46
|
+
/**
|
|
47
|
+
* 打开终端鼠标上报。
|
|
48
|
+
*
|
|
49
|
+
* 输出的是纯模式设置序列(不打印字符、不移动光标),因此可以安全地直接写 stdout,
|
|
50
|
+
* 不会与 Ink 的增量重绘打架。重复下发是幂等的。
|
|
51
|
+
*/
|
|
52
|
+
export declare function enableMouseTracking(stream?: NodeJS.WriteStream): void;
|
|
53
|
+
/** 关闭终端鼠标上报(幂等)。退出 / 信号 / 异常路径都要调用。 */
|
|
54
|
+
export declare function disableMouseTracking(stream?: NodeJS.WriteStream): void;
|
|
55
|
+
//# sourceMappingURL=mouse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../src/tui/mouse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,0CAA0C;AAC1C,eAAO,MAAM,YAAY,+BAA+B,CAAC;AAEzD,sDAAsD;AACtD,eAAO,MAAM,aAAa,+BAA+B,CAAC;AAE1D,2BAA2B;AAC3B,eAAO,MAAM,UAAU,IAAI,CAAC;AAa5B,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAClB,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;IACV,mBAAmB;IACnB,CAAC,EAAE,MAAM,CAAC;CACX;AAED,+BAA+B;AAC/B,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU3D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAAM,CAAC,WAA4B,GAAG,IAAI,CAErF;AAED,uCAAuC;AACvC,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,MAAM,CAAC,WAA4B,GAAG,IAAI,CAEtF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 鼠标滚轮支持 —— 终端模式开关 + SGR 上报解析
|
|
3
|
+
*
|
|
4
|
+
* 为什么需要自己实现:Ink 7 没有 `useMouse`(整个 `ink/build` 里 "mouse" 只出现在
|
|
5
|
+
* `measure-element.js` 的一句注释中),终端也默认**不把**鼠标事件发给应用——滚轮被
|
|
6
|
+
* 终端自己拿去滚 scrollback。要收到滚轮,必须由应用主动打开终端上报模式。
|
|
7
|
+
*
|
|
8
|
+
* 两种编码,只认后者:
|
|
9
|
+
* - `DECSET 1000`:上报「按钮按下 / 释放」(滚轮也算按钮),是收到滚轮的前提;
|
|
10
|
+
* - `DECSET 1006`:改用 SGR 扩展坐标 `CSI < b ; x ; y M`(释放为 `m`)。**必须开**:
|
|
11
|
+
* 老的 X10 编码(`CSI M` + 3 个原始字节)会被 Ink 的输入解析器拆成 `[M` 和三个
|
|
12
|
+
* 普通字符两条事件,后者会被当正文插进输入框(已实测重现)。
|
|
13
|
+
*
|
|
14
|
+
* 上报到 Ink 的形态(pty 实测):`useInput` 的 `char` 是 `"[<64;10;5M"`,`key` 的
|
|
15
|
+
* 所有标志位都是 false。也就是说**鼠标序列和用户打字走的是同一条路**——任何可能插入
|
|
16
|
+
* 文本的处理器都必须先拦一道(见 `isTerminalReply` 与各屏守卫)。
|
|
17
|
+
*
|
|
18
|
+
* 取舍(用户已知情并选择开启):
|
|
19
|
+
* - 点击 / 拖拽被应用吃掉,多数终端需按住 `Shift` 才回退到原生选词复制;
|
|
20
|
+
* - tmux / screen 需 `set -g mouse off`,否则滚轮先被多路复用器拦进 copy-mode;
|
|
21
|
+
* - 应用内滚动只动视口,不产生终端 scrollback。
|
|
22
|
+
*/
|
|
23
|
+
/** 开启上报:1000(按钮事件,含滚轮)+ 1006(SGR 扩展坐标) */
|
|
24
|
+
export const MOUSE_ENABLE = "\u001b[?1000h\u001b[?1006h";
|
|
25
|
+
/** 关闭上报。任何退出路径都必须下发,否则 shell 提示符后面会开始吐 `^[[<64;…M` */
|
|
26
|
+
export const MOUSE_DISABLE = "\u001b[?1000l\u001b[?1006l";
|
|
27
|
+
/** 滚轮一格滚动的行数(各终端应用的通行值) */
|
|
28
|
+
export const WHEEL_STEP = 3;
|
|
29
|
+
/**
|
|
30
|
+
* SGR 鼠标上报:`CSI < b ; x ; y M|m`。
|
|
31
|
+
*
|
|
32
|
+
* 前导 ESC 可有可无 —— Ink 喂给 `useInput` 的 `char` 已被剥掉 ESC(实测为 `[<64;…`),
|
|
33
|
+
* 但直接处理原始 stdin 数据时它还带着,两种都接受才不会漏。
|
|
34
|
+
*/
|
|
35
|
+
const SGR_MOUSE = /^(?:\u001b)?\[<(\d+);(\d+);(\d+)([Mm])$/;
|
|
36
|
+
/** 修饰位:Shift(4) / Meta(8) / Ctrl(16) / Motion(32) —— 判定滚轮前要剥掉 */
|
|
37
|
+
const MODIFIER_BITS = 0b11100;
|
|
38
|
+
/** 是否为鼠标上报序列(滚轮、点击、拖拽、移动都算) */
|
|
39
|
+
export function isMouseSequence(input) {
|
|
40
|
+
return SGR_MOUSE.test(input);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 从鼠标序列中解出滚轮事件;不是滚轮(点击 / 拖拽 / 横向滚轮)返回 `null`。
|
|
44
|
+
*
|
|
45
|
+
* SGR 的按钮码:`64` 滚轮上、`65` 滚轮下、`66` / `67` 横向滚轮。横向在这个视口里
|
|
46
|
+
* 没有对应维度,直接丢弃——否则横向滚一下就莫名其妙跳几行。
|
|
47
|
+
*/
|
|
48
|
+
export function parseWheel(input) {
|
|
49
|
+
const match = SGR_MOUSE.exec(input);
|
|
50
|
+
if (!match)
|
|
51
|
+
return null;
|
|
52
|
+
const code = Number(match[1]) & ~MODIFIER_BITS;
|
|
53
|
+
if (code !== 64 && code !== 65)
|
|
54
|
+
return null;
|
|
55
|
+
return {
|
|
56
|
+
direction: code === 64 ? -1 : 1,
|
|
57
|
+
x: Number(match[2]),
|
|
58
|
+
y: Number(match[3]),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 打开终端鼠标上报。
|
|
63
|
+
*
|
|
64
|
+
* 输出的是纯模式设置序列(不打印字符、不移动光标),因此可以安全地直接写 stdout,
|
|
65
|
+
* 不会与 Ink 的增量重绘打架。重复下发是幂等的。
|
|
66
|
+
*/
|
|
67
|
+
export function enableMouseTracking(stream = process.stdout) {
|
|
68
|
+
stream.write(MOUSE_ENABLE);
|
|
69
|
+
}
|
|
70
|
+
/** 关闭终端鼠标上报(幂等)。退出 / 信号 / 异常路径都要调用。 */
|
|
71
|
+
export function disableMouseTracking(stream = process.stdout) {
|
|
72
|
+
stream.write(MOUSE_DISABLE);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=mouse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mouse.js","sourceRoot":"","sources":["../../src/tui/mouse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,sDAAsD;AACtD,MAAM,CAAC,MAAM,aAAa,GAAG,4BAA4B,CAAC;AAE1D,2BAA2B;AAC3B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,SAAS,GAAG,yCAAyC,CAAC;AAE5D,iEAAiE;AACjE,MAAM,aAAa,GAAG,OAAO,CAAC;AAW9B,+BAA+B;AAC/B,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC;IAC/C,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO;QACL,SAAS,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACpB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAA6B,OAAO,CAAC,MAAM;IAC7E,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC7B,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,oBAAoB,CAAC,SAA6B,OAAO,CAAC,MAAM;IAC9E,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 生成阶段 —— 消息栏那一行提示的六态判定(纯逻辑,不依赖 React / Ink / SDK)
|
|
3
|
+
*
|
|
4
|
+
* 原先那里只有一个「思考中…」,但一轮对话里模型实际会走过几个阶段,用同一个词概括
|
|
5
|
+
* 在多数时候是**说错话**:等首 token 时并没有在思考,工具执行时更是模型根本没在跑。
|
|
6
|
+
* 于是按数据来源把阶段拆细:
|
|
7
|
+
*
|
|
8
|
+
* | 阶段 | 判据 | 用户真正关心什么 |
|
|
9
|
+
* |------|------|------------------|
|
|
10
|
+
* | `connecting` | `onInnerLoopStart`(请求即将发出)→ `open`(响应头到达) | 是不是网络卡住了 |
|
|
11
|
+
* | `queued` | `open` 之后、首个内容 chunk 之前 | 服务端排队 / 冷启动,还没开始吐字 |
|
|
12
|
+
* | `thinking` | 收到 `reasoning_content` delta | 推理模型中 |
|
|
13
|
+
* | `tool-calling` | 收到 `tool_calls` / `function_call` delta | 模型正在决定调哪个工具、拼参数 |
|
|
14
|
+
* | `tool-waiting` | 流结束(`parsed`)且该轮带工具调用 | 工具在执行,等结果回来才能继续 |
|
|
15
|
+
* | `streaming` | 收到 `content` delta | 正在输出正文 |
|
|
16
|
+
*
|
|
17
|
+
* 判据只用**事件与 delta 的形状**,不读文案、不猜时序;多轮工具调用时阶段会自然
|
|
18
|
+
* 回到 `connecting`(下一轮请求前由插件钩子重置)。
|
|
19
|
+
*/
|
|
20
|
+
/** 生成阶段(见文件头表格) */
|
|
21
|
+
export type PhaseKind = "connecting" | "queued" | "thinking" | "tool-calling" | "tool-waiting" | "streaming";
|
|
22
|
+
export interface PhaseInfo {
|
|
23
|
+
kind: PhaseKind;
|
|
24
|
+
/** 工具名(`tool-calling` / `tool-waiting` 时有值;流式早期可能还没吐到 name) */
|
|
25
|
+
tool?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 阶段跟踪器。生命周期由 `ChatSession` 驱动:
|
|
29
|
+
* `connecting()` → `opened()` → 若干 `delta()` → `streamEnded()` →(下一轮)`connecting()` …
|
|
30
|
+
* 一轮结束调 `reset()`。
|
|
31
|
+
*/
|
|
32
|
+
export declare class PhaseTracker {
|
|
33
|
+
private current;
|
|
34
|
+
/** 当前阶段;空闲(没有在生成的轮次)时为 null */
|
|
35
|
+
get phase(): PhaseInfo | null;
|
|
36
|
+
/** 清空(一轮结束 / 重建会话时调用) */
|
|
37
|
+
reset(): void;
|
|
38
|
+
/** 请求已发出、等响应头(DNS / TCP / TLS / 服务端受理都在这一段) */
|
|
39
|
+
connecting(): void;
|
|
40
|
+
/**
|
|
41
|
+
* 响应头已到(SDK 的 `open` 事件)——连接建立,进入「等首 token」。
|
|
42
|
+
*
|
|
43
|
+
* 注意不能在这里直接进 `thinking`:`open` 只说明服务端受理了请求,
|
|
44
|
+
* 推理模型冷启动排几十秒是常事,那段等待被叫成「思考中」就是在骗人。
|
|
45
|
+
*/
|
|
46
|
+
opened(): void;
|
|
47
|
+
/**
|
|
48
|
+
* 收到一个流式 chunk:按 delta 的实际内容推进阶段。
|
|
49
|
+
*
|
|
50
|
+
* 优先级是 `tool_calls` > `content` > `reasoning_content`:一个 chunk 里同时出现
|
|
51
|
+
* 时,靠后的才代表「模型现在在干什么」(决定调工具 → 工具参数;已经出正文 →
|
|
52
|
+
* 思考阶段结束)。三者都没有(如只带 `usage` 的收尾 chunk)则保持原阶段不变。
|
|
53
|
+
*/
|
|
54
|
+
delta(chunk: unknown): void;
|
|
55
|
+
/**
|
|
56
|
+
* 流结束(SDK 的 `parsed` 事件,参数是本轮 assistant 消息)。
|
|
57
|
+
*
|
|
58
|
+
* 本轮带工具调用 → 接下来是工具执行,模型不在跑;不带 → 由调用方 `reset()`。
|
|
59
|
+
*/
|
|
60
|
+
streamEnded(receiver: unknown): void;
|
|
61
|
+
}
|
|
62
|
+
/** 阶段对应的提示文案(中英由词典决定,这里只做分发) */
|
|
63
|
+
export declare function phaseLabel(phase: PhaseInfo | null): string;
|
|
64
|
+
//# sourceMappingURL=phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase.d.ts","sourceRoot":"","sources":["../../src/tui/phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,mBAAmB;AACnB,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,cAAc,GACd,cAAc,GACd,WAAW,CAAC;AAEhB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA0B;IAEzC,+BAA+B;IAC/B,IAAI,KAAK,IAAI,SAAS,GAAG,IAAI,CAE5B;IAED,yBAAyB;IACzB,KAAK,IAAI,IAAI;IAIb,+CAA+C;IAC/C,UAAU,IAAI,IAAI;IAIlB;;;;;OAKG;IACH,MAAM,IAAI,IAAI;IAId;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAqB3B;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;CAQrC;AAED,gCAAgC;AAChC,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAoB1D"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 生成阶段 —— 消息栏那一行提示的六态判定(纯逻辑,不依赖 React / Ink / SDK)
|
|
3
|
+
*
|
|
4
|
+
* 原先那里只有一个「思考中…」,但一轮对话里模型实际会走过几个阶段,用同一个词概括
|
|
5
|
+
* 在多数时候是**说错话**:等首 token 时并没有在思考,工具执行时更是模型根本没在跑。
|
|
6
|
+
* 于是按数据来源把阶段拆细:
|
|
7
|
+
*
|
|
8
|
+
* | 阶段 | 判据 | 用户真正关心什么 |
|
|
9
|
+
* |------|------|------------------|
|
|
10
|
+
* | `connecting` | `onInnerLoopStart`(请求即将发出)→ `open`(响应头到达) | 是不是网络卡住了 |
|
|
11
|
+
* | `queued` | `open` 之后、首个内容 chunk 之前 | 服务端排队 / 冷启动,还没开始吐字 |
|
|
12
|
+
* | `thinking` | 收到 `reasoning_content` delta | 推理模型中 |
|
|
13
|
+
* | `tool-calling` | 收到 `tool_calls` / `function_call` delta | 模型正在决定调哪个工具、拼参数 |
|
|
14
|
+
* | `tool-waiting` | 流结束(`parsed`)且该轮带工具调用 | 工具在执行,等结果回来才能继续 |
|
|
15
|
+
* | `streaming` | 收到 `content` delta | 正在输出正文 |
|
|
16
|
+
*
|
|
17
|
+
* 判据只用**事件与 delta 的形状**,不读文案、不猜时序;多轮工具调用时阶段会自然
|
|
18
|
+
* 回到 `connecting`(下一轮请求前由插件钩子重置)。
|
|
19
|
+
*/
|
|
20
|
+
import { t } from "../i18n/index.js";
|
|
21
|
+
/**
|
|
22
|
+
* 阶段跟踪器。生命周期由 `ChatSession` 驱动:
|
|
23
|
+
* `connecting()` → `opened()` → 若干 `delta()` → `streamEnded()` →(下一轮)`connecting()` …
|
|
24
|
+
* 一轮结束调 `reset()`。
|
|
25
|
+
*/
|
|
26
|
+
export class PhaseTracker {
|
|
27
|
+
current = null;
|
|
28
|
+
/** 当前阶段;空闲(没有在生成的轮次)时为 null */
|
|
29
|
+
get phase() {
|
|
30
|
+
return this.current;
|
|
31
|
+
}
|
|
32
|
+
/** 清空(一轮结束 / 重建会话时调用) */
|
|
33
|
+
reset() {
|
|
34
|
+
this.current = null;
|
|
35
|
+
}
|
|
36
|
+
/** 请求已发出、等响应头(DNS / TCP / TLS / 服务端受理都在这一段) */
|
|
37
|
+
connecting() {
|
|
38
|
+
this.current = { kind: "connecting" };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 响应头已到(SDK 的 `open` 事件)——连接建立,进入「等首 token」。
|
|
42
|
+
*
|
|
43
|
+
* 注意不能在这里直接进 `thinking`:`open` 只说明服务端受理了请求,
|
|
44
|
+
* 推理模型冷启动排几十秒是常事,那段等待被叫成「思考中」就是在骗人。
|
|
45
|
+
*/
|
|
46
|
+
opened() {
|
|
47
|
+
this.current = { kind: "queued" };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 收到一个流式 chunk:按 delta 的实际内容推进阶段。
|
|
51
|
+
*
|
|
52
|
+
* 优先级是 `tool_calls` > `content` > `reasoning_content`:一个 chunk 里同时出现
|
|
53
|
+
* 时,靠后的才代表「模型现在在干什么」(决定调工具 → 工具参数;已经出正文 →
|
|
54
|
+
* 思考阶段结束)。三者都没有(如只带 `usage` 的收尾 chunk)则保持原阶段不变。
|
|
55
|
+
*/
|
|
56
|
+
delta(chunk) {
|
|
57
|
+
const delta = chunk?.choices?.[0]?.delta;
|
|
58
|
+
if (!delta || typeof delta !== "object")
|
|
59
|
+
return;
|
|
60
|
+
const toolCall = Array.isArray(delta.tool_calls) ? delta.tool_calls[0] : undefined;
|
|
61
|
+
if (toolCall || delta.function_call) {
|
|
62
|
+
// 工具名只在首个 delta 里给出,后续 delta 只带参数片段 → 沿用已知的名字
|
|
63
|
+
const name = toolCall?.function?.name || delta.function_call?.name || this.current?.tool;
|
|
64
|
+
this.current = { kind: "tool-calling", tool: name || undefined };
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (delta.content) {
|
|
68
|
+
this.current = { kind: "streaming" };
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (delta.reasoning_content) {
|
|
72
|
+
this.current = { kind: "thinking" };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 流结束(SDK 的 `parsed` 事件,参数是本轮 assistant 消息)。
|
|
77
|
+
*
|
|
78
|
+
* 本轮带工具调用 → 接下来是工具执行,模型不在跑;不带 → 由调用方 `reset()`。
|
|
79
|
+
*/
|
|
80
|
+
streamEnded(receiver) {
|
|
81
|
+
const message = receiver;
|
|
82
|
+
const calls = Array.isArray(message?.tool_calls) ? message.tool_calls : [];
|
|
83
|
+
if (calls.length === 0 && !message?.function_call)
|
|
84
|
+
return;
|
|
85
|
+
const name = calls[0]?.function?.name || message?.function_call?.name || this.current?.tool;
|
|
86
|
+
this.current = { kind: "tool-waiting", tool: name || undefined };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** 阶段对应的提示文案(中英由词典决定,这里只做分发) */
|
|
90
|
+
export function phaseLabel(phase) {
|
|
91
|
+
if (!phase)
|
|
92
|
+
return t("phase.working");
|
|
93
|
+
switch (phase.kind) {
|
|
94
|
+
case "connecting":
|
|
95
|
+
return t("phase.connecting");
|
|
96
|
+
case "queued":
|
|
97
|
+
return t("phase.queued");
|
|
98
|
+
case "thinking":
|
|
99
|
+
return t("phase.thinking");
|
|
100
|
+
case "streaming":
|
|
101
|
+
return t("phase.streaming");
|
|
102
|
+
case "tool-calling":
|
|
103
|
+
return phase.tool
|
|
104
|
+
? t("phase.toolCallingWith", { name: phase.tool })
|
|
105
|
+
: t("phase.toolCalling");
|
|
106
|
+
case "tool-waiting":
|
|
107
|
+
return phase.tool
|
|
108
|
+
? t("phase.toolWaitingWith", { name: phase.tool })
|
|
109
|
+
: t("phase.toolWaiting");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase.js","sourceRoot":"","sources":["../../src/tui/phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { Dispatch, SetStateAction } from "react";
|
|
1
|
+
import type { Dispatch, SetStateAction } from "react";
|
|
2
|
+
import type { HandoffMode } from "@ai-zen/agents-sdk";
|
|
2
3
|
import { SelectItem } from "../components.js";
|
|
3
4
|
import { ChatSession } from "../chat-session.js";
|
|
5
|
+
import { type CommandName } from "../../conversation-commands/registry.js";
|
|
4
6
|
import { WizardStep } from "../config-wizard/index.js";
|
|
5
|
-
import { ChatAction } from "./state.js";
|
|
6
7
|
export interface ChatCommandHost {
|
|
7
8
|
session: ChatSession;
|
|
8
|
-
|
|
9
|
+
/** 通知通道:命令反馈(保存 / 清除 / 迁移结果 …)走独立栏位,不进 messages */
|
|
10
|
+
notice: (text: string, tone?: "info" | "error") => void;
|
|
11
|
+
/** 清屏(保留上下文):把转录显示起点推到最新 */
|
|
12
|
+
clearTranscript: () => void;
|
|
9
13
|
rows: number;
|
|
10
14
|
exit: (arg?: any) => void;
|
|
11
15
|
suspendTerminal: (fn: () => void | Promise<void>) => Promise<void>;
|
|
@@ -22,6 +26,63 @@ export interface ChatCommandHost {
|
|
|
22
26
|
resolve: (value: boolean) => void;
|
|
23
27
|
} | null>>;
|
|
24
28
|
setInputText: (text: string) => void;
|
|
29
|
+
/** 更新状态栏的思考强度展示(`/think` 写入后由上层重取);文案与置灰一起给,避免漂移 */
|
|
30
|
+
setEffortView: (view: {
|
|
31
|
+
text: string;
|
|
32
|
+
dimmed: boolean;
|
|
33
|
+
} | null) => void;
|
|
34
|
+
/**
|
|
35
|
+
* 触发一次界面重渲染(`/lang` 切换语言后用)。
|
|
36
|
+
*
|
|
37
|
+
* `t()` 是模块级函数,语言一变,已渲染的文案不会自己更新 —— 必须让 React
|
|
38
|
+
* 重新执行一遍渲染函数才能取到新语言。这里只递增一个计数,不携带任何状态。
|
|
39
|
+
*/
|
|
40
|
+
refreshLocale: () => void;
|
|
25
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* 执行者参数(`/migrate self`)的解析结果。
|
|
44
|
+
*
|
|
45
|
+
* 分成「合法值」与「非法原值」两个字段,而不是一个 boolean + 一个 `string | undefined`:
|
|
46
|
+
* 调用方一看到 `invalid` 有值就能直接回显,不需要靠类型收窄去猜。
|
|
47
|
+
*/
|
|
48
|
+
export interface HandoffSelection {
|
|
49
|
+
/** 显式指定且合法的执行者(`self` / `summary`);未指定为 `undefined` */
|
|
50
|
+
mode: HandoffMode | undefined;
|
|
51
|
+
/** 显式指定但不合法的原值(报错回显用) */
|
|
52
|
+
invalid: string | undefined;
|
|
53
|
+
}
|
|
54
|
+
/** 单个命令的执行上下文:宿主能力 + 已解析的参数 */
|
|
55
|
+
export interface CommandContext extends ChatCommandHost {
|
|
56
|
+
/** 命中命令的**主名**(别名已归一:`/effort` → `think`、`/quit` → `exit`) */
|
|
57
|
+
name: CommandName;
|
|
58
|
+
/** 原始输入(含 `/`),用于「未知命令」等场景回显 */
|
|
59
|
+
raw: string;
|
|
60
|
+
/** 首个 token 之后的参数(`/migrate summary` → `["summary"]`) */
|
|
61
|
+
args: string[];
|
|
62
|
+
/** 通知(默认 info 语气) */
|
|
63
|
+
push: (text: string, tone?: "info" | "error") => void;
|
|
64
|
+
/**
|
|
65
|
+
* 弹选择器并等用户作答(取消为 `null`),由各命令自己决定取消后说什么。
|
|
66
|
+
*/
|
|
67
|
+
pick: (title: string, items: SelectItem<string>[]) => Promise<string | null>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 解析命令后的执行者参数(`/migrate self`、`/handoff summary`)。
|
|
71
|
+
* 缺省返回 undefined(走服务默认值);非法值也返回 undefined,由调用方报错。
|
|
72
|
+
*/
|
|
73
|
+
export declare function parseHandoffMode(raw?: string): HandoffMode | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* 解析 `/handoff` `/migrate` 的执行者参数。
|
|
76
|
+
*
|
|
77
|
+
* 单独成函数而不是挂在 `CommandContext` 上:16 个命令里只有这两个用得到,
|
|
78
|
+
* 挂在上下文中会让另外 14 个命令(`/save` `/help` `/clear` …)每次也白算一遍。
|
|
79
|
+
*/
|
|
80
|
+
export declare function parseHandoffSelection(args: readonly string[]): HandoffSelection;
|
|
81
|
+
/**
|
|
82
|
+
* 执行一条斜杠命令。
|
|
83
|
+
*
|
|
84
|
+
* @param name 命令名(含别名,大小写不敏感;由 `parseCommandInput()` 从输入里取出)
|
|
85
|
+
* @param raw 原始输入(含 `/`),用于参数解析与错误回显
|
|
86
|
+
*/
|
|
26
87
|
export declare function runCommand(name: string, raw: string, host: ChatCommandHost): Promise<void>;
|
|
27
88
|
//# sourceMappingURL=chat-commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-commands.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/chat-commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat-commands.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/chat-commands.ts"],"names":[],"mappings":"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"}
|