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.
Files changed (263) hide show
  1. package/README.md +78 -0
  2. package/dist/packages/berry-agent-sdk/src/client.d.ts +6 -0
  3. package/dist/packages/berry-agent-sdk/src/client.js +59 -0
  4. package/dist/packages/berry-agent-sdk/src/client.js.map +1 -0
  5. package/dist/packages/berry-agent-sdk/src/http.d.ts +24 -0
  6. package/dist/packages/berry-agent-sdk/src/http.js +232 -0
  7. package/dist/packages/berry-agent-sdk/src/http.js.map +1 -0
  8. package/dist/packages/berry-agent-sdk/src/index.d.ts +25 -0
  9. package/dist/packages/berry-agent-sdk/src/index.js +22 -0
  10. package/dist/packages/berry-agent-sdk/src/index.js.map +1 -0
  11. package/dist/packages/berry-agent-sdk/src/stdio.d.ts +23 -0
  12. package/dist/packages/berry-agent-sdk/src/stdio.js +238 -0
  13. package/dist/packages/berry-agent-sdk/src/stdio.js.map +1 -0
  14. package/dist/packages/berry-agent-sdk/src/types.d.ts +117 -0
  15. package/dist/packages/berry-agent-sdk/src/types.js +19 -0
  16. package/dist/packages/berry-agent-sdk/src/types.js.map +1 -0
  17. package/dist/src/agent/events.d.ts +11 -0
  18. package/dist/src/agent/events.js +2 -0
  19. package/dist/src/agent/events.js.map +1 -0
  20. package/dist/src/agent/index.d.ts +13 -0
  21. package/dist/src/agent/index.js +3 -0
  22. package/dist/src/agent/index.js.map +1 -0
  23. package/dist/src/agent/loop.d.ts +19 -0
  24. package/dist/src/agent/loop.js +140 -0
  25. package/dist/src/agent/loop.js.map +1 -0
  26. package/dist/src/agent/queue.d.ts +105 -0
  27. package/dist/src/agent/queue.js +120 -0
  28. package/dist/src/agent/queue.js.map +1 -0
  29. package/dist/src/agent/stream.d.ts +21 -0
  30. package/dist/src/agent/stream.js +80 -0
  31. package/dist/src/agent/stream.js.map +1 -0
  32. package/dist/src/agent/tools-batch.d.ts +49 -0
  33. package/dist/src/agent/tools-batch.js +222 -0
  34. package/dist/src/agent/tools-batch.js.map +1 -0
  35. package/dist/src/agent/types.d.ts +104 -0
  36. package/dist/src/agent/types.js +9 -0
  37. package/dist/src/agent/types.js.map +1 -0
  38. package/dist/src/channels/ask-queue.d.ts +44 -0
  39. package/dist/src/channels/ask-queue.js +83 -0
  40. package/dist/src/channels/ask-queue.js.map +1 -0
  41. package/dist/src/channels/commands.d.ts +56 -0
  42. package/dist/src/channels/commands.js +130 -0
  43. package/dist/src/channels/commands.js.map +1 -0
  44. package/dist/src/channels/engine/cell.d.ts +55 -0
  45. package/dist/src/channels/engine/cell.js +144 -0
  46. package/dist/src/channels/engine/cell.js.map +1 -0
  47. package/dist/src/channels/engine/diff.d.ts +3 -0
  48. package/dist/src/channels/engine/diff.js +144 -0
  49. package/dist/src/channels/engine/diff.js.map +1 -0
  50. package/dist/src/channels/engine/engine.d.ts +151 -0
  51. package/dist/src/channels/engine/engine.js +417 -0
  52. package/dist/src/channels/engine/engine.js.map +1 -0
  53. package/dist/src/channels/engine/index.d.ts +22 -0
  54. package/dist/src/channels/engine/index.js +9 -0
  55. package/dist/src/channels/engine/index.js.map +1 -0
  56. package/dist/src/channels/engine/input-keys.d.ts +39 -0
  57. package/dist/src/channels/engine/input-keys.js +87 -0
  58. package/dist/src/channels/engine/input-keys.js.map +1 -0
  59. package/dist/src/channels/engine/input.d.ts +174 -0
  60. package/dist/src/channels/engine/input.js +597 -0
  61. package/dist/src/channels/engine/input.js.map +1 -0
  62. package/dist/src/channels/engine/memory-io.d.ts +46 -0
  63. package/dist/src/channels/engine/memory-io.js +72 -0
  64. package/dist/src/channels/engine/memory-io.js.map +1 -0
  65. package/dist/src/channels/engine/process-io.d.ts +23 -0
  66. package/dist/src/channels/engine/process-io.js +39 -0
  67. package/dist/src/channels/engine/process-io.js.map +1 -0
  68. package/dist/src/channels/engine/types.d.ts +202 -0
  69. package/dist/src/channels/engine/types.js +18 -0
  70. package/dist/src/channels/engine/types.js.map +1 -0
  71. package/dist/src/channels/engine/width.d.ts +23 -0
  72. package/dist/src/channels/engine/width.js +123 -0
  73. package/dist/src/channels/engine/width.js.map +1 -0
  74. package/dist/src/channels/index.d.ts +25 -0
  75. package/dist/src/channels/index.js +16 -0
  76. package/dist/src/channels/index.js.map +1 -0
  77. package/dist/src/channels/registry.d.ts +33 -0
  78. package/dist/src/channels/registry.js +57 -0
  79. package/dist/src/channels/registry.js.map +1 -0
  80. package/dist/src/channels/sdk/admit.d.ts +32 -0
  81. package/dist/src/channels/sdk/admit.js +30 -0
  82. package/dist/src/channels/sdk/admit.js.map +1 -0
  83. package/dist/src/channels/sdk/backend.d.ts +19 -0
  84. package/dist/src/channels/sdk/backend.js +103 -0
  85. package/dist/src/channels/sdk/backend.js.map +1 -0
  86. package/dist/src/channels/sdk/cursor.d.ts +51 -0
  87. package/dist/src/channels/sdk/cursor.js +57 -0
  88. package/dist/src/channels/sdk/cursor.js.map +1 -0
  89. package/dist/src/channels/sdk/index.d.ts +20 -0
  90. package/dist/src/channels/sdk/index.js +21 -0
  91. package/dist/src/channels/sdk/index.js.map +1 -0
  92. package/dist/src/channels/sdk/jsonl.d.ts +47 -0
  93. package/dist/src/channels/sdk/jsonl.js +201 -0
  94. package/dist/src/channels/sdk/jsonl.js.map +1 -0
  95. package/dist/src/channels/sdk/protocol.d.ts +297 -0
  96. package/dist/src/channels/sdk/protocol.js +25 -0
  97. package/dist/src/channels/sdk/protocol.js.map +1 -0
  98. package/dist/src/channels/sdk/schema.d.ts +12 -0
  99. package/dist/src/channels/sdk/schema.js +92 -0
  100. package/dist/src/channels/sdk/schema.js.map +1 -0
  101. package/dist/src/channels/sdk/wire-core.d.ts +199 -0
  102. package/dist/src/channels/sdk/wire-core.js +447 -0
  103. package/dist/src/channels/sdk/wire-core.js.map +1 -0
  104. package/dist/src/channels/service.d.ts +66 -0
  105. package/dist/src/channels/service.js +170 -0
  106. package/dist/src/channels/service.js.map +1 -0
  107. package/dist/src/channels/tui/autocomplete/autocomplete.d.ts +32 -0
  108. package/dist/src/channels/tui/autocomplete/autocomplete.js +43 -0
  109. package/dist/src/channels/tui/autocomplete/autocomplete.js.map +1 -0
  110. package/dist/src/channels/tui/autocomplete/file-mentions.d.ts +18 -0
  111. package/dist/src/channels/tui/autocomplete/file-mentions.js +107 -0
  112. package/dist/src/channels/tui/autocomplete/file-mentions.js.map +1 -0
  113. package/dist/src/channels/tui/autocomplete/popup.d.ts +47 -0
  114. package/dist/src/channels/tui/autocomplete/popup.js +149 -0
  115. package/dist/src/channels/tui/autocomplete/popup.js.map +1 -0
  116. package/dist/src/channels/tui/autocomplete/provider.d.ts +38 -0
  117. package/dist/src/channels/tui/autocomplete/provider.js +8 -0
  118. package/dist/src/channels/tui/autocomplete/provider.js.map +1 -0
  119. package/dist/src/channels/tui/autocomplete/token.d.ts +22 -0
  120. package/dist/src/channels/tui/autocomplete/token.js +69 -0
  121. package/dist/src/channels/tui/autocomplete/token.js.map +1 -0
  122. package/dist/src/channels/tui/backend/ansi-rows.d.ts +86 -0
  123. package/dist/src/channels/tui/backend/ansi-rows.js +209 -0
  124. package/dist/src/channels/tui/backend/ansi-rows.js.map +1 -0
  125. package/dist/src/channels/tui/backend/main-screen.d.ts +90 -0
  126. package/dist/src/channels/tui/backend/main-screen.js +208 -0
  127. package/dist/src/channels/tui/backend/main-screen.js.map +1 -0
  128. package/dist/src/channels/tui/backend/osc.d.ts +79 -0
  129. package/dist/src/channels/tui/backend/osc.js +92 -0
  130. package/dist/src/channels/tui/backend/osc.js.map +1 -0
  131. package/dist/src/channels/tui/backend/transcript.d.ts +98 -0
  132. package/dist/src/channels/tui/backend/transcript.js +231 -0
  133. package/dist/src/channels/tui/backend/transcript.js.map +1 -0
  134. package/dist/src/channels/tui/backend/tui-backend.d.ts +324 -0
  135. package/dist/src/channels/tui/backend/tui-backend.js +916 -0
  136. package/dist/src/channels/tui/backend/tui-backend.js.map +1 -0
  137. package/dist/src/channels/tui/editor/editor-model.d.ts +141 -0
  138. package/dist/src/channels/tui/editor/editor-model.js +544 -0
  139. package/dist/src/channels/tui/editor/editor-model.js.map +1 -0
  140. package/dist/src/channels/tui/editor/editor-view.d.ts +36 -0
  141. package/dist/src/channels/tui/editor/editor-view.js +141 -0
  142. package/dist/src/channels/tui/editor/editor-view.js.map +1 -0
  143. package/dist/src/channels/tui/editor/editor.d.ts +50 -0
  144. package/dist/src/channels/tui/editor/editor.js +276 -0
  145. package/dist/src/channels/tui/editor/editor.js.map +1 -0
  146. package/dist/src/channels/tui/editor/undo-stack.d.ts +22 -0
  147. package/dist/src/channels/tui/editor/undo-stack.js +36 -0
  148. package/dist/src/channels/tui/editor/undo-stack.js.map +1 -0
  149. package/dist/src/channels/tui/editor/visual-lines.d.ts +39 -0
  150. package/dist/src/channels/tui/editor/visual-lines.js +127 -0
  151. package/dist/src/channels/tui/editor/visual-lines.js.map +1 -0
  152. package/dist/src/channels/tui/editor/word-nav.d.ts +10 -0
  153. package/dist/src/channels/tui/editor/word-nav.js +107 -0
  154. package/dist/src/channels/tui/editor/word-nav.js.map +1 -0
  155. package/dist/src/channels/tui/history/history-viewer.d.ts +133 -0
  156. package/dist/src/channels/tui/history/history-viewer.js +404 -0
  157. package/dist/src/channels/tui/history/history-viewer.js.map +1 -0
  158. package/dist/src/channels/tui/index.d.ts +16 -0
  159. package/dist/src/channels/tui/index.js +4 -0
  160. package/dist/src/channels/tui/index.js.map +1 -0
  161. package/dist/src/channels/tui/markdown/blocks.d.ts +42 -0
  162. package/dist/src/channels/tui/markdown/blocks.js +112 -0
  163. package/dist/src/channels/tui/markdown/blocks.js.map +1 -0
  164. package/dist/src/channels/tui/markdown/inline.d.ts +24 -0
  165. package/dist/src/channels/tui/markdown/inline.js +76 -0
  166. package/dist/src/channels/tui/markdown/inline.js.map +1 -0
  167. package/dist/src/channels/tui/markdown/markdown.d.ts +34 -0
  168. package/dist/src/channels/tui/markdown/markdown.js +183 -0
  169. package/dist/src/channels/tui/markdown/markdown.js.map +1 -0
  170. package/dist/src/channels/tui/memory/memory-viewer.d.ts +235 -0
  171. package/dist/src/channels/tui/memory/memory-viewer.js +541 -0
  172. package/dist/src/channels/tui/memory/memory-viewer.js.map +1 -0
  173. package/dist/src/channels/tui/overlay/alt-screen.d.ts +79 -0
  174. package/dist/src/channels/tui/overlay/alt-screen.js +106 -0
  175. package/dist/src/channels/tui/overlay/alt-screen.js.map +1 -0
  176. package/dist/src/channels/tui/overlay/overlay.d.ts +53 -0
  177. package/dist/src/channels/tui/overlay/overlay.js +58 -0
  178. package/dist/src/channels/tui/overlay/overlay.js.map +1 -0
  179. package/dist/src/channels/tui/overlay/select-confirm.d.ts +73 -0
  180. package/dist/src/channels/tui/overlay/select-confirm.js +157 -0
  181. package/dist/src/channels/tui/overlay/select-confirm.js.map +1 -0
  182. package/dist/src/channels/tui/panels/todo-panel.d.ts +24 -0
  183. package/dist/src/channels/tui/panels/todo-panel.js +55 -0
  184. package/dist/src/channels/tui/panels/todo-panel.js.map +1 -0
  185. package/dist/src/channels/tui/panels/tool-progress-panel.d.ts +37 -0
  186. package/dist/src/channels/tui/panels/tool-progress-panel.js +94 -0
  187. package/dist/src/channels/tui/panels/tool-progress-panel.js.map +1 -0
  188. package/dist/src/channels/tui/scroll/scroll-view.d.ts +96 -0
  189. package/dist/src/channels/tui/scroll/scroll-view.js +255 -0
  190. package/dist/src/channels/tui/scroll/scroll-view.js.map +1 -0
  191. package/dist/src/channels/tui/status/status-line.d.ts +46 -0
  192. package/dist/src/channels/tui/status/status-line.js +77 -0
  193. package/dist/src/channels/tui/status/status-line.js.map +1 -0
  194. package/dist/src/channels/tui/theme.d.ts +27 -0
  195. package/dist/src/channels/tui/theme.js +42 -0
  196. package/dist/src/channels/tui/theme.js.map +1 -0
  197. package/dist/src/channels/types.d.ts +84 -0
  198. package/dist/src/channels/types.js +12 -0
  199. package/dist/src/channels/types.js.map +1 -0
  200. package/dist/src/channels/ui-core.d.ts +80 -0
  201. package/dist/src/channels/ui-core.js +210 -0
  202. package/dist/src/channels/ui-core.js.map +1 -0
  203. package/dist/src/context/codes.d.ts +1 -0
  204. package/dist/src/context/codes.js +41 -0
  205. package/dist/src/context/codes.js.map +1 -0
  206. package/dist/src/context/events.d.ts +62 -0
  207. package/dist/src/context/events.js +161 -0
  208. package/dist/src/context/events.js.map +1 -0
  209. package/dist/src/context/index.d.ts +16 -0
  210. package/dist/src/context/index.js +14 -0
  211. package/dist/src/context/index.js.map +1 -0
  212. package/dist/src/context/logger.d.ts +67 -0
  213. package/dist/src/context/logger.js +137 -0
  214. package/dist/src/context/logger.js.map +1 -0
  215. package/dist/src/context/scope.d.ts +78 -0
  216. package/dist/src/context/scope.js +183 -0
  217. package/dist/src/context/scope.js.map +1 -0
  218. package/dist/src/context/workspace.d.ts +8 -0
  219. package/dist/src/context/workspace.js +105 -0
  220. package/dist/src/context/workspace.js.map +1 -0
  221. package/dist/src/contracts/agent-events.d.ts +73 -0
  222. package/dist/src/contracts/agent-events.js +17 -0
  223. package/dist/src/contracts/agent-events.js.map +1 -0
  224. package/dist/src/contracts/api.d.ts +249 -0
  225. package/dist/src/contracts/api.js +334 -0
  226. package/dist/src/contracts/api.js.map +1 -0
  227. package/dist/src/contracts/approval.d.ts +37 -0
  228. package/dist/src/contracts/approval.js +10 -0
  229. package/dist/src/contracts/approval.js.map +1 -0
  230. package/dist/src/contracts/env-ref.d.ts +41 -0
  231. package/dist/src/contracts/env-ref.js +33 -0
  232. package/dist/src/contracts/env-ref.js.map +1 -0
  233. package/dist/src/contracts/errors.d.ts +56 -0
  234. package/dist/src/contracts/errors.js +267 -0
  235. package/dist/src/contracts/errors.js.map +1 -0
  236. package/dist/src/contracts/events.d.ts +70 -0
  237. package/dist/src/contracts/events.js +330 -0
  238. package/dist/src/contracts/events.js.map +1 -0
  239. package/dist/src/contracts/index.d.ts +32 -0
  240. package/dist/src/contracts/index.js +27 -0
  241. package/dist/src/contracts/index.js.map +1 -0
  242. package/dist/src/contracts/llm.d.ts +278 -0
  243. package/dist/src/contracts/llm.js +13 -0
  244. package/dist/src/contracts/llm.js.map +1 -0
  245. package/dist/src/contracts/messages.d.ts +63 -0
  246. package/dist/src/contracts/messages.js +66 -0
  247. package/dist/src/contracts/messages.js.map +1 -0
  248. package/dist/src/contracts/redact.d.ts +46 -0
  249. package/dist/src/contracts/redact.js +224 -0
  250. package/dist/src/contracts/redact.js.map +1 -0
  251. package/dist/src/contracts/tools.d.ts +198 -0
  252. package/dist/src/contracts/tools.js +35 -0
  253. package/dist/src/contracts/tools.js.map +1 -0
  254. package/dist/src/contracts/types.d.ts +304 -0
  255. package/dist/src/contracts/types.js +51 -0
  256. package/dist/src/contracts/types.js.map +1 -0
  257. package/dist/src/contracts/ui.d.ts +122 -0
  258. package/dist/src/contracts/ui.js +16 -0
  259. package/dist/src/contracts/ui.js.map +1 -0
  260. package/dist/src/sdk/types.d.ts +144 -0
  261. package/dist/src/sdk/types.js +33 -0
  262. package/dist/src/sdk/types.js.map +1 -0
  263. package/package.json +29 -0
