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,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 视觉行映射纯函数(多行输入件 Editor 件族基件):逻辑行 → 折行后视觉行
|
|
3
|
+
* 的映射单源(垂直光标移动 / 视口滚动 / 渲染三消费方共用)。
|
|
4
|
+
*
|
|
5
|
+
* 本仓化关键差异(07 引擎节件 6(组件与呈现装配件)「字素光标算术——CJK 双宽对齐」条款):
|
|
6
|
+
* - 折行按**显示列宽**(字素 graphemeWidth 累计、整字下移不产半字——与引擎
|
|
7
|
+
* width 件 wrapText 同规则),段记录 UTF-16 下标面(startCol/length 供
|
|
8
|
+
* 字符串切片)+ 显示宽面(width 供视觉列算术)双坐标;
|
|
9
|
+
* - 垂直移动的视觉列 = **显示列**(光标前字素列宽和),非 UTF-16 码元差
|
|
10
|
+
* (pi 以码元差近似,CJK 双宽下 sticky 列漂移——本仓按规范双宽对齐)。
|
|
11
|
+
*/
|
|
12
|
+
import { graphemeWidth, splitGraphemes } from '../../engine/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* 单逻辑行按显示宽硬折(字素累宽超限整字下移——空行占一段零宽)。
|
|
15
|
+
* 返回段的 UTF-16 与显示宽双坐标。
|
|
16
|
+
*/
|
|
17
|
+
function foldLine(line, lineNo, width) {
|
|
18
|
+
if (width <= 0)
|
|
19
|
+
return [{ line: lineNo, startCol: 0, length: line.length, width: 0 }];
|
|
20
|
+
if (line === '')
|
|
21
|
+
return [{ line: lineNo, startCol: 0, length: 0, width: 0 }];
|
|
22
|
+
const segments = [];
|
|
23
|
+
let start = 0; // 当前段 UTF-16 起点
|
|
24
|
+
let usedCols = 0; // 当前段已占显示宽
|
|
25
|
+
let segLen = 0; // 当前段 UTF-16 长
|
|
26
|
+
for (const g of splitGraphemes(line)) {
|
|
27
|
+
const w = graphemeWidth(g);
|
|
28
|
+
if (usedCols + w > width) {
|
|
29
|
+
segments.push({ line: lineNo, startCol: start, length: segLen, width: usedCols });
|
|
30
|
+
start += segLen;
|
|
31
|
+
segLen = g.length;
|
|
32
|
+
usedCols = w;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
segLen += g.length;
|
|
36
|
+
usedCols += w;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
segments.push({ line: lineNo, startCol: start, length: segLen, width: usedCols });
|
|
40
|
+
return segments;
|
|
41
|
+
}
|
|
42
|
+
/** 全文档视觉行映射(逻辑行逐行硬折串接) */
|
|
43
|
+
export function buildVisualLineMap(lines, width) {
|
|
44
|
+
const out = [];
|
|
45
|
+
for (let i = 0; i < lines.length; i++)
|
|
46
|
+
out.push(...foldLine(lines[i] ?? '', i, width));
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 定位逻辑位置所在视觉行下标(col 为 UTF-16)。
|
|
51
|
+
* 逻辑行末段的末位(col = 行长)属末段——光标在行尾不落「下一段开头」。
|
|
52
|
+
*/
|
|
53
|
+
export function findVisualLineAt(map, line, col) {
|
|
54
|
+
for (let i = 0; i < map.length; i++) {
|
|
55
|
+
const vl = map[i];
|
|
56
|
+
if (vl.line !== line)
|
|
57
|
+
continue;
|
|
58
|
+
const offset = col - vl.startCol;
|
|
59
|
+
const isLastOfLine = i === map.length - 1 || map[i + 1].line !== vl.line;
|
|
60
|
+
if (offset >= 0 && (offset < vl.length || (isLastOfLine && offset === vl.length)))
|
|
61
|
+
return i;
|
|
62
|
+
}
|
|
63
|
+
return map.length - 1;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 段内显示列反查 UTF-16 下标:从段起点起累计字素宽,到目标显示列 targetCols
|
|
67
|
+
* 的字素边界(**光标永不落半字**——目标列落在宽字素中间时吸到其首列前,
|
|
68
|
+
* 返回该字素起点的 UTF-16 下标)。targetCols 超段宽返回段尾下标。
|
|
69
|
+
*/
|
|
70
|
+
export function colAtDisplayColumn(line, startCol, targetCols) {
|
|
71
|
+
let used = 0;
|
|
72
|
+
let idx = startCol;
|
|
73
|
+
for (const g of splitGraphemes(line.slice(startCol))) {
|
|
74
|
+
const w = graphemeWidth(g);
|
|
75
|
+
if (used + w > targetCols)
|
|
76
|
+
return idx; // 目标列落在本字素内——吸到首列前(半字防线)
|
|
77
|
+
used += w;
|
|
78
|
+
idx += g.length;
|
|
79
|
+
}
|
|
80
|
+
return idx;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 位置前缀显示宽:line 内 [0, col) 前缀的字素列宽和(光标视觉列算术的
|
|
84
|
+
* 单源——渲染光标定位 / sticky 列共用)。
|
|
85
|
+
*/
|
|
86
|
+
export function prefixDisplayWidth(line, col) {
|
|
87
|
+
let used = 0;
|
|
88
|
+
let idx = 0;
|
|
89
|
+
for (const g of splitGraphemes(line)) {
|
|
90
|
+
if (idx >= col)
|
|
91
|
+
break;
|
|
92
|
+
used += graphemeWidth(g);
|
|
93
|
+
idx += g.length;
|
|
94
|
+
}
|
|
95
|
+
return used;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 光标前一个字素的边界(UTF-16):backspace / moveLeft 的字素算术。
|
|
99
|
+
* col 已在行首返回 0。
|
|
100
|
+
*/
|
|
101
|
+
export function prevGraphemeBoundary(line, col) {
|
|
102
|
+
if (col <= 0)
|
|
103
|
+
return 0;
|
|
104
|
+
let idx = 0;
|
|
105
|
+
let prev = 0;
|
|
106
|
+
for (const g of splitGraphemes(line)) {
|
|
107
|
+
if (idx >= col)
|
|
108
|
+
return prev;
|
|
109
|
+
prev = idx;
|
|
110
|
+
idx += g.length;
|
|
111
|
+
}
|
|
112
|
+
return prev;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 光标后一个字素的终点(UTF-16):deleteForward / moveRight 的字素算术。
|
|
116
|
+
* col 已在行尾返回 line.length。
|
|
117
|
+
*/
|
|
118
|
+
export function nextGraphemeBoundary(line, col) {
|
|
119
|
+
let idx = 0;
|
|
120
|
+
for (const g of splitGraphemes(line)) {
|
|
121
|
+
if (idx >= col)
|
|
122
|
+
return idx + g.length;
|
|
123
|
+
idx += g.length;
|
|
124
|
+
}
|
|
125
|
+
return line.length;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=visual-lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-lines.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/editor/visual-lines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 光标向后移一词:跳过尾部空白,再跳一词(词内含 ASCII 标点切到最近标点
|
|
3
|
+
* 边界、标点 run 整段跳)。返回新光标(UTF-16 下标)——纯函数不改入参。
|
|
4
|
+
*/
|
|
5
|
+
export declare function findWordBackward(text: string, cursor: number): number;
|
|
6
|
+
/**
|
|
7
|
+
* 光标向前移一词:跳过前导空白,再跳一词(词内标点切到首个标点前、
|
|
8
|
+
* 标点 run 整段跳)。返回新光标(UTF-16 下标)——纯函数。
|
|
9
|
+
*/
|
|
10
|
+
export declare function findWordForward(text: string, cursor: number): number;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 词级导航纯函数(多行输入件 Editor 件族基件):findWordBackward /
|
|
3
|
+
* findWordForward——词级删除与词向移动共用的边界判定单源。
|
|
4
|
+
*
|
|
5
|
+
* 机制语义承 pi word-navigation.ts(裁 ⓪ 从零重写):
|
|
6
|
+
* - Intl.Segmenter **word 粒度**切词(与引擎 width 件的 grapheme 粒度不同
|
|
7
|
+
* 面——此处自持单例);
|
|
8
|
+
* - isWordLike 三分支:词内含 ASCII 标点时切到标点边界(foo.bar 一步到
|
|
9
|
+
* '.' 前)、非词非空白的标点 run 整段跳、空白跳过;
|
|
10
|
+
* - 纯函数零状态——调用方(编辑模型)自持光标。
|
|
11
|
+
*/
|
|
12
|
+
const wordSegmenter = new Intl.Segmenter(undefined, { granularity: 'word' });
|
|
13
|
+
/** ASCII 标点判(词内边界细化用——POSIX 图形字符中的非字母数字段) */
|
|
14
|
+
function isPunctuation(ch) {
|
|
15
|
+
const c = ch.charCodeAt(0);
|
|
16
|
+
return (c >= 0x21 && c <= 0x2f) || (c >= 0x3a && c <= 0x40) || (c >= 0x5b && c <= 0x60) || (c >= 0x7b && c <= 0x7e);
|
|
17
|
+
}
|
|
18
|
+
/** 词粒度分段(字素串 + isWordLike 标记) */
|
|
19
|
+
function segmentWords(text) {
|
|
20
|
+
const out = [];
|
|
21
|
+
for (const seg of wordSegmenter.segment(text)) {
|
|
22
|
+
out.push({ segment: seg.segment, isWordLike: seg.isWordLike === true });
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/** 空白判(词导航语义的空白 = 空白段整体跳过) */
|
|
27
|
+
function isWhitespace(text) {
|
|
28
|
+
return text.length > 0 && text.trim().length === 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 光标向后移一词:跳过尾部空白,再跳一词(词内含 ASCII 标点切到最近标点
|
|
32
|
+
* 边界、标点 run 整段跳)。返回新光标(UTF-16 下标)——纯函数不改入参。
|
|
33
|
+
*/
|
|
34
|
+
export function findWordBackward(text, cursor) {
|
|
35
|
+
if (cursor <= 0)
|
|
36
|
+
return 0;
|
|
37
|
+
const segments = segmentWords(text.slice(0, cursor));
|
|
38
|
+
let newCursor = cursor;
|
|
39
|
+
// 先跳尾部空白段
|
|
40
|
+
while (segments.length > 0 && isWhitespace(segments[segments.length - 1].segment)) {
|
|
41
|
+
newCursor -= segments.pop().segment.length;
|
|
42
|
+
}
|
|
43
|
+
if (segments.length === 0)
|
|
44
|
+
return newCursor;
|
|
45
|
+
const last = segments[segments.length - 1];
|
|
46
|
+
if (last.isWordLike) {
|
|
47
|
+
// 词内含 ASCII 标点:切到词内最后一段标点之后(foo.bar → '.' 前)
|
|
48
|
+
const segment = last.segment;
|
|
49
|
+
let cut = -1;
|
|
50
|
+
for (let ci = 0; ci < segment.length; ci++) {
|
|
51
|
+
if (isPunctuation(segment[ci]))
|
|
52
|
+
cut = ci + 1;
|
|
53
|
+
}
|
|
54
|
+
if (cut >= 0)
|
|
55
|
+
newCursor -= segment.length - cut;
|
|
56
|
+
else
|
|
57
|
+
newCursor -= segment.length;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// 非词非空白 run(标点串)整段跳
|
|
61
|
+
while (segments.length > 0 &&
|
|
62
|
+
!segments[segments.length - 1].isWordLike &&
|
|
63
|
+
!isWhitespace(segments[segments.length - 1].segment)) {
|
|
64
|
+
newCursor -= segments.pop().segment.length;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return newCursor;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 光标向前移一词:跳过前导空白,再跳一词(词内标点切到首个标点前、
|
|
71
|
+
* 标点 run 整段跳)。返回新光标(UTF-16 下标)——纯函数。
|
|
72
|
+
*/
|
|
73
|
+
export function findWordForward(text, cursor) {
|
|
74
|
+
if (cursor >= text.length)
|
|
75
|
+
return text.length;
|
|
76
|
+
const segments = segmentWords(text.slice(cursor));
|
|
77
|
+
let newCursor = cursor;
|
|
78
|
+
let i = 0;
|
|
79
|
+
// 先跳前导空白段
|
|
80
|
+
while (i < segments.length && isWhitespace(segments[i].segment)) {
|
|
81
|
+
newCursor += segments[i].segment.length;
|
|
82
|
+
i++;
|
|
83
|
+
}
|
|
84
|
+
if (i >= segments.length)
|
|
85
|
+
return newCursor;
|
|
86
|
+
const first = segments[i];
|
|
87
|
+
if (first.isWordLike) {
|
|
88
|
+
// 词内含 ASCII 标点:切到词内首个标点前(bar.baz → '.' 前)
|
|
89
|
+
let stop = -1;
|
|
90
|
+
for (let ci = 0; ci < first.segment.length; ci++) {
|
|
91
|
+
if (isPunctuation(first.segment[ci])) {
|
|
92
|
+
stop = ci;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
newCursor += stop >= 0 ? stop : first.segment.length;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// 非词非空白 run(标点串)整段跳
|
|
100
|
+
while (i < segments.length && !segments[i].isWordLike && !isWhitespace(segments[i].segment)) {
|
|
101
|
+
newCursor += segments[i].segment.length;
|
|
102
|
+
i++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return newCursor;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=word-nav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-nav.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/editor/word-nav.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 件 8 /history 全屏回看器(07 §4.1 呈现面件 8——批 10f-4 特性腿):
|
|
3
|
+
* 副屏只读内容件(OverlayContent——经 AltScreenHost 装载入 1049 备屏)。
|
|
4
|
+
*
|
|
5
|
+
* - **数据源 = 复用主屏同一渲染管线**(07 件 8 条款):history() 注入拉取的
|
|
6
|
+
* 全量 durable 正文投影 → LiveTranscript 全量档(blockCap = Infinity——
|
|
7
|
+
* 恒一致的是管线非范围,主屏按滚动帽 / 回看器全量)→ renderBlockStyledLines
|
|
8
|
+
* 带样式行集(同输入同行集、零第二渲染器);瞬时面(状态行/todo/活动面板)
|
|
9
|
+
* 不进回看器——数据腿只有 durable 投影,结构上即不进;
|
|
10
|
+
* - **快照档 v1**(条款):行集构造后静态——回看期新事件不进副屏(无追加
|
|
11
|
+
* 路),返回主屏全帧补显(resumeMain 自持);活体跟随挂账未落;
|
|
12
|
+
* - **键盘滚动**(首版键盘先行——滚轮随鼠标批接):ScrollView 装载
|
|
13
|
+
* (↑/↓/PgUp/PgDn/Home/End——折叠与偏移算术恒归 ScrollView,样式呈现经
|
|
14
|
+
* writeSlice 覆写接缝注入,零第二滚动引擎);
|
|
15
|
+
* - **鼠标选区 + 滚轮**(2026-09-11 鼠标解码批 mu-2——07 件 8 细则):线性
|
|
16
|
+
* 选区(press 左键锚定 → motion 按住拖动扩展 → release 触发复制),锚/焦点
|
|
17
|
+
* 存逻辑行 + 行内 UTF-16 下标(渲染无关坐标系——滚动/重折/resize 后仍指同
|
|
18
|
+
* 一正文位);release 行间拼 LF 经 onCopy 注入柄写出(OSC 52——装配层铸序
|
|
19
|
+
* 列);选区帽 64 KiB 按明文 UTF-8 字节数计,超帽拒复制 + 底行提示常显至
|
|
20
|
+
* 选区清除;视口外命中(头行/底铬/滚动条列)零动作;搜索框在场拖选禁用
|
|
21
|
+
* (输入模态优先);双击词选/越视口自动滚动/滚动条拖拽挂账不预造。滚轮归
|
|
22
|
+
* ScrollView wheel 消费路(搜索在场也照常滚——禁的是拖选);
|
|
23
|
+
* - **搜索三动作**(条款锁能力不锁键位——缺省 Ctrl+Shift+F):开(搜索框
|
|
24
|
+
* 在场——Editor 单行档复用,IME/粘贴/字素光标白得)/ 跳匹配(Enter 下一、
|
|
25
|
+
* Shift+Enter 上一、循环;当前匹配反色高亮)/ 关(Esc——高亮清、查询文
|
|
26
|
+
* 本保留续搜);
|
|
27
|
+
* - **退出让位判据**(条款):q/Esc 退出只在搜索框不在场时消费——否则打
|
|
28
|
+
* 不出字母 q;
|
|
29
|
+
* - **副屏键面补丁**(与主屏同键面——07 §4.3 输入路由拦截链条款):Ctrl+C
|
|
30
|
+
* = 打断在飞 run(滤 kitty release)、Ctrl+D = 退出(先收副屏——onExit
|
|
31
|
+
* 先于 onQuit;搜索框有文不退,与主屏空框闸同律)。
|
|
32
|
+
*/
|
|
33
|
+
import type { CellBuffer, InputEvent, Region } from '../../engine/index.js';
|
|
34
|
+
import { ScrollView } from '../scroll/scroll-view.js';
|
|
35
|
+
import { type VisualSegment } from '../editor/visual-lines.js';
|
|
36
|
+
import type { OverlayContent } from '../overlay/overlay.js';
|
|
37
|
+
import type { AgentMessage } from '../../../contracts/index.js';
|
|
38
|
+
/** 回看器装配选项 */
|
|
39
|
+
export interface HistoryViewerOptions {
|
|
40
|
+
/** 会话归属(呈现会话短 id——header 行) */
|
|
41
|
+
readonly sessionId: string;
|
|
42
|
+
/** 全量 durable 正文投影(history() 注入拉取的快照——构造后静态,快照档 v1) */
|
|
43
|
+
readonly messages: readonly AgentMessage[];
|
|
44
|
+
/** 行集构建折宽锚(开屏时终端列宽——渲染期 ScrollView 按实际 region 宽重折) */
|
|
45
|
+
readonly columns: number;
|
|
46
|
+
/** 退出回看器(q/Esc/Ctrl+D——装配接线:收副屏〔AltScreenHost close〕) */
|
|
47
|
+
readonly onExit: () => void;
|
|
48
|
+
/** 打断在飞 run(Ctrl+C 副屏键面补丁——与主屏同键面,装配柄透传) */
|
|
49
|
+
readonly onInterrupt?: (sessionId: string) => void;
|
|
50
|
+
/** 退出进程(Ctrl+D——先收副屏〔onExit 已先调〕再转装配退出柄) */
|
|
51
|
+
readonly onQuit?: () => void;
|
|
52
|
+
/** OSC 52 复制写出柄(release 选区触发——onExit/onInterrupt 装配柄同形先例;装配层包 buildOsc52Copy 铸序列) */
|
|
53
|
+
readonly onCopy?: (text: string) => void;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 回看器内容件:ScrollView 子类(滚动/折叠/偏移算术继承)+ OverlayContent
|
|
57
|
+
* (副屏 root——render 直收全屏 region,量高不经布局路)。
|
|
58
|
+
*/
|
|
59
|
+
export declare class HistoryViewer extends ScrollView implements OverlayContent {
|
|
60
|
+
private readonly sessionId;
|
|
61
|
+
private readonly shortId;
|
|
62
|
+
/** 带样式行集(构造后静态——快照档 v1:回看期新事件不进副屏) */
|
|
63
|
+
private readonly styledLines;
|
|
64
|
+
private readonly onExit;
|
|
65
|
+
private readonly onInterrupt;
|
|
66
|
+
private readonly onQuit;
|
|
67
|
+
private readonly onCopy;
|
|
68
|
+
private searchOpen;
|
|
69
|
+
private readonly searchEditor;
|
|
70
|
+
private matches;
|
|
71
|
+
private matchIndex;
|
|
72
|
+
/** 退出闭锁(同批多事件只退一次——q 与 Esc 竞发的防御位) */
|
|
73
|
+
private exited;
|
|
74
|
+
private selAnchor;
|
|
75
|
+
private selFocus;
|
|
76
|
+
/** 底行提示文案(超帽拒复制——常显至选区清除;null = 常态键面提示) */
|
|
77
|
+
private selectionNotice;
|
|
78
|
+
constructor(options: HistoryViewerOptions);
|
|
79
|
+
/** 量高:头行 + 视口全量 + 底铬(副屏 root 不经布局路——契约的诚实实现) */
|
|
80
|
+
measure(width: number): number;
|
|
81
|
+
/**
|
|
82
|
+
* 落位(副屏全屏 region 自底盘向上三段):头行(档名 + 会话短 id 会话区分色
|
|
83
|
+
* + 搜索计数)→ 滚动视口(super.render——折叠/偏移/滚动条恒归 ScrollView)→
|
|
84
|
+
* 底铬(搜索在场 = 单行 Editor;否则键面提示行)。
|
|
85
|
+
*/
|
|
86
|
+
render(buffer: CellBuffer, region: Region): void;
|
|
87
|
+
/**
|
|
88
|
+
* 事件分发(副屏内容终局消费——未消费键不穿透,模态独占)。
|
|
89
|
+
* 序:Ctrl+C / Ctrl+D 副屏键面补丁 → 搜索开关键 → 搜索在场模态(让位判据:
|
|
90
|
+
* q/Esc 不退出)→ 常态退出键(q/Esc)→ 滚动键(ScrollView)。
|
|
91
|
+
*/
|
|
92
|
+
handleEvent(event: InputEvent): boolean;
|
|
93
|
+
/** super.handleEvent 直呼(子类覆写同名面后仍需触达基类滚动路的显式位) */
|
|
94
|
+
private handleEventSuper;
|
|
95
|
+
/**
|
|
96
|
+
* mouse 事件路(副屏内容件终局消费——未消费 mouse 不穿透,模态独占):
|
|
97
|
+
* 滚轮归 ScrollView(搜索在场也照常滚——禁的是拖选);选区 = 左键 press
|
|
98
|
+
* 锚定 → motion 扩展 → release 复制(release 后选区高亮保留,下次 press
|
|
99
|
+
* 清除/重锚)。
|
|
100
|
+
*/
|
|
101
|
+
private handleMouse;
|
|
102
|
+
/**
|
|
103
|
+
* 屏幕坐标 → 选区定位点(逻辑行 + 行内 UTF-16 下标):视口外命中(头行/
|
|
104
|
+
* 底铬/滚动条列/界外)返 null 零动作;列反查走字素宽累加(与折叠算术同源
|
|
105
|
+
* ——CJK 双宽对齐,命中字素含半格命中归该字素首)。
|
|
106
|
+
*/
|
|
107
|
+
private screenToLogical;
|
|
108
|
+
/** 选区规范化(锚/焦点 → 升序两端点;无选区 null) */
|
|
109
|
+
private selectionBounds;
|
|
110
|
+
/** 选区明文(行间拼 LF——release 复制与帽计量的单源;空选区空串) */
|
|
111
|
+
private selectionText;
|
|
112
|
+
/**
|
|
113
|
+
* 本逻辑行的选中区间(端点含头不含尾;end = Infinity 表行尾开放——跨行尾
|
|
114
|
+
* 段;无选区/异行 null)。writeSlice 高亮与 selectionText 共用此规范化。
|
|
115
|
+
*/
|
|
116
|
+
private selectionSpanFor;
|
|
117
|
+
/** 开:搜索框在场 + 按在框文本重算匹配并跳首匹配 */
|
|
118
|
+
private openSearch;
|
|
119
|
+
/** 关:框退场 + 高亮清(查询文本保留——重开续搜的增量检索延续) */
|
|
120
|
+
private closeSearch;
|
|
121
|
+
/** 匹配重算(查询变更路):全行不区分大小写子串扫描 + 跳首匹配 */
|
|
122
|
+
private recomputeMatches;
|
|
123
|
+
/** 跳匹配(±1 循环——尾后回首、首前到尾) */
|
|
124
|
+
private jumpMatch;
|
|
125
|
+
/** 退出(闭锁——单次) */
|
|
126
|
+
private exit;
|
|
127
|
+
/**
|
|
128
|
+
* 视口切片带样式写出:样式段(管线单源产物)按切片边界分段落格 + 当前匹配
|
|
129
|
+
* 反色高亮叠加。列位经 prefixDisplayWidth 换算(UTF-16 切片下标 → 显示列
|
|
130
|
+
* ——CJK 双宽对齐与折叠算术同源)。
|
|
131
|
+
*/
|
|
132
|
+
protected writeSlice(buffer: CellBuffer, region: Region, displayRow: number, seg: VisualSegment): void;
|
|
133
|
+
}
|