@qjp88995/agent-runtime 0.0.0-stage → 0.1.0

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 +55 -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,59 @@
1
+ import { z } from 'zod';
2
+ import { AgentTool } from '../tools/agent-tool.base.js';
3
+ import type { ToolMeta } from '../tools/tool-meta.js';
4
+ import type { ToolRegistry } from '../tools/tool-registry.js';
5
+ import { type ToolOut } from '../tools/tool-result.js';
6
+ import { type TodoItem } from './todo-schema.js';
7
+ declare const InputSchema: z.ZodObject<{
8
+ todos: z.ZodArray<z.ZodObject<{
9
+ content: z.ZodString;
10
+ status: z.ZodEnum<{
11
+ pending: "pending";
12
+ completed: "completed";
13
+ in_progress: "in_progress";
14
+ }>;
15
+ }, z.core.$strip>>;
16
+ }, z.core.$strip>;
17
+ type Input = z.infer<typeof InputSchema>;
18
+ interface Out {
19
+ todos: TodoItem[];
20
+ }
21
+ /**
22
+ * 待办清单记账工具的登记信息。
23
+ *
24
+ * **它没有 service、不写任何表、没有副作用**——这次调用的入参就是清单本身的
25
+ * 存放处(判据全文见 `todo-schema.ts`)。所以 `run()` 里除了
26
+ * 一道守卫之外无事可做,这不是没写完。
27
+ *
28
+ * 它同时是第一个声明 `accounting: true` 的工具:记账不算「做了别的事」,
29
+ * 夹在两次相同调用中间不该打断重复调用链的计数(见 `runtime/loop-reminder.ts`)。
30
+ */
31
+ export declare const TODO_TOOL_META: ToolMeta;
32
+ /** 待办清单记账工具(原名见 `TODO_FORMER_NAMES`)。 */
33
+ export declare class TodoTool extends AgentTool<Input, Out> {
34
+ readonly inputSchema: z.ZodObject<{
35
+ todos: z.ZodArray<z.ZodObject<{
36
+ content: z.ZodString;
37
+ status: z.ZodEnum<{
38
+ pending: "pending";
39
+ completed: "completed";
40
+ in_progress: "in_progress";
41
+ }>;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>;
44
+ protected run(input: Input): Promise<ToolOut<Out>>;
45
+ /**
46
+ * 回执**只给一行计数,不复述整份清单**。
47
+ *
48
+ * 清单原文就在这次调用的入参里,模型下一步照样看得见;把它在输出里再抄一遍
49
+ * 是纯粹的重复计费。而这条回执本身还会在裁剪时被换成存根(入参不会),
50
+ * 所以复述的那份清单是活不过裁剪的那一份。
51
+ */
52
+ protected render(out: {
53
+ kind: 'ok';
54
+ } & Out): string;
55
+ }
56
+ /** 登记 `Todo`。 */
57
+ export declare function registerTodoTool(tools: ToolRegistry): TodoTool;
58
+ export {};
59
+ //# sourceMappingURL=todo.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo.tool.d.ts","sourceRoot":"","sources":["../../src/builtins/todo.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAC;AAE1B,QAAA,MAAM,WAAW;;;;;;;;;iBAIf,CAAC;AACH,KAAK,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEzC,UAAU,GAAG;IACX,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AASD;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,QAqB5B,CAAC;AAEF,yCAAyC;AACzC,qBAAa,QAAS,SAAQ,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;IACjD,QAAQ,CAAC,WAAW;;;;;;;;;sBAAe;IAEnC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAkBlD;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,GAAG,GAAG,MAAM;CAiCpD;AAED,iBAAiB;AACjB,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAI9D"}
@@ -0,0 +1,107 @@
1
+ import { z } from 'zod';
2
+ import { AgentTool } from '../tools/agent-tool.base.js';
3
+ import { TODO_FORMER_NAMES, TODO_TOOL_NAME } from '../tools/builtin-names.js';
4
+ import { toolError } from '../tools/tool-result.js';
5
+ import { TodoListSchema, } from './todo-schema.js';
6
+ const InputSchema = z.object({
7
+ todos: TodoListSchema.describe('完整的待办清单,按执行顺序排列。每次都要给全份——本次入参会整份取代上一份。'),
8
+ });
9
+ /** 状态 → 回执里的说法。清单本身的顺序不动,这只是计数时的分组名。 */
10
+ const STATUS_LABELS = {
11
+ in_progress: '进行中',
12
+ pending: '未开始',
13
+ completed: '已完成',
14
+ };
15
+ /**
16
+ * 待办清单记账工具的登记信息。
17
+ *
18
+ * **它没有 service、不写任何表、没有副作用**——这次调用的入参就是清单本身的
19
+ * 存放处(判据全文见 `todo-schema.ts`)。所以 `run()` 里除了
20
+ * 一道守卫之外无事可做,这不是没写完。
21
+ *
22
+ * 它同时是第一个声明 `accounting: true` 的工具:记账不算「做了别的事」,
23
+ * 夹在两次相同调用中间不该打断重复调用链的计数(见 `runtime/loop-reminder.ts`)。
24
+ */
25
+ export const TODO_TOOL_META = {
26
+ name: TODO_TOOL_NAME,
27
+ formerNames: TODO_FORMER_NAMES,
28
+ description: '把当前任务拆成一份待办清单,并在推进过程中随时更新它。多步骤、要跨很多次' +
29
+ '工具调用才能收尾的活儿用它记账:既让你自己不丢步骤,用户也能在界面上看到' +
30
+ '进度。**每次都要发完整清单**——只改一条的状态也要把其余各条一并带上,' +
31
+ '本次入参会整份取代上一份。' +
32
+ '**列清单之前先把要用户拍板的事问清**(范围、粒度、口径这类),或者自己定' +
33
+ '一个合理默认并写明;不要开工之后做到一半再回头问。' +
34
+ '**一条一条来**:开始做某一条时把它置 in_progress,这一条的正文写完就立刻' +
35
+ '再调一次把它置 completed、把下一条置 in_progress,然后才写下一条——' +
36
+ '不要把几条的内容写在同一段正文里再一起改状态;同一时刻至多一条 in_progress。' +
37
+ '**列了清单就意味着你会连续做完它**:做完一条紧接着做下一条,不要每完成' +
38
+ '一条就停下来问「要不要继续」——只有需要用户提供信息或做决定时才停,并说清' +
39
+ '在等什么。**结束回复之前必须结账**:正文交付的条目,正文写完就算做完,' +
40
+ '收尾前把它置 completed,不要留到用户下一句话再改。' +
41
+ '三两步就能答完的请求不必用它,为此记账反而更慢。',
42
+ category: 'system',
43
+ // 纯记账、零副作用 → 对重复调用链透明(见 `ToolMeta.accounting`)。
44
+ accounting: true,
45
+ };
46
+ /** 待办清单记账工具(原名见 `TODO_FORMER_NAMES`)。 */
47
+ export class TodoTool extends AgentTool {
48
+ inputSchema = InputSchema;
49
+ run(input) {
50
+ const running = input.todos.filter(t => t.status === 'in_progress');
51
+ // 至多一条「进行中」。**拒绝而不是替它挑一条**:多条并行进行中在界面上会让
52
+ // 「现在做到哪了」这个问题失去唯一答案,而模型实际上就是一次做一件事。
53
+ // 反过来**零条是合法的**——全部做完的那一次,以及刚列出计划还没动手的那
54
+ // 一次,都没有进行中的条目,把它也拦掉会逼出一条假的 in_progress。
55
+ if (running.length > 1) {
56
+ return Promise.resolve(toolError(`同一时刻至多一条待办可以是 in_progress,这次给了 ${running.length} 条:` +
57
+ `${running.map(t => t.content).join('、')}。` +
58
+ '挑一条正在做的置 in_progress,其余退回 pending。'));
59
+ }
60
+ return Promise.resolve({ kind: 'ok', todos: input.todos });
61
+ }
62
+ /**
63
+ * 回执**只给一行计数,不复述整份清单**。
64
+ *
65
+ * 清单原文就在这次调用的入参里,模型下一步照样看得见;把它在输出里再抄一遍
66
+ * 是纯粹的重复计费。而这条回执本身还会在裁剪时被换成存根(入参不会),
67
+ * 所以复述的那份清单是活不过裁剪的那一份。
68
+ */
69
+ render(out) {
70
+ if (out.todos.length === 0) {
71
+ return '待办清单已清空。';
72
+ }
73
+ const counts = new Map();
74
+ for (const t of out.todos) {
75
+ counts.set(t.status, (counts.get(t.status) ?? 0) + 1);
76
+ }
77
+ // 按 STATUS_LABELS 的键序(进行中 → 未开始 → 已完成)报,且**零的那档不报**
78
+ // ——「已完成 0 条」是噪音,而没有进行中的条目本就是合法状态。
79
+ const parts = Object.keys(STATUS_LABELS)
80
+ .filter(s => (counts.get(s) ?? 0) > 0)
81
+ .map(s => `${STATUS_LABELS[s]} ${counts.get(s) ?? 0}`);
82
+ const summary = `待办清单已更新,共 ${out.todos.length} 条(${parts.join(' / ')})。`;
83
+ // 有进行中的那条就顺带提一句结账。**放在回执里而不是只写在 description**:
84
+ // 模型读这句话的时刻恰好是它要动手做这条的前一刻,而 description 在几十轮
85
+ // 之前的 system prompt 里。真正的兜底在收尾时(`extensions/todo-settle.hook.ts`),
86
+ // 这句是零成本的那一层——它管用一次,就省下一整轮换轮。
87
+ const running = out.todos.find(t => t.status === 'in_progress');
88
+ if (!running)
89
+ return summary;
90
+ const remaining = out.todos.filter(t => t.status === 'pending').length;
91
+ // 还有没开始的就顺带说「接着做别问」:模型最常见的走样是做完一条停下来问
92
+ // 「要不要继续」(会话 621632d1),而它读这句话的时刻正是决定做完这条之后
93
+ // 干什么的时刻。
94
+ const next = remaining > 0
95
+ ? `更新完再写下一条(还有 ${remaining} 条没开始),一条一条来,不要停下来问要不要继续。`
96
+ : '';
97
+ return (`${summary}「${running.content}」进行中——只写这一条的内容,写完立刻` +
98
+ `再调一次 Todo 把它置 completed(用正文交付的也算做完)。${next}`);
99
+ }
100
+ }
101
+ /** 登记 `Todo`。 */
102
+ export function registerTodoTool(tools) {
103
+ const tool = new TodoTool();
104
+ tools.register(TODO_TOOL_META, tool);
105
+ return tool;
106
+ }
107
+ //# sourceMappingURL=todo.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo.tool.js","sourceRoot":"","sources":["../../src/builtins/todo.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ import { type ModelMessage } from 'ai';
2
+ import type { TurnHookRegistry } from '../hooks/turn-hook.registry.js';
3
+ import type { TurnContext, TurnHookImpl, TurnHookMeta } from '../hooks/turn-hook.types.js';
4
+ import type { ContextStore } from '../ports/context-store.js';
5
+ import { type Logger } from '../ports/logger.js';
6
+ import { type ContextPressure, type ContextRelief } from '../turn/context-pressure.js';
7
+ import { type ProjectionOptions } from '../turn/parts-to-model-messages.js';
8
+ import type { LlmHandles } from '../turn/turn-run.js';
9
+ /**
10
+ * 一个 tick 的上下文预算管家。
11
+ *
12
+ * **持有轮初那批行的快照,全程不再查库拿历史**。两条理由,都不是性能:
13
+ *
14
+ * 1. 「本轮已开的行不许进阴影区」——快照里根本没有本轮的行(`loadContext` 跑在
15
+ * 第一次 `drainInbox` 之前,本轮的用户消息那时还在 inbox 里),这条因此是
16
+ * 结构上成立的,不靠谁记得去判断。
17
+ * 2. 重新查库投影会把 drain 消息的**围栏**抹掉(内存里那些用的是 `modelParts`,
18
+ * 与落库的 `parts` 不同)。这也是 `ContextRelief` 只替换头部的原因。
19
+ */
20
+ export declare class ContextBudgetTracker {
21
+ private readonly deps;
22
+ private rows;
23
+ private storedRows;
24
+ private prunedUpto;
25
+ private compactedUpto;
26
+ /**
27
+ * 上一条还活着的 checkpoint 行的 seq(没有则 null)。
28
+ *
29
+ * 新的压缩切点**必须覆盖它**:留着它就会同时存在两份摘要,而投影层只提头一条,
30
+ * 另一条会按 seq 落在保留段中间——同一段历史被讲两遍,且其中一遍是过期的。
31
+ */
32
+ private checkpointSeq;
33
+ private baseline;
34
+ /** 已经报过一次「模型没填容量」的 warn,别每步刷一条。 */
35
+ private warnedNoCapacity;
36
+ /**
37
+ * 本 tick 已经尝试过几次压缩。
38
+ *
39
+ * **失败的也算**:一个不肯好好写摘要的模型,重试第三次多半还是那样,而每次
40
+ * 都是一整个上下文的全量请求 —— 空转的代价与真压缩一样贵。
41
+ */
42
+ private compactionAttempts;
43
+ constructor(deps: {
44
+ store: ContextStore;
45
+ logger: Logger;
46
+ sessionId: string;
47
+ /** 该模型的上下文窗口;null = 未知。 */
48
+ maxContextTokens: number | null;
49
+ /** 该模型的单次最大输出;null = 运营没填(见 `computeContextThreshold`)。 */
50
+ maxOutputTokens: number | null;
51
+ reserveFactor: number;
52
+ retainRatio: number;
53
+ /**
54
+ * 本轮所用的模型句柄与推理参数。**压缩刻意沿用本会话当前的模型**,不走
55
+ * `ai-feature` 那套「平台自己的小 LLM 调用」:换模型 = 前缀缓存全丢,把
56
+ * 「逐字重放前缀」那条设计的收益直接抵消掉。
57
+ */
58
+ llm: LlmHandles;
59
+ /**
60
+ * 投影时额外登记的提醒类行(`ProjectionOptions.reminderKinds`)。**宿主当轮注入
61
+ * 时怎么包,这里就得登记**,否则经 tracker 重放时它以裸用户文字喂给模型。
62
+ */
63
+ projection?: Pick<ProjectionOptions, 'reminderKinds' | 'toolNameAliases'>;
64
+ });
65
+ /** `TurnHost.loadContext`:投影出带裁剪与压缩的历史,同时留下本轮要用的快照。 */
66
+ load(): Promise<ModelMessage[]>;
67
+ /**
68
+ * 快照的投影,可选只取 `seq ≤ upto` 的那一段(算 `replaces` 用)。
69
+ *
70
+ * 收成一个方法而不是各处各写一次 `partsToModelMessages(...)`:**两个指针必须
71
+ * 一起传**,漏掉压缩指针那一处会把已经压掉的行重新投出来,而症状只是「压缩
72
+ * 好像没生效」。
73
+ *
74
+ * **checkpoint 行不受 `upto` 约束**:它的 seq 是全场最大的,而投影层把它提到了
75
+ * 历史最前面 —— `messages` 的头部因此是「checkpoint + 前 upto 条」。按 seq 卡掉
76
+ * 它,算出来的 `replaces` 就比真实头部少一条,splice 会把尾部整体错位一格。
77
+ */
78
+ private project;
79
+ /**
80
+ * 本轮的触发线。**也给前端**(经 `TurnResult.contextThreshold` 落进
81
+ * metadata)——界面上那个「快满了」的变色判据必须与这里同源,各写一个 0.8
82
+ * 的结果是界面说「还早」而日志里已经在裁了。
83
+ */
84
+ thresholdOf(maxContextTokens: number): number;
85
+ /** 本轮的触发线;容量未知时为 null(那时压根不做主动裁剪)。 */
86
+ get threshold(): number | null;
87
+ /**
88
+ * `beforeModelCall` 的正体:超阈值就腾空间,返回新的头部。
89
+ *
90
+ * **两级,顺序固定**:先裁剪(免模型、零成本、单次就能吃掉长会话的大头),
91
+ * 裁到头仍不够才压缩(要花一次全量请求)。免模型的路径永远该先跑,模型摘要
92
+ * 是兜底 —— 裁剪把压缩的触发频率压得很低正是期望的结果。
93
+ */
94
+ relieve(pressure: ContextPressure): Promise<ContextRelief | null>;
95
+ /**
96
+ * 还在上下文里的那段历史有多大(按 `字符数 / 4` 估)。
97
+ *
98
+ * **只在溢出补救那条路上用**:那时可能连模型窗口都不知道(`max_context_tokens`
99
+ * 没填),拿不到触发线,也就没有「触发线 × 保留比例」这个口径。用历史自己的
100
+ * 规模当分母是这种情况下唯一站得住的做法——刚刚撞爆过,所以它约等于窗口。
101
+ *
102
+ * 注意这是**原始行**的规模:裁剪已经把一部分正文换成存根了,故这是个高估,
103
+ * 方向是「多腾一点」。撞爆之后宁可多腾。
104
+ */
105
+ private estimatedHistoryTokens;
106
+ /**
107
+ * 尚未被压缩掉的那部分快照。**切点只能在这里面算** —— 已经压掉的行在模型眼里
108
+ * 不存在了,把它们算进保留预算会让预算凭空少一块,切点随之偏晚。
109
+ */
110
+ private survivingRows;
111
+ /** 第一级:把裁剪指针往前推。腾不动返回 null(交给压缩)。 */
112
+ private prune;
113
+ /**
114
+ * 第二级:让模型把前面那段历史写成一份交接说明,整段换成一条 checkpoint。
115
+ *
116
+ * **失败一律返回 null、不抛。** 主动的阈值检查里超线不等于撞爆,这一轮多半
117
+ * 照样发得出去;为了「上下文快满了」把一轮本来能成的对话打死,比什么都不做更
118
+ * 糟。真撞爆的那条路(溢出补救)自己会判定必要性——它拿到 null 就把 provider
119
+ * 的原始错误原样抛出,抛错的判断权在内核那一侧,不在这里。
120
+ */
121
+ private compact;
122
+ }
123
+ /**
124
+ * tracker 在 `TurnContext.turnState` 里的键。**导出**:宿主按它预置
125
+ * (`createContextBudgetTracker` 的用法示例),插件按它取用,两边分叉的症状是上下文预算
126
+ * 静默关闭——没有报错,只有会话在某一天撞爆 context window。
127
+ */
128
+ export declare const CONTEXT_BUDGET_TURN_STATE_KEY = "context-budget";
129
+ /** 宿主不给时的缺省参数(照抄 dsh 跑过真实负载的那一组)。 */
130
+ export declare const CONTEXT_BUDGET_DEFAULTS: {
131
+ /** 预留几倍的最大输出(见 `ThresholdInput.reserveFactor`)。 */
132
+ readonly reserveFactor: 1;
133
+ /** 腾空间时保留触发线的多大比例给最近的历史。 */
134
+ readonly retainRatio: 0.16;
135
+ };
136
+ /**
137
+ * 建本轮的 tracker。宿主在 `TurnHost` 里这样接:
138
+ *
139
+ * ```ts
140
+ * const budget = createContextBudgetTracker({ store, sessionId, llm, maxContextTokens, … });
141
+ * const host: TurnHost = {
142
+ * loadContext: () => budget.load(),
143
+ * turnState: new Map([[CONTEXT_BUDGET_TURN_STATE_KEY, budget]]),
144
+ * …
145
+ * };
146
+ * // 终态:budget.threshold 落进 metadata,界面的「快满了」与这里同源。
147
+ * ```
148
+ *
149
+ * **tracker 由宿主建、经 `turnState` 交给钩子**,钩子自己不建:它同时是
150
+ * `loadContext` 的投影源与终态 `contextThreshold` 的来源,三方必须是同一个实例;
151
+ * 且切点跑在第一次 drain 之后,那时懒建出来的快照会把本轮的用户消息算进可裁剪的
152
+ * 阴影区。
153
+ *
154
+ * 阈值参数在 agent-base 里走系统参数(只有真实负载上才知道合不合适,调它们不该
155
+ * 要一次发版);这里由宿主传入,宿主自己决定从哪读。
156
+ */
157
+ export declare function createContextBudgetTracker(opts: {
158
+ store: ContextStore;
159
+ sessionId: string;
160
+ llm: LlmHandles;
161
+ /** 该模型的上下文窗口;null = 未知(此时只做溢出补救、不主动腾)。 */
162
+ maxContextTokens: number | null;
163
+ /** 该模型的单次最大输出;null = 未知(按窗口 20% 假设)。 */
164
+ maxOutputTokens: number | null;
165
+ reserveFactor?: number;
166
+ retainRatio?: number;
167
+ logger?: Logger;
168
+ /** 宿主登记的提醒类行(见 `ProjectionOptions.reminderKinds`)。 */
169
+ projection?: Pick<ProjectionOptions, 'reminderKinds' | 'toolNameAliases'>;
170
+ }): ContextBudgetTracker;
171
+ export declare const CONTEXT_BUDGET_HOOK_META: TurnHookMeta;
172
+ /**
173
+ * 上下文预算的 `beforeModelCall` 钩子:取宿主预置的 tracker,把压力转给它。
174
+ *
175
+ * **单例点**——两个插件先后替换 `messages` 的头部,第二个看到的已经不是原始
176
+ * 历史,它算出的 `replaces` 对不上任何一段真实前缀。
177
+ */
178
+ export declare class ContextBudgetHook implements TurnHookImpl {
179
+ private readonly logger;
180
+ constructor(logger?: Logger);
181
+ beforeModelCall(ctx: TurnContext, pressure: ContextPressure): Promise<ContextRelief | null>;
182
+ }
183
+ /** 把上下文预算钩子挂到注册表上。 */
184
+ export declare function registerContextBudgetHook(hooks: TurnHookRegistry, logger?: Logger): void;
185
+ //# sourceMappingURL=context-budget-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-budget-tracker.d.ts","sourceRoot":"","sources":["../../src/context/context-budget-tracker.ts"],"names":[],"mappings":"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"}