@@ -0,0 +1,231 @@
1
+ import { isStandardMessage } from '../../../contracts/index.js';
2
+ import { CellGrid, truncateToWidth, wrapText } from '../../engine/index.js';
3
+ import { gridRowToStyled, styledLineToAnsi } from './ansi-rows.js';
4
+ import { MarkdownDoc } from '../markdown/markdown.js';
5
+ /**
6
+ * 主屏滚动帽定值(07 §4.1「屏幕模型双形态」:帽值随主屏实装批实测定值回填、
7
+ * 规范不预写数字。批 10f-3 性能回归锁建锁:四指标 wall-time 面不覆盖块帽
8
+ * 〔内存上限语义〕——v1 维持保守值 500 块,实机校准注记留批 12 host 装配)。
9
+ * 批 10f-4 参数化:本值降级为缺省帽(主屏调用面零变化);回看器全量档经
10
+ * LiveTranscriptOptions.blockCap 传 Number.POSITIVE_INFINITY(全量 durable
11
+ * 正文不被截——perf-lock 全量档回归锁)。
12
+ */
13
+ export const TRANSCRIPT_BLOCK_CAP = 500;
14
+ /** ⚙ 行 / ↳ 行的参数与结果简述显示宽帽(列) */
15
+ const BRIEF_WIDTH = 40;
16
+ /** 会话短 id(呈现层自截——散列映射色板键同源) */
17
+ export function shortIdOf(sessionId) {
18
+ return sessionId.slice(0, 8);
19
+ }
20
+ /** dim 样式(简行块的整行样式——SGR 2;呈现侧带样式形同值) */
21
+ const DIM_STYLE = Object.freeze({ dim: true });
22
+ /**
23
+ * 块 → 带样式行集(管线单源本体——批 10f-4 件 8 提取)。
24
+ *
25
+ * 主屏 MainScreen 直写(经 renderBlockLines 的 ANSI 序列化形)与件 8 回看器
26
+ * cell 写出(StyledLine 直消费)共用本函数:同输入同行集、零第二渲染器
27
+ * (07 件 8 数据源条款);markdown 块经 CellGrid 渲染(gridRowToStyled 提段)、
28
+ * user 块折行续挂对齐(宽算术单源走 wrapText)、简行块整行 dim、streaming
29
+ * 纯文本零样式、markdown 无内容行保空行(主屏空行直写形字节不变)。
30
+ */
31
+ export function renderBlockStyledLines(block, columns) {
32
+ switch (block.kind) {
33
+ case 'markdown': {
34
+ const grid = new CellGrid(columns, block.doc.measure(columns));
35
+ block.doc.render(grid, { row: 0, col: 0, width: columns, height: grid.rows });
36
+ const lines = [];
37
+ for (let r = 0; r < grid.rows; r++) {
38
+ lines.push(gridRowToStyled(grid, r) ?? { plain: '', runs: [] }); // 无内容行保空行
39
+ }
40
+ return lines;
41
+ }
42
+ case 'user': {
43
+ // '> ' 前缀 + 折行续挂对齐(首行前缀、续行两空格缩进)
44
+ const lines = wrapText(block.text, columns - 2);
45
+ return lines.map((line, i) => ({ plain: (i === 0 ? '> ' : ' ') + line, runs: [] }));
46
+ }
47
+ case 'tool-call':
48
+ return [dimStyledLine(` ⚙ ${block.name}${block.brief}`)];
49
+ case 'tool-result':
50
+ return [dimStyledLine(` ↳ ${block.brief}`)];
51
+ case 'streaming':
52
+ // 流式槽纯文本直推(性能:不走网格不走样式);空文本零行
53
+ return block.text === '' ? [] : wrapText(block.text, columns).map((text) => ({ plain: text, runs: [] }));
54
+ }
55
+ }
56
+ /** 简行块的带样式形(整行 dim——与 ANSI 形 dim() 字节同源) */
57
+ function dimStyledLine(text) {
58
+ return { plain: text, runs: [{ start: 0, end: text.length, style: DIM_STYLE }] };
59
+ }
60
+ /**
61
+ * 块 → 行序列化(渲染管线单源——批 10f-4 提取为可复用函数;主屏直写消费形)。
62
+ * 带样式行本体经 styledLineToAnsi 导出 ANSI 串——与回看器 cell 写出形零第二
63
+ * 渲染器(renderBlockStyledLines 注)。
64
+ */
65
+ export function renderBlockLines(block, columns) {
66
+ return renderBlockStyledLines(block, columns).map(styledLineToAnsi);
67
+ }
68
+ /** 消息文本块拼接(user/assistant/toolResult 通用;自定义角色与无文本块返 '') */
69
+ function textOf(message) {
70
+ // isStandardMessage 守卫先行——CustomMessage role: string 非字面判别位,
71
+ // 相等/开关收窄均排不掉,经守卫归一到标准三角色(自定义角色呈现侧宽容跳过)
72
+ if (!isStandardMessage(message))
73
+ return '';
74
+ if (typeof message.content === 'string')
75
+ return message.content; // user 纯文本形
76
+ return joinTextBlocks(message.content);
77
+ }
78
+ /** 文本块抽取拼接(图文/思考/工具块族里 text 块的串接——无文本块返 '') */
79
+ function joinTextBlocks(blocks) {
80
+ const parts = [];
81
+ for (const block of blocks) {
82
+ if (block.type === 'text' && typeof block.text === 'string')
83
+ parts.push(block.text);
84
+ }
85
+ return parts.join('');
86
+ }
87
+ /** 工具简述:参数键名序列(`path, content` 形——呈现面克制不倒参数值) */
88
+ function argsBrief(args) {
89
+ const keys = Object.keys(args);
90
+ return keys.length > 0 ? `(${keys.join(', ')})` : '';
91
+ }
92
+ /**
93
+ * 直播路行集(单聚焦会话一账——非聚焦会话不建账,摘要行直返)。
94
+ * 纯状态件:无 IO、无时钟——applyEvent 同步归约,呈现编舞归 MainScreen。
95
+ */
96
+ export class LiveTranscript {
97
+ /** 块帽(构造定着——主屏 500 / 回看器全量 Infinity) */
98
+ blockCap;
99
+ blocks = [];
100
+ /** 流式槽在场位(true = 末块是 streaming——message_start/message_end 配对守卫) */
101
+ slotOpen = false;
102
+ constructor(options = {}) {
103
+ this.blockCap = options.blockCap ?? TRANSCRIPT_BLOCK_CAP;
104
+ }
105
+ /** 行集快照(只读——呈现侧消费) */
106
+ get snapshot() {
107
+ return this.blocks;
108
+ }
109
+ /** 块计数(帽额度观测面) */
110
+ get blockCount() {
111
+ return this.blocks.length;
112
+ }
113
+ /**
114
+ * 直播路归约:活体信封 → 行集更新 + 瞬时行(非聚焦摘要行直返、聚焦返 null)。
115
+ * 非聚焦会话的 durable 事件全忽略(行集是聚焦会话的账——投影重建走 loadProjection)。
116
+ */
117
+ applyEvent(env, focused) {
118
+ const { event } = env;
119
+ if (!focused)
120
+ return this.summaryFor(event, env.sessionId);
121
+ this.applyFocused(event);
122
+ return null;
123
+ }
124
+ /** 投影重建(repaint 路——清账按投影重拉帽内段;直播/repaint 行集同构) */
125
+ loadProjection(messages) {
126
+ const rebuilt = [];
127
+ for (const message of messages) {
128
+ switch (message.role) {
129
+ case 'user':
130
+ rebuilt.push({ kind: 'user', text: textOf(message) });
131
+ break;
132
+ case 'assistant':
133
+ this.appendAssistantFinal(rebuilt, message);
134
+ break;
135
+ case 'toolResult':
136
+ rebuilt.push({ kind: 'tool-result', brief: resultBrief(message) });
137
+ break;
138
+ // 自定义角色:content unknown 宽容跳过(不猜形状——件 1 自定义渲染器优先级语义)
139
+ }
140
+ }
141
+ this.blocks = rebuilt;
142
+ this.slotOpen = false; // 投影是 durable 快照——无在飞槽
143
+ this.trimToCap();
144
+ }
145
+ /** 非聚焦摘要行分档(agent_start/end 之外的事件零产出) */
146
+ summaryFor(event, sessionId) {
147
+ const shortId = shortIdOf(sessionId);
148
+ switch (event.type) {
149
+ case 'agent_start':
150
+ return { symbol: '⧗', shortId, label: '后台工作中' };
151
+ case 'agent_end':
152
+ if (event.status === 'completed')
153
+ return { symbol: '✓', shortId, label: '后台完成' };
154
+ if (event.status === 'failed')
155
+ return { symbol: '✖', shortId, label: '后台失败' };
156
+ return { symbol: '⏹', shortId, label: '后台已中止' }; // aborted——失败与中止显式分档
157
+ default:
158
+ return null; // 消息族/turn 族:非聚焦零正文行(摘要行只由 run 生命周期驱动)
159
+ }
160
+ }
161
+ /** 聚焦归约:消息事件族分派(唯一渲染源律——tool_execution_* 正文零渲染) */
162
+ applyFocused(event) {
163
+ switch (event.type) {
164
+ case 'message_start':
165
+ if (event.role !== 'assistant')
166
+ return;
167
+ // 流式单槽守卫:重开先摘旧槽(占位容器不孤儿滞留)
168
+ if (this.slotOpen)
169
+ this.blocks.pop();
170
+ this.blocks.push({ kind: 'streaming', text: '' });
171
+ this.slotOpen = true;
172
+ break;
173
+ case 'message_update':
174
+ if (event.role !== 'assistant' || !this.slotOpen)
175
+ return;
176
+ // partial 是完整快照——直换非追加(性能:纯文本直推)
177
+ this.blocks[this.blocks.length - 1] = { kind: 'streaming', text: textOf(event.partial) };
178
+ break;
179
+ case 'message_end': {
180
+ // 判别位在载荷 message.role(事件自身不带 role 字段——轻载荷事件形)
181
+ const { message } = event;
182
+ if (message.role === 'assistant') {
183
+ if (this.slotOpen) {
184
+ this.blocks.pop();
185
+ this.slotOpen = false;
186
+ }
187
+ this.appendAssistantFinal(this.blocks, message);
188
+ }
189
+ else if (message.role === 'user') {
190
+ this.blocks.push({ kind: 'user', text: textOf(message) });
191
+ }
192
+ else if (message.role === 'toolResult') {
193
+ this.blocks.push({ kind: 'tool-result', brief: resultBrief(message) });
194
+ }
195
+ this.trimToCap();
196
+ break;
197
+ }
198
+ default:
199
+ break; // turn_*/tool_execution_*/agent_* 正文零渲染(状态面消费)
200
+ }
201
+ }
202
+ /** assistant 定稿展开:文本块非空 → markdown 块;每 toolCall 块 → ⚙ 行块 */
203
+ appendAssistantFinal(target, message) {
204
+ // 守卫 + 判别收窄到 AssistantMessage(CustomMessage 判别位是 string——见 textOf 注)
205
+ if (!isStandardMessage(message) || message.role !== 'assistant')
206
+ return;
207
+ const text = textOf(message);
208
+ if (text !== '')
209
+ target.push({ kind: 'markdown', doc: MarkdownDoc.of(text) });
210
+ for (const block of message.content) {
211
+ if (block.type === 'toolCall') {
212
+ target.push({ kind: 'tool-call', name: block.name, brief: argsBrief(block.arguments) });
213
+ }
214
+ }
215
+ }
216
+ /** 帽卸载:超帽从头卸(保留帽内最近段——滚出视口交 scrollback 后内存上限语义;全量档 Infinity 恒不触发) */
217
+ trimToCap() {
218
+ if (this.blocks.length > this.blockCap) {
219
+ this.blocks = this.blocks.slice(this.blocks.length - this.blockCap);
220
+ }
221
+ }
222
+ }
223
+ /** ↳ 工具结果简述:文本块首行按显示宽截断(无文本块返占位) */
224
+ function resultBrief(message) {
225
+ const text = textOf(message);
226
+ if (text === '')
227
+ return '(无文本输出)';
228
+ const firstLine = text.split('\n').find((line) => line.trim() !== '') ?? '';
229
+ return truncateToWidth(firstLine.trim(), BRIEF_WIDTH);
230
+ }
231
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../../../../../src/channels/tui/backend/transcript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,324 @@
1
+ import { type AgentMessage } from '../../../contracts/index.js';
2
+ import type { ApprovalAskAnswer, ApprovalAskRequest, NotifyLevel, SessionEnvelope, TodoItem, UiAskOptions, UiBackend, UiInputOptions, UiSelectChoice } from '../../types.js';
3
+ import { type TerminalIO } from '../../engine/index.js';
4
+ import { type AltScreenPrimary } from '../overlay/alt-screen.js';
5
+ import { type MemoryViewerDataDeps } from '../memory/memory-viewer.js';
6
+ import { type AutocompleteSources } from '../autocomplete/autocomplete.js';
7
+ /** 后端构造选项 */
8
+ export interface TuiBackendOptions {
9
+ /** 当前交互会话位(提交/打断柄的 sessionId 机器位——装配焦点联动可改) */
10
+ readonly sessionId?: string;
11
+ /** 装配向接线柄(07 §4.3 两柄):提交(非命令形文本——驱动 conversation) */
12
+ readonly onSubmit?: (sessionId: string, text: string) => void;
13
+ /** 装配向接线柄:打断当前 run(ctrl+c——run 打断经装配侧折入 ask 链收口) */
14
+ readonly onInterrupt?: (sessionId: string) => void;
15
+ /** 装配向接线柄:退出(ctrl+d 空框) */
16
+ readonly onQuit?: () => void;
17
+ /** 命令柄('/' 起手文本——03 §2.2 dispatch;false = 未命中落 onSubmit 兜底) */
18
+ readonly dispatchCommand?: (input: string) => Promise<boolean>;
19
+ /** 补全三源注入(命令名源注入查询函数接 CommandRegistry.list();@ 文件段源归装配批) */
20
+ readonly autocomplete?: AutocompleteSources;
21
+ /** todo 面板数据源(件 4——装配接 deps 同名面;注入缺席 = 面板缺席零变化) */
22
+ readonly todoFor?: (sessionId: string) => readonly TodoItem[] | null | undefined;
23
+ /** 调度注入(启用渲染合并 + fps 帽 + tick 自驱——缺省同步直出测试语义) */
24
+ readonly schedule?: (fn: () => void, ms: number) => unknown;
25
+ /** 取消调度注入(与 schedule 配对——stop 时收在飞帧/tick/ESC 窗) */
26
+ readonly cancelSchedule?: (handle: unknown) => void;
27
+ /** 时钟注入(缺省 Date.now——fps 帽锚) */
28
+ readonly now?: () => number;
29
+ /** lone-ESC 判定窗(ms;缺省 30) */
30
+ readonly escapeWindowMs?: number;
31
+ /** 帧率帽 fps(缺省 60——与 Engine DEFAULT_FPS_CAP 对齐) */
32
+ readonly fpsCap?: number;
33
+ /** 编辑器最大可视行(装配按终端高 30% 注入;缺省 8) */
34
+ readonly maxVisibleLines?: number;
35
+ /** 宿主版本(件 7——title 基线 `berry-agent <版本>`;缺席或空串 = 无版本缀裸名。真值归批 12 host 装配传 HostFace.version) */
36
+ readonly version?: string;
37
+ }
38
+ /**
39
+ * run 级用量累计(件 6——agent_start/repaint 归零、turn_end 累加、agent_end
40
+ * 落行;观测面供装配/宿主侧二次消费,`/usage` 全量面板分职不互替)。
41
+ */
42
+ export interface UsageAccumulation {
43
+ readonly input: number;
44
+ readonly output: number;
45
+ readonly cacheRead: number;
46
+ readonly cacheWrite: number;
47
+ readonly totalTokens: number;
48
+ /** 累计货币额(cost 在场才累——spec 条款) */
49
+ readonly cost: number;
50
+ /** 币种(首见 cost.currency 定着) */
51
+ readonly currency: string | null;
52
+ }
53
+ /**
54
+ * TUI 后端:单终端 inline 主屏 + 自持输入管线。构造后须 start()(模式串 +
55
+ * 清屏 + 滚动区确立)再接核事件;stop() 对称出屏(模式串反序 + raw 复原)。
56
+ */
57
+ export declare class TuiBackend implements UiBackend<AgentMessage>, AltScreenPrimary {
58
+ readonly id = "tui";
59
+ readonly capabilities: Readonly<{
60
+ notify: true;
61
+ confirm: true;
62
+ select: true;
63
+ input: true;
64
+ approval: true;
65
+ setStatus: true;
66
+ setWidget: false;
67
+ }>;
68
+ /** 当前交互会话位(装配焦点联动可改——提交/打断柄的机器位) */
69
+ sessionId: string;
70
+ private readonly io;
71
+ private readonly screen;
72
+ private readonly transcript;
73
+ private readonly statusLine;
74
+ private readonly editor;
75
+ private readonly popup;
76
+ private readonly stack;
77
+ /** overlay 锚定注册表(content 身份键 → 本帧 region——renderFixed 行账重建) */
78
+ private readonly overlayLayout;
79
+ /** 装配柄(07 §4.3 两柄 + 命令柄) */
80
+ private readonly onSubmit;
81
+ private readonly onInterrupt;
82
+ private readonly onQuit;
83
+ private readonly dispatchCommand;
84
+ private readonly decoder;
85
+ private readonly escapeWindowMs;
86
+ private escapeHandle;
87
+ private unsubInput;
88
+ private unsubResize;
89
+ private running;
90
+ /** 起动过位(lifecycle 的 idle / disposed 分权——一次性事实,start 幂等位之外) */
91
+ private startedOnce;
92
+ private priorRaw;
93
+ private disarmExitRestore;
94
+ /** 挂起位(suspendMain 置位:渲染请求安全 no-op 闸 + 输入已卸订) */
95
+ private suspendedMain;
96
+ /** 停屏期到达的瞬时行缓冲(notify / 件 9 摘要行 / 撤销说明行——复起补显射界,2026-09-07 勘正笔) */
97
+ private suspendedTransients;
98
+ /** 副屏宿主(构造晚于 io 赋值——类字段初始化序:宿主构造须见 io 实值) */
99
+ private readonly altHost;
100
+ /** 在场副屏句柄(单值承载 /history 与 /memory 两件——无嵌套备屏律;开、q/Esc/Ctrl+D/ask 收四路共闭) */
101
+ private altHandle;
102
+ /**
103
+ * 记忆管理面材料位(mm 批——后置注入):构造期不可达(memory 件的 dao
104
+ * 生命周期在插件 apply 内、且 channels 不可 import memory——边表),装配
105
+ * 根 boot 完成后经 setMemoryScreen 注入真身;null = 材料缺席(openMemory
106
+ * 返 false——/memory 命令核侧 notify 降级提示)。
107
+ */
108
+ private memoryScreen;
109
+ private readonly scheduleFn;
110
+ private readonly cancelFn;
111
+ private readonly now;
112
+ private readonly minFrameMs;
113
+ private pendingOps;
114
+ private needFixed;
115
+ private frameHandle;
116
+ private tickHandle;
117
+ private lastFlushAt;
118
+ /** input-ask 在飞体(null = 常态——提交落 onSubmit) */
119
+ private inputAsk;
120
+ private readonly todoFor;
121
+ private readonly todoPanel;
122
+ private readonly toolPanel;
123
+ /** 当前 turn 的 assistant 消息用量暂存(turn_end 累加——件 6 等价性条款) */
124
+ private pendingUsage;
125
+ private usageTotal;
126
+ /** title 基线(`berry-agent` 或 `berry-agent <版本>`——起屏与复原落点) */
127
+ private readonly titleBaseline;
128
+ private readonly osc;
129
+ /**
130
+ * 各会话在飞净计数(agent_start +1 / agent_end -1——按信封 sessionId 归
131
+ * 账,clamp ≥ 0;归零删条目防会话退出残键)。聚焦位不参账:run 跨切焦时
132
+ * start/end 恒落同一会话账——按事件时刻聚焦位分两路会跨路不对称(末路
133
+ * end 被 clamp 吞致忙态永残留,07 件 7 判据勘正)。
134
+ */
135
+ private readonly inFlightBySession;
136
+ /** 进度态上次写出(忙闲迁移门——同态静默,周期重发归保活自持) */
137
+ private progressBusy;
138
+ constructor(io: TerminalIO, options?: TuiBackendOptions);
139
+ /** TUI 恒有观众(07 §4.3 观众探针定值) */
140
+ hasAudience(): boolean;
141
+ /** 生命周期判定位(AltScreenPrimary 窄介面面:idle 未启 / running 持屏 / suspended 挂起 / disposed 终退) */
142
+ get lifecycle(): 'idle' | 'running' | 'suspended' | 'disposed';
143
+ /** 启动:主屏形模式串 + raw + 输入订阅 + 清屏滚动区 + 固定区首画 */
144
+ start(): void;
145
+ /** 对称出屏:模式串反序 + 输入卸订 + 定时器全收 + 外显复原 + raw 复原(终退不可复用) */
146
+ stop(): void;
147
+ /**
148
+ * 主屏挂起(AltScreenPrimary 交出半场——批 10f-4;07 §4.1 件 8「主屏挂起 /
149
+ * 复起交出面(UiBackend 实装件自持)」条款):
150
+ * 出屏模式串 + 卸输入监听 + 在途转义一窗全丢 + 停流 + raw 复先验(Engine
151
+ * suspend 三件套同形——共享 io 换防,副屏随后 start 重装重放流);渲染请求
152
+ * 安全 no-op(requestRender / flush 挂起闸——停屏期零写出);帧合并 / tick /
153
+ * lone-ESC 窗定时器全收(防后台空转);硬退复原钩解除(挂起期副屏自担其屏
154
+ * 的退出复原)。
155
+ *
156
+ * 件 7 osc 保活不停(批内裁):外显态(title / 忙态 OSC 9;4)属终端级非
157
+ * 主屏 cell 内容——停屏期终端标签页注意力语义照常(onEnvelope 照常归账),
158
+ * OSC 序列不落 cell 网格不扰动副屏画面。
159
+ *
160
+ * 停屏期账不丢:durable 事件照常归约行集模型(复起全帧重画携带——树已含
161
+ * 停屏期全部事件);瞬时行(notify / 件 9 摘要行 / 撤销说明行)入
162
+ * suspendedTransients 缓冲——复起补显射界含瞬时行(树按字面不含不入树的
163
+ * 瞬时行,2026-09-07 遗漏审计批补笔)。
164
+ */
165
+ suspendMain(): void;
166
+ /**
167
+ * 主屏复起(AltScreenPrimary 交出半场的对称复位):进屏模式串 + 硬退钩
168
+ * 重武装 + raw 重设 + 输入重装 + 显式放流(已被 pause 的流再挂监听不自动回
169
+ * flowing——Engine resume 同形)+ **全帧重画不走(通道)repaint**:主屏既有
170
+ * 权威全量重建路(几何真值重取 + 清屏 + 行集全量重写)+ 瞬时行缓冲补吐。
171
+ *
172
+ * 不走(通道)repaint 的行为锁:通道 repaint 按投影重建行集,投影不含停屏
173
+ * 期直写主屏的瞬时行——全帧重画以行集 + 瞬时缓冲为真相,瞬时行在场即补显
174
+ * (07 件 8「repaint 清树会抹掉停屏期入树的瞬时行」+ 2026-09-07 勘正笔)。
175
+ * 停屏期 resize 由几何真值重取吸收(挂起期 handleResize 安全 no-op——此刻
176
+ * 写出会污染在场副屏)。
177
+ */
178
+ resumeMain(): void;
179
+ /**
180
+ * 开副屏回看器(UiBackend 可选能力面实装——通道核 /history 命令到达扇出):
181
+ * 挂起主屏 → 1049 副屏 HistoryViewer(同一渲染管线全量档——件 8 数据源
182
+ * 条款)。已在副屏 no-op(无嵌套备屏);主屏不在 running 态 open 被拒
183
+ * (句柄 null——保持无副屏态)。Ctrl+C / Ctrl+D 副屏键面经 viewer 装配柄
184
+ * 透传本件两柄(与主屏同键面)。
185
+ */
186
+ openHistory(sessionId: string, messages: readonly AgentMessage[]): void;
187
+ /**
188
+ * 记忆管理面材料注入(mm 批——后置 init 位):装配根 boot 完成后从
189
+ * core:memory 服务面取材料注入(ownerKeys/DAO 窄面/消毒函数/导出闭包——
190
+ * 真身经装配传真)。null = 撤材料(件卸载形——后续 openMemory 返 false)。
191
+ */
192
+ setMemoryScreen(deps: MemoryViewerDataDeps | null): void;
193
+ /**
194
+ * 开副屏记忆管理面(UiBackend 可选能力面实装——通道核 /memory 命令到达
195
+ * 扇出;06 §7 形态定形注):材料缺席或已在副屏返 false(核侧 notify 降级
196
+ * 提示);退出三柄本件自持(打断 = 当前交互会话位——与提交柄同锚)。
197
+ */
198
+ openMemory(): boolean;
199
+ /**
200
+ * 收副屏(UiBackend 可选能力面实装——UiCore ask 入口扇出「先收副屏再入
201
+ * 提问队列」,07 §4.1 件 8 注意力优先级 ask > 回看条款;viewer 退出键
202
+ * 同路收口;/history 与 /memory 两件共口——在场者谁收谁)。幂等:无副屏 no-op。
203
+ */
204
+ collapseAltScreen(): void;
205
+ /** 副屏统一收口:句柄 close(AltScreenHost 编舞:出副屏 + 主屏复起全帧重画) */
206
+ private closeAlt;
207
+ /** 一次性通知:正文瞬时行直写(级别符号前缀——不进行集) */
208
+ notify(message: string, opts?: {
209
+ level?: NotifyLevel;
210
+ }): void;
211
+ /**
212
+ * 瞬时说明行入正文流(notify 与 ask 撤销说明行共用路——07 §4.3「曾在屏
213
+ * 者由通道上撤销说明行」):op 入合并队列 + 渲染请求(同步直出模式立即
214
+ * 落地;注入调度随帧合并——transient 到达序保持)。挂起期入缓冲账不丢
215
+ * (复起补显射界含瞬时行——批 10f-4)。
216
+ */
217
+ private appendTransientLine;
218
+ /** 状态行文案(last-writer-wins——StatusLine 件语义) */
219
+ setStatus(_sessionId: string, status: string): void;
220
+ /** 活体信封呈现:渲染归约 + 摘要行分叉 + 聚焦态状态面消费 */
221
+ onEnvelope(env: SessionEnvelope, focused: boolean): void;
222
+ /** 重画呈现:投影重建行集 + 清屏全量重写(widget 槽值不支撑——忽略) */
223
+ onRepaint(sessionId: string, projection: readonly AgentMessage[], _widget: {
224
+ node: unknown;
225
+ } | null): void;
226
+ /** 状态行动画推帧(自驱定时器内调;公开面留装配侧手动驱动——忙态外零开销) */
227
+ tick(): void;
228
+ /** run 级用量累计观测面(件 6——装配/宿主侧二次消费) */
229
+ get usageView(): UsageAccumulation;
230
+ /** resize 编舞:几何重取 + 主屏全量重画 + 固定区按新几何重建(权威重建不走队列) */
231
+ handleResize(): void;
232
+ /** 是/否确认:ConfirmPanel 浮层(Enter → true / Esc → false;signal abort 保守值 + 关层 + 撤销说明行) */
233
+ confirm(message: string, opts?: UiAskOptions): Promise<boolean>;
234
+ /** 单选:SelectPanel 浮层(Enter → value / Esc → '';ui-core 校验不在集保守值同收 '') */
235
+ select(message: string, choices: readonly UiSelectChoice[], opts?: UiAskOptions): Promise<string>;
236
+ /**
237
+ * 自由文本:input-ask 形——提示行入固定区 + 编辑器转应答车(提交即应答,
238
+ * 弹层抑制);signal abort → '' 保守值 + 残稿清框 + 撤销说明行(07 §4.3
239
+ * 撤销面——提示行曾在固定区在屏,abort 收口正文流落 ⏹ 行)。
240
+ */
241
+ input(message: string, opts?: UiInputOptions): Promise<string>;
242
+ /**
243
+ * 审批:SelectPanel 浮层四值(批准/拒绝/总是批准/取消——Esc 面板保守值 ''
244
+ * 映射 cancel,与 07 §4.3 收口律对齐);always 草案经 hint 段呈现(回写
245
+ * 归通道核 settleApprovalAlways——本件只呈现与回值)。signal abort 收口
246
+ * 'cancel' 保守值 + 撤销说明行(文案「审批」区分于 input/confirm/select
247
+ * 三件——07 §4.3 撤销面)。
248
+ */
249
+ askApproval(_sessionId: string, request: ApprovalAskRequest, opts?: UiAskOptions): Promise<ApprovalAskAnswer>;
250
+ /** 输入处理器:decoder 喂入 + lone-ESC 窗定时器(同步直出模式无窗即决) + 事件路由 */
251
+ private readonly handleInput;
252
+ /** 排空 decoder 事件队列并逐件路由 */
253
+ private flushDecoderEvents;
254
+ /**
255
+ * 事件路由四层(07 §4.3 拦截链序)。
256
+ * 层① 全局键先于 overlay(ctrl+c 打断 run——ask 链收口经装配侧信号折入;
257
+ * ctrl+d 仅 overlay 空 + 编辑器空框才全局退出,否则让路面板/编辑器);
258
+ * 层② overlay 模态独占(未消费键不穿透);层③ 补全弹层非模态穿透;
259
+ * 层④ 编辑器(未消费键终局丢弃——escape 等无全局绑定)。
260
+ */
261
+ private routeEvent;
262
+ /** 编辑器提交路由:input-ask 应答优先 → '/' 命令柄(false 兜底)→ onSubmit */
263
+ private handleSubmit;
264
+ /** 编辑器内容变更:补全层重取(应答期抑制)+ 固定区脏位 */
265
+ private handleEditorChange;
266
+ /**
267
+ * 开 ask 浮层:锚定注册表锚 + signal abort 保守值收口 + 撤销说明行 + 重绘
268
+ * 请求。
269
+ *
270
+ * 「曾在屏者」判据(07 §4.3 语义纪律撤销面——confirm / select / askApproval
271
+ * 三路共用本层,统一处理):abort 传播到后端呈现时层仍未关(在 overlay 栈
272
+ * 中)= 曾在屏 → 撤销说明行入正文流;面板已 done(onFinish 先关层)后迟
273
+ * 到的 abort 是 no-op,不误写。说明行只标撤销收场本身——保守值收口(与提
274
+ * 问队列收口三则「保守值同撤销面」同源条款:审批项收 'cancel'、阻塞件各
275
+ * 收保守值)由 promise 回值承载,行文不重复。
276
+ */
277
+ private openAskLayer;
278
+ /** 锚定闭包:读 renderFixed 行账(首帧前回退固定区顶整宽) */
279
+ private anchorFor;
280
+ /** present op 入队(连续 present 合并留末次——到达序相对 transient 保持) */
281
+ private enqueuePresent;
282
+ /** 固定区脏位 + 渲染请求(touch 固定区的统一入口) */
283
+ private touchFixed;
284
+ /** 渲染请求(合并位):同步直出立即 flush;注入调度则 fps 帽下排帧 */
285
+ private requestRender;
286
+ /** 帧落地:op 队列按到达序执行 + 固定区脏位一帧一次重建 */
287
+ private flush;
288
+ /** 状态行转轮自驱定时器(注入调度后自重排;忙态外 tick 零开销) */
289
+ private armTick;
290
+ /** 定时器收口(frame/tick/escape 三名) */
291
+ private cancelTimer;
292
+ /**
293
+ * 聚焦事件的固定区消费面:run 启停驱动忙态与 usage 累计(件 6)、工具
294
+ * 执行驱动状态行工具名与进度面板(件 3/5)、tool_execution_end/agent_end
295
+ * 驱动 todo 刷新(件 4)。(执行层事件正文零渲染——07 §4.1 直播路渲染
296
+ * 单源的刻意分立。)
297
+ */
298
+ private applyFocusedEvent;
299
+ /** usage 归零清行(agent_start / repaint——件 6 清账重计条款) */
300
+ private resetUsage;
301
+ /** turn_end 累加(暂存的 assistant 用量并入 run 级账本;cost 在场累货币额) */
302
+ private accumulateUsage;
303
+ /** todo 面板刷新(todoFor 注入缺席 = 面板缺席零变化——件 4 条款) */
304
+ private refreshTodo;
305
+ /**
306
+ * 件 7 进度态按会话净计数(任一会话在飞即忙——终端标签页注意力模型):
307
+ * agent_start +1 / agent_end -1,均按信封 sessionId 归账、clamp ≥ 0(进程
308
+ * 内事件无错过窗——clamp 只防重复 end 不穿底;归零删条目)。聚焦位不参
309
+ * 账(07 件 7 判据勘正——事件时刻聚焦位分两路在切焦场景与主句背离)。
310
+ * 忙闲迁移才写 progress 序列(同态静默——周期重发归 osc 保活自持)。
311
+ * stop 后静默短路(终退不再写字节)。
312
+ */
313
+ private trackProgress;
314
+ /**
315
+ * 固定区 v2 重建(自上而下段序):overlay 段(各层量高叠放 + 锚定注册表
316
+ * 行账)→ todo 面板(件 4——todoFor 缺席/空表即零行)→ input-ask 提示行
317
+ * → 补全弹层 → 编辑器(动态量高;聚焦态 = 无 overlay 占焦)→ 工具进度
318
+ * 面板(件 5——与状态行分职互补相邻)→ 状态行。编辑光标经 EditorView
319
+ * setCursor 声明 → MainScreen.setFixed 声明位落 cup。
320
+ */
321
+ private renderFixed;
322
+ /** 硬退复原钩子(仅真 ProcessTerminalIO——注入 io 零污染;Engine 同形) */
323
+ private armExitRestore;
324
+ }