@ai-zen/cli 1.0.0-alpha.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1340 -269
- package/LICENSE +21 -0
- package/README.md +136 -31
- package/README.zh.md +136 -31
- package/dist/agent-creator.d.ts +11 -0
- package/dist/agent-creator.d.ts.map +1 -1
- package/dist/agent-creator.js +50 -20
- package/dist/agent-creator.js.map +1 -1
- package/dist/agent-switch.d.ts +61 -0
- package/dist/agent-switch.d.ts.map +1 -0
- package/dist/agent-switch.js +83 -0
- package/dist/agent-switch.js.map +1 -0
- package/dist/agents-store.d.ts +6 -1
- package/dist/agents-store.d.ts.map +1 -1
- package/dist/agents-store.js +46 -4
- package/dist/agents-store.js.map +1 -1
- package/dist/auto-migrate-confirm.d.ts +43 -0
- package/dist/auto-migrate-confirm.d.ts.map +1 -0
- package/dist/auto-migrate-confirm.js +47 -0
- package/dist/auto-migrate-confirm.js.map +1 -0
- package/dist/clipboard.d.ts +68 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +177 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/config-editor.d.ts +42 -5
- package/dist/config-editor.d.ts.map +1 -1
- package/dist/config-editor.js +80 -27
- package/dist/config-editor.js.map +1 -1
- package/dist/config.d.ts +76 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +143 -39
- package/dist/config.js.map +1 -1
- package/dist/conversation-commands/registry.d.ts +127 -4
- package/dist/conversation-commands/registry.d.ts.map +1 -1
- package/dist/conversation-commands/registry.js +93 -14
- package/dist/conversation-commands/registry.js.map +1 -1
- package/dist/conversation-persist-plugin.d.ts +0 -1
- package/dist/conversation-persist-plugin.d.ts.map +1 -1
- package/dist/conversation-persist-plugin.js +7 -16
- package/dist/conversation-persist-plugin.js.map +1 -1
- package/dist/conversation-repository.d.ts +79 -18
- package/dist/conversation-repository.d.ts.map +1 -1
- package/dist/conversation-repository.js +96 -30
- package/dist/conversation-repository.js.map +1 -1
- package/dist/cwd-tracker-plugin.d.ts.map +1 -1
- package/dist/cwd-tracker-plugin.js +22 -7
- package/dist/cwd-tracker-plugin.js.map +1 -1
- package/dist/format-time.d.ts +17 -6
- package/dist/format-time.d.ts.map +1 -1
- package/dist/format-time.js +32 -14
- package/dist/format-time.js.map +1 -1
- package/dist/handoff-service.d.ts +19 -0
- package/dist/handoff-service.d.ts.map +1 -0
- package/dist/handoff-service.js +85 -0
- package/dist/handoff-service.js.map +1 -0
- package/dist/hook.d.ts.map +1 -1
- package/dist/hook.js +69 -15
- package/dist/hook.js.map +1 -1
- package/dist/i18n/en-wizard.d.ts +8 -0
- package/dist/i18n/en-wizard.d.ts.map +1 -0
- package/dist/i18n/en-wizard.js +303 -0
- package/dist/i18n/en-wizard.js.map +1 -0
- package/dist/i18n/en.d.ts +7 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +245 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +57 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/preferences.d.ts +37 -0
- package/dist/i18n/preferences.d.ts.map +1 -0
- package/dist/i18n/preferences.js +73 -0
- package/dist/i18n/preferences.js.map +1 -0
- package/dist/i18n/zh-wizard.d.ts +11 -0
- package/dist/i18n/zh-wizard.d.ts.map +1 -0
- package/dist/i18n/zh-wizard.js +306 -0
- package/dist/i18n/zh-wizard.js.map +1 -0
- package/dist/i18n/zh.d.ts +10 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +249 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/index.js +52 -23
- package/dist/index.js.map +1 -1
- package/dist/mcp-command.d.ts +32 -0
- package/dist/mcp-command.d.ts.map +1 -0
- package/dist/mcp-command.js +37 -0
- package/dist/mcp-command.js.map +1 -0
- package/dist/mode.d.ts +31 -4
- package/dist/mode.d.ts.map +1 -1
- package/dist/mode.js +42 -7
- package/dist/mode.js.map +1 -1
- package/dist/model-switch.d.ts +58 -0
- package/dist/model-switch.d.ts.map +1 -0
- package/dist/model-switch.js +62 -0
- package/dist/model-switch.js.map +1 -0
- package/dist/reasoning-effort.d.ts +96 -0
- package/dist/reasoning-effort.d.ts.map +1 -0
- package/dist/reasoning-effort.js +164 -0
- package/dist/reasoning-effort.js.map +1 -0
- package/dist/reasoning-presets.d.ts +34 -0
- package/dist/reasoning-presets.d.ts.map +1 -0
- package/dist/reasoning-presets.js +85 -0
- package/dist/reasoning-presets.js.map +1 -0
- package/dist/sdk-log.d.ts +84 -0
- package/dist/sdk-log.d.ts.map +1 -0
- package/dist/sdk-log.js +167 -0
- package/dist/sdk-log.js.map +1 -0
- package/dist/session-pointer.d.ts.map +1 -1
- package/dist/session-pointer.js +10 -4
- package/dist/session-pointer.js.map +1 -1
- package/dist/stdio-runner.d.ts.map +1 -1
- package/dist/stdio-runner.js +32 -30
- package/dist/stdio-runner.js.map +1 -1
- package/dist/sub-agent-guard-plugin.d.ts +10 -7
- package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
- package/dist/sub-agent-guard-plugin.js +12 -9
- package/dist/sub-agent-guard-plugin.js.map +1 -1
- package/dist/tui/chat-history.d.ts +29 -0
- package/dist/tui/chat-history.d.ts.map +1 -0
- package/dist/tui/chat-history.js +55 -0
- package/dist/tui/chat-history.js.map +1 -0
- package/dist/tui/chat-session.d.ts +144 -13
- package/dist/tui/chat-session.d.ts.map +1 -1
- package/dist/tui/chat-session.js +312 -73
- package/dist/tui/chat-session.js.map +1 -1
- package/dist/tui/components.d.ts +109 -6
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +177 -12
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/config-wizard/detail.d.ts +18 -10
- package/dist/tui/config-wizard/detail.d.ts.map +1 -1
- package/dist/tui/config-wizard/detail.js +53 -46
- package/dist/tui/config-wizard/detail.js.map +1 -1
- package/dist/tui/config-wizard/engine.d.ts +2 -2
- package/dist/tui/config-wizard/engine.d.ts.map +1 -1
- package/dist/tui/config-wizard/engine.js +48 -26
- package/dist/tui/config-wizard/engine.js.map +1 -1
- package/dist/tui/config-wizard/fields.d.ts +3 -1
- package/dist/tui/config-wizard/fields.d.ts.map +1 -1
- package/dist/tui/config-wizard/fields.js +202 -167
- package/dist/tui/config-wizard/fields.js.map +1 -1
- package/dist/tui/config-wizard/frame.js +1 -1
- package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/kv-editor.js +13 -5
- package/dist/tui/config-wizard/kv-editor.js.map +1 -1
- package/dist/tui/config-wizard/list.d.ts +3 -1
- package/dist/tui/config-wizard/list.d.ts.map +1 -1
- package/dist/tui/config-wizard/list.js +4 -4
- package/dist/tui/config-wizard/list.js.map +1 -1
- package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
- package/dist/tui/config-wizard/mcp-helpers.js +4 -3
- package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
- package/dist/tui/config-wizard/menu.d.ts.map +1 -1
- package/dist/tui/config-wizard/menu.js +33 -21
- package/dist/tui/config-wizard/menu.js.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.d.ts +8 -1
- package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.js +11 -7
- package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
- package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
- package/dist/tui/config-wizard/prompt.js +8 -7
- package/dist/tui/config-wizard/prompt.js.map +1 -1
- package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-agents.js +50 -29
- package/dist/tui/config-wizard/step-agents.js.map +1 -1
- package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-defaults.js +77 -27
- package/dist/tui/config-wizard/step-defaults.js.map +1 -1
- package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-endpoints.js +27 -14
- package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
- package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-mcp.js +29 -25
- package/dist/tui/config-wizard/step-mcp.js.map +1 -1
- package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-models.js +98 -43
- package/dist/tui/config-wizard/step-models.js.map +1 -1
- package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
- package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
- package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-simple.js +18 -17
- package/dist/tui/config-wizard/step-simple.js.map +1 -1
- package/dist/tui/config-wizard/types.d.ts +31 -3
- package/dist/tui/config-wizard/types.d.ts.map +1 -1
- package/dist/tui/config-wizard/types.js.map +1 -1
- package/dist/tui/file-index.d.ts +38 -0
- package/dist/tui/file-index.d.ts.map +1 -0
- package/dist/tui/file-index.js +117 -0
- package/dist/tui/file-index.js.map +1 -0
- package/dist/tui/index.d.ts +17 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +105 -49
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/input-editing.d.ts +52 -0
- package/dist/tui/input-editing.d.ts.map +1 -0
- package/dist/tui/input-editing.js +91 -0
- package/dist/tui/input-editing.js.map +1 -0
- package/dist/tui/key-debug.d.ts +62 -0
- package/dist/tui/key-debug.d.ts.map +1 -0
- package/dist/tui/key-debug.js +92 -0
- package/dist/tui/key-debug.js.map +1 -0
- package/dist/tui/mention.d.ts +47 -0
- package/dist/tui/mention.d.ts.map +1 -0
- package/dist/tui/mention.js +152 -0
- package/dist/tui/mention.js.map +1 -0
- package/dist/tui/mouse.d.ts +55 -0
- package/dist/tui/mouse.d.ts.map +1 -0
- package/dist/tui/mouse.js +74 -0
- package/dist/tui/mouse.js.map +1 -0
- package/dist/tui/phase.d.ts +64 -0
- package/dist/tui/phase.d.ts.map +1 -0
- package/dist/tui/phase.js +112 -0
- package/dist/tui/phase.js.map +1 -0
- package/dist/tui/screens/agent-tabs.d.ts +53 -0
- package/dist/tui/screens/agent-tabs.d.ts.map +1 -0
- package/dist/tui/screens/agent-tabs.js +81 -0
- package/dist/tui/screens/agent-tabs.js.map +1 -0
- package/dist/tui/screens/chat-commands.d.ts +78 -1
- package/dist/tui/screens/chat-commands.d.ts.map +1 -1
- package/dist/tui/screens/chat-commands.js +688 -157
- package/dist/tui/screens/chat-commands.js.map +1 -1
- package/dist/tui/screens/chat.d.ts +57 -1
- package/dist/tui/screens/chat.d.ts.map +1 -1
- package/dist/tui/screens/chat.js +751 -265
- package/dist/tui/screens/chat.js.map +1 -1
- package/dist/tui/screens/common-keys.d.ts +36 -0
- package/dist/tui/screens/common-keys.d.ts.map +1 -0
- package/dist/tui/screens/common-keys.js +67 -0
- package/dist/tui/screens/common-keys.js.map +1 -0
- package/dist/tui/screens/frame-buffer.d.ts.map +1 -1
- package/dist/tui/screens/frame-buffer.js.map +1 -1
- package/dist/tui/screens/handoff-choice.d.ts +37 -0
- package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
- package/dist/tui/screens/handoff-choice.js +42 -0
- package/dist/tui/screens/handoff-choice.js.map +1 -0
- package/dist/tui/screens/index.d.ts +7 -5
- package/dist/tui/screens/index.d.ts.map +1 -1
- package/dist/tui/screens/index.js +6 -5
- package/dist/tui/screens/index.js.map +1 -1
- package/dist/tui/screens/input-row.d.ts +64 -0
- package/dist/tui/screens/input-row.d.ts.map +1 -0
- package/dist/tui/screens/input-row.js +67 -0
- package/dist/tui/screens/input-row.js.map +1 -0
- package/dist/tui/screens/input.d.ts +77 -1
- package/dist/tui/screens/input.d.ts.map +1 -1
- package/dist/tui/screens/input.js +125 -8
- package/dist/tui/screens/input.js.map +1 -1
- package/dist/tui/screens/layout.d.ts +49 -0
- package/dist/tui/screens/layout.d.ts.map +1 -1
- package/dist/tui/screens/layout.js +45 -7
- package/dist/tui/screens/layout.js.map +1 -1
- package/dist/tui/screens/lines.d.ts +7 -0
- package/dist/tui/screens/lines.d.ts.map +1 -1
- package/dist/tui/screens/lines.js +6 -6
- package/dist/tui/screens/lines.js.map +1 -1
- package/dist/tui/screens/messages-view.d.ts +20 -1
- package/dist/tui/screens/messages-view.d.ts.map +1 -1
- package/dist/tui/screens/messages-view.js +55 -8
- package/dist/tui/screens/messages-view.js.map +1 -1
- package/dist/tui/screens/notice-bar.d.ts +5 -0
- package/dist/tui/screens/notice-bar.d.ts.map +1 -0
- package/dist/tui/screens/notice-bar.js +21 -0
- package/dist/tui/screens/notice-bar.js.map +1 -0
- package/dist/tui/screens/notice.d.ts +44 -10
- package/dist/tui/screens/notice.d.ts.map +1 -1
- package/dist/tui/screens/notice.js +75 -15
- package/dist/tui/screens/notice.js.map +1 -1
- package/dist/tui/screens/overlays.d.ts.map +1 -1
- package/dist/tui/screens/overlays.js +4 -3
- package/dist/tui/screens/overlays.js.map +1 -1
- package/dist/tui/screens/render.d.ts +1 -1
- package/dist/tui/screens/render.d.ts.map +1 -1
- package/dist/tui/screens/render.js +18 -11
- package/dist/tui/screens/render.js.map +1 -1
- package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
- package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
- package/dist/tui/screens/use-chat-viewport.js +50 -0
- package/dist/tui/screens/use-chat-viewport.js.map +1 -0
- package/dist/tui/screens/use-input-editing.d.ts +69 -0
- package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
- package/dist/tui/screens/use-input-editing.js +220 -0
- package/dist/tui/screens/use-input-editing.js.map +1 -0
- package/dist/tui/screens/use-overlays.d.ts +25 -0
- package/dist/tui/screens/use-overlays.d.ts.map +1 -0
- package/dist/tui/screens/use-overlays.js +32 -0
- package/dist/tui/screens/use-overlays.js.map +1 -0
- package/dist/tui/screens/use-wizard-host.d.ts +46 -0
- package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
- package/dist/tui/screens/use-wizard-host.js +123 -0
- package/dist/tui/screens/use-wizard-host.js.map +1 -0
- package/dist/tui/screens/welcome.d.ts +12 -0
- package/dist/tui/screens/welcome.d.ts.map +1 -0
- package/dist/tui/screens/welcome.js +36 -0
- package/dist/tui/screens/welcome.js.map +1 -0
- package/dist/tui/status-segments.d.ts +37 -0
- package/dist/tui/status-segments.d.ts.map +1 -0
- package/dist/tui/status-segments.js +166 -0
- package/dist/tui/status-segments.js.map +1 -0
- package/dist/tui/text.d.ts +22 -7
- package/dist/tui/text.d.ts.map +1 -1
- package/dist/tui/text.js +110 -39
- package/dist/tui/text.js.map +1 -1
- package/dist/tui/theme.d.ts +2 -0
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +2 -0
- package/dist/tui/theme.js.map +1 -1
- package/dist/tui/token-rate.d.ts +83 -0
- package/dist/tui/token-rate.d.ts.map +1 -0
- package/dist/tui/token-rate.js +195 -0
- package/dist/tui/token-rate.js.map +1 -0
- package/dist/types.d.ts +7 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/user-content.d.ts +41 -0
- package/dist/user-content.d.ts.map +1 -0
- package/dist/user-content.js +37 -0
- package/dist/user-content.js.map +1 -0
- package/dist/version-compare.d.ts +37 -0
- package/dist/version-compare.d.ts.map +1 -0
- package/dist/version-compare.js +105 -0
- package/dist/version-compare.js.map +1 -0
- package/dist/version.js.map +1 -1
- package/package.json +7 -5
- package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
- package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
- package/dist/auto-migrate-confirm-plugin.js +0 -61
- package/dist/auto-migrate-confirm-plugin.js.map +0 -1
- package/dist/migration-service.d.ts +0 -15
- package/dist/migration-service.d.ts.map +0 -1
- package/dist/migration-service.js +0 -59
- package/dist/migration-service.js.map +0 -1
- package/dist/tui/screens/splash.d.ts +0 -5
- package/dist/tui/screens/splash.d.ts.map +0 -1
- package/dist/tui/screens/splash.js +0 -51
- package/dist/tui/screens/splash.js.map +0 -1
|
@@ -1,12 +1,43 @@
|
|
|
1
1
|
/** 输入区文本折行(不含提示符 `❯ `,交由渲染层补齐);空输入用占位提示 */
|
|
2
2
|
export declare function inputLines(text: string, columns: number): string[];
|
|
3
|
+
/** 输入区最多占用几行(超出的折行开窗滚动,不把对话区挤没) */
|
|
4
|
+
export declare const INPUT_MAX_ROWS = 8;
|
|
5
|
+
/**
|
|
6
|
+
* 输入区可见窗口:总行数 + 光标所在行 → `[from, to)`。
|
|
7
|
+
*
|
|
8
|
+
* 窗口**跟随光标**(而不是固定显示末尾 N 行):`←` 在行首会退到上一行,光标能一路
|
|
9
|
+
* 退到第一行 —— 钉住末尾的窗口会让光标“消失”在框外。光标所在行恒为窗口**末行**
|
|
10
|
+
* (除非已贴底),于是往上走时窗口连续上滚。
|
|
11
|
+
*
|
|
12
|
+
* 三处必须同源:`computeChatLayout` 的 `inputHeight`、渲染的 `slice(from, to)`、
|
|
13
|
+
* 硬件光标 y 里的行内偏移(`cursorRow − from`)。
|
|
14
|
+
*/
|
|
15
|
+
export declare function inputWindow(total: number, cursorRow: number, max?: number): {
|
|
16
|
+
from: number;
|
|
17
|
+
to: number;
|
|
18
|
+
};
|
|
3
19
|
/**
|
|
4
20
|
* 计算终端硬件光标坐标(相对 Ink 输出原点),用于让 IME(输入法)候选框
|
|
5
|
-
* 跟随编辑光标。x 为列、y
|
|
21
|
+
* 跟随编辑光标。x 为列、y 为行(0 起始,从整帧第一行算起)。
|
|
22
|
+
*
|
|
23
|
+
* y 必须把输入行**上方渲染的全部行**算进去,顺序与 `chat.tsx` 的渲染顺序严格一致:
|
|
24
|
+
*
|
|
25
|
+
* 对话区(`layout.lines`)→ Agent 栏目 → 通知栏(`noticeLines`)→ 附件提示行
|
|
26
|
+
* → 斜杠 / `@` 菜单(`hints`)→ 分隔线 → 输入行
|
|
27
|
+
*
|
|
28
|
+
* 漏算任何一段,硬件光标就会整体偏移那么多行(Ink 的 `moveUp = 总行数 − y`,
|
|
29
|
+
* 所以 y 少几行,光标就高几行)。历史上「通知栏」就被漏过:`/help` 这类多行通知
|
|
30
|
+
* 一出现,IME 候选框会浮到输入行上方好几行。
|
|
6
31
|
*/
|
|
7
32
|
export declare function computeInputCursorPosition(input: {
|
|
8
33
|
/** 对话区行数(输入区之前的行偏移基数) */
|
|
9
34
|
transcriptLines: number;
|
|
35
|
+
/** Agent 栏目行数(位于对话区与通知栏之间;不传视为 0) */
|
|
36
|
+
agentTabCount?: number;
|
|
37
|
+
/** 通知栏行数(位于对话区与斜杠菜单之间;不传视为 0) */
|
|
38
|
+
noticeCount?: number;
|
|
39
|
+
/** 待发送附件提示行数(位于通知栏与菜单之间;不传视为 0) */
|
|
40
|
+
attachmentCount?: number;
|
|
10
41
|
/** 斜杠命令菜单行数 */
|
|
11
42
|
hintCount: number;
|
|
12
43
|
/** 光标在输入框内的行 / 列(列以 code point 计) */
|
|
@@ -20,10 +51,55 @@ export declare function computeInputCursorPosition(input: {
|
|
|
20
51
|
x: number;
|
|
21
52
|
y: number;
|
|
22
53
|
};
|
|
54
|
+
/**
|
|
55
|
+
* 光标上 / 下一行后的字素簇下标;已在首行按 ↑、或在末行按 ↓ 时返回 `null`。
|
|
56
|
+
*
|
|
57
|
+
* 「行」是**折行后的行**(含软折行),不是按 `\n` 切的物理行 —— 长段落在窄窗口里会被
|
|
58
|
+
* 拆成多行,用户看到的就是多行,光标必须跟着视觉行移动。宽度必须与实际渲染一致
|
|
59
|
+
* (`layoutInput` 的 `width`),否则会跨行/落错列。
|
|
60
|
+
*
|
|
61
|
+
* 列位置:目标行更短时落到行尾(与主流编辑器一致);光标不会因此跳到相邻行。
|
|
62
|
+
*/
|
|
63
|
+
export declare function moveCursorRow(text: string, cursor: number, width: number, dir: -1 | 1): number | null;
|
|
23
64
|
/** 是否为「单词字符」:ASCII 下为字母/数字/下划线,非 ASCII(CJK 等)一律算单词字符 */
|
|
24
65
|
export declare function isWordChar(ch: string): boolean;
|
|
25
66
|
/** 向左跨词后的光标位置(跳过分隔符与单词,停在词首) */
|
|
26
67
|
export declare function wordLeft(text: string, cursor: number): number;
|
|
27
68
|
/** 向右跨词后的光标位置(跳过单词与分隔符,停在词尾) */
|
|
28
69
|
export declare function wordRight(text: string, cursor: number): number;
|
|
70
|
+
/**
|
|
71
|
+
* 向左删一个词(Ctrl+W / Alt+Backspace):删掉光标前的分隔符与单词。
|
|
72
|
+
* 返回删除后的文本与光标位置 —— 光标原地不动,只是前面的内容被吃掉。
|
|
73
|
+
*/
|
|
74
|
+
export declare function deleteWordLeft(text: string, cursor: number): {
|
|
75
|
+
text: string;
|
|
76
|
+
cursor: number;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* 向右删一个词(Alt+D / Ctrl+Delete):删掉光标后的分隔符与单词。
|
|
80
|
+
* 光标不动,后面的内容被吃掉。
|
|
81
|
+
*/
|
|
82
|
+
export declare function deleteWordRight(text: string, cursor: number): {
|
|
83
|
+
text: string;
|
|
84
|
+
cursor: number;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* 删到行首(Ctrl+U):删掉光标到本行开头(不含换行符)的内容。
|
|
88
|
+
*
|
|
89
|
+
* 语义与 readline 的 unix-line-discard / 主流 TUI 保持一致。注意 macOS 上
|
|
90
|
+
* iTerm2 与 Terminal.app 会把 `Cmd+Backspace` 映射成 `Ctrl+U` —— 若此处做成
|
|
91
|
+
* 「清空整个输入框」,Mac 用户按 ⌘⌫ 会丢掉全部草稿(多行输入时尤其致命)。
|
|
92
|
+
*/
|
|
93
|
+
export declare function deleteToLineStart(text: string, cursor: number): {
|
|
94
|
+
text: string;
|
|
95
|
+
cursor: number;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* 删到行尾(Ctrl+K):删掉光标到本行末尾(不含换行符)的内容;
|
|
99
|
+
* 若光标已在行尾,则连该换行符一起删掉(与 readline 的 kill-line 一致)。
|
|
100
|
+
*/
|
|
101
|
+
export declare function deleteToLineEnd(text: string, cursor: number): {
|
|
102
|
+
text: string;
|
|
103
|
+
cursor: number;
|
|
104
|
+
};
|
|
29
105
|
//# sourceMappingURL=input.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/input.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/input.ts"],"names":[],"mappings":"AAMA,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIlE;AAED,mCAAmC;AACnC,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,GAAG,SAAiB,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAI9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,yBAAyB;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAgB3B;AAID;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GACV,MAAM,GAAG,IAAI,CAMf;AAID,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAK9C;AAED,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,gCAAgC;AAChC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM9D;AASD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQ7F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQ9F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAShG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAU9F"}
|
|
@@ -1,26 +1,77 @@
|
|
|
1
1
|
// 由 src/tui/screens.tsx 拆分而来 —— 输入区折行 / 硬件光标 / 跨词移动
|
|
2
|
-
import { displayWidth, layoutInput, INPUT_PREFIX_WIDTH } from "../text.js";
|
|
2
|
+
import { displayWidth, graphemes, layoutInput, INPUT_PREFIX_WIDTH } from "../text.js";
|
|
3
|
+
import { t } from "../../i18n/index.js";
|
|
3
4
|
// ==================== 对话屏布局(吸底)====================
|
|
4
5
|
/** 输入区文本折行(不含提示符 `❯ `,交由渲染层补齐);空输入用占位提示 */
|
|
5
6
|
export function inputLines(text, columns) {
|
|
6
7
|
const width = Math.max(4, columns - 4);
|
|
7
|
-
const body = text.length > 0 ? text : "
|
|
8
|
+
const body = text.length > 0 ? text : t("input.placeholder");
|
|
8
9
|
return layoutInput(body, 0, width).lines;
|
|
9
10
|
}
|
|
11
|
+
/** 输入区最多占用几行(超出的折行开窗滚动,不把对话区挤没) */
|
|
12
|
+
export const INPUT_MAX_ROWS = 8;
|
|
13
|
+
/**
|
|
14
|
+
* 输入区可见窗口:总行数 + 光标所在行 → `[from, to)`。
|
|
15
|
+
*
|
|
16
|
+
* 窗口**跟随光标**(而不是固定显示末尾 N 行):`←` 在行首会退到上一行,光标能一路
|
|
17
|
+
* 退到第一行 —— 钉住末尾的窗口会让光标“消失”在框外。光标所在行恒为窗口**末行**
|
|
18
|
+
* (除非已贴底),于是往上走时窗口连续上滚。
|
|
19
|
+
*
|
|
20
|
+
* 三处必须同源:`computeChatLayout` 的 `inputHeight`、渲染的 `slice(from, to)`、
|
|
21
|
+
* 硬件光标 y 里的行内偏移(`cursorRow − from`)。
|
|
22
|
+
*/
|
|
23
|
+
export function inputWindow(total, cursorRow, max = INPUT_MAX_ROWS) {
|
|
24
|
+
const size = Math.min(total, Math.max(1, max));
|
|
25
|
+
const from = Math.min(Math.max(0, cursorRow - size + 1), Math.max(0, total - size));
|
|
26
|
+
return { from, to: from + size };
|
|
27
|
+
}
|
|
10
28
|
/**
|
|
11
29
|
* 计算终端硬件光标坐标(相对 Ink 输出原点),用于让 IME(输入法)候选框
|
|
12
|
-
* 跟随编辑光标。x 为列、y
|
|
30
|
+
* 跟随编辑光标。x 为列、y 为行(0 起始,从整帧第一行算起)。
|
|
31
|
+
*
|
|
32
|
+
* y 必须把输入行**上方渲染的全部行**算进去,顺序与 `chat.tsx` 的渲染顺序严格一致:
|
|
33
|
+
*
|
|
34
|
+
* 对话区(`layout.lines`)→ Agent 栏目 → 通知栏(`noticeLines`)→ 附件提示行
|
|
35
|
+
* → 斜杠 / `@` 菜单(`hints`)→ 分隔线 → 输入行
|
|
36
|
+
*
|
|
37
|
+
* 漏算任何一段,硬件光标就会整体偏移那么多行(Ink 的 `moveUp = 总行数 − y`,
|
|
38
|
+
* 所以 y 少几行,光标就高几行)。历史上「通知栏」就被漏过:`/help` 这类多行通知
|
|
39
|
+
* 一出现,IME 候选框会浮到输入行上方好几行。
|
|
13
40
|
*/
|
|
14
41
|
export function computeInputCursorPosition(input) {
|
|
15
42
|
const before = input.placeholder
|
|
16
43
|
? ""
|
|
17
|
-
:
|
|
44
|
+
: graphemes(input.lineText).slice(0, input.cursorCol).join("");
|
|
18
45
|
return {
|
|
19
46
|
x: INPUT_PREFIX_WIDTH + displayWidth(before),
|
|
20
|
-
// 对话区 + 斜杠菜单 + 分隔线 + 输入行内偏移
|
|
21
|
-
y: input.transcriptLines +
|
|
47
|
+
// 对话区 + Agent 栏目 + 通知栏 + 附件提示行 + 斜杠菜单 + 分隔线 + 输入行内偏移
|
|
48
|
+
y: input.transcriptLines +
|
|
49
|
+
(input.agentTabCount ?? 0) +
|
|
50
|
+
(input.noticeCount ?? 0) +
|
|
51
|
+
(input.attachmentCount ?? 0) +
|
|
52
|
+
input.hintCount +
|
|
53
|
+
1 +
|
|
54
|
+
input.cursorRow,
|
|
22
55
|
};
|
|
23
56
|
}
|
|
57
|
+
// ==================== 上下移动光标(↑ / ↓)====================
|
|
58
|
+
/**
|
|
59
|
+
* 光标上 / 下一行后的字素簇下标;已在首行按 ↑、或在末行按 ↓ 时返回 `null`。
|
|
60
|
+
*
|
|
61
|
+
* 「行」是**折行后的行**(含软折行),不是按 `\n` 切的物理行 —— 长段落在窄窗口里会被
|
|
62
|
+
* 拆成多行,用户看到的就是多行,光标必须跟着视觉行移动。宽度必须与实际渲染一致
|
|
63
|
+
* (`layoutInput` 的 `width`),否则会跨行/落错列。
|
|
64
|
+
*
|
|
65
|
+
* 列位置:目标行更短时落到行尾(与主流编辑器一致);光标不会因此跳到相邻行。
|
|
66
|
+
*/
|
|
67
|
+
export function moveCursorRow(text, cursor, width, dir) {
|
|
68
|
+
const layout = layoutInput(text, cursor, width);
|
|
69
|
+
const target = layout.cursorRow + dir;
|
|
70
|
+
if (target < 0 || target >= layout.lines.length)
|
|
71
|
+
return null;
|
|
72
|
+
const col = Math.min(layout.cursorCol, graphemes(layout.lines[target]).length);
|
|
73
|
+
return layout.rowStarts[target] + col;
|
|
74
|
+
}
|
|
24
75
|
// ==================== 跨词移动(Ctrl/Alt + ← →)====================
|
|
25
76
|
/** 是否为「单词字符」:ASCII 下为字母/数字/下划线,非 ASCII(CJK 等)一律算单词字符 */
|
|
26
77
|
export function isWordChar(ch) {
|
|
@@ -33,7 +84,7 @@ export function isWordChar(ch) {
|
|
|
33
84
|
}
|
|
34
85
|
/** 向左跨词后的光标位置(跳过分隔符与单词,停在词首) */
|
|
35
86
|
export function wordLeft(text, cursor) {
|
|
36
|
-
const chars =
|
|
87
|
+
const chars = graphemes(text);
|
|
37
88
|
let i = Math.max(0, Math.min(cursor, chars.length));
|
|
38
89
|
while (i > 0 && !isWordChar(chars[i - 1]))
|
|
39
90
|
i -= 1;
|
|
@@ -43,7 +94,7 @@ export function wordLeft(text, cursor) {
|
|
|
43
94
|
}
|
|
44
95
|
/** 向右跨词后的光标位置(跳过单词与分隔符,停在词尾) */
|
|
45
96
|
export function wordRight(text, cursor) {
|
|
46
|
-
const chars =
|
|
97
|
+
const chars = graphemes(text);
|
|
47
98
|
let i = Math.max(0, Math.min(cursor, chars.length));
|
|
48
99
|
while (i < chars.length && !isWordChar(chars[i]))
|
|
49
100
|
i += 1;
|
|
@@ -51,4 +102,70 @@ export function wordRight(text, cursor) {
|
|
|
51
102
|
i += 1;
|
|
52
103
|
return i;
|
|
53
104
|
}
|
|
105
|
+
// ==================== 按词删除(Ctrl+W / Alt+Backspace、Alt+D / Ctrl+Delete)====================
|
|
106
|
+
/** 光标钳制到 [0, len](按 code point 计) */
|
|
107
|
+
function clampCursor(chars, cursor) {
|
|
108
|
+
return Math.max(0, Math.min(cursor, chars.length));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 向左删一个词(Ctrl+W / Alt+Backspace):删掉光标前的分隔符与单词。
|
|
112
|
+
* 返回删除后的文本与光标位置 —— 光标原地不动,只是前面的内容被吃掉。
|
|
113
|
+
*/
|
|
114
|
+
export function deleteWordLeft(text, cursor) {
|
|
115
|
+
const chars = graphemes(text);
|
|
116
|
+
const cp = clampCursor(chars, cursor);
|
|
117
|
+
const from = wordLeft(text, cp);
|
|
118
|
+
return {
|
|
119
|
+
text: chars.slice(0, from).join("") + chars.slice(cp).join(""),
|
|
120
|
+
cursor: from,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 向右删一个词(Alt+D / Ctrl+Delete):删掉光标后的分隔符与单词。
|
|
125
|
+
* 光标不动,后面的内容被吃掉。
|
|
126
|
+
*/
|
|
127
|
+
export function deleteWordRight(text, cursor) {
|
|
128
|
+
const chars = graphemes(text);
|
|
129
|
+
const cp = clampCursor(chars, cursor);
|
|
130
|
+
const to = wordRight(text, cp);
|
|
131
|
+
return {
|
|
132
|
+
text: chars.slice(0, cp).join("") + chars.slice(to).join(""),
|
|
133
|
+
cursor: cp,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 删到行首(Ctrl+U):删掉光标到本行开头(不含换行符)的内容。
|
|
138
|
+
*
|
|
139
|
+
* 语义与 readline 的 unix-line-discard / 主流 TUI 保持一致。注意 macOS 上
|
|
140
|
+
* iTerm2 与 Terminal.app 会把 `Cmd+Backspace` 映射成 `Ctrl+U` —— 若此处做成
|
|
141
|
+
* 「清空整个输入框」,Mac 用户按 ⌘⌫ 会丢掉全部草稿(多行输入时尤其致命)。
|
|
142
|
+
*/
|
|
143
|
+
export function deleteToLineStart(text, cursor) {
|
|
144
|
+
const chars = graphemes(text);
|
|
145
|
+
const cp = clampCursor(chars, cursor);
|
|
146
|
+
let from = cp;
|
|
147
|
+
while (from > 0 && chars[from - 1] !== "\n")
|
|
148
|
+
from -= 1;
|
|
149
|
+
return {
|
|
150
|
+
text: chars.slice(0, from).join("") + chars.slice(cp).join(""),
|
|
151
|
+
cursor: from,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 删到行尾(Ctrl+K):删掉光标到本行末尾(不含换行符)的内容;
|
|
156
|
+
* 若光标已在行尾,则连该换行符一起删掉(与 readline 的 kill-line 一致)。
|
|
157
|
+
*/
|
|
158
|
+
export function deleteToLineEnd(text, cursor) {
|
|
159
|
+
const chars = graphemes(text);
|
|
160
|
+
const cp = clampCursor(chars, cursor);
|
|
161
|
+
let to = cp;
|
|
162
|
+
while (to < chars.length && chars[to] !== "\n")
|
|
163
|
+
to += 1;
|
|
164
|
+
if (to === cp && chars[cp] === "\n")
|
|
165
|
+
to += 1;
|
|
166
|
+
return {
|
|
167
|
+
text: chars.slice(0, cp).join("") + chars.slice(to).join(""),
|
|
168
|
+
cursor: cp,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
54
171
|
//# sourceMappingURL=input.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/tui/screens/input.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/tui/screens/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { RLine } from "./lines.js";
|
|
2
2
|
/** 确认框固定高度(外 marginTop 1 + 上下边框 2 + 问题 1 + marginTop 1 + 选项 1) */
|
|
3
3
|
export declare const CONFIRM_LINES = 6;
|
|
4
|
+
/** 底部状态栏行数下限:模型/Agent 一行 + 用量与速率一行(宽度不够时会折成更多行,
|
|
5
|
+
* 实际值由 `statusBarRows()` 量出后传入 `computeChatLayout({ statusBarLines })`) */
|
|
6
|
+
export declare const STATUS_BAR_LINES = 2;
|
|
4
7
|
/** 选择覆盖层高度(相对条目数) */
|
|
5
8
|
export declare function pickerLines(itemCount: number): number;
|
|
9
|
+
/** Agent 栏目行数:只有「存在子 Agent」时才出现,且恒为一行(超出宽度由组件截断) */
|
|
10
|
+
export declare const AGENT_TABS_LINES = 1;
|
|
6
11
|
export interface ChatLayoutInput {
|
|
7
12
|
columns: number;
|
|
8
13
|
rows: number;
|
|
@@ -13,10 +18,38 @@ export interface ChatLayoutInput {
|
|
|
13
18
|
hintCount: number;
|
|
14
19
|
/** 通知栏行数(notice / error 独立栏位),缺省 0 */
|
|
15
20
|
noticeCount?: number;
|
|
21
|
+
/**
|
|
22
|
+
* 待发送附件行数(粘贴图片的提示行,位于通知栏与菜单之间)。
|
|
23
|
+
* 与 `noticeCount` / `agentTabLines` 同类:多算或少算一行,输入框就会整体位移,
|
|
24
|
+
* 硬件光标(IME)也跟着偏。缺省 0。
|
|
25
|
+
*/
|
|
26
|
+
attachmentLines?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Agent 栏目行数(主 / 子 Agent 切换条,位于对话区与底栏之间)。
|
|
29
|
+
* 无子 Agent 时为 0(不占位);缺省 0。
|
|
30
|
+
*/
|
|
31
|
+
agentTabLines?: number;
|
|
16
32
|
overlay: "none" | "confirm" | "picker";
|
|
17
33
|
pickerItems: number;
|
|
18
34
|
/** 视口顶部行索引(相对整个对话行);null / undefined = 贴底(自动跟随最新) */
|
|
19
35
|
viewTop?: number | null;
|
|
36
|
+
/**
|
|
37
|
+
* 状态栏实际占据的行数(由 `statusBarRows()` 实测得出 —— 它会随终端宽度折行)。
|
|
38
|
+
* 缺省用 `STATUS_BAR_LINES`。
|
|
39
|
+
*/
|
|
40
|
+
statusBarLines?: number;
|
|
41
|
+
/**
|
|
42
|
+
* 内容不足一屏时,余量怎么分。
|
|
43
|
+
*
|
|
44
|
+
* 缺省 `bottom`:余量全部补在头部,内容贴底(对话屏的常规行为——最新一行的
|
|
45
|
+
* 下沿永远紧挨分隔线)。
|
|
46
|
+
*
|
|
47
|
+
* `center`:余量上下均分,内容落在对话区垂直中部 —— 只用于空对话的欢迎块
|
|
48
|
+
* (否则 6 行 logo + 标语只能贴顶或贴底,两个位置都不好看)。
|
|
49
|
+
*
|
|
50
|
+
* 内容超出一屏时该参数无效(此时两侧都没有余量)。
|
|
51
|
+
*/
|
|
52
|
+
anchor?: "bottom" | "center";
|
|
20
53
|
}
|
|
21
54
|
export interface ChatLayout {
|
|
22
55
|
/** 对话区(含顶部补齐空行),行数恒为 `rows - bottomLines` */
|
|
@@ -25,6 +58,14 @@ export interface ChatLayout {
|
|
|
25
58
|
bottomLines: number;
|
|
26
59
|
/** 对话框总行数(未截取前) */
|
|
27
60
|
totalLines: number;
|
|
61
|
+
/**
|
|
62
|
+
* 菜单**实际**占用的行数(`min(想吃, 剩余空间)`)。
|
|
63
|
+
*
|
|
64
|
+
* 渲染(`BottomMenu.maxRows`)与硬件光标(`computeInputCursorPosition` 的
|
|
65
|
+
* `hintCount`)都必须从这里取,不许自己另算 —— 三处差一行,输入框与 IME 候选框
|
|
66
|
+
* 就会整体偏移(历史事故:通知栏被漏算)。
|
|
67
|
+
*/
|
|
68
|
+
hintRows: number;
|
|
28
69
|
/** 对话区可用高度(已扣除底部区域) */
|
|
29
70
|
budget: number;
|
|
30
71
|
/** 本次实际生效的视口顶部索引 */
|
|
@@ -32,6 +73,14 @@ export interface ChatLayout {
|
|
|
32
73
|
/** 是否处于滚动状态(视口未贴底,下方仍有更新的内容) */
|
|
33
74
|
scrolled: boolean;
|
|
34
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* 把「想要的视口顶部」钳制成合法值:下限 0、上限 `totalLines - budget`。
|
|
78
|
+
*
|
|
79
|
+
* 返回 `null` 表示**已贴底**(视口顶恰好等于最大顶,或内容不足一屏)—— 调用方据此
|
|
80
|
+
* 清掉滚动状态,让视口重新跟随最新内容。所有滚动动作(翻页 / 按行 / 鼠标滚轮)都
|
|
81
|
+
* 走这一个函数,越界方向自然被吃掉,不会出现「滚过头回不来」。
|
|
82
|
+
*/
|
|
83
|
+
export declare function clampViewTop(totalLines: number, budget: number, nextTop: number): number | null;
|
|
35
84
|
/**
|
|
36
85
|
* 计算对话屏布局:底部区域高度固定后,把「对话行」按视口截取到可用高度,顶部用空行
|
|
37
86
|
* 补齐 —— 使整帧高度恒等于传入的 `rows`(调用方以 `usableFrameRows()` 预留末行),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,kEAAkE;AAClE,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,qBAAqB;AACrB,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,kEAAkE;AAClE,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B;4EAC4E;AAC5E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,qBAAqB;AACrB,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI/F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAkDpE"}
|
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
import { inputLines } from "./input.js";
|
|
1
|
+
import { inputLines, INPUT_MAX_ROWS } from "./input.js";
|
|
2
2
|
/** 确认框固定高度(外 marginTop 1 + 上下边框 2 + 问题 1 + marginTop 1 + 选项 1) */
|
|
3
3
|
export const CONFIRM_LINES = 6;
|
|
4
|
+
/** 底部状态栏行数下限:模型/Agent 一行 + 用量与速率一行(宽度不够时会折成更多行,
|
|
5
|
+
* 实际值由 `statusBarRows()` 量出后传入 `computeChatLayout({ statusBarLines })`) */
|
|
6
|
+
export const STATUS_BAR_LINES = 2;
|
|
4
7
|
/** 选择覆盖层高度(相对条目数) */
|
|
5
8
|
export function pickerLines(itemCount) {
|
|
6
9
|
return 7 + itemCount;
|
|
7
10
|
}
|
|
11
|
+
/** Agent 栏目行数:只有「存在子 Agent」时才出现,且恒为一行(超出宽度由组件截断) */
|
|
12
|
+
export const AGENT_TABS_LINES = 1;
|
|
13
|
+
/**
|
|
14
|
+
* 把「想要的视口顶部」钳制成合法值:下限 0、上限 `totalLines - budget`。
|
|
15
|
+
*
|
|
16
|
+
* 返回 `null` 表示**已贴底**(视口顶恰好等于最大顶,或内容不足一屏)—— 调用方据此
|
|
17
|
+
* 清掉滚动状态,让视口重新跟随最新内容。所有滚动动作(翻页 / 按行 / 鼠标滚轮)都
|
|
18
|
+
* 走这一个函数,越界方向自然被吃掉,不会出现「滚过头回不来」。
|
|
19
|
+
*/
|
|
20
|
+
export function clampViewTop(totalLines, budget, nextTop) {
|
|
21
|
+
const maxTop = Math.max(0, totalLines - budget);
|
|
22
|
+
const clamped = Math.max(0, Math.min(maxTop, nextTop));
|
|
23
|
+
return clamped >= maxTop ? null : clamped;
|
|
24
|
+
}
|
|
8
25
|
/**
|
|
9
26
|
* 计算对话屏布局:底部区域高度固定后,把「对话行」按视口截取到可用高度,顶部用空行
|
|
10
27
|
* 补齐 —— 使整帧高度恒等于传入的 `rows`(调用方以 `usableFrameRows()` 预留末行),
|
|
@@ -15,26 +32,47 @@ export function pickerLines(itemCount) {
|
|
|
15
32
|
*/
|
|
16
33
|
export function computeChatLayout(input) {
|
|
17
34
|
const transcript = input.transcript;
|
|
18
|
-
|
|
35
|
+
// 输入区限高:多出来的折行由窗口滚动,而不是把对话区挤空(窗口跟随光标)
|
|
36
|
+
const inputHeight = input.busy ? 1 : Math.min(inputLines(input.input, input.columns).length, INPUT_MAX_ROWS);
|
|
19
37
|
const overlayHeight = input.overlay === "confirm"
|
|
20
38
|
? CONFIRM_LINES
|
|
21
39
|
: input.overlay === "picker"
|
|
22
40
|
? pickerLines(input.pickerItems)
|
|
23
41
|
: 0;
|
|
24
42
|
const noticeCount = input.noticeCount ?? 0;
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
43
|
+
const attachmentLines = input.attachmentLines ?? 0;
|
|
44
|
+
const agentTabLines = input.agentTabLines ?? 0;
|
|
45
|
+
const statusBarLines = Math.max(1, input.statusBarLines ?? STATUS_BAR_LINES);
|
|
46
|
+
/** 菜单之外、恒占的底部行(含输入框与状态栏) */
|
|
47
|
+
const fixedBottom = agentTabLines /* Agent 栏目 */ +
|
|
48
|
+
noticeCount /* 通知栏 */ +
|
|
49
|
+
attachmentLines /* 附件提示行 */ +
|
|
50
|
+
1 /* 分隔线 */ +
|
|
51
|
+
inputHeight +
|
|
52
|
+
statusBarLines;
|
|
53
|
+
/**
|
|
54
|
+
* 菜单能吃多少行:输入框上方到屏幕顶端的**全部**剩余空间,不设固定行数上限 ——
|
|
55
|
+
* 放不下的候选由 `BottomMenu` 从顶端丢弃(滚动窗口)。
|
|
56
|
+
*
|
|
57
|
+
* 覆盖层(确认 / 选择器)整块替换输入区时菜单不参与布局,故归零。
|
|
58
|
+
*/
|
|
59
|
+
const hintRows = input.overlay === "none"
|
|
60
|
+
? Math.min(Math.max(0, input.hintCount), Math.max(0, input.rows - fixedBottom))
|
|
61
|
+
: 0;
|
|
62
|
+
const bottomLines = input.overlay === "none" ? fixedBottom + hintRows : overlayHeight + statusBarLines;
|
|
28
63
|
const budget = Math.max(0, input.rows - bottomLines);
|
|
29
64
|
const totalLines = transcript.length;
|
|
30
65
|
const maxTop = Math.max(0, totalLines - budget);
|
|
31
66
|
const top = input.viewTop == null ? maxTop : Math.min(Math.max(0, input.viewTop), maxTop);
|
|
32
67
|
const viewLines = transcript.slice(top, top + budget);
|
|
33
|
-
const
|
|
68
|
+
const slack = Math.max(0, budget - viewLines.length);
|
|
69
|
+
const padTop = input.anchor === "center" ? Math.floor(slack / 2) : slack;
|
|
70
|
+
const padBottom = slack - padTop;
|
|
34
71
|
const lines = [
|
|
35
72
|
...Array.from({ length: padTop }, (_, i) => ({ key: `pad-${i}`, kind: "gap", text: " " })),
|
|
36
73
|
...viewLines,
|
|
74
|
+
...Array.from({ length: padBottom }, (_, i) => ({ key: `tail-${i}`, kind: "gap", text: " " })),
|
|
37
75
|
];
|
|
38
|
-
return { lines, bottomLines, totalLines, budget, viewTop: top, scrolled: top < maxTop };
|
|
76
|
+
return { lines, bottomLines, totalLines, budget, viewTop: top, scrolled: top < maxTop, hintRows };
|
|
39
77
|
}
|
|
40
78
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/tui/screens/layout.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/tui/screens/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,13 @@ export interface RLine {
|
|
|
13
13
|
text: string;
|
|
14
14
|
/** 着色分段;`text` 恒为这些分段的纯文本拼接(便于测试与裁剪) */
|
|
15
15
|
spans?: Span[];
|
|
16
|
+
/**
|
|
17
|
+
* 整行划删除线。
|
|
18
|
+
*
|
|
19
|
+
* 目前只有一种来源:消息被标了 `omit`(已剔除出上下文,不会再发给模型)。
|
|
20
|
+
* 划掉而不是隐藏 —— 消息凭空消失会让人以为丢了内容,划掉则明确表示「还在,但已出列」。
|
|
21
|
+
*/
|
|
22
|
+
struck?: boolean;
|
|
16
23
|
}
|
|
17
24
|
/** 缩进 2 列后的可用文本宽度 */
|
|
18
25
|
export declare function innerWidth(columns: number): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/lines.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,aAAa,GACb,WAAW,GACX,WAAW,GACX,WAAW,GACX,MAAM,GACN,SAAS,GACT,QAAQ,GACR,OAAO,CAAC;AAEZ,gDAAgD;AAChD,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,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,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/lines.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,aAAa,GACb,WAAW,GACX,WAAW,GACX,WAAW,GACX,MAAM,GACN,SAAS,GACT,QAAQ,GACR,OAAO,CAAC;AAEZ,gDAAgD;AAChD,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,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,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAqB;AACrB,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAE7F;AAuHD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAsB5D;AAED,oCAAoC;AACpC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAE1E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAS5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAsB9F"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// 行渲染原语 —— 折行 / 语法高亮 / 裁剪(与「渲染来源」解耦,纯函数)
|
|
2
|
-
import { wrapText, displayWidth } from "../text.js";
|
|
2
|
+
import { wrapText, displayWidth, clusterWidth, graphemes } from "../text.js";
|
|
3
3
|
import { theme, syntaxStyle } from "../theme.js";
|
|
4
4
|
import { highlightCode, highlightJson, splitFences } from "../highlight.js";
|
|
5
5
|
/** 缩进 2 列后的可用文本宽度 */
|
|
@@ -33,7 +33,7 @@ function splitTokenLines(tokens) {
|
|
|
33
33
|
function toCells(spans) {
|
|
34
34
|
const cells = [];
|
|
35
35
|
for (const s of spans) {
|
|
36
|
-
for (const ch of s.text) {
|
|
36
|
+
for (const ch of graphemes(s.text)) {
|
|
37
37
|
cells.push({ ch, color: s.color, dim: s.dim, bold: s.bold, italic: s.italic });
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -77,7 +77,7 @@ function wrapSpans(spans, limit, preferSpace = false) {
|
|
|
77
77
|
lastSpace = -1;
|
|
78
78
|
};
|
|
79
79
|
for (const cell of cells) {
|
|
80
|
-
const w =
|
|
80
|
+
const w = clusterWidth(cell.ch);
|
|
81
81
|
if (row.length && width + w > max) {
|
|
82
82
|
if (preferSpace && lastSpace > 0) {
|
|
83
83
|
// 在最近的空格处断开:空格及其右侧内容折到下一行
|
|
@@ -85,7 +85,7 @@ function wrapSpans(spans, limit, preferSpace = false) {
|
|
|
85
85
|
const tail = row.slice(lastSpace + 1);
|
|
86
86
|
reset();
|
|
87
87
|
row = tail;
|
|
88
|
-
width = tail.reduce((sum, c) => sum +
|
|
88
|
+
width = tail.reduce((sum, c) => sum + clusterWidth(c.ch), 0);
|
|
89
89
|
for (let i = tail.length - 1; i >= 0; i -= 1) {
|
|
90
90
|
if (tail[i].ch === " ") {
|
|
91
91
|
lastSpace = i;
|
|
@@ -117,8 +117,8 @@ export function clipSpans(spans, max) {
|
|
|
117
117
|
let width = 0;
|
|
118
118
|
for (const span of spans) {
|
|
119
119
|
let text = "";
|
|
120
|
-
for (const ch of span.text) {
|
|
121
|
-
const w =
|
|
120
|
+
for (const ch of graphemes(span.text)) {
|
|
121
|
+
const w = clusterWidth(ch);
|
|
122
122
|
if (width + w > limit - 1) {
|
|
123
123
|
if (text)
|
|
124
124
|
out.push({ ...span, text });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../src/tui/screens/lines.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../src/tui/screens/lines.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,26 @@ import { AgentNS } from "@ai-zen/agents-core";
|
|
|
2
2
|
import { RLine } from "./lines.js";
|
|
3
3
|
/** 从消息内容提取纯文本;非文本块(图片 / 文件)以占位文本表示 */
|
|
4
4
|
export declare function messageText(content: AgentNS.MessageContent | undefined): string;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* 这条消息会不会进入下一轮上下文 —— 与 core `Agent.formatHistory()` 同一判据:
|
|
7
|
+
* `status == undefined || status === Completed`,且未被 `omit`。
|
|
8
|
+
*
|
|
9
|
+
* 策略**不需要**在这里重新推断:`core/Agent.run()` 收尾时已经把策略结算进字段里了
|
|
10
|
+
* (`reconcileAbortedToolRounds()` + `reconcileAbortedMessages()`):
|
|
11
|
+
* - `abortedMessageStrategy: keep` → 有内容的中断消息恢复 `Completed`(进上下文);
|
|
12
|
+
* `drop` → 保持 `Aborted`(不进);
|
|
13
|
+
* - `abortedToolRoundStrategy: fill` → 整轮恢复 `Completed`;`drop` → 整轮 `omit`(不进)。
|
|
14
|
+
* 所以「进不进」读 `status` / `omit` 就是**结果**,渲染层不重复推导策略。
|
|
15
|
+
*/
|
|
16
|
+
export declare function entersContext(message: AgentNS.Message): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 单条消息 → 预折行(不可渲染的消息返回空数组)。
|
|
19
|
+
*
|
|
20
|
+
* - `hidden`:渲染层要求彻底不出现(内部注入 / 占位消息)→ 返回空数组;
|
|
21
|
+
* - **不进上下文**(`!entersContext()`,如中断后按 `drop` 结算的消息、`Error`):
|
|
22
|
+
* 照常渲染、整行划删除线 —— 消息凭空消失会让人以为丢了内容,划掉则明确表示
|
|
23
|
+
* 「还在,但没发给模型」。
|
|
24
|
+
*/
|
|
6
25
|
export declare function messageToLines(message: AgentNS.Message, columns: number): RLine[];
|
|
7
26
|
export declare function cachedMessageToLines(message: AgentNS.Message, columns: number): RLine[];
|
|
8
27
|
/** 整段转录 → 预折行 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages-view.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/messages-view.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAyE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"messages-view.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/messages-view.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAyE,MAAM,YAAY,CAAC;AAI1G,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,MAAM,CAmB/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAG/D;AAaD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAMjF;AAgFD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAOvF;AAED,iBAAiB;AACjB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAIrF"}
|