@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
package/dist/tui/text.d.ts
CHANGED
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
* 从 `screens.tsx` 中抽出,供对话屏、凭据设置屏、配置中心共用,
|
|
5
5
|
* 避免 `screens.tsx ↔ config-wizard.tsx` 相互 import 形成循环依赖。
|
|
6
6
|
*/
|
|
7
|
-
/**
|
|
7
|
+
/** 终端显示宽度(按字素簇,与 Ink 的排版完全一致) */
|
|
8
8
|
export declare function displayWidth(text: string): number;
|
|
9
|
+
/** 单个字素簇的显示宽度(结果带缓存) */
|
|
10
|
+
export declare function clusterWidth(cluster: string): number;
|
|
11
|
+
export declare function graphemes(text: string): string[];
|
|
9
12
|
/**
|
|
10
13
|
* 按显示宽度把文本折成多行(保留显式换行)。
|
|
11
|
-
* 拉丁文优先在空格处断行,CJK /
|
|
14
|
+
* 拉丁文优先在空格处断行,CJK / 超长词按**字素簇**硬断;保证每行显示宽度 ≤ limit。
|
|
12
15
|
*/
|
|
13
16
|
export declare function wrapText(text: string, limit: number): string[];
|
|
14
17
|
/** 带光标位置的输入区折行结果 */
|
|
@@ -17,28 +20,33 @@ export interface InputLayout {
|
|
|
17
20
|
lines: string[];
|
|
18
21
|
/** 光标所在行(0 起始) */
|
|
19
22
|
cursorRow: number;
|
|
20
|
-
/**
|
|
23
|
+
/** 光标在该行内的字符偏移(**字素簇**计,不是 code point) */
|
|
21
24
|
cursorCol: number;
|
|
22
25
|
}
|
|
23
26
|
/**
|
|
24
|
-
* 把输入文本按显示宽度折行,并定位光标(`cursor`
|
|
25
|
-
*
|
|
27
|
+
* 把输入文本按显示宽度折行,并定位光标(`cursor` 为**字素簇**索引)。
|
|
28
|
+
* 折行采用逐簇硬断(不做空格优先),以保证光标映射精确、支持跨行编辑。
|
|
26
29
|
*/
|
|
27
30
|
export declare function layoutInput(text: string, cursor: number, width: number): InputLayout;
|
|
28
31
|
/** 单行输入左侧留白:Box paddingX(1) + 提示符 `❯ `(宽 2) */
|
|
29
32
|
export declare const INPUT_PREFIX_WIDTH = 3;
|
|
30
33
|
/**
|
|
31
|
-
*
|
|
34
|
+
* 判断一段输入是否为「终端上报序列」而非用户输入。
|
|
32
35
|
*
|
|
33
36
|
* 典型来源:
|
|
34
37
|
* - Kitty 键盘协议查询的应答:`CSI ? <flags> u`(Ink 开启 `kittyKeyboard` 时会发 `CSI ? u`);
|
|
35
38
|
* - 光标位置报告(CPR):`CSI <row>;<col> R`;
|
|
36
|
-
* - 设备状态报告:`CSI ? <n> n
|
|
39
|
+
* - 设备状态报告:`CSI ? <n> n`;
|
|
40
|
+
* - 鼠标上报(SGR):`CSI < b ; x ; y M`——滚轮 / 点击 / 拖拽,见 `mouse.ts`。
|
|
37
41
|
*
|
|
38
42
|
* 这类序列本应由 Ink 的解析器整体吞掉。但当它被**拆包**时(前导 ESC 被 Ink 的
|
|
39
43
|
* 「待定转义刷新定时器」当作一次独立的 Escape 键消费),残留在后一个 chunk 里的
|
|
40
44
|
* `[?0u` 会退化成普通文本并被当作输入插入输入框(实测重现)。此处做一层护栏;
|
|
41
45
|
* 根因(不再向终端发查询)已在渲染选项里关闭。
|
|
46
|
+
*
|
|
47
|
+
* 鼠标上报是**主动开启**的(`src/tui/mouse.ts`),且 Ink 会把整条序列当作 `char`
|
|
48
|
+
* 交给 `useInput`,所以这里必须兜住——否则滚一下就往输入框里插一段 `[<64;10;5M`。
|
|
49
|
+
* 注意:需要读滚轮的屏(对话屏)必须**在处理完滚轮之后**再调用本函数。
|
|
42
50
|
*/
|
|
43
51
|
export declare function isTerminalReply(sequence: string): boolean;
|
|
44
52
|
/**
|
|
@@ -68,4 +76,9 @@ export declare function usableFrameRows(terminalRows: number): number;
|
|
|
68
76
|
* 传入行数超过一帧时返回 0(由调用方负责限制内容行数)。
|
|
69
77
|
*/
|
|
70
78
|
export declare function bottomPadding(terminalRows: number, contentLines: number): number;
|
|
79
|
+
/**
|
|
80
|
+
* 去掉 CwdTrackerPlugin 追加在用户消息末尾的工作目录提示。
|
|
81
|
+
* 该提示是喂给模型的上下文,不该显示给用户。
|
|
82
|
+
*/
|
|
83
|
+
export declare function stripCwdNote(text: string): string;
|
|
71
84
|
//# sourceMappingURL=text.d.ts.map
|
package/dist/tui/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH,iCAAiC;AACjC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAwB;AACxB,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQpD;AAuCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B9D;AAID,oBAAoB;AACpB,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kBAAkB;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAgDpF;AAED,+CAA+C;AAC/C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOzD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAY3D;AAID;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMjD"}
|
package/dist/tui/text.js
CHANGED
|
@@ -4,37 +4,94 @@
|
|
|
4
4
|
* 从 `screens.tsx` 中抽出,供对话屏、凭据设置屏、配置中心共用,
|
|
5
5
|
* 避免 `screens.tsx ↔ config-wizard.tsx` 相互 import 形成循环依赖。
|
|
6
6
|
*/
|
|
7
|
+
import stringWidth from "string-width";
|
|
8
|
+
import { isMouseSequence } from "./mouse.js";
|
|
7
9
|
// ==================== 显示宽度 ====================
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
10
|
+
//
|
|
11
|
+
// 宽度计算直接交给 `string-width` —— **Ink 排版时用的就是它**
|
|
12
|
+
//(`ink/build/output.js` 第一行 `import stringWidth from 'string-width'`)。
|
|
13
|
+
//
|
|
14
|
+
// 曾经这里手写了一张 `isWide` 区间表,逐 code point 累加。结果是两把尺子:
|
|
15
|
+
// - `⚡` `✅` `✨` `⭐` 这类 East Asian Wide 符号我们算 1 列、Ink 算 2 列;
|
|
16
|
+
// - `👨👩👧` 逐 code point 累加得 8 列,实际只占 2 列;
|
|
17
|
+
// - `✌️`(VS16 序列)与 `🇨🇳`(国旗对)同样对不上。
|
|
18
|
+
// 于是一切依赖宽度的东西(折行、状态栏装行、光标列号)都差一截,还靠
|
|
19
|
+
// 「预留 1 列余量」硬顶。现在两边用同一把尺子,这类偏差从根上没了。
|
|
20
|
+
//
|
|
21
|
+
// 仍然需要 `graphemes()`:`string-width` 只管宽度,不管「光标该以什么为单位移动」。
|
|
22
|
+
/**
|
|
23
|
+
* 单簇宽度缓存 —— `string-width` 内部要跑 emoji / EAW 正则,而折行是每帧热路径;
|
|
24
|
+
* 字素簇的种类远少于出现次数,缓存后几乎零成本。
|
|
25
|
+
*/
|
|
26
|
+
const clusterWidthCache = new Map();
|
|
27
|
+
const CLUSTER_CACHE_LIMIT = 4096;
|
|
28
|
+
/** 终端显示宽度(按字素簇,与 Ink 的排版完全一致) */
|
|
25
29
|
export function displayWidth(text) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
if (text === "")
|
|
31
|
+
return 0;
|
|
32
|
+
return stringWidth(text);
|
|
33
|
+
}
|
|
34
|
+
/** 单个字素簇的显示宽度(结果带缓存) */
|
|
35
|
+
export function clusterWidth(cluster) {
|
|
36
|
+
if (cluster === "")
|
|
37
|
+
return 0;
|
|
38
|
+
const cached = clusterWidthCache.get(cluster);
|
|
39
|
+
if (cached !== undefined)
|
|
40
|
+
return cached;
|
|
41
|
+
const width = stringWidth(cluster);
|
|
42
|
+
if (clusterWidthCache.size >= CLUSTER_CACHE_LIMIT)
|
|
43
|
+
clusterWidthCache.clear();
|
|
44
|
+
clusterWidthCache.set(cluster, width);
|
|
33
45
|
return width;
|
|
34
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* 把一个字符串切成**字素簇**(用户感知的「一个字符」)。
|
|
49
|
+
*
|
|
50
|
+
* 为什么不能按 code point 切:`✌️` 是 `U+270C U+FE0F` 两个 code point、`👨👩👧` 是
|
|
51
|
+
* 五个、`🇨🇳` 是两个区域指示符——它们都是**一个**字素簇。按 code point 切会让光标
|
|
52
|
+
* 停在簇中间(例如停在 `✌` 与 `U+FE0F` 之间),后果是:
|
|
53
|
+
* - 反显光标变成在反显一个变体选择符 —— 屏幕上什么都不显示(实测:Ink 的输出里
|
|
54
|
+
* 整个反显段直接消失);
|
|
55
|
+
* - 退格只删掉半个 emoji,留下一个孤立的 `U+FE0F`;
|
|
56
|
+
* - 光标列号也会因为「半个簇」的宽度而算错。
|
|
57
|
+
*
|
|
58
|
+
* 用 `Intl.Segmenter`(Node 内置,无需依赖);环境不支持时退回 code point 切分。
|
|
59
|
+
*/
|
|
60
|
+
const segmenter = typeof Intl !== "undefined" && typeof Intl.Segmenter === "function"
|
|
61
|
+
? new Intl.Segmenter("zh", { granularity: "grapheme" })
|
|
62
|
+
: null;
|
|
63
|
+
/**
|
|
64
|
+
* 「可能出现多个 code point 合为一簇」的码位集合。命中才需要 `Intl.Segmenter`。
|
|
65
|
+
*
|
|
66
|
+
* 折行是每帧热路径,而 `Segmenter.segment()` 比直接遍历慢一个数量级;但绝大多数
|
|
67
|
+
* 文本(ASCII / CJK / 代码)每一簇就是一个 code point,根本不需要分词器。
|
|
68
|
+
* 实测一帧 60 行中文:663 µs → 52 µs。
|
|
69
|
+
*
|
|
70
|
+
* 命中条件必须**宁可误报不可漏报**(误报只是走慢路径,漏报会切错字):
|
|
71
|
+
* - `\u{10000}-\u{10FFFF}`:astral 平面(emoji、区域指示符、肤色修饰符、
|
|
72
|
+
* tag 序列、扩展汉字)。注意**不能**写 `\uD800-\uDFFF`:`u` 模式下那是
|
|
73
|
+
* 「孤立代理项」,合法的 astral 字符(已合成为一个码位)反而匹配不到;
|
|
74
|
+
* - `\u000D`:CRLF 是一个字素簇(`\r\n` 两个 code point);
|
|
75
|
+
* - `\u200C` `\u200D`:ZWNJ / ZWJ(连字与 emoji 家族连接);
|
|
76
|
+
* - `\u1100-\u11FF`:韩文组合字母(`\u1100\u1161\u11A8` 三簇合一);
|
|
77
|
+
* - `\p{M}`:所有组合附加符(拉丁、天城文、阿拉伯文、键帽 U+20E3、
|
|
78
|
+
* 变体选择符 U+FE00-FE0F …)。这一条覆盖不了用枚举列全,必须用 Unicode 属性。
|
|
79
|
+
*/
|
|
80
|
+
const NEEDS_SEGMENTER = /[\u{10000}-\u{10FFFF}\u000D\u200C\u200D\u1100-\u11FF\p{M}]/u;
|
|
81
|
+
export function graphemes(text) {
|
|
82
|
+
if (text === "")
|
|
83
|
+
return [];
|
|
84
|
+
// 每簇就是一个 code point 的普通文本:直接切,省掉整个分词器
|
|
85
|
+
if (!segmenter || !NEEDS_SEGMENTER.test(text))
|
|
86
|
+
return Array.from(text);
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const part of segmenter.segment(text))
|
|
89
|
+
out.push(part.segment);
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
35
92
|
/**
|
|
36
93
|
* 按显示宽度把文本折成多行(保留显式换行)。
|
|
37
|
-
* 拉丁文优先在空格处断行,CJK /
|
|
94
|
+
* 拉丁文优先在空格处断行,CJK / 超长词按**字素簇**硬断;保证每行显示宽度 ≤ limit。
|
|
38
95
|
*/
|
|
39
96
|
export function wrapText(text, limit) {
|
|
40
97
|
const width = Math.max(1, limit);
|
|
@@ -46,8 +103,8 @@ export function wrapText(text, limit) {
|
|
|
46
103
|
}
|
|
47
104
|
let line = "";
|
|
48
105
|
let lineWidth = 0;
|
|
49
|
-
for (const ch of raw) {
|
|
50
|
-
const w =
|
|
106
|
+
for (const ch of graphemes(raw)) {
|
|
107
|
+
const w = clusterWidth(ch);
|
|
51
108
|
if (lineWidth + w > width && line !== "") {
|
|
52
109
|
const space = line.lastIndexOf(" ");
|
|
53
110
|
if (space > 0) {
|
|
@@ -69,12 +126,12 @@ export function wrapText(text, limit) {
|
|
|
69
126
|
return out.length > 0 ? out : [""];
|
|
70
127
|
}
|
|
71
128
|
/**
|
|
72
|
-
* 把输入文本按显示宽度折行,并定位光标(`cursor`
|
|
73
|
-
*
|
|
129
|
+
* 把输入文本按显示宽度折行,并定位光标(`cursor` 为**字素簇**索引)。
|
|
130
|
+
* 折行采用逐簇硬断(不做空格优先),以保证光标映射精确、支持跨行编辑。
|
|
74
131
|
*/
|
|
75
132
|
export function layoutInput(text, cursor, width) {
|
|
76
133
|
const limit = Math.max(1, width);
|
|
77
|
-
const chars =
|
|
134
|
+
const chars = graphemes(text);
|
|
78
135
|
const pos = Math.max(0, Math.min(cursor, chars.length));
|
|
79
136
|
const lines = [];
|
|
80
137
|
let line = "";
|
|
@@ -84,7 +141,7 @@ export function layoutInput(text, cursor, width) {
|
|
|
84
141
|
let cursorRow = 0;
|
|
85
142
|
let cursorCol = 0;
|
|
86
143
|
let processed = 0;
|
|
87
|
-
// 记录「处理完 processed
|
|
144
|
+
// 记录「处理完 processed 个簇后」的光标位置;processed === pos 即为光标处
|
|
88
145
|
const mark = () => {
|
|
89
146
|
if (processed === pos) {
|
|
90
147
|
cursorRow = row;
|
|
@@ -103,7 +160,7 @@ export function layoutInput(text, cursor, width) {
|
|
|
103
160
|
mark();
|
|
104
161
|
continue;
|
|
105
162
|
}
|
|
106
|
-
const w =
|
|
163
|
+
const w = clusterWidth(ch);
|
|
107
164
|
if (col > 0 && lineWidth + w > limit) {
|
|
108
165
|
lines.push(line);
|
|
109
166
|
line = "";
|
|
@@ -124,22 +181,28 @@ export function layoutInput(text, cursor, width) {
|
|
|
124
181
|
/** 单行输入左侧留白:Box paddingX(1) + 提示符 `❯ `(宽 2) */
|
|
125
182
|
export const INPUT_PREFIX_WIDTH = 3;
|
|
126
183
|
/**
|
|
127
|
-
*
|
|
184
|
+
* 判断一段输入是否为「终端上报序列」而非用户输入。
|
|
128
185
|
*
|
|
129
186
|
* 典型来源:
|
|
130
187
|
* - Kitty 键盘协议查询的应答:`CSI ? <flags> u`(Ink 开启 `kittyKeyboard` 时会发 `CSI ? u`);
|
|
131
188
|
* - 光标位置报告(CPR):`CSI <row>;<col> R`;
|
|
132
|
-
* - 设备状态报告:`CSI ? <n> n
|
|
189
|
+
* - 设备状态报告:`CSI ? <n> n`;
|
|
190
|
+
* - 鼠标上报(SGR):`CSI < b ; x ; y M`——滚轮 / 点击 / 拖拽,见 `mouse.ts`。
|
|
133
191
|
*
|
|
134
192
|
* 这类序列本应由 Ink 的解析器整体吞掉。但当它被**拆包**时(前导 ESC 被 Ink 的
|
|
135
193
|
* 「待定转义刷新定时器」当作一次独立的 Escape 键消费),残留在后一个 chunk 里的
|
|
136
194
|
* `[?0u` 会退化成普通文本并被当作输入插入输入框(实测重现)。此处做一层护栏;
|
|
137
195
|
* 根因(不再向终端发查询)已在渲染选项里关闭。
|
|
196
|
+
*
|
|
197
|
+
* 鼠标上报是**主动开启**的(`src/tui/mouse.ts`),且 Ink 会把整条序列当作 `char`
|
|
198
|
+
* 交给 `useInput`,所以这里必须兜住——否则滚一下就往输入框里插一段 `[<64;10;5M`。
|
|
199
|
+
* 注意:需要读滚轮的屏(对话屏)必须**在处理完滚轮之后**再调用本函数。
|
|
138
200
|
*/
|
|
139
201
|
export function isTerminalReply(sequence) {
|
|
140
202
|
return (/^\[\?\d+u$/.test(sequence) || // Kitty 键盘协议应答(CSI ? <flags> u)
|
|
141
203
|
/^\[\d+;\d+R$/.test(sequence) || // 光标位置报告(CSI <row>;<col> R)
|
|
142
|
-
/^\[\?\d+n$/.test(sequence) // 设备状态报告(CSI ? <n> n)
|
|
204
|
+
/^\[\?\d+n$/.test(sequence) || // 设备状态报告(CSI ? <n> n)
|
|
205
|
+
isMouseSequence(sequence) // 鼠标上报(CSI < b ; x ; y M|m)
|
|
143
206
|
);
|
|
144
207
|
}
|
|
145
208
|
/**
|
|
@@ -154,8 +217,8 @@ export function clipWidth(text, max) {
|
|
|
154
217
|
return text;
|
|
155
218
|
let out = "";
|
|
156
219
|
let width = 0;
|
|
157
|
-
for (const ch of text) {
|
|
158
|
-
const w =
|
|
220
|
+
for (const ch of graphemes(text)) {
|
|
221
|
+
const w = clusterWidth(ch);
|
|
159
222
|
if (width + w > limit - 1)
|
|
160
223
|
break; // 预留 1 列给省略号
|
|
161
224
|
out += ch;
|
|
@@ -188,4 +251,15 @@ export function usableFrameRows(terminalRows) {
|
|
|
188
251
|
export function bottomPadding(terminalRows, contentLines) {
|
|
189
252
|
return Math.max(0, usableFrameRows(terminalRows) - Math.max(0, contentLines));
|
|
190
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* 去掉 CwdTrackerPlugin 追加在用户消息末尾的工作目录提示。
|
|
256
|
+
* 该提示是喂给模型的上下文,不该显示给用户。
|
|
257
|
+
*/
|
|
258
|
+
export function stripCwdNote(text) {
|
|
259
|
+
// 两代格式都要认:新(英文 + system-injected 标记)与旧存档里的中文格式。
|
|
260
|
+
// 旧格式不认会把磁盘上已有会话的 cwd 笔记渲染出来。
|
|
261
|
+
return text
|
|
262
|
+
.replace(/\n+\[system-injected: [^\]\n]*\]\nCurrent working directory: [^\n]*$/, "")
|
|
263
|
+
.replace(/\n+(?:\[工作目录变更\]\n)?当前工作目录: [^\n]*$/, "");
|
|
264
|
+
}
|
|
191
265
|
//# sourceMappingURL=text.js.map
|
package/dist/tui/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/theme.d.ts
CHANGED
|
@@ -31,7 +31,13 @@ export interface TextStyle {
|
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* 语法高亮色板 —— 键为 highlight.js 的 scope(`highlight.ts` 已去掉 `hljs-` 前缀),
|
|
34
|
-
* 供工具调用参数(JSON
|
|
34
|
+
* 供工具调用参数(JSON)、围栏代码块与**正文 markdown 源码着色**共用。
|
|
35
|
+
*
|
|
36
|
+
* 约定:
|
|
37
|
+
* - **不写死近白 / 近黑**(如 #e2e8f0 / #000000)——在亮色或暗色终端之一里会看不见字;
|
|
38
|
+
* 无颜色的 token 一律回落到**终端默认前景色**,需要区分时用 `bold` / `italic` / `dim` 等
|
|
39
|
+
* **终端相对属性**(`strong` / `emphasis` / `quote` 即如此)。
|
|
40
|
+
* - 绝对色只用于**强调**(关键字、字符串、标题等),且尽量取中间调。
|
|
35
41
|
*/
|
|
36
42
|
export declare const syntax: Record<string, TextStyle>;
|
|
37
43
|
/** 把 highlight.js 的 scope 映射为具体样式;未知 scope 返回空(沿用基础色) */
|
package/dist/tui/theme.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yBAAyB;AACzB,eAAO,MAAM,KAAK;;;;;;;;;;;;;;CAcjB,CAAC;AAEF,oCAAoC;AACpC,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yBAAyB;AACzB,eAAO,MAAM,KAAK;;;;;;;;;;;;;;CAcjB,CAAC;AAEF,oCAAoC;AACpC,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA6B5C,CAAC;AAEF,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAEpD;AAID,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAOzC;AAED,wBAAgB,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAG5C;AAED,gBAAgB;AAChB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQtE;AAID,sBAAsB;AACtB,eAAO,MAAM,SAAS,EAAE,MAAM,EAO7B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,eAAe,QAA8C,CAAC;AAE3E,wBAAwB;AACxB,eAAO,MAAM,YAAY,EAAE,MAAM,EAAqB,CAAC;AAEvD,yBAAyB;AACzB,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,CAUvF"}
|
package/dist/tui/theme.js
CHANGED
|
@@ -24,7 +24,13 @@ export const theme = {
|
|
|
24
24
|
};
|
|
25
25
|
/**
|
|
26
26
|
* 语法高亮色板 —— 键为 highlight.js 的 scope(`highlight.ts` 已去掉 `hljs-` 前缀),
|
|
27
|
-
* 供工具调用参数(JSON
|
|
27
|
+
* 供工具调用参数(JSON)、围栏代码块与**正文 markdown 源码着色**共用。
|
|
28
|
+
*
|
|
29
|
+
* 约定:
|
|
30
|
+
* - **不写死近白 / 近黑**(如 #e2e8f0 / #000000)——在亮色或暗色终端之一里会看不见字;
|
|
31
|
+
* 无颜色的 token 一律回落到**终端默认前景色**,需要区分时用 `bold` / `italic` / `dim` 等
|
|
32
|
+
* **终端相对属性**(`strong` / `emphasis` / `quote` 即如此)。
|
|
33
|
+
* - 绝对色只用于**强调**(关键字、字符串、标题等),且尽量取中间调。
|
|
28
34
|
*/
|
|
29
35
|
export const syntax = {
|
|
30
36
|
keyword: { color: "#c4b5fd", bold: true },
|
|
@@ -37,8 +43,6 @@ export const syntax = {
|
|
|
37
43
|
attr: { color: "#7dd3fc" },
|
|
38
44
|
attribute: { color: "#7dd3fc" },
|
|
39
45
|
property: { color: "#7dd3fc" },
|
|
40
|
-
variable: { color: "#cbd5e1" },
|
|
41
|
-
params: { color: "#cbd5e1" },
|
|
42
46
|
title: { color: "#fbbf24" },
|
|
43
47
|
function: { color: "#fbbf24" },
|
|
44
48
|
selector: { color: "#fbbf24" },
|
|
@@ -49,6 +53,14 @@ export const syntax = {
|
|
|
49
53
|
meta: { color: "#94a3b8" },
|
|
50
54
|
addition: { color: "#86efac" },
|
|
51
55
|
deletion: { color: "#f87171" },
|
|
56
|
+
// ---- markdown 源码着色(highlight.js 的 markdown 词法)----
|
|
57
|
+
section: { color: "#a78bfa", bold: true }, // 标题(#)
|
|
58
|
+
strong: { bold: true }, // 粗体 **x**(无颜色 → 终端默认前景色 + 加粗)
|
|
59
|
+
emphasis: { italic: true }, // 斜体 *x*
|
|
60
|
+
bullet: { color: "#a78bfa" }, // 列表标记 -
|
|
61
|
+
quote: { dim: true }, // 引用 >(终端相对变暗)
|
|
62
|
+
code: { color: "#7dd3fc" }, // 行内代码 `x`
|
|
63
|
+
link: { color: "#7dd3fc" }, // 链接地址
|
|
52
64
|
};
|
|
53
65
|
/** 把 highlight.js 的 scope 映射为具体样式;未知 scope 返回空(沿用基础色) */
|
|
54
66
|
export function syntaxStyle(scope) {
|
package/dist/tui/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAU;IACjD,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;CACrB,CAAC;AAUF
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAU;IACjD,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;CACrB,CAAC;AAUF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,MAAM,GAA8B;IAC/C,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;IACzC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC9B,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1B,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7B,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5B,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5B,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IACtD,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1B,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC/B,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC9B,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3B,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC9B,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC9B,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IACzB,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1B,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IACjC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC9B,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC9B,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC9B,qDAAqD;IACrD,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ;IACnD,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,+BAA+B;IACvD,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS;IACrC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS;IACvC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,eAAe;IACrC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,WAAW;IACvC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,OAAO;CACpC,CAAC;AAEF,yDAAyD;AACzD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAMD,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/B,OAAO;QACL,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAM;IAClC,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IACtD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,UAAU,CAAC,KAAwB,EAAE,CAAS;IAC5D,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IACrB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,uDAAuD;AAEvD,sBAAsB;AACtB,MAAM,CAAC,MAAM,SAAS,GAAa;IACjC,2CAA2C;IAC3C,2CAA2C;IAC3C,2CAA2C;IAC3C,2CAA2C;IAC3C,2CAA2C;IAC3C,2CAA2C;CAC5C,CAAC;AAEF,oBAAoB;AACpB,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE3E,wBAAwB;AACxB,MAAM,CAAC,MAAM,YAAY,GAAa,CAAC,cAAc,CAAC,CAAC;AAEvD,yBAAyB;AACzB,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,OAAO,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAe,EAAE,KAAK,GAAG,CAAC;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAC3B,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,EAAE,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;QAC1E,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 生成过程的 token 速率统计 —— 纯逻辑,不依赖 React / Ink / SDK
|
|
3
|
+
*
|
|
4
|
+
* 需求是「每秒接收多少 token」,而 SDK 只在**每个请求的最后一个 chunk** 才给出
|
|
5
|
+
* `usage`(`stream_options.include_usage`),拿不到逐 token 的用量。所以这里分两路:
|
|
6
|
+
*
|
|
7
|
+
* - **实时速率**:按增量字符估算 token,用 2 秒滑动窗口算(`live`)。它必须靠估算,
|
|
8
|
+
* 否则要等一整轮结束才有数字,就谈不上「实时」;
|
|
9
|
+
* - **本轮平均**:一轮结束时优先用真实 `completion_tokens`(累加多轮工具调用),
|
|
10
|
+
* 除以「首字 → 末字」的时间跨度(`average`)。这段时间不含开头的等待首字。
|
|
11
|
+
*
|
|
12
|
+
* 两者口径不同,展示上也分开(生成中显示实时,结束后显示本轮平均)——把估算值
|
|
13
|
+
* 和精确值混成一个数字才是真的误导。
|
|
14
|
+
*/
|
|
15
|
+
/** 实时速率的滑动窗口:取值越小越「跳」,越大越迟钝 */
|
|
16
|
+
export declare const LIVE_WINDOW_MS = 2000;
|
|
17
|
+
/** 计算速率的最小时间跨度:太短会把「首包爆发」放大成离谱的高速率 */
|
|
18
|
+
export declare const MIN_SPAN_MS = 400;
|
|
19
|
+
/**
|
|
20
|
+
* 按字符估算 token 数(浮点,调用方决定何时取整)。
|
|
21
|
+
*
|
|
22
|
+
* 权重取值依据:中文/全角约 0.7 token 一个字(DeepSeek / GLM 系分词器实测区间
|
|
23
|
+
* 0.6~0.8),其余非空白字符约 0.25(≈4 字符一个 token),空白约 0.1(多半与前词
|
|
24
|
+
* 合并,但不为零)。这是**估算**,用于实时速率;精确值一律以 `usage` 为准。
|
|
25
|
+
*/
|
|
26
|
+
export declare function estimateTokens(text: string): number;
|
|
27
|
+
/**
|
|
28
|
+
* 从流式 chunk 里取出「本次新增的输出文本」:正文 + 思考 + 工具参数。
|
|
29
|
+
*
|
|
30
|
+
* 三者都是模型实打实吐出来的 token,只统计正文会低估(尤其推理模型的思考段)。
|
|
31
|
+
*/
|
|
32
|
+
export declare function deltaText(chunk: any): string;
|
|
33
|
+
/** 一次快照:生成中看 `live`,结束后看 `average` */
|
|
34
|
+
export interface RateSample {
|
|
35
|
+
/** 实时速率(token/秒,最近窗口估算);无数据时为 null */
|
|
36
|
+
live: number | null;
|
|
37
|
+
/** 本轮平均速率(token/秒,优先真实 usage);一轮未结束时为 null */
|
|
38
|
+
average: number | null;
|
|
39
|
+
/** 本轮是否仍在生成 */
|
|
40
|
+
running: boolean;
|
|
41
|
+
}
|
|
42
|
+
/** 无数据的快照(状态栏据此不显示速率段) */
|
|
43
|
+
export declare const IDLE_RATE: RateSample;
|
|
44
|
+
/**
|
|
45
|
+
* 速率统计器。
|
|
46
|
+
*
|
|
47
|
+
* 生命周期由调用方驱动:`begin()`(一轮开始)→ 若干个 `addDelta()` / `addExact()`
|
|
48
|
+
* → `finish()`(一轮结束)。时间一律可注入,便于单测不依赖真实时钟。
|
|
49
|
+
*/
|
|
50
|
+
export declare class TokenRateMeter {
|
|
51
|
+
private samples;
|
|
52
|
+
/** 估算的累计输出 token */
|
|
53
|
+
private estimated;
|
|
54
|
+
/** 真实 `completion_tokens` 累加(多轮工具调用逐轮相加) */
|
|
55
|
+
private exact;
|
|
56
|
+
private startedAt;
|
|
57
|
+
private firstOutputAt;
|
|
58
|
+
private lastOutputAt;
|
|
59
|
+
private finished;
|
|
60
|
+
private averageValue;
|
|
61
|
+
/** 一轮开始:清空上一轮的所有状态 */
|
|
62
|
+
begin(now?: number): void;
|
|
63
|
+
/** 收到一段增量文本:累加估算 token 并打点 */
|
|
64
|
+
addDelta(text: string, now?: number): void;
|
|
65
|
+
/** 收到真实用量(流末 chunk 的 `usage.completion_tokens`),多轮累加 */
|
|
66
|
+
addExact(completionTokens: number | undefined | null): void;
|
|
67
|
+
/**
|
|
68
|
+
* 一轮结束:算本轮平均速率。
|
|
69
|
+
*
|
|
70
|
+
* 分子优先用真实 `completion_tokens`;分母是「首字 → 末字」的跨度,即真正在接收
|
|
71
|
+
* 内容的那段时间 —— 不含开头的排队等首字,也避免把整轮的思考停顿算成慢。
|
|
72
|
+
*/
|
|
73
|
+
finish(now?: number): void;
|
|
74
|
+
/** 当前快照(供状态栏直接渲染) */
|
|
75
|
+
snapshot(now?: number): RateSample;
|
|
76
|
+
/** 清空(退出 / 重建会话时调用) */
|
|
77
|
+
reset(): void;
|
|
78
|
+
/** 最近窗口的估算速率;窗口内没动静时返回 0(停顿本来就该显示 0,而不是上一秒的高值) */
|
|
79
|
+
private liveRate;
|
|
80
|
+
/** 丢掉窗口外的采样(保留一个窗口起点之前的锚点,用于算基准值) */
|
|
81
|
+
private trim;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=token-rate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-rate.d.ts","sourceRoot":"","sources":["../../src/tui/token-rate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,+BAA+B;AAC/B,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,sCAAsC;AACtC,eAAO,MAAM,WAAW,MAAM,CAAC;AAK/B;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAqB5C;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,0BAA0B;AAC1B,eAAO,MAAM,SAAS,EAAE,UAA0D,CAAC;AASnF;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAgB;IAC/B,oBAAoB;IACpB,OAAO,CAAC,SAAS,CAAK;IACtB,4CAA4C;IAC5C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAuB;IAE3C,sBAAsB;IACtB,KAAK,CAAC,GAAG,GAAE,MAAmB,GAAG,IAAI;IAWrC,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI;IAWtD,wDAAwD;IACxD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI;IAM3D;;;;;OAKG;IACH,MAAM,CAAC,GAAG,GAAE,MAAmB,GAAG,IAAI;IAatC,qBAAqB;IACrB,QAAQ,CAAC,GAAG,GAAE,MAAmB,GAAG,UAAU;IAM9C,uBAAuB;IACvB,KAAK,IAAI,IAAI;IAWb,kDAAkD;IAClD,OAAO,CAAC,QAAQ;IAkBhB,qCAAqC;IACrC,OAAO,CAAC,IAAI;CASb"}
|