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,42 @@
1
+ /**
2
+ * TUI 呈现配色面(07 篇 §4.1 引擎节件 3「着色克制」条款的定值件)。
3
+ *
4
+ * 着色纪律单源(引擎节件 3):accent 只用于焦点指示面(现载体 = 对话输入件
5
+ * 焦点边框、状态行转轮、overlay 占焦族〔select 面板标题 + 补全弹层空态〕
6
+ * ——2026-09-07 实装对账补列),正文不混用(唯一例外 = 非聚焦摘要行的会话区分色
7
+ * ——非 accent 家族的第二着色位,见 sessionColor);accent 无用户配置面——
8
+ * v1 固定内置色板、缺省索引在本件定值(「随组件批定值」的兑现位)。
9
+ */
10
+ import { ansiColor } from '../engine/index.js';
11
+ /**
12
+ * accent 缺省色号(v1 定值 = cyan 6)。
13
+ *
14
+ * 选型依据:cyan 是 16 色板经典强调色,与常见终端配色(暗底浅字)对比稳定;
15
+ * 索引 6 属标准 8 色,8 色降级终端(07 §4.1 支持矩阵——bold 亮色映射兜底)
16
+ * 下仍可辨。真彩 / 256 色升级挂账引擎节件 3,届时本值随色板扩展再裁。
17
+ */
18
+ export const ACCENT_INDEX = ansiColor(6);
19
+ /**
20
+ * FNV-1a 32 位散列(会话区分色的确定性散列源——无依赖、分布均匀、同输入
21
+ * 恒同输出;charCodeAt 按 UTF-16 码元——短 id 十六进制串场景无代理对歧义)。
22
+ */
23
+ function fnv1a(text) {
24
+ let hash = 0x811c9dc5;
25
+ for (let i = 0; i < text.length; i++) {
26
+ hash ^= text.charCodeAt(i);
27
+ hash = Math.imul(hash, 0x01000193);
28
+ }
29
+ return hash >>> 0;
30
+ }
31
+ /**
32
+ * 会话区分色:会话短 id 散列映射 16 色板索引(07 引擎节件 3——确定性纯
33
+ * 函数、零配置零存储;berry themeFor「各归各色」的等价承接,主题配置面
34
+ * 不预造)。消费面 = 非聚焦摘要行着色(呈现面件 9),与 accent 家族互斥。
35
+ *
36
+ * 映射域 = 16 色板全域(含索引 0——黑底终端上可读性弱是已知取舍,按规范
37
+ * 字面全域映射;真实痛感出现时随色板升级挂账一并再裁)。
38
+ */
39
+ export function sessionColor(sessionShortId) {
40
+ return ansiColor(fnv1a(sessionShortId) & 0x0f);
41
+ }
42
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../../../../src/channels/tui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,SAAS,EAAkB,MAAM,oBAAoB,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAc,SAAS,CAAC,CAAC,CAAC,CAAC;AAEpD;;;GAGG;AACH,SAAS,KAAK,CAAC,IAAY;IACzB,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,cAAsB;IACjD,OAAO,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * channels 件类型契约(L4 宿主固定件——02 篇席 10;机制真源 07 篇 §4.1/§4.3、
3
+ * 03 篇 §2.2 命令面、04 篇 §4 队列、04 篇 §9 审批归属)。
4
+ *
5
+ * 批 10a 落通道核(多会话信封分流 + 投影拉取注入 + 命令面 + ui 原语分发 +
6
+ * 提问队列——通道无关逻辑,零渲染依赖〔2026-09-06 改裁弃 pi-tui 后天然
7
+ * 满足——TUI 实装已落件内自研栈,批 10e〕)。
8
+ * 单向 DAG:channels → contracts, context, agent(02 §4.1——投影类型经装配侧
9
+ * 泛型钉入,不 import session)。
10
+ */
11
+ export type { SessionEnvelope, NotifyLevel, UiAskOptions, UiSelectChoice, UiInputOptions, UiCapabilities, UiBackend, } from '../contracts/index.js';
12
+ export type { ApprovalAskAnswer, ApprovalAskRequest } from '../contracts/index.js';
13
+ /**
14
+ * todo 条目(07 §4.1 呈现面件 4——todoFor 注入载荷):items 全量快照真源 =
15
+ * 05 §1.1 todo/write 事件载荷,本形是呈现投影(装配从 todo 状态映射注入;
16
+ * webui SPA 同源折叠产物)。
17
+ */
18
+ export interface TodoItem {
19
+ /** 四态(呈现记号:☐ 待办 / ◐ 进行中 / ☑ 已完成·暗淡 / ⊙ 缓办·暗淡) */
20
+ readonly status: 'pending' | 'in-progress' | 'completed' | 'deferred';
21
+ /** 条目内容 */
22
+ readonly content: string;
23
+ /** 进行文案(进行中态优先于 content 呈现——CC 式 activeForm 语义) */
24
+ readonly activeForm?: string;
25
+ }
26
+ /** 命令参数(03 §2.2 签名定形:raw 原文引号原样 / argv 引号感知词切分) */
27
+ export interface CommandArgs {
28
+ /** 命令名后的输入原文(引号形态原样保留) */
29
+ readonly raw: string;
30
+ /** 引号感知切分的词数组(单引号保字面、双引号保内部空格、裸词按空白切) */
31
+ readonly argv: readonly string[];
32
+ /**
33
+ * 发起会话 id(07 §4.3 消费腿条款档位 2 配套——交互动词族批 ix-2 新建):
34
+ * 命令由会话输入框发起时通道核透传发起会话;CLI 面命令(无会话语境)
35
+ * 缺席——缺席即无锚语境,ctx.ui 阻塞三件须显式 opts.sessionId。
36
+ */
37
+ readonly sessionId?: string;
38
+ }
39
+ /** TUI 命令 handler 形(03 §2.2:void/Promise 双形) */
40
+ export type CommandHandler = (args: CommandArgs) => void | Promise<void>;
41
+ /** 命令注册条目(/help 与补全面消费——description 可选) */
42
+ export interface CommandSpec {
43
+ readonly name: string;
44
+ readonly handler: CommandHandler;
45
+ readonly description?: string;
46
+ }
47
+ /** 提问队列项 kind(07 §4.3 提问队列:阻塞原语与审批 ask 统一入队) */
48
+ export type AskKind = 'confirm' | 'select' | 'input' | 'approval';
49
+ /**
50
+ * 通道核装配选项。投影拉取经注入回调(host 装配侧钉 session 面——channels
51
+ * 不依赖 session 是 02 §4.1 边表的刻意设计,投影类型 TProjection 由装配钉入)。
52
+ */
53
+ export interface ChannelsOptions<TProjection> {
54
+ /**
55
+ * 投影拉取注入(焦点切换清屏重画的数据源——07 §4.1 通道契约)。
56
+ * 缺席时 focus 仍可切(焦点态生效)、repaint 以空投影收场——装配错误
57
+ * 呈现缺真源是核可观察态,不静默假装有历史。
58
+ */
59
+ readonly fetchProjection?: (sessionId: string) => Promise<readonly TProjection[]>;
60
+ /**
61
+ * 审批 always 的策略表回写注入(07 §4.3 提问队列条款 / 04 §9 ③ 既有
62
+ * 条款的通道侧接法):用户答 `always` 且载荷带 suggestedEntry 草案 → 本
63
+ * 回调落跨会话策略表 allow 条目(用户显式按键后机器只执行写入——装配接
64
+ * safety 侧写入面)。无草案 always 不触发(零草案零副作用)。
65
+ */
66
+ readonly onApprovalAlways?: (entry: string) => void;
67
+ /**
68
+ * 历史正文拉取注入(07 §4.1 件 8 /history——批 10f-4 接线位):与
69
+ * fetchProjection 同层同形(通道核只消费注入回调不依赖 session——边表
70
+ * 执法的刻意设计;真源接线归批 12 host 装配)。在场 = 通道核注册
71
+ * /history 命令(真源 = 聚焦会话 → 拉全量 durable 正文投影 → 扇出后端
72
+ * openHistory);缺席 = 不注册不虚报(件 8 条款注册面律)。
73
+ */
74
+ readonly history?: (sessionId: string) => Promise<readonly TProjection[]>;
75
+ /**
76
+ * 记忆管理面注册位(06 §7 `/memory`——mm 批):与 history 同层同律的
77
+ * 注入在场判(在场 = 通道核注册 /memory 命令;缺席 = 不注册不虚报)。
78
+ * true 形非回调——管理面数据不经通道核流转(后端装配自持材料,openMemory
79
+ * 零参形),通道核只做命令受理与扇出;扇出 falsy(后端不支持或缺材料)
80
+ * 时 notify 降级提示。装配真值 = 座位在位(persistence 在场 ⇒ memory 件
81
+ * 将装载;件缺席由降级提示诚实兜底)。
82
+ */
83
+ readonly memory?: true;
84
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * channels 件类型契约(L4 宿主固定件——02 篇席 10;机制真源 07 篇 §4.1/§4.3、
3
+ * 03 篇 §2.2 命令面、04 篇 §4 队列、04 篇 §9 审批归属)。
4
+ *
5
+ * 批 10a 落通道核(多会话信封分流 + 投影拉取注入 + 命令面 + ui 原语分发 +
6
+ * 提问队列——通道无关逻辑,零渲染依赖〔2026-09-06 改裁弃 pi-tui 后天然
7
+ * 满足——TUI 实装已落件内自研栈,批 10e〕)。
8
+ * 单向 DAG:channels → contracts, context, agent(02 §4.1——投影类型经装配侧
9
+ * 泛型钉入,不 import session)。
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/channels/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * ui 原语分发核(07 §4.3 签名定稿的通道无关编排面——2026-09-06 channels 纵切批)。
3
+ *
4
+ * 职责三块:①降级判定——通道不支持的原语按「notify 化」降级
5
+ * (select→input→notify、confirm→input→notify——插件不感知通道能力差异);
6
+ * ②阻塞原语编排——入提问队列(与审批 ask 同队列)+ 多后端并发竞速
7
+ * (04 §9 跨入口先答先得,败腿经 signal 撤销);③widget 会话级单槽
8
+ * (后写胜前写、置 null 清空——07 §4.3 setWidget 多写者语义)。
9
+ *
10
+ * 撤销面(07 §4.3):外部 signal abort 或队列收口 → 保守值收场
11
+ * (confirm→false / select·input→'')——曾在屏者的撤销说明行归后端
12
+ * signal 消费实现,核只负责 abort 传播与结算。
13
+ *
14
+ * 核级 API 一律显式 sessionId(多会话归属的机器位);ctx.ui 薄包装绑
15
+ * 「当前会话」归 host 装配批。后端移除(removeBackend)时在飞问询的收口
16
+ * 是后端自身义务(移除前 settle 或经 signal abort)——装配级事件,核不代管。
17
+ */
18
+ import type { ApprovalAskAnswer, ApprovalAskRequest, AskKind, NotifyLevel, UiAskOptions, UiBackend, UiInputOptions, UiSelectChoice } from './types.js';
19
+ import { AskQueue } from './ask-queue.js';
20
+ export declare class UiCore {
21
+ private readonly backendsGetter;
22
+ private readonly askQueue;
23
+ /** 审批 always 的策略表回写注入(07 §4.3 提问队列条款——装配接线) */
24
+ private readonly onApprovalAlways;
25
+ /** widget 会话级单槽(07 §4.3——per-session 恰一槽,后写胜前写) */
26
+ private readonly widgets;
27
+ constructor(backendsGetter: () => readonly UiBackend<never>[], askQueue: AskQueue, onApprovalAlways?: (entry: string) => void);
28
+ private backends;
29
+ /** 能力过滤:声明且实现俱在才 capable(防后端声明能力而缺实现——防御位) */
30
+ private capable;
31
+ /** 一次性通知:扇出全部后端(level 档识别与 info 归一归后端呈现侧) */
32
+ notify(message: string, opts?: {
33
+ level?: NotifyLevel;
34
+ }): void;
35
+ /** 状态行更新:扇出 capable 后端(last-writer-wins 天然);零 capable no-op */
36
+ setStatus(sessionId: string, status: string): void;
37
+ /** widget 单槽:后写胜前写、置 null 清空;扇出 capable 后端 */
38
+ setWidget(sessionId: string, node: unknown | null): void;
39
+ /** 当前槽值(repaint 载荷消费——焦点切换重画带上该会话槽) */
40
+ widgetOf(sessionId: string): {
41
+ node: unknown;
42
+ } | null;
43
+ /** 观众探针:任一后端自报有观众(TUI 恒真 / webui 在线连接数 > 0 / 零后端即假) */
44
+ hasAudience(): boolean;
45
+ /** 是/否确认(降级链:confirm 后端 → input 后端〔(y/n) 形〕→ notify 化 + 保守值 false) */
46
+ confirm(sessionId: string, message: string, opts?: UiAskOptions): Promise<boolean>;
47
+ /** 单选(降级链:select 后端 → input 后端〔编号列表形〕→ notify 化 + 保守值 '') */
48
+ select(sessionId: string, message: string, choices: readonly UiSelectChoice[], opts?: UiAskOptions): Promise<string>;
49
+ /** 自由文本输入(降级链:input 后端 → notify 化 + 保守值 '') */
50
+ input(sessionId: string, message: string, opts?: UiInputOptions): Promise<string>;
51
+ /**
52
+ * 审批 ask(07 §4.3 提问队列条款——与阻塞三件同队同收口律):
53
+ * 多后端竞速先答先得(跨入口单漏斗——decide durable 单漏斗在
54
+ * ApprovalService 不变);收口两语义分立(对齐 04 §9 run 信号透传
55
+ * ask 链)——会话关闭 / run 打断 → `'cancel'`(用户主动终止);降级
56
+ * 到底(全部后端无 approval capability)→ `'unavailable'`(呈现面
57
+ * 结构性无人可答——ApprovalService 侧落 timeout 源;2026-09-13 真模型
58
+ * 实测批修,修前误答 'cancel' 错标用户主动取消);`always` + 草案 →
59
+ * onApprovalAlways 回写;无草案 always 防御收口视同 approve(零草案
60
+ * 零副作用)。
61
+ */
62
+ askApproval(sessionId: string, request: ApprovalAskRequest, opts?: UiAskOptions): Promise<ApprovalAskAnswer>;
63
+ /** always 收口路:带草案回写策略表注入面;无草案防御视同 approve */
64
+ private settleApprovalAlways;
65
+ /**
66
+ * 会话收口(通道侧——unregisterSession 联动):清提问队列(余项保守值)+
67
+ * 清 widget 槽。后端各自的会话呈现清理由其后端自身负责(onEnvelope 流断)。
68
+ */
69
+ closeSession(sessionId: string): void;
70
+ /** 提问队列观察面(透传——诊断面/测试消费) */
71
+ pending(sessionId: string): readonly AskKind[];
72
+ /**
73
+ * ask 统一编排:入队 → 队首呈现(多后端竞速先答先得)→ 落定出队。
74
+ * 入口先收副屏(07 §4.1 件 8 条款:注意力优先级 ask > 回看——ask 到来时
75
+ * 在场副屏先收起再入提问队列;能力缺席〔无副屏后端〕零义务跳过)。
76
+ * 三条收口路(全部 once):首答(含降级解析值)/ 呈现异常(保守值——
77
+ * fail-closed)/ 外部 signal abort 或队列取消(保守值)。
78
+ */
79
+ private ask;
80
+ }
@@ -0,0 +1,210 @@
1
+ /**
2
+ * ui 原语分发核(07 §4.3 签名定稿的通道无关编排面——2026-09-06 channels 纵切批)。
3
+ *
4
+ * 职责三块:①降级判定——通道不支持的原语按「notify 化」降级
5
+ * (select→input→notify、confirm→input→notify——插件不感知通道能力差异);
6
+ * ②阻塞原语编排——入提问队列(与审批 ask 同队列)+ 多后端并发竞速
7
+ * (04 §9 跨入口先答先得,败腿经 signal 撤销);③widget 会话级单槽
8
+ * (后写胜前写、置 null 清空——07 §4.3 setWidget 多写者语义)。
9
+ *
10
+ * 撤销面(07 §4.3):外部 signal abort 或队列收口 → 保守值收场
11
+ * (confirm→false / select·input→'')——曾在屏者的撤销说明行归后端
12
+ * signal 消费实现,核只负责 abort 传播与结算。
13
+ *
14
+ * 核级 API 一律显式 sessionId(多会话归属的机器位);ctx.ui 薄包装绑
15
+ * 「当前会话」归 host 装配批。后端移除(removeBackend)时在飞问询的收口
16
+ * 是后端自身义务(移除前 settle 或经 signal abort)——装配级事件,核不代管。
17
+ */
18
+ import { AskQueue } from './ask-queue.js';
19
+ export class UiCore {
20
+ backendsGetter;
21
+ askQueue;
22
+ /** 审批 always 的策略表回写注入(07 §4.3 提问队列条款——装配接线) */
23
+ onApprovalAlways;
24
+ /** widget 会话级单槽(07 §4.3——per-session 恰一槽,后写胜前写) */
25
+ widgets = new Map();
26
+ constructor(backendsGetter, askQueue, onApprovalAlways) {
27
+ this.backendsGetter = backendsGetter;
28
+ this.askQueue = askQueue;
29
+ this.onApprovalAlways = onApprovalAlways;
30
+ }
31
+ backends() {
32
+ return this.backendsGetter();
33
+ }
34
+ /** 能力过滤:声明且实现俱在才 capable(防后端声明能力而缺实现——防御位) */
35
+ capable(cap) {
36
+ // 能力键与方法名同名惯例的唯一例外:approval 位的方法面叫 askApproval
37
+ //(与服务面同名——UiBackend 上 confirm/select/input 三件方法名即能力名)
38
+ const method = cap === 'approval' ? 'askApproval' : cap;
39
+ return this.backends().filter((b) => b.capabilities[cap] === true && typeof b[method] === 'function');
40
+ }
41
+ // ---- 非阻塞三件(纯活体层——07 §4.3 语义纪律:不落日志不入队) ----
42
+ /** 一次性通知:扇出全部后端(level 档识别与 info 归一归后端呈现侧) */
43
+ notify(message, opts) {
44
+ for (const b of this.backends()) {
45
+ if (b.capabilities.notify)
46
+ b.notify(message, opts);
47
+ }
48
+ }
49
+ /** 状态行更新:扇出 capable 后端(last-writer-wins 天然);零 capable no-op */
50
+ setStatus(sessionId, status) {
51
+ for (const b of this.capable('setStatus'))
52
+ b.setStatus?.(sessionId, status);
53
+ }
54
+ /** widget 单槽:后写胜前写、置 null 清空;扇出 capable 后端 */
55
+ setWidget(sessionId, node) {
56
+ if (node === null) {
57
+ this.widgets.delete(sessionId);
58
+ }
59
+ else {
60
+ this.widgets.set(sessionId, { node });
61
+ }
62
+ for (const b of this.capable('setWidget'))
63
+ b.setWidget?.(sessionId, node);
64
+ }
65
+ /** 当前槽值(repaint 载荷消费——焦点切换重画带上该会话槽) */
66
+ widgetOf(sessionId) {
67
+ return this.widgets.get(sessionId) ?? null;
68
+ }
69
+ /** 观众探针:任一后端自报有观众(TUI 恒真 / webui 在线连接数 > 0 / 零后端即假) */
70
+ hasAudience() {
71
+ return this.backends().some((b) => b.hasAudience());
72
+ }
73
+ // ---- 阻塞三件(入提问队列——与审批 ask 同队列 per-session FIFO) ----
74
+ /** 是/否确认(降级链:confirm 后端 → input 后端〔(y/n) 形〕→ notify 化 + 保守值 false) */
75
+ confirm(sessionId, message, opts) {
76
+ return this.ask(sessionId, 'confirm', opts?.signal, () => false, (signal) => {
77
+ const direct = this.capable('confirm');
78
+ if (direct.length > 0) {
79
+ return Promise.race(direct.map((b) => b.confirm(message, { signal })));
80
+ }
81
+ const viaInput = this.capable('input');
82
+ if (viaInput.length > 0) {
83
+ // confirm→input 降级(07 §4.3 降级路径同链透传):(y/n) 形、答 y/yes 为真
84
+ const prompt = `${message} (y/n)`;
85
+ return Promise.race(viaInput.map((b) => b.input(prompt, { signal }))).then((answer) => /^y(es)?$/i.test(answer.trim()));
86
+ }
87
+ // notify 化到底:呈现问句后保守值收场(无人可答——fail-closed)
88
+ this.notify(message);
89
+ return Promise.resolve(false);
90
+ });
91
+ }
92
+ /** 单选(降级链:select 后端 → input 后端〔编号列表形〕→ notify 化 + 保守值 '') */
93
+ select(sessionId, message, choices, opts) {
94
+ return this.ask(sessionId, 'select', opts?.signal, () => '', (signal) => {
95
+ const direct = this.capable('select');
96
+ if (direct.length > 0) {
97
+ return Promise.race(direct.map((b) => b.select(message, choices, { signal }))).then((answer) => validateChoice(answer, choices));
98
+ }
99
+ const viaInput = this.capable('input');
100
+ if (viaInput.length > 0) {
101
+ // select→input 降级(Web 通道维持同款——07 §4.3):编号列表提示、手输 value
102
+ const prompt = `${message}\n${choices.map((c, i) => `${i + 1}. ${c.label} → ${c.value}`).join('\n')}`;
103
+ return Promise.race(viaInput.map((b) => b.input(prompt, { signal }))).then((answer) => validateChoice(answer, choices));
104
+ }
105
+ this.notify(`${message}\n${choices.map((c) => `- ${c.label} → ${c.value}`).join('\n')}`);
106
+ return Promise.resolve('');
107
+ });
108
+ }
109
+ /** 自由文本输入(降级链:input 后端 → notify 化 + 保守值 '') */
110
+ input(sessionId, message, opts) {
111
+ return this.ask(sessionId, 'input', opts?.signal, () => '', (signal) => {
112
+ const viaInput = this.capable('input');
113
+ if (viaInput.length > 0) {
114
+ return Promise.race(viaInput.map((b) => b.input(message, { placeholder: opts?.placeholder, signal })));
115
+ }
116
+ this.notify(message);
117
+ return Promise.resolve('');
118
+ });
119
+ }
120
+ /**
121
+ * 审批 ask(07 §4.3 提问队列条款——与阻塞三件同队同收口律):
122
+ * 多后端竞速先答先得(跨入口单漏斗——decide durable 单漏斗在
123
+ * ApprovalService 不变);收口两语义分立(对齐 04 §9 run 信号透传
124
+ * ask 链)——会话关闭 / run 打断 → `'cancel'`(用户主动终止);降级
125
+ * 到底(全部后端无 approval capability)→ `'unavailable'`(呈现面
126
+ * 结构性无人可答——ApprovalService 侧落 timeout 源;2026-09-13 真模型
127
+ * 实测批修,修前误答 'cancel' 错标用户主动取消);`always` + 草案 →
128
+ * onApprovalAlways 回写;无草案 always 防御收口视同 approve(零草案
129
+ * 零副作用)。
130
+ */
131
+ askApproval(sessionId, request, opts) {
132
+ return this.ask(sessionId, 'approval', opts?.signal, () => 'cancel', (signal) => {
133
+ const direct = this.capable('approval');
134
+ if (direct.length > 0) {
135
+ return Promise.race(direct.map((b) => b.askApproval(sessionId, request, { signal }))).then((answer) => this.settleApprovalAlways(answer, request));
136
+ }
137
+ // notify 化到底:呈现摘要后自报结构性无人(fail-closed——04 §9 无应答
138
+ // 者语义,ApprovalService 落 unavailable/timeout;与打断路保守值 'cancel'
139
+ // 分立——修前误答 'cancel' 致 decided 错标 cancel/user 双失真)
140
+ this.notify(request.summary);
141
+ return Promise.resolve('unavailable');
142
+ });
143
+ }
144
+ /** always 收口路:带草案回写策略表注入面;无草案防御视同 approve */
145
+ settleApprovalAlways(answer, request) {
146
+ if (answer !== 'always')
147
+ return answer;
148
+ if (request.suggestedEntry === undefined)
149
+ return 'approve'; // 零草案零副作用(04 §9 ③)
150
+ this.onApprovalAlways?.(request.suggestedEntry);
151
+ return 'always';
152
+ }
153
+ // ---- 收口 ----
154
+ /**
155
+ * 会话收口(通道侧——unregisterSession 联动):清提问队列(余项保守值)+
156
+ * 清 widget 槽。后端各自的会话呈现清理由其后端自身负责(onEnvelope 流断)。
157
+ */
158
+ closeSession(sessionId) {
159
+ this.askQueue.clearSession(sessionId);
160
+ this.widgets.delete(sessionId);
161
+ }
162
+ /** 提问队列观察面(透传——诊断面/测试消费) */
163
+ pending(sessionId) {
164
+ return this.askQueue.pending(sessionId);
165
+ }
166
+ // ---- 编舞内核 ----
167
+ /**
168
+ * ask 统一编排:入队 → 队首呈现(多后端竞速先答先得)→ 落定出队。
169
+ * 入口先收副屏(07 §4.1 件 8 条款:注意力优先级 ask > 回看——ask 到来时
170
+ * 在场副屏先收起再入提问队列;能力缺席〔无副屏后端〕零义务跳过)。
171
+ * 三条收口路(全部 once):首答(含降级解析值)/ 呈现异常(保守值——
172
+ * fail-closed)/ 外部 signal abort 或队列取消(保守值)。
173
+ */
174
+ ask(sessionId, kind, externalSignal, conservative, present) {
175
+ // ask 强制收起(件 8 条款——批 10f-4):扇出可选钩,先于入队
176
+ for (const b of this.backends())
177
+ b.collapseAltScreen?.();
178
+ let resolve;
179
+ const promise = new Promise((r) => {
180
+ resolve = r;
181
+ });
182
+ let done = false;
183
+ // 内部 signal:败腿撤销 + 队列收口的统一传播位(后端只认这一个信号源——
184
+ // 外部 signal 经本核折入 finish,不直传后端)
185
+ const controller = new AbortController();
186
+ const finish = (value) => {
187
+ if (done)
188
+ return;
189
+ done = true;
190
+ controller.abort(); // 败腿撤销传播(已落定后端再收 abort 是无害 no-op)
191
+ resolve(value);
192
+ this.askQueue.settled(sessionId);
193
+ };
194
+ const externalAbort = () => finish(conservative());
195
+ externalSignal?.addEventListener('abort', externalAbort, { once: true });
196
+ this.askQueue.enqueue(sessionId, kind, {
197
+ start: () => {
198
+ present(controller.signal).then(finish, () => finish(conservative()));
199
+ },
200
+ cancel: () => finish(conservative()),
201
+ });
202
+ return promise;
203
+ }
204
+ }
205
+ /** select 降级答案校验:手输不在 value 集即保守值 ''(fail-closed——不猜最近匹配) */
206
+ function validateChoice(answer, choices) {
207
+ const trimmed = answer.trim();
208
+ return choices.some((c) => c.value === trimmed) ? trimmed : '';
209
+ }
210
+ //# sourceMappingURL=ui-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-core.js","sourceRoot":"","sources":["../../../../../src/channels/ui-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ /**
2
+ * context 模块错误码注册(02 §5.3 #2:各模块落码批经 registerErrorCodes 显式注册,
3
+ * 禁字符串字面量散落)。
4
+ *
5
+ * 域码族注记:EVENT_* / SCOPE_* 系 04 §6 定名的域语义命名(事件面/作用域面),
6
+ * 视同 CONTEXT_ 域族成员(02 §5.3 前缀族注记,2026-09-05 落码批)。
7
+ */
8
+ import { registerErrorCodes } from '../contracts/index.js';
9
+ registerErrorCodes([
10
+ {
11
+ code: 'EVENT_NOT_REGISTERED',
12
+ module: 'context',
13
+ description: 'ctx.emit/on 未注册词 fail-loud(词汇注册表单源——禁散播未声明事件名)',
14
+ },
15
+ {
16
+ code: 'EVENT_DUPLICATE',
17
+ module: 'context',
18
+ description: '事件词汇撞名拒静默覆盖(注册表单源执法)',
19
+ },
20
+ {
21
+ code: 'SCOPE_STALE',
22
+ module: 'context',
23
+ description: '作用域已回卷后的迟到操作(迟到的服务注册/disposer 登记拒绝——异步竞速收口)',
24
+ },
25
+ {
26
+ code: 'SCOPE_EFFECT_CAPACITY',
27
+ module: 'context',
28
+ description: 'effect 总注册帽:本作用域自有登记达 10^4 拒新登记(03 §3.4 可用性防线——失控登记不拖垮回卷序;拒在 register 回调执行前)',
29
+ },
30
+ {
31
+ code: 'CONTEXT_SERVICE_MISSING',
32
+ module: 'context',
33
+ description: 'get 缺席 fail-loud(拼错名立即炸,不静默 undefined 传播;可选消费走 tryGet)',
34
+ },
35
+ {
36
+ code: 'CONTEXT_SERVICE_DUPLICATE',
37
+ module: 'context',
38
+ description: '同作用域 provide 撞名拒(两方抢一名即装配 bug;fork 子遮蔽父合法)',
39
+ },
40
+ ]);
41
+ //# sourceMappingURL=codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../../../../src/context/codes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,kBAAkB,CAAC;IACjB;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,gDAAgD;KAC9D;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,sBAAsB;KACpC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,6CAA6C;KAC3D;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,SAAS;QACjB,WAAW,EACT,8EAA8E;KACjF;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,wDAAwD;KACtE;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,4CAA4C;KAC1D;CACF,CAAC,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * emit / serial / parallel 的监听器形态(通知型——返回值不被广播语义消费)。
3
+ * 返回面 unknown 而非 void:unknown 是 top type 吸收一切同步/异步返回
4
+ * (parallel 复用本面收口时恰需读返回值;void 的「调用方不读」语义反而失真)。
5
+ */
6
+ export type NotifyListener<T> = (data: T) => unknown;
7
+ /** waterfall 的监听器形态:必须调 next 委托(不调即短路) */
8
+ export type WaterfallListener<T> = (value: T, next: (value: T) => Promise<T>) => Promise<T> | T;
9
+ /** 监听器异常上报面(emit/serial 的隔离腿去向;host 装配时接 logger) */
10
+ export type ListenerErrorReporter = (eventName: string, err: unknown) => void;
11
+ /**
12
+ * 事件分派器:词汇注册表 + 四模式派发。一个 ctx 一枚(装载运行时的通信契约
13
+ * 单源——双实现 = 通信割裂)。
14
+ */
15
+ export declare class EventDispatch {
16
+ /** 词汇注册表(name → 已注册标记;单源执法面) */
17
+ private readonly registered;
18
+ /** 监听器表(name → 注册序监听器列表;on 返回退订闭包;泛型在存储侧擦除为 unknown、取回侧 cast 还原) */
19
+ private readonly listeners;
20
+ /** serial 排队尾(per-name 链式 promise——排队串行) */
21
+ private readonly serialQueues;
22
+ /** 隔离腿异常上报(缺省 stderr 直写;装配根接 logger) */
23
+ private readonly onListenerError;
24
+ constructor(options?: {
25
+ onListenerError?: ListenerErrorReporter;
26
+ });
27
+ /** 注册事件词汇(装载期声明面);撞名拒 EVENT_DUPLICATE(禁静默覆盖) */
28
+ registerEventNames(names: readonly string[]): void;
29
+ /** 判别词汇是否已注册(装配断言/诊断面) */
30
+ isRegistered(name: string): boolean;
31
+ /**
32
+ * 挂通知型监听器(emit/serial 共用监听面——同词两模式收同一监听器形态)。
33
+ * 词未注册拒 EVENT_NOT_REGISTERED(fail-loud 禁散播未声明事件名)。
34
+ * @returns 退订闭包(消费方经 scope.effect 组合生命周期)
35
+ */
36
+ on(name: string, listener: NotifyListener<unknown>): () => void;
37
+ /**
38
+ * 广播:全部监听器并发各跑各,异常互相隔离(单腿炸不波及他腿与调用方——
39
+ * 上报 onListenerError 后照常收口)。
40
+ */
41
+ emit(name: string, data?: unknown): Promise<void>;
42
+ /**
43
+ * 串行管线:监听器必须调 next(value) 委托——不调即短路(管线后段不再执行,
44
+ * 返回值为该监听器的产出);异常沿链传播(管线失败语义——守门行依赖)。
45
+ */
46
+ waterfall<T>(name: string, value: T): Promise<T>;
47
+ /** 挂管线监听器(waterfall 专用面——与 on 分开:形态不同防误用) */
48
+ onWaterfall<T>(name: string, listener: WaterfallListener<T>): () => void;
49
+ /**
50
+ * 全体并发,Promise.all 收口(异常传播——与 emit 的区别即异常语义)。
51
+ * 监听器面与 on 共用(通知型返回值参与收口)。
52
+ */
53
+ parallel<T, R>(name: string, data: T): Promise<R[]>;
54
+ /**
55
+ * 排队串行:逐监听器顺序执行(后段等前段完成);不短路——异常隔离上报后
56
+ * 继续下一段(与 waterfall 的区别 = 无委托链、异常不停段)。
57
+ * 同词多次派发按到达序排队(per-name 链式 promise)。
58
+ */
59
+ serial(name: string, data?: unknown): Promise<void>;
60
+ /** 未注册词执法(emit/on/waterfall/parallel/serial 共用) */
61
+ private assertRegistered;
62
+ }