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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 行内解析件(07 §4.1 引擎节件 6 Markdown 件——批 10d-4)。
|
|
3
|
+
*
|
|
4
|
+
* 手写扫描器四标记(v1 平面——嵌套标记不递归):
|
|
5
|
+
* `**bold**` / `*italic*` / `` `code` `` / `[label](url)`(呈现取 label +
|
|
6
|
+
* underline——TUI 中性形,URL 不外显)。未闭合标记按普通文本回退(坏输入
|
|
7
|
+
* 不丢字);空标记体(`****`)不产空 span。
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 行内解析:文本 → 样式段序列。
|
|
11
|
+
*
|
|
12
|
+
* 优先序:`**` 先于 `*`(前缀撞车时 bold 赢);`[` 用 `](` 连续判据(label
|
|
13
|
+
* 内含 `]` 的罕见形不支撑——v1 已知边界)。
|
|
14
|
+
*/
|
|
15
|
+
export function parseInline(text) {
|
|
16
|
+
const spans = [];
|
|
17
|
+
let plain = ''; // 普通文本累积(相邻同形合并——flush 才成段)
|
|
18
|
+
let i = 0;
|
|
19
|
+
const flush = () => {
|
|
20
|
+
if (plain !== '') {
|
|
21
|
+
spans.push({ text: plain });
|
|
22
|
+
plain = '';
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
while (i < text.length) {
|
|
26
|
+
const ch = text[i];
|
|
27
|
+
// **bold**(** 先试——命中即吞两字符,* 不会误抢)
|
|
28
|
+
if (ch === '*' && text[i + 1] === '*') {
|
|
29
|
+
const end = text.indexOf('**', i + 2);
|
|
30
|
+
if (end > i + 2) {
|
|
31
|
+
flush();
|
|
32
|
+
spans.push({ text: text.slice(i + 2, end), bold: true });
|
|
33
|
+
i = end + 2;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// *italic*
|
|
38
|
+
if (ch === '*') {
|
|
39
|
+
const end = text.indexOf('*', i + 1);
|
|
40
|
+
if (end > i + 1) {
|
|
41
|
+
flush();
|
|
42
|
+
spans.push({ text: text.slice(i + 1, end), italic: true });
|
|
43
|
+
i = end + 1;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// `code`
|
|
48
|
+
if (ch === '`') {
|
|
49
|
+
const end = text.indexOf('`', i + 1);
|
|
50
|
+
if (end > i + 1) {
|
|
51
|
+
flush();
|
|
52
|
+
spans.push({ text: text.slice(i + 1, end), code: true });
|
|
53
|
+
i = end + 1;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// [label](url) → label + underline
|
|
58
|
+
if (ch === '[') {
|
|
59
|
+
const close = text.indexOf('](', i + 1);
|
|
60
|
+
if (close > i) {
|
|
61
|
+
const urlEnd = text.indexOf(')', close + 2);
|
|
62
|
+
if (urlEnd > close + 1) {
|
|
63
|
+
flush();
|
|
64
|
+
spans.push({ text: text.slice(i + 1, close), underline: true });
|
|
65
|
+
i = urlEnd + 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
plain += ch;
|
|
71
|
+
i++;
|
|
72
|
+
}
|
|
73
|
+
flush();
|
|
74
|
+
return spans;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=inline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/markdown/inline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 渲染件(07 §4.1 引擎节件 6 + 呈现面件 1——批 10d-4)。
|
|
3
|
+
*
|
|
4
|
+
* - 两段语义的「定稿」腿:流式期纯文本直推(装配策略,批 10e 接)、
|
|
5
|
+
* message_end 定稿换装本件(流式槽原位差分的换入对象);
|
|
6
|
+
* - 内置中性 ANSI 配色、不接语法高亮库:行内代码 ANSI 2(绿)、引用
|
|
7
|
+
* dim、标题 bold、链接 underline——**不触 accent**(引擎节件 3 着色纪律:
|
|
8
|
+
* accent 只用于焦点指示面,正文不混用);
|
|
9
|
+
* - 滚动帽语义 = 块数(呈现面件 1)——`blockCount` 即帽额度计数面;
|
|
10
|
+
* - 折行按显示宽字素硬折(复用 width 件三规则——宽字不产半字、不悬挂);
|
|
11
|
+
* 折点后的行首空格游程跳过(软换行折叠的呈现收口)。
|
|
12
|
+
*/
|
|
13
|
+
import { type CellBuffer, type Region, type Renderable } from '../../engine/index.js';
|
|
14
|
+
import { type MarkdownBlock } from './blocks.js';
|
|
15
|
+
/** Markdown 渲染件:构造后静态不可变(文本件纪律——状态归持有方自管) */
|
|
16
|
+
export declare class MarkdownDoc implements Renderable {
|
|
17
|
+
private readonly parsed;
|
|
18
|
+
/** 布局缓存(width 单槽——文本不可变,换宽整体重算) */
|
|
19
|
+
private cacheWidth;
|
|
20
|
+
private cacheRows;
|
|
21
|
+
constructor(text: string);
|
|
22
|
+
/** 便捷构造(换装装配点直呼) */
|
|
23
|
+
static of(text: string): MarkdownDoc;
|
|
24
|
+
/** 块序列(只读观测面) */
|
|
25
|
+
get blocks(): readonly MarkdownBlock[];
|
|
26
|
+
/** 块计数——主屏滚动帽的额度单位(呈现面件 1:一个 Markdown 块一子行) */
|
|
27
|
+
get blockCount(): number;
|
|
28
|
+
/** 量高:全块行数 + 块间空行(n-1 段间距——量高即分配承诺) */
|
|
29
|
+
measure(width: number): number;
|
|
30
|
+
/** 落位渲染:缓存行集逐行写(相邻同样式游程合并 writeText——省格级调用) */
|
|
31
|
+
render(buffer: CellBuffer, region: Region): void;
|
|
32
|
+
/** 布局(width 键缓存——块间空行并入行集,render 与 measure 同源) */
|
|
33
|
+
private layout;
|
|
34
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown 渲染件(07 §4.1 引擎节件 6 + 呈现面件 1——批 10d-4)。
|
|
3
|
+
*
|
|
4
|
+
* - 两段语义的「定稿」腿:流式期纯文本直推(装配策略,批 10e 接)、
|
|
5
|
+
* message_end 定稿换装本件(流式槽原位差分的换入对象);
|
|
6
|
+
* - 内置中性 ANSI 配色、不接语法高亮库:行内代码 ANSI 2(绿)、引用
|
|
7
|
+
* dim、标题 bold、链接 underline——**不触 accent**(引擎节件 3 着色纪律:
|
|
8
|
+
* accent 只用于焦点指示面,正文不混用);
|
|
9
|
+
* - 滚动帽语义 = 块数(呈现面件 1)——`blockCount` 即帽额度计数面;
|
|
10
|
+
* - 折行按显示宽字素硬折(复用 width 件三规则——宽字不产半字、不悬挂);
|
|
11
|
+
* 折点后的行首空格游程跳过(软换行折叠的呈现收口)。
|
|
12
|
+
*/
|
|
13
|
+
import { ansiColor, graphemeWidth, splitGraphemes, } from '../../engine/index.js';
|
|
14
|
+
import { parseMarkdown } from './blocks.js';
|
|
15
|
+
/** 行内代码配色(ANSI 2 绿——终端代码传统色;与 accent〔cyan 6〕分立,正文不触 accent 家族) */
|
|
16
|
+
const CODE_COLOR = ansiColor(2);
|
|
17
|
+
/** 引用块基础样式(dim——存在感弱于正文) */
|
|
18
|
+
const DIM_STYLE = Object.freeze({ dim: true });
|
|
19
|
+
/** span 样式解析(与块基础样式合并——行内位覆盖 base 的同名位) */
|
|
20
|
+
function spanStyle(span, base) {
|
|
21
|
+
const style = base !== undefined ? { ...base } : {};
|
|
22
|
+
if (span.code === true)
|
|
23
|
+
style.fg = CODE_COLOR;
|
|
24
|
+
if (span.bold === true)
|
|
25
|
+
style.bold = true;
|
|
26
|
+
if (span.italic === true)
|
|
27
|
+
style.italic = true;
|
|
28
|
+
if (span.underline === true)
|
|
29
|
+
style.underline = true;
|
|
30
|
+
return Object.keys(style).length > 0 ? Object.freeze(style) : undefined;
|
|
31
|
+
}
|
|
32
|
+
/** spans 按显示宽折行(行满开新行;折点后行首空格游程跳过) */
|
|
33
|
+
function layoutSpans(spans, width, base) {
|
|
34
|
+
const rows = [];
|
|
35
|
+
let current = [];
|
|
36
|
+
let used = 0;
|
|
37
|
+
const openRow = () => {
|
|
38
|
+
current = [];
|
|
39
|
+
used = 0;
|
|
40
|
+
};
|
|
41
|
+
for (const span of spans) {
|
|
42
|
+
const style = spanStyle(span, base);
|
|
43
|
+
for (const g of splitGraphemes(span.text)) {
|
|
44
|
+
if (g === ' ' && used === 0 && rows.length > 0)
|
|
45
|
+
continue; // 折点后行首空格跳过
|
|
46
|
+
const w = graphemeWidth(g);
|
|
47
|
+
if (w > width)
|
|
48
|
+
continue; // 防御位:比行宽还宽的字素丢弃(width 件三规则外的不可能格)
|
|
49
|
+
if (used + w > width) {
|
|
50
|
+
rows.push(current);
|
|
51
|
+
openRow();
|
|
52
|
+
if (g === ' ')
|
|
53
|
+
continue; // 恰在折点上的空格不进新行
|
|
54
|
+
}
|
|
55
|
+
current.push({ grapheme: g, style });
|
|
56
|
+
used += w;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (current.length > 0 || rows.length === 0)
|
|
60
|
+
rows.push(current); // 尾行收口(空段落落一行空行)
|
|
61
|
+
return rows;
|
|
62
|
+
}
|
|
63
|
+
/** 纯文本行折行(代码块体——无行内解析,样式恒定整体替换) */
|
|
64
|
+
function layoutPlain(text, width, style) {
|
|
65
|
+
return layoutSpans([{ text }], width).map((row) => row.map((cell) => ({ grapheme: cell.grapheme, style })));
|
|
66
|
+
}
|
|
67
|
+
/** 前缀串 → 字素列(列表标记/引用竖线等固定前缀) */
|
|
68
|
+
function prefixCells(prefix, style) {
|
|
69
|
+
return splitGraphemes(prefix).map((grapheme) => ({ grapheme, style }));
|
|
70
|
+
}
|
|
71
|
+
/** 单块布局 → 渲染行集(块型分派;行首前缀 + 折行 + 层级缩进) */
|
|
72
|
+
function blockRows(block, width) {
|
|
73
|
+
switch (block.type) {
|
|
74
|
+
case 'heading': {
|
|
75
|
+
// 标题:整行强制 bold(行内样式位叠加保留——code 色不丢);H1/H2 尾随分隔线
|
|
76
|
+
const rows = layoutSpans(block.spans, width, { bold: true });
|
|
77
|
+
if (block.level <= 2) {
|
|
78
|
+
rows.push(splitGraphemes('─'.repeat(width)).map((grapheme) => ({ grapheme, style: DIM_STYLE })));
|
|
79
|
+
}
|
|
80
|
+
return rows;
|
|
81
|
+
}
|
|
82
|
+
case 'paragraph':
|
|
83
|
+
return layoutSpans(block.spans, width);
|
|
84
|
+
case 'list-item': {
|
|
85
|
+
// 前缀 = 嵌套缩进 + 标记 + 空格;续行对齐前缀宽(视觉续挂)
|
|
86
|
+
const prefix = `${' '.repeat(block.indent)}${block.marker} `;
|
|
87
|
+
const prefixWidth = splitGraphemes(prefix).reduce((sum, g) => sum + graphemeWidth(g), 0);
|
|
88
|
+
const body = layoutSpans(block.spans, Math.max(1, width - prefixWidth));
|
|
89
|
+
return body.map((row, index) => [
|
|
90
|
+
...(index === 0 ? prefixCells(prefix) : prefixCells(' '.repeat(prefixWidth))),
|
|
91
|
+
...row,
|
|
92
|
+
]);
|
|
93
|
+
}
|
|
94
|
+
case 'code': {
|
|
95
|
+
// 代码块:竖线前缀贯通(含折行续行)+ 原样文本(无行内解析)
|
|
96
|
+
const bodyWidth = Math.max(1, width - 2);
|
|
97
|
+
const rows = [];
|
|
98
|
+
for (const line of block.lines)
|
|
99
|
+
rows.push(...layoutPlain(line, bodyWidth));
|
|
100
|
+
return rows.map((row) => [...prefixCells('│ '), ...row]);
|
|
101
|
+
}
|
|
102
|
+
case 'quote': {
|
|
103
|
+
// 引用:首列竖线 + dim 基础样式(行内样式位叠加)
|
|
104
|
+
const rows = [];
|
|
105
|
+
for (const line of block.lines)
|
|
106
|
+
rows.push(...layoutSpans(line, Math.max(1, width - 2), DIM_STYLE));
|
|
107
|
+
return rows.map((row) => [...prefixCells('┆ ', DIM_STYLE), ...row]);
|
|
108
|
+
}
|
|
109
|
+
case 'hr':
|
|
110
|
+
return [splitGraphemes('─'.repeat(width)).map((grapheme) => ({ grapheme, style: DIM_STYLE }))];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Markdown 渲染件:构造后静态不可变(文本件纪律——状态归持有方自管) */
|
|
114
|
+
export class MarkdownDoc {
|
|
115
|
+
parsed;
|
|
116
|
+
/** 布局缓存(width 单槽——文本不可变,换宽整体重算) */
|
|
117
|
+
cacheWidth = -1;
|
|
118
|
+
cacheRows = [];
|
|
119
|
+
constructor(text) {
|
|
120
|
+
this.parsed = parseMarkdown(text);
|
|
121
|
+
}
|
|
122
|
+
/** 便捷构造(换装装配点直呼) */
|
|
123
|
+
static of(text) {
|
|
124
|
+
return new MarkdownDoc(text);
|
|
125
|
+
}
|
|
126
|
+
/** 块序列(只读观测面) */
|
|
127
|
+
get blocks() {
|
|
128
|
+
return this.parsed;
|
|
129
|
+
}
|
|
130
|
+
/** 块计数——主屏滚动帽的额度单位(呈现面件 1:一个 Markdown 块一子行) */
|
|
131
|
+
get blockCount() {
|
|
132
|
+
return this.parsed.length;
|
|
133
|
+
}
|
|
134
|
+
/** 量高:全块行数 + 块间空行(n-1 段间距——量高即分配承诺) */
|
|
135
|
+
measure(width) {
|
|
136
|
+
const rows = this.layout(width);
|
|
137
|
+
return rows.length;
|
|
138
|
+
}
|
|
139
|
+
/** 落位渲染:缓存行集逐行写(相邻同样式游程合并 writeText——省格级调用) */
|
|
140
|
+
render(buffer, region) {
|
|
141
|
+
const rows = this.layout(region.width);
|
|
142
|
+
const max = Math.min(rows.length, region.height);
|
|
143
|
+
for (let r = 0; r < max; r++) {
|
|
144
|
+
let col = region.col;
|
|
145
|
+
let run = '';
|
|
146
|
+
let runStyle;
|
|
147
|
+
// 游程起点显式跟踪(宽字素占两格——run 码位数算不出格位)
|
|
148
|
+
let runStart = region.col;
|
|
149
|
+
const flush = () => {
|
|
150
|
+
if (run !== '')
|
|
151
|
+
buffer.writeText(region.row + r, runStart, run, runStyle);
|
|
152
|
+
};
|
|
153
|
+
for (const cell of rows[r]) {
|
|
154
|
+
if (cell.style !== runStyle) {
|
|
155
|
+
flush();
|
|
156
|
+
run = cell.grapheme;
|
|
157
|
+
runStyle = cell.style;
|
|
158
|
+
runStart = col;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
run += cell.grapheme;
|
|
162
|
+
}
|
|
163
|
+
col += graphemeWidth(cell.grapheme); // 按显示宽推进(宽字素两格)
|
|
164
|
+
}
|
|
165
|
+
flush();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** 布局(width 键缓存——块间空行并入行集,render 与 measure 同源) */
|
|
169
|
+
layout(width) {
|
|
170
|
+
if (this.cacheWidth === width)
|
|
171
|
+
return this.cacheRows;
|
|
172
|
+
const rows = [];
|
|
173
|
+
for (const block of this.parsed) {
|
|
174
|
+
if (rows.length > 0)
|
|
175
|
+
rows.push([]); // 块间空行
|
|
176
|
+
rows.push(...blockRows(block, Math.max(1, width)));
|
|
177
|
+
}
|
|
178
|
+
this.cacheWidth = width;
|
|
179
|
+
this.cacheRows = rows;
|
|
180
|
+
return rows;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/markdown/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /memory 轻管理面副屏件(06 §7 `/memory` TUI 形态定形注——mm 批落码腿):
|
|
3
|
+
* 副屏内容件(OverlayContent——经 AltScreenHost 装载入 1049 备屏,与
|
|
4
|
+
* /history 回看器同基建同键面)。
|
|
5
|
+
*
|
|
6
|
+
* - **视图三段式**(定形注②):头行(档名 + owner 并集短显——project 键
|
|
7
|
+
* 16 hex 截前 8 位)→ 健康投影两行(overview().health 五计数**恒全库口径**
|
|
8
|
+
* ——全库不分 owner 假精度既有裁决,无参即正形勿对齐)→ 三分区列表
|
|
9
|
+
* (活体区〔listVisibleForManagement 滤除 frozen 位——批 ev-1 管理形拆面,
|
|
10
|
+
* 未生效行可见并带「N天后生效」标注〕→ 冻结区〔同管理形滤出 frozen 位、
|
|
11
|
+
* 行首 ✱〕→ 终态区〔listForExport 客户端 ownerKey + status ∈
|
|
12
|
+
* {dismissed, expired} 双过滤;TTL 未物化 active 行三区皆不进〕);
|
|
13
|
+
* 条目行与工具读面同形(`[m:短id] [kind] summary id=<完整id>
|
|
14
|
+
* updated=<ISO>`——p-1 批时效尾缀同源),读出消毒经注入的 §8.2 统一函数
|
|
15
|
+
* 罩住(secret 命中遮蔽原文保留 id 操作面、指令样命中引述注记);
|
|
16
|
+
* - **键面动词族**(定形注③):行动词 f(冻结切换——呈现层判向调
|
|
17
|
+
* freeze/unfreeze,终态行零义吞)/ d(忘掉——confirm 两段式;终态行零义
|
|
18
|
+
* 吞、冻结行零义吞 + 底行提示「先 f 解冻」)/ r(恢复——终态行免
|
|
19
|
+
* confirm,active 行零义吞);全局动词 e(副屏内嵌输入行走 /memory-export
|
|
20
|
+
* 真身同一函数——argv 引号感知切分与命令分发同源)/ Tab(筛选循环
|
|
21
|
+
* 全部→活体→冻结→终态)。光标只在条目行间移动(↑/↓ 循环——分区头/
|
|
22
|
+
* 投影行非可指行);PgUp/PgDn/Home/End 与滚轮归 ScrollView 滚动路;
|
|
23
|
+
* - **confirm 副屏内嵌行**(定形注④):主屏浮层在副屏在场时物理不可见 +
|
|
24
|
+
* 走通道 ask 原语会触发 ask 强制收起先收副屏——故收口为副屏内嵌行
|
|
25
|
+
* (底行确认文案;键面语义同 ConfirmPanel:Enter/y 确认、Esc/n 取消、
|
|
26
|
+
* 单次保守值);确认执行 forget(id) 缺省 supersededBy='user',守卫错折
|
|
27
|
+
* 底行;
|
|
28
|
+
* - **刷新语义**(定形注⑤):开屏快照 + 动词成功后整表重取重建、重取同 id
|
|
29
|
+
* 锚定、锚定目标不在筛选可见集驻留原位就近、零条目可见行动词消隐
|
|
30
|
+
* (底行动态呈现按光标行分区给键面提示);他路写入不实时进屏(挂账);
|
|
31
|
+
* - **单源执法**(定形注⑥):键面动词全走 DAO 既有族(零新 DAO 方法)、
|
|
32
|
+
* 导出走注入的 /memory-export 处理器闭包(真身同一函数)、用户直发零
|
|
33
|
+
* 审批对、零新审计词;
|
|
34
|
+
* - **鼠标消费面**(07 篇屏模型双形态节同批回写):滚轮滚动(ScrollView
|
|
35
|
+
* 统一路)+ 左键点条目行 = 光标移至该行;头行/健康投影区/底铬/滚动条列
|
|
36
|
+
* 命中零动作;拖选复制不进 v1(操作面非回看面——挂账随真实需求再裁);
|
|
37
|
+
* - **退出键面**:q/Esc 退出(确认态/输入态在场时让位——Esc 先收模态)、
|
|
38
|
+
* Ctrl+C 打断(滤 kitty release)、Ctrl+D 退出进程(先收副屏再转退出柄;
|
|
39
|
+
* 输入行有文不退——主屏空框闸同律)。
|
|
40
|
+
*
|
|
41
|
+
* DAG 注记:本件不 import memory 域(02 §4.1 边表——channels 无 memory
|
|
42
|
+
* 边是刻意设计):DAO/行形经手写结构相容窄面(TS 鸭子型装配零胶水——
|
|
43
|
+
* MemoryDaoFace 与 memory 域 MemoryDao 单实现律互证),消毒函数与导出
|
|
44
|
+
* 命令经依赖倒置注入(装配面传真身——「同一函数」由装配保证)。
|
|
45
|
+
*/
|
|
46
|
+
import type { CellBuffer, InputEvent, Region } from '../../engine/index.js';
|
|
47
|
+
import { ScrollView } from '../scroll/scroll-view.js';
|
|
48
|
+
import { type VisualSegment } from '../editor/visual-lines.js';
|
|
49
|
+
import type { OverlayContent } from '../overlay/overlay.js';
|
|
50
|
+
/** 记忆行呈现窄面(MemoryRow 子集 + content——消毒入检需要;结构相容真身) */
|
|
51
|
+
export interface MemoryRowFace {
|
|
52
|
+
readonly id: string;
|
|
53
|
+
readonly ownerKey: string;
|
|
54
|
+
readonly kind: string;
|
|
55
|
+
readonly summary: string;
|
|
56
|
+
readonly content: string;
|
|
57
|
+
readonly status: 'active' | 'dismissed' | 'expired';
|
|
58
|
+
/** 终态来源记号:'auto_resolved' | 'user' | 'llm:<id>' | 'ttl' | 'skill:<名>'(active 行 null) */
|
|
59
|
+
readonly supersededBy: string | null;
|
|
60
|
+
/** Unix 毫秒 */
|
|
61
|
+
readonly updatedAt: number;
|
|
62
|
+
/** 冻结位(0/1) */
|
|
63
|
+
readonly frozen: boolean;
|
|
64
|
+
/** 生效起点 Unix 毫秒(批 ev-1——null = 即时;未生效行在本面可见并标注) */
|
|
65
|
+
readonly validFrom: number | null;
|
|
66
|
+
}
|
|
67
|
+
/** 健康五计数窄面(恒全库口径——overview 无参形) */
|
|
68
|
+
export interface MemoryHealthFace {
|
|
69
|
+
readonly active: number;
|
|
70
|
+
readonly dismissed: number;
|
|
71
|
+
readonly expired: number;
|
|
72
|
+
readonly frozen: number;
|
|
73
|
+
readonly total: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* DAO 窄面(结构相容 memory 域 MemoryDao——方法双变下窄参数/宽返回可并;
|
|
77
|
+
* 管理面只消费既有动词族,零新方法条款的码面形)。
|
|
78
|
+
*/
|
|
79
|
+
export interface MemoryDaoFace {
|
|
80
|
+
/**
|
|
81
|
+
* 可见行**管理形**(批 ev-1 M2 拆形——active AND (frozen OR 未过期) AND 起点
|
|
82
|
+
* 不滤,updated_at DESC;活体/冻结两分区单源。注入读面的起点过滤不适用于
|
|
83
|
+
* 本面——未生效行在 /memory 可见并带「N天后生效」标注)
|
|
84
|
+
*/
|
|
85
|
+
listVisibleForManagement(ownerKeys?: readonly string[]): readonly MemoryRowFace[];
|
|
86
|
+
/** 全库全状态行(终态区客户端双过滤的数据源) */
|
|
87
|
+
listForExport(ownerKey?: string): readonly MemoryRowFace[];
|
|
88
|
+
/** 整面(health 五计数恒全库口径) */
|
|
89
|
+
overview(ownerKeys?: readonly string[]): {
|
|
90
|
+
readonly health: MemoryHealthFace;
|
|
91
|
+
};
|
|
92
|
+
/** 忘掉(缺省 supersededBy='user';frozen 拒 MEMORY_FROZEN;终态短路幂等) */
|
|
93
|
+
forget(id: string, opts?: {
|
|
94
|
+
readonly supersededBy?: string;
|
|
95
|
+
}): MemoryRowFace;
|
|
96
|
+
/** 恢复(状态复活腿免 revision;幂等) */
|
|
97
|
+
restore(id: string, revision?: number): MemoryRowFace;
|
|
98
|
+
/** 冻结(幂等——纯持有面不动 updated_at) */
|
|
99
|
+
freeze(id: string): MemoryRowFace;
|
|
100
|
+
/** 解冻(幂等——解冻即按 ttl_days 重算钟) */
|
|
101
|
+
unfreeze(id: string): MemoryRowFace;
|
|
102
|
+
}
|
|
103
|
+
/** 读出消毒函数面(§8.2 统一函数注入位——装配传真身保持「同一函数」) */
|
|
104
|
+
export type MemorySanitize = (entry: {
|
|
105
|
+
readonly summary: string;
|
|
106
|
+
readonly content?: string;
|
|
107
|
+
}) => {
|
|
108
|
+
readonly blocked: boolean;
|
|
109
|
+
readonly patterns: readonly string[];
|
|
110
|
+
readonly quoted: boolean;
|
|
111
|
+
};
|
|
112
|
+
/** 数据材料位(TuiBackend 后置注入面 setMemoryScreen 的载荷——装配根 boot 后从服务面传真身) */
|
|
113
|
+
export interface MemoryViewerDataDeps {
|
|
114
|
+
/** owner 并集(['global', 'project:<16hex>']——两分区过滤 + 头行短显) */
|
|
115
|
+
readonly ownerKeys: readonly string[];
|
|
116
|
+
readonly dao: MemoryDaoFace;
|
|
117
|
+
/** 读出消毒(§8.2 统一函数——真身由装配注入) */
|
|
118
|
+
readonly sanitize: MemorySanitize;
|
|
119
|
+
/** 导出命令(/memory-export 处理器装配闭包——真身同一函数;argv 引号感知切分同源) */
|
|
120
|
+
readonly exportCommand: (argv: readonly string[]) => Promise<string>;
|
|
121
|
+
}
|
|
122
|
+
/** 管理面装配选项(数据材料 + 退出三柄——三柄归 TuiBackend 装配闭包) */
|
|
123
|
+
export interface MemoryViewerOptions extends MemoryViewerDataDeps {
|
|
124
|
+
/** 退出管理面(q/Esc/Ctrl+D——装配接线:收副屏〔AltScreenHost close〕) */
|
|
125
|
+
readonly onExit: () => void;
|
|
126
|
+
/** 打断在飞 run(Ctrl+C 副屏键面补丁——零参形:装配闭包已知目标会话) */
|
|
127
|
+
readonly onInterrupt?: () => void;
|
|
128
|
+
/** 退出进程(Ctrl+D——先收副屏〔onExit 已先调〕再转装配退出柄) */
|
|
129
|
+
readonly onQuit?: () => void;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 管理面内容件:ScrollView 子类(滚动/折叠/偏移算术继承)+ OverlayContent
|
|
133
|
+
* (副屏 root——render 直收全屏 region)。
|
|
134
|
+
*/
|
|
135
|
+
export declare class MemoryViewer extends ScrollView implements OverlayContent {
|
|
136
|
+
private readonly ownerKeys;
|
|
137
|
+
private readonly dao;
|
|
138
|
+
private readonly sanitize;
|
|
139
|
+
private readonly exportCommand;
|
|
140
|
+
private readonly onExit;
|
|
141
|
+
private readonly onInterrupt;
|
|
142
|
+
private readonly onQuit;
|
|
143
|
+
private styledLines;
|
|
144
|
+
private entries;
|
|
145
|
+
/** 光标(entries 下标;-1 = 零条目可见无处可指) */
|
|
146
|
+
private cursor;
|
|
147
|
+
/** 健康五计数(投影两行数据源) */
|
|
148
|
+
private health;
|
|
149
|
+
/** 筛选态(Tab 循环) */
|
|
150
|
+
private filter;
|
|
151
|
+
/** 确认态(d 两段式——目标条目非空即在态) */
|
|
152
|
+
private confirmTarget;
|
|
153
|
+
/** 输入态(e 导出参数行在场位) */
|
|
154
|
+
private exportOpen;
|
|
155
|
+
private readonly exportEditor;
|
|
156
|
+
/** 底行一次性提示(守卫错/导出回执/解冻指引——常态下次按键即清) */
|
|
157
|
+
private notice;
|
|
158
|
+
/** 退出闭锁(同批多事件只退一次——q 与 Esc 竞发的防御位) */
|
|
159
|
+
private exited;
|
|
160
|
+
constructor(options: MemoryViewerOptions);
|
|
161
|
+
/** 量高:头行 + 视口全量 + 底铬(输入态 = Editor;其余恒 1 行) */
|
|
162
|
+
measure(width: number): number;
|
|
163
|
+
/**
|
|
164
|
+
* 落位(副屏全屏 region 三段):头行(档名 + owner 短显 + 筛选注记)→
|
|
165
|
+
* 滚动视口(super.render——投影两行/分区头/条目行全在内,折叠与偏移恒归
|
|
166
|
+
* ScrollView)→ 底铬(输入态 = 单行 Editor;确认态 = 确认文案;否则
|
|
167
|
+
* 一次性提示 ?? 动态键面提示)。
|
|
168
|
+
*/
|
|
169
|
+
render(buffer: CellBuffer, region: Region): void;
|
|
170
|
+
/**
|
|
171
|
+
* 事件分发(副屏内容终局消费——未消费键不穿透,模态独占)。
|
|
172
|
+
* 序:Ctrl+C/Ctrl+D 副屏键面补丁 → Tab 全局动词(输入态仍可达——Editor
|
|
173
|
+
* 不消费 Tab)→ 输入态模态 → 确认态模态 → 常态(退出键/行动词/光标键
|
|
174
|
+
* → ScrollView 滚动路)。
|
|
175
|
+
*/
|
|
176
|
+
handleEvent(event: InputEvent): boolean;
|
|
177
|
+
/**
|
|
178
|
+
* mouse 事件路(终局消费——模态独占):滚轮归 ScrollView(统一滚动路);
|
|
179
|
+
* 左键点条目行 = 光标移至该行(点击反查经视口段映射到逻辑行,再对
|
|
180
|
+
* entries 锚比对——非条目行零动作);头行/底铬/滚动条列/非左键零动作吞。
|
|
181
|
+
*/
|
|
182
|
+
private handleMouse;
|
|
183
|
+
/** f:冻结切换(呈现层判向——frozen 行 unfreeze、active 行 freeze;终态行零义吞) */
|
|
184
|
+
private applyFreezeToggle;
|
|
185
|
+
/** d:忘掉起手(active 行入确认态;终态行零义吞;冻结行零义吞 + 底行指引) */
|
|
186
|
+
private beginForget;
|
|
187
|
+
/** 确认态落子:forget(id) 缺省 supersededBy='user'(撤回后条目呈终态区——r 可复) */
|
|
188
|
+
private commitForget;
|
|
189
|
+
/** r:恢复(终态行免 confirm 直接 restore;active 行零义吞) */
|
|
190
|
+
private applyRestore;
|
|
191
|
+
/** e:开导出参数输入行(/memory-export 真身同一函数——参数面与命令面同形) */
|
|
192
|
+
private openExport;
|
|
193
|
+
/** 关输入行(查询文本保留——重开续打的增量延续,/history 搜索框同律) */
|
|
194
|
+
private closeExport;
|
|
195
|
+
/**
|
|
196
|
+
* 执行导出:输入行文本 → 引号感知切分(命令分发同源 tokenize)→ 注入的
|
|
197
|
+
* 处理器闭包;回执折底行(多行以 · 连呈——底行单行面)。fire-and-forget:
|
|
198
|
+
* 命令体同步落盘(writeFileSync),promise 首微task即resolve——引擎帧
|
|
199
|
+
* 合并的 setTimeout 渲染在其后,回执同帧可见。
|
|
200
|
+
*/
|
|
201
|
+
private runExport;
|
|
202
|
+
/** Tab:筛选循环单步(全部→活体→冻结→终态→全部)+ 整表按新筛选重建 */
|
|
203
|
+
private cycleFilter;
|
|
204
|
+
/** 模态全收(Tab 切筛选前的清理位——两模态不跨筛选态存活) */
|
|
205
|
+
private closeModals;
|
|
206
|
+
/** 光标条目(无条目/零条目可见 = undefined——动词消隐判据面) */
|
|
207
|
+
private cursorEntry;
|
|
208
|
+
/** 光标移动(条目间循环——非条目行不驻留;移动后视口对齐光标行) */
|
|
209
|
+
private moveCursor;
|
|
210
|
+
/** 视口对齐光标行(顶对齐——近底行由 ScrollView 夹取自然呈现) */
|
|
211
|
+
private ensureCursorVisible;
|
|
212
|
+
/**
|
|
213
|
+
* 整表重取重建(开屏快照与动词成功后的统一路——06 §7 定形注⑤):
|
|
214
|
+
* 三源取数(health 恒全库 / listVisible 双分流 / listForExport 终态双过滤)
|
|
215
|
+
* → 行集三段式构建 → 光标锚定(同 id 优先;锚定目标缺席驻留原位就近;
|
|
216
|
+
* 零条目可见 = -1 行动词消隐)。
|
|
217
|
+
*/
|
|
218
|
+
private rebuild;
|
|
219
|
+
/**
|
|
220
|
+
* 条目行构建(工具读面同形——`[m:短id] [kind] summary id=完整id
|
|
221
|
+
* updated=ISO`;p-1 时效尾缀同源):消毒经注入的 §8.2 统一函数罩住
|
|
222
|
+
* (blocked → summary 遮蔽保 id 操作面;quoted → 引述注记);冻结行行首
|
|
223
|
+
* ✱、终态行整行 dim + supersededBy 记号。
|
|
224
|
+
*/
|
|
225
|
+
private entryLine;
|
|
226
|
+
/** 退出(闭锁——单次) */
|
|
227
|
+
private exit;
|
|
228
|
+
/**
|
|
229
|
+
* 视口切片带样式写出:样式段(dim 分区头/投影行/终态行)按切片边界分段
|
|
230
|
+
* 落格 + 光标行整行反色叠加。列位经 prefixDisplayWidth 换算(CJK 双宽
|
|
231
|
+
* 对齐与折叠算术同源——HistoryViewer writeSlice 同构的简化形:无搜索
|
|
232
|
+
* 高亮/选区面)。
|
|
233
|
+
*/
|
|
234
|
+
protected writeSlice(buffer: CellBuffer, region: Region, displayRow: number, seg: VisualSegment): void;
|
|
235
|
+
}
|