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,105 @@
1
+ /**
2
+ * agent 件 — PendingMessageQueue 待发队列(04 篇 §4:三通道的暂存与合批机制)。
3
+ *
4
+ * 两轴分立(本仓 vs berry 蓝本差异④——蓝本只有取件单轴):
5
+ * - QueueMode 取件策略轴:one-at-a-time(缺省,一次取一件)/ all(合批——后台
6
+ * 唤醒合批收窄工具面即此);
7
+ * - overflowPolicy 容量溢出策略轴:drop-oldest(缺省,丢弃即回执可见不静默
8
+ * 堆积)/ bounded(排到帽拒新并回执拒收)。
9
+ * 队列是内存态:崩溃即丢——durable 真相只有已进 timeline 的消息(05 篇)。
10
+ */
11
+ import type { AgentMessage } from '../contracts/index.js';
12
+ import type { DeliverChannel } from './events.js';
13
+ /** 取件策略轴(04 §4:一次取一件为缺省,合批多件是显式策略) */
14
+ export type QueueMode = 'one-at-a-time' | 'all';
15
+ /** 容量溢出策略轴(04 §4 定值:capacity 缺省 100、缺省策略 drop-oldest) */
16
+ export type OverflowPolicy = 'drop-oldest' | 'bounded';
17
+ /** 队列条目(消息 + 通道判定结果 + 入列时间戳——回执与诊断面用) */
18
+ export interface PendingItem {
19
+ message: AgentMessage;
20
+ channel: DeliverChannel;
21
+ /** Unix 毫秒时间戳(入列时刻) */
22
+ enqueuedAt: number;
23
+ /**
24
+ * 后台唤醒标记(04 §4:发送方声明的 backgroundWake 位随条目入列——
25
+ * 消费侧(驱动)据此合批与记唤醒预算;队列只承载不判定)。
26
+ */
27
+ backgroundWake?: boolean;
28
+ /**
29
+ * 撤回关联键(e-4 操控腿 withdraw——03 §2.2 第十一面):铸造位单归操控
30
+ * 受理器(栈级自增序列),随 enqueue 入列透传;队列只承载不铸造。
31
+ * 普通件(submit/steer)无此位——withdraw 只对操控件有意义。
32
+ */
33
+ id?: string;
34
+ }
35
+ /** enqueue 回执:accepted=false 时 dropped 载被拒/被丢项(回执面可见,不静默) */
36
+ export interface EnqueueReceipt {
37
+ accepted: boolean;
38
+ /** 被丢(drop-oldest)或被拒(bounded)的项 */
39
+ dropped?: PendingItem;
40
+ }
41
+ /** 队列缺省容量帽(04 §4 定值——码面缺省参数非契约常数,channels 件可再裁) */
42
+ export declare const DEFAULT_QUEUE_CAPACITY = 100;
43
+ /**
44
+ * 待发队列(机制件——通道判定在驱动侧 conversation,本件只司暂存与取件)。
45
+ * mode 可运行期调整(合批窗口的开关);capacity/overflowPolicy 构造期钉死
46
+ * (溢出语义漂移属配置面变更,不开放热改)。
47
+ */
48
+ export declare class PendingMessageQueue {
49
+ /** 待发条目(FIFO;队首最旧) */
50
+ private readonly items;
51
+ /** 取件策略(可运行期调整) */
52
+ private modeValue;
53
+ /** 容量帽(构造期钉死) */
54
+ private readonly capacityValue;
55
+ /** 溢出策略(构造期钉死) */
56
+ private readonly overflowValue;
57
+ /**
58
+ * @param options.mode 取件策略(缺省 one-at-a-time)
59
+ * @param options.capacity 容量帽(缺省 100;<1 拒构造——空队列是死配置)
60
+ * @param options.overflowPolicy 溢出策略(缺省 drop-oldest)
61
+ */
62
+ constructor(options?: {
63
+ mode?: QueueMode;
64
+ capacity?: number;
65
+ overflowPolicy?: OverflowPolicy;
66
+ });
67
+ /** 取件策略(读) */
68
+ get mode(): QueueMode;
69
+ /** 取件策略(写——运行期调整面:合批窗口开关) */
70
+ set mode(mode: QueueMode);
71
+ /** 当前条目数 */
72
+ get size(): number;
73
+ /** 是否有待发条目 */
74
+ hasItems(): boolean;
75
+ /**
76
+ * 入列(溢出按策略执法、回执不静默)。
77
+ * @param message 待发消息 @param channel 通道判定结果(驱动侧已裁)
78
+ * @param options.backgroundWake 后台唤醒标记位(随条目透传——消费侧合批/预算面)
79
+ * @param options.id 撤回关联键(随条目透传——withdraw 消费面;e-4)
80
+ * @returns 回执:accepted=true 正常入列;false 时 dropped 载被丢/被拒项
81
+ */
82
+ enqueue(message: AgentMessage, channel: DeliverChannel, options?: {
83
+ backgroundWake?: boolean;
84
+ id?: string;
85
+ }): EnqueueReceipt;
86
+ /**
87
+ * 取件(按 mode:one-at-a-time 取队首一件;all 全取清空)。
88
+ * @returns 取出的条目(空队列返回空数组)
89
+ */
90
+ drain(): PendingItem[];
91
+ /** 清空(run 收场/会话拆解用;返回被清条目供回执) */
92
+ clear(): PendingItem[];
93
+ /**
94
+ * 在队快照(e-5 操控收口——interrupt 回执 still_queued 数据源):只读呈报
95
+ * 不取件不 mutate(与 drain/clear 分立——快照零副作用)。返回浅拷贝数组,
96
+ * 调用方改写不影响队内真身。
97
+ */
98
+ snapshot(): readonly PendingItem[];
99
+ /**
100
+ * 在队撤回(e-4 withdraw——03 §2.2 第十一面):按撤回关联键移除在队件。
101
+ * @returns 命中返回被移除条目;不在队(已出队被消费/从未入列/已被溢出
102
+ * 丢弃)返回 undefined——调用方以「已投递」语义诚实呈报。
103
+ */
104
+ withdraw(id: string): PendingItem | undefined;
105
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * agent 件 — PendingMessageQueue 待发队列(04 篇 §4:三通道的暂存与合批机制)。
3
+ *
4
+ * 两轴分立(本仓 vs berry 蓝本差异④——蓝本只有取件单轴):
5
+ * - QueueMode 取件策略轴:one-at-a-time(缺省,一次取一件)/ all(合批——后台
6
+ * 唤醒合批收窄工具面即此);
7
+ * - overflowPolicy 容量溢出策略轴:drop-oldest(缺省,丢弃即回执可见不静默
8
+ * 堆积)/ bounded(排到帽拒新并回执拒收)。
9
+ * 队列是内存态:崩溃即丢——durable 真相只有已进 timeline 的消息(05 篇)。
10
+ */
11
+ /** 队列缺省容量帽(04 §4 定值——码面缺省参数非契约常数,channels 件可再裁) */
12
+ export const DEFAULT_QUEUE_CAPACITY = 100;
13
+ /**
14
+ * 待发队列(机制件——通道判定在驱动侧 conversation,本件只司暂存与取件)。
15
+ * mode 可运行期调整(合批窗口的开关);capacity/overflowPolicy 构造期钉死
16
+ * (溢出语义漂移属配置面变更,不开放热改)。
17
+ */
18
+ export class PendingMessageQueue {
19
+ /** 待发条目(FIFO;队首最旧) */
20
+ items = [];
21
+ /** 取件策略(可运行期调整) */
22
+ modeValue;
23
+ /** 容量帽(构造期钉死) */
24
+ capacityValue;
25
+ /** 溢出策略(构造期钉死) */
26
+ overflowValue;
27
+ /**
28
+ * @param options.mode 取件策略(缺省 one-at-a-time)
29
+ * @param options.capacity 容量帽(缺省 100;<1 拒构造——空队列是死配置)
30
+ * @param options.overflowPolicy 溢出策略(缺省 drop-oldest)
31
+ */
32
+ constructor(options) {
33
+ this.modeValue = options?.mode ?? 'one-at-a-time';
34
+ this.capacityValue = options?.capacity ?? DEFAULT_QUEUE_CAPACITY;
35
+ this.overflowValue = options?.overflowPolicy ?? 'drop-oldest';
36
+ if (!Number.isInteger(this.capacityValue) || this.capacityValue < 1) {
37
+ throw new RangeError(`capacity 须为正整数,收到 ${this.capacityValue}——空队列是死配置`);
38
+ }
39
+ }
40
+ /** 取件策略(读) */
41
+ get mode() {
42
+ return this.modeValue;
43
+ }
44
+ /** 取件策略(写——运行期调整面:合批窗口开关) */
45
+ set mode(mode) {
46
+ this.modeValue = mode;
47
+ }
48
+ /** 当前条目数 */
49
+ get size() {
50
+ return this.items.length;
51
+ }
52
+ /** 是否有待发条目 */
53
+ hasItems() {
54
+ return this.items.length > 0;
55
+ }
56
+ /**
57
+ * 入列(溢出按策略执法、回执不静默)。
58
+ * @param message 待发消息 @param channel 通道判定结果(驱动侧已裁)
59
+ * @param options.backgroundWake 后台唤醒标记位(随条目透传——消费侧合批/预算面)
60
+ * @param options.id 撤回关联键(随条目透传——withdraw 消费面;e-4)
61
+ * @returns 回执:accepted=true 正常入列;false 时 dropped 载被丢/被拒项
62
+ */
63
+ enqueue(message, channel, options) {
64
+ const item = {
65
+ message,
66
+ channel,
67
+ enqueuedAt: Date.now(),
68
+ ...(options?.backgroundWake !== undefined ? { backgroundWake: options.backgroundWake } : {}),
69
+ ...(options?.id !== undefined ? { id: options.id } : {}),
70
+ };
71
+ if (this.items.length < this.capacityValue) {
72
+ this.items.push(item);
73
+ return { accepted: true };
74
+ }
75
+ if (this.overflowValue === 'bounded') {
76
+ // 有界排队腿:排到帽拒新——拒收项原样回执(调用方告知用户)
77
+ return { accepted: false, dropped: item };
78
+ }
79
+ // drop-oldest 腿:丢队首腾位(丢弃可见——被丢项回执给调用方)
80
+ const dropped = this.items.shift();
81
+ this.items.push(item);
82
+ return { accepted: true, dropped };
83
+ }
84
+ /**
85
+ * 取件(按 mode:one-at-a-time 取队首一件;all 全取清空)。
86
+ * @returns 取出的条目(空队列返回空数组)
87
+ */
88
+ drain() {
89
+ if (this.items.length === 0)
90
+ return [];
91
+ if (this.modeValue === 'all') {
92
+ return this.items.splice(0, this.items.length);
93
+ }
94
+ return [this.items.shift()];
95
+ }
96
+ /** 清空(run 收场/会话拆解用;返回被清条目供回执) */
97
+ clear() {
98
+ return this.items.splice(0, this.items.length);
99
+ }
100
+ /**
101
+ * 在队快照(e-5 操控收口——interrupt 回执 still_queued 数据源):只读呈报
102
+ * 不取件不 mutate(与 drain/clear 分立——快照零副作用)。返回浅拷贝数组,
103
+ * 调用方改写不影响队内真身。
104
+ */
105
+ snapshot() {
106
+ return [...this.items];
107
+ }
108
+ /**
109
+ * 在队撤回(e-4 withdraw——03 §2.2 第十一面):按撤回关联键移除在队件。
110
+ * @returns 命中返回被移除条目;不在队(已出队被消费/从未入列/已被溢出
111
+ * 丢弃)返回 undefined——调用方以「已投递」语义诚实呈报。
112
+ */
113
+ withdraw(id) {
114
+ const index = this.items.findIndex((item) => item.id === id);
115
+ if (index === -1)
116
+ return undefined;
117
+ return this.items.splice(index, 1)[0];
118
+ }
119
+ }
120
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../../../src/agent/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * agent 件 — 流消费辅助(loop 骨架的内层腿;04 §2 双 while 的内层本体)。
3
+ *
4
+ * 组装序(承蓝本):convertToLlm 全量转写 → transformContext 最后关口 →
5
+ * getApiKey → streamFn(永不抛——错误编码为流终值)→ 迭代(start 占位入列、
6
+ * delta 就地替换、终值 result() 落位)。partial 就地替换:流中每事件的
7
+ * partial 即累计快照,尾元素直接替换即活体更新——不重建数组。
8
+ * 终值落位判占位在场(04 §3 定形):error 终值可无 start 前导(provider 前置
9
+ * 失败形),未见 start 时终值走 append——无条件尾替换会覆写上一条活消息。
10
+ */
11
+ import type { AssistantMessage } from '../contracts/index.js';
12
+ import type { AgentContext, AgentLoopConfig, EmitFn } from './types.js';
13
+ /**
14
+ * 单轮流式请求:从 context 组装 LlmContext、消费流、终值落位并回推。
15
+ *
16
+ * @param config loop 配置(convertToLlm/transformContext/getApiKey/streamFn 消费面)
17
+ * @param context 运行上下文(messages 活数组——assistant 占位与终值都入列)
18
+ * @param emit 活体事件发射器
19
+ * @returns 终值消息(stopReason=error/aborted 时错误即数据——loop 按终态短路)
20
+ */
21
+ export declare function streamAssistantResponse(config: AgentLoopConfig, context: AgentContext, emit: EmitFn): Promise<AssistantMessage>;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * agent 件 — 流消费辅助(loop 骨架的内层腿;04 §2 双 while 的内层本体)。
3
+ *
4
+ * 组装序(承蓝本):convertToLlm 全量转写 → transformContext 最后关口 →
5
+ * getApiKey → streamFn(永不抛——错误编码为流终值)→ 迭代(start 占位入列、
6
+ * delta 就地替换、终值 result() 落位)。partial 就地替换:流中每事件的
7
+ * partial 即累计快照,尾元素直接替换即活体更新——不重建数组。
8
+ * 终值落位判占位在场(04 §3 定形):error 终值可无 start 前导(provider 前置
9
+ * 失败形),未见 start 时终值走 append——无条件尾替换会覆写上一条活消息。
10
+ */
11
+ /**
12
+ * 单轮流式请求:从 context 组装 LlmContext、消费流、终值落位并回推。
13
+ *
14
+ * @param config loop 配置(convertToLlm/transformContext/getApiKey/streamFn 消费面)
15
+ * @param context 运行上下文(messages 活数组——assistant 占位与终值都入列)
16
+ * @param emit 活体事件发射器
17
+ * @returns 终值消息(stopReason=error/aborted 时错误即数据——loop 按终态短路)
18
+ */
19
+ export async function streamAssistantResponse(config, context, emit) {
20
+ // ① convertToLlm 全量转写(null = 剥离不进上下文;数组 = 一拆多)
21
+ const messages = [];
22
+ for (const message of context.messages) {
23
+ const converted = config.convertToLlm(message);
24
+ if (converted === null)
25
+ continue;
26
+ if (Array.isArray(converted))
27
+ messages.push(...converted);
28
+ else
29
+ messages.push(converted);
30
+ }
31
+ let llmContext = {
32
+ systemPrompt: context.systemPrompt,
33
+ messages,
34
+ tools: context.tools?.map((tool) => ({
35
+ name: tool.name,
36
+ description: tool.description,
37
+ parameters: tool.parameters,
38
+ })),
39
+ };
40
+ // ② transformContext 最后关口(记忆检索瞬态注入位)
41
+ if (config.transformContext)
42
+ llmContext = await config.transformContext(llmContext);
43
+ // ③ 凭证取用 + ④ 流式调用(永不抛契约——一切失败在流终值里)
44
+ const stream = await config.streamFn(llmContext, { model: config.model, thinkingLevel: config.thinkingLevel, apiKey: config.getApiKey?.(config.model) }, config.signal);
45
+ // ⑤ 消费流:start 占位入列 → 带 partial 事件就地替换尾 → 终值 result() 落位。
46
+ // sawStart 追踪(04 §3 定形):error 终值可无 start 前导——provider 前置失败形
47
+ // (pi-ai 请求创建失败 catch 路径只发 error 不发 start),「start 先行」非流的
48
+ // 隐含序约束;终值落位据此判占位在场。
49
+ let sawStart = false;
50
+ for await (const event of stream) {
51
+ if (event.type === 'start') {
52
+ sawStart = true;
53
+ context.messages.push(event.partial);
54
+ emit({ type: 'message_start', role: 'assistant' });
55
+ }
56
+ else if (event.type === 'done' || event.type === 'error') {
57
+ break; // 终值统一走 result()(流协议:done/error 后迭代自然收尾)
58
+ }
59
+ else {
60
+ // 各内容块事件的 partial 均为累计快照——就地替换尾元素即活体更新
61
+ context.messages[context.messages.length - 1] = event.partial;
62
+ emit({ type: 'message_update', role: 'assistant', partial: event.partial });
63
+ }
64
+ }
65
+ const final = await stream.result();
66
+ if (sawStart) {
67
+ // 正常形:占位在场——终值就地替换占位
68
+ context.messages[context.messages.length - 1] = final;
69
+ }
70
+ else {
71
+ // 无 start 前导形:无占位可替换——终值走 append(无条件尾替换会覆写上一条
72
+ // 活消息:种子 user 消息被 error assistant 顶替即此形),并补发配对
73
+ // message_start(否则 message_end 裸奔——活体事件序违例与覆写同源)
74
+ context.messages.push(final);
75
+ emit({ type: 'message_start', role: 'assistant' });
76
+ }
77
+ emit({ type: 'message_end', message: final });
78
+ return final;
79
+ }
80
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../src/agent/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAuB,EACvB,OAAqB,EACrB,IAAY;IAEZ,+CAA+C;IAC/C,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,SAAS,KAAK,IAAI;YAAE,SAAS;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;;YACrD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,UAAU,GAAe;QAC3B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ;QACR,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAW,EAAE,CAAC,CAAC;YAC5C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;KACJ,CAAC;IACF,qCAAqC;IACrC,IAAI,MAAM,CAAC,gBAAgB;QAAE,UAAU,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACpF,oCAAoC;IACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAClC,UAAU,EACV,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACtG,MAAM,CAAC,MAAM,CACd,CAAC;IACF,yDAAyD;IACzD,4DAA4D;IAC5D,yDAAyD;IACzD,qBAAqB;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3D,MAAM,CAAC,yCAAyC;QAClD,CAAC;aAAM,CAAC;YACN,uCAAuC;YACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9D,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,OAAuB,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACpC,IAAI,QAAQ,EAAE,CAAC;QACb,qBAAqB;QACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,8CAA8C;QAC9C,+CAA+C;QAC/C,iDAAiD;QACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * agent 件 — 工具批执行器(loop 骨架的工具腿;04 §2 批语义的执法位)。
3
+ *
4
+ * 本件是 loop 零 try/catch 形态铁律的配套执法位:插件工具 execute 可抛错,
5
+ * 包装在此(错误 → isError 结果数据面),loop 骨架只见结果不见异常。
6
+ * 批语义六条:①单响应护栏两闸(04 §2——消费序前插 limiter,零改 loop
7
+ * 骨架):call_id 幂等(同 id 重放不重执行——批内/跨轮/重试续入三域同律,
8
+ * 账本挂 context)+ 批调用数上限(超帽丢尾配对 isError + 计数暴露);
9
+ * ②读写批调度(03 §2.3 尾注——effect 一位两用):read(含缺省)段内并发、
10
+ * write 批边界串行(写前清空在飞只读——段序天然执法:write 前的 read 段已
11
+ * Promise.all 排干、write 后的 read 段待其结算才起跑);③beforeToolCall
12
+ * block → immediate isError 结果;④terminate 批内一致裁决(批内全
13
+ * terminate 才 terminate——单件否决不放大;回执腿/中止配对腿/丢尾腿非执行
14
+ * 腿不否决——空真通过与批内任何真实执行腿的 false 一票即续跑,纯非执行
15
+ * 批恒 terminate 停跑——重放循环卡死的兜底);⑤abort 余量配对(落批中
16
+ * 间时未执行 calls 逐个配对 isError toolResult,防下一轮孤儿 toolUse)。
17
+ */
18
+ import type { ToolResultMessage } from '../contracts/index.js';
19
+ import type { AgentToolCall } from '../contracts/index.js';
20
+ import type { AgentContext, AgentLoopConfig, EmitFn } from './types.js';
21
+ /** 单响应工具批调用数上限缺省值(04 §2 闸②——帽常量可配置:AgentLoopConfig.maxToolCallsPerResponse) */
22
+ export declare const DEFAULT_MAX_TOOL_CALLS_PER_RESPONSE = 32;
23
+ /** 批执行结算:结果消息(与 calls 恒配对——含 block/isError/中止配对/回执/丢尾腿)+ 批内一致 terminate */
24
+ export interface ToolBatchOutcome {
25
+ results: ToolResultMessage[];
26
+ /** 批内全 terminate 才 true(04 §2 批内一致裁决;非执行腿〔回执/中止配对/丢尾〕不否决——空真通过:纯非执行批恒 true 停跑〔重放循环兜底〕、批内任一真实执行腿 false 即续跑) */
27
+ terminate: boolean;
28
+ /** 闸②丢尾计数(04 §2——被超帽丢弃的条数,非静默暴露;被丢 legs 已在 results 内逐条 isError 配对) */
29
+ droppedCount: number;
30
+ }
31
+ /**
32
+ * 执行一批工具调用(单响应护栏两闸 + 读写批调度 + abort 余量配对 + 批内一致 terminate)。
33
+ *
34
+ * 护栏两闸(04 §2,消费序前插——零改 loop 骨架):闸②批调用数上限——超帽
35
+ * 丢尾(被丢 calls 逐个 isError 配对 + 计数暴露;丢尾腿不进账本——未执行
36
+ * 条目无「既有结果」,模型重发该 id 时按新调用执行);闸①call_id 幂等——
37
+ * 账本(context.toolResultLedger,driver 终身单实例)与批内首现双命中均走
38
+ * 回执腿(直接回既有结果,不重执行、不发执行活体事件、不参与 terminate
39
+ * 表决——strix wait→check 轮询防回归锁)。
40
+ *
41
+ * 调度(03 §2.3 尾注——effect 一位两用的消费执法):按原序切段——连续 read
42
+ * 调用成一段(段内并发 Promise.all)、write 调用独立成段(单件串行屏障:
43
+ * 写前清空在飞只读、写后 read 待其结算)。工具不在场(lookup 失败)视同
44
+ * read 入段——executeOne 自会回配置漂移 isError,不影响调度归类。
45
+ *
46
+ * @param config loop 配置 @param context 运行上下文 @param calls assistant 批内全部调用
47
+ * @param emit 活体事件发射器
48
+ */
49
+ export declare function executeToolBatch(config: AgentLoopConfig, context: AgentContext, calls: AgentToolCall[], emit: EmitFn): Promise<ToolBatchOutcome>;
@@ -0,0 +1,222 @@
1
+ /**
2
+ * agent 件 — 工具批执行器(loop 骨架的工具腿;04 §2 批语义的执法位)。
3
+ *
4
+ * 本件是 loop 零 try/catch 形态铁律的配套执法位:插件工具 execute 可抛错,
5
+ * 包装在此(错误 → isError 结果数据面),loop 骨架只见结果不见异常。
6
+ * 批语义六条:①单响应护栏两闸(04 §2——消费序前插 limiter,零改 loop
7
+ * 骨架):call_id 幂等(同 id 重放不重执行——批内/跨轮/重试续入三域同律,
8
+ * 账本挂 context)+ 批调用数上限(超帽丢尾配对 isError + 计数暴露);
9
+ * ②读写批调度(03 §2.3 尾注——effect 一位两用):read(含缺省)段内并发、
10
+ * write 批边界串行(写前清空在飞只读——段序天然执法:write 前的 read 段已
11
+ * Promise.all 排干、write 后的 read 段待其结算才起跑);③beforeToolCall
12
+ * block → immediate isError 结果;④terminate 批内一致裁决(批内全
13
+ * terminate 才 terminate——单件否决不放大;回执腿/中止配对腿/丢尾腿非执行
14
+ * 腿不否决——空真通过与批内任何真实执行腿的 false 一票即续跑,纯非执行
15
+ * 批恒 terminate 停跑——重放循环卡死的兜底);⑤abort 余量配对(落批中
16
+ * 间时未执行 calls 逐个配对 isError toolResult,防下一轮孤儿 toolUse)。
17
+ */
18
+ import { BaseError, redactSensitiveText } from '../contracts/index.js';
19
+ /** 单响应工具批调用数上限缺省值(04 §2 闸②——帽常量可配置:AgentLoopConfig.maxToolCallsPerResponse) */
20
+ export const DEFAULT_MAX_TOOL_CALLS_PER_RESPONSE = 32;
21
+ /**
22
+ * 组装一条工具结果消息(block/错误/中止配对/正常四腿共用的组装面)。
23
+ *
24
+ * 出口治理③ 定形③(04 §7):错误/拒绝腿文本在此单一扼点同过模式消毒
25
+ * (正常腿由管道链尾消毒——本位幂等不重复)。agent 侧无活值 provider
26
+ * (值基腿只在管道),纯模式腿覆盖具名形。
27
+ *
28
+ * @param call 配对的 toolCall 块 @param content 文本腿 @param isError 错误标记
29
+ * @param details 结构化明细(可选)
30
+ */
31
+ function buildResult(call, content, isError, details) {
32
+ return {
33
+ role: 'toolResult',
34
+ toolCallId: call.id,
35
+ toolName: call.name,
36
+ content: [{ type: 'text', text: redactSensitiveText(content) }],
37
+ isError,
38
+ timestamp: Date.now(),
39
+ ...(details !== undefined ? { details } : {}),
40
+ };
41
+ }
42
+ /**
43
+ * 执行单条工具调用(含 beforeToolCall 守门、执行体替换、迟到进度丢弃、
44
+ * execute 抛错包装、afterToolCall 字段级整体替换)。
45
+ */
46
+ async function executeOne(config, context, tool, call, emit) {
47
+ emit({ type: 'tool_execution_start', toolCallId: call.id, name: call.name, arguments: call.arguments });
48
+ // 工具不在场:结果数据面直接回错(工具清单在 run 内静态——不可达名即配置漂移)
49
+ if (!tool) {
50
+ const message = buildResult(call, `工具 ${call.name} 不在本 run 工具集(配置漂移——清单与调用不同源)`, true);
51
+ emit({ type: 'tool_execution_end', toolCallId: call.id, result: { content: message.content, isError: true } });
52
+ return { message, terminate: false };
53
+ }
54
+ // 守门行安装点:block 拒因 → immediate isError 结果(不执行)
55
+ const decision = (await config.beforeToolCall?.(call, context)) ?? {};
56
+ if (decision.block !== undefined) {
57
+ const message = buildResult(call, decision.block, true);
58
+ emit({ type: 'tool_execution_end', toolCallId: call.id, result: { content: message.content, isError: true } });
59
+ return { message, terminate: decision.terminate === true };
60
+ }
61
+ // 参数预处理(执行前最后一改参数的机会)
62
+ const args = tool.prepareArguments ? await tool.prepareArguments(call.arguments) : call.arguments;
63
+ // 迟到进度丢弃:promise 结算后 onUpdate 静默(accepting 旗——终值已落,迟到腿不重放)
64
+ let accepting = true;
65
+ const onUpdate = (update) => {
66
+ if (accepting)
67
+ emit({ type: 'tool_execution_update', toolCallId: call.id, update });
68
+ };
69
+ let result;
70
+ try {
71
+ // 执行体替换点(测试注金样 seam);缺省走 tool.execute(signal 协作面透传)
72
+ result = config.toolExecution
73
+ ? await config.toolExecution(tool, call.id, args, config.signal, onUpdate)
74
+ : await tool.execute(call.id, args, config.signal, onUpdate);
75
+ }
76
+ catch (err) {
77
+ // 插件工具抛错包装位(loop 零 try/catch 的配套——错误转数据面);错误
78
+ // 文本可能携出工具内部秘密(stderr env dump / 含 token 的 URL 报错)——
79
+ // 同过模式消毒(出口治理③ 定形③:与 buildResult 同一出口语义)
80
+ const text = err instanceof BaseError ? `${err.code}: ${err.message}` : String(err);
81
+ result = {
82
+ content: [{ type: 'text', text: redactSensitiveText(`工具 ${call.name} 执行异常:${text}`) }],
83
+ isError: true,
84
+ };
85
+ }
86
+ finally {
87
+ accepting = false;
88
+ }
89
+ // 结果组装(一次到位:正常腿与错误腿同形——错误是数据契约之一)
90
+ let message = {
91
+ role: 'toolResult',
92
+ toolCallId: call.id,
93
+ toolName: call.name,
94
+ content: result.content,
95
+ isError: result.isError === true,
96
+ timestamp: Date.now(),
97
+ ...(result.details !== undefined ? { details: result.details } : {}),
98
+ ...(result.usage !== undefined ? { usage: result.usage } : {}),
99
+ ...(result.addedToolNames !== undefined ? { addedToolNames: result.addedToolNames } : {}),
100
+ };
101
+ // 后置钩子:字段级整体替换(返回新消息替换默认组装形)
102
+ const replaced = await config.afterToolCall?.(call, result, message, context);
103
+ if (replaced !== undefined && replaced !== null)
104
+ message = replaced;
105
+ emit({ type: 'tool_execution_end', toolCallId: call.id, result });
106
+ return { message, terminate: result.terminate === true };
107
+ }
108
+ /**
109
+ * 执行一批工具调用(单响应护栏两闸 + 读写批调度 + abort 余量配对 + 批内一致 terminate)。
110
+ *
111
+ * 护栏两闸(04 §2,消费序前插——零改 loop 骨架):闸②批调用数上限——超帽
112
+ * 丢尾(被丢 calls 逐个 isError 配对 + 计数暴露;丢尾腿不进账本——未执行
113
+ * 条目无「既有结果」,模型重发该 id 时按新调用执行);闸①call_id 幂等——
114
+ * 账本(context.toolResultLedger,driver 终身单实例)与批内首现双命中均走
115
+ * 回执腿(直接回既有结果,不重执行、不发执行活体事件、不参与 terminate
116
+ * 表决——strix wait→check 轮询防回归锁)。
117
+ *
118
+ * 调度(03 §2.3 尾注——effect 一位两用的消费执法):按原序切段——连续 read
119
+ * 调用成一段(段内并发 Promise.all)、write 调用独立成段(单件串行屏障:
120
+ * 写前清空在飞只读、写后 read 待其结算)。工具不在场(lookup 失败)视同
121
+ * read 入段——executeOne 自会回配置漂移 isError,不影响调度归类。
122
+ *
123
+ * @param config loop 配置 @param context 运行上下文 @param calls assistant 批内全部调用
124
+ * @param emit 活体事件发射器
125
+ */
126
+ export async function executeToolBatch(config, context, calls, emit) {
127
+ // 闸②批调用数上限:单响应批超帽丢尾(缺省 32;负值归 0——0 即拒全批)
128
+ const cap = Math.max(0, config.maxToolCallsPerResponse ?? DEFAULT_MAX_TOOL_CALLS_PER_RESPONSE);
129
+ const droppedCount = Math.max(0, calls.length - cap);
130
+ const outcome = { results: [], terminate: false, droppedCount };
131
+ // 三分类预演(保序——结果按 calls 原序落位):dropped = 超帽丢尾(不进调度
132
+ // 不进账本);replay = 账本命中或批内首现之后的同 id 重现(回执腿);
133
+ // dispatch = 首达执行腿
134
+ const ledger = (context.toolResultLedger ??= new Map()); // 闸①首达建账
135
+ const seenInBatch = new Set();
136
+ const kinds = calls.map((call, i) => {
137
+ if (i >= cap)
138
+ return 'dropped';
139
+ if (ledger.has(call.id) || seenInBatch.has(call.id))
140
+ return 'replay';
141
+ seenInBatch.add(call.id);
142
+ return 'dispatch';
143
+ });
144
+ let allTerminate = true;
145
+ let index = 0;
146
+ while (index < calls.length) {
147
+ // 段前中止检查:已中止 → 余量全部配对 isError 收口(无孤儿 toolUse;配对腿不参与 terminate 表决——与旧串行路径同律)
148
+ if (config.signal?.aborted) {
149
+ for (const call of calls.slice(index)) {
150
+ outcome.results.push(buildResult(call, '工具批已被打断(run 中止——余量配对收口)', true));
151
+ }
152
+ outcome.terminate = calls.length > 0 && allTerminate;
153
+ return outcome;
154
+ }
155
+ // 非执行腿排干(保序内联,切段):回执腿 = 账本既有结果直接回执(拷贝重铸
156
+ // 配对键——同 id 多块 toolUse 各得一条);丢尾腿 = 超帽 isError 配对
157
+ while (index < calls.length && kinds[index] !== 'dispatch') {
158
+ const call = calls[index];
159
+ if (kinds[index] === 'replay') {
160
+ outcome.results.push(replayOf(call, ledger.get(call.id)));
161
+ }
162
+ else {
163
+ outcome.results.push(buildResult(call, `单响应工具批超上限 ${cap} 条——丢尾收口(本条未执行;请减少单次响应内的工具调用量)`, true));
164
+ }
165
+ index++;
166
+ }
167
+ if (index >= calls.length)
168
+ break; // 排干到尾(余量全是非执行腿——收尾)
169
+ // 连续 read 段(effect=read 并行档——2026-09-11 审批分档批三值扩后唯一
170
+ // 并行档;write|exec 均串行屏障。工具不在场腿留在本段〔执行期报不在场
171
+ // 错——缺席非声明,与「在场未声明 = exec 最危」的注册面归一分立〕;
172
+ // 非执行腿切段)
173
+ const segment = [];
174
+ while (index < calls.length && kinds[index] === 'dispatch') {
175
+ const found = lookup(context, calls[index]);
176
+ // 并行仅限显式 read:write/exec(及在场未声明的最危归一形)一律出局走屏障腿
177
+ if (found !== undefined && found.effect !== 'read')
178
+ break;
179
+ segment.push(calls[index]);
180
+ index++;
181
+ }
182
+ if (segment.length > 0) {
183
+ // read 段内并发(03 §2.3「批内可并行调度」);结果按 calls 原序落位(Promise.all 保序)
184
+ const settled = await Promise.all(segment.map((call) => executeOne(config, context, lookup(context, call), call, emit)));
185
+ for (let i = 0; i < settled.length; i++) {
186
+ const item = settled[i];
187
+ outcome.results.push(item.message);
188
+ ledger.set(segment[i].id, item.message); // 执行后入账(后续重放回执;段内 id 已去重)
189
+ allTerminate = allTerminate && item.terminate;
190
+ }
191
+ continue;
192
+ }
193
+ // write/exec 屏障腿:单件串行(写前清空在飞只读——前 read 段已排干;
194
+ // 屏障后 read 段待本腿结算。03 §2.3 尾注读写调度语义:write|exec 批边界
195
+ // 串行——审批分档批三值扩同律)
196
+ const writeCall = calls[index];
197
+ index++;
198
+ const settled = await executeOne(config, context, lookup(context, writeCall), writeCall, emit);
199
+ outcome.results.push(settled.message);
200
+ ledger.set(writeCall.id, settled.message); // 执行后入账(后续重放回执)
201
+ allTerminate = allTerminate && settled.terminate;
202
+ }
203
+ // 空批不终止;回执腿/丢尾腿不否决(空真通过与中止配对腿同律)——纯非执行
204
+ // 批(全回执/全丢尾)恒 terminate:停跑正是重放循环卡死的兜底(strix 病理
205
+ // 下继续跑 = 模型每轮空转重放烧 token;批内只要有一条真实执行腿投 false
206
+ // 即续跑)
207
+ outcome.terminate = calls.length > 0 && allTerminate;
208
+ return outcome;
209
+ }
210
+ /**
211
+ * 回执腿组装(04 §2 闸①):既有结果的回执拷贝——内容/错误位与原结果一致,
212
+ * 配对键与工具名重铸为本次 call(回执也是配对——防孤儿 toolUse 同律)。
213
+ * @param call 本次重放的调用块 @param cached 账本内既有结果消息
214
+ */
215
+ function replayOf(call, cached) {
216
+ return { ...cached, toolCallId: call.id, toolName: call.name, timestamp: Date.now() };
217
+ }
218
+ /** 按名查工具(批内 lookup 单源) */
219
+ function lookup(context, call) {
220
+ return context.tools?.find((t) => t.name === call.name);
221
+ }
222
+ //# sourceMappingURL=tools-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-batch.js","sourceRoot":"","sources":["../../../../../src/agent/tools-batch.ts"],"names":[],"mappings":"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"}