@qjp88995/agent-runtime 0.0.0-stage → 0.1.1

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 (477) hide show
  1. package/dist/agent-extensions.d.ts +30 -0
  2. package/dist/agent-extensions.d.ts.map +1 -0
  3. package/dist/agent-extensions.js +4 -0
  4. package/dist/agent-extensions.js.map +1 -0
  5. package/dist/builtins/ask-outcome.d.ts +49 -0
  6. package/dist/builtins/ask-outcome.d.ts.map +1 -0
  7. package/dist/builtins/ask-outcome.js +128 -0
  8. package/dist/builtins/ask-outcome.js.map +1 -0
  9. package/dist/builtins/ask-schema.d.ts +110 -0
  10. package/dist/builtins/ask-schema.d.ts.map +1 -0
  11. package/dist/builtins/ask-schema.js +124 -0
  12. package/dist/builtins/ask-schema.js.map +1 -0
  13. package/dist/builtins/ask.service.d.ts +210 -0
  14. package/dist/builtins/ask.service.d.ts.map +1 -0
  15. package/dist/builtins/ask.service.js +373 -0
  16. package/dist/builtins/ask.service.js.map +1 -0
  17. package/dist/builtins/ask.tool.d.ts +49 -0
  18. package/dist/builtins/ask.tool.d.ts.map +1 -0
  19. package/dist/builtins/ask.tool.js +109 -0
  20. package/dist/builtins/ask.tool.js.map +1 -0
  21. package/dist/builtins/index.d.ts +8 -0
  22. package/dist/builtins/index.d.ts.map +1 -0
  23. package/dist/builtins/index.js +8 -0
  24. package/dist/builtins/index.js.map +1 -0
  25. package/dist/builtins/todo-schema.d.ts +90 -0
  26. package/dist/builtins/todo-schema.d.ts.map +1 -0
  27. package/dist/builtins/todo-schema.js +97 -0
  28. package/dist/builtins/todo-schema.js.map +1 -0
  29. package/dist/builtins/todo-settle.hook.d.ts +110 -0
  30. package/dist/builtins/todo-settle.hook.d.ts.map +1 -0
  31. package/dist/builtins/todo-settle.hook.js +174 -0
  32. package/dist/builtins/todo-settle.hook.js.map +1 -0
  33. package/dist/builtins/todo.tool.d.ts +59 -0
  34. package/dist/builtins/todo.tool.d.ts.map +1 -0
  35. package/dist/builtins/todo.tool.js +107 -0
  36. package/dist/builtins/todo.tool.js.map +1 -0
  37. package/dist/context/context-budget-tracker.d.ts +185 -0
  38. package/dist/context/context-budget-tracker.d.ts.map +1 -0
  39. package/dist/context/context-budget-tracker.js +400 -0
  40. package/dist/context/context-budget-tracker.js.map +1 -0
  41. package/dist/context/context-budget.d.ts +48 -0
  42. package/dist/context/context-budget.d.ts.map +1 -0
  43. package/dist/context/context-budget.js +89 -0
  44. package/dist/context/context-budget.js.map +1 -0
  45. package/dist/context/index.d.ts +3 -0
  46. package/dist/context/index.d.ts.map +1 -0
  47. package/dist/context/index.js +3 -0
  48. package/dist/context/index.js.map +1 -0
  49. package/dist/extensions/repeat-call.hook.d.ts +32 -0
  50. package/dist/extensions/repeat-call.hook.d.ts.map +1 -0
  51. package/dist/extensions/repeat-call.hook.js +54 -0
  52. package/dist/extensions/repeat-call.hook.js.map +1 -0
  53. package/dist/hooks/index.d.ts +3 -0
  54. package/dist/hooks/index.d.ts.map +1 -0
  55. package/dist/hooks/index.js +3 -0
  56. package/dist/hooks/index.js.map +1 -0
  57. package/dist/hooks/turn-hook.registry.d.ts +51 -0
  58. package/dist/hooks/turn-hook.registry.d.ts.map +1 -0
  59. package/dist/hooks/turn-hook.registry.js +233 -0
  60. package/dist/hooks/turn-hook.registry.js.map +1 -0
  61. package/dist/hooks/turn-hook.types.d.ts +179 -0
  62. package/dist/hooks/turn-hook.types.d.ts.map +1 -0
  63. package/dist/hooks/turn-hook.types.js +48 -0
  64. package/dist/hooks/turn-hook.types.js.map +1 -0
  65. package/dist/images/byte-cache.d.ts +24 -0
  66. package/dist/images/byte-cache.d.ts.map +1 -0
  67. package/dist/images/byte-cache.js +51 -0
  68. package/dist/images/byte-cache.js.map +1 -0
  69. package/dist/images/delivery.d.ts +115 -0
  70. package/dist/images/delivery.d.ts.map +1 -0
  71. package/dist/images/delivery.js +321 -0
  72. package/dist/images/delivery.js.map +1 -0
  73. package/dist/images/index.d.ts +5 -0
  74. package/dist/images/index.d.ts.map +1 -0
  75. package/dist/images/index.js +5 -0
  76. package/dist/images/index.js.map +1 -0
  77. package/dist/images/prompt.d.ts +151 -0
  78. package/dist/images/prompt.d.ts.map +1 -0
  79. package/dist/images/prompt.js +172 -0
  80. package/dist/images/prompt.js.map +1 -0
  81. package/dist/images/vendor-files.d.ts +93 -0
  82. package/dist/images/vendor-files.d.ts.map +1 -0
  83. package/dist/images/vendor-files.js +156 -0
  84. package/dist/images/vendor-files.js.map +1 -0
  85. package/dist/in-process/conversation-store.d.ts +64 -0
  86. package/dist/in-process/conversation-store.d.ts.map +1 -0
  87. package/dist/in-process/conversation-store.js +222 -0
  88. package/dist/in-process/conversation-store.js.map +1 -0
  89. package/dist/in-process/coordination.d.ts +54 -0
  90. package/dist/in-process/coordination.d.ts.map +1 -0
  91. package/dist/in-process/coordination.js +137 -0
  92. package/dist/in-process/coordination.js.map +1 -0
  93. package/dist/in-process/image-source.d.ts +15 -0
  94. package/dist/in-process/image-source.d.ts.map +1 -0
  95. package/dist/in-process/image-source.js +27 -0
  96. package/dist/in-process/image-source.js.map +1 -0
  97. package/dist/in-process/index.d.ts +36 -0
  98. package/dist/in-process/index.d.ts.map +1 -0
  99. package/dist/in-process/index.js +37 -0
  100. package/dist/in-process/index.js.map +1 -0
  101. package/dist/in-process/question-store.d.ts +28 -0
  102. package/dist/in-process/question-store.d.ts.map +1 -0
  103. package/dist/in-process/question-store.js +122 -0
  104. package/dist/in-process/question-store.js.map +1 -0
  105. package/dist/in-process/run-store.d.ts +36 -0
  106. package/dist/in-process/run-store.d.ts.map +1 -0
  107. package/dist/in-process/run-store.js +81 -0
  108. package/dist/in-process/run-store.js.map +1 -0
  109. package/dist/in-process/session-store.d.ts +33 -0
  110. package/dist/in-process/session-store.d.ts.map +1 -0
  111. package/dist/in-process/session-store.js +93 -0
  112. package/dist/in-process/session-store.js.map +1 -0
  113. package/dist/in-process/stream-bus.d.ts +52 -0
  114. package/dist/in-process/stream-bus.d.ts.map +1 -0
  115. package/dist/in-process/stream-bus.js +200 -0
  116. package/dist/in-process/stream-bus.js.map +1 -0
  117. package/dist/in-process/vendor-file-cache.d.ts +11 -0
  118. package/dist/in-process/vendor-file-cache.d.ts.map +1 -0
  119. package/dist/in-process/vendor-file-cache.js +47 -0
  120. package/dist/in-process/vendor-file-cache.js.map +1 -0
  121. package/dist/index.d.ts +21 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +21 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/loop/active-tick.registry.d.ts +31 -0
  126. package/dist/loop/active-tick.registry.d.ts.map +1 -0
  127. package/dist/loop/active-tick.registry.js +45 -0
  128. package/dist/loop/active-tick.registry.js.map +1 -0
  129. package/dist/loop/index.d.ts +6 -0
  130. package/dist/loop/index.d.ts.map +1 -0
  131. package/dist/loop/index.js +6 -0
  132. package/dist/loop/index.js.map +1 -0
  133. package/dist/loop/loop-driver.d.ts +127 -0
  134. package/dist/loop/loop-driver.d.ts.map +1 -0
  135. package/dist/loop/loop-driver.js +199 -0
  136. package/dist/loop/loop-driver.js.map +1 -0
  137. package/dist/loop/message-hub.d.ts +236 -0
  138. package/dist/loop/message-hub.d.ts.map +1 -0
  139. package/dist/loop/message-hub.js +439 -0
  140. package/dist/loop/message-hub.js.map +1 -0
  141. package/dist/loop/orphan-run.sweeper.d.ts +79 -0
  142. package/dist/loop/orphan-run.sweeper.d.ts.map +1 -0
  143. package/dist/loop/orphan-run.sweeper.js +145 -0
  144. package/dist/loop/orphan-run.sweeper.js.map +1 -0
  145. package/dist/loop/root-host.d.ts +51 -0
  146. package/dist/loop/root-host.d.ts.map +1 -0
  147. package/dist/loop/root-host.js +65 -0
  148. package/dist/loop/root-host.js.map +1 -0
  149. package/dist/ports/context-store.d.ts +69 -0
  150. package/dist/ports/context-store.d.ts.map +1 -0
  151. package/dist/ports/context-store.js +2 -0
  152. package/dist/ports/context-store.js.map +1 -0
  153. package/dist/ports/conversation-store.d.ts +144 -0
  154. package/dist/ports/conversation-store.d.ts.map +1 -0
  155. package/dist/ports/conversation-store.js +2 -0
  156. package/dist/ports/conversation-store.js.map +1 -0
  157. package/dist/ports/coordination.d.ts +76 -0
  158. package/dist/ports/coordination.d.ts.map +1 -0
  159. package/dist/ports/coordination.js +12 -0
  160. package/dist/ports/coordination.js.map +1 -0
  161. package/dist/ports/image-source.d.ts +26 -0
  162. package/dist/ports/image-source.d.ts.map +1 -0
  163. package/dist/ports/image-source.js +2 -0
  164. package/dist/ports/image-source.js.map +1 -0
  165. package/dist/ports/index.d.ts +11 -0
  166. package/dist/ports/index.d.ts.map +1 -0
  167. package/dist/ports/index.js +4 -0
  168. package/dist/ports/index.js.map +1 -0
  169. package/dist/ports/logger.d.ts +14 -0
  170. package/dist/ports/logger.d.ts.map +1 -0
  171. package/dist/ports/logger.js +23 -0
  172. package/dist/ports/logger.js.map +1 -0
  173. package/dist/ports/question-store.d.ts +91 -0
  174. package/dist/ports/question-store.d.ts.map +1 -0
  175. package/dist/ports/question-store.js +8 -0
  176. package/dist/ports/question-store.js.map +1 -0
  177. package/dist/ports/run-store.d.ts +66 -0
  178. package/dist/ports/run-store.d.ts.map +1 -0
  179. package/dist/ports/run-store.js +2 -0
  180. package/dist/ports/run-store.js.map +1 -0
  181. package/dist/ports/session-store.d.ts +72 -0
  182. package/dist/ports/session-store.d.ts.map +1 -0
  183. package/dist/ports/session-store.js +9 -0
  184. package/dist/ports/session-store.js.map +1 -0
  185. package/dist/ports/stream-bus.d.ts +52 -0
  186. package/dist/ports/stream-bus.d.ts.map +1 -0
  187. package/dist/ports/stream-bus.js +2 -0
  188. package/dist/ports/stream-bus.js.map +1 -0
  189. package/dist/ports/vendor-file-cache.d.ts +46 -0
  190. package/dist/ports/vendor-file-cache.d.ts.map +1 -0
  191. package/dist/ports/vendor-file-cache.js +2 -0
  192. package/dist/ports/vendor-file-cache.js.map +1 -0
  193. package/dist/schema/agent-event.d.ts +35 -0
  194. package/dist/schema/agent-event.d.ts.map +1 -0
  195. package/dist/schema/agent-event.js +46 -0
  196. package/dist/schema/agent-event.js.map +1 -0
  197. package/dist/schema/agent-run.d.ts +23 -0
  198. package/dist/schema/agent-run.d.ts.map +1 -0
  199. package/dist/schema/agent-run.js +37 -0
  200. package/dist/schema/agent-run.js.map +1 -0
  201. package/dist/schema/index.d.ts +4 -0
  202. package/dist/schema/index.d.ts.map +1 -0
  203. package/dist/schema/index.js +4 -0
  204. package/dist/schema/index.js.map +1 -0
  205. package/dist/schema/message-part.d.ts +73 -0
  206. package/dist/schema/message-part.d.ts.map +1 -0
  207. package/dist/schema/message-part.js +90 -0
  208. package/dist/schema/message-part.js.map +1 -0
  209. package/dist/subagent/delegate.tool.d.ts +145 -0
  210. package/dist/subagent/delegate.tool.d.ts.map +1 -0
  211. package/dist/subagent/delegate.tool.js +329 -0
  212. package/dist/subagent/delegate.tool.js.map +1 -0
  213. package/dist/subagent/index.d.ts +10 -0
  214. package/dist/subagent/index.d.ts.map +1 -0
  215. package/dist/subagent/index.js +10 -0
  216. package/dist/subagent/index.js.map +1 -0
  217. package/dist/subagent/milestone-body.d.ts +82 -0
  218. package/dist/subagent/milestone-body.d.ts.map +1 -0
  219. package/dist/subagent/milestone-body.js +112 -0
  220. package/dist/subagent/milestone-body.js.map +1 -0
  221. package/dist/subagent/output-scan.d.ts +14 -0
  222. package/dist/subagent/output-scan.d.ts.map +1 -0
  223. package/dist/subagent/output-scan.js +41 -0
  224. package/dist/subagent/output-scan.js.map +1 -0
  225. package/dist/subagent/registry-spawn-policy.d.ts +32 -0
  226. package/dist/subagent/registry-spawn-policy.d.ts.map +1 -0
  227. package/dist/subagent/registry-spawn-policy.js +48 -0
  228. package/dist/subagent/registry-spawn-policy.js.map +1 -0
  229. package/dist/subagent/roster-block.d.ts +45 -0
  230. package/dist/subagent/roster-block.d.ts.map +1 -0
  231. package/dist/subagent/roster-block.js +69 -0
  232. package/dist/subagent/roster-block.js.map +1 -0
  233. package/dist/subagent/situation-block.d.ts +16 -0
  234. package/dist/subagent/situation-block.d.ts.map +1 -0
  235. package/dist/subagent/situation-block.js +71 -0
  236. package/dist/subagent/situation-block.js.map +1 -0
  237. package/dist/subagent/spawn-guards.d.ts +32 -0
  238. package/dist/subagent/spawn-guards.d.ts.map +1 -0
  239. package/dist/subagent/spawn-guards.js +39 -0
  240. package/dist/subagent/spawn-guards.js.map +1 -0
  241. package/dist/subagent/subagent-registry.d.ts +150 -0
  242. package/dist/subagent/subagent-registry.d.ts.map +1 -0
  243. package/dist/subagent/subagent-registry.js +167 -0
  244. package/dist/subagent/subagent-registry.js.map +1 -0
  245. package/dist/subagent/subagent-sessions.d.ts +213 -0
  246. package/dist/subagent/subagent-sessions.d.ts.map +1 -0
  247. package/dist/subagent/subagent-sessions.js +295 -0
  248. package/dist/subagent/subagent-sessions.js.map +1 -0
  249. package/dist/testing/contracts.d.ts +37 -0
  250. package/dist/testing/contracts.d.ts.map +1 -0
  251. package/dist/testing/contracts.js +607 -0
  252. package/dist/testing/contracts.js.map +1 -0
  253. package/dist/testing/index.d.ts +5 -0
  254. package/dist/testing/index.d.ts.map +1 -0
  255. package/dist/testing/index.js +5 -0
  256. package/dist/testing/index.js.map +1 -0
  257. package/dist/testing/stub.d.ts +28 -0
  258. package/dist/testing/stub.d.ts.map +1 -0
  259. package/dist/testing/stub.js +3 -0
  260. package/dist/testing/stub.js.map +1 -0
  261. package/dist/tools/agent-tool.base.d.ts +186 -0
  262. package/dist/tools/agent-tool.base.d.ts.map +1 -0
  263. package/dist/tools/agent-tool.base.js +243 -0
  264. package/dist/tools/agent-tool.base.js.map +1 -0
  265. package/dist/tools/agent-tool.interface.d.ts +95 -0
  266. package/dist/tools/agent-tool.interface.d.ts.map +1 -0
  267. package/dist/tools/agent-tool.interface.js +2 -0
  268. package/dist/tools/agent-tool.interface.js.map +1 -0
  269. package/dist/tools/builtin-names.d.ts +18 -0
  270. package/dist/tools/builtin-names.d.ts.map +1 -0
  271. package/dist/tools/builtin-names.js +20 -0
  272. package/dist/tools/builtin-names.js.map +1 -0
  273. package/dist/tools/index.d.ts +9 -0
  274. package/dist/tools/index.d.ts.map +1 -0
  275. package/dist/tools/index.js +6 -0
  276. package/dist/tools/index.js.map +1 -0
  277. package/dist/tools/tool-definition.d.ts +18 -0
  278. package/dist/tools/tool-definition.d.ts.map +1 -0
  279. package/dist/tools/tool-definition.js +77 -0
  280. package/dist/tools/tool-definition.js.map +1 -0
  281. package/dist/tools/tool-meta.d.ts +55 -0
  282. package/dist/tools/tool-meta.d.ts.map +1 -0
  283. package/dist/tools/tool-meta.js +2 -0
  284. package/dist/tools/tool-meta.js.map +1 -0
  285. package/dist/tools/tool-registry.d.ts +190 -0
  286. package/dist/tools/tool-registry.d.ts.map +1 -0
  287. package/dist/tools/tool-registry.js +379 -0
  288. package/dist/tools/tool-registry.js.map +1 -0
  289. package/dist/tools/tool-result.d.ts +41 -0
  290. package/dist/tools/tool-result.d.ts.map +1 -0
  291. package/dist/tools/tool-result.js +19 -0
  292. package/dist/tools/tool-result.js.map +1 -0
  293. package/dist/tools/tool-wire.d.ts +24 -0
  294. package/dist/tools/tool-wire.d.ts.map +1 -0
  295. package/dist/tools/tool-wire.js +2 -0
  296. package/dist/tools/tool-wire.js.map +1 -0
  297. package/dist/turn/agent-runtime.d.ts +31 -0
  298. package/dist/turn/agent-runtime.d.ts.map +1 -0
  299. package/dist/turn/agent-runtime.js +30 -0
  300. package/dist/turn/agent-runtime.js.map +1 -0
  301. package/dist/turn/chunk-projection.d.ts +32 -0
  302. package/dist/turn/chunk-projection.d.ts.map +1 -0
  303. package/dist/turn/chunk-projection.js +62 -0
  304. package/dist/turn/chunk-projection.js.map +1 -0
  305. package/dist/turn/compaction.d.ts +48 -0
  306. package/dist/turn/compaction.d.ts.map +1 -0
  307. package/dist/turn/compaction.js +89 -0
  308. package/dist/turn/compaction.js.map +1 -0
  309. package/dist/turn/context-overflow.d.ts +11 -0
  310. package/dist/turn/context-overflow.d.ts.map +1 -0
  311. package/dist/turn/context-overflow.js +53 -0
  312. package/dist/turn/context-overflow.js.map +1 -0
  313. package/dist/turn/context-pressure.d.ts +100 -0
  314. package/dist/turn/context-pressure.d.ts.map +1 -0
  315. package/dist/turn/context-pressure.js +21 -0
  316. package/dist/turn/context-pressure.js.map +1 -0
  317. package/dist/turn/events-to-steps.d.ts +8 -0
  318. package/dist/turn/events-to-steps.d.ts.map +1 -0
  319. package/dist/turn/events-to-steps.js +64 -0
  320. package/dist/turn/events-to-steps.js.map +1 -0
  321. package/dist/turn/index.d.ts +17 -0
  322. package/dist/turn/index.d.ts.map +1 -0
  323. package/dist/turn/index.js +16 -0
  324. package/dist/turn/index.js.map +1 -0
  325. package/dist/turn/json-preview.d.ts +22 -0
  326. package/dist/turn/json-preview.d.ts.map +1 -0
  327. package/dist/turn/json-preview.js +34 -0
  328. package/dist/turn/json-preview.js.map +1 -0
  329. package/dist/turn/json-string-field.d.ts +30 -0
  330. package/dist/turn/json-string-field.d.ts.map +1 -0
  331. package/dist/turn/json-string-field.js +125 -0
  332. package/dist/turn/json-string-field.js.map +1 -0
  333. package/dist/turn/loop-reminder.d.ts +79 -0
  334. package/dist/turn/loop-reminder.d.ts.map +1 -0
  335. package/dist/turn/loop-reminder.js +0 -0
  336. package/dist/turn/loop-reminder.js.map +1 -0
  337. package/dist/turn/nul-safe.d.ts +21 -0
  338. package/dist/turn/nul-safe.d.ts.map +1 -0
  339. package/dist/turn/nul-safe.js +23 -0
  340. package/dist/turn/nul-safe.js.map +1 -0
  341. package/dist/turn/parts-from-events.d.ts +71 -0
  342. package/dist/turn/parts-from-events.d.ts.map +1 -0
  343. package/dist/turn/parts-from-events.js +217 -0
  344. package/dist/turn/parts-from-events.js.map +1 -0
  345. package/dist/turn/parts-to-model-messages.d.ts +158 -0
  346. package/dist/turn/parts-to-model-messages.d.ts.map +1 -0
  347. package/dist/turn/parts-to-model-messages.js +334 -0
  348. package/dist/turn/parts-to-model-messages.js.map +1 -0
  349. package/dist/turn/pending-work.d.ts +10 -0
  350. package/dist/turn/pending-work.d.ts.map +1 -0
  351. package/dist/turn/pending-work.js +14 -0
  352. package/dist/turn/pending-work.js.map +1 -0
  353. package/dist/turn/provider-error.d.ts +45 -0
  354. package/dist/turn/provider-error.d.ts.map +1 -0
  355. package/dist/turn/provider-error.js +154 -0
  356. package/dist/turn/provider-error.js.map +1 -0
  357. package/dist/turn/tool-input-preview.d.ts +94 -0
  358. package/dist/turn/tool-input-preview.d.ts.map +1 -0
  359. package/dist/turn/tool-input-preview.js +143 -0
  360. package/dist/turn/tool-input-preview.js.map +1 -0
  361. package/dist/turn/tool-input-progress.d.ts +47 -0
  362. package/dist/turn/tool-input-progress.d.ts.map +1 -0
  363. package/dist/turn/tool-input-progress.js +50 -0
  364. package/dist/turn/tool-input-progress.js.map +1 -0
  365. package/dist/turn/turn-envelope.d.ts +184 -0
  366. package/dist/turn/turn-envelope.d.ts.map +1 -0
  367. package/dist/turn/turn-envelope.js +2 -0
  368. package/dist/turn/turn-envelope.js.map +1 -0
  369. package/dist/turn/turn-journal.d.ts +49 -0
  370. package/dist/turn/turn-journal.d.ts.map +1 -0
  371. package/dist/turn/turn-journal.js +51 -0
  372. package/dist/turn/turn-journal.js.map +1 -0
  373. package/dist/turn/turn-run.d.ts +487 -0
  374. package/dist/turn/turn-run.d.ts.map +1 -0
  375. package/dist/turn/turn-run.js +1167 -0
  376. package/dist/turn/turn-run.js.map +1 -0
  377. package/dist/turn/usage.d.ts +27 -0
  378. package/dist/turn/usage.d.ts.map +1 -0
  379. package/dist/turn/usage.js +51 -0
  380. package/dist/turn/usage.js.map +1 -0
  381. package/package.json +59 -3
  382. package/src/agent-extensions.ts +33 -0
  383. package/src/builtins/ask-outcome.ts +168 -0
  384. package/src/builtins/ask-schema.ts +186 -0
  385. package/src/builtins/ask.service.ts +482 -0
  386. package/src/builtins/ask.tool.ts +138 -0
  387. package/src/builtins/index.ts +25 -0
  388. package/src/builtins/todo-schema.ts +108 -0
  389. package/src/builtins/todo-settle.hook.ts +221 -0
  390. package/src/builtins/todo.tool.ts +134 -0
  391. package/src/context/context-budget-tracker.ts +519 -0
  392. package/src/context/context-budget.ts +124 -0
  393. package/src/context/index.ts +17 -0
  394. package/src/extensions/repeat-call.hook.ts +77 -0
  395. package/src/hooks/index.ts +19 -0
  396. package/src/hooks/turn-hook.registry.ts +307 -0
  397. package/src/hooks/turn-hook.types.ts +210 -0
  398. package/src/images/byte-cache.ts +61 -0
  399. package/src/images/delivery.ts +508 -0
  400. package/src/images/index.ts +35 -0
  401. package/src/images/prompt.ts +289 -0
  402. package/src/images/vendor-files.ts +235 -0
  403. package/src/in-process/conversation-store.ts +304 -0
  404. package/src/in-process/coordination.ts +177 -0
  405. package/src/in-process/image-source.ts +29 -0
  406. package/src/in-process/index.ts +52 -0
  407. package/src/in-process/question-store.ts +155 -0
  408. package/src/in-process/run-store.ts +115 -0
  409. package/src/in-process/session-store.ts +118 -0
  410. package/src/in-process/stream-bus.ts +244 -0
  411. package/src/in-process/vendor-file-cache.ts +67 -0
  412. package/src/index.ts +28 -0
  413. package/src/loop/active-tick.registry.ts +49 -0
  414. package/src/loop/index.ts +25 -0
  415. package/src/loop/loop-driver.ts +275 -0
  416. package/src/loop/message-hub.ts +532 -0
  417. package/src/loop/orphan-run.sweeper.ts +204 -0
  418. package/src/loop/root-host.ts +119 -0
  419. package/src/ports/context-store.ts +71 -0
  420. package/src/ports/conversation-store.ts +165 -0
  421. package/src/ports/coordination.ts +81 -0
  422. package/src/ports/image-source.ts +26 -0
  423. package/src/ports/index.ts +56 -0
  424. package/src/ports/logger.ts +34 -0
  425. package/src/ports/question-store.ts +117 -0
  426. package/src/ports/run-store.ts +69 -0
  427. package/src/ports/session-store.ts +80 -0
  428. package/src/ports/stream-bus.ts +59 -0
  429. package/src/ports/vendor-file-cache.ts +54 -0
  430. package/src/schema/agent-event.ts +69 -0
  431. package/src/schema/agent-run.ts +44 -0
  432. package/src/schema/index.ts +25 -0
  433. package/src/schema/message-part.ts +100 -0
  434. package/src/subagent/delegate.tool.ts +476 -0
  435. package/src/subagent/index.ts +63 -0
  436. package/src/subagent/milestone-body.ts +144 -0
  437. package/src/subagent/output-scan.ts +56 -0
  438. package/src/subagent/registry-spawn-policy.ts +85 -0
  439. package/src/subagent/roster-block.ts +103 -0
  440. package/src/subagent/situation-block.ts +83 -0
  441. package/src/subagent/spawn-guards.ts +54 -0
  442. package/src/subagent/subagent-registry.ts +283 -0
  443. package/src/subagent/subagent-sessions.ts +496 -0
  444. package/src/testing/contracts.ts +882 -0
  445. package/src/testing/index.ts +14 -0
  446. package/src/testing/stub.ts +28 -0
  447. package/src/tools/agent-tool.base.ts +361 -0
  448. package/src/tools/agent-tool.interface.ts +101 -0
  449. package/src/tools/builtin-names.ts +26 -0
  450. package/src/tools/index.ts +39 -0
  451. package/src/tools/tool-definition.ts +93 -0
  452. package/src/tools/tool-meta.ts +60 -0
  453. package/src/tools/tool-registry.ts +513 -0
  454. package/src/tools/tool-result.ts +45 -0
  455. package/src/tools/tool-wire.ts +24 -0
  456. package/src/turn/agent-runtime.ts +43 -0
  457. package/src/turn/chunk-projection.ts +81 -0
  458. package/src/turn/compaction.ts +103 -0
  459. package/src/turn/context-overflow.ts +54 -0
  460. package/src/turn/context-pressure.ts +114 -0
  461. package/src/turn/events-to-steps.ts +73 -0
  462. package/src/turn/index.ts +71 -0
  463. package/src/turn/json-preview.ts +36 -0
  464. package/src/turn/json-string-field.ts +134 -0
  465. package/src/turn/loop-reminder.ts +0 -0
  466. package/src/turn/nul-safe.ts +22 -0
  467. package/src/turn/parts-from-events.ts +248 -0
  468. package/src/turn/parts-to-model-messages.ts +428 -0
  469. package/src/turn/pending-work.ts +14 -0
  470. package/src/turn/provider-error.ts +160 -0
  471. package/src/turn/tool-input-preview.ts +223 -0
  472. package/src/turn/tool-input-progress.ts +76 -0
  473. package/src/turn/turn-envelope.ts +185 -0
  474. package/src/turn/turn-journal.ts +102 -0
  475. package/src/turn/turn-run.ts +1479 -0
  476. package/src/turn/usage.ts +56 -0
  477. package/README.md +0 -3
