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,278 @@
1
+ /**
2
+ * L0 contracts — LLM 边界消息基础件(04 篇 §3 StreamFn 契约 + §5 模型层)。
3
+ *
4
+ * 承 berry 同款关键决策:agent loop 不 import llm(02 篇 §4.2 关键不依赖第
5
+ * 一条),StreamFn 签名与消息形状收进 contracts——pi-ai 产生的消息值可原样
6
+ * 赋给这里的类型(标准三角色零转换直通)。
7
+ *
8
+ * 兼容策略:字段取 pi-ai 0.84.4 对应接口的**超集兼容子集**——本文件要求的
9
+ * 必填字段在 pi-ai 中全部存在且同名同型;pi-ai 独有的字段(api/responseModel/
10
+ * deferred 等)不在此收口,多出的字段对结构化赋值透明。
11
+ */
12
+ /** 文本块(user/assistant/toolResult 通用) */
13
+ export interface TextContent {
14
+ type: 'text';
15
+ text: string;
16
+ /** 供应商侧文本签名(回放用;透传) */
17
+ textSignature?: string;
18
+ }
19
+ /** 思考块(仅 assistant;供应商推理内容回放) */
20
+ export interface ThinkingContent {
21
+ type: 'thinking';
22
+ thinking: string;
23
+ /** 供应商不透明签名(推理上下文复用;透传) */
24
+ thinkingSignature?: string;
25
+ /** 安全过滤已遮蔽的思考(加密载荷存 thinkingSignature 透传回 API) */
26
+ redacted?: boolean;
27
+ }
28
+ /** 图片块(多模态附件;base64 数据) */
29
+ export interface ImageContent {
30
+ type: 'image';
31
+ data: string;
32
+ mimeType: string;
33
+ }
34
+ /** 工具调用块(仅 assistant 内联;arguments 已是解析后的对象) */
35
+ export interface ToolCallBlock {
36
+ type: 'toolCall';
37
+ id: string;
38
+ name: string;
39
+ arguments: Record<string, unknown>;
40
+ }
41
+ /**
42
+ * 一次 LLM 调用的 token 用量(pi-ai 同构):cacheRead/cacheWrite 独立拆桶,
43
+ * cacheWrite1h(仅 Anthropic 上报拆分)与 reasoning(已含于 output,供应商
44
+ * 不报则缺省)为可选子集。
45
+ */
46
+ export interface Usage {
47
+ input: number;
48
+ output: number;
49
+ cacheRead: number;
50
+ cacheWrite: number;
51
+ /** cacheWrite 中 1h 保留的子集(仅 Anthropic 上报拆分) */
52
+ cacheWrite1h?: number;
53
+ /** 推理 token 子集(已含于 output;供应商不报则缺省) */
54
+ reasoning?: number;
55
+ totalTokens: number;
56
+ /** 费用(供应商可解析时填充) */
57
+ cost?: {
58
+ total: number;
59
+ input?: number;
60
+ output?: number;
61
+ currency?: string;
62
+ };
63
+ }
64
+ /**
65
+ * 计量四桶形(05 篇 §1.1 llm/usage 事件载荷 usage 字段形):input/output/
66
+ * cacheRead/cacheWrite 四桶必落(供应商恒报),cacheWrite1h/reasoning 上报才落;
67
+ * totalTokens(派生)与 cost(折算)**不入账**——token 原始值入账、货币折算
68
+ * 在投影查询做(价格表更新不回改历史)。
69
+ */
70
+ export interface UsageBuckets {
71
+ input: number;
72
+ output: number;
73
+ cacheRead: number;
74
+ cacheWrite: number;
75
+ /** cacheWrite 中 1h 保留的子集(仅 Anthropic 上报拆分;上报才落) */
76
+ cacheWrite1h?: number;
77
+ /** 推理 token 子集(已含于 output;上报才落) */
78
+ reasoning?: number;
79
+ }
80
+ /**
81
+ * LLM 调用终态(pi-ai 同构七值)。
82
+ * loop 只消费 error/aborted(终态短路)与 length(截断防御);
83
+ * deferred 是 pi-ai 原生延迟工具装载透传值,v1 不产生但词汇保留。
84
+ */
85
+ export type StopReason = 'pending' | 'stop' | 'length' | 'toolUse' | 'error' | 'aborted' | 'deferred';
86
+ /**
87
+ * 错误四桶(04 §3.5 表)。词汇归 contracts 单源(批 11b 契约先行):唯一实现
88
+ * 在 llm(classifyError 纯函数表),conversation(runTurns 重试循环与溢出
89
+ * 兜底)经装配注入消费同形——两侧零词汇漂移(04 §3.5 消费通路条款)。
90
+ * transient/non-retryable/quota 是消费动作桶(每桶一个动作无歧义态),
91
+ * overflow 只分类不消费(动作挂溢出兜底纵切 04 §3.4)。
92
+ */
93
+ export type ErrorBucket = 'transient' | 'non-retryable' | 'quota' | 'overflow';
94
+ /**
95
+ * 用户消息(content 允许纯文本或图文块数组)。
96
+ * source 归因复用会话事件词汇闭集 EventSource(05 §3.1 单源——durable 落账
97
+ * 与 LLM 边界同一名;pi-ai UserMessage 不带此字段,多出字段对直通透明)。
98
+ */
99
+ export interface UserMessage {
100
+ role: 'user';
101
+ content: string | (TextContent | ImageContent)[];
102
+ /** Unix 毫秒时间戳 */
103
+ timestamp: number;
104
+ /** 输入归因(缺省视为 'user';投影带出、durable 原样落账) */
105
+ source?: import('./types.js').EventSource;
106
+ /**
107
+ * 幂等去重键(05 §1.1 user/message 行:调用方自选、可选字段——serve 面
108
+ * 幂等 admit 语义真源 05 §3.5;UI 侧不带零影响)。子代理审批挂起通知等
109
+ * 「恰一条」机器注入以本键承载去重判据(04 §10)。
110
+ */
111
+ dedupeKey?: string;
112
+ }
113
+ /** 助手消息(流式组装终值;stopReason=error/aborted 时错误即数据,见 AssistantStream) */
114
+ export interface AssistantMessage {
115
+ role: 'assistant';
116
+ content: (TextContent | ThinkingContent | ToolCallBlock)[];
117
+ usage: Usage;
118
+ stopReason: StopReason;
119
+ /** Unix 毫秒时间戳 */
120
+ timestamp: number;
121
+ /** 模型标识(provider 内模型 id;llm 模块解析) */
122
+ model?: string;
123
+ /** 供应商标识 */
124
+ provider?: string;
125
+ /** stopReason=error/aborted 时的错误说明(错误是数据契约之一) */
126
+ errorMessage?: string;
127
+ /**
128
+ * 错误码(04 §3.5 判定序的机器判定位):宿主合成错误携带 LLM_ 码(如
129
+ * LLM_INFLIGHT_LIMIT 帽拒绝);provider 真错误码归一挂 provider 钩子纵切。
130
+ * classifyError 判定时在场码优先、文案正则兜底。
131
+ */
132
+ errorCode?: string;
133
+ /** 脱敏诊断(恢复与审计用) */
134
+ diagnostics?: unknown[];
135
+ }
136
+ /** 工具结果消息(与 assistant 内 toolCall 按 toolCallId 配对) */
137
+ export interface ToolResultMessage {
138
+ role: 'toolResult';
139
+ toolCallId: string;
140
+ toolName: string;
141
+ content: (TextContent | ImageContent)[];
142
+ isError: boolean;
143
+ /** Unix 毫秒时间戳 */
144
+ timestamp: number;
145
+ /** 供日志/UI 的结构化明细(不进主上下文计费) */
146
+ details?: unknown;
147
+ /** 工具执行自身的用量(若可得上报;不进主上下文计费) */
148
+ usage?: Usage;
149
+ /** 本次结果后新可用的工具名(延迟装载透传) */
150
+ addedToolNames?: string[];
151
+ }
152
+ /** LLM 边界标准三角色(convertToLlm 透传的标准半边) */
153
+ export type Message = UserMessage | AssistantMessage | ToolResultMessage;
154
+ /** LLM 工具描述(parameters 为 JSON Schema——typebox 产物即此形状) */
155
+ export interface LlmTool {
156
+ name: string;
157
+ description: string;
158
+ /** JSON Schema 参数描述(typebox 产物或等价 JSON Schema 对象;宽收 object 兼容构建器类型) */
159
+ parameters: object;
160
+ }
161
+ /** 单次 LLM 请求上下文(StreamFn 第一参数;04 §3.1) */
162
+ export interface LlmContext {
163
+ systemPrompt?: string;
164
+ messages: Message[];
165
+ tools?: LlmTool[];
166
+ }
167
+ /**
168
+ * 模型目录只读投影(listModels()/getModel() 返回形):pi-ai Model 的应用友好
169
+ * 子集——枚举/展示/能力判别所需字段直通,传输与 provider 配置面(baseUrl/
170
+ * headers/samplingParams/compat)不披露(宿主数据只经服务面,03 篇 §3.2
171
+ * 「防双实例」纪律的读侧配套)。
172
+ */
173
+ export interface ModelInfo {
174
+ /** 模型标识("provider/model-id" 全形——resolveModel 可解析的同一名) */
175
+ readonly id: string;
176
+ /** 展示名(人类可读) */
177
+ readonly name: string;
178
+ /** 所属 provider id(目录分组用) */
179
+ readonly provider: string;
180
+ /** 是否推理模型(思考档位面可用性判据) */
181
+ readonly reasoning: boolean;
182
+ /** 输入模态清单 */
183
+ readonly input: readonly ('text' | 'image')[];
184
+ /** 上下文窗口(tokens) */
185
+ readonly contextWindow: number;
186
+ /** 单请求输出上限(tokens) */
187
+ readonly maxTokens: number;
188
+ }
189
+ /** 思考档位(pi-ai 同构七值;xhigh/max 仅部分模型家族支持——会话态非 run 态,04 §5) */
190
+ export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
191
+ /** StreamFn 每次调用的选项(model 为模型 id 字符串——解析归 llm 模块,loop 不持模型对象) */
192
+ export interface StreamFnOptions {
193
+ /** 模型 id(llm 模块解析为具体 provider/model;可逐轮替换) */
194
+ model: string;
195
+ thinkingLevel?: ThinkingLevel;
196
+ /** 凭证(缺省 undefined 由 llm 层走持久化凭证链) */
197
+ apiKey?: string;
198
+ }
199
+ /**
200
+ * 模型层注入签名(llm 模块整体替换位——agent 与 llm 两模块的唯一会合点,故落在
201
+ * contracts)。契约:**永不抛错**(04 §3)——一切失败编码为返回流的 error 终止
202
+ * 事件 + 最终消息 stopReason='error'|'aborted' + errorMessage(AssistantStream
203
+ * 契约注释)。这是 loop 零 try/catch 的契约根基:错误是数据不是异常。
204
+ */
205
+ export type StreamFn = (context: LlmContext, options: StreamFnOptions, signal?: AbortSignal) => AssistantStream | Promise<AssistantStream>;
206
+ /**
207
+ * 流式事件(pi-ai AssistantMessageEvent 同构 12 型)。
208
+ * 协议:正常形 `start` 先行 → 各内容块 start/delta/end 交错(partial 携带累计
209
+ * 快照)→ 以 `done`(成功)或 `error`(stopReason=error/aborted)收尾。
210
+ * **error 可无 start 前导**(04 §3 2026-09-14 定形):provider 前置失败形
211
+ * (请求创建失败)只发单个 `error` 即收尾——「start 先行」非流的隐含序约束,
212
+ * 消费面终值落位须判占位在场(未见 start 走 append,不尾替换)。
213
+ */
214
+ export type AssistantStreamEvent = {
215
+ type: 'start';
216
+ partial: AssistantMessage;
217
+ } | {
218
+ type: 'text_start';
219
+ contentIndex: number;
220
+ partial: AssistantMessage;
221
+ } | {
222
+ type: 'text_delta';
223
+ contentIndex: number;
224
+ delta: string;
225
+ partial: AssistantMessage;
226
+ } | {
227
+ type: 'text_end';
228
+ contentIndex: number;
229
+ content: string;
230
+ partial: AssistantMessage;
231
+ } | {
232
+ type: 'thinking_start';
233
+ contentIndex: number;
234
+ partial: AssistantMessage;
235
+ } | {
236
+ type: 'thinking_delta';
237
+ contentIndex: number;
238
+ delta: string;
239
+ partial: AssistantMessage;
240
+ } | {
241
+ type: 'thinking_end';
242
+ contentIndex: number;
243
+ partial: AssistantMessage;
244
+ } | {
245
+ type: 'toolcall_start';
246
+ contentIndex: number;
247
+ partial: AssistantMessage;
248
+ } | {
249
+ type: 'toolcall_delta';
250
+ contentIndex: number;
251
+ delta: string;
252
+ partial: AssistantMessage;
253
+ } | {
254
+ type: 'toolcall_end';
255
+ contentIndex: number;
256
+ toolCall: ToolCallBlock;
257
+ partial: AssistantMessage;
258
+ } | {
259
+ type: 'done';
260
+ reason: Extract<StopReason, 'stop' | 'length' | 'toolUse' | 'deferred'>;
261
+ message: AssistantMessage;
262
+ } | {
263
+ type: 'error';
264
+ reason: Extract<StopReason, 'aborted' | 'error'>;
265
+ error: AssistantMessage;
266
+ };
267
+ /**
268
+ * 流式响应:异步迭代事件 + 最终消息取值口。
269
+ * 契约(04 §3「永不抛」,loop 零 try/catch 的根基):**永不抛错**——一切失败
270
+ * 编码为流内 `error` 终止事件 + 最终 AssistantMessage 的 stopReason='error'|
271
+ * 'aborted' + errorMessage。错误是数据不是异常(金样回放轨的替换点 seam)。
272
+ */
273
+ export interface AssistantStream {
274
+ /** 迭代流事件(以 done/error 收尾后结束) */
275
+ [Symbol.asyncIterator](): AsyncIterator<AssistantStreamEvent>;
276
+ /** 取最终 AssistantMessage(流耗尽后 resolve;失败编码在 stopReason/errorMessage 上) */
277
+ result(): Promise<AssistantMessage>;
278
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * L0 contracts — LLM 边界消息基础件(04 篇 §3 StreamFn 契约 + §5 模型层)。
3
+ *
4
+ * 承 berry 同款关键决策:agent loop 不 import llm(02 篇 §4.2 关键不依赖第
5
+ * 一条),StreamFn 签名与消息形状收进 contracts——pi-ai 产生的消息值可原样
6
+ * 赋给这里的类型(标准三角色零转换直通)。
7
+ *
8
+ * 兼容策略:字段取 pi-ai 0.84.4 对应接口的**超集兼容子集**——本文件要求的
9
+ * 必填字段在 pi-ai 中全部存在且同名同型;pi-ai 独有的字段(api/responseModel/
10
+ * deferred 等)不在此收口,多出的字段对结构化赋值透明。
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../../../src/contracts/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * L0 contracts — 消息模型与自定义角色注册(04 篇 §2「AgentMessage 与自定义角色」)。
3
+ *
4
+ * 消息模型 = 标准三角色(llm.ts Message)∪ 自定义角色(CustomMessage)。自定义
5
+ * 角色经 registerMessageRole 注册(render/toLlm 双写映射 + hidden 位),域名前缀
6
+ * 两段式强制(`memory/recall` 式——与 03 篇 §2.7 prompt slot 同构的域名纪律)。
7
+ * 宿主不预注册任何自定义角色;conversation 按需注册(04 §2)。
8
+ *
9
+ * 单入口裁决(本仓 vs berry 蓝本差异①):蓝本双入口(registerAppMessageRole /
10
+ * registerHostMessageRole)不采纳——扩展单位既归一为插件,宿主件与插件同走
11
+ * registerMessageRole 单入口、同守域名前缀纪律,无宿主单段自留地。
12
+ */
13
+ import type { Message } from './llm.js';
14
+ /**
15
+ * 标准角色名闭集(convertToLlm 透传的标准半边;自定义角色撞此集任何一名即拒)。
16
+ * 与 llm.ts Message 三角色判别位一一对应。
17
+ */
18
+ export declare const STANDARD_MESSAGE_ROLES: ReadonlySet<string>;
19
+ /** 自定义角色消息(content 载荷形状由角色定义自裁——toLlm 映射的输入) */
20
+ export interface CustomMessage {
21
+ /** 自定义角色名(域名两段式) */
22
+ role: string;
23
+ /** 载荷(角色定义自裁其形状) */
24
+ content: unknown;
25
+ /** Unix 毫秒时间戳 */
26
+ timestamp: number;
27
+ }
28
+ /** 消息模型全集:标准三角色 ∪ 自定义角色(loop 与驱动侧的共同消息面) */
29
+ export type AgentMessage = Message | CustomMessage;
30
+ /** 呈现意图(render 映射的输出半边;hidden = 瞬态注入不进用户可见流) */
31
+ export interface MessageRoleRender {
32
+ /** inline = 进对话流;status = 状态行;hidden = 不可见(模型可见但用户不可见的瞬态注入) */
33
+ intent: 'inline' | 'status' | 'hidden';
34
+ /** 呈现标签(UI 折行显示用) */
35
+ label?: string;
36
+ }
37
+ /** 角色定义:toLlm 映射(进模型上下文的降写)+ render 呈现(用户可见面) */
38
+ export interface MessageRoleDefinition {
39
+ /**
40
+ * 自定义消息 → LLM 消息的转写:返回 Message(降写为标准角色)、Message[]
41
+ * (一拆多)或 null(剥离——瞬态注入本轮用毕即隐)。
42
+ */
43
+ toLlm?: (message: CustomMessage) => Message | Message[] | null;
44
+ /** 呈现映射(缺省无 render = 不可见) */
45
+ render?: MessageRoleRender;
46
+ }
47
+ /**
48
+ * 注册自定义消息角色(ctx.agent.registerMessageRole 的本体——单入口)。
49
+ *
50
+ * 拒绝式两码(03 篇 §2.7 消息面行):撞标准角色名或在册角色 → AGENT_ROLE_EXISTS;
51
+ * 域名前缀两段式违例 → AGENT_ROLE_INVALID。注册失败零记账(无半注册残留)。
52
+ *
53
+ * @param role 角色名(域名两段式,如 `memory/recall`)
54
+ * @param definition 角色定义(toLlm/render 双写映射)
55
+ * @returns disposer——仅当注册表内仍是**本定义**时移除(防误摘后来同名胜出者)
56
+ */
57
+ export declare function registerMessageRole(role: string, definition: MessageRoleDefinition): () => void;
58
+ /** 查询角色定义(标准角色与未注册角色返回 undefined) */
59
+ export declare function getMessageRoleDefinition(role: string): MessageRoleDefinition | undefined;
60
+ /** 在册自定义角色名枚举(诊断/目录面) */
61
+ export declare function listMessageRoleNames(): string[];
62
+ /** 标准消息窄化守卫(正向判窄化——自定义消息判别用 !isStandardMessage) */
63
+ export declare function isStandardMessage(message: AgentMessage): message is Message;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * L0 contracts — 消息模型与自定义角色注册(04 篇 §2「AgentMessage 与自定义角色」)。
3
+ *
4
+ * 消息模型 = 标准三角色(llm.ts Message)∪ 自定义角色(CustomMessage)。自定义
5
+ * 角色经 registerMessageRole 注册(render/toLlm 双写映射 + hidden 位),域名前缀
6
+ * 两段式强制(`memory/recall` 式——与 03 篇 §2.7 prompt slot 同构的域名纪律)。
7
+ * 宿主不预注册任何自定义角色;conversation 按需注册(04 §2)。
8
+ *
9
+ * 单入口裁决(本仓 vs berry 蓝本差异①):蓝本双入口(registerAppMessageRole /
10
+ * registerHostMessageRole)不采纳——扩展单位既归一为插件,宿主件与插件同走
11
+ * registerMessageRole 单入口、同守域名前缀纪律,无宿主单段自留地。
12
+ */
13
+ import { BaseError } from './errors.js';
14
+ /**
15
+ * 标准角色名闭集(convertToLlm 透传的标准半边;自定义角色撞此集任何一名即拒)。
16
+ * 与 llm.ts Message 三角色判别位一一对应。
17
+ */
18
+ export const STANDARD_MESSAGE_ROLES = new Set(['user', 'assistant', 'toolResult']);
19
+ /**
20
+ * 自定义域名前缀两段式判据(03 篇 §2.7 消息面行):恰含一个 `/`、两段均
21
+ * 小写字母数字连字符且段首为字母(`memory/recall` 合法;`Memory/recall`、
22
+ * `memory`、`a/b/c` 均非法)。
23
+ */
24
+ const CUSTOM_ROLE_RE = /^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/;
25
+ /** 角色注册表本体(role → 定义;进程级单表,宿主件与插件共用) */
26
+ const roleRegistry = new Map();
27
+ /**
28
+ * 注册自定义消息角色(ctx.agent.registerMessageRole 的本体——单入口)。
29
+ *
30
+ * 拒绝式两码(03 篇 §2.7 消息面行):撞标准角色名或在册角色 → AGENT_ROLE_EXISTS;
31
+ * 域名前缀两段式违例 → AGENT_ROLE_INVALID。注册失败零记账(无半注册残留)。
32
+ *
33
+ * @param role 角色名(域名两段式,如 `memory/recall`)
34
+ * @param definition 角色定义(toLlm/render 双写映射)
35
+ * @returns disposer——仅当注册表内仍是**本定义**时移除(防误摘后来同名胜出者)
36
+ */
37
+ export function registerMessageRole(role, definition) {
38
+ // 撞名检查前置于格式检查:标准角色名(user 等单段)先撞此闸——「名字已被
39
+ // 占用」比「格式违例」更指向根因(03 §2.7:撞标准角色或在册角色均 AGENT_ROLE_EXISTS)
40
+ if (STANDARD_MESSAGE_ROLES.has(role) || roleRegistry.has(role)) {
41
+ throw new BaseError('AGENT_ROLE_EXISTS', `消息角色 ${role} 已在册(标准角色或在册自定义角色),重影即消息转写分叉`);
42
+ }
43
+ if (!CUSTOM_ROLE_RE.test(role)) {
44
+ throw new BaseError('AGENT_ROLE_INVALID', `角色名 ${JSON.stringify(role)} 违域名前缀两段式纪律(恰含一个 /、两段均小写字母数字连字符,如 memory/recall)`);
45
+ }
46
+ roleRegistry.set(role, definition);
47
+ return () => {
48
+ // 仅当仍是本定义时移除——后来者不可能同名胜出(拒绝式),此守卫防的是
49
+ // disposer 持有过期时序下的误摘(先 dispose 后重注册再 dispose 的序列)
50
+ if (roleRegistry.get(role) === definition)
51
+ roleRegistry.delete(role);
52
+ };
53
+ }
54
+ /** 查询角色定义(标准角色与未注册角色返回 undefined) */
55
+ export function getMessageRoleDefinition(role) {
56
+ return roleRegistry.get(role);
57
+ }
58
+ /** 在册自定义角色名枚举(诊断/目录面) */
59
+ export function listMessageRoleNames() {
60
+ return [...roleRegistry.keys()];
61
+ }
62
+ /** 标准消息窄化守卫(正向判窄化——自定义消息判别用 !isStandardMessage) */
63
+ export function isStandardMessage(message) {
64
+ return STANDARD_MESSAGE_ROLES.has(message.role);
65
+ }
66
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../src/contracts/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;AAExG;;;;GAIG;AACH,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAkC5D,wCAAwC;AACxC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiC,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,UAAiC;IACjF,yCAAyC;IACzC,yDAAyD;IACzD,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAE,QAAQ,IAAI,8BAA8B,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CACjB,oBAAoB,EACpB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kDAAkD,CAC9E,CAAC;IACJ,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACnC,OAAO,GAAG,EAAE;QACV,qCAAqC;QACrC,mDAAmD;QACnD,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,UAAU;YAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC;AACJ,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAAC,OAAqB;IACrD,OAAO,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 出口治理③ 凭据消毒(04 §7 执行段 2026-09-08 落码定形——出口层 redaction
3
+ * 纯函数单源;c-4 泄漏面净化④「server 工具结果回显 env 值」的收口批)。
4
+ *
5
+ * 词汇面与词面单源纪律(env-ref.ts 同先例):放 contracts 使两消费方零新
6
+ * DAG 边——tools 管道链尾(模式 + 值基两腿)与 agent 错误包装位(纯模式
7
+ * 腿——错误即结果 ⑤ 与正常结果同一出口语义)。纯函数零依赖零状态,jiti
8
+ * 可载。
9
+ *
10
+ * 两腿:
11
+ * - **模式腿**(`redactSensitiveText`):闭集正则三段——URL userinfo 剥离 /
12
+ * URL query 敏感参数值剥离 / 敏感键名值脱敏(赋值形覆盖裸 =、:、JSON
13
+ * 引号形与 Authorization 头整行特例)。无外部数据依赖、恒在场。
14
+ * - **值基腿**(`redactKnownSecretValues` + `redactToolResultExit`):装配
15
+ * 注入 credentials 库活值 provider——具名形态外的裸值回显收口;provider
16
+ * 缺席 = 纯模式执法(降级诚实)。
17
+ *
18
+ * 非静默原则(截断注记同律):消毒以 `[REDACTED:<reason>]` 注记进上下文
19
+ * ——模型可见有物被消,非凭空篡改。幂等:注记自身不构成再触发形(回调内
20
+ * 显式判已注记即跳过)。
21
+ */
22
+ import type { AgentToolResult } from './tools.js';
23
+ /**
24
+ * 模式腿:出口文本消毒(04 §7 出口治理③模式集三段——纯函数、幂等、恒在场)。
25
+ *
26
+ * 覆盖面(闭集、大小写不敏感):URL userinfo / URL query 敏感参数值 /
27
+ * 敏感键名赋值值(含 Authorization 头整行特例)。通用赋值形值长 < 4 跳过
28
+ * (散文冒号误伤面控制——"the token: is" 不触发;URL 两段上下文无歧义不设此阈)。
29
+ */
30
+ export declare function redactSensitiveText(text: string): string;
31
+ /**
32
+ * 值基腿:已知秘密活值整段置换(split/join 字面替换——值含正则元字符安全)。
33
+ *
34
+ * 长值先换(前缀包含关系下短值先换会破坏长值锚);长度 < 8 不参与(短值
35
+ * 误伤普通文本的灾难面控制——04 §7 定形⑤)。provider 给值已是明文(装配
36
+ * 侧 credentials 库 live 读——本函数恒不取库,纯数据进出)。
37
+ */
38
+ export declare function redactKnownSecretValues(text: string, values: readonly string[]): string;
39
+ /**
40
+ * 工具结果出口消毒(管道链尾调用——04 §7 定形①:护栏之前一步)。
41
+ *
42
+ * 就地改写:文本 content 逐块消毒(图片等自有界块原样保留——与输出护栏
43
+ * 同判据);details 深走字符串叶消毒(结构化明细同是 server 回显面)。
44
+ * 纯模式 + 值基两腿合流;provider 调用方恒传数组(装配闭包 live 读)。
45
+ */
46
+ export declare function redactToolResultExit(result: AgentToolResult, sensitiveValues: readonly string[]): void;