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,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemoryTerminalIO——TerminalIO 的内存实现(07 引擎节件 1:引擎公开测试面,
|
|
3
|
+
* 结构性义务非可选件)。
|
|
4
|
+
*
|
|
5
|
+
* 一切引擎行为可在注入替身下测试:写出收帧(bytes 累积 + 每次 write 一帧)、
|
|
6
|
+
* 输入 / resize 经测试侧 emit 注入、几何可设。真终端适配(ProcessTerminalIO)
|
|
7
|
+
* 归批 10c,本件长驻公开面供各层测试复用。
|
|
8
|
+
*/
|
|
9
|
+
import type { TerminalIO } from './types.js';
|
|
10
|
+
export declare class MemoryTerminalIO implements TerminalIO {
|
|
11
|
+
/** 累积写出全文(多帧拼接——帧序分析用 frames) */
|
|
12
|
+
bytes: string;
|
|
13
|
+
/** 逐帧记录(每次 write 一项——收帧语义断言用) */
|
|
14
|
+
readonly frames: string[];
|
|
15
|
+
/** 几何(测试可设——resize 场景直接改字段后 emitResize) */
|
|
16
|
+
columns: number;
|
|
17
|
+
rows: number;
|
|
18
|
+
/** setRawMode 调用史(true = 开 / false = 关,序即调用序) */
|
|
19
|
+
readonly rawModeHistory: boolean[];
|
|
20
|
+
/** 当前 raw 真值(isRaw 查询面——末次 setRawMode 结果) */
|
|
21
|
+
raw: boolean;
|
|
22
|
+
/** pause / resume 调用计数(挂起交出面断言用) */
|
|
23
|
+
pauseCount: number;
|
|
24
|
+
resumeCount: number;
|
|
25
|
+
private readonly inputListeners;
|
|
26
|
+
private readonly resizeListeners;
|
|
27
|
+
constructor(columns?: number, rows?: number);
|
|
28
|
+
/** 写出收帧(帧记录 + 全文累积) */
|
|
29
|
+
write(data: string): void;
|
|
30
|
+
size(): {
|
|
31
|
+
columns: number;
|
|
32
|
+
rows: number;
|
|
33
|
+
};
|
|
34
|
+
setRawMode(enable: boolean): void;
|
|
35
|
+
isRaw(): boolean;
|
|
36
|
+
pause(): void;
|
|
37
|
+
resume(): void;
|
|
38
|
+
onInput(listener: (data: string) => void): () => void;
|
|
39
|
+
onResize(listener: () => void): () => void;
|
|
40
|
+
/** 测试注入:驱动全部输入监听器(模拟终端字节流到达——同步派发) */
|
|
41
|
+
emitInput(data: string): void;
|
|
42
|
+
/** 测试注入:驱动全部 resize 监听器(几何已由测试侧先行改定) */
|
|
43
|
+
emitResize(): void;
|
|
44
|
+
/** 清输出账(长测试分段断言用——监听器几何保留) */
|
|
45
|
+
reset(): void;
|
|
46
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export class MemoryTerminalIO {
|
|
2
|
+
/** 累积写出全文(多帧拼接——帧序分析用 frames) */
|
|
3
|
+
bytes = '';
|
|
4
|
+
/** 逐帧记录(每次 write 一项——收帧语义断言用) */
|
|
5
|
+
frames = [];
|
|
6
|
+
/** 几何(测试可设——resize 场景直接改字段后 emitResize) */
|
|
7
|
+
columns;
|
|
8
|
+
rows;
|
|
9
|
+
/** setRawMode 调用史(true = 开 / false = 关,序即调用序) */
|
|
10
|
+
rawModeHistory = [];
|
|
11
|
+
/** 当前 raw 真值(isRaw 查询面——末次 setRawMode 结果) */
|
|
12
|
+
raw = false;
|
|
13
|
+
/** pause / resume 调用计数(挂起交出面断言用) */
|
|
14
|
+
pauseCount = 0;
|
|
15
|
+
resumeCount = 0;
|
|
16
|
+
inputListeners = new Set();
|
|
17
|
+
resizeListeners = new Set();
|
|
18
|
+
constructor(columns = 80, rows = 24) {
|
|
19
|
+
this.columns = columns;
|
|
20
|
+
this.rows = rows;
|
|
21
|
+
}
|
|
22
|
+
/** 写出收帧(帧记录 + 全文累积) */
|
|
23
|
+
write(data) {
|
|
24
|
+
this.frames.push(data);
|
|
25
|
+
this.bytes += data;
|
|
26
|
+
}
|
|
27
|
+
size() {
|
|
28
|
+
return { columns: this.columns, rows: this.rows };
|
|
29
|
+
}
|
|
30
|
+
setRawMode(enable) {
|
|
31
|
+
this.rawModeHistory.push(enable);
|
|
32
|
+
this.raw = enable;
|
|
33
|
+
}
|
|
34
|
+
isRaw() {
|
|
35
|
+
return this.raw;
|
|
36
|
+
}
|
|
37
|
+
pause() {
|
|
38
|
+
this.pauseCount++;
|
|
39
|
+
}
|
|
40
|
+
resume() {
|
|
41
|
+
this.resumeCount++;
|
|
42
|
+
}
|
|
43
|
+
onInput(listener) {
|
|
44
|
+
this.inputListeners.add(listener);
|
|
45
|
+
return () => this.inputListeners.delete(listener);
|
|
46
|
+
}
|
|
47
|
+
onResize(listener) {
|
|
48
|
+
this.resizeListeners.add(listener);
|
|
49
|
+
return () => this.resizeListeners.delete(listener);
|
|
50
|
+
}
|
|
51
|
+
/** 测试注入:驱动全部输入监听器(模拟终端字节流到达——同步派发) */
|
|
52
|
+
emitInput(data) {
|
|
53
|
+
// 快照后派发:派发中增删监听器不外溢到本批(同步退出/复起场景——副屏
|
|
54
|
+
// Engine 在派发中退订并复起主屏监听,新订阅者不吃同批字节;与真终端流
|
|
55
|
+
// 「已派发块不重投」语义一致——批 10f-4 回看器 q 退出路回归锁在
|
|
56
|
+
// tui-backend.test.ts /history 副屏装配组)
|
|
57
|
+
for (const listener of [...this.inputListeners])
|
|
58
|
+
listener(data);
|
|
59
|
+
}
|
|
60
|
+
/** 测试注入:驱动全部 resize 监听器(几何已由测试侧先行改定) */
|
|
61
|
+
emitResize() {
|
|
62
|
+
// 快照后派发(与 emitInput 同律——派发中增删不外溢)
|
|
63
|
+
for (const listener of [...this.resizeListeners])
|
|
64
|
+
listener();
|
|
65
|
+
}
|
|
66
|
+
/** 清输出账(长测试分段断言用——监听器几何保留) */
|
|
67
|
+
reset() {
|
|
68
|
+
this.bytes = '';
|
|
69
|
+
this.frames.length = 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=memory-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-io.js","sourceRoot":"","sources":["../../../../../../src/channels/engine/memory-io.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,gBAAgB;IAC3B,iCAAiC;IAC1B,KAAK,GAAG,EAAE,CAAC;IAClB,iCAAiC;IACjB,MAAM,GAAa,EAAE,CAAC;IACtC,2CAA2C;IACpC,OAAO,CAAS;IAChB,IAAI,CAAS;IACpB,iDAAiD;IACjC,cAAc,GAAc,EAAE,CAAC;IAC/C,6CAA6C;IACtC,GAAG,GAAG,KAAK,CAAC;IACnB,oCAAoC;IAC7B,UAAU,GAAG,CAAC,CAAC;IACf,WAAW,GAAG,CAAC,CAAC;IAEN,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;IACnD,eAAe,GAAG,IAAI,GAAG,EAAc,CAAC;IAEzD,YAAY,OAAO,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,IAAI;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,UAAU,CAAC,MAAe;QACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;IACpB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,QAAgC;QACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,QAAQ,CAAC,QAAoB;QAC3B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,sCAAsC;IACtC,SAAS,CAAC,IAAY;QACpB,qCAAqC;QACrC,wCAAwC;QACxC,uCAAuC;QACvC,sCAAsC;QACtC,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,wCAAwC;IACxC,UAAU;QACR,kCAAkC;QAClC,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;YAAE,QAAQ,EAAE,CAAC;IAC/D,CAAC;IAED,8BAA8B;IAC9B,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 真终端适配器(07 篇引擎节件 5 的真 TTY 位——TerminalIO 的 process 直连实现)。
|
|
3
|
+
*
|
|
4
|
+
* 引擎六件只认 TerminalIO 注入面、永不直触 process.stdin/stdout——本件是
|
|
5
|
+
* 唯一的进程接缝。非 TTY fail-loud(管道下运行 berry 需明确报错)归
|
|
6
|
+
* host 装配批(批 12)在装配层执法——本件 setRawMode 对非 TTY 静默跳过
|
|
7
|
+
* (`process.stdin.setRawMode` 在非 TTY 上会抛——先查 isTTY 再设)。
|
|
8
|
+
*/
|
|
9
|
+
import type { TerminalIO } from './types.js';
|
|
10
|
+
/** process stdin/stdout 直连适配器(组合根缺省注入位) */
|
|
11
|
+
export declare class ProcessTerminalIO implements TerminalIO {
|
|
12
|
+
write(data: string): void;
|
|
13
|
+
size(): {
|
|
14
|
+
columns: number;
|
|
15
|
+
rows: number;
|
|
16
|
+
};
|
|
17
|
+
setRawMode(enable: boolean): void;
|
|
18
|
+
isRaw(): boolean;
|
|
19
|
+
pause(): void;
|
|
20
|
+
resume(): void;
|
|
21
|
+
onInput(listener: (data: string) => void): () => void;
|
|
22
|
+
onResize(listener: () => void): () => void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** process stdin/stdout 直连适配器(组合根缺省注入位) */
|
|
2
|
+
export class ProcessTerminalIO {
|
|
3
|
+
write(data) {
|
|
4
|
+
process.stdout.write(data);
|
|
5
|
+
}
|
|
6
|
+
size() {
|
|
7
|
+
// 兜底用 || 而非 ??:pty 未设 winsize 时(expect/CI 伪终端)node 返回
|
|
8
|
+
// rows/columns = 0 而非 undefined——`??` 只兜 null/undefined 兜不住 0;
|
|
9
|
+
// 0 行 0 列的终端物理不存在,零值与缺席同属「无有效几何」,一律回落
|
|
10
|
+
// 80×24(2026-09-13 真模型五轮实测定罪:0 值直透曾致 CellGrid 零宽
|
|
11
|
+
// 只擦不写 + 负行号 CUP——固定区渲染全空)。
|
|
12
|
+
return { columns: process.stdout.columns || 80, rows: process.stdout.rows || 24 };
|
|
13
|
+
}
|
|
14
|
+
setRawMode(enable) {
|
|
15
|
+
if (process.stdin.isTTY)
|
|
16
|
+
process.stdin.setRawMode(enable);
|
|
17
|
+
}
|
|
18
|
+
isRaw() {
|
|
19
|
+
return process.stdin.isRaw ?? false;
|
|
20
|
+
}
|
|
21
|
+
pause() {
|
|
22
|
+
process.stdin.pause();
|
|
23
|
+
}
|
|
24
|
+
resume() {
|
|
25
|
+
process.stdin.resume();
|
|
26
|
+
}
|
|
27
|
+
onInput(listener) {
|
|
28
|
+
const stdin = process.stdin;
|
|
29
|
+
stdin.setEncoding('utf8');
|
|
30
|
+
stdin.on('data', listener);
|
|
31
|
+
return () => stdin.removeListener('data', listener);
|
|
32
|
+
}
|
|
33
|
+
onResize(listener) {
|
|
34
|
+
const stdout = process.stdout;
|
|
35
|
+
stdout.on('resize', listener);
|
|
36
|
+
return () => stdout.removeListener('resize', listener);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=process-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-io.js","sourceRoot":"","sources":["../../../../../../src/channels/engine/process-io.ts"],"names":[],"mappings":"AAUA,2CAA2C;AAC3C,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,IAAY;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,sDAAsD;QACtD,+DAA+D;QAC/D,sCAAsC;QACtC,iDAAiD;QACjD,4BAA4B;QAC5B,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IACpF,CAAC;IAED,UAAU,CAAC,MAAe;QACxB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK;QACH,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;IACtC,CAAC;IAED,KAAK;QACH,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,QAAgC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED,QAAQ,CAAC,QAAoB;QAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自研 TUI 引擎契约件(07 篇 §4.1 自研引擎节件 1——批 10b 引擎核心)。
|
|
3
|
+
*
|
|
4
|
+
* 引擎与真 TTY 全解耦的接缝根基:TerminalIO 是注入面(按引擎生命周期需要
|
|
5
|
+
* 设计接口面,非照抄进程 API)、MemoryTerminalIO 内存实现是引擎公开测试面
|
|
6
|
+
* (结构性义务非可选件——「mock 只停在模型层」纪律的接缝根基)。
|
|
7
|
+
*
|
|
8
|
+
* 本文件只立契约(类型 + 协议),零实现、零外部依赖;实现可替换性由接口
|
|
9
|
+
* 面承载(CellBuffer 协议下实装在 cell 件、TerminalIO 下真终端适配在批 10c)。
|
|
10
|
+
*/
|
|
11
|
+
/** 16 色 ANSI 色号(0-15;色域 = 16 色 + 属性位,真彩 / 256 色挂账不预造) */
|
|
12
|
+
export type AnsiColor = number & {
|
|
13
|
+
readonly __brand: 'ansi-16-color';
|
|
14
|
+
};
|
|
15
|
+
/** 16 色色号构造(brand 收口:色号只能经此进入引擎面) */
|
|
16
|
+
export declare function ansiColor(n: number): AnsiColor;
|
|
17
|
+
/** 单格样式(属性位族——缺省位一律 false / undefined) */
|
|
18
|
+
export interface CellStyle {
|
|
19
|
+
/** 前景 16 色索引(undefined = 终端缺省前景) */
|
|
20
|
+
readonly fg?: AnsiColor;
|
|
21
|
+
/** 背景 16 色索引(undefined = 终端缺省背景) */
|
|
22
|
+
readonly bg?: AnsiColor;
|
|
23
|
+
readonly bold?: boolean;
|
|
24
|
+
readonly italic?: boolean;
|
|
25
|
+
readonly underline?: boolean;
|
|
26
|
+
readonly dim?: boolean;
|
|
27
|
+
readonly inverse?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 网格单格三元:码点面 + 样式 + 列宽(07 引擎节件 3 cell 网格模型)。
|
|
31
|
+
*
|
|
32
|
+
* - grapheme 存**完整字素串**(单码点字素即该码点)——多码点字素(ZWJ 家族 /
|
|
33
|
+
* 旗帜 / 变体选择子)整串入格,同首码点不同字素因串不同在差分按格直比中
|
|
34
|
+
* 自然判不等(字素面参与差分自证——结构自证、无旁路账本)。
|
|
35
|
+
* - width 三值:2 = 宽字素首格、0 = 宽字素续格(grapheme 为空串占位——与主流
|
|
36
|
+
* 终端续格形同构,差分按格直比无需行结构感知)、1 = 常规字素。
|
|
37
|
+
*/
|
|
38
|
+
export interface Cell {
|
|
39
|
+
readonly grapheme: string;
|
|
40
|
+
readonly style: CellStyle;
|
|
41
|
+
readonly width: 0 | 1 | 2;
|
|
42
|
+
}
|
|
43
|
+
/** 本帧光标声明(帧尾统一落位——显隐态跨帧去重归 diff 件) */
|
|
44
|
+
export interface CursorState {
|
|
45
|
+
readonly row: number;
|
|
46
|
+
readonly col: number;
|
|
47
|
+
readonly visible: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 终端 IO 注入面(七动词:写出 / 几何 / raw 模式 / 流暂停复起 / 输入订阅 /
|
|
51
|
+
* resize 订阅 / raw 真值查询)。
|
|
52
|
+
*
|
|
53
|
+
* 真终端适配(ProcessTerminalIO)与内存实现(MemoryTerminalIO)同面
|
|
54
|
+
* 接入;引擎六件只认本接口、永不直触 process.stdout / stdin。isRaw 供
|
|
55
|
+
* 挂起交出面复原先验态(start 前记录、suspend/dispose 还原)。
|
|
56
|
+
*/
|
|
57
|
+
export interface TerminalIO {
|
|
58
|
+
/** 写出 ANSI 字节(同步写出——帧缓冲的最终出口) */
|
|
59
|
+
write(data: string): void;
|
|
60
|
+
/** 当前几何(列 / 行——resize 后以真值为准,不缓存) */
|
|
61
|
+
size(): {
|
|
62
|
+
columns: number;
|
|
63
|
+
rows: number;
|
|
64
|
+
};
|
|
65
|
+
/** raw 模式开关(真终端适配负责复原先验态;内存实现纯记账) */
|
|
66
|
+
setRawMode(enable: boolean): void;
|
|
67
|
+
/** 当前 raw 真值(挂起交出面复原先验态的记录依据) */
|
|
68
|
+
isRaw(): boolean;
|
|
69
|
+
/** 流暂停 / 复起(挂起交出面用——为 $EDITOR 类子交互进程预留) */
|
|
70
|
+
pause(): void;
|
|
71
|
+
resume(): void;
|
|
72
|
+
/** 订阅输入字节流(解码件消费——回调返回退订函数) */
|
|
73
|
+
onInput(listener: (data: string) => void): () => void;
|
|
74
|
+
/** 订阅几何变更(引擎侧弃旧换新重绘) */
|
|
75
|
+
onResize(listener: () => void): () => void;
|
|
76
|
+
}
|
|
77
|
+
/** 键盘协议轨(DA1 哨兵探测落定:kitty 应答先到 = kitty 轨 / 否则 legacy) */
|
|
78
|
+
export type KeyboardProtocol = 'kitty' | 'legacy';
|
|
79
|
+
/** 组件落位区域(行 / 列 / 宽 / 高——屏幕坐标系) */
|
|
80
|
+
export interface Region {
|
|
81
|
+
readonly row: number;
|
|
82
|
+
readonly col: number;
|
|
83
|
+
readonly width: number;
|
|
84
|
+
readonly height: number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 组件两段协商协议(07 引擎节件 1):
|
|
88
|
+
* 量高(给定宽度报期望行数)与落位(只写自己区域内)走同一分配单源、
|
|
89
|
+
* 两段永不漂移(无约束求解器——量高即分配的承诺,落位不得超卖)。
|
|
90
|
+
* 越界写由缓冲吸收(CellBuffer 静默丢弃界外格——组件可信任缓冲兜底)。
|
|
91
|
+
*/
|
|
92
|
+
export interface Renderable {
|
|
93
|
+
/** 量高:给定可用宽度,报本组件期望行数 */
|
|
94
|
+
measure(width: number): number;
|
|
95
|
+
/** 落位:只写自己区域内(region 由装配层依量高结果划定) */
|
|
96
|
+
render(buffer: CellBuffer, region: Region): void;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* cell 网格写入契约(实现可替换;含本帧光标声明写入面)。
|
|
100
|
+
*
|
|
101
|
+
* 光标三问(07 引擎节件 1 审读补条款):由谁声明 = 交互件 render 内声明本帧
|
|
102
|
+
* 可见光标位置;竞声明裁决 = setCursor / clearCursor 同帧多组件竞声明以
|
|
103
|
+
* **末次为准**;显隐去重 = 帧尾统一落位(定位 + 显 / 隐),同态跨帧零冗余
|
|
104
|
+
* 序列(去重执法在 diff 件,buffer 只存本帧声明终值)。
|
|
105
|
+
*
|
|
106
|
+
* 帧路径零分配:缓冲跨帧复用、clear 只摘格不重分配,resize 是唯一重分配点。
|
|
107
|
+
*/
|
|
108
|
+
export interface CellBuffer {
|
|
109
|
+
readonly columns: number;
|
|
110
|
+
readonly rows: number;
|
|
111
|
+
/** 摘格清屏(网格结构复用——帧间清屏用,零分配) */
|
|
112
|
+
clear(): void;
|
|
113
|
+
/** 读单格(界外 / 未写格返回 null = 缺省空格) */
|
|
114
|
+
getCell(row: number, col: number): Cell | null;
|
|
115
|
+
/**
|
|
116
|
+
* 写单字素格(宽字素自动铺续格;覆写区既有宽字素整字摘痕防新旧混叠;
|
|
117
|
+
* 越界写静默吸收——渲染契约「越界写由缓冲吸收」的执法位)。
|
|
118
|
+
*/
|
|
119
|
+
setCell(row: number, col: number, grapheme: string, style?: CellStyle): void;
|
|
120
|
+
/**
|
|
121
|
+
* 写文本(字素级写入 + 列位推进;返回推进后列位——宽字素占双列)。
|
|
122
|
+
* 空串 / 零宽情形下返回原列位(推进为零)。
|
|
123
|
+
*/
|
|
124
|
+
writeText(row: number, col: number, text: string, style?: CellStyle): number;
|
|
125
|
+
/** 本帧光标声明(显式落位) */
|
|
126
|
+
setCursor(row: number, col: number): void;
|
|
127
|
+
/** 本帧光标清除声明(本帧无可见光标) */
|
|
128
|
+
clearCursor(): void;
|
|
129
|
+
/** 本帧光标声明终值(无声明 = null) */
|
|
130
|
+
readonly cursor: CursorState | null;
|
|
131
|
+
/** 几何变更(唯一重分配点;内容弃置——resize 弃旧换新,编排侧重绘兜底) */
|
|
132
|
+
resize(columns: number, rows: number): void;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 输入事件模型五分(07 引擎节件 1——2026-09-11 鼠标解码批四分扩五分):
|
|
136
|
+
* key / text / ime / paste / mouse。
|
|
137
|
+
*
|
|
138
|
+
* 事件由输入解码件(批 10c;mouse 增补随鼠标解码批 mu-2)产出——本件只立
|
|
139
|
+
* 模型面。key 事件带 press / repeat / release 三型(kitty 轨可达;legacy 轨
|
|
140
|
+
* 无事件型区分、恒 press);text 事件粒度 = 同 chunk 内连续可打印游程合并
|
|
141
|
+
* 单事件(打字 / 中文提交不撕裂——逐字符派发会每事件触发渲染请求)。
|
|
142
|
+
* mouse 事件带 press/motion/release 三型 + 按钮语义位 + 修饰键还原 +
|
|
143
|
+
* 0 基屏幕坐标(SGR 报文 1 基的换算归解码件,模型面单源 0 基)。
|
|
144
|
+
*/
|
|
145
|
+
/** 键相(press 首按 / repeat 连按 / release 释放——kitty 轨专属区分) */
|
|
146
|
+
export type KeyPhase = 'press' | 'repeat' | 'release';
|
|
147
|
+
/** key 事件:逻辑键名('enter' / 'escape' / 'up' … 词汇表由解码件定)+ 修饰键还原 */
|
|
148
|
+
export interface KeyEvent {
|
|
149
|
+
readonly kind: 'key';
|
|
150
|
+
readonly key: string;
|
|
151
|
+
readonly ctrl: boolean;
|
|
152
|
+
readonly alt: boolean;
|
|
153
|
+
readonly shift: boolean;
|
|
154
|
+
readonly meta: boolean;
|
|
155
|
+
readonly phase: KeyPhase;
|
|
156
|
+
}
|
|
157
|
+
/** text 事件:可打印文本游程(同 chunk 连续合并;跨 chunk 不滞留) */
|
|
158
|
+
export interface TextInputEvent {
|
|
159
|
+
readonly kind: 'text';
|
|
160
|
+
readonly text: string;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* ime 事件:组字一等公民模型面。committed = false 预编辑增量(不落正文)、
|
|
164
|
+
* committed = true 提交(才落正文);识别判据(前缀增长检测)与首达零延迟
|
|
165
|
+
* 是解码件行为条款,模型面不涉。
|
|
166
|
+
*/
|
|
167
|
+
export interface ImeEvent {
|
|
168
|
+
readonly kind: 'ime';
|
|
169
|
+
readonly text: string;
|
|
170
|
+
readonly committed: boolean;
|
|
171
|
+
}
|
|
172
|
+
/** paste 事件:bracketed paste 整段交付(终界跨 chunk 悬置等待在解码件) */
|
|
173
|
+
export interface PasteEvent {
|
|
174
|
+
readonly kind: 'paste';
|
|
175
|
+
readonly text: string;
|
|
176
|
+
}
|
|
177
|
+
/** mouse 事件相(press 按下 / motion 按住拖动 / release 释放——SGR 报文 M/m 终点区分) */
|
|
178
|
+
export type MousePhase = 'press' | 'motion' | 'release';
|
|
179
|
+
/** mouse 按钮语义位(07 引擎节件 4 v1 收窄五钮——其余按钮线值整序吞不产事件) */
|
|
180
|
+
export type MouseButton = 'left' | 'middle' | 'right' | 'wheel-up' | 'wheel-down';
|
|
181
|
+
/**
|
|
182
|
+
* mouse 事件:SGR 1006 解码产物(07 引擎节件 4 鼠标解码批条款)。
|
|
183
|
+
*
|
|
184
|
+
* - 坐标 0 基(col 列 / row 行——SGR 报文 1 基的换算归解码件);
|
|
185
|
+
* - 修饰键还原(SGR 位域 4=shift / 8=alt / 16=ctrl——线值 8-11 的 alt 系
|
|
186
|
+
* 组合在此拆解、绝不入吞清单;SGR 无 meta 位,meta 恒 false);
|
|
187
|
+
* - motion = 按住拖动(DECSET 1002 button-event tracking——无键 motion 不
|
|
188
|
+
* 报);wheel 无 release(终端不报,滚轮以 press 一相到达)。
|
|
189
|
+
*/
|
|
190
|
+
export interface MouseEvent {
|
|
191
|
+
readonly kind: 'mouse';
|
|
192
|
+
readonly phase: MousePhase;
|
|
193
|
+
readonly button: MouseButton;
|
|
194
|
+
readonly col: number;
|
|
195
|
+
readonly row: number;
|
|
196
|
+
readonly ctrl: boolean;
|
|
197
|
+
readonly alt: boolean;
|
|
198
|
+
readonly shift: boolean;
|
|
199
|
+
readonly meta: boolean;
|
|
200
|
+
}
|
|
201
|
+
/** 输入事件五分判别联合(mouse 系 2026-09-11 鼠标解码批增补) */
|
|
202
|
+
export type InputEvent = KeyEvent | TextInputEvent | ImeEvent | PasteEvent | MouseEvent;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自研 TUI 引擎契约件(07 篇 §4.1 自研引擎节件 1——批 10b 引擎核心)。
|
|
3
|
+
*
|
|
4
|
+
* 引擎与真 TTY 全解耦的接缝根基:TerminalIO 是注入面(按引擎生命周期需要
|
|
5
|
+
* 设计接口面,非照抄进程 API)、MemoryTerminalIO 内存实现是引擎公开测试面
|
|
6
|
+
* (结构性义务非可选件——「mock 只停在模型层」纪律的接缝根基)。
|
|
7
|
+
*
|
|
8
|
+
* 本文件只立契约(类型 + 协议),零实现、零外部依赖;实现可替换性由接口
|
|
9
|
+
* 面承载(CellBuffer 协议下实装在 cell 件、TerminalIO 下真终端适配在批 10c)。
|
|
10
|
+
*/
|
|
11
|
+
/** 16 色色号构造(brand 收口:色号只能经此进入引擎面) */
|
|
12
|
+
export function ansiColor(n) {
|
|
13
|
+
if (!Number.isInteger(n) || n < 0 || n > 15) {
|
|
14
|
+
throw new Error(`ansiColor: 色号须为 0-15 整数,收到 ${n}`);
|
|
15
|
+
}
|
|
16
|
+
return n;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/channels/engine/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,qCAAqC;AACrC,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 字素级宽度四规则(07 引擎节件 2):
|
|
3
|
+
* ① 字素内任一码点 EAW wide/fullwidth → 2;
|
|
4
|
+
* ② 含 VS16 → 2(emoji 呈现形——窄基字符 + VS16 也占双列);
|
|
5
|
+
* ③ 恰一对 Regional Indicator → 2(旗帜——单码点 EAW 覆盖不到,孤立 RI 按 1);
|
|
6
|
+
* ④ 其余 → 1。
|
|
7
|
+
*/
|
|
8
|
+
export declare function graphemeWidth(grapheme: string): 0 | 1 | 2;
|
|
9
|
+
/** 切分字素序列(Intl.Segmenter——ZWJ 家族 / 旗帜 / 变体选择子整素不撕裂) */
|
|
10
|
+
export declare function splitGraphemes(text: string): string[];
|
|
11
|
+
/** 整字三原语之一·测宽:全串字素宽度和 */
|
|
12
|
+
export declare function stringWidth(text: string): number;
|
|
13
|
+
/**
|
|
14
|
+
* 整字三原语之二·按宽截断:截到不超过 cols 的最长字素前缀——
|
|
15
|
+
* 宽字素跨界整字丢弃**不产半字**(末位恰剩一列放不下双宽字素时整字放弃)。
|
|
16
|
+
*/
|
|
17
|
+
export declare function truncateToWidth(text: string, cols: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* 整字三原语之三·整字换行:按 cols 折行——
|
|
20
|
+
* 行末剩一列遇双宽字素整字下移**第二列不悬挂**;ZWJ 家族**跨行不撕裂**
|
|
21
|
+
* (字素切分在前、折行只动字素边界);显式 \n 强制换行(段语义保留)。
|
|
22
|
+
*/
|
|
23
|
+
export declare function wrapText(text: string, cols: number): string[];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文本度量件(07 篇 §4.1 自研引擎节件 2——批 10b 引擎核心)。
|
|
3
|
+
*
|
|
4
|
+
* 字素边界与列宽两件必须同时在场(立法缘由:berry 注释点名 OpenCode 反课
|
|
5
|
+
* 「只用字素切分不管列宽 → CJK 断行错位至今未修」)——
|
|
6
|
+
* - 字素边界:运行时内建 Intl.Segmenter(零新依赖,模块级单例);
|
|
7
|
+
* - 列宽:EAW 分类**数据面**外包 get-east-asian-width(§2.1 精确锁 1.6.0),
|
|
8
|
+
* `ambiguous = 1` 的中西混排语境取舍**决策面自持**在本件(见 eawWidth 注释)。
|
|
9
|
+
*/
|
|
10
|
+
import { eastAsianWidthType } from 'get-east-asian-width';
|
|
11
|
+
/** 字素切分器(模块级单例——Segmenter 构造贵、无状态可复用) */
|
|
12
|
+
const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
13
|
+
/** 变体选择子 16(emoji 呈现形——字素含之即宽 2) */
|
|
14
|
+
const VS16 = 0xfe0f;
|
|
15
|
+
/** Regional Indicator 起止(旗帜 = 恰一对 RI 合成一字素) */
|
|
16
|
+
const RI_FIRST = 0x1f1e6;
|
|
17
|
+
const RI_LAST = 0x1f1ff;
|
|
18
|
+
/**
|
|
19
|
+
* EAW 单码点分类宽(决策面自持位)。
|
|
20
|
+
*
|
|
21
|
+
* ambiguous(A 类:〇 ⊡ ⛭ …)在 CJK 语境常按 2 列渲染、西文语境按 1 列——
|
|
22
|
+
* 本仓取舍 **= 1**(中西混排对话正文按窄计),依据 = berry 实证同款取舍;
|
|
23
|
+
* 部分按 2 渲染的 CJK 终端上对齐误差可容忍,可配置性挂真实需求再裁
|
|
24
|
+
* (07 §4.1 终端支持矩阵降级三款注记在案)。
|
|
25
|
+
* 注:外包库的 eastAsianWidth() 缺省 ambiguousAsWide = true——与本取舍相反,
|
|
26
|
+
* 故只取其分类函数、宽度判定自持,不走其合成宽函数。
|
|
27
|
+
*/
|
|
28
|
+
function eawWidth(codePoint) {
|
|
29
|
+
const type = eastAsianWidthType(codePoint);
|
|
30
|
+
return type === 'wide' || type === 'fullwidth' ? 2 : 1;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 字素级宽度四规则(07 引擎节件 2):
|
|
34
|
+
* ① 字素内任一码点 EAW wide/fullwidth → 2;
|
|
35
|
+
* ② 含 VS16 → 2(emoji 呈现形——窄基字符 + VS16 也占双列);
|
|
36
|
+
* ③ 恰一对 Regional Indicator → 2(旗帜——单码点 EAW 覆盖不到,孤立 RI 按 1);
|
|
37
|
+
* ④ 其余 → 1。
|
|
38
|
+
*/
|
|
39
|
+
export function graphemeWidth(grapheme) {
|
|
40
|
+
const codePoints = [...grapheme].map((ch) => ch.codePointAt(0));
|
|
41
|
+
// 规则③:恰一对 RI(两面旗恰好两个 RI 码点合成)判 2;单 RI / 三连 RI 落规则④
|
|
42
|
+
const riCount = codePoints.filter((cp) => cp >= RI_FIRST && cp <= RI_LAST).length;
|
|
43
|
+
if (codePoints.length === 2 && riCount === 2)
|
|
44
|
+
return 2;
|
|
45
|
+
// 规则②:VS16 在场即宽(emoji 呈现形语义优先于基字符分类)
|
|
46
|
+
if (codePoints.includes(VS16))
|
|
47
|
+
return 2;
|
|
48
|
+
// 规则①:任一码点 wide/fullwidth → 2
|
|
49
|
+
for (const cp of codePoints) {
|
|
50
|
+
if (eawWidth(cp) === 2)
|
|
51
|
+
return 2;
|
|
52
|
+
}
|
|
53
|
+
// 规则④:其余 → 1(含控制字符的占位语义不在此件发明——网格写入层拒收)
|
|
54
|
+
return 1;
|
|
55
|
+
}
|
|
56
|
+
/** 切分字素序列(Intl.Segmenter——ZWJ 家族 / 旗帜 / 变体选择子整素不撕裂) */
|
|
57
|
+
export function splitGraphemes(text) {
|
|
58
|
+
if (text === '')
|
|
59
|
+
return [];
|
|
60
|
+
const out = [];
|
|
61
|
+
for (const seg of segmenter.segment(text))
|
|
62
|
+
out.push(seg.segment);
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
/** 整字三原语之一·测宽:全串字素宽度和 */
|
|
66
|
+
export function stringWidth(text) {
|
|
67
|
+
let width = 0;
|
|
68
|
+
for (const g of splitGraphemes(text))
|
|
69
|
+
width += graphemeWidth(g);
|
|
70
|
+
return width;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 整字三原语之二·按宽截断:截到不超过 cols 的最长字素前缀——
|
|
74
|
+
* 宽字素跨界整字丢弃**不产半字**(末位恰剩一列放不下双宽字素时整字放弃)。
|
|
75
|
+
*/
|
|
76
|
+
export function truncateToWidth(text, cols) {
|
|
77
|
+
if (cols <= 0)
|
|
78
|
+
return '';
|
|
79
|
+
let used = 0;
|
|
80
|
+
let out = '';
|
|
81
|
+
for (const g of splitGraphemes(text)) {
|
|
82
|
+
const w = graphemeWidth(g);
|
|
83
|
+
if (used + w > cols)
|
|
84
|
+
break; // 剩余列宽不足整字——整字丢弃(不产半字)
|
|
85
|
+
used += w;
|
|
86
|
+
out += g;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 整字三原语之三·整字换行:按 cols 折行——
|
|
92
|
+
* 行末剩一列遇双宽字素整字下移**第二列不悬挂**;ZWJ 家族**跨行不撕裂**
|
|
93
|
+
* (字素切分在前、折行只动字素边界);显式 \n 强制换行(段语义保留)。
|
|
94
|
+
*/
|
|
95
|
+
export function wrapText(text, cols) {
|
|
96
|
+
if (cols <= 0)
|
|
97
|
+
return [text]; // 非法宽防御:不折行整段返回(坏参不丢字)
|
|
98
|
+
const lines = [];
|
|
99
|
+
// 先按显式换行分段(空段保留——空行语义),段内再按宽折行
|
|
100
|
+
for (const paragraph of text.split('\n')) {
|
|
101
|
+
if (paragraph === '') {
|
|
102
|
+
lines.push('');
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
let current = '';
|
|
106
|
+
let used = 0;
|
|
107
|
+
for (const g of splitGraphemes(paragraph)) {
|
|
108
|
+
const w = graphemeWidth(g);
|
|
109
|
+
if (used + w > cols) {
|
|
110
|
+
lines.push(current); // 当前行满——整字下移开新行(双宽字不悬挂第二列)
|
|
111
|
+
current = g;
|
|
112
|
+
used = w;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
current += g;
|
|
116
|
+
used += w;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
lines.push(current); // 段尾行(含整段未折情形)
|
|
120
|
+
}
|
|
121
|
+
return lines;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=width.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"width.js","sourceRoot":"","sources":["../../../../../../src/channels/engine/width.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* channels 模块公开面(L4 宿主固定件——02 篇席 10;机制真源 07 篇 §4.1/§4.3、
|
|
3
|
+
* 03 篇 §2.2 命令面、04 篇 §4/§9)。
|
|
4
|
+
*
|
|
5
|
+
* 批 10a 落通道核(多会话信封分流 + 投影拉取注入 + 命令面 + ui 原语分发 +
|
|
6
|
+
* 提问队列——零 pi-tui import)。TUI 实装:呈现面九件(07 §4.1 定稿——件 9
|
|
7
|
+
* 非聚焦会话摘要行含内)与交互/补全族已落批 10e/10f;件 8 /history 副屏
|
|
8
|
+
* 回看器归批 10f-4 未落(现状陈述——本面暂无其注册位);host 装配接线
|
|
9
|
+
* (bin 入口/启动会话策略)归批 12。
|
|
10
|
+
*/
|
|
11
|
+
export type { SessionEnvelope, UiCapabilities, UiBackend, UiAskOptions, UiSelectChoice, UiInputOptions, NotifyLevel, AskKind, ApprovalAskAnswer, ApprovalAskRequest, TodoItem, CommandArgs, CommandHandler, CommandSpec, ChannelsOptions, } from './types.js';
|
|
12
|
+
export { CommandRegistry, tokenize } from './commands.js';
|
|
13
|
+
export { AskQueue } from './ask-queue.js';
|
|
14
|
+
export type { AskHooks } from './ask-queue.js';
|
|
15
|
+
export { UiCore } from './ui-core.js';
|
|
16
|
+
export { SessionChannels } from './registry.js';
|
|
17
|
+
export { createChannels } from './service.js';
|
|
18
|
+
export type { ChannelsService } from './service.js';
|
|
19
|
+
export type { TuiBackendOptions } from './tui/index.js';
|
|
20
|
+
export { TuiBackend } from './tui/index.js';
|
|
21
|
+
export { ProcessTerminalIO } from './engine/index.js';
|
|
22
|
+
export type { TerminalIO } from './engine/index.js';
|
|
23
|
+
export { FileMentionSource } from './tui/index.js';
|
|
24
|
+
export type { FileMentionSourceOptions, AutocompleteSources, AutocompleteItem } from './tui/index.js';
|
|
25
|
+
export * from './sdk/index.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { CommandRegistry, tokenize } from './commands.js';
|
|
2
|
+
export { AskQueue } from './ask-queue.js';
|
|
3
|
+
export { UiCore } from './ui-core.js';
|
|
4
|
+
export { SessionChannels } from './registry.js';
|
|
5
|
+
export { createChannels } from './service.js';
|
|
6
|
+
export { TuiBackend } from './tui/index.js';
|
|
7
|
+
// 真终端适配器 + 补全源族(批 12e host 装配消费——engine/·tui/ 组件族非公开
|
|
8
|
+
// 面纪律的件外出口位:「本面随真实件外消费扩」先例;余组件仍件内消费)
|
|
9
|
+
export { ProcessTerminalIO } from './engine/index.js';
|
|
10
|
+
export { FileMentionSource } from './tui/index.js';
|
|
11
|
+
// SDK 线协议(批 13a 契约先行——03 §10.6 件身份条:协议核心代码位与 channels
|
|
12
|
+
// 通道核同体,SDK 通道后端 = UiBackend 第三后端;本面出协议词汇/信封 + NDJSON
|
|
13
|
+
// 编解码 + admit/游标纯逻辑四件。后端实装(事件外推/请求受理/出站队列)随批
|
|
14
|
+
// 13b;stdio 传输归宿主 serve、HTTP+SSE/MCP 归 core:sdk 件〔src/sdk/ 13e〕)
|
|
15
|
+
export * from './sdk/index.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/channels/index.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAM9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,qDAAqD;AACrD,qCAAqC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,sDAAsD;AACtD,sDAAsD;AACtD,6CAA6C;AAC7C,iEAAiE;AACjE,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 多会话注册表与焦点编排(07 §4.1 通道契约——2026-09-06 channels 纵切批)。
|
|
3
|
+
*
|
|
4
|
+
* 职责:会话在场集合 + 焦点位(聚焦者全渲染/非聚焦摘要行的判定源)+
|
|
5
|
+
* 焦点切换清屏重画(拉投影 → repaint 回调——投影拉取经装配注入,
|
|
6
|
+
* channels 不 import session 是 02 §4.1 边表的刻意设计)。
|
|
7
|
+
*
|
|
8
|
+
* 焦点切换不自动回退:聚焦会话注销后焦点空悬(focused=null——非聚焦态
|
|
9
|
+
* 全体),下一焦点由用户动作显式给(切焦编舞归 TUI 呈现批)。
|
|
10
|
+
*/
|
|
11
|
+
export declare class SessionChannels<TProjection> {
|
|
12
|
+
private readonly fetchProjection;
|
|
13
|
+
private readonly repaint;
|
|
14
|
+
private readonly sessions;
|
|
15
|
+
private currentFocus;
|
|
16
|
+
constructor(fetchProjection: ((sessionId: string) => Promise<readonly TProjection[]>) | undefined, repaint: (sessionId: string, projection: readonly TProjection[]) => void);
|
|
17
|
+
/** 会话入场(幂等;焦点不自动变更——显式 focus 才切) */
|
|
18
|
+
registerSession(sessionId: string): void;
|
|
19
|
+
/** 会话退场:在场集移除;若正是聚焦者 → 焦点空悬(不自动接续) */
|
|
20
|
+
unregisterSession(sessionId: string): void;
|
|
21
|
+
/** 当前聚焦会话(null = 焦点空悬——全体非聚焦态) */
|
|
22
|
+
get focusedId(): string | null;
|
|
23
|
+
isFocused(sessionId: string): boolean;
|
|
24
|
+
/** 在场判定(emit 路由前置——不在场会话的信封仍可分流,呈现裁剪归后端) */
|
|
25
|
+
has(sessionId: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* 焦点切换(07 §4.1:清屏重画):置位 → 拉投影 → repaint。
|
|
28
|
+
* 投影拉取缺席 → 空投影重画(诚实缺席:装配缺真源是可观察态,不静默假装
|
|
29
|
+
* 有历史);拉取异常向上抛(fail-loud——投影真源故障不降级为「无历史」谎言)。
|
|
30
|
+
* 未注册会话 focus 视同注册(焦点即活跃声明——幂等)。
|
|
31
|
+
*/
|
|
32
|
+
focus(sessionId: string): Promise<void>;
|
|
33
|
+
}
|