@@ -0,0 +1,62 @@
1
+ /**
2
+ * AI SDK chunk → 内层领域事件。只投影**流式增量**事件(文本/推理/工具入参
3
+ * 的实时构建),供 SSE 边打字边显示。
4
+ *
5
+ * **零内核状态、零时序约束**:它是 SDK chunk 的机械翻译,进度记账那半边也只
6
+ * 认自己手里的 tracker。故它住在 loop 外面。
7
+ *
8
+ * **不投影 `tool-call` / `tool-result`**:自驱 loop 喂 streamText 的是无
9
+ * execute 的 schema 工具集,SDK 因此永不产 `tool-result` chunk(无执行→无
10
+ * 结果),而 `tool-call` 由 loop 在拿到确定的 `step.toolCalls` 后**权威地**
11
+ * 发出(连同真实执行结果的 `tool-result`)。若这里也投影 `tool-call`,会与
12
+ * loop 那条重复投递;tool-result 又必须发在 step-finish 之前(见 `TurnRun`
13
+ * 里的说明),onChunk 里做不到这个时序。故这两类统一归 loop 掌管。
14
+ *
15
+ * `progress`/`preview` 两个 tracker 各管一条事件(`tool-input-progress`
16
+ * 答「写了多少」、`tool-input-preview` 答「写了什么」),互不知道对方,
17
+ * 这里各喂一遍。
18
+ */
19
+ export function projectChunk(chunk, journal, progress, preview) {
20
+ switch (chunk.type) {
21
+ case 'text-delta':
22
+ journal.append('text-delta', { text: chunk.text });
23
+ break;
24
+ case 'reasoning-delta':
25
+ journal.append('reasoning-delta', { text: chunk.text });
26
+ break;
27
+ case 'tool-input-start':
28
+ progress.start(chunk.id, chunk.toolName);
29
+ preview.start(chunk.id, chunk.toolName);
30
+ journal.append('tool-input-start', {
31
+ toolCallId: chunk.id,
32
+ toolName: chunk.toolName,
33
+ });
34
+ break;
35
+ case 'tool-input-delta': {
36
+ // 原始增量**逐块原样发**,一个字节不省:`parts-from-events.ts` 的 abort
37
+ // 兜底靠累积它来重建中断处那个半截的 tool-call。
38
+ journal.append('tool-input-delta', {
39
+ toolCallId: chunk.id,
40
+ delta: chunk.delta,
41
+ });
42
+ // 另发一条节流后的进度供界面用,见 tool-input-progress.ts。
43
+ const p = progress.delta(chunk.id, chunk.delta);
44
+ if (p)
45
+ journal.append('tool-input-progress', p);
46
+ // 白名单工具(Write 带正文、Edit 只带路径)再发一条内容预览,
47
+ // 见 tool-input-preview.ts。
48
+ const pv = preview.delta(chunk.id, chunk.delta);
49
+ if (pv)
50
+ journal.append('tool-input-preview', pv);
51
+ break;
52
+ }
53
+ default:
54
+ // 其余判别联合成员('text-end'/'source'/'raw'/'start'/'start-step'/
55
+ // 'finish-step'/'finish'/'tool-call'/'tool-result'/... —— 数量随 SDK
56
+ // 版本变)一律不投影。'tool-call'/'tool-result' 见函数头:它们改由
57
+ // loop 权威发出,不在这里投影。刻意跳过;以 'ai' 包当前版本的
58
+ // TextStreamPart 类型定义为准,不要在这里维护清单。
59
+ break;
60
+ }
61
+ }
62
+ //# sourceMappingURL=chunk-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-projection.js","sourceRoot":"","sources":["../../src/turn/chunk-projection.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAkB,EAClB,OAAoB,EACpB,QAAkC,EAClC,OAAgC;IAEhC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,MAAM;QACR,KAAK,iBAAiB;YACpB,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM;QACR,KAAK,kBAAkB;YACrB,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBACjC,UAAU,EAAE,KAAK,CAAC,EAAE;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC,CAAC;YACH,MAAM;QACR,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,sDAAsD;YACtD,+BAA+B;YAC/B,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBACjC,UAAU,EAAE,KAAK,CAAC,EAAE;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAC;YACH,2CAA2C;YAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;YAChD,sCAAsC;YACtC,2BAA2B;YAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,EAAE;gBAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM;QACR,CAAC;QACD;YACE,2DAA2D;YAC3D,kEAAkE;YAClE,gDAAgD;YAChD,sCAAsC;YACtC,mCAAmC;YACnC,MAAM;IACV,CAAC;AACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * 上下文压缩的纯文本层:给模型的压缩指令、checkpoint 的围栏、以及「这份摘要
3
+ * 值不值得用」的判据。**不碰库、不调模型**——那两样在 `agent-chat` 那边
4
+ * (`ContextBudgetTracker.compact`)。
5
+ *
6
+ * 与 `context-budget.ts` 的分工:那边算「切点切在哪」,这边管「切下来那段
7
+ * 变成什么」。
8
+ */
9
+ /**
10
+ * 落库的纯摘要正文 → 注入模型的那份。
11
+ *
12
+ * 落库不带围栏(见 `COMPACTION_CHECKPOINT_KIND` 的说明):围栏是给模型看的呈现
13
+ * 层,落进 `chat_message` 的话前端渲染这张卡时还得把标签剥回去。
14
+ */
15
+ export declare function wrapCompactionSummary(summary: string): string;
16
+ /**
17
+ * 发给模型的压缩指令。**追加在会话前缀的末尾**,前面逐字重放同一份 system
18
+ * prompt、同一份工具定义、同样的历史 —— 这样这次调用能命中 provider 的 warm
19
+ * prefix,只有这一条指令是新的。反过来(另起一个精简 prompt 去摘要)看着省
20
+ * token,实际是整个前缀重新计费。
21
+ *
22
+ * 八个小节照抄 dsh 那份(它跑过真实负载)改中文,另加两条我们自己必须有的:
23
+ * 「逐字保留用户的原话与纠正」和「已有 checkpoint 要合并而不是抄下来」——后者
24
+ * 不写死的话,每压缩一次 checkpoint 就长一截,最后它自己变成体积来源。
25
+ */
26
+ export declare const COMPACTION_INSTRUCTION = "\u8BF7\u505C\u4E0B\u5F53\u524D\u4EFB\u52A1\uFF0C\u4E0D\u8981\u56DE\u5E94\u4E0A\u9762\u7684\u5BF9\u8BDD\uFF0C\u4E5F\u4E0D\u8981\u8C03\u7528\u4EFB\u4F55\u5DE5\u5177\u3002\n\n\u628A\u5230\u76EE\u524D\u4E3A\u6B62\u7684\u6574\u6BB5\u5BF9\u8BDD\u538B\u7F29\u6210\u4E00\u4EFD**\u4EA4\u63A5\u8BF4\u660E**\uFF0C\u8BA9\u4E00\u4E2A\u770B\u4E0D\u5230\u539F\u59CB\u5BF9\u8BDD\u7684\u4EBA\u80FD\u63A5\u624B\u5E76\u65E0\u7F1D\u7EE7\u7EED\u8FD9\u9879\u5DE5\u4F5C\u3002\n\n\u6309\u4E0B\u5217\u5C0F\u8282\u8F93\u51FA\uFF0C\u6BCF\u4E00\u8282\u90FD\u7528\u5BF9\u8BDD\u91CC\u51FA\u73B0\u8FC7\u7684\u5177\u4F53\u540D\u79F0\u3001\u8DEF\u5F84\u3001\u6807\u8BC6\u7B26\uFF0C\u4E0D\u8981\u5199\u300C\u67D0\u4E2A\u6587\u4EF6\u300D\u300C\u76F8\u5173\u914D\u7F6E\u300D\u8FD9\u7C7B\u5360\u4F4D\u8BF4\u6CD5\uFF1B\u67D0\u4E00\u8282\u786E\u5B9E\u6CA1\u6709\u5185\u5BB9\u5C31\u5199\u300C\u65E0\u300D\u3002\n\n1. **\u7528\u6237\u7684\u76EE\u6807**\uFF1A\u7528\u6237\u60F3\u8FBE\u6210\u4EC0\u4E48\uFF0C\u5305\u62EC\u4E2D\u9014\u6539\u53D8\u8FC7\u7684\u76EE\u6807\u3002\n2. **\u7528\u6237\u7684\u539F\u8BDD\u4E0E\u7EA0\u6B63**\uFF1A\u9010\u5B57\u4FDD\u7559\u7528\u6237\u63D0\u51FA\u7684\u5173\u952E\u8981\u6C42\u3001\u504F\u597D\u4E0E\u7EA0\u6B63\u610F\u89C1\u3002\u7EA0\u6B63\u5C24\u5176\u91CD\u8981\u2014\u2014\u90A3\u662F\u6700\u5BB9\u6613\u5728\u538B\u7F29\u91CC\u4E22\u6389\u3001\u4E22\u6389\u4E4B\u540E\u4EE3\u4EF7\u6700\u5927\u7684\u4E1C\u897F\uFF08\u63A5\u624B\u7684\u4EBA\u4F1A\u628A\u5DF2\u7ECF\u88AB\u5426\u6389\u7684\u505A\u6CD5\u518D\u505A\u4E00\u904D\uFF09\u3002\n3. **\u5DF2\u7ECF\u5B8C\u6210\u7684\u5DE5\u4F5C**\uFF1A\u505A\u4E86\u4EC0\u4E48\uFF0C\u7ED3\u679C\u662F\u4EC0\u4E48\u3002\n4. **\u5F53\u524D\u8FDB\u884C\u5230\u54EA\u4E00\u6B65**\uFF1A\u6B63\u5728\u505A\u7684\u4E8B\uFF0C\u4EE5\u53CA\u505A\u5230\u4EC0\u4E48\u7A0B\u5EA6\u3002\n5. **\u6D89\u53CA\u7684\u6587\u4EF6\u4E0E\u8D44\u6E90**\uFF1A\u8DEF\u5F84\u3001id\u3001\u540D\u79F0\uFF0C\u4EE5\u53CA\u5404\u81EA\u5728\u8FD9\u4EF6\u4E8B\u91CC\u7684\u4F5C\u7528\u3002\n6. **\u5173\u952E\u51B3\u5B9A\u4E0E\u7406\u7531**\uFF1A\u4E3A\u4EC0\u4E48\u8FD9\u4E48\u9009\uFF0C\u4EE5\u53CA\u54EA\u4E9B\u65B9\u6848\u88AB\u5426\u51B3\u3001\u56E0\u4E3A\u4EC0\u4E48\u3002\n7. **\u9047\u5230\u7684\u95EE\u9898**\uFF1A\u51FA\u8FC7\u4EC0\u4E48\u9519\u3001\u600E\u4E48\u5904\u7406\u7684\u3001\u54EA\u4E9B\u8FD8\u6CA1\u89E3\u51B3\u3002\n8. **\u4E0B\u4E00\u6B65**\uFF1A\u63A5\u624B\u7684\u4EBA\u5E94\u8BE5\u7ACB\u523B\u505A\u4EC0\u4E48\u3002\n\n\u786C\u6027\u8981\u6C42\uFF1A\n\n- \u53EA\u8F93\u51FA\u8FD9\u4EFD\u8BF4\u660E\u672C\u8EAB\u3002\u4E0D\u8981\u5F00\u573A\u767D\u3001\u4E0D\u8981\u7ED3\u675F\u8BED\uFF0C\u4E5F\u4E0D\u8981\u63D0\u5230\u300C\u538B\u7F29\u300D\u300C\u6458\u8981\u300D\u8FD9\u4EF6\u4E8B\u672C\u8EAB\u3002\n- \u5982\u679C\u4E0A\u9762\u7684\u5BF9\u8BDD\u91CC\u5DF2\u7ECF\u6709\u4E00\u6BB5 <compacted-summary>\uFF0C\u90A3\u662F\u66F4\u65E9\u4E00\u6B21\u7684\u540C\u7C7B\u8BF4\u660E\uFF1A\u628A\u5B83\u548C\u5B83\u4E4B\u540E\u53D1\u751F\u7684\u4E8B**\u5408\u5E76**\u6210\u4E00\u4EFD\uFF0C\u4FDD\u7559\u4ECD\u7136\u6210\u7ACB\u7684\u5185\u5BB9\u3001\u5220\u6389\u5DF2\u7ECF\u8FC7\u671F\u6216\u88AB\u63A8\u7FFB\u7684\u5185\u5BB9\u3002\u4E0D\u8981\u539F\u6837\u6284\u4E0B\u6765\uFF0C\u4E5F\u4E0D\u8981\u4E3A\u5B83\u53E6\u8D77\u4E00\u8282\u3002\n- \u4E0D\u8981\u81C6\u9020\u5BF9\u8BDD\u91CC\u6CA1\u6709\u7684\u4FE1\u606F\u3002\u4E0D\u786E\u5B9A\u7684\u5C31\u5199\u300C\u4E0D\u786E\u5B9A\u300D\u3002";
27
+ export interface SummaryVerdict {
28
+ ok: boolean;
29
+ /** 不接受时给出理由,供日志——静默丢弃一次模型调用是最贵的那种沉默。 */
30
+ reason?: string;
31
+ }
32
+ /**
33
+ * 这份摘要能不能用。
34
+ *
35
+ * 两条,都不是形式检查:
36
+ *
37
+ * - **空的不能用**。模型可能压根没写文本(把工具定义当成了要调的东西、或者
38
+ * 整段产出都进了 reasoning)。拿空串当 checkpoint 落库,等于把那段历史直接
39
+ * 删了,而且删得悄无声息。
40
+ * - **不比源短就不能用**。压缩的全部意义是腾空间;一份和原文一样长的「摘要」
41
+ * 换进去,下一步照样超线,而我们已经为它付了一次全量请求的钱,还断了前缀
42
+ * 缓存。这种情况多半是模型把对话原样复述了一遍。
43
+ *
44
+ * 比的是字符数而不是 token:两边同一口径、只求相对大小(同
45
+ * `measureModelMessageChars`)。
46
+ */
47
+ export declare function judgeSummary(summary: string, sourceChars: number): SummaryVerdict;
48
+ //# sourceMappingURL=compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/turn/compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,q2GAmBP,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,cAAc,CAYhB"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * 上下文压缩的纯文本层:给模型的压缩指令、checkpoint 的围栏、以及「这份摘要
3
+ * 值不值得用」的判据。**不碰库、不调模型**——那两样在 `agent-chat` 那边
4
+ * (`ContextBudgetTracker.compact`)。
5
+ *
6
+ * 与 `context-budget.ts` 的分工:那边算「切点切在哪」,这边管「切下来那段
7
+ * 变成什么」。
8
+ */
9
+ /**
10
+ * 围栏标签名。**必须是固定字符串**——同 `<subagent-result>` 那条判据:这段正文
11
+ * 是模型自己写的自由文本,只有一个字节层面可判定的边界,才谈得上「摘要在哪里
12
+ * 结束、平台的话从哪里开始」。
13
+ */
14
+ const FENCE_TAG = 'compacted-summary';
15
+ /**
16
+ * 围栏里那句解释。**必须说明原始消息去哪了**:只丢一段摘要进去,模型会把它当成
17
+ * 「有人转述了一件事」,而不是「这就是你自己那段对话的全部」——两者对「要不要
18
+ * 重新去读一遍那个文件」的判断完全不同。
19
+ */
20
+ const FENCE_NOTE = '以下是本次对话更早部分的交接说明。原始消息已从上下文中移出以腾出空间,' +
21
+ '它们不会再回来;请把这份说明当作已经发生过的事实继续工作。';
22
+ /**
23
+ * 落库的纯摘要正文 → 注入模型的那份。
24
+ *
25
+ * 落库不带围栏(见 `COMPACTION_CHECKPOINT_KIND` 的说明):围栏是给模型看的呈现
26
+ * 层,落进 `chat_message` 的话前端渲染这张卡时还得把标签剥回去。
27
+ */
28
+ export function wrapCompactionSummary(summary) {
29
+ return `<${FENCE_TAG}>\n${FENCE_NOTE}\n\n${summary}\n</${FENCE_TAG}>`;
30
+ }
31
+ /**
32
+ * 发给模型的压缩指令。**追加在会话前缀的末尾**,前面逐字重放同一份 system
33
+ * prompt、同一份工具定义、同样的历史 —— 这样这次调用能命中 provider 的 warm
34
+ * prefix,只有这一条指令是新的。反过来(另起一个精简 prompt 去摘要)看着省
35
+ * token,实际是整个前缀重新计费。
36
+ *
37
+ * 八个小节照抄 dsh 那份(它跑过真实负载)改中文,另加两条我们自己必须有的:
38
+ * 「逐字保留用户的原话与纠正」和「已有 checkpoint 要合并而不是抄下来」——后者
39
+ * 不写死的话,每压缩一次 checkpoint 就长一截,最后它自己变成体积来源。
40
+ */
41
+ export const COMPACTION_INSTRUCTION = `请停下当前任务,不要回应上面的对话,也不要调用任何工具。
42
+
43
+ 把到目前为止的整段对话压缩成一份**交接说明**,让一个看不到原始对话的人能接手并无缝继续这项工作。
44
+
45
+ 按下列小节输出,每一节都用对话里出现过的具体名称、路径、标识符,不要写「某个文件」「相关配置」这类占位说法;某一节确实没有内容就写「无」。
46
+
47
+ 1. **用户的目标**:用户想达成什么,包括中途改变过的目标。
48
+ 2. **用户的原话与纠正**:逐字保留用户提出的关键要求、偏好与纠正意见。纠正尤其重要——那是最容易在压缩里丢掉、丢掉之后代价最大的东西(接手的人会把已经被否掉的做法再做一遍)。
49
+ 3. **已经完成的工作**:做了什么,结果是什么。
50
+ 4. **当前进行到哪一步**:正在做的事,以及做到什么程度。
51
+ 5. **涉及的文件与资源**:路径、id、名称,以及各自在这件事里的作用。
52
+ 6. **关键决定与理由**:为什么这么选,以及哪些方案被否决、因为什么。
53
+ 7. **遇到的问题**:出过什么错、怎么处理的、哪些还没解决。
54
+ 8. **下一步**:接手的人应该立刻做什么。
55
+
56
+ 硬性要求:
57
+
58
+ - 只输出这份说明本身。不要开场白、不要结束语,也不要提到「压缩」「摘要」这件事本身。
59
+ - 如果上面的对话里已经有一段 <${FENCE_TAG}>,那是更早一次的同类说明:把它和它之后发生的事**合并**成一份,保留仍然成立的内容、删掉已经过期或被推翻的内容。不要原样抄下来,也不要为它另起一节。
60
+ - 不要臆造对话里没有的信息。不确定的就写「不确定」。`;
61
+ /**
62
+ * 这份摘要能不能用。
63
+ *
64
+ * 两条,都不是形式检查:
65
+ *
66
+ * - **空的不能用**。模型可能压根没写文本(把工具定义当成了要调的东西、或者
67
+ * 整段产出都进了 reasoning)。拿空串当 checkpoint 落库,等于把那段历史直接
68
+ * 删了,而且删得悄无声息。
69
+ * - **不比源短就不能用**。压缩的全部意义是腾空间;一份和原文一样长的「摘要」
70
+ * 换进去,下一步照样超线,而我们已经为它付了一次全量请求的钱,还断了前缀
71
+ * 缓存。这种情况多半是模型把对话原样复述了一遍。
72
+ *
73
+ * 比的是字符数而不是 token:两边同一口径、只求相对大小(同
74
+ * `measureModelMessageChars`)。
75
+ */
76
+ export function judgeSummary(summary, sourceChars) {
77
+ const text = summary.trim();
78
+ if (text.length === 0) {
79
+ return { ok: false, reason: '模型没有产出任何文本' };
80
+ }
81
+ if (text.length >= sourceChars) {
82
+ return {
83
+ ok: false,
84
+ reason: `摘要不比源短(${text.length} ≥ ${sourceChars} 字符)`,
85
+ };
86
+ }
87
+ return { ok: true };
88
+ }
89
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/turn/compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,UAAU,GACd,qCAAqC;IACrC,+BAA+B,CAAC;AAElC;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,IAAI,SAAS,MAAM,UAAU,OAAO,OAAO,OAAO,SAAS,GAAG,CAAC;AACxE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;mBAkBnB,SAAS;4BACA,CAAC;AAQ7B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,WAAmB;IAEnB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;QAC/B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,MAAM,WAAW,MAAM;SACrD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 这个错误是不是「上下文超限」。
3
+ *
4
+ * 只认 `APICallError`:那是「请求真的发出去了、服务端明确拒绝了」。网络中断、
5
+ * JSON 解析失败之类的错误哪怕文案里恰好带这些词,也与上下文大小无关。
6
+ *
7
+ * 状态码不作为判据的必要条件——各家在 400 / 413 之间并不一致,而措辞本身已经
8
+ * 足够窄了。
9
+ */
10
+ export declare function isContextOverflowError(err: unknown): boolean;
11
+ //# sourceMappingURL=context-overflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-overflow.d.ts","sourceRoot":"","sources":["../../src/turn/context-overflow.ts"],"names":[],"mappings":"AAwCA;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAI5D"}
@@ -0,0 +1,53 @@
1
+ import { APICallError } from 'ai';
2
+ /**
3
+ * 「provider 说上下文装不下了」的归一化判据。
4
+ *
5
+ * 各家的措辞完全不同,而且都埋在一个 400 的 `responseBody` 里,没有任何一家给出
6
+ * 可判定的错误码。不认出它的后果不是「这一轮失败」那么轻——历史只会越读越长,
7
+ * 这个会话从此**每一次**发言都以同一条错误结束,而错误信息与真实原因毫无关系。
8
+ *
9
+ * **住在 agent-core 而不是 `modules/llm`**:判据的输入是 AI SDK 的 `APICallError`,
10
+ * 内核本来就依赖 `ai` 包;反过来依赖我们自己的 llm 领域模块才是内核该避开的
11
+ * (见 `LlmProviderOptions` 的注释)。
12
+ */
13
+ /**
14
+ * 各家的原话(都是 HTTP 400 的 body)。**逐条都对应一家真实的措辞**,别为了
15
+ * 「更保险」往里加宽泛的词:
16
+ *
17
+ * - `too many tokens` 会命中限流错误("Rate limit reached … tokens per min"),
18
+ * 那是等一会儿就好的事,拿它去压缩历史等于为一次限流永久丢掉一段对话。
19
+ * - 只写 `token limit` 会命中 `max_tokens` 参数非法之类的配置错误。
20
+ *
21
+ * 漏判的代价是「这一轮失败」(用户重发一次即可,且下一轮的阈值检查多半会自己
22
+ * 腾出空间);误判的代价是**无缘无故压掉一段历史**且不可逆。两边不对称,故宁可
23
+ * 窄。
24
+ */
25
+ const OVERFLOW_PATTERNS = [
26
+ // OpenAI 系(含大量兼容实现):错误码本身,以及那句 message。
27
+ /context_length_exceeded/i,
28
+ /maximum context length/i,
29
+ // Anthropic:`prompt is too long: 213000 tokens > 200000 maximum`
30
+ /prompt is too long/i,
31
+ // Moonshot / Kimi
32
+ /exceeded model token limit/i,
33
+ // 通义千问:`Range of input length should be [1, 129024]`
34
+ /range of input length/i,
35
+ // 部分兼容实现给的建议句
36
+ /reduce the length of the messages/i,
37
+ ];
38
+ /**
39
+ * 这个错误是不是「上下文超限」。
40
+ *
41
+ * 只认 `APICallError`:那是「请求真的发出去了、服务端明确拒绝了」。网络中断、
42
+ * JSON 解析失败之类的错误哪怕文案里恰好带这些词,也与上下文大小无关。
43
+ *
44
+ * 状态码不作为判据的必要条件——各家在 400 / 413 之间并不一致,而措辞本身已经
45
+ * 足够窄了。
46
+ */
47
+ export function isContextOverflowError(err) {
48
+ if (!APICallError.isInstance(err))
49
+ return false;
50
+ const haystack = `${err.message}\n${err.responseBody ?? ''}`;
51
+ return OVERFLOW_PATTERNS.some(p => p.test(haystack));
52
+ }
53
+ //# sourceMappingURL=context-overflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-overflow.js","sourceRoot":"","sources":["../../src/turn/context-overflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,iBAAiB,GAAa;IAClC,wCAAwC;IACxC,0BAA0B;IAC1B,yBAAyB;IACzB,iEAAiE;IACjE,qBAAqB;IACrB,kBAAkB;IAClB,6BAA6B;IAC7B,qDAAqD;IACrD,wBAAwB;IACxB,cAAc;IACd,oCAAoC;CACrC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;IAC7D,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,100 @@
1
+ import type { ModelMessage, ToolSet } from 'ai';
2
+ /**
3
+ * 一次「真要调模型」那一刻的上下文压力观测值,由内核测、交给宿主判断。
4
+ *
5
+ * **内核不认识阈值、模型容量、也不认识库**:它只知道 provider 上一步报了多少
6
+ * input token、以及那之后又往 `messages` 里追加了多少字符。要不要腾空间、腾到
7
+ * 哪儿,全是宿主(`agent-chat`)的事。
8
+ */
9
+ export interface ContextPressure {
10
+ /**
11
+ * 上一步 provider 报的**真实** `inputTokens` —— 我们不需要像别家那样用启发式
12
+ * 估上下文大小,provider 每一步都把准确数字告诉了我们。
13
+ *
14
+ * `null` = 本轮还没调过模型(宿主此时该退回跨轮基线,见
15
+ * `ContextBudgetTracker`)。**跨轮基线是另一个数**(`TurnResult.contextTokens`
16
+ * = 末步 input + 末步 output):那条回复已经在轮初的历史快照里了,而这里的
17
+ * `charsSinceLastStep` 是从 `loadContext` 之后才开始数的,补不到它。轮内则相反
18
+ * ——本步的产出会被 `charsSinceLastStep` 数进去,所以这里必须是**纯 input**,
19
+ * 加上 output 就是重复计。
20
+ *
21
+ * **不能拿落库的 `chat_message.tokenUsage.inputTokens` 当这个值**:`addUsage`
22
+ * 逐键求和,那一列是整轮各 step 的 input **之和**(增量落库那条路上
23
+ * `onAssistantStep` 压根没接 usage 参数,落库的只有 `usageAcc`)。
24
+ *
25
+ * 单步轮次两者相等,**多步轮次按步数放大**——真库取证,同一会话相邻两轮:
26
+ * 单步那轮 18,488,紧接着 6 个 tool-call 的那轮 91,104(4.9×,按同会话单步值
27
+ * 反推是 4–5 步 × 每步 18–23k)。危险的正是这种轮次:一个工具密集的 tick 之后,
28
+ * 下一轮开头会拿着一个放大数倍的基线,在远未接近容量时就开始裁剪。
29
+ */
30
+ lastStepInputTokens: number | null;
31
+ /**
32
+ * 上一次测量之后追加进 `messages` 的字符数(工具结果、drain 进来的消息、本步
33
+ * 产出的文本)。宿主按 `chars / 4` 折成 token 补在基线上。
34
+ *
35
+ * 这个折算对中文是**低估**的(一个汉字往往就是一个 token),方向是「晚一点
36
+ * 触发」而不是「早触发」:下一步 provider 报回真实值时会立刻纠正,阈值本身又
37
+ * 留了 20% 余量,真撞爆还有溢出补救兜底。反过来高估会让长会话无谓地反复裁剪,
38
+ * 每裁一次断一次前缀缓存。
39
+ */
40
+ charsSinceLastStep: number;
41
+ /**
42
+ * **此刻正要发出去的那份请求**。宿主腾不出空间、要改走压缩时,摘要那一次调用
43
+ * 就逐字重放它——同一份 instructions、同一份工具定义、同样的历史,**只在末尾
44
+ * 追加一条压缩指令**。
45
+ *
46
+ * 这样摘要请求能命中 provider 的 warm prefix,未命中的只有最后那条指令。反过来
47
+ * (另起一个精简 prompt 去摘要)看着省 token,实际是把整个前缀重新计费一遍,
48
+ * 而压缩恰恰发生在前缀最长的时候。
49
+ *
50
+ * 内核把这三样原样递出去,**不解释也不重组**:它不知道宿主会不会用、用来干
51
+ * 什么。`tools` 一并给是因为工具定义也在序列化后的前缀里,少给一样就不是同一个
52
+ * 前缀了。
53
+ */
54
+ request: {
55
+ system: string;
56
+ messages: readonly ModelMessage[];
57
+ tools: ToolSet;
58
+ /** 本轮的中断信号——压缩是一次完整的模型调用,用户按停止时它也该停。 */
59
+ abortSignal?: AbortSignal;
60
+ };
61
+ /**
62
+ * **provider 刚刚已经拒了这个请求**(上下文装不下)。
63
+ *
64
+ * 为真时宿主要跳过一切阈值判断直接腾空间:阈值是我们对「快满了」的猜测,而这
65
+ * 一刻已经不是猜测了 —— 它替我们判定了必要性,也顺带覆盖了「模型没填
66
+ * `max_context_tokens`、平时压根不主动裁」的那一类会话。
67
+ *
68
+ * 腾不出来时宿主返回 null,内核随即把 provider 的原始错误原样抛出。**不允许
69
+ * 「没推进也重试」**:那是一个原地打转的重试环,每转一圈都是一次全量请求。
70
+ */
71
+ overflowed?: boolean;
72
+ }
73
+ /**
74
+ * 宿主腾出空间的结果:用 `head` 替换掉 `messages` 开头的 `replaces` 条。
75
+ *
76
+ * **两级腾法共用这一个返回形状**:裁剪时 `head.length === replaces`(只换
77
+ * tool-result 的正文,条数不变),压缩时 `head` 只有一条 checkpoint、`replaces`
78
+ * 是它顶掉的那一整段。内核对这个差别一无所知,splice 一句话通吃。
79
+ *
80
+ * **只替换头部、绝不重新投影整个数组**:`messages` 的尾部有 drain 进来的消息,
81
+ * 那些在内存里用的是 `modelParts`(子 Agent 回执的围栏形态),与落库的 `parts`
82
+ * 不同 —— 重新查库投影一遍会把围栏静默抹掉。
83
+ *
84
+ * 对齐成立的理由:`messages` 一开始就是「轮初那批行的投影」,之后所有追加都在
85
+ * 尾部,所以头部前缀与那批行的投影逐字对应。
86
+ */
87
+ export interface ContextRelief {
88
+ head: ModelMessage[];
89
+ /** 被 `head` 替换掉的原头部条数。 */
90
+ replaces: number;
91
+ }
92
+ /**
93
+ * `messages` 的字符规模。只用于取**差值**(见 `charsSinceLastStep`),所以
94
+ * 逐 part 序列化带来的那点结构开销是常量、会在相减时抵消掉,不必精确。
95
+ *
96
+ * 刻意不 `JSON.stringify(messages)` 一把梭:长会话的历史是 MB 级,每步造一个
97
+ * 那么大的临时字符串没必要。
98
+ */
99
+ export declare function measureModelMessageChars(messages: ModelMessage[]): number;
100
+ //# sourceMappingURL=context-pressure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-pressure.d.ts","sourceRoot":"","sources":["../../src/turn/context-pressure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;;;;;;;OAQG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC;QACf,wCAAwC;QACxC,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,CAAC;IACF;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAYzE"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `messages` 的字符规模。只用于取**差值**(见 `charsSinceLastStep`),所以
3
+ * 逐 part 序列化带来的那点结构开销是常量、会在相减时抵消掉,不必精确。
4
+ *
5
+ * 刻意不 `JSON.stringify(messages)` 一把梭:长会话的历史是 MB 级,每步造一个
6
+ * 那么大的临时字符串没必要。
7
+ */
8
+ export function measureModelMessageChars(messages) {
9
+ let total = 0;
10
+ for (const m of messages) {
11
+ if (typeof m.content === 'string') {
12
+ total += m.content.length;
13
+ continue;
14
+ }
15
+ for (const part of m.content) {
16
+ total += JSON.stringify(part)?.length ?? 0;
17
+ }
18
+ }
19
+ return total;
20
+ }
21
+ //# sourceMappingURL=context-pressure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-pressure.js","sourceRoot":"","sources":["../../src/turn/context-pressure.ts"],"names":[],"mappings":"AA8FA;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAwB;IAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAClC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC7B,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AgentEvent } from '../schema/agent-event.js';
2
+ import type { AgentRunStepEntry } from '../schema/index.js';
3
+ /**
4
+ * 事件流 → 步级明细。**只取属于该 runId 的事件** ——
5
+ * 子 agent 与父同流,必须按 runId 切分。
6
+ */
7
+ export declare function eventsToSteps(events: readonly AgentEvent[], runId: string): AgentRunStepEntry[];
8
+ //# sourceMappingURL=events-to-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-to-steps.d.ts","sourceRoot":"","sources":["../../src/turn/events-to-steps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,UAAU,EAAE,EAC7B,KAAK,EAAE,MAAM,GACZ,iBAAiB,EAAE,CA6DrB"}
@@ -0,0 +1,64 @@
1
+ import { flattenUsage } from './usage.js';
2
+ /**
3
+ * 事件流 → 步级明细。**只取属于该 runId 的事件** ——
4
+ * 子 agent 与父同流,必须按 runId 切分。
5
+ */
6
+ export function eventsToSteps(events, runId) {
7
+ const mine = events.filter(e => e.runId === runId);
8
+ const steps = [];
9
+ let text = '';
10
+ let calls = [];
11
+ const byCallId = new Map();
12
+ const flush = (usage) => {
13
+ if (!text && calls.length === 0 && !usage)
14
+ return;
15
+ steps.push({
16
+ index: steps.length,
17
+ text: text || undefined,
18
+ toolCalls: calls,
19
+ usage,
20
+ });
21
+ text = '';
22
+ calls = [];
23
+ byCallId.clear();
24
+ };
25
+ for (const e of mine) {
26
+ const p = e.payload;
27
+ switch (e.type) {
28
+ case 'text-delta':
29
+ text += typeof p.text === 'string' ? p.text : '';
30
+ break;
31
+ case 'tool-call': {
32
+ const entry = {
33
+ toolCallId: String(p.toolCallId),
34
+ toolName: String(p.toolName),
35
+ input: p.input,
36
+ };
37
+ calls.push(entry);
38
+ byCallId.set(entry.toolCallId, entry);
39
+ break;
40
+ }
41
+ case 'tool-result': {
42
+ const entry = byCallId.get(String(p.toolCallId));
43
+ if (entry) {
44
+ entry.output = p.output;
45
+ const out = p.output;
46
+ entry.ok = !(out !== null &&
47
+ typeof out === 'object' &&
48
+ out.ok === false);
49
+ }
50
+ break;
51
+ }
52
+ case 'step-finish':
53
+ // 与累加路径同一套拍平:步级明细里也该看得见缓存命中,见 usage.ts。
54
+ flush(flattenUsage(p.usage));
55
+ break;
56
+ default:
57
+ break;
58
+ }
59
+ }
60
+ // 尾部未收到 step-finish 的残步也要落(中断场景)。
61
+ flush();
62
+ return steps;
63
+ }
64
+ //# sourceMappingURL=events-to-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-to-steps.js","sourceRoot":"","sources":["../../src/turn/events-to-steps.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA6B,EAC7B,KAAa;IAEb,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACnD,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,GAAmC,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkD,CAAC;IAE3E,MAAM,KAAK,GAAG,CAAC,KAA8B,EAAE,EAAE;QAC/C,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAClD,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,IAAI,SAAS;YACvB,SAAS,EAAE,KAAK;YAChB,KAAK;SACN,CAAC,CAAC;QACH,IAAI,GAAG,EAAE,CAAC;QACV,KAAK,GAAG,EAAE,CAAC;QACX,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAkC,CAAC;QAC/C,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,YAAY;gBACf,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,MAAM;YACR,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,KAAK,GAAG;oBACZ,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;oBAChC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC5B,KAAK,EAAE,CAAC,CAAC,KAAK;iBACf,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBACtC,MAAM;YACR,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;gBACjD,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;oBACxB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAiC,CAAC;oBAChD,KAAK,CAAC,EAAE,GAAG,CAAC,CACV,GAAG,KAAK,IAAI;wBACZ,OAAO,GAAG,KAAK,QAAQ;wBACvB,GAAG,CAAC,EAAE,KAAK,KAAK,CACjB,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,aAAa;gBAChB,wCAAwC;gBACxC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7B,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IACD,kCAAkC;IAClC,KAAK,EAAE,CAAC;IACR,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,17 @@
1
+ export { AgentRuntime, type AgentRuntimeDeps } from './agent-runtime.js';
2
+ export { COMPACTION_INSTRUCTION, judgeSummary, type SummaryVerdict, wrapCompactionSummary, } from './compaction.js';
3
+ export { isContextOverflowError } from './context-overflow.js';
4
+ export { type ContextPressure, type ContextRelief, measureModelMessageChars, } from './context-pressure.js';
5
+ export { eventsToSteps } from './events-to-steps.js';
6
+ export { previewJson, TOOL_INPUT_PREVIEW_LIMIT } from './json-preview.js';
7
+ export { createRepeatCallChain, escapeLoopReminderFence, LOOP_REMINDER_THRESHOLDS, renderLoopAdvice, type RepeatCallChain, stableToolInputKey, wrapSystemReminder, } from './loop-reminder.js';
8
+ export { replaceNul } from './nul-safe.js';
9
+ export { partsFromEventBuffer, partsFromEventBufferWithBoundary, type PartsTail, } from './parts-from-events.js';
10
+ export { IMAGE_REFERENCE_KEY, imageFilePart, partsToModelMessages, type ProjectionOptions, renderPrunedToolOutput, type StoredMessage, toolResultOutput, withSystemNote, } from './parts-to-model-messages.js';
11
+ export { hasPendingWork } from './pending-work.js';
12
+ export { describeErrorChain, describeProviderError, isTransportError, unwrapInferenceError, } from './provider-error.js';
13
+ export type { DrainedTurnMessage, TurnEnvelope, TurnHost, TurnResult, TurnStatus, } from './turn-envelope.js';
14
+ export { createTurnJournal, type TurnJournal, type TurnJournalDeps, } from './turn-journal.js';
15
+ export { abortableSleep, type AgentDefinition, type LlmHandles, type LlmProviderOptions, MAX_TRANSPORT_RETRIES, type RunTurnArgs, transportRetryBackoffMs, TurnRun, type TurnRunDeps, } from './turn-run.js';
16
+ export { addUsage, flattenUsage } from './usage.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/turn/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,KAAK,cAAc,EACnB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,eAAe,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,gCAAgC,EAChC,KAAK,SAAS,GACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,sBAAsB,EACtB,KAAK,aAAa,EAClB,gBAAgB,EAChB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,qBAAqB,EACrB,KAAK,WAAW,EAChB,uBAAuB,EACvB,OAAO,EACP,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,16 @@
1
+ export { AgentRuntime } from './agent-runtime.js';
2
+ export { COMPACTION_INSTRUCTION, judgeSummary, wrapCompactionSummary, } from './compaction.js';
3
+ export { isContextOverflowError } from './context-overflow.js';
4
+ export { measureModelMessageChars, } from './context-pressure.js';
5
+ export { eventsToSteps } from './events-to-steps.js';
6
+ export { previewJson, TOOL_INPUT_PREVIEW_LIMIT } from './json-preview.js';
7
+ export { createRepeatCallChain, escapeLoopReminderFence, LOOP_REMINDER_THRESHOLDS, renderLoopAdvice, stableToolInputKey, wrapSystemReminder, } from './loop-reminder.js';
8
+ export { replaceNul } from './nul-safe.js';
9
+ export { partsFromEventBuffer, partsFromEventBufferWithBoundary, } from './parts-from-events.js';
10
+ export { IMAGE_REFERENCE_KEY, imageFilePart, partsToModelMessages, renderPrunedToolOutput, toolResultOutput, withSystemNote, } from './parts-to-model-messages.js';
11
+ export { hasPendingWork } from './pending-work.js';
12
+ export { describeErrorChain, describeProviderError, isTransportError, unwrapInferenceError, } from './provider-error.js';
13
+ export { createTurnJournal, } from './turn-journal.js';
14
+ export { abortableSleep, MAX_TRANSPORT_RETRIES, transportRetryBackoffMs, TurnRun, } from './turn-run.js';
15
+ export { addUsage, flattenUsage } from './usage.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/turn/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,YAAY,EAEZ,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAGL,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAEhB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,gCAAgC,GAEjC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EAEpB,sBAAsB,EAEtB,gBAAgB,EAChB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAQ7B,OAAO,EACL,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EAId,qBAAqB,EAErB,uBAAuB,EACvB,OAAO,GAER,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 工具入参的短预览:「这次调用长什么样」给模型看一眼就够,正文体积不能跟着来。
3
+ *
4
+ * **两个消费方**:裁剪存根(`renderPrunedToolOutput`——结果被移出上下文后,参数
5
+ * 是模型判断「要不要重跑」的全部依据)与重复调用提醒(`loop-reminder.ts`——劝告
6
+ * 里得说清是哪次调用在重复)。两处要的是同一件事,措辞也该一样:模型会在同一段
7
+ * 历史里同时读到它们,同一个调用长成两副样子只会让它多猜一轮。
8
+ */
9
+ /** 预览上限(**码点**,不是 UTF-16 长度)。 */
10
+ export declare const TOOL_INPUT_PREVIEW_LIMIT = 160;
11
+ /**
12
+ * 任意值 → 一行短 JSON 预览。
13
+ *
14
+ * 三条都不是形式主义:
15
+ * - `JSON.stringify(undefined)` 返回的是 `undefined` 而**不是**抛错,直接拼进
16
+ * 模板就成了字面量 `"undefined"`,读起来像模型真传了这么个参数。
17
+ * - 序列化失败(循环引用等)绝不能炸掉整轮对话——这里产出的只是一段给模型看的
18
+ * 提示文字。
19
+ * - 按**码点**切,别用 `.slice()` 劈开代理对(同技能索引那条判据)。
20
+ */
21
+ export declare function previewJson(value: unknown, limit?: number): string;
22
+ //# sourceMappingURL=json-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-preview.d.ts","sourceRoot":"","sources":["../../src/turn/json-preview.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,iCAAiC;AACjC,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,MAAiC,GACvC,MAAM,CAUR"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 工具入参的短预览:「这次调用长什么样」给模型看一眼就够,正文体积不能跟着来。
3
+ *
4
+ * **两个消费方**:裁剪存根(`renderPrunedToolOutput`——结果被移出上下文后,参数
5
+ * 是模型判断「要不要重跑」的全部依据)与重复调用提醒(`loop-reminder.ts`——劝告
6
+ * 里得说清是哪次调用在重复)。两处要的是同一件事,措辞也该一样:模型会在同一段
7
+ * 历史里同时读到它们,同一个调用长成两副样子只会让它多猜一轮。
8
+ */
9
+ /** 预览上限(**码点**,不是 UTF-16 长度)。 */
10
+ export const TOOL_INPUT_PREVIEW_LIMIT = 160;
11
+ /**
12
+ * 任意值 → 一行短 JSON 预览。
13
+ *
14
+ * 三条都不是形式主义:
15
+ * - `JSON.stringify(undefined)` 返回的是 `undefined` 而**不是**抛错,直接拼进
16
+ * 模板就成了字面量 `"undefined"`,读起来像模型真传了这么个参数。
17
+ * - 序列化失败(循环引用等)绝不能炸掉整轮对话——这里产出的只是一段给模型看的
18
+ * 提示文字。
19
+ * - 按**码点**切,别用 `.slice()` 劈开代理对(同技能索引那条判据)。
20
+ */
21
+ export function previewJson(value, limit = TOOL_INPUT_PREVIEW_LIMIT) {
22
+ let json;
23
+ try {
24
+ json = JSON.stringify(value) ?? '(无)';
25
+ }
26
+ catch {
27
+ json = '(无法序列化)';
28
+ }
29
+ const points = Array.from(json);
30
+ if (points.length <= limit)
31
+ return json;
32
+ return `${points.slice(0, limit).join('')}…`;
33
+ }
34
+ //# sourceMappingURL=json-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-preview.js","sourceRoot":"","sources":["../../src/turn/json-preview.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,iCAAiC;AACjC,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,QAAgB,wBAAwB;IAExC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;AAC/C,CAAC"}