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,149 @@
|
|
|
1
|
+
import { ansiColor } from '../../engine/index.js';
|
|
2
|
+
import { ACCENT_INDEX } from '../theme.js';
|
|
3
|
+
import { prefixDisplayWidth } from '../editor/visual-lines.js';
|
|
4
|
+
/** 弹层可见条目帽(超出窗口滚动跟随高亮) */
|
|
5
|
+
const MAX_VISIBLE_ITEMS = 10;
|
|
6
|
+
/** 高亮行样式(整行反色——与 SelectPanel 同视觉语言) */
|
|
7
|
+
const ACTIVE_STYLE = Object.freeze({ inverse: true });
|
|
8
|
+
/** 补充说明段样式(dim) */
|
|
9
|
+
const DETAIL_STYLE = Object.freeze({ dim: true });
|
|
10
|
+
/** 无候选提示样式(accent——theme 单源) */
|
|
11
|
+
const EMPTY_STYLE = Object.freeze({ fg: ansiColor(ACCENT_INDEX) });
|
|
12
|
+
/** 弹层件:provider 只读消费 + 模型代换原语调用 */
|
|
13
|
+
export class AutocompletePopup {
|
|
14
|
+
result = null;
|
|
15
|
+
activeIndex = 0;
|
|
16
|
+
windowStart = 0;
|
|
17
|
+
provider;
|
|
18
|
+
model;
|
|
19
|
+
constructor(provider, model) {
|
|
20
|
+
this.provider = provider;
|
|
21
|
+
this.model = model;
|
|
22
|
+
}
|
|
23
|
+
/** 弹层在场态(无补全不显) */
|
|
24
|
+
get visible() {
|
|
25
|
+
return this.result !== null;
|
|
26
|
+
}
|
|
27
|
+
/** 高亮下标(测试观测面) */
|
|
28
|
+
get activeItemIndex() {
|
|
29
|
+
return this.activeIndex;
|
|
30
|
+
}
|
|
31
|
+
/** 重取补全(每次输入变更后装配调——无补全自然隐藏) */
|
|
32
|
+
refresh() {
|
|
33
|
+
const cursor = this.model.getCursor();
|
|
34
|
+
this.result = this.provider.getCompletions({
|
|
35
|
+
lines: this.model.getLines(),
|
|
36
|
+
cursorLine: cursor.line,
|
|
37
|
+
cursorCol: cursor.col,
|
|
38
|
+
});
|
|
39
|
+
this.activeIndex = 0;
|
|
40
|
+
this.windowStart = 0;
|
|
41
|
+
}
|
|
42
|
+
/** 量高:可见条目数(不可见 = 0——浮层不占布局) */
|
|
43
|
+
measure(width) {
|
|
44
|
+
void width;
|
|
45
|
+
const count = this.result?.items.length ?? 0;
|
|
46
|
+
return Math.min(count, MAX_VISIBLE_ITEMS);
|
|
47
|
+
}
|
|
48
|
+
/** 落位:铺底空格 → 可见窗条目行(高亮反色 + 说明右对齐) */
|
|
49
|
+
render(buffer, region) {
|
|
50
|
+
if (this.result === null)
|
|
51
|
+
return;
|
|
52
|
+
// 铺底空格(写格覆盖——未写格会透出主树文字)
|
|
53
|
+
for (let r = 0; r < region.height; r++) {
|
|
54
|
+
for (let c = 0; c < region.width; c++) {
|
|
55
|
+
buffer.setCell(region.row + r, region.col + c, ' ');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const items = this.result.items;
|
|
59
|
+
if (items.length === 0) {
|
|
60
|
+
buffer.writeText(region.row, region.col, '无匹配', EMPTY_STYLE);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const end = Math.min(items.length, this.windowStart + MAX_VISIBLE_ITEMS);
|
|
64
|
+
for (let i = this.windowStart; i < end; i++) {
|
|
65
|
+
const row = region.row + (i - this.windowStart);
|
|
66
|
+
const item = items[i];
|
|
67
|
+
const active = i === this.activeIndex;
|
|
68
|
+
const prefix = active ? '❯ ' : ' ';
|
|
69
|
+
buffer.writeText(row, region.col, `${prefix}${item.label}`, active ? ACTIVE_STYLE : undefined);
|
|
70
|
+
if (item.detail !== undefined && item.detail.length > 0) {
|
|
71
|
+
// 右对齐按显示宽(CJK 段宽 ≠ 码位数)
|
|
72
|
+
const detailCols = prefixDisplayWidth(item.detail, item.detail.length);
|
|
73
|
+
buffer.writeText(row, region.col + region.width - detailCols, item.detail, DETAIL_STYLE);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** 事件分发(弹层可见才有意义):↑/↓ / enter / tab / escape,其余穿透 */
|
|
78
|
+
handleEvent(event) {
|
|
79
|
+
if (this.result === null)
|
|
80
|
+
return false; // 不在场不挡键
|
|
81
|
+
if (event.kind !== 'key')
|
|
82
|
+
return false; // 文本 / IME / 粘贴穿透回输入件
|
|
83
|
+
if (event.phase === 'release')
|
|
84
|
+
return false;
|
|
85
|
+
if (event.ctrl || event.alt || event.shift || event.meta)
|
|
86
|
+
return false; // 修饰组合穿透(编辑键面)
|
|
87
|
+
if (event.key === 'up') {
|
|
88
|
+
this.moveActive(-1);
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
if (event.key === 'down') {
|
|
92
|
+
this.moveActive(1);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
if (event.key === 'enter' || event.key === 'tab') {
|
|
96
|
+
// 全量输入穿透律(2026-09-13 真模型五轮实测定罪修复):当前 token 已是
|
|
97
|
+
// 高亮项 replacement 全文时,enter 的「应用」是无净代换的空动作——吞键
|
|
98
|
+
// 会把完整输入的斜杠命令逼成「先应用再提交」双 enter 形(且第二次输入
|
|
99
|
+
// 与残留拼接进模型)。此处 enter 穿透回编辑器走提交语义;tab 专职填充
|
|
100
|
+
// 无提交歧义、恒应用(键面分离)。
|
|
101
|
+
if (event.key === 'enter' && this.selectionAlreadyTyped())
|
|
102
|
+
return false;
|
|
103
|
+
this.applySelection();
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
if (event.key === 'escape') {
|
|
107
|
+
this.result = null; // 关本轮(后续输入再 refresh 重开)
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return false; // 其余键穿透(backspace / 字符等继续编辑——弹层随下次 refresh 重算)
|
|
111
|
+
}
|
|
112
|
+
/** 高亮循环移动 + 窗口跟随(10 行帽外的条目滚动入窗) */
|
|
113
|
+
moveActive(delta) {
|
|
114
|
+
const count = this.result?.items.length ?? 0;
|
|
115
|
+
if (count === 0)
|
|
116
|
+
return;
|
|
117
|
+
this.activeIndex = (this.activeIndex + delta + count) % count;
|
|
118
|
+
if (this.activeIndex < this.windowStart)
|
|
119
|
+
this.windowStart = this.activeIndex;
|
|
120
|
+
if (this.activeIndex >= this.windowStart + MAX_VISIBLE_ITEMS) {
|
|
121
|
+
this.windowStart = this.activeIndex - MAX_VISIBLE_ITEMS + 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** 应用选中项:整 token 代换(模型原语——光标落代换尾) */
|
|
125
|
+
applySelection() {
|
|
126
|
+
const result = this.result;
|
|
127
|
+
if (result === null || result.items.length === 0)
|
|
128
|
+
return;
|
|
129
|
+
const item = result.items[this.activeIndex];
|
|
130
|
+
this.result = null; // 应用即隐(先隐后代换——代换的 notify 可能再触发 refresh 重开,属新轮)
|
|
131
|
+
const cursor = this.model.getCursor();
|
|
132
|
+
this.model.replaceToken(cursor.line, result.replaceStart, result.replaceEnd, item.replacement);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 全量输入判定:光标 token 现文本 === 高亮项 replacement 全文(弹层可见期
|
|
136
|
+
* 间输入变更必经 refresh 重开——本判定取值恒新鲜,无陈旧区间风险)。
|
|
137
|
+
*/
|
|
138
|
+
selectionAlreadyTyped() {
|
|
139
|
+
const result = this.result;
|
|
140
|
+
if (result === null || result.items.length === 0)
|
|
141
|
+
return false;
|
|
142
|
+
const item = result.items[this.activeIndex];
|
|
143
|
+
const line = this.model.getLines()[this.model.getCursor().line];
|
|
144
|
+
if (line === undefined)
|
|
145
|
+
return false;
|
|
146
|
+
return line.slice(result.replaceStart, result.replaceEnd) === item.replacement;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=popup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popup.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/autocomplete/popup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 补全协议件(07 §4.1 引擎节件 6(组件与呈现装配件)):多行坐标协议 + 候选条目 + 取补全接口。
|
|
3
|
+
*
|
|
4
|
+
* 多行坐标协议(承 berry @-mention 协议签名):上下文带 lines/cursorLine/
|
|
5
|
+
* cursorCol——按多行输入件坐标定位光标 token,弹层与源都只认本协议。
|
|
6
|
+
*/
|
|
7
|
+
/** 补全上下文(多行输入件坐标——模型只读投影) */
|
|
8
|
+
export interface AutocompleteContext {
|
|
9
|
+
readonly lines: readonly string[];
|
|
10
|
+
readonly cursorLine: number;
|
|
11
|
+
readonly cursorCol: number;
|
|
12
|
+
}
|
|
13
|
+
/** 补全候选条目 */
|
|
14
|
+
export interface AutocompleteItem {
|
|
15
|
+
/** 呈现主文案 */
|
|
16
|
+
readonly label: string;
|
|
17
|
+
/** 右侧补充说明(弹层右对齐 dim 段) */
|
|
18
|
+
readonly detail?: string;
|
|
19
|
+
/**
|
|
20
|
+
* 整 token 代换单位:完整新 token 文本(含触发前缀——'/model'、
|
|
21
|
+
* '@"my file.txt"' 引号形防尾空格击穿:label 含空格时源侧以引号包裹,
|
|
22
|
+
* 后续输入的空白不再把 token 劈开击穿补全)。
|
|
23
|
+
*/
|
|
24
|
+
readonly replacement: string;
|
|
25
|
+
}
|
|
26
|
+
/** 取补全结果(token 代换区间 = 光标所在逻辑行的 [start,end)) */
|
|
27
|
+
export interface AutocompleteResult {
|
|
28
|
+
readonly items: readonly AutocompleteItem[];
|
|
29
|
+
/** 行内 UTF-16 起点(token 首) */
|
|
30
|
+
readonly replaceStart: number;
|
|
31
|
+
/** 行内 UTF-16 终点(= 光标位——只代换光标前段) */
|
|
32
|
+
readonly replaceEnd: number;
|
|
33
|
+
}
|
|
34
|
+
/** 补全源接口(组合件之外的独立源实现面) */
|
|
35
|
+
export interface AutocompleteProvider {
|
|
36
|
+
/** 无补全返回 null(弹层不显) */
|
|
37
|
+
getCompletions(context: AutocompleteContext): AutocompleteResult | null;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/autocomplete/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* token 判据件(07 §4.1 引擎节件 6(组件与呈现装配件) 补全段):光标 token 提取(引号感知)
|
|
3
|
+
* 与行首 token 区间。
|
|
4
|
+
*
|
|
5
|
+
* 引号感知:token 边界 = 最近的**未引用空白**——从行首正向扫描推进引号
|
|
6
|
+
* 开闭态(引号内空白不断 token——@"my file" 形整段为一个 token);引号
|
|
7
|
+
* 字符本身属 token(代换区间含引号)。
|
|
8
|
+
* 已知边界:未闭合引号一路吸到引号头(输入中间态本就未闭合,可接受)。
|
|
9
|
+
*/
|
|
10
|
+
/** 光标 token(行内 UTF-16 区间 + 原文) */
|
|
11
|
+
export interface CursorToken {
|
|
12
|
+
readonly start: number;
|
|
13
|
+
readonly end: number;
|
|
14
|
+
readonly text: string;
|
|
15
|
+
}
|
|
16
|
+
/** 光标前 token 提取(col === 0 或紧邻空白 → null) */
|
|
17
|
+
export declare function tokenAtCursor(line: string, col: number): CursorToken | null;
|
|
18
|
+
/** 行首 token 区间(引号感知;空白行 / 空串 → null) */
|
|
19
|
+
export declare function firstTokenRange(line: string): {
|
|
20
|
+
start: number;
|
|
21
|
+
end: number;
|
|
22
|
+
} | null;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* token 判据件(07 §4.1 引擎节件 6(组件与呈现装配件) 补全段):光标 token 提取(引号感知)
|
|
3
|
+
* 与行首 token 区间。
|
|
4
|
+
*
|
|
5
|
+
* 引号感知:token 边界 = 最近的**未引用空白**——从行首正向扫描推进引号
|
|
6
|
+
* 开闭态(引号内空白不断 token——@"my file" 形整段为一个 token);引号
|
|
7
|
+
* 字符本身属 token(代换区间含引号)。
|
|
8
|
+
* 已知边界:未闭合引号一路吸到引号头(输入中间态本就未闭合,可接受)。
|
|
9
|
+
*/
|
|
10
|
+
/** 光标前 token 提取(col === 0 或紧邻空白 → null) */
|
|
11
|
+
export function tokenAtCursor(line, col) {
|
|
12
|
+
if (col <= 0 || col > line.length)
|
|
13
|
+
return null;
|
|
14
|
+
// 正向扫描(引号态须从行首推进——反向扫遇空白先于遇引号头,无法判定
|
|
15
|
+
// 该空白是否被右侧引号包住)
|
|
16
|
+
let start = 0;
|
|
17
|
+
let quote = null;
|
|
18
|
+
for (let i = 0; i < col; i++) {
|
|
19
|
+
const ch = line[i];
|
|
20
|
+
if (quote !== null) {
|
|
21
|
+
if (ch === quote)
|
|
22
|
+
quote = null; // 引号闭
|
|
23
|
+
continue; // 引号内字符(含空白)不断 token
|
|
24
|
+
}
|
|
25
|
+
if (ch === '"' || ch === "'") {
|
|
26
|
+
quote = ch; // 引号开
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (ch === ' ' || ch === '\t')
|
|
30
|
+
start = i + 1; // 未引用空白——token 边界
|
|
31
|
+
}
|
|
32
|
+
const text = line.slice(start, col);
|
|
33
|
+
if (text === '')
|
|
34
|
+
return null; // 紧邻空白——无 token
|
|
35
|
+
return { start, end: col, text };
|
|
36
|
+
}
|
|
37
|
+
/** 行首 token 区间(引号感知;空白行 / 空串 → null) */
|
|
38
|
+
export function firstTokenRange(line) {
|
|
39
|
+
if (line === '')
|
|
40
|
+
return null;
|
|
41
|
+
let start = 0;
|
|
42
|
+
// 跳过行首空白(首 token 起点后移)
|
|
43
|
+
while (start < line.length && (line[start] === ' ' || line[start] === '\t'))
|
|
44
|
+
start++;
|
|
45
|
+
if (start >= line.length)
|
|
46
|
+
return null; // 全空白行
|
|
47
|
+
// 扫到未引用空白为终(与 tokenAtCursor 同边界判据)
|
|
48
|
+
let end = start;
|
|
49
|
+
let quote = null;
|
|
50
|
+
for (let i = start; i < line.length; i++) {
|
|
51
|
+
const ch = line[i];
|
|
52
|
+
if (quote !== null) {
|
|
53
|
+
if (ch === quote)
|
|
54
|
+
quote = null;
|
|
55
|
+
end = i + 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (ch === '"' || ch === "'") {
|
|
59
|
+
quote = ch;
|
|
60
|
+
end = i + 1;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (ch === ' ' || ch === '\t')
|
|
64
|
+
break;
|
|
65
|
+
end = i + 1;
|
|
66
|
+
}
|
|
67
|
+
return { start, end };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/autocomplete/token.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,2CAA2C;AAC3C,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,GAAW;IACrD,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/C,oCAAoC;IACpC,gBAAgB;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,EAAE,KAAK,KAAK;gBAAE,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM;YACtC,SAAS,CAAC,qBAAqB;QACjC,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,KAAK,GAAG,EAAE,CAAC,CAAC,MAAM;YAClB,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI;YAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,CAAC,gBAAgB;IAC9C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,uBAAuB;IACvB,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;QAAE,KAAK,EAAE,CAAC;IACrF,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,CAAC,OAAO;IAC9C,mCAAmC;IACnC,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,EAAE,KAAK,KAAK;gBAAE,KAAK,GAAG,IAAI,CAAC;YAC/B,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,KAAK,GAAG,EAAE,CAAC;YACX,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI;YAAE,MAAM;QACrC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 主屏 inline 形态 ANSI 编舞基件(07 §4.1「屏幕模型双形态」主屏条——批 10e)。
|
|
3
|
+
*
|
|
4
|
+
* 主屏物理形态:DECSTBM 滚动区承载正文(区底写满自动滚——滚出视口整行交
|
|
5
|
+
* 终端原生 scrollback),固定区(输入框 + 状态行)钉屏底区外、绝对位可知。
|
|
6
|
+
* 本件提供四组原语:
|
|
7
|
+
* - 网格行 → ANSI 序列化(cell 样式 + 字素——与 diff 件行写出同语义:续格
|
|
8
|
+
* 跳过、语义空格字面、行尾不填充);
|
|
9
|
+
* - 网格行 → 带样式行(StyleRun 段族——批 10f-4 件 8 回看器 cell 写出形的
|
|
10
|
+
* 数据源;带样式行 → ANSI 序列化同件在位,主屏直写与回看器零第二渲染器);
|
|
11
|
+
* - 定位序列(绝对 CUP / 相对 CUU·CUD / CR / EL)与光标保存恢复;
|
|
12
|
+
* - 行级差分(固定区重画——变行重写、未变行零写出,行粒度复用 cellEquals)。
|
|
13
|
+
*/
|
|
14
|
+
import { type CellGrid, type CellStyle } from '../../engine/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* 样式段(批 10f-4 件 8 回看器——带样式行的呈现词汇):逻辑行内同样式连续
|
|
17
|
+
* 区间,端点 = plain 文本的 UTF-16 下标(start 含 / end 不含)。段间空隙 =
|
|
18
|
+
* 裸文本(无样式),段升序不交叠由构造方(gridRowToStyled / 各块序列化)保证。
|
|
19
|
+
*/
|
|
20
|
+
export interface StyleRun {
|
|
21
|
+
readonly start: number;
|
|
22
|
+
readonly end: number;
|
|
23
|
+
readonly style: CellStyle;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 带样式行:plain 纯文本供折叠宽算术 / 搜索消费(零转义零样式混入);
|
|
27
|
+
* runs 供 cell 网格呈现消费。主屏 ANSI 直写形(gridRowToAnsi / 简行 dim)
|
|
28
|
+
* 与件 8 回看器 cell 写出形共用同一数据源——零第二渲染器(07 件 8 数据源
|
|
29
|
+
* 条款的结构位)。
|
|
30
|
+
*/
|
|
31
|
+
export interface StyledLine {
|
|
32
|
+
readonly plain: string;
|
|
33
|
+
readonly runs: readonly StyleRun[];
|
|
34
|
+
}
|
|
35
|
+
/** SGR 全复位 */
|
|
36
|
+
export declare const SGR_RESET = "\u001B[0m";
|
|
37
|
+
/** EL 0:自光标至行尾 */
|
|
38
|
+
export declare const EL_TO_EOL = "\u001B[K";
|
|
39
|
+
/** 回行首(列 0——不滚行) */
|
|
40
|
+
export declare const CR = "\r";
|
|
41
|
+
/** 换行(滚动区内:区底自动滚、区外/中部只下移) */
|
|
42
|
+
export declare const LF = "\n";
|
|
43
|
+
/** 清全屏 + 光标归位(repaint 路) */
|
|
44
|
+
export declare const CLEAR_SCREEN = "\u001B[2J\u001B[H";
|
|
45
|
+
/** 设滚动区 DECSTBM(1 基行号——底部固定区留区外) */
|
|
46
|
+
export declare function setScrollRegion(bottomRow1Based: number): string;
|
|
47
|
+
/** 绝对定位(0 基入参——固定区专用:区外钉屏底、绝对位可知) */
|
|
48
|
+
export declare function cup(row: number, col: number): string;
|
|
49
|
+
/** 相对上移 n 行(CUU——滚动区内槽位重画定位;边缘安全不滚) */
|
|
50
|
+
export declare function cuu(n: number): string;
|
|
51
|
+
/** 相对下移 n 行(CUD——边缘安全不滚) */
|
|
52
|
+
export declare function cud(n: number): string;
|
|
53
|
+
/** 样式 → SGR(与 diff 件 buildSgr 同语义:属性位 + 16 色前景背景全量形;简行块直拼消费) */
|
|
54
|
+
export declare function buildSgr(style: {
|
|
55
|
+
bold?: boolean;
|
|
56
|
+
dim?: boolean;
|
|
57
|
+
italic?: boolean;
|
|
58
|
+
underline?: boolean;
|
|
59
|
+
inverse?: boolean;
|
|
60
|
+
fg?: number;
|
|
61
|
+
bg?: number;
|
|
62
|
+
}): string;
|
|
63
|
+
/**
|
|
64
|
+
* 网格行 → ANSI 文本(无内容返回空串——调用方据此跳过写出)。
|
|
65
|
+
* 行尾变空白不产 EL(直写正文行是追加语义、行尾从无旧残留——EL 归擦区编舞)。
|
|
66
|
+
*/
|
|
67
|
+
export declare function gridRowToAnsi(grid: CellGrid, row: number): string;
|
|
68
|
+
/**
|
|
69
|
+
* 网格行 → 带样式行(批 10f-4 件 8——回看器 cell 写出形的数据源)。
|
|
70
|
+
* 行走序与 gridRowToAnsi 同构(末列内容界 + 续格跳过 + 空洞空格),相邻同样式
|
|
71
|
+
* 格合并为单段;缺省样式段不产段(与空隙同形——序列化零冗余的基础)。
|
|
72
|
+
* 无内容行返回 null(调用方按需补空行——与 gridRowToAnsi 空串约定同构)。
|
|
73
|
+
*/
|
|
74
|
+
export declare function gridRowToStyled(grid: CellGrid, row: number): StyledLine | null;
|
|
75
|
+
/**
|
|
76
|
+
* 带样式行 → ANSI 串(主屏直写形——与 gridRowToAnsi 同语义的行序列化:
|
|
77
|
+
* 样式变化点复位再设、同样式零冗余、行尾归零不染后续写出)。
|
|
78
|
+
* renderBlockLines 经本函数从带样式行导出 ANSI 形——两形零第二渲染器。
|
|
79
|
+
*/
|
|
80
|
+
export declare function styledLineToAnsi(line: StyledLine): string;
|
|
81
|
+
/**
|
|
82
|
+
* 固定区行级差分(行粒度——变行整行重写、未变行零写出)。
|
|
83
|
+
* 返回 ANSI 串(含定位与行尾 EL——擦除只走 EL 禁空格填充);行位以
|
|
84
|
+
* baseRow 屏偏移绝对定位(固定区钉屏底、区外位可知)。
|
|
85
|
+
*/
|
|
86
|
+
export declare function renderFixedRegionDiff(from: CellGrid | null, to: CellGrid, baseRow: number): string;
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 主屏 inline 形态 ANSI 编舞基件(07 §4.1「屏幕模型双形态」主屏条——批 10e)。
|
|
3
|
+
*
|
|
4
|
+
* 主屏物理形态:DECSTBM 滚动区承载正文(区底写满自动滚——滚出视口整行交
|
|
5
|
+
* 终端原生 scrollback),固定区(输入框 + 状态行)钉屏底区外、绝对位可知。
|
|
6
|
+
* 本件提供四组原语:
|
|
7
|
+
* - 网格行 → ANSI 序列化(cell 样式 + 字素——与 diff 件行写出同语义:续格
|
|
8
|
+
* 跳过、语义空格字面、行尾不填充);
|
|
9
|
+
* - 网格行 → 带样式行(StyleRun 段族——批 10f-4 件 8 回看器 cell 写出形的
|
|
10
|
+
* 数据源;带样式行 → ANSI 序列化同件在位,主屏直写与回看器零第二渲染器);
|
|
11
|
+
* - 定位序列(绝对 CUP / 相对 CUU·CUD / CR / EL)与光标保存恢复;
|
|
12
|
+
* - 行级差分(固定区重画——变行重写、未变行零写出,行粒度复用 cellEquals)。
|
|
13
|
+
*/
|
|
14
|
+
import { cellEquals, EMPTY_STYLE, styleEquals } from '../../engine/index.js';
|
|
15
|
+
/** ESC 前缀 */
|
|
16
|
+
const ESC = '\x1b';
|
|
17
|
+
/** 缺省样式判据:styleEquals 对 EMPTY_STYLE 单源(CellStyle 增字段自动同步——
|
|
18
|
+
* 勿手工罗列字段判缺省,10f-4 核验轮勘正) */
|
|
19
|
+
function isDefaultStyle(style) {
|
|
20
|
+
return styleEquals(style, EMPTY_STYLE);
|
|
21
|
+
}
|
|
22
|
+
/** SGR 全复位 */
|
|
23
|
+
export const SGR_RESET = `${ESC}[0m`;
|
|
24
|
+
/** EL 0:自光标至行尾 */
|
|
25
|
+
export const EL_TO_EOL = `${ESC}[K`;
|
|
26
|
+
/** 回行首(列 0——不滚行) */
|
|
27
|
+
export const CR = '\r';
|
|
28
|
+
/** 换行(滚动区内:区底自动滚、区外/中部只下移) */
|
|
29
|
+
export const LF = '\n';
|
|
30
|
+
/** 清全屏 + 光标归位(repaint 路) */
|
|
31
|
+
export const CLEAR_SCREEN = `${ESC}[2J${ESC}[H`;
|
|
32
|
+
/** 设滚动区 DECSTBM(1 基行号——底部固定区留区外) */
|
|
33
|
+
export function setScrollRegion(bottomRow1Based) {
|
|
34
|
+
return `${ESC}[1;${bottomRow1Based}r`;
|
|
35
|
+
}
|
|
36
|
+
/** 绝对定位(0 基入参——固定区专用:区外钉屏底、绝对位可知) */
|
|
37
|
+
export function cup(row, col) {
|
|
38
|
+
return `${ESC}[${row + 1};${col + 1}H`;
|
|
39
|
+
}
|
|
40
|
+
/** 相对上移 n 行(CUU——滚动区内槽位重画定位;边缘安全不滚) */
|
|
41
|
+
export function cuu(n) {
|
|
42
|
+
return n > 0 ? `${ESC}[${n}A` : '';
|
|
43
|
+
}
|
|
44
|
+
/** 相对下移 n 行(CUD——边缘安全不滚) */
|
|
45
|
+
export function cud(n) {
|
|
46
|
+
return n > 0 ? `${ESC}[${n}B` : '';
|
|
47
|
+
}
|
|
48
|
+
/** 样式 → SGR(与 diff 件 buildSgr 同语义:属性位 + 16 色前景背景全量形;简行块直拼消费) */
|
|
49
|
+
export function buildSgr(style) {
|
|
50
|
+
const params = [];
|
|
51
|
+
if (style.bold)
|
|
52
|
+
params.push('1');
|
|
53
|
+
if (style.dim)
|
|
54
|
+
params.push('2');
|
|
55
|
+
if (style.italic)
|
|
56
|
+
params.push('3');
|
|
57
|
+
if (style.underline)
|
|
58
|
+
params.push('4');
|
|
59
|
+
if (style.inverse)
|
|
60
|
+
params.push('7');
|
|
61
|
+
if (style.fg !== undefined)
|
|
62
|
+
params.push(String(style.fg < 8 ? 30 + style.fg : 82 + style.fg));
|
|
63
|
+
if (style.bg !== undefined)
|
|
64
|
+
params.push(String(style.bg < 8 ? 40 + style.bg : 92 + style.bg));
|
|
65
|
+
return params.length > 0 ? `${ESC}[${params.join(';')}m` : '';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 网格行 → ANSI 文本(无内容返回空串——调用方据此跳过写出)。
|
|
69
|
+
* 行尾变空白不产 EL(直写正文行是追加语义、行尾从无旧残留——EL 归擦区编舞)。
|
|
70
|
+
*/
|
|
71
|
+
export function gridRowToAnsi(grid, row) {
|
|
72
|
+
// 内容末列 = 最右非空格格(续格属首格字素占位、算内容延伸)
|
|
73
|
+
let last = -1;
|
|
74
|
+
for (let col = grid.columns - 1; col >= 0; col--) {
|
|
75
|
+
if (!cellEquals(grid.getCell(row, col), null)) {
|
|
76
|
+
last = col;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (last < 0)
|
|
81
|
+
return '';
|
|
82
|
+
let out = '';
|
|
83
|
+
// 当前样式序列('' = 裸文本态;同样式零冗余、变化点复位再设——与 diff 件同纪律)
|
|
84
|
+
let currentSgr = '';
|
|
85
|
+
for (let col = 0; col <= last; col++) {
|
|
86
|
+
const cell = grid.getCell(row, col);
|
|
87
|
+
if (cell !== null && cell.width === 0)
|
|
88
|
+
continue; // 续格跳过
|
|
89
|
+
if (cell === null) {
|
|
90
|
+
out += ' '; // 语义空格(行中内容洞)字面写
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const sgr = buildSgr(cell.style);
|
|
94
|
+
if (sgr !== currentSgr) {
|
|
95
|
+
out += (currentSgr !== '' ? SGR_RESET : '') + sgr;
|
|
96
|
+
currentSgr = sgr;
|
|
97
|
+
}
|
|
98
|
+
out += cell.grapheme;
|
|
99
|
+
}
|
|
100
|
+
if (currentSgr !== '')
|
|
101
|
+
out += SGR_RESET; // 行尾归零——不染后续写出
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 网格行 → 带样式行(批 10f-4 件 8——回看器 cell 写出形的数据源)。
|
|
106
|
+
* 行走序与 gridRowToAnsi 同构(末列内容界 + 续格跳过 + 空洞空格),相邻同样式
|
|
107
|
+
* 格合并为单段;缺省样式段不产段(与空隙同形——序列化零冗余的基础)。
|
|
108
|
+
* 无内容行返回 null(调用方按需补空行——与 gridRowToAnsi 空串约定同构)。
|
|
109
|
+
*/
|
|
110
|
+
export function gridRowToStyled(grid, row) {
|
|
111
|
+
// 内容末列 = 最右非空格格(续格属首格字素占位、算内容延伸)
|
|
112
|
+
let last = -1;
|
|
113
|
+
for (let col = grid.columns - 1; col >= 0; col--) {
|
|
114
|
+
if (!cellEquals(grid.getCell(row, col), null)) {
|
|
115
|
+
last = col;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (last < 0)
|
|
120
|
+
return null;
|
|
121
|
+
let plain = '';
|
|
122
|
+
const runs = [];
|
|
123
|
+
for (let col = 0; col <= last; col++) {
|
|
124
|
+
const cell = grid.getCell(row, col);
|
|
125
|
+
if (cell !== null && cell.width === 0)
|
|
126
|
+
continue; // 续格跳过(首格已携整字素)
|
|
127
|
+
const grapheme = cell === null ? ' ' : cell.grapheme; // 语义空格(行中内容洞)
|
|
128
|
+
const style = cell === null ? EMPTY_STYLE : cell.style;
|
|
129
|
+
const start = plain.length;
|
|
130
|
+
plain += grapheme; // 全字素入 plain(缺省样式字素是空隙文本——不丢字)
|
|
131
|
+
if (isDefaultStyle(style))
|
|
132
|
+
continue; // 缺省段不产段(gap 即裸文本)
|
|
133
|
+
// 同样式紧邻续段合并(段端点连续才并——中间有缺省格即断开)
|
|
134
|
+
const prev = runs[runs.length - 1];
|
|
135
|
+
if (prev !== undefined && styleEquals(prev.style, style) && prev.end === start) {
|
|
136
|
+
runs[runs.length - 1] = { start: prev.start, end: start + grapheme.length, style };
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
runs.push({ start, end: start + grapheme.length, style });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { plain, runs };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 带样式行 → ANSI 串(主屏直写形——与 gridRowToAnsi 同语义的行序列化:
|
|
146
|
+
* 样式变化点复位再设、同样式零冗余、行尾归零不染后续写出)。
|
|
147
|
+
* renderBlockLines 经本函数从带样式行导出 ANSI 形——两形零第二渲染器。
|
|
148
|
+
*/
|
|
149
|
+
export function styledLineToAnsi(line) {
|
|
150
|
+
const { plain, runs } = line;
|
|
151
|
+
if (runs.length === 0)
|
|
152
|
+
return plain;
|
|
153
|
+
let out = '';
|
|
154
|
+
let currentSgr = '';
|
|
155
|
+
let pos = 0;
|
|
156
|
+
for (const run of runs) {
|
|
157
|
+
if (run.start > pos) {
|
|
158
|
+
// 段前空隙:在身样式先归零再写裸文本
|
|
159
|
+
if (currentSgr !== '') {
|
|
160
|
+
out += SGR_RESET;
|
|
161
|
+
currentSgr = '';
|
|
162
|
+
}
|
|
163
|
+
out += plain.slice(pos, run.start);
|
|
164
|
+
}
|
|
165
|
+
const sgr = buildSgr(run.style);
|
|
166
|
+
if (sgr !== currentSgr) {
|
|
167
|
+
out += (currentSgr !== '' ? SGR_RESET : '') + sgr;
|
|
168
|
+
currentSgr = sgr;
|
|
169
|
+
}
|
|
170
|
+
out += plain.slice(run.start, run.end);
|
|
171
|
+
pos = run.end;
|
|
172
|
+
}
|
|
173
|
+
if (pos < plain.length) {
|
|
174
|
+
// 段尾空隙:归零后写裸文本
|
|
175
|
+
if (currentSgr !== '') {
|
|
176
|
+
out += SGR_RESET;
|
|
177
|
+
currentSgr = '';
|
|
178
|
+
}
|
|
179
|
+
out += plain.slice(pos);
|
|
180
|
+
}
|
|
181
|
+
if (currentSgr !== '')
|
|
182
|
+
out += SGR_RESET;
|
|
183
|
+
return out;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 固定区行级差分(行粒度——变行整行重写、未变行零写出)。
|
|
187
|
+
* 返回 ANSI 串(含定位与行尾 EL——擦除只走 EL 禁空格填充);行位以
|
|
188
|
+
* baseRow 屏偏移绝对定位(固定区钉屏底、区外位可知)。
|
|
189
|
+
*/
|
|
190
|
+
export function renderFixedRegionDiff(from, to, baseRow) {
|
|
191
|
+
let out = '';
|
|
192
|
+
for (let row = 0; row < to.rows; row++) {
|
|
193
|
+
if (from !== null && row < from.rows && gridRowEquals(from, to, row))
|
|
194
|
+
continue; // 未变行零写出
|
|
195
|
+
const text = gridRowToAnsi(to, row);
|
|
196
|
+
// 定位行首 → 复位 →(有内容写内容)→ 无条件 EL(行尾残留擦除——与 diff 件同律)
|
|
197
|
+
out += cup(baseRow + row, 0) + SGR_RESET + (text !== '' ? text + SGR_RESET : '') + EL_TO_EOL;
|
|
198
|
+
}
|
|
199
|
+
return out;
|
|
200
|
+
}
|
|
201
|
+
/** 行相等判定(逐格 cellEquals 直比) */
|
|
202
|
+
function gridRowEquals(a, b, row) {
|
|
203
|
+
for (let col = 0; col < b.columns; col++) {
|
|
204
|
+
if (!cellEquals(a.getCell(row, col), b.getCell(row, col)))
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=ansi-rows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi-rows.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/backend/ansi-rows.ts"],"names":[],"mappings":"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"}
|