berry-agent-sdk 0.1.0-alpha.2
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/README.md +78 -0
- package/dist/packages/berry-agent-sdk/src/client.d.ts +6 -0
- package/dist/packages/berry-agent-sdk/src/client.js +59 -0
- package/dist/packages/berry-agent-sdk/src/client.js.map +1 -0
- package/dist/packages/berry-agent-sdk/src/http.d.ts +24 -0
- package/dist/packages/berry-agent-sdk/src/http.js +232 -0
- package/dist/packages/berry-agent-sdk/src/http.js.map +1 -0
- package/dist/packages/berry-agent-sdk/src/index.d.ts +25 -0
- package/dist/packages/berry-agent-sdk/src/index.js +22 -0
- package/dist/packages/berry-agent-sdk/src/index.js.map +1 -0
- package/dist/packages/berry-agent-sdk/src/stdio.d.ts +23 -0
- package/dist/packages/berry-agent-sdk/src/stdio.js +238 -0
- package/dist/packages/berry-agent-sdk/src/stdio.js.map +1 -0
- package/dist/packages/berry-agent-sdk/src/types.d.ts +117 -0
- package/dist/packages/berry-agent-sdk/src/types.js +19 -0
- package/dist/packages/berry-agent-sdk/src/types.js.map +1 -0
- package/dist/src/agent/events.d.ts +11 -0
- package/dist/src/agent/events.js +2 -0
- package/dist/src/agent/events.js.map +1 -0
- package/dist/src/agent/index.d.ts +13 -0
- package/dist/src/agent/index.js +3 -0
- package/dist/src/agent/index.js.map +1 -0
- package/dist/src/agent/loop.d.ts +19 -0
- package/dist/src/agent/loop.js +140 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/queue.d.ts +105 -0
- package/dist/src/agent/queue.js +120 -0
- package/dist/src/agent/queue.js.map +1 -0
- package/dist/src/agent/stream.d.ts +21 -0
- package/dist/src/agent/stream.js +80 -0
- package/dist/src/agent/stream.js.map +1 -0
- package/dist/src/agent/tools-batch.d.ts +49 -0
- package/dist/src/agent/tools-batch.js +222 -0
- package/dist/src/agent/tools-batch.js.map +1 -0
- package/dist/src/agent/types.d.ts +104 -0
- package/dist/src/agent/types.js +9 -0
- package/dist/src/agent/types.js.map +1 -0
- package/dist/src/channels/ask-queue.d.ts +44 -0
- package/dist/src/channels/ask-queue.js +83 -0
- package/dist/src/channels/ask-queue.js.map +1 -0
- package/dist/src/channels/commands.d.ts +56 -0
- package/dist/src/channels/commands.js +130 -0
- package/dist/src/channels/commands.js.map +1 -0
- package/dist/src/channels/engine/cell.d.ts +55 -0
- package/dist/src/channels/engine/cell.js +144 -0
- package/dist/src/channels/engine/cell.js.map +1 -0
- package/dist/src/channels/engine/diff.d.ts +3 -0
- package/dist/src/channels/engine/diff.js +144 -0
- package/dist/src/channels/engine/diff.js.map +1 -0
- package/dist/src/channels/engine/engine.d.ts +151 -0
- package/dist/src/channels/engine/engine.js +417 -0
- package/dist/src/channels/engine/engine.js.map +1 -0
- package/dist/src/channels/engine/index.d.ts +22 -0
- package/dist/src/channels/engine/index.js +9 -0
- package/dist/src/channels/engine/index.js.map +1 -0
- package/dist/src/channels/engine/input-keys.d.ts +39 -0
- package/dist/src/channels/engine/input-keys.js +87 -0
- package/dist/src/channels/engine/input-keys.js.map +1 -0
- package/dist/src/channels/engine/input.d.ts +174 -0
- package/dist/src/channels/engine/input.js +597 -0
- package/dist/src/channels/engine/input.js.map +1 -0
- package/dist/src/channels/engine/memory-io.d.ts +46 -0
- package/dist/src/channels/engine/memory-io.js +72 -0
- package/dist/src/channels/engine/memory-io.js.map +1 -0
- package/dist/src/channels/engine/process-io.d.ts +23 -0
- package/dist/src/channels/engine/process-io.js +39 -0
- package/dist/src/channels/engine/process-io.js.map +1 -0
- package/dist/src/channels/engine/types.d.ts +202 -0
- package/dist/src/channels/engine/types.js +18 -0
- package/dist/src/channels/engine/types.js.map +1 -0
- package/dist/src/channels/engine/width.d.ts +23 -0
- package/dist/src/channels/engine/width.js +123 -0
- package/dist/src/channels/engine/width.js.map +1 -0
- package/dist/src/channels/index.d.ts +25 -0
- package/dist/src/channels/index.js +16 -0
- package/dist/src/channels/index.js.map +1 -0
- package/dist/src/channels/registry.d.ts +33 -0
- package/dist/src/channels/registry.js +57 -0
- package/dist/src/channels/registry.js.map +1 -0
- package/dist/src/channels/sdk/admit.d.ts +32 -0
- package/dist/src/channels/sdk/admit.js +30 -0
- package/dist/src/channels/sdk/admit.js.map +1 -0
- package/dist/src/channels/sdk/backend.d.ts +19 -0
- package/dist/src/channels/sdk/backend.js +103 -0
- package/dist/src/channels/sdk/backend.js.map +1 -0
- package/dist/src/channels/sdk/cursor.d.ts +51 -0
- package/dist/src/channels/sdk/cursor.js +57 -0
- package/dist/src/channels/sdk/cursor.js.map +1 -0
- package/dist/src/channels/sdk/index.d.ts +20 -0
- package/dist/src/channels/sdk/index.js +21 -0
- package/dist/src/channels/sdk/index.js.map +1 -0
- package/dist/src/channels/sdk/jsonl.d.ts +47 -0
- package/dist/src/channels/sdk/jsonl.js +201 -0
- package/dist/src/channels/sdk/jsonl.js.map +1 -0
- package/dist/src/channels/sdk/protocol.d.ts +297 -0
- package/dist/src/channels/sdk/protocol.js +25 -0
- package/dist/src/channels/sdk/protocol.js.map +1 -0
- package/dist/src/channels/sdk/schema.d.ts +12 -0
- package/dist/src/channels/sdk/schema.js +92 -0
- package/dist/src/channels/sdk/schema.js.map +1 -0
- package/dist/src/channels/sdk/wire-core.d.ts +199 -0
- package/dist/src/channels/sdk/wire-core.js +447 -0
- package/dist/src/channels/sdk/wire-core.js.map +1 -0
- package/dist/src/channels/service.d.ts +66 -0
- package/dist/src/channels/service.js +170 -0
- package/dist/src/channels/service.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/autocomplete.d.ts +32 -0
- package/dist/src/channels/tui/autocomplete/autocomplete.js +43 -0
- package/dist/src/channels/tui/autocomplete/autocomplete.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/file-mentions.d.ts +18 -0
- package/dist/src/channels/tui/autocomplete/file-mentions.js +107 -0
- package/dist/src/channels/tui/autocomplete/file-mentions.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/popup.d.ts +47 -0
- package/dist/src/channels/tui/autocomplete/popup.js +149 -0
- package/dist/src/channels/tui/autocomplete/popup.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/provider.d.ts +38 -0
- package/dist/src/channels/tui/autocomplete/provider.js +8 -0
- package/dist/src/channels/tui/autocomplete/provider.js.map +1 -0
- package/dist/src/channels/tui/autocomplete/token.d.ts +22 -0
- package/dist/src/channels/tui/autocomplete/token.js +69 -0
- package/dist/src/channels/tui/autocomplete/token.js.map +1 -0
- package/dist/src/channels/tui/backend/ansi-rows.d.ts +86 -0
- package/dist/src/channels/tui/backend/ansi-rows.js +209 -0
- package/dist/src/channels/tui/backend/ansi-rows.js.map +1 -0
- package/dist/src/channels/tui/backend/main-screen.d.ts +90 -0
- package/dist/src/channels/tui/backend/main-screen.js +208 -0
- package/dist/src/channels/tui/backend/main-screen.js.map +1 -0
- package/dist/src/channels/tui/backend/osc.d.ts +79 -0
- package/dist/src/channels/tui/backend/osc.js +92 -0
- package/dist/src/channels/tui/backend/osc.js.map +1 -0
- package/dist/src/channels/tui/backend/transcript.d.ts +98 -0
- package/dist/src/channels/tui/backend/transcript.js +231 -0
- package/dist/src/channels/tui/backend/transcript.js.map +1 -0
- package/dist/src/channels/tui/backend/tui-backend.d.ts +324 -0
- package/dist/src/channels/tui/backend/tui-backend.js +916 -0
- package/dist/src/channels/tui/backend/tui-backend.js.map +1 -0
- package/dist/src/channels/tui/editor/editor-model.d.ts +141 -0
- package/dist/src/channels/tui/editor/editor-model.js +544 -0
- package/dist/src/channels/tui/editor/editor-model.js.map +1 -0
- package/dist/src/channels/tui/editor/editor-view.d.ts +36 -0
- package/dist/src/channels/tui/editor/editor-view.js +141 -0
- package/dist/src/channels/tui/editor/editor-view.js.map +1 -0
- package/dist/src/channels/tui/editor/editor.d.ts +50 -0
- package/dist/src/channels/tui/editor/editor.js +276 -0
- package/dist/src/channels/tui/editor/editor.js.map +1 -0
- package/dist/src/channels/tui/editor/undo-stack.d.ts +22 -0
- package/dist/src/channels/tui/editor/undo-stack.js +36 -0
- package/dist/src/channels/tui/editor/undo-stack.js.map +1 -0
- package/dist/src/channels/tui/editor/visual-lines.d.ts +39 -0
- package/dist/src/channels/tui/editor/visual-lines.js +127 -0
- package/dist/src/channels/tui/editor/visual-lines.js.map +1 -0
- package/dist/src/channels/tui/editor/word-nav.d.ts +10 -0
- package/dist/src/channels/tui/editor/word-nav.js +107 -0
- package/dist/src/channels/tui/editor/word-nav.js.map +1 -0
- package/dist/src/channels/tui/history/history-viewer.d.ts +133 -0
- package/dist/src/channels/tui/history/history-viewer.js +404 -0
- package/dist/src/channels/tui/history/history-viewer.js.map +1 -0
- package/dist/src/channels/tui/index.d.ts +16 -0
- package/dist/src/channels/tui/index.js +4 -0
- package/dist/src/channels/tui/index.js.map +1 -0
- package/dist/src/channels/tui/markdown/blocks.d.ts +42 -0
- package/dist/src/channels/tui/markdown/blocks.js +112 -0
- package/dist/src/channels/tui/markdown/blocks.js.map +1 -0
- package/dist/src/channels/tui/markdown/inline.d.ts +24 -0
- package/dist/src/channels/tui/markdown/inline.js +76 -0
- package/dist/src/channels/tui/markdown/inline.js.map +1 -0
- package/dist/src/channels/tui/markdown/markdown.d.ts +34 -0
- package/dist/src/channels/tui/markdown/markdown.js +183 -0
- package/dist/src/channels/tui/markdown/markdown.js.map +1 -0
- package/dist/src/channels/tui/memory/memory-viewer.d.ts +235 -0
- package/dist/src/channels/tui/memory/memory-viewer.js +541 -0
- package/dist/src/channels/tui/memory/memory-viewer.js.map +1 -0
- package/dist/src/channels/tui/overlay/alt-screen.d.ts +79 -0
- package/dist/src/channels/tui/overlay/alt-screen.js +106 -0
- package/dist/src/channels/tui/overlay/alt-screen.js.map +1 -0
- package/dist/src/channels/tui/overlay/overlay.d.ts +53 -0
- package/dist/src/channels/tui/overlay/overlay.js +58 -0
- package/dist/src/channels/tui/overlay/overlay.js.map +1 -0
- package/dist/src/channels/tui/overlay/select-confirm.d.ts +73 -0
- package/dist/src/channels/tui/overlay/select-confirm.js +157 -0
- package/dist/src/channels/tui/overlay/select-confirm.js.map +1 -0
- package/dist/src/channels/tui/panels/todo-panel.d.ts +24 -0
- package/dist/src/channels/tui/panels/todo-panel.js +55 -0
- package/dist/src/channels/tui/panels/todo-panel.js.map +1 -0
- package/dist/src/channels/tui/panels/tool-progress-panel.d.ts +37 -0
- package/dist/src/channels/tui/panels/tool-progress-panel.js +94 -0
- package/dist/src/channels/tui/panels/tool-progress-panel.js.map +1 -0
- package/dist/src/channels/tui/scroll/scroll-view.d.ts +96 -0
- package/dist/src/channels/tui/scroll/scroll-view.js +255 -0
- package/dist/src/channels/tui/scroll/scroll-view.js.map +1 -0
- package/dist/src/channels/tui/status/status-line.d.ts +46 -0
- package/dist/src/channels/tui/status/status-line.js +77 -0
- package/dist/src/channels/tui/status/status-line.js.map +1 -0
- package/dist/src/channels/tui/theme.d.ts +27 -0
- package/dist/src/channels/tui/theme.js +42 -0
- package/dist/src/channels/tui/theme.js.map +1 -0
- package/dist/src/channels/types.d.ts +84 -0
- package/dist/src/channels/types.js +12 -0
- package/dist/src/channels/types.js.map +1 -0
- package/dist/src/channels/ui-core.d.ts +80 -0
- package/dist/src/channels/ui-core.js +210 -0
- package/dist/src/channels/ui-core.js.map +1 -0
- package/dist/src/context/codes.d.ts +1 -0
- package/dist/src/context/codes.js +41 -0
- package/dist/src/context/codes.js.map +1 -0
- package/dist/src/context/events.d.ts +62 -0
- package/dist/src/context/events.js +161 -0
- package/dist/src/context/events.js.map +1 -0
- package/dist/src/context/index.d.ts +16 -0
- package/dist/src/context/index.js +14 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/context/logger.d.ts +67 -0
- package/dist/src/context/logger.js +137 -0
- package/dist/src/context/logger.js.map +1 -0
- package/dist/src/context/scope.d.ts +78 -0
- package/dist/src/context/scope.js +183 -0
- package/dist/src/context/scope.js.map +1 -0
- package/dist/src/context/workspace.d.ts +8 -0
- package/dist/src/context/workspace.js +105 -0
- package/dist/src/context/workspace.js.map +1 -0
- package/dist/src/contracts/agent-events.d.ts +73 -0
- package/dist/src/contracts/agent-events.js +17 -0
- package/dist/src/contracts/agent-events.js.map +1 -0
- package/dist/src/contracts/api.d.ts +249 -0
- package/dist/src/contracts/api.js +334 -0
- package/dist/src/contracts/api.js.map +1 -0
- package/dist/src/contracts/approval.d.ts +37 -0
- package/dist/src/contracts/approval.js +10 -0
- package/dist/src/contracts/approval.js.map +1 -0
- package/dist/src/contracts/env-ref.d.ts +41 -0
- package/dist/src/contracts/env-ref.js +33 -0
- package/dist/src/contracts/env-ref.js.map +1 -0
- package/dist/src/contracts/errors.d.ts +56 -0
- package/dist/src/contracts/errors.js +267 -0
- package/dist/src/contracts/errors.js.map +1 -0
- package/dist/src/contracts/events.d.ts +70 -0
- package/dist/src/contracts/events.js +330 -0
- package/dist/src/contracts/events.js.map +1 -0
- package/dist/src/contracts/index.d.ts +32 -0
- package/dist/src/contracts/index.js +27 -0
- package/dist/src/contracts/index.js.map +1 -0
- package/dist/src/contracts/llm.d.ts +278 -0
- package/dist/src/contracts/llm.js +13 -0
- package/dist/src/contracts/llm.js.map +1 -0
- package/dist/src/contracts/messages.d.ts +63 -0
- package/dist/src/contracts/messages.js +66 -0
- package/dist/src/contracts/messages.js.map +1 -0
- package/dist/src/contracts/redact.d.ts +46 -0
- package/dist/src/contracts/redact.js +224 -0
- package/dist/src/contracts/redact.js.map +1 -0
- package/dist/src/contracts/tools.d.ts +198 -0
- package/dist/src/contracts/tools.js +35 -0
- package/dist/src/contracts/tools.js.map +1 -0
- package/dist/src/contracts/types.d.ts +304 -0
- package/dist/src/contracts/types.js +51 -0
- package/dist/src/contracts/types.js.map +1 -0
- package/dist/src/contracts/ui.d.ts +122 -0
- package/dist/src/contracts/ui.js +16 -0
- package/dist/src/contracts/ui.js.map +1 -0
- package/dist/src/sdk/types.d.ts +144 -0
- package/dist/src/sdk/types.js +33 -0
- package/dist/src/sdk/types.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 副屏编舞件(07 §4.1 引擎节件 6(组件与呈现装配件) + §4.3 屏幕模型双形态):AltScreenHost——
|
|
3
|
+
* 备屏 1049 整屏切换的进出编排。
|
|
4
|
+
*
|
|
5
|
+
* 「overlay」专指主屏浮层(OverlayStack);本件是副屏路——件 8 /history
|
|
6
|
+
* 回看器与 06 /memory 的呈现形态(整屏内容值得 1049 备屏切换)。
|
|
7
|
+
*
|
|
8
|
+
* 编舞序(进出对称):
|
|
9
|
+
* - 进:主屏 suspendMain(出屏串 + 卸监听 + pause 流 + raw 复先验)→ 副屏
|
|
10
|
+
* Engine(共享同一 io 实例、screen:'alt-screen')start(1049 备屏进 + raw +
|
|
11
|
+
* 放流——start 的显式放流正是为共享 io 场景补的结构性接缝);
|
|
12
|
+
* - 出:退订转发 → 副屏 dispose(备屏出 + raw 复原 + pause)→ 主屏 resumeMain
|
|
13
|
+
* (进屏串 + raw + 放流 + 全帧重画不走 repaint:停屏期瞬时行靠全帧 + 缓冲
|
|
14
|
+
* 补吐,07 屏模型 / 件 8 条款)→ onReturn 装配钩(树重建等附加动作)。
|
|
15
|
+
*
|
|
16
|
+
* 输入路由切换:共享 io 同一时刻只有一个在听(主屏 suspendMain 已卸监听、
|
|
17
|
+
* 副屏 start 重装)——副屏 input 事件转发 content.handleEvent(回看器键盘滚动)。
|
|
18
|
+
*
|
|
19
|
+
* 鼠标降级接线(2026-09-11 鼠标解码批):open 组合 onMouseLegacy——X10 形首
|
|
20
|
+
* 达(开了 1006 的会话里到达 ⟺ 终端无 SGR 能力,判据可靠)即写 DECRST
|
|
21
|
+
* 1006/1002 关鼠标签听把选区还给终端原生(写序与出屏关序同取先 1006 后
|
|
22
|
+
* 1002)。降级闩 = per-entry:每次 open 新 Engine 新 decoder——重开重新武装、
|
|
23
|
+
* 再吃一次首达(非 SGR 终端上重开 /history 的首个鼠标事件死一次为已知代价)。
|
|
24
|
+
*
|
|
25
|
+
* 构造双注 (primary, io):Engine.io 私有无 getter——装配根同根传两参(io 须与
|
|
26
|
+
* primary 共享同一实例,否则编舞失联)。
|
|
27
|
+
*
|
|
28
|
+
* 批 10f-4 主屏绑收窄:primary 原系 Engine 型——10e 前旧设想残留(主屏
|
|
29
|
+
* TuiBackend 自持输入管线不经 Engine,07 篇屏模型双形态实装对账注)。收窄为
|
|
30
|
+
* AltScreenPrimary 最小宿主介面(本件实际消费面:挂起 / 复起 + 生命周期判定
|
|
31
|
+
* 位);Engine 语义保留给副屏自身的帧管线(生命周期四态仅副屏 Engine 消费)。
|
|
32
|
+
*/
|
|
33
|
+
import { Engine } from '../../engine/index.js';
|
|
34
|
+
/**
|
|
35
|
+
* 副屏宿主:单副屏在场(再 open 拒绝返 null——1049 无嵌套备屏)。
|
|
36
|
+
*/
|
|
37
|
+
export class AltScreenHost {
|
|
38
|
+
primary;
|
|
39
|
+
io;
|
|
40
|
+
engineOptions;
|
|
41
|
+
onReturn;
|
|
42
|
+
alt = null;
|
|
43
|
+
unsubAltInput = null;
|
|
44
|
+
constructor(primary, io, options = {}) {
|
|
45
|
+
this.primary = primary;
|
|
46
|
+
this.io = io;
|
|
47
|
+
this.engineOptions = options.engineOptions;
|
|
48
|
+
this.onReturn = options.onReturn;
|
|
49
|
+
}
|
|
50
|
+
/** 副屏在场态 */
|
|
51
|
+
get isOpen() {
|
|
52
|
+
return this.alt !== null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 进副屏:挂起主屏 → 副屏 Engine 进屏 → 输入转发接线。
|
|
56
|
+
* 拒绝位:已在副屏 / 主屏不在 running 态(无挂起对象)返 null。
|
|
57
|
+
*/
|
|
58
|
+
open(content) {
|
|
59
|
+
if (this.alt !== null)
|
|
60
|
+
return null; // 已在副屏——无嵌套备屏
|
|
61
|
+
if (this.primary.lifecycle !== 'running')
|
|
62
|
+
return null; // 主屏不在场无挂起对象
|
|
63
|
+
this.primary.suspendMain(); // 出主屏(编舞对称的进半场)
|
|
64
|
+
const base = this.engineOptions;
|
|
65
|
+
const alt = new Engine({
|
|
66
|
+
...base,
|
|
67
|
+
io: this.io,
|
|
68
|
+
screen: 'alt-screen',
|
|
69
|
+
// X10 首达降级组合柄:关鼠标签听回终端原生选区 + 链原注入柄(透传面)
|
|
70
|
+
onMouseLegacy: () => {
|
|
71
|
+
this.io.write('\x1b[?1006l\x1b[?1002l'); // DECRST(与出屏关序同取——对称律同序)
|
|
72
|
+
base?.onMouseLegacy?.();
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
alt.start(content); // 1049 备屏进 + 首帧(start 显式放流——共享 io 接缝)
|
|
76
|
+
this.unsubAltInput = alt.on('input', (event) => {
|
|
77
|
+
content.handleEvent(event); // 副屏内容终局消费(回看器键盘滚动)
|
|
78
|
+
});
|
|
79
|
+
this.alt = alt;
|
|
80
|
+
let closed = false;
|
|
81
|
+
return {
|
|
82
|
+
close: () => {
|
|
83
|
+
if (closed)
|
|
84
|
+
return;
|
|
85
|
+
closed = true;
|
|
86
|
+
this.close();
|
|
87
|
+
},
|
|
88
|
+
get closed() {
|
|
89
|
+
return closed;
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** 出副屏(幂等):退订 → 副屏 dispose → 主屏 resume(全帧重画)→ onReturn 钩 */
|
|
94
|
+
close() {
|
|
95
|
+
const alt = this.alt;
|
|
96
|
+
if (alt === null)
|
|
97
|
+
return;
|
|
98
|
+
this.unsubAltInput?.(); // 先退订转发(防 dispose 过程竞发)
|
|
99
|
+
this.unsubAltInput = null;
|
|
100
|
+
this.alt = null;
|
|
101
|
+
alt.dispose(); // 备屏出 + raw 复原 + pause 流
|
|
102
|
+
this.primary.resumeMain(); // 主屏复起 + 全帧重画不走 repaint(07 条款)+ 瞬时行补吐
|
|
103
|
+
this.onReturn?.();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=alt-screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alt-screen.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/overlay/alt-screen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,MAAM,EAAsB,MAAM,uBAAuB,CAAC;AA6BnE;;GAEG;AACH,MAAM,OAAO,aAAa;IACP,OAAO,CAAmB;IAC1B,EAAE,CAAa;IACf,aAAa,CAAmD;IAChE,QAAQ,CAA2B;IAC5C,GAAG,GAAkB,IAAI,CAAC;IAC1B,aAAa,GAAwB,IAAI,CAAC;IAElD,YAAY,OAAyB,EAAE,EAAc,EAAE,UAA4B,EAAE;QACnF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,YAAY;IACZ,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,OAAuB;QAC1B,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,cAAc;QAClD,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,CAAC,aAAa;QACpE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,gBAAgB;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC;YACrB,GAAG,IAAI;YACP,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,YAAY;YACpB,wCAAwC;YACxC,aAAa,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,yBAAyB;gBAClE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;YAC1B,CAAC;SACF,CAAC,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC;QAC1D,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE;YACzD,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB;QAClD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,GAAG,EAAE;gBACV,IAAI,MAAM;oBAAE,OAAO;gBACnB,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YACD,IAAI,MAAM;gBACR,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,4DAA4D;IACpD,KAAK;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO;QACzB,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,wBAAwB;QAChD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAChB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,yBAAyB;QACxC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,sCAAsC;QACjE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 主屏浮层基建(07 §4.1 引擎节件 6(组件与呈现装配件)):OverlayStack——cell 网格局部区浮层。
|
|
3
|
+
*
|
|
4
|
+
* 「overlay」专指主屏浮层(不进 1049 备屏——副屏另名 AltScreenHost):
|
|
5
|
+
* - 栈形多枚并存,栈底先画、栈顶最后画(覆盖序即栈序);
|
|
6
|
+
* - 锚定是函数(拿帧几何自由定位——select / confirm 挂输入框上方等),
|
|
7
|
+
* 返回 region 须在屏内(越界写由缓冲吸收——缓冲兜底,锚定函数自律);
|
|
8
|
+
* - 事件路由模态独占:栈非空时 routeEvent 恒返 true——占焦期间未消费键
|
|
9
|
+
* 不穿透至 UiBackend 三序(07 §4.3 输入路由拦截链条款);
|
|
10
|
+
* - 进出栈经 onChange 通知装配层请求重绘(overlay 是主屏帧的组成段)。
|
|
11
|
+
*/
|
|
12
|
+
import type { CellBuffer, InputEvent, Region, Renderable } from '../../engine/index.js';
|
|
13
|
+
/** 浮层内容协议:可渲染 + 可吃键(占焦模态件的两面) */
|
|
14
|
+
export interface OverlayContent extends Renderable {
|
|
15
|
+
/** 键 / 文本 / IME / 粘贴事件分发(返回是否消费——未消费也不穿透) */
|
|
16
|
+
handleEvent(event: InputEvent): boolean;
|
|
17
|
+
}
|
|
18
|
+
/** 锚定函数(帧几何 → 浮层区域;返回 region 须在屏内——缓冲吸收越界兜底) */
|
|
19
|
+
export type OverlayAnchor = (frame: {
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
}) => Region;
|
|
23
|
+
/** 浮层句柄(两形态共用——主屏浮层与副屏同形接口) */
|
|
24
|
+
export interface OverlayHandle {
|
|
25
|
+
/** 关层(幂等;非栈顶亦可关——按句柄定位移除) */
|
|
26
|
+
close(): void;
|
|
27
|
+
/** 已关态 */
|
|
28
|
+
readonly closed: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 浮层栈:主屏帧的「后画段」与输入路由的「先吃段」。
|
|
32
|
+
*
|
|
33
|
+
* 装配序(每帧):主树 render → renderAll(浮层覆盖其上);
|
|
34
|
+
* 路由序(每键):routeEvent(栈非空短路三序)→ UiBackend 命令 / 队列 / 输入框。
|
|
35
|
+
*/
|
|
36
|
+
export declare class OverlayStack {
|
|
37
|
+
private entries;
|
|
38
|
+
/** 栈变更通知(开 / 关——装配层接重绘请求) */
|
|
39
|
+
onChange?: () => void;
|
|
40
|
+
/** 在场浮层数 */
|
|
41
|
+
get size(): number;
|
|
42
|
+
/** 在场浮层只读快照(栈底→栈顶——装配层量高遍历/测试观测面) */
|
|
43
|
+
get contents(): readonly OverlayContent[];
|
|
44
|
+
/** 开层:压栈 + 返回句柄(幂等关闭归句柄) */
|
|
45
|
+
open(content: OverlayContent, anchor: OverlayAnchor): OverlayHandle;
|
|
46
|
+
/** 浮层渲染(主树渲染后调用——栈底先画、栈顶覆盖) */
|
|
47
|
+
renderAll(buffer: CellBuffer): void;
|
|
48
|
+
/**
|
|
49
|
+
* 事件路由(模态独占):栈顶先吃;**栈非空恒返 true**——未消费键不穿透
|
|
50
|
+
* 至三序(07 §4.3 overlay 占焦条款)。栈空返 false(无浮层归常态路由)。
|
|
51
|
+
*/
|
|
52
|
+
routeEvent(event: InputEvent): boolean;
|
|
53
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浮层栈:主屏帧的「后画段」与输入路由的「先吃段」。
|
|
3
|
+
*
|
|
4
|
+
* 装配序(每帧):主树 render → renderAll(浮层覆盖其上);
|
|
5
|
+
* 路由序(每键):routeEvent(栈非空短路三序)→ UiBackend 命令 / 队列 / 输入框。
|
|
6
|
+
*/
|
|
7
|
+
export class OverlayStack {
|
|
8
|
+
entries = [];
|
|
9
|
+
/** 栈变更通知(开 / 关——装配层接重绘请求) */
|
|
10
|
+
onChange;
|
|
11
|
+
/** 在场浮层数 */
|
|
12
|
+
get size() {
|
|
13
|
+
return this.entries.length;
|
|
14
|
+
}
|
|
15
|
+
/** 在场浮层只读快照(栈底→栈顶——装配层量高遍历/测试观测面) */
|
|
16
|
+
get contents() {
|
|
17
|
+
return this.entries.map((entry) => entry.content);
|
|
18
|
+
}
|
|
19
|
+
/** 开层:压栈 + 返回句柄(幂等关闭归句柄) */
|
|
20
|
+
open(content, anchor) {
|
|
21
|
+
const entry = { content, anchor, closed: false };
|
|
22
|
+
this.entries.push(entry);
|
|
23
|
+
this.onChange?.();
|
|
24
|
+
return {
|
|
25
|
+
close: () => {
|
|
26
|
+
if (entry.closed)
|
|
27
|
+
return;
|
|
28
|
+
entry.closed = true;
|
|
29
|
+
const idx = this.entries.indexOf(entry);
|
|
30
|
+
if (idx >= 0)
|
|
31
|
+
this.entries.splice(idx, 1);
|
|
32
|
+
this.onChange?.();
|
|
33
|
+
},
|
|
34
|
+
get closed() {
|
|
35
|
+
return entry.closed;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** 浮层渲染(主树渲染后调用——栈底先画、栈顶覆盖) */
|
|
40
|
+
renderAll(buffer) {
|
|
41
|
+
for (const entry of this.entries) {
|
|
42
|
+
const region = entry.anchor({ width: buffer.columns, height: buffer.rows });
|
|
43
|
+
entry.content.render(buffer, region);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 事件路由(模态独占):栈顶先吃;**栈非空恒返 true**——未消费键不穿透
|
|
48
|
+
* 至三序(07 §4.3 overlay 占焦条款)。栈空返 false(无浮层归常态路由)。
|
|
49
|
+
*/
|
|
50
|
+
routeEvent(event) {
|
|
51
|
+
const top = this.entries[this.entries.length - 1];
|
|
52
|
+
if (top === undefined)
|
|
53
|
+
return false;
|
|
54
|
+
top.content.handleEvent(event); // 消费与否都在层内终局(不穿透)
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/overlay/overlay.ts"],"names":[],"mappings":"AAqCA;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACf,OAAO,GAAmB,EAAE,CAAC;IACrC,6BAA6B;IAC7B,QAAQ,CAAc;IAEtB,YAAY;IACZ,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,qCAAqC;IACrC,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,OAAuB,EAAE,MAAqB;QACjD,MAAM,KAAK,GAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAClB,OAAO;YACL,KAAK,EAAE,GAAG,EAAE;gBACV,IAAI,KAAK,CAAC,MAAM;oBAAE,OAAO;gBACzB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;gBACpB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,GAAG,IAAI,CAAC;oBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,CAAC;YACD,IAAI,MAAM;gBACR,OAAO,KAAK,CAAC,MAAM,CAAC;YACtB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,SAAS,CAAC,MAAkB;QAC1B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5E,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,KAAiB;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACpC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 一次性问答面板两枚(07 §4.3):select / confirm 的主屏浮层实装。
|
|
3
|
+
*
|
|
4
|
+
* - select:↑/↓ 移动高亮、Enter 选定、Esc 取消收 ''(与撤销面保守值同语义);
|
|
5
|
+
* - confirm:Enter/y 确认 true、Esc/n 取消 false(保守值 = 不动原状态);
|
|
6
|
+
* - 一次性问答不值得整屏切换——主屏浮层形态(挂 OverlayStack,不进 1049);
|
|
7
|
+
* - 面板底先铺空格再写内容(写格覆盖下层浮出内容——不写格的位置会透出
|
|
8
|
+
* 主树文字);
|
|
9
|
+
* - onFinish 单次语义(触发即完成态,后续事件静默——防连按双 resolve);
|
|
10
|
+
* 关层归装配(onFinish 回调里 close 句柄——裸件不持栈引用)。
|
|
11
|
+
*/
|
|
12
|
+
import type { CellBuffer, InputEvent, Region, Renderable } from '../../engine/index.js';
|
|
13
|
+
/** 保守取消值(select——空串与撤销面同语义) */
|
|
14
|
+
export declare const SELECT_CANCELLED = "";
|
|
15
|
+
/** 选项(value 是应答值、label 是呈现、hint 右侧说明段) */
|
|
16
|
+
export interface SelectOption {
|
|
17
|
+
readonly value: string;
|
|
18
|
+
readonly label: string;
|
|
19
|
+
readonly hint?: string;
|
|
20
|
+
}
|
|
21
|
+
/** select 面板选项集 */
|
|
22
|
+
export interface SelectPanelOptions {
|
|
23
|
+
readonly title?: string;
|
|
24
|
+
readonly options: readonly SelectOption[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 选择面板:单选浮层。onFinish 后赋(装配在 open 句柄后接线——闭包里关层)。
|
|
28
|
+
*/
|
|
29
|
+
export declare class SelectPanel implements Renderable {
|
|
30
|
+
/** 完成回调(Enter 选定 value / Esc 取消收 '')——装配接线 */
|
|
31
|
+
onFinish?: (value: string) => void;
|
|
32
|
+
private activeIndex;
|
|
33
|
+
private done;
|
|
34
|
+
private readonly title;
|
|
35
|
+
private readonly options;
|
|
36
|
+
constructor(options: SelectPanelOptions);
|
|
37
|
+
/** 量高:标题(有则 1)+ 选项行数(单行制——不折行,超宽截断归渲染) */
|
|
38
|
+
measure(width: number): number;
|
|
39
|
+
/** 落位:铺底空格 → 标题 → 选项行(高亮反色 + 说明右对齐) */
|
|
40
|
+
render(buffer: CellBuffer, region: Region): void;
|
|
41
|
+
/** 事件分发:完成态静默;↑/↓ 循环移动、Enter 选定、Esc 取消 */
|
|
42
|
+
handleEvent(event: InputEvent): boolean;
|
|
43
|
+
/** 单次完成路(触发后锁完成态) */
|
|
44
|
+
private finish;
|
|
45
|
+
}
|
|
46
|
+
/** confirm 面板配置 */
|
|
47
|
+
export interface ConfirmPanelOptions {
|
|
48
|
+
readonly message: string;
|
|
49
|
+
/** 确认键提示文案(缺省 'enter 确认') */
|
|
50
|
+
readonly confirmHint?: string;
|
|
51
|
+
/** 取消键提示文案(缺省 'esc 取消') */
|
|
52
|
+
readonly cancelHint?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 确认面板:两键问答浮层(Enter/y → true、Esc/n → false——保守值 = 不动原状态)。
|
|
56
|
+
*/
|
|
57
|
+
export declare class ConfirmPanel implements Renderable {
|
|
58
|
+
/** 完成回调——装配接线(同 SelectPanel 形) */
|
|
59
|
+
onFinish?: (confirmed: boolean) => void;
|
|
60
|
+
private done;
|
|
61
|
+
private readonly message;
|
|
62
|
+
private readonly confirmHint;
|
|
63
|
+
private readonly cancelHint;
|
|
64
|
+
constructor(options: ConfirmPanelOptions);
|
|
65
|
+
/** 量高:消息 1 + 键提示 1 */
|
|
66
|
+
measure(width: number): number;
|
|
67
|
+
/** 落位:铺底空格 → 消息 → 键提示(dim) */
|
|
68
|
+
render(buffer: CellBuffer, region: Region): void;
|
|
69
|
+
/** 事件分发:Enter/y 确认、Esc/n 取消(保守值) */
|
|
70
|
+
handleEvent(event: InputEvent): boolean;
|
|
71
|
+
/** 单次完成路 */
|
|
72
|
+
private finish;
|
|
73
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { ACCENT_INDEX } from '../theme.js';
|
|
2
|
+
import { ansiColor } from '../../engine/index.js';
|
|
3
|
+
import { prefixDisplayWidth } from '../editor/visual-lines.js';
|
|
4
|
+
/** 保守取消值(select——空串与撤销面同语义) */
|
|
5
|
+
export const SELECT_CANCELLED = '';
|
|
6
|
+
/** 高亮行样式(整行反色——面板内最强存在感) */
|
|
7
|
+
const ACTIVE_STYLE = Object.freeze({ inverse: true });
|
|
8
|
+
/** 标题样式(accent 定值——theme 单源) */
|
|
9
|
+
const TITLE_STYLE = Object.freeze({ fg: ansiColor(ACCENT_INDEX) });
|
|
10
|
+
/** 说明段样式(dim) */
|
|
11
|
+
const HINT_STYLE = Object.freeze({ dim: true });
|
|
12
|
+
/** 无修饰单字符 / 命名键匹配 */
|
|
13
|
+
function isPlainKey(e, key) {
|
|
14
|
+
return !e.ctrl && !e.alt && !e.shift && !e.meta && e.key === key;
|
|
15
|
+
}
|
|
16
|
+
/** 键事件窄化(其他事件形面板不消费) */
|
|
17
|
+
function asKey(event) {
|
|
18
|
+
return event.kind === 'key' ? event : null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 选择面板:单选浮层。onFinish 后赋(装配在 open 句柄后接线——闭包里关层)。
|
|
22
|
+
*/
|
|
23
|
+
export class SelectPanel {
|
|
24
|
+
/** 完成回调(Enter 选定 value / Esc 取消收 '')——装配接线 */
|
|
25
|
+
onFinish;
|
|
26
|
+
activeIndex = 0;
|
|
27
|
+
done = false;
|
|
28
|
+
title;
|
|
29
|
+
options;
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this.title = options.title;
|
|
32
|
+
this.options = options.options;
|
|
33
|
+
}
|
|
34
|
+
/** 量高:标题(有则 1)+ 选项行数(单行制——不折行,超宽截断归渲染) */
|
|
35
|
+
measure(width) {
|
|
36
|
+
void width; // 高与宽无关(截断不折行)
|
|
37
|
+
return (this.title !== undefined ? 1 : 0) + this.options.length;
|
|
38
|
+
}
|
|
39
|
+
/** 落位:铺底空格 → 标题 → 选项行(高亮反色 + 说明右对齐) */
|
|
40
|
+
render(buffer, region) {
|
|
41
|
+
// 铺底空格(写格覆盖——未写格会透出主树文字)
|
|
42
|
+
for (let r = 0; r < region.height; r++) {
|
|
43
|
+
for (let c = 0; c < region.width; c++) {
|
|
44
|
+
buffer.setCell(region.row + r, region.col + c, ' ');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
let row = region.row;
|
|
48
|
+
if (this.title !== undefined) {
|
|
49
|
+
buffer.writeText(row, region.col, this.title, TITLE_STYLE);
|
|
50
|
+
row += 1;
|
|
51
|
+
}
|
|
52
|
+
for (let i = 0; i < this.options.length; i++, row++) {
|
|
53
|
+
const active = i === this.activeIndex;
|
|
54
|
+
const option = this.options[i];
|
|
55
|
+
// 前缀 + label 段(高亮行整段反色)
|
|
56
|
+
const prefix = active ? '❯ ' : ' ';
|
|
57
|
+
buffer.writeText(row, region.col, `${prefix}${option.label}`, active ? ACTIVE_STYLE : undefined);
|
|
58
|
+
// 说明段右对齐(dim 恒态——不随高亮变脸;按显示宽——CJK 段宽 ≠ 码位数)
|
|
59
|
+
if (option.hint !== undefined && option.hint.length > 0) {
|
|
60
|
+
const hintCols = prefixDisplayWidth(option.hint, option.hint.length);
|
|
61
|
+
buffer.writeText(row, region.col + region.width - hintCols, option.hint, HINT_STYLE);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** 事件分发:完成态静默;↑/↓ 循环移动、Enter 选定、Esc 取消 */
|
|
66
|
+
handleEvent(event) {
|
|
67
|
+
const e = asKey(event);
|
|
68
|
+
if (e === null)
|
|
69
|
+
return true; // 面板占焦——非键事件(文本 / IME / 粘贴)层内终局
|
|
70
|
+
if (e.phase === 'release' || this.done)
|
|
71
|
+
return true;
|
|
72
|
+
if (e.ctrl || e.alt || e.shift || e.meta)
|
|
73
|
+
return true;
|
|
74
|
+
if (e.key === 'up') {
|
|
75
|
+
this.activeIndex = this.activeIndex === 0 ? this.options.length - 1 : this.activeIndex - 1;
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
if (e.key === 'down') {
|
|
79
|
+
this.activeIndex = this.activeIndex === this.options.length - 1 ? 0 : this.activeIndex + 1;
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (e.key === 'enter') {
|
|
83
|
+
this.finish(this.options[this.activeIndex]?.value ?? SELECT_CANCELLED);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
if (e.key === 'escape') {
|
|
87
|
+
this.finish(SELECT_CANCELLED);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return true; // 其余键层内终局(模态独占——不穿透)
|
|
91
|
+
}
|
|
92
|
+
/** 单次完成路(触发后锁完成态) */
|
|
93
|
+
finish(value) {
|
|
94
|
+
if (this.done)
|
|
95
|
+
return;
|
|
96
|
+
this.done = true;
|
|
97
|
+
this.onFinish?.(value);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 确认面板:两键问答浮层(Enter/y → true、Esc/n → false——保守值 = 不动原状态)。
|
|
102
|
+
*/
|
|
103
|
+
export class ConfirmPanel {
|
|
104
|
+
/** 完成回调——装配接线(同 SelectPanel 形) */
|
|
105
|
+
onFinish;
|
|
106
|
+
done = false;
|
|
107
|
+
message;
|
|
108
|
+
confirmHint;
|
|
109
|
+
cancelHint;
|
|
110
|
+
constructor(options) {
|
|
111
|
+
this.message = options.message;
|
|
112
|
+
this.confirmHint = options.confirmHint ?? 'enter 确认';
|
|
113
|
+
this.cancelHint = options.cancelHint ?? 'esc 取消';
|
|
114
|
+
}
|
|
115
|
+
/** 量高:消息 1 + 键提示 1 */
|
|
116
|
+
measure(width) {
|
|
117
|
+
void width;
|
|
118
|
+
return 2;
|
|
119
|
+
}
|
|
120
|
+
/** 落位:铺底空格 → 消息 → 键提示(dim) */
|
|
121
|
+
render(buffer, region) {
|
|
122
|
+
for (let r = 0; r < region.height; r++) {
|
|
123
|
+
for (let c = 0; c < region.width; c++) {
|
|
124
|
+
buffer.setCell(region.row + r, region.col + c, ' ');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
buffer.writeText(region.row, region.col, this.message);
|
|
128
|
+
buffer.writeText(region.row + 1, region.col, `${this.confirmHint} · ${this.cancelHint}`, HINT_STYLE);
|
|
129
|
+
}
|
|
130
|
+
/** 事件分发:Enter/y 确认、Esc/n 取消(保守值) */
|
|
131
|
+
handleEvent(event) {
|
|
132
|
+
const e = asKey(event);
|
|
133
|
+
if (e === null)
|
|
134
|
+
return true;
|
|
135
|
+
if (e.phase === 'release' || this.done)
|
|
136
|
+
return true;
|
|
137
|
+
if (e.ctrl || e.alt || e.shift || e.meta)
|
|
138
|
+
return true;
|
|
139
|
+
if (isPlainKey(e, 'enter') || isPlainKey(e, 'y')) {
|
|
140
|
+
this.finish(true);
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
if (isPlainKey(e, 'escape') || isPlainKey(e, 'n')) {
|
|
144
|
+
this.finish(false);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return true; // 其余键层内终局
|
|
148
|
+
}
|
|
149
|
+
/** 单次完成路 */
|
|
150
|
+
finish(confirmed) {
|
|
151
|
+
if (this.done)
|
|
152
|
+
return;
|
|
153
|
+
this.done = true;
|
|
154
|
+
this.onFinish?.(confirmed);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=select-confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-confirm.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/overlay/select-confirm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* todo 面板(07 §4.1 呈现面件 4)——输入框上方紧凑面板。
|
|
3
|
+
*
|
|
4
|
+
* - 数据面纯呈现投影:items 全量快照经 `update()` 整体替换(真源 = 装配
|
|
5
|
+
* 注入的 todoFor——05 §1.1 todo/write 事件载荷的会话侧映射,webui SPA
|
|
6
|
+
* 同源折叠产物);空表与 null/undefined 同为清板;
|
|
7
|
+
* - 条目四态记号:☐ 待办 / ◐ 进行中(activeForm 优先于 content——CC 式
|
|
8
|
+
* 文案)/ ☑ 已完成·暗淡 / ⊙ 缓办·暗淡;
|
|
9
|
+
* - 帽 6 条 + 溢出行「+ N 更多」(暗淡);
|
|
10
|
+
* - 刷新时机归装配(TuiBackend 三时点 repaint / tool_execution_end /
|
|
11
|
+
* agent_end——批 10e-2 已接线),件内零时钟零事件面。
|
|
12
|
+
*/
|
|
13
|
+
import { type CellBuffer, type Region, type Renderable } from '../../engine/index.js';
|
|
14
|
+
import type { TodoItem } from '../../types.js';
|
|
15
|
+
/** todo 面板:条目快照 → 固定区行段(清板即零行——布局自洽) */
|
|
16
|
+
export declare class TodoPanel implements Renderable {
|
|
17
|
+
private items;
|
|
18
|
+
/** 快照整体替换(null / undefined / 空表同义——清板) */
|
|
19
|
+
update(items: readonly TodoItem[] | null | undefined): void;
|
|
20
|
+
/** 量高:清板 0;帽内条数 + 溢出行 */
|
|
21
|
+
measure(width: number): number;
|
|
22
|
+
/** 落位:每条一行(记号 + 空格 + 内容截断);溢出行收尾 */
|
|
23
|
+
render(buffer: CellBuffer, region: Region): void;
|
|
24
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* todo 面板(07 §4.1 呈现面件 4)——输入框上方紧凑面板。
|
|
3
|
+
*
|
|
4
|
+
* - 数据面纯呈现投影:items 全量快照经 `update()` 整体替换(真源 = 装配
|
|
5
|
+
* 注入的 todoFor——05 §1.1 todo/write 事件载荷的会话侧映射,webui SPA
|
|
6
|
+
* 同源折叠产物);空表与 null/undefined 同为清板;
|
|
7
|
+
* - 条目四态记号:☐ 待办 / ◐ 进行中(activeForm 优先于 content——CC 式
|
|
8
|
+
* 文案)/ ☑ 已完成·暗淡 / ⊙ 缓办·暗淡;
|
|
9
|
+
* - 帽 6 条 + 溢出行「+ N 更多」(暗淡);
|
|
10
|
+
* - 刷新时机归装配(TuiBackend 三时点 repaint / tool_execution_end /
|
|
11
|
+
* agent_end——批 10e-2 已接线),件内零时钟零事件面。
|
|
12
|
+
*/
|
|
13
|
+
import { truncateToWidth } from '../../engine/index.js';
|
|
14
|
+
/** 帽内条数(溢出行另计——spec 定形不预收数字者已实测定形 6) */
|
|
15
|
+
const MAX_ITEMS = 6;
|
|
16
|
+
/** 四态记号(呈现投影——07 §4.1 件 4 定形) */
|
|
17
|
+
const STATUS_MARKS = Object.freeze({
|
|
18
|
+
pending: '☐',
|
|
19
|
+
'in-progress': '◐',
|
|
20
|
+
completed: '☑',
|
|
21
|
+
deferred: '⊙',
|
|
22
|
+
});
|
|
23
|
+
/** 暗淡两态(已完成 / 缓办——退场视觉语义) */
|
|
24
|
+
const DIM_STATUSES = new Set(['completed', 'deferred']);
|
|
25
|
+
/** todo 面板:条目快照 → 固定区行段(清板即零行——布局自洽) */
|
|
26
|
+
export class TodoPanel {
|
|
27
|
+
items = [];
|
|
28
|
+
/** 快照整体替换(null / undefined / 空表同义——清板) */
|
|
29
|
+
update(items) {
|
|
30
|
+
this.items = items ?? [];
|
|
31
|
+
}
|
|
32
|
+
/** 量高:清板 0;帽内条数 + 溢出行 */
|
|
33
|
+
measure(width) {
|
|
34
|
+
void width; // 条目单行制——宽度不敏感(内容截断吸收)
|
|
35
|
+
if (this.items.length === 0)
|
|
36
|
+
return 0;
|
|
37
|
+
return Math.min(this.items.length, MAX_ITEMS) + (this.items.length > MAX_ITEMS ? 1 : 0);
|
|
38
|
+
}
|
|
39
|
+
/** 落位:每条一行(记号 + 空格 + 内容截断);溢出行收尾 */
|
|
40
|
+
render(buffer, region) {
|
|
41
|
+
const visible = this.items.slice(0, MAX_ITEMS);
|
|
42
|
+
visible.forEach((item, i) => {
|
|
43
|
+
const dimmed = DIM_STATUSES.has(item.status);
|
|
44
|
+
// 进行中 activeForm 优先(缺席回落 content)
|
|
45
|
+
const content = item.status === 'in-progress' && item.activeForm !== undefined ? item.activeForm : item.content;
|
|
46
|
+
const row = `${STATUS_MARKS[item.status]} ${truncateToWidth(content, region.width - 2)}`;
|
|
47
|
+
buffer.writeText(region.row + i, region.col, row, dimmed ? { dim: true } : undefined);
|
|
48
|
+
});
|
|
49
|
+
const overflow = this.items.length - MAX_ITEMS;
|
|
50
|
+
if (overflow > 0) {
|
|
51
|
+
buffer.writeText(region.row + MAX_ITEMS, region.col, `+ ${overflow} 更多`, { dim: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=todo-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo-panel.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/panels/todo-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,eAAe,EAAiD,MAAM,uBAAuB,CAAC;AAGvG,wCAAwC;AACxC,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,iCAAiC;AACjC,MAAM,YAAY,GAAiD,MAAM,CAAC,MAAM,CAAC;IAC/E,OAAO,EAAE,GAAG;IACZ,aAAa,EAAE,GAAG;IAClB,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,GAAG;CACd,CAAC,CAAC;AAEH,6BAA6B;AAC7B,MAAM,YAAY,GAAoC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAEzF,wCAAwC;AACxC,MAAM,OAAO,SAAS;IACZ,KAAK,GAAwB,EAAE,CAAC;IAExC,0CAA0C;IAC1C,MAAM,CAAC,KAA6C;QAClD,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,yBAAyB;IACzB,OAAO,CAAC,KAAa;QACnB,KAAK,KAAK,CAAC,CAAC,uBAAuB;QACnC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,oCAAoC;IACpC,MAAM,CAAC,MAAkB,EAAE,MAAc;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC/C,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7C,kCAAkC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,aAAa,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YAChH,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACzF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QAC/C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,QAAQ,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工具实时进度面板(07 §4.1 呈现面件 5)——状态行上方的瞬时活动面板。
|
|
3
|
+
*
|
|
4
|
+
* - 行生命周期:`tool_execution_start` 建档(toolCallId→名——**不建行**,
|
|
5
|
+
* 首个 `tool_execution_update` 才建行)/ 后续 update 原位换行 /
|
|
6
|
+
* `tool_execution_end` 即摘行 / `clear()` 清板(agent_start·end·repaint
|
|
7
|
+
* 三时点——瞬时面律:不入正文、不跨 repaint 保存);
|
|
8
|
+
* - 宽容解码(update 载荷契约面 `unknown`——03 §2.3 自由载荷,呈现侧零
|
|
9
|
+
* 契约收紧):string 直显 / AgentToolResult 形〔content 块数组〕取文本块
|
|
10
|
+
* 倒扫末条非空行 / 其余视为文本缺席退化为 ` ▸ 名 …`;
|
|
11
|
+
* - 帽 4 行 + 溢出行「+ N 更多」;
|
|
12
|
+
* - 与件 3 分职互补:状态行示「执行哪个工具」、本件行示「输出到哪了」。
|
|
13
|
+
*/
|
|
14
|
+
import { type CellBuffer, type Region, type Renderable } from '../../engine/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* update 载荷宽容解码 → 末行输出文本(null = 文本缺席)。
|
|
17
|
+
* 网格行是单行物理面——string 形内部换行折叠空格(直显语义的物理收口)。
|
|
18
|
+
*/
|
|
19
|
+
export declare function decodeUpdateText(update: unknown): string | null;
|
|
20
|
+
/** 工具进度面板:正在流 partial 的工具各占一行(清板即零行) */
|
|
21
|
+
export declare class ToolProgressPanel implements Renderable {
|
|
22
|
+
/** 建档表(toolCallId→名——start 建档反查;end/clear 同摘) */
|
|
23
|
+
private readonly names;
|
|
24
|
+
private rows;
|
|
25
|
+
/** 建档不建行(工具名供 update 反查——无档退 toolCallId 防御路径) */
|
|
26
|
+
begin(toolCallId: string, name: string): void;
|
|
27
|
+
/** update 消费:已有行原位换文本;无行建行(首 update 建行条款) */
|
|
28
|
+
applyUpdate(toolCallId: string, update: unknown): void;
|
|
29
|
+
/** end 即摘行(建档同摘——迟到 update 无档退 id 名) */
|
|
30
|
+
end(toolCallId: string): void;
|
|
31
|
+
/** 清板(行与建档同清——agent_start·end·repaint 瞬时面律) */
|
|
32
|
+
clear(): void;
|
|
33
|
+
/** 量高:清板 0;帽内行数 + 溢出行 */
|
|
34
|
+
measure(width: number): number;
|
|
35
|
+
/** 落位:每工具一行 ` ▸ 名 · 末行`(缺席 ` ▸ 名 …`);溢出行收尾 */
|
|
36
|
+
render(buffer: CellBuffer, region: Region): void;
|
|
37
|
+
}
|