@alvin0/ai-agent-sdk-core 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 (623) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/dist/agent/accounting/common.js +2 -0
  4. package/dist/agent/accounting/common.js.map +1 -0
  5. package/dist/agent/accounting/config.js +2 -0
  6. package/dist/agent/accounting/config.js.map +1 -0
  7. package/dist/agent/accounting/contracts.d.ts +36 -0
  8. package/dist/agent/accounting/contracts.d.ts.map +1 -0
  9. package/dist/agent/accounting/delivery/accounting-data.js +2 -0
  10. package/dist/agent/accounting/delivery/accounting-data.js.map +1 -0
  11. package/dist/agent/accounting/delivery/config.js +2 -0
  12. package/dist/agent/accounting/delivery/config.js.map +1 -0
  13. package/dist/agent/accounting/delivery/data.js +2 -0
  14. package/dist/agent/accounting/delivery/data.js.map +1 -0
  15. package/dist/agent/accounting/delivery/support-errors.js +2 -0
  16. package/dist/agent/accounting/delivery/support-errors.js.map +1 -0
  17. package/dist/agent/accounting/delivery/terminal.js +2 -0
  18. package/dist/agent/accounting/delivery/terminal.js.map +1 -0
  19. package/dist/agent/accounting/delivery-types.d.ts +43 -0
  20. package/dist/agent/accounting/delivery-types.d.ts.map +1 -0
  21. package/dist/agent/accounting/error.d.ts +18 -0
  22. package/dist/agent/accounting/error.d.ts.map +1 -0
  23. package/dist/agent/accounting/error.js +2 -0
  24. package/dist/agent/accounting/error.js.map +1 -0
  25. package/dist/agent/accounting/estimate.js +2 -0
  26. package/dist/agent/accounting/estimate.js.map +1 -0
  27. package/dist/agent/accounting/event-buffer.js +2 -0
  28. package/dist/agent/accounting/event-buffer.js.map +1 -0
  29. package/dist/agent/accounting/ledger.js +2 -0
  30. package/dist/agent/accounting/ledger.js.map +1 -0
  31. package/dist/agent/accounting/report.d.ts +70 -0
  32. package/dist/agent/accounting/report.d.ts.map +1 -0
  33. package/dist/agent/accounting/usage.d.ts +13 -0
  34. package/dist/agent/accounting/usage.d.ts.map +1 -0
  35. package/dist/agent/accounting/usage.js +2 -0
  36. package/dist/agent/accounting/usage.js.map +1 -0
  37. package/dist/agent/context/section.d.ts +15 -0
  38. package/dist/agent/context/section.d.ts.map +1 -0
  39. package/dist/agent/context/section.js +2 -0
  40. package/dist/agent/context/section.js.map +1 -0
  41. package/dist/agent/context/types.d.ts +98 -0
  42. package/dist/agent/context/types.d.ts.map +1 -0
  43. package/dist/agent/define/definition.d.ts +110 -0
  44. package/dist/agent/define/definition.d.ts.map +1 -0
  45. package/dist/agent/define/definition.js +2 -0
  46. package/dist/agent/define/definition.js.map +1 -0
  47. package/dist/agent/define/instructions.js +2 -0
  48. package/dist/agent/define/instructions.js.map +1 -0
  49. package/dist/agent/define/output-format.js +2 -0
  50. package/dist/agent/define/output-format.js.map +1 -0
  51. package/dist/agent/define/session/accounting.js +2 -0
  52. package/dist/agent/define/session/accounting.js.map +1 -0
  53. package/dist/agent/define/session/common.js +2 -0
  54. package/dist/agent/define/session/common.js.map +1 -0
  55. package/dist/agent/define/session/config.js +2 -0
  56. package/dist/agent/define/session/config.js.map +1 -0
  57. package/dist/agent/define/session/model-config.js +2 -0
  58. package/dist/agent/define/session/model-config.js.map +1 -0
  59. package/dist/agent/define/session/observer.js +2 -0
  60. package/dist/agent/define/session/observer.js.map +1 -0
  61. package/dist/agent/define/session/run-seal.js +2 -0
  62. package/dist/agent/define/session/run-seal.js.map +1 -0
  63. package/dist/agent/define/session/runtime-binding.js +2 -0
  64. package/dist/agent/define/session/runtime-binding.js.map +1 -0
  65. package/dist/agent/define/session/runtime-compaction.js +2 -0
  66. package/dist/agent/define/session/runtime-compaction.js.map +1 -0
  67. package/dist/agent/define/session/runtime-memory.js +2 -0
  68. package/dist/agent/define/session/runtime-memory.js.map +1 -0
  69. package/dist/agent/define/session/skills.js +2 -0
  70. package/dist/agent/define/session/skills.js.map +1 -0
  71. package/dist/agent/define/session/trace-accounting.js +2 -0
  72. package/dist/agent/define/session/trace-accounting.js.map +1 -0
  73. package/dist/agent/define/session/types.d.ts +217 -0
  74. package/dist/agent/define/session/types.d.ts.map +1 -0
  75. package/dist/agent/define/session/validation.js +2 -0
  76. package/dist/agent/define/session/validation.js.map +1 -0
  77. package/dist/agent/define/session.d.ts +77 -0
  78. package/dist/agent/define/session.d.ts.map +1 -0
  79. package/dist/agent/define/session.js +2 -0
  80. package/dist/agent/define/session.js.map +1 -0
  81. package/dist/agent/history/config.js +2 -0
  82. package/dist/agent/history/config.js.map +1 -0
  83. package/dist/agent/history/history.d.ts +33 -0
  84. package/dist/agent/history/history.d.ts.map +1 -0
  85. package/dist/agent/history/history.js +2 -0
  86. package/dist/agent/history/history.js.map +1 -0
  87. package/dist/agent/history/normalize.d.ts +7 -0
  88. package/dist/agent/history/normalize.d.ts.map +1 -0
  89. package/dist/agent/history/normalize.js +2 -0
  90. package/dist/agent/history/normalize.js.map +1 -0
  91. package/dist/agent/history/project.d.ts +14 -0
  92. package/dist/agent/history/project.d.ts.map +1 -0
  93. package/dist/agent/history/project.js +2 -0
  94. package/dist/agent/history/project.js.map +1 -0
  95. package/dist/agent/history/types.d.ts +85 -0
  96. package/dist/agent/history/types.d.ts.map +1 -0
  97. package/dist/agent/history/validation.js +2 -0
  98. package/dist/agent/history/validation.js.map +1 -0
  99. package/dist/agent/loop/events.d.ts +213 -0
  100. package/dist/agent/loop/events.d.ts.map +1 -0
  101. package/dist/agent/loop/queue.js +2 -0
  102. package/dist/agent/loop/queue.js.map +1 -0
  103. package/dist/agent/loop/run-turn.d.ts +8 -0
  104. package/dist/agent/loop/run-turn.d.ts.map +1 -0
  105. package/dist/agent/loop/run-turn.js +2 -0
  106. package/dist/agent/loop/run-turn.js.map +1 -0
  107. package/dist/agent/loop/schedule.d.ts +62 -0
  108. package/dist/agent/loop/schedule.d.ts.map +1 -0
  109. package/dist/agent/loop/schedule.js +3 -0
  110. package/dist/agent/loop/schedule.js.map +1 -0
  111. package/dist/agent/loop/turn/cancellation.js +2 -0
  112. package/dist/agent/loop/turn/cancellation.js.map +1 -0
  113. package/dist/agent/loop/turn/common.js +2 -0
  114. package/dist/agent/loop/turn/common.js.map +1 -0
  115. package/dist/agent/loop/turn/config.js +2 -0
  116. package/dist/agent/loop/turn/config.js.map +1 -0
  117. package/dist/agent/loop/turn/content.js +4 -0
  118. package/dist/agent/loop/turn/content.js.map +1 -0
  119. package/dist/agent/loop/turn/hooks.js +2 -0
  120. package/dist/agent/loop/turn/hooks.js.map +1 -0
  121. package/dist/agent/loop/turn/model-round.js +2 -0
  122. package/dist/agent/loop/turn/model-round.js.map +1 -0
  123. package/dist/agent/loop/turn/repetition.js +2 -0
  124. package/dist/agent/loop/turn/repetition.js.map +1 -0
  125. package/dist/agent/loop/turn/types.d.ts +82 -0
  126. package/dist/agent/loop/turn/types.d.ts.map +1 -0
  127. package/dist/agent/loop/turn/usage-stop.js +2 -0
  128. package/dist/agent/loop/turn/usage-stop.js.map +1 -0
  129. package/dist/agent/loop/turn/validation.js +2 -0
  130. package/dist/agent/loop/turn/validation.js.map +1 -0
  131. package/dist/agent/loop/types.d.ts +82 -0
  132. package/dist/agent/loop/types.d.ts.map +1 -0
  133. package/dist/agent/memory/accounting-binding.js +2 -0
  134. package/dist/agent/memory/accounting-binding.js.map +1 -0
  135. package/dist/agent/memory/compaction-config.d.ts +63 -0
  136. package/dist/agent/memory/compaction-config.d.ts.map +1 -0
  137. package/dist/agent/memory/compaction-config.js +2 -0
  138. package/dist/agent/memory/compaction-config.js.map +1 -0
  139. package/dist/agent/memory/compaction.d.ts +62 -0
  140. package/dist/agent/memory/compaction.d.ts.map +1 -0
  141. package/dist/agent/memory/compaction.js +6 -0
  142. package/dist/agent/memory/compaction.js.map +1 -0
  143. package/dist/agent/memory/memory.d.ts +61 -0
  144. package/dist/agent/memory/memory.d.ts.map +1 -0
  145. package/dist/agent/memory/memory.js +5 -0
  146. package/dist/agent/memory/memory.js.map +1 -0
  147. package/dist/agent/memory/persistence-types.d.ts +44 -0
  148. package/dist/agent/memory/persistence-types.d.ts.map +1 -0
  149. package/dist/agent/memory/surface-compaction.d.ts +6 -0
  150. package/dist/agent/memory/surface-compaction.d.ts.map +1 -0
  151. package/dist/agent/memory/surface-compaction.js +4 -0
  152. package/dist/agent/memory/surface-compaction.js.map +1 -0
  153. package/dist/agent/memory/token-estimator.d.ts +12 -0
  154. package/dist/agent/memory/token-estimator.d.ts.map +1 -0
  155. package/dist/agent/memory/token-estimator.js +2 -0
  156. package/dist/agent/memory/token-estimator.js.map +1 -0
  157. package/dist/agent/mode/run-agent.d.ts +79 -0
  158. package/dist/agent/mode/run-agent.d.ts.map +1 -0
  159. package/dist/agent/mode/run-agent.js +4 -0
  160. package/dist/agent/mode/run-agent.js.map +1 -0
  161. package/dist/agent/mode/user-input.d.ts +61 -0
  162. package/dist/agent/mode/user-input.d.ts.map +1 -0
  163. package/dist/agent/mode/user-input.js +2 -0
  164. package/dist/agent/mode/user-input.js.map +1 -0
  165. package/dist/agent/skill/catalog.d.ts +53 -0
  166. package/dist/agent/skill/catalog.d.ts.map +1 -0
  167. package/dist/agent/skill/catalog.js +2 -0
  168. package/dist/agent/skill/catalog.js.map +1 -0
  169. package/dist/agent/skill/definition.d.ts +106 -0
  170. package/dist/agent/skill/definition.d.ts.map +1 -0
  171. package/dist/agent/skill/definition.js +2 -0
  172. package/dist/agent/skill/definition.js.map +1 -0
  173. package/dist/agent/skill/provider/config.d.ts +11 -0
  174. package/dist/agent/skill/provider/config.d.ts.map +1 -0
  175. package/dist/agent/skill/provider/config.js +2 -0
  176. package/dist/agent/skill/provider/config.js.map +1 -0
  177. package/dist/agent/skill/provider/context.js +2 -0
  178. package/dist/agent/skill/provider/context.js.map +1 -0
  179. package/dist/agent/skill/provider/definition.d.ts +6 -0
  180. package/dist/agent/skill/provider/definition.d.ts.map +1 -0
  181. package/dist/agent/skill/provider/definition.js +2 -0
  182. package/dist/agent/skill/provider/definition.js.map +1 -0
  183. package/dist/agent/skill/provider/snapshot.js +2 -0
  184. package/dist/agent/skill/provider/snapshot.js.map +1 -0
  185. package/dist/agent/skill/provider/types.d.ts +49 -0
  186. package/dist/agent/skill/provider/types.d.ts.map +1 -0
  187. package/dist/agent/skill/tools.d.ts +45 -0
  188. package/dist/agent/skill/tools.d.ts.map +1 -0
  189. package/dist/agent/skill/tools.js +14 -0
  190. package/dist/agent/skill/tools.js.map +1 -0
  191. package/dist/agent/team/common.d.ts +26 -0
  192. package/dist/agent/team/common.d.ts.map +1 -0
  193. package/dist/agent/team/common.js +2 -0
  194. package/dist/agent/team/common.js.map +1 -0
  195. package/dist/agent/team/composed.d.ts +45 -0
  196. package/dist/agent/team/composed.d.ts.map +1 -0
  197. package/dist/agent/team/composed.js +2 -0
  198. package/dist/agent/team/composed.js.map +1 -0
  199. package/dist/agent/team/contracts.d.ts +54 -0
  200. package/dist/agent/team/contracts.d.ts.map +1 -0
  201. package/dist/agent/team/managed.d.ts +527 -0
  202. package/dist/agent/team/managed.d.ts.map +1 -0
  203. package/dist/agent/team/managed.js +4 -0
  204. package/dist/agent/team/managed.js.map +1 -0
  205. package/dist/agent/team/team.d.ts +142 -0
  206. package/dist/agent/team/team.d.ts.map +1 -0
  207. package/dist/agent/team/team.js +2 -0
  208. package/dist/agent/team/team.js.map +1 -0
  209. package/dist/agent/team/types.d.ts +170 -0
  210. package/dist/agent/team/types.d.ts.map +1 -0
  211. package/dist/agent/tool/approval.d.ts +106 -0
  212. package/dist/agent/tool/approval.d.ts.map +1 -0
  213. package/dist/agent/tool/approval.js +2 -0
  214. package/dist/agent/tool/approval.js.map +1 -0
  215. package/dist/agent/tool/capture.js +2 -0
  216. package/dist/agent/tool/capture.js.map +1 -0
  217. package/dist/agent/tool/config.js +2 -0
  218. package/dist/agent/tool/config.js.map +1 -0
  219. package/dist/agent/tool/definition.d.ts +227 -0
  220. package/dist/agent/tool/definition.d.ts.map +1 -0
  221. package/dist/agent/tool/definition.js +2 -0
  222. package/dist/agent/tool/definition.js.map +1 -0
  223. package/dist/agent/tool/errors.d.ts +82 -0
  224. package/dist/agent/tool/errors.d.ts.map +1 -0
  225. package/dist/agent/tool/errors.js +2 -0
  226. package/dist/agent/tool/errors.js.map +1 -0
  227. package/dist/agent/tool/execution.d.ts +60 -0
  228. package/dist/agent/tool/execution.d.ts.map +1 -0
  229. package/dist/agent/tool/execution.js +2 -0
  230. package/dist/agent/tool/execution.js.map +1 -0
  231. package/dist/agent/tool/output-budget.d.ts +159 -0
  232. package/dist/agent/tool/output-budget.d.ts.map +1 -0
  233. package/dist/agent/tool/output-budget.js +3 -0
  234. package/dist/agent/tool/output-budget.js.map +1 -0
  235. package/dist/agent/tool/pipeline.d.ts +98 -0
  236. package/dist/agent/tool/pipeline.d.ts.map +1 -0
  237. package/dist/agent/tool/pipeline.js +4 -0
  238. package/dist/agent/tool/pipeline.js.map +1 -0
  239. package/dist/agent/tool/registry.d.ts +70 -0
  240. package/dist/agent/tool/registry.d.ts.map +1 -0
  241. package/dist/agent/tool/registry.js +2 -0
  242. package/dist/agent/tool/registry.js.map +1 -0
  243. package/dist/agent/tool/schema.d.ts +12 -0
  244. package/dist/agent/tool/schema.d.ts.map +1 -0
  245. package/dist/agent/tool/schema.js +2 -0
  246. package/dist/agent/tool/schema.js.map +1 -0
  247. package/dist/agent/tool/source-types.d.ts +25 -0
  248. package/dist/agent/tool/source-types.d.ts.map +1 -0
  249. package/dist/agent/trace/trace.d.ts +63 -0
  250. package/dist/agent/trace/trace.d.ts.map +1 -0
  251. package/dist/agent/trace/trace.js +2 -0
  252. package/dist/agent/trace/trace.js.map +1 -0
  253. package/dist/agent.d.ts +52 -0
  254. package/dist/agent.js +1 -0
  255. package/dist/async/settlement.d.ts +6 -0
  256. package/dist/async/settlement.d.ts.map +1 -0
  257. package/dist/async/settlement.js +2 -0
  258. package/dist/async/settlement.js.map +1 -0
  259. package/dist/capability/common/config.js +2 -0
  260. package/dist/capability/common/config.js.map +1 -0
  261. package/dist/capability/common/data.js +2 -0
  262. package/dist/capability/common/data.js.map +1 -0
  263. package/dist/composition/agent/author.d.ts +12 -0
  264. package/dist/composition/agent/author.d.ts.map +1 -0
  265. package/dist/composition/agent/author.js +2 -0
  266. package/dist/composition/agent/author.js.map +1 -0
  267. package/dist/composition/agent/definition.js +2 -0
  268. package/dist/composition/agent/definition.js.map +1 -0
  269. package/dist/composition/agent/native-event.js +2 -0
  270. package/dist/composition/agent/native-event.js.map +1 -0
  271. package/dist/composition/agent/native-tools.js +2 -0
  272. package/dist/composition/agent/native-tools.js.map +1 -0
  273. package/dist/composition/agent/options.js +2 -0
  274. package/dist/composition/agent/options.js.map +1 -0
  275. package/dist/composition/agent/policy.js +2 -0
  276. package/dist/composition/agent/policy.js.map +1 -0
  277. package/dist/composition/agent/public-message.js +2 -0
  278. package/dist/composition/agent/public-message.js.map +1 -0
  279. package/dist/composition/agent/session.js +2 -0
  280. package/dist/composition/agent/session.js.map +1 -0
  281. package/dist/composition/agent/types.d.ts +218 -0
  282. package/dist/composition/agent/types.d.ts.map +1 -0
  283. package/dist/composition/common/counter.js +2 -0
  284. package/dist/composition/common/counter.js.map +1 -0
  285. package/dist/composition/common/errors.d.ts +15 -0
  286. package/dist/composition/common/errors.d.ts.map +1 -0
  287. package/dist/composition/common/errors.js +2 -0
  288. package/dist/composition/common/errors.js.map +1 -0
  289. package/dist/composition/common/json-data.js +2 -0
  290. package/dist/composition/common/json-data.js.map +1 -0
  291. package/dist/composition/credential/config.d.ts +5 -0
  292. package/dist/composition/credential/config.d.ts.map +1 -0
  293. package/dist/composition/credential/config.js +2 -0
  294. package/dist/composition/credential/config.js.map +1 -0
  295. package/dist/composition/credential/definition.d.ts +9 -0
  296. package/dist/composition/credential/definition.d.ts.map +1 -0
  297. package/dist/composition/credential/definition.js +2 -0
  298. package/dist/composition/credential/definition.js.map +1 -0
  299. package/dist/composition/credential/types.d.ts +38 -0
  300. package/dist/composition/credential/types.d.ts.map +1 -0
  301. package/dist/composition/delivery/ack.js +2 -0
  302. package/dist/composition/delivery/ack.js.map +1 -0
  303. package/dist/composition/delivery/attempt.js +2 -0
  304. package/dist/composition/delivery/attempt.js.map +1 -0
  305. package/dist/composition/delivery/batch.js +2 -0
  306. package/dist/composition/delivery/batch.js.map +1 -0
  307. package/dist/composition/delivery/checkpoint.js +2 -0
  308. package/dist/composition/delivery/checkpoint.js.map +1 -0
  309. package/dist/composition/delivery/event.js +2 -0
  310. package/dist/composition/delivery/event.js.map +1 -0
  311. package/dist/composition/delivery/resource.d.ts +11 -0
  312. package/dist/composition/delivery/resource.d.ts.map +1 -0
  313. package/dist/composition/delivery/resource.js +2 -0
  314. package/dist/composition/delivery/resource.js.map +1 -0
  315. package/dist/composition/delivery/staging.js +2 -0
  316. package/dist/composition/delivery/staging.js.map +1 -0
  317. package/dist/composition/diagnostics/config.js +2 -0
  318. package/dist/composition/diagnostics/config.js.map +1 -0
  319. package/dist/composition/diagnostics/ring.d.ts +12 -0
  320. package/dist/composition/diagnostics/ring.d.ts.map +1 -0
  321. package/dist/composition/diagnostics/ring.js +2 -0
  322. package/dist/composition/diagnostics/ring.js.map +1 -0
  323. package/dist/composition/exporter/definition.d.ts +7 -0
  324. package/dist/composition/exporter/definition.d.ts.map +1 -0
  325. package/dist/composition/exporter/definition.js +2 -0
  326. package/dist/composition/exporter/definition.js.map +1 -0
  327. package/dist/composition/exporter/lifecycle.js +2 -0
  328. package/dist/composition/exporter/lifecycle.js.map +1 -0
  329. package/dist/composition/exporter/preflight.js +2 -0
  330. package/dist/composition/exporter/preflight.js.map +1 -0
  331. package/dist/composition/exporter/types.d.ts +25 -0
  332. package/dist/composition/exporter/types.d.ts.map +1 -0
  333. package/dist/composition/exporter/types.js +2 -0
  334. package/dist/composition/exporter/types.js.map +1 -0
  335. package/dist/composition/identity/agent.js +2 -0
  336. package/dist/composition/identity/agent.js.map +1 -0
  337. package/dist/composition/lifecycle/bounded.js +2 -0
  338. package/dist/composition/lifecycle/bounded.js.map +1 -0
  339. package/dist/composition/lifecycle/operations.js +2 -0
  340. package/dist/composition/lifecycle/operations.js.map +1 -0
  341. package/dist/composition/lifecycle/types.d.ts +13 -0
  342. package/dist/composition/lifecycle/types.d.ts.map +1 -0
  343. package/dist/composition/lifecycle/types.js +2 -0
  344. package/dist/composition/lifecycle/types.js.map +1 -0
  345. package/dist/composition/logging/config.js +2 -0
  346. package/dist/composition/logging/config.js.map +1 -0
  347. package/dist/composition/logging/integration.js +2 -0
  348. package/dist/composition/logging/integration.js.map +1 -0
  349. package/dist/composition/logging/logger.d.ts +9 -0
  350. package/dist/composition/logging/logger.d.ts.map +1 -0
  351. package/dist/composition/logging/logger.js +2 -0
  352. package/dist/composition/logging/logger.js.map +1 -0
  353. package/dist/composition/memory/config.d.ts +10 -0
  354. package/dist/composition/memory/config.d.ts.map +1 -0
  355. package/dist/composition/memory/config.js +2 -0
  356. package/dist/composition/memory/config.js.map +1 -0
  357. package/dist/composition/memory/definition.d.ts +7 -0
  358. package/dist/composition/memory/definition.d.ts.map +1 -0
  359. package/dist/composition/memory/definition.js +2 -0
  360. package/dist/composition/memory/definition.js.map +1 -0
  361. package/dist/composition/memory/key.js +2 -0
  362. package/dist/composition/memory/key.js.map +1 -0
  363. package/dist/composition/memory/resume.js +2 -0
  364. package/dist/composition/memory/resume.js.map +1 -0
  365. package/dist/composition/memory/run.js +2 -0
  366. package/dist/composition/memory/run.js.map +1 -0
  367. package/dist/composition/model-catalog/config.js +2 -0
  368. package/dist/composition/model-catalog/config.js.map +1 -0
  369. package/dist/composition/model-catalog/manager.js +2 -0
  370. package/dist/composition/model-catalog/manager.js.map +1 -0
  371. package/dist/composition/model-catalog/options.js +2 -0
  372. package/dist/composition/model-catalog/options.js.map +1 -0
  373. package/dist/composition/model-catalog/types.d.ts +9 -0
  374. package/dist/composition/model-catalog/types.d.ts.map +1 -0
  375. package/dist/composition/observation/config.js +2 -0
  376. package/dist/composition/observation/config.js.map +1 -0
  377. package/dist/composition/observation/extensions.js +2 -0
  378. package/dist/composition/observation/extensions.js.map +1 -0
  379. package/dist/composition/observation/final-report.d.ts +6 -0
  380. package/dist/composition/observation/final-report.d.ts.map +1 -0
  381. package/dist/composition/observation/final-report.js +2 -0
  382. package/dist/composition/observation/final-report.js.map +1 -0
  383. package/dist/composition/observation/health.d.ts +13 -0
  384. package/dist/composition/observation/health.d.ts.map +1 -0
  385. package/dist/composition/observation/port.d.ts +11 -0
  386. package/dist/composition/observation/port.d.ts.map +1 -0
  387. package/dist/composition/observation/port.js +2 -0
  388. package/dist/composition/observation/port.js.map +1 -0
  389. package/dist/composition/preflight.js +2 -0
  390. package/dist/composition/preflight.js.map +1 -0
  391. package/dist/composition/provider/activation.js +2 -0
  392. package/dist/composition/provider/activation.js.map +1 -0
  393. package/dist/composition/provider/definition.d.ts +7 -0
  394. package/dist/composition/provider/definition.d.ts.map +1 -0
  395. package/dist/composition/provider/definition.js +2 -0
  396. package/dist/composition/provider/definition.js.map +1 -0
  397. package/dist/composition/provider/model-selection.js +2 -0
  398. package/dist/composition/provider/model-selection.js.map +1 -0
  399. package/dist/composition/provider/preflight.js +2 -0
  400. package/dist/composition/provider/preflight.js.map +1 -0
  401. package/dist/composition/provider/types.d.ts +38 -0
  402. package/dist/composition/provider/types.d.ts.map +1 -0
  403. package/dist/composition/provider/types.js +2 -0
  404. package/dist/composition/provider/types.js.map +1 -0
  405. package/dist/composition/queue/config.js +2 -0
  406. package/dist/composition/queue/config.js.map +1 -0
  407. package/dist/composition/queue/scheduler.js +2 -0
  408. package/dist/composition/queue/scheduler.js.map +1 -0
  409. package/dist/composition/queue/store.js +2 -0
  410. package/dist/composition/queue/store.js.map +1 -0
  411. package/dist/composition/runtime/config.js +2 -0
  412. package/dist/composition/runtime/config.js.map +1 -0
  413. package/dist/composition/runtime/owner.js +2 -0
  414. package/dist/composition/runtime/owner.js.map +1 -0
  415. package/dist/composition/runtime/public.d.ts +7 -0
  416. package/dist/composition/runtime/public.d.ts.map +1 -0
  417. package/dist/composition/runtime/public.js +2 -0
  418. package/dist/composition/runtime/public.js.map +1 -0
  419. package/dist/composition/runtime/types.d.ts +76 -0
  420. package/dist/composition/runtime/types.d.ts.map +1 -0
  421. package/dist/composition/startup.js +2 -0
  422. package/dist/composition/startup.js.map +1 -0
  423. package/dist/composition/team/config.js +2 -0
  424. package/dist/composition/team/config.js.map +1 -0
  425. package/dist/composition/team/options.js +2 -0
  426. package/dist/composition/team/options.js.map +1 -0
  427. package/dist/composition/team/runtime.js +2 -0
  428. package/dist/composition/team/runtime.js.map +1 -0
  429. package/dist/composition/team/types.d.ts +63 -0
  430. package/dist/composition/team/types.d.ts.map +1 -0
  431. package/dist/composition/tool-source/config.d.ts +5 -0
  432. package/dist/composition/tool-source/config.d.ts.map +1 -0
  433. package/dist/composition/tool-source/config.js +2 -0
  434. package/dist/composition/tool-source/config.js.map +1 -0
  435. package/dist/composition/tool-source/definition.d.ts +7 -0
  436. package/dist/composition/tool-source/definition.d.ts.map +1 -0
  437. package/dist/composition/tool-source/definition.js +2 -0
  438. package/dist/composition/tool-source/definition.js.map +1 -0
  439. package/dist/composition/tool-source/snapshot.js +2 -0
  440. package/dist/composition/tool-source/snapshot.js.map +1 -0
  441. package/dist/contract/adapter.d.ts +91 -0
  442. package/dist/contract/adapter.d.ts.map +1 -0
  443. package/dist/contract/adapter.js +2 -0
  444. package/dist/contract/adapter.js.map +1 -0
  445. package/dist/contract/call-config.d.ts +36 -0
  446. package/dist/contract/call-config.d.ts.map +1 -0
  447. package/dist/contract/call-config.js +2 -0
  448. package/dist/contract/call-config.js.map +1 -0
  449. package/dist/contract/generate-options.d.ts +41 -0
  450. package/dist/contract/generate-options.d.ts.map +1 -0
  451. package/dist/contract/model-info.d.ts +99 -0
  452. package/dist/contract/model-info.d.ts.map +1 -0
  453. package/dist/contract/output-format.d.ts +18 -0
  454. package/dist/contract/output-format.d.ts.map +1 -0
  455. package/dist/contract/retry-policy.d.ts +104 -0
  456. package/dist/contract/retry-policy.d.ts.map +1 -0
  457. package/dist/contract/retry-policy.js +2 -0
  458. package/dist/contract/retry-policy.js.map +1 -0
  459. package/dist/contract/tool.d.ts +65 -0
  460. package/dist/contract/tool.d.ts.map +1 -0
  461. package/dist/contract/tool.js +2 -0
  462. package/dist/contract/tool.js.map +1 -0
  463. package/dist/errors/agent-sdk-error.d.ts +88 -0
  464. package/dist/errors/agent-sdk-error.d.ts.map +1 -0
  465. package/dist/errors/agent-sdk-error.js +2 -0
  466. package/dist/errors/agent-sdk-error.js.map +1 -0
  467. package/dist/errors/capability-identity.d.ts +10 -0
  468. package/dist/errors/capability-identity.d.ts.map +1 -0
  469. package/dist/errors/capability-identity.js +2 -0
  470. package/dist/errors/capability-identity.js.map +1 -0
  471. package/dist/errors/failure.d.ts +33 -0
  472. package/dist/errors/failure.d.ts.map +1 -0
  473. package/dist/errors/failure.js +2 -0
  474. package/dist/errors/failure.js.map +1 -0
  475. package/dist/errors/model-error.d.ts +83 -0
  476. package/dist/errors/model-error.d.ts.map +1 -0
  477. package/dist/errors/model-error.js +2 -0
  478. package/dist/errors/model-error.js.map +1 -0
  479. package/dist/http/api-key.d.ts +47 -0
  480. package/dist/http/api-key.d.ts.map +1 -0
  481. package/dist/http/api-key.js +2 -0
  482. package/dist/http/api-key.js.map +1 -0
  483. package/dist/http/attribution.d.ts +51 -0
  484. package/dist/http/attribution.d.ts.map +1 -0
  485. package/dist/http/attribution.js +2 -0
  486. package/dist/http/attribution.js.map +1 -0
  487. package/dist/index.d.ts +70 -0
  488. package/dist/index.js +1 -0
  489. package/dist/logging/types.d.ts +53 -0
  490. package/dist/logging/types.d.ts.map +1 -0
  491. package/dist/logging/types.js +2 -0
  492. package/dist/logging/types.js.map +1 -0
  493. package/dist/memory.d.ts +10 -0
  494. package/dist/memory.js +1 -0
  495. package/dist/message/content.d.ts +125 -0
  496. package/dist/message/content.d.ts.map +1 -0
  497. package/dist/message/message.d.ts +154 -0
  498. package/dist/message/message.d.ts.map +1 -0
  499. package/dist/message/message.js +2 -0
  500. package/dist/message/message.js.map +1 -0
  501. package/dist/message/projection.d.ts +34 -0
  502. package/dist/message/projection.d.ts.map +1 -0
  503. package/dist/message/projection.js +2 -0
  504. package/dist/message/projection.js.map +1 -0
  505. package/dist/observability/bus.d.ts +7 -0
  506. package/dist/observability/bus.d.ts.map +1 -0
  507. package/dist/observability/bus.js +2 -0
  508. package/dist/observability/bus.js.map +1 -0
  509. package/dist/observability/exporters.d.ts +39 -0
  510. package/dist/observability/exporters.d.ts.map +1 -0
  511. package/dist/observability/exporters.js +2 -0
  512. package/dist/observability/exporters.js.map +1 -0
  513. package/dist/observability/logger.js +2 -0
  514. package/dist/observability/logger.js.map +1 -0
  515. package/dist/observability/projections.d.ts +12 -0
  516. package/dist/observability/projections.d.ts.map +1 -0
  517. package/dist/observability/projections.js +2 -0
  518. package/dist/observability/projections.js.map +1 -0
  519. package/dist/observability/types.d.ts +103 -0
  520. package/dist/observability/types.d.ts.map +1 -0
  521. package/dist/observability.d.ts +20 -0
  522. package/dist/observability.js +1 -0
  523. package/dist/observation/boundaries.js +2 -0
  524. package/dist/observation/boundaries.js.map +1 -0
  525. package/dist/observation/context.d.ts +39 -0
  526. package/dist/observation/context.d.ts.map +1 -0
  527. package/dist/observation/context.js +2 -0
  528. package/dist/observation/context.js.map +1 -0
  529. package/dist/observation/event.d.ts +50 -0
  530. package/dist/observation/event.d.ts.map +1 -0
  531. package/dist/observation/event.js +2 -0
  532. package/dist/observation/event.js.map +1 -0
  533. package/dist/observation/port.d.ts +56 -0
  534. package/dist/observation/port.d.ts.map +1 -0
  535. package/dist/observation/port.js +2 -0
  536. package/dist/observation/port.js.map +1 -0
  537. package/dist/observation/privacy.js +2 -0
  538. package/dist/observation/privacy.js.map +1 -0
  539. package/dist/observation/report.d.ts +117 -0
  540. package/dist/observation/report.d.ts.map +1 -0
  541. package/dist/observation/report.js +2 -0
  542. package/dist/observation/report.js.map +1 -0
  543. package/dist/observation/telemetry-types.d.ts +29 -0
  544. package/dist/observation/telemetry-types.d.ts.map +1 -0
  545. package/dist/observation/usage.d.ts +52 -0
  546. package/dist/observation/usage.d.ts.map +1 -0
  547. package/dist/observation/usage.js +2 -0
  548. package/dist/observation/usage.js.map +1 -0
  549. package/dist/platform/adapter.js +2 -0
  550. package/dist/platform/adapter.js.map +1 -0
  551. package/dist/platform/capability-operation.js +2 -0
  552. package/dist/platform/capability-operation.js.map +1 -0
  553. package/dist/platform/config.js +2 -0
  554. package/dist/platform/config.js.map +1 -0
  555. package/dist/platform/logger-platform.js +2 -0
  556. package/dist/platform/logger-platform.js.map +1 -0
  557. package/dist/platform/resources.js +2 -0
  558. package/dist/platform/resources.js.map +1 -0
  559. package/dist/plugin/provider-plugin.d.ts +37 -0
  560. package/dist/plugin/provider-plugin.d.ts.map +1 -0
  561. package/dist/plugin/provider-plugin.js +2 -0
  562. package/dist/plugin/provider-plugin.js.map +1 -0
  563. package/dist/primitives/brand.d.ts +61 -0
  564. package/dist/primitives/brand.d.ts.map +1 -0
  565. package/dist/primitives/brand.js +2 -0
  566. package/dist/primitives/brand.js.map +1 -0
  567. package/dist/primitives/freeze.d.ts +20 -0
  568. package/dist/primitives/freeze.d.ts.map +1 -0
  569. package/dist/primitives/freeze.js +2 -0
  570. package/dist/primitives/freeze.js.map +1 -0
  571. package/dist/primitives/json-snapshot.js +2 -0
  572. package/dist/primitives/json-snapshot.js.map +1 -0
  573. package/dist/primitives/json.d.ts +32 -0
  574. package/dist/primitives/json.d.ts.map +1 -0
  575. package/dist/primitives/json.js +2 -0
  576. package/dist/primitives/json.js.map +1 -0
  577. package/dist/primitives/never.d.ts +22 -0
  578. package/dist/primitives/never.d.ts.map +1 -0
  579. package/dist/primitives/never.js +2 -0
  580. package/dist/primitives/never.js.map +1 -0
  581. package/dist/primitives/snapshot.d.ts +10 -0
  582. package/dist/primitives/snapshot.d.ts.map +1 -0
  583. package/dist/primitives/snapshot.js +2 -0
  584. package/dist/primitives/snapshot.js.map +1 -0
  585. package/dist/primitives/version.d.ts +6 -0
  586. package/dist/primitives/version.d.ts.map +1 -0
  587. package/dist/primitives/version.js +2 -0
  588. package/dist/primitives/version.js.map +1 -0
  589. package/dist/provider.d.ts +19 -0
  590. package/dist/provider.js +1 -0
  591. package/dist/runtime/model-call-handle.js +2 -0
  592. package/dist/runtime/model-call-handle.js.map +1 -0
  593. package/dist/runtime/model-metadata.js +2 -0
  594. package/dist/runtime/model-metadata.js.map +1 -0
  595. package/dist/runtime/model-stream.js +2 -0
  596. package/dist/runtime/model-stream.js.map +1 -0
  597. package/dist/runtime/registry.d.ts +171 -0
  598. package/dist/runtime/registry.d.ts.map +1 -0
  599. package/dist/runtime/registry.js +2 -0
  600. package/dist/runtime/registry.js.map +1 -0
  601. package/dist/runtime/with-retry.d.ts +45 -0
  602. package/dist/runtime/with-retry.d.ts.map +1 -0
  603. package/dist/runtime/with-retry.js +2 -0
  604. package/dist/runtime/with-retry.js.map +1 -0
  605. package/dist/skills.d.ts +8 -0
  606. package/dist/skills.js +1 -0
  607. package/dist/stream/assembler.d.ts +86 -0
  608. package/dist/stream/assembler.d.ts.map +1 -0
  609. package/dist/stream/assembler.js +2 -0
  610. package/dist/stream/assembler.js.map +1 -0
  611. package/dist/stream/chunk.d.ts +135 -0
  612. package/dist/stream/chunk.d.ts.map +1 -0
  613. package/dist/stream/idle-timeout.d.ts +30 -0
  614. package/dist/stream/idle-timeout.d.ts.map +1 -0
  615. package/dist/stream/idle-timeout.js +2 -0
  616. package/dist/stream/idle-timeout.js.map +1 -0
  617. package/dist/support-safe/error.d.ts +29 -0
  618. package/dist/support-safe/error.d.ts.map +1 -0
  619. package/dist/support-safe/error.js +2 -0
  620. package/dist/support-safe/error.js.map +1 -0
  621. package/dist/tools.d.ts +15 -0
  622. package/dist/tools.js +1 -0
  623. package/package.json +96 -0
@@ -0,0 +1,5 @@
1
+ const e=Object.freeze({objective:0,constraint:1,decision:2,"next-step":3,progress:4,fact:5});var t=class t{records=new Map;limits;nextId=1;storedChars=0;constructor(e=[],t={}){this.limits=i(t);for(let t of e)this.remember(t)}static fromSnapshot(e,n={}){if(typeof e!=`object`||!e||e.version!==1||!Array.isArray(e.items))throw TypeError(`unsupported agent memory snapshot`);let r=new t([],n);if(e.items.length>r.limits.maxItems)throw RangeError(`agent memory snapshot exceeds the ${r.limits.maxItems}-item limit`);for(let t of e.items){if(o(t),r.records.has(t.id))throw TypeError(`duplicate agent memory id '${t.id}'`);if(t.content.length>r.limits.maxItemChars)throw RangeError(`agent memory item '${t.id}' exceeds the ${r.limits.maxItemChars}-character limit`);if(r.storedChars+t.content.length>r.limits.maxStoredChars)throw RangeError(`agent memory snapshot exceeds the ${r.limits.maxStoredChars}-character limit`);r.records.set(t.id,Object.freeze({id:t.id,kind:t.kind,content:t.content,createdAt:t.createdAt,updatedAt:t.updatedAt})),r.storedChars+=t.content.length;let e=c(t.id);e!==void 0&&(r.nextId=Math.max(r.nextId,e))}return r}remember(e){r(e);let t=e.id??`memory-${this.nextId}`,n=e.content.trim();if(n.length>this.limits.maxItemChars)throw RangeError(`agent memory item '${t}' exceeds the ${this.limits.maxItemChars}-character limit`);let i=c(t),a=this.records.get(t);if(a===void 0&&this.records.size>=this.limits.maxItems)throw RangeError(`agent memory reached its ${this.limits.maxItems}-item limit`);let o=this.storedChars-(a?.content.length??0)+n.length;if(o>this.limits.maxStoredChars)throw RangeError(`agent memory reached its ${this.limits.maxStoredChars}-character limit`);let s=new Date().toISOString(),l=Object.freeze({id:t,kind:e.kind,content:n,createdAt:a?.createdAt??s,updatedAt:s});return this.records.set(t,l),this.storedChars=o,i!==void 0&&(this.nextId=Math.max(this.nextId,i)),l}forget(e){let t=this.records.get(e);return t!==void 0&&(this.records.delete(e),this.storedChars-=t.content.length,!0)}items(){return Object.freeze([...this.records.values()])}snapshot(){return Object.freeze({version:1,items:Object.freeze(this.items().map(e=>Object.freeze(structuredClone(e))))})}captureOriginalObjective(e){if([...this.records.values()].some(e=>e.kind===`objective`))return;let t=l(e,this.limits.maxItemChars).trim();return this.remember({id:`original-objective`,kind:`objective`,content:t.length>0?t:`[The original request contained non-text input.]`})}render(t=12e3){if(!Number.isInteger(t)||t<256)throw RangeError(`agent memory render maxChars must be an integer >= 256`);let n=[...this.records.values()].sort((t,n)=>e[t.kind]-e[n.kind]||t.createdAt.localeCompare(n.createdAt));if(n.length===0)return``;let r=[`<task-memory>`,`Durable task facts follow. Preserve the original objective and obey active constraints even when older conversation turns were compacted.`],i=t-r.join(`
2
+ `).length-14-2,a=[];for(let e of n){if(i<=0)break;let t=`- ${e.kind} [${e.id}]: `,n=Math.max(0,i-t.length-1),r=t+u(JSON.stringify(e.content),n);a.push(r),i-=r.length+1}return[...r,...a,`</task-memory>`].join(`
3
+ `)}};function n(e){let t=e?.maxInjectedChars??12e3;if(!Number.isInteger(t)||t<256)throw RangeError(`agent memory maxInjectedChars must be an integer >= 256`);let n=i(e??{}),a=new Set,o=1,s=0,l=Object.freeze([...e?.seed??[]].map(e=>{r(e);let t=e.id??`memory-${o++}`,i=c(t);if(i!==void 0&&(o=Math.max(o,i)),a.has(t))throw TypeError(`duplicate agent memory seed id '${t}'`);a.add(t);let l=e.content.trim().length;if(l>n.maxItemChars)throw RangeError(`agent memory seed '${t}' exceeds the ${n.maxItemChars}-character limit`);if(s+=l,s>n.maxStoredChars)throw RangeError(`agent memory seed exceeds the ${n.maxStoredChars}-character limit`);return Object.freeze({...e.id===void 0?{}:{id:e.id},kind:e.kind,content:e.content})}));if(l.length>n.maxItems)throw RangeError(`agent memory seed exceeds the ${n.maxItems}-item limit`);return Object.freeze({autoCaptureObjective:e?.autoCaptureObjective??!0,maxInjectedChars:t,...n,seed:l})}function r(t){if(t.id!==void 0&&(typeof t.id!=`string`||t.id.trim().length===0||t.id.length>256||/\s/.test(t.id)))throw TypeError(`agent memory id must be non-empty, at most 256 characters, and contain no whitespace`);if(!Object.hasOwn(e,t.kind))throw TypeError(`unsupported agent memory kind '${String(t.kind)}'`);if(typeof t.content!=`string`||t.content.trim().length===0)throw TypeError(`agent memory content must be a non-empty string`)}function i(e){let t=a(e.maxItems??1024,`maxItems`),n=a(e.maxItemChars??65536,`maxItemChars`),r=a(e.maxStoredChars??1048576,`maxStoredChars`);if(n>r)throw RangeError(`agent memory maxItemChars must not exceed maxStoredChars`);return Object.freeze({maxItems:t,maxItemChars:n,maxStoredChars:r})}function a(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`agent memory ${t} must be a positive safe integer`);return e}function o(e){if(r(e),!s(e.createdAt)||!s(e.updatedAt))throw TypeError(`agent memory timestamps must be bounded ISO date strings`)}function s(e){if(typeof e!=`string`||e.length===0||e.length>64)return!1;let t=Date.parse(e);if(!Number.isFinite(t))return!1;try{return new Date(t).toISOString()===e}catch{return!1}}function c(e){let t=/^memory-(\d+)$/.exec(e)?.[1];if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=1&&n<2**53-1?n+1:void 0}function l(e,t){let n=``,r=!1;for(let i of e.content){if(i.type!==`text`)continue;let e=n.length===0?``:`
4
+ `,a=t-n.length;if(e.length+i.text.length<=a){n+=e+i.text;continue}let o=Math.max(0,a-e.length-22);n+=e+i.text.slice(0,o)+`…[objective truncated]`.slice(0,Math.max(0,a-e.length-o)),r=!0;break}return r?n.slice(0,t):n}function u(e,t){if(e.length<=t)return e;if(t<=1)return e.slice(0,t);let n=Math.ceil((t-1)/2),r=Math.floor((t-1)/2);return e.slice(0,n)+`…`+e.slice(e.length-r)}export{t as AgentMemory,n as resolveMemoryConfig};
5
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","names":[],"sources":["../../../src/agent/memory/memory.ts"],"sourcesContent":["/** Durable, explicitly inspectable task memory kept outside compactable history. */\n\nimport type { UserMessage } from '../../message/index.ts'\n\nexport type AgentMemoryKind =\n | 'objective'\n | 'constraint'\n | 'decision'\n | 'fact'\n | 'progress'\n | 'next-step'\n\nexport interface AgentMemorySeed {\n readonly id?: string\n readonly kind: AgentMemoryKind\n readonly content: string\n}\n\nexport interface AgentMemoryItem {\n readonly id: string\n readonly kind: AgentMemoryKind\n readonly content: string\n readonly createdAt: string\n readonly updatedAt: string\n}\n\nexport interface AgentMemorySnapshot {\n readonly version: 1\n readonly items: readonly AgentMemoryItem[]\n}\n\nexport interface AgentMemoryConfigInput {\n /** Pin the first real user message as the original objective. Defaults to true. */\n readonly autoCaptureObjective?: boolean\n /** Maximum rendered memory characters injected into every model request. Defaults to 12,000. */\n readonly maxInjectedChars?: number\n /** Maximum retained memory records. Defaults to 1,024. */\n readonly maxItems?: number\n /** Maximum characters retained by one record. Defaults to 65,536. */\n readonly maxItemChars?: number\n /** Maximum cumulative retained content characters. Defaults to 1 MiB. */\n readonly maxStoredChars?: number\n readonly seed?: readonly AgentMemorySeed[]\n}\n\nexport interface AgentMemoryConfig {\n readonly autoCaptureObjective: boolean\n readonly maxInjectedChars: number\n readonly maxItems: number\n readonly maxItemChars: number\n readonly maxStoredChars: number\n readonly seed: readonly AgentMemorySeed[]\n}\n\nconst PRIORITY: Readonly<Record<AgentMemoryKind, number>> = Object.freeze({\n objective: 0,\n constraint: 1,\n decision: 2,\n 'next-step': 3,\n progress: 4,\n fact: 5,\n})\n\nexport class AgentMemory {\n private readonly records = new Map<string, AgentMemoryItem>()\n private readonly limits: Pick<AgentMemoryConfig, 'maxItems' | 'maxItemChars' | 'maxStoredChars'>\n private nextId = 1\n private storedChars = 0\n\n constructor(\n seed: readonly AgentMemorySeed[] = [],\n limits: Partial<Pick<AgentMemoryConfig, 'maxItems' | 'maxItemChars' | 'maxStoredChars'>> = {},\n ) {\n this.limits = resolveMemoryLimits(limits)\n for (const item of seed) this.remember(item)\n }\n\n static fromSnapshot(\n snapshot: AgentMemorySnapshot,\n limits: Partial<Pick<AgentMemoryConfig, 'maxItems' | 'maxItemChars' | 'maxStoredChars'>> = {},\n ): AgentMemory {\n if (typeof snapshot !== 'object' || snapshot === null\n || snapshot.version !== 1 || !Array.isArray(snapshot.items)) {\n throw new TypeError('unsupported agent memory snapshot')\n }\n const memory = new AgentMemory([], limits)\n if (snapshot.items.length > memory.limits.maxItems) {\n throw new RangeError(`agent memory snapshot exceeds the ${memory.limits.maxItems}-item limit`)\n }\n for (const item of snapshot.items) {\n validateItem(item)\n if (memory.records.has(item.id)) throw new TypeError(`duplicate agent memory id '${item.id}'`)\n if (item.content.length > memory.limits.maxItemChars) {\n throw new RangeError(`agent memory item '${item.id}' exceeds the ${memory.limits.maxItemChars}-character limit`)\n }\n if (memory.storedChars + item.content.length > memory.limits.maxStoredChars) {\n throw new RangeError(`agent memory snapshot exceeds the ${memory.limits.maxStoredChars}-character limit`)\n }\n memory.records.set(item.id, Object.freeze({\n id: item.id,\n kind: item.kind,\n content: item.content,\n createdAt: item.createdAt,\n updatedAt: item.updatedAt,\n }))\n memory.storedChars += item.content.length\n const successor = memoryIdSuccessor(item.id)\n if (successor !== undefined) memory.nextId = Math.max(memory.nextId, successor)\n }\n return memory\n }\n\n /** Add or update one stable memory item. Supplying the same id is an upsert. */\n remember(input: AgentMemorySeed): AgentMemoryItem {\n validateSeed(input)\n const id = input.id ?? `memory-${this.nextId}`\n const content = input.content.trim()\n if (content.length > this.limits.maxItemChars) {\n throw new RangeError(`agent memory item '${id}' exceeds the ${this.limits.maxItemChars}-character limit`)\n }\n const successor = memoryIdSuccessor(id)\n const previous = this.records.get(id)\n if (previous === undefined && this.records.size >= this.limits.maxItems) {\n throw new RangeError(`agent memory reached its ${this.limits.maxItems}-item limit`)\n }\n const nextStoredChars = this.storedChars - (previous?.content.length ?? 0) + content.length\n if (nextStoredChars > this.limits.maxStoredChars) {\n throw new RangeError(`agent memory reached its ${this.limits.maxStoredChars}-character limit`)\n }\n const at = new Date().toISOString()\n const item = Object.freeze({\n id,\n kind: input.kind,\n content,\n createdAt: previous?.createdAt ?? at,\n updatedAt: at,\n })\n this.records.set(id, item)\n this.storedChars = nextStoredChars\n if (successor !== undefined) this.nextId = Math.max(this.nextId, successor)\n return item\n }\n\n forget(id: string): boolean {\n const item = this.records.get(id)\n if (item === undefined) return false\n this.records.delete(id)\n this.storedChars -= item.content.length\n return true\n }\n\n items(): readonly AgentMemoryItem[] {\n return Object.freeze([...this.records.values()])\n }\n\n snapshot(): AgentMemorySnapshot {\n return Object.freeze({\n version: 1,\n items: Object.freeze(this.items().map(item => Object.freeze(structuredClone(item)))),\n })\n }\n\n /** Capture the first user request verbatim enough to survive every later compaction. */\n captureOriginalObjective(message: UserMessage): AgentMemoryItem | undefined {\n if ([...this.records.values()].some(item => item.kind === 'objective')) return undefined\n const text = collectTextPrefix(message, this.limits.maxItemChars).trim()\n return this.remember({\n id: 'original-objective',\n kind: 'objective',\n content: text.length > 0 ? text : '[The original request contained non-text input.]',\n })\n }\n\n /** Render bounded pinned context, ordered by importance rather than insertion accident. */\n render(maxChars = 12_000): string {\n if (!Number.isInteger(maxChars) || maxChars < 256) {\n throw new RangeError('agent memory render maxChars must be an integer >= 256')\n }\n const ordered = [...this.records.values()].sort((a, b) =>\n PRIORITY[a.kind] - PRIORITY[b.kind] || a.createdAt.localeCompare(b.createdAt))\n if (ordered.length === 0) return ''\n const preamble = [\n '<task-memory>',\n 'Durable task facts follow. Preserve the original objective and obey active constraints even when older conversation turns were compacted.',\n ]\n const closing = '</task-memory>'\n let remaining = maxChars - preamble.join('\\n').length - closing.length - 2\n const lines: string[] = []\n for (const item of ordered) {\n if (remaining <= 0) break\n const prefix = `- ${item.kind} [${item.id}]: `\n const contentBudget = Math.max(0, remaining - prefix.length - 1)\n const content = truncateMiddle(JSON.stringify(item.content), contentBudget)\n const line = prefix + content\n lines.push(line)\n remaining -= line.length + 1\n }\n return [...preamble, ...lines, closing].join('\\n')\n }\n}\n\nexport function resolveMemoryConfig(input: AgentMemoryConfigInput | undefined): AgentMemoryConfig {\n const maxInjectedChars = input?.maxInjectedChars ?? 12_000\n if (!Number.isInteger(maxInjectedChars) || maxInjectedChars < 256) {\n throw new RangeError('agent memory maxInjectedChars must be an integer >= 256')\n }\n const limits = resolveMemoryLimits(input ?? {})\n const ids = new Set<string>()\n let nextId = 1\n let storedChars = 0\n const seed = Object.freeze([...(input?.seed ?? [])].map(item => {\n validateSeed(item)\n const id = item.id ?? `memory-${nextId++}`\n const successor = memoryIdSuccessor(id)\n if (successor !== undefined) nextId = Math.max(nextId, successor)\n if (ids.has(id)) throw new TypeError(`duplicate agent memory seed id '${id}'`)\n ids.add(id)\n const chars = item.content.trim().length\n if (chars > limits.maxItemChars) {\n throw new RangeError(`agent memory seed '${id}' exceeds the ${limits.maxItemChars}-character limit`)\n }\n storedChars += chars\n if (storedChars > limits.maxStoredChars) {\n throw new RangeError(`agent memory seed exceeds the ${limits.maxStoredChars}-character limit`)\n }\n return Object.freeze({\n ...(item.id === undefined ? {} : { id: item.id }),\n kind: item.kind,\n content: item.content,\n })\n }))\n if (seed.length > limits.maxItems) {\n throw new RangeError(`agent memory seed exceeds the ${limits.maxItems}-item limit`)\n }\n return Object.freeze({\n autoCaptureObjective: input?.autoCaptureObjective ?? true,\n maxInjectedChars,\n ...limits,\n seed,\n })\n}\n\nfunction validateSeed(input: AgentMemorySeed): void {\n if (input.id !== undefined && (typeof input.id !== 'string'\n || input.id.trim().length === 0 || input.id.length > 256 || /\\s/.test(input.id))) {\n throw new TypeError('agent memory id must be non-empty, at most 256 characters, and contain no whitespace')\n }\n if (!Object.hasOwn(PRIORITY, input.kind)) throw new TypeError(`unsupported agent memory kind '${String(input.kind)}'`)\n if (typeof input.content !== 'string' || input.content.trim().length === 0) {\n throw new TypeError('agent memory content must be a non-empty string')\n }\n}\n\nfunction resolveMemoryLimits(\n input: Partial<Pick<AgentMemoryConfig, 'maxItems' | 'maxItemChars' | 'maxStoredChars'>>,\n): Pick<AgentMemoryConfig, 'maxItems' | 'maxItemChars' | 'maxStoredChars'> {\n const maxItems = positiveInteger(input.maxItems ?? 1_024, 'maxItems')\n const maxItemChars = positiveInteger(input.maxItemChars ?? 65_536, 'maxItemChars')\n const maxStoredChars = positiveInteger(input.maxStoredChars ?? 1024 * 1024, 'maxStoredChars')\n if (maxItemChars > maxStoredChars) {\n throw new RangeError('agent memory maxItemChars must not exceed maxStoredChars')\n }\n return Object.freeze({ maxItems, maxItemChars, maxStoredChars })\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 1) {\n throw new RangeError(`agent memory ${name} must be a positive safe integer`)\n }\n return value\n}\n\nfunction validateItem(item: AgentMemoryItem): void {\n validateSeed(item)\n if (!validTimestamp(item.createdAt) || !validTimestamp(item.updatedAt)) {\n throw new TypeError('agent memory timestamps must be bounded ISO date strings')\n }\n}\n\nfunction validTimestamp(value: unknown): value is string {\n if (typeof value !== 'string' || value.length === 0 || value.length > 64) return false\n const parsed = Date.parse(value)\n if (!Number.isFinite(parsed)) return false\n try { return new Date(parsed).toISOString() === value } catch { return false }\n}\n\nfunction memoryIdSuccessor(id: string): number | undefined {\n const suffix = /^memory-(\\d+)$/.exec(id)?.[1]\n if (suffix === undefined) return undefined\n const numeric = Number(suffix)\n return Number.isSafeInteger(numeric) && numeric >= 1 && numeric < Number.MAX_SAFE_INTEGER\n ? numeric + 1\n : undefined\n}\n\nfunction collectTextPrefix(message: UserMessage, maxChars: number): string {\n const marker = '…[objective truncated]'\n let text = ''\n let truncated = false\n for (const block of message.content) {\n if (block.type !== 'text') continue\n const separator = text.length === 0 ? '' : '\\n'\n const remaining = maxChars - text.length\n if (separator.length + block.text.length <= remaining) {\n text += separator + block.text\n continue\n }\n const available = Math.max(0, remaining - separator.length - marker.length)\n text += separator + block.text.slice(0, available) + marker.slice(0, Math.max(0, remaining - separator.length - available))\n truncated = true\n break\n }\n return truncated ? text.slice(0, maxChars) : text\n}\n\nfunction truncateMiddle(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value\n if (maxChars <= 1) return value.slice(0, maxChars)\n const marker = '…'\n const head = Math.ceil((maxChars - marker.length) / 2)\n const tail = Math.floor((maxChars - marker.length) / 2)\n return value.slice(0, head) + marker + value.slice(value.length - tail)\n}\n"],"mappings":"AAsDA,MAAM,EAAsD,OAAO,OAAO,CACxE,UAAW,EACX,WAAY,EACZ,SAAU,EACV,YAAa,EACb,SAAU,EACV,KAAM,CACR,CAAC,EAED,IAAa,EAAb,MAAa,CAAY,CACvB,QAA2B,IAAI,IAC/B,OACA,OAAiB,EACjB,YAAsB,EAEtB,YACE,EAAmC,CAAC,EACpC,EAA2F,CAAC,EAC5F,CACA,KAAK,OAAS,EAAoB,CAAM,EACxC,IAAK,IAAM,KAAQ,EAAM,KAAK,SAAS,CAAI,CAC7C,CAEA,OAAO,aACL,EACA,EAA2F,CAAC,EAC/E,CACb,GAAI,OAAO,GAAa,WAAY,GAC/B,EAAS,UAAY,GAAK,CAAC,MAAM,QAAQ,EAAS,KAAK,EAC1D,MAAU,UAAU,mCAAmC,EAEzD,IAAM,EAAS,IAAI,EAAY,CAAC,EAAG,CAAM,EACzC,GAAI,EAAS,MAAM,OAAS,EAAO,OAAO,SACxC,MAAU,WAAW,qCAAqC,EAAO,OAAO,SAAS,YAAY,EAE/F,IAAK,IAAM,KAAQ,EAAS,MAAO,CAEjC,GADA,EAAa,CAAI,EACb,EAAO,QAAQ,IAAI,EAAK,EAAE,EAAG,MAAU,UAAU,8BAA8B,EAAK,GAAG,EAAE,EAC7F,GAAI,EAAK,QAAQ,OAAS,EAAO,OAAO,aACtC,MAAU,WAAW,sBAAsB,EAAK,GAAG,gBAAgB,EAAO,OAAO,aAAa,iBAAiB,EAEjH,GAAI,EAAO,YAAc,EAAK,QAAQ,OAAS,EAAO,OAAO,eAC3D,MAAU,WAAW,qCAAqC,EAAO,OAAO,eAAe,iBAAiB,EAE1G,EAAO,QAAQ,IAAI,EAAK,GAAI,OAAO,OAAO,CACxC,GAAI,EAAK,GACT,KAAM,EAAK,KACX,QAAS,EAAK,QACd,UAAW,EAAK,UAChB,UAAW,EAAK,SAClB,CAAC,CAAC,EACF,EAAO,aAAe,EAAK,QAAQ,OACnC,IAAM,EAAY,EAAkB,EAAK,EAAE,EACvC,IAAc,IAAA,KAAW,EAAO,OAAS,KAAK,IAAI,EAAO,OAAQ,CAAS,EAChF,CACA,OAAO,CACT,CAGA,SAAS,EAAyC,CAChD,EAAa,CAAK,EAClB,IAAM,EAAK,EAAM,IAAM,UAAU,KAAK,SAChC,EAAU,EAAM,QAAQ,KAAK,EACnC,GAAI,EAAQ,OAAS,KAAK,OAAO,aAC/B,MAAU,WAAW,sBAAsB,EAAG,gBAAgB,KAAK,OAAO,aAAa,iBAAiB,EAE1G,IAAM,EAAY,EAAkB,CAAE,EAChC,EAAW,KAAK,QAAQ,IAAI,CAAE,EACpC,GAAI,IAAa,IAAA,IAAa,KAAK,QAAQ,MAAQ,KAAK,OAAO,SAC7D,MAAU,WAAW,4BAA4B,KAAK,OAAO,SAAS,YAAY,EAEpF,IAAM,EAAkB,KAAK,aAAe,GAAU,QAAQ,QAAU,GAAK,EAAQ,OACrF,GAAI,EAAkB,KAAK,OAAO,eAChC,MAAU,WAAW,4BAA4B,KAAK,OAAO,eAAe,iBAAiB,EAE/F,IAAM,EAAK,IAAI,KAAK,CAAA,CAAE,YAAY,EAC5B,EAAO,OAAO,OAAO,CACzB,KACA,KAAM,EAAM,KACZ,UACA,UAAW,GAAU,WAAa,EAClC,UAAW,CACb,CAAC,EAID,OAHA,KAAK,QAAQ,IAAI,EAAI,CAAI,EACzB,KAAK,YAAc,EACf,IAAc,IAAA,KAAW,KAAK,OAAS,KAAK,IAAI,KAAK,OAAQ,CAAS,GACnE,CACT,CAEA,OAAO,EAAqB,CAC1B,IAAM,EAAO,KAAK,QAAQ,IAAI,CAAE,EAIhC,OAHI,IAAS,IAAA,KACb,KAAK,QAAQ,OAAO,CAAE,EACtB,KAAK,aAAe,EAAK,QAAQ,OAC1B,GACT,CAEA,OAAoC,CAClC,OAAO,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,CAAC,CACjD,CAEA,UAAgC,CAC9B,OAAO,OAAO,OAAO,CACnB,QAAS,EACT,MAAO,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,IAAI,GAAQ,OAAO,OAAO,gBAAgB,CAAI,CAAC,CAAC,CAAC,CACrF,CAAC,CACH,CAGA,yBAAyB,EAAmD,CAC1E,GAAI,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,KAAK,GAAQ,EAAK,OAAS,WAAW,EAAG,OACxE,IAAM,EAAO,EAAkB,EAAS,KAAK,OAAO,YAAY,CAAC,CAAC,KAAK,EACvE,OAAO,KAAK,SAAS,CACnB,GAAI,qBACJ,KAAM,YACN,QAAS,EAAK,OAAS,EAAI,EAAO,kDACpC,CAAC,CACH,CAGA,OAAO,EAAW,KAAgB,CAChC,GAAI,CAAC,OAAO,UAAU,CAAQ,GAAK,EAAW,IAC5C,MAAU,WAAW,wDAAwD,EAE/E,IAAM,EAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,EAAG,IAClD,EAAS,EAAE,MAAQ,EAAS,EAAE,OAAS,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC,EAC/E,GAAI,EAAQ,SAAW,EAAG,MAAO,GACjC,IAAM,EAAW,CACf,gBACA,2IACF,EAEI,EAAY,EAAW,EAAS,KAAK;CAAI,CAAC,CAAC,OAAS,GAAiB,EACnE,EAAkB,CAAC,EACzB,IAAK,IAAM,KAAQ,EAAS,CAC1B,GAAI,GAAa,EAAG,MACpB,IAAM,EAAS,KAAK,EAAK,KAAK,IAAI,EAAK,GAAG,KACpC,EAAgB,KAAK,IAAI,EAAG,EAAY,EAAO,OAAS,CAAC,EAEzD,EAAO,EADG,EAAe,KAAK,UAAU,EAAK,OAAO,EAAG,CACjC,EAC5B,EAAM,KAAK,CAAI,EACf,GAAa,EAAK,OAAS,CAC7B,CACA,MAAO,CAAC,GAAG,EAAU,GAAG,EAAO,gBAAO,CAAC,CAAC,KAAK;CAAI,CACnD,CACF,EAEA,SAAgB,EAAoB,EAA8D,CAChG,IAAM,EAAmB,GAAO,kBAAoB,KACpD,GAAI,CAAC,OAAO,UAAU,CAAgB,GAAK,EAAmB,IAC5D,MAAU,WAAW,yDAAyD,EAEhF,IAAM,EAAS,EAAoB,GAAS,CAAC,CAAC,EACxC,EAAM,IAAI,IACZ,EAAS,EACT,EAAc,EACZ,EAAO,OAAO,OAAO,CAAC,GAAI,GAAO,MAAQ,CAAC,CAAE,CAAC,CAAC,IAAI,GAAQ,CAC9D,EAAa,CAAI,EACjB,IAAM,EAAK,EAAK,IAAM,UAAU,MAC1B,EAAY,EAAkB,CAAE,EAEtC,GADI,IAAc,IAAA,KAAW,EAAS,KAAK,IAAI,EAAQ,CAAS,GAC5D,EAAI,IAAI,CAAE,EAAG,MAAU,UAAU,mCAAmC,EAAG,EAAE,EAC7E,EAAI,IAAI,CAAE,EACV,IAAM,EAAQ,EAAK,QAAQ,KAAK,CAAC,CAAC,OAClC,GAAI,EAAQ,EAAO,aACjB,MAAU,WAAW,sBAAsB,EAAG,gBAAgB,EAAO,aAAa,iBAAiB,EAGrG,GADA,GAAe,EACX,EAAc,EAAO,eACvB,MAAU,WAAW,iCAAiC,EAAO,eAAe,iBAAiB,EAE/F,OAAO,OAAO,OAAO,CACnB,GAAI,EAAK,KAAO,IAAA,GAAY,CAAC,EAAI,CAAE,GAAI,EAAK,EAAG,EAC/C,KAAM,EAAK,KACX,QAAS,EAAK,OAChB,CAAC,CACH,CAAC,CAAC,EACF,GAAI,EAAK,OAAS,EAAO,SACvB,MAAU,WAAW,iCAAiC,EAAO,SAAS,YAAY,EAEpF,OAAO,OAAO,OAAO,CACnB,qBAAsB,GAAO,sBAAwB,GACrD,mBACA,GAAG,EACH,MACF,CAAC,CACH,CAEA,SAAS,EAAa,EAA8B,CAClD,GAAI,EAAM,KAAO,IAAA,KAAc,OAAO,EAAM,IAAO,UAC9C,EAAM,GAAG,KAAK,CAAC,CAAC,SAAW,GAAK,EAAM,GAAG,OAAS,KAAO,KAAK,KAAK,EAAM,EAAE,GAC9E,MAAU,UAAU,sFAAsF,EAE5G,GAAI,CAAC,OAAO,OAAO,EAAU,EAAM,IAAI,EAAG,MAAU,UAAU,kCAAkC,OAAO,EAAM,IAAI,EAAE,EAAE,EACrH,GAAI,OAAO,EAAM,SAAY,UAAY,EAAM,QAAQ,KAAK,CAAC,CAAC,SAAW,EACvE,MAAU,UAAU,iDAAiD,CAEzE,CAEA,SAAS,EACP,EACyE,CACzE,IAAM,EAAW,EAAgB,EAAM,UAAY,KAAO,UAAU,EAC9D,EAAe,EAAgB,EAAM,cAAgB,MAAQ,cAAc,EAC3E,EAAiB,EAAgB,EAAM,gBAAkB,QAAa,gBAAgB,EAC5F,GAAI,EAAe,EACjB,MAAU,WAAW,0DAA0D,EAEjF,OAAO,OAAO,OAAO,CAAE,WAAU,eAAc,gBAAe,CAAC,CACjE,CAEA,SAAS,EAAgB,EAAe,EAAsB,CAC5D,GAAI,CAAC,OAAO,cAAc,CAAK,GAAK,EAAQ,EAC1C,MAAU,WAAW,gBAAgB,EAAK,iCAAiC,EAE7E,OAAO,CACT,CAEA,SAAS,EAAa,EAA6B,CAEjD,GADA,EAAa,CAAI,EACb,CAAC,EAAe,EAAK,SAAS,GAAK,CAAC,EAAe,EAAK,SAAS,EACnE,MAAU,UAAU,0DAA0D,CAElF,CAEA,SAAS,EAAe,EAAiC,CACvD,GAAI,OAAO,GAAU,UAAY,EAAM,SAAW,GAAK,EAAM,OAAS,GAAI,MAAO,GACjF,IAAM,EAAS,KAAK,MAAM,CAAK,EAC/B,GAAI,CAAC,OAAO,SAAS,CAAM,EAAG,MAAO,GACrC,GAAI,CAAE,OAAO,IAAI,KAAK,CAAM,CAAC,CAAC,YAAY,IAAM,CAAM,MAAQ,CAAE,MAAO,EAAM,CAC/E,CAEA,SAAS,EAAkB,EAAgC,CACzD,IAAM,EAAS,iBAAiB,KAAK,CAAE,CAAC,GAAG,GAC3C,GAAI,IAAW,IAAA,GAAW,OAC1B,IAAM,EAAU,OAAO,CAAM,EAC7B,OAAO,OAAO,cAAc,CAAO,GAAK,GAAW,GAAK,UACpD,EAAU,EACV,IAAA,EACN,CAEA,SAAS,EAAkB,EAAsB,EAA0B,CACzE,IACI,EAAO,GACP,EAAY,GAChB,IAAK,IAAM,KAAS,EAAQ,QAAS,CACnC,GAAI,EAAM,OAAS,OAAQ,SAC3B,IAAM,EAAY,EAAK,SAAW,EAAI,GAAK;EACrC,EAAY,EAAW,EAAK,OAClC,GAAI,EAAU,OAAS,EAAM,KAAK,QAAU,EAAW,CACrD,GAAQ,EAAY,EAAM,KAC1B,QACF,CACA,IAAM,EAAY,KAAK,IAAI,EAAG,EAAY,EAAU,OAAS,EAAa,EAC1E,GAAQ,EAAY,EAAM,KAAK,MAAM,EAAG,CAAS,EAAI,yBAAO,MAAM,EAAG,KAAK,IAAI,EAAG,EAAY,EAAU,OAAS,CAAS,CAAC,EAC1H,EAAY,GACZ,KACF,CACA,OAAO,EAAY,EAAK,MAAM,EAAG,CAAQ,EAAI,CAC/C,CAEA,SAAS,EAAe,EAAe,EAA0B,CAC/D,GAAI,EAAM,QAAU,EAAU,OAAO,EACrC,GAAI,GAAY,EAAG,OAAO,EAAM,MAAM,EAAG,CAAQ,EACjD,IACM,EAAO,KAAK,MAAM,EAAW,GAAiB,CAAC,EAC/C,EAAO,KAAK,OAAO,EAAW,GAAiB,CAAC,EACtD,OAAO,EAAM,MAAM,EAAG,CAAI,EAAI,IAAS,EAAM,MAAM,EAAM,OAAS,CAAI,CACxE"}
@@ -0,0 +1,44 @@
1
+ import { SdkLogger } from "../../logging/types.js";
2
+ import { AgentMemorySnapshot } from "./memory.js";
3
+ //#region src/agent/memory/persistence-types.d.ts
4
+ interface MemoryStoreOptions {
5
+ readonly signal: AbortSignal;
6
+ readonly logger: SdkLogger;
7
+ }
8
+ interface MemoryLoadResult {
9
+ readonly snapshot: AgentMemorySnapshot;
10
+ readonly revision: string;
11
+ }
12
+ interface MemoryCommitInput {
13
+ readonly key: string;
14
+ readonly snapshot: AgentMemorySnapshot;
15
+ readonly expectedRevision: string | null;
16
+ }
17
+ interface MemoryCommitResult {
18
+ readonly revision: string;
19
+ }
20
+ interface MemoryStore {
21
+ readonly kind: 'memory-store';
22
+ readonly apiVersion: 1;
23
+ readonly id: string;
24
+ readonly load: (key: string, options: MemoryStoreOptions) => Promise<MemoryLoadResult | undefined>;
25
+ readonly commit: (input: MemoryCommitInput, options: MemoryStoreOptions) => Promise<MemoryCommitResult>;
26
+ }
27
+ type MemoryStoreDefinition = Omit<MemoryStore, 'kind' | 'apiVersion'>;
28
+ type MemoryScope = {
29
+ readonly kind: 'conversation';
30
+ readonly namespace: string;
31
+ } | {
32
+ readonly kind: 'fixed';
33
+ readonly key: string;
34
+ readonly sharedAcrossSessions: true;
35
+ };
36
+ interface MemoryBinding {
37
+ readonly store: MemoryStore;
38
+ readonly bindingId: string;
39
+ readonly scope: MemoryScope;
40
+ readonly requirement: 'required' | 'best-effort';
41
+ }
42
+ //#endregion
43
+ export { MemoryBinding, MemoryCommitInput, MemoryCommitResult, MemoryLoadResult, MemoryScope, MemoryStore, MemoryStoreDefinition, MemoryStoreOptions };
44
+ //# sourceMappingURL=persistence-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence-types.d.ts","names":[],"sources":["../../../src/agent/memory/persistence-types.ts"],"mappings":";;;UAGiB;WACN,QAAQ;WACR,QAAQ;;UAGF;WACN,UAAU;WACV;;UAGM;WACN;WACA,UAAU;WACV;;UAGM;WAA8B;;UAE9B;WACN;WACA;WACA;WACA,OAAO,aAAa,SAAS,uBAAuB,QAAQ;WAC5D,SAAS,OAAO,mBAAmB,SAAS,uBAAuB,QAAQ;;KAG1E,wBAAwB,KAAK;KAE7B;WACG;WAA+B;;WAC/B;WAAwB;WAAsB;;UAE5C;WACN,OAAO;WACP;WACA,OAAO;WACP"}
@@ -0,0 +1,6 @@
1
+ import { HistorySurfaceNode } from "../history/project.js";
2
+ //#region src/agent/memory/surface-compaction.d.ts
3
+ declare function selectCompactablePrefix(surface: readonly HistorySurfaceNode[], retainTokens: number): readonly HistorySurfaceNode[];
4
+ //#endregion
5
+ export { selectCompactablePrefix };
6
+ //# sourceMappingURL=surface-compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-compaction.d.ts","names":[],"sources":["../../../src/agent/memory/surface-compaction.ts"],"mappings":";;iBASgB,wBACd,kBAAkB,sBAClB,gCACU"}
@@ -0,0 +1,4 @@
1
+ import{createMessage as e}from"../../message/message.js";import{estimateMessageTokens as t}from"./token-estimator.js";function n(e,n){if(e.length<2)return[];let r=0,a=e.length;for(let i=e.length-1;i>=0&&(r+=t(e[i]?.message),a=i,!(r>=n));i--);for(a=Math.max(1,Math.min(a,e.length-1));a>0&&!i(e.map(e=>e.message),a);)a--;return Object.freeze(e.slice(0,a))}function r(t,n,r){let i=0;for(let o of n){if(o.message.source.kind!==`tool`)continue;let n=o.message.content.flatMap(e=>e.type===`tool-result`?e.content.filter(e=>e.type===`text`):[]),s=n.reduce((e,t)=>e+[...t.text].length,0);if(s<=r)continue;let c=t.entries().find(e=>e.seq===o.seq);if(c?.event.kind!==`tool-result`)continue;let l=Math.max(1,Math.floor(r/Math.max(1,n.length))),u=o.message.content.map(e=>e.type===`tool-result`?{...e,content:e.content.map(e=>e.type===`text`?{...e,text:a(e.text,l)}:e)}:e),d=e({role:`user`,source:o.message.source,content:u}),f=u.flatMap(e=>e.type===`tool-result`?e.content.filter(e=>e.type===`text`):[]).reduce((e,t)=>e+[...t.text].length,0);t.appendBatch([{event:{kind:`compaction-prune`,callId:c.event.callId,originalSeq:o.seq,charsBefore:s,charsAfter:f}},{event:{...c.event,message:d},surfaceOp:{op:`replace`,from:o.seq,to:o.seq,targets:[o.seq]}}]),i++}return i}function i(e,t){let n=new Map;for(let r=0;r<e.length;r++){let i=r<t?`head`:`tail`;for(let t of e[r]?.content??[])t.type===`tool-call`&&n.set(t.id,i)}for(let r=0;r<e.length;r++){let i=r<t?`head`:`tail`;for(let t of e[r]?.content??[])if(t.type===`tool-result`&&n.get(t.toolCallId)!==i)return!1}return!0}function a(e,t){let n=[...e];if(n.length<=t)return e;let r=[...`
2
+ …[tool result pruned for context]…
3
+ `];if(t<=r.length)return n.slice(0,t).join(``);let i=Math.ceil((t-r.length)/2),a=Math.floor((t-r.length)/2);return[...n.slice(0,i),...r,...n.slice(n.length-a)].join(``)}export{r as pruneToolResults,n as selectCompactablePrefix};
4
+ //# sourceMappingURL=surface-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-compaction.js","names":[],"sources":["../../../src/agent/memory/surface-compaction.ts"],"sourcesContent":["/** Surface range selection and lossless-log tool-result pruning. */\n\nimport type { ContentBlock } from '../../message/index.ts'\nimport { createMessage, type Message } from '../../message/index.ts'\nimport type { ToolCallId } from '../../primitives/index.ts'\nimport type { History } from '../history/history.ts'\nimport type { HistorySurfaceNode } from '../history/project.ts'\nimport { estimateMessageTokens } from './token-estimator.ts'\n\nexport function selectCompactablePrefix(\n surface: readonly HistorySurfaceNode[],\n retainTokens: number,\n): readonly HistorySurfaceNode[] {\n if (surface.length < 2) return []\n let accumulated = 0\n let keepFrom = surface.length\n for (let index = surface.length - 1; index >= 0; index--) {\n accumulated += estimateMessageTokens(surface[index]?.message)\n keepFrom = index\n if (accumulated >= retainTokens) break\n }\n keepFrom = Math.max(1, Math.min(keepFrom, surface.length - 1))\n while (keepFrom > 0 && !toolPairingBalanced(surface.map(node => node.message), keepFrom)) keepFrom--\n return Object.freeze(surface.slice(0, keepFrom))\n}\n\n/** Replace oversized model-visible tool text while retaining the full original log entry. */\nexport function pruneToolResults(\n history: History,\n surface: readonly HistorySurfaceNode[],\n maxChars: number,\n): number {\n let pruned = 0\n for (const node of surface) {\n if (node.message.source.kind !== 'tool') continue\n const textBlocks = node.message.content.flatMap(block =>\n block.type === 'tool-result'\n ? block.content.filter((child): child is Extract<ContentBlock, { type: 'text' }> => child.type === 'text')\n : [])\n const charsBefore = textBlocks.reduce((total, block) => total + [...block.text].length, 0)\n if (charsBefore <= maxChars) continue\n const sourceEntry = history.entries().find(entry => entry.seq === node.seq)\n if (sourceEntry?.event.kind !== 'tool-result') continue\n const perBlock = Math.max(1, Math.floor(maxChars / Math.max(1, textBlocks.length)))\n const content = node.message.content.map(block => block.type !== 'tool-result'\n ? block\n : {\n ...block,\n content: block.content.map(child => child.type === 'text'\n ? { ...child, text: truncateMiddleCodePoints(child.text, perBlock) }\n : child),\n })\n const replacement = createMessage({ role: 'user', source: node.message.source, content })\n const charsAfter = content.flatMap(block => block.type === 'tool-result'\n ? block.content.filter((child): child is Extract<ContentBlock, { type: 'text' }> => child.type === 'text')\n : []).reduce((total, block) => total + [...block.text].length, 0)\n history.appendBatch([\n { event: {\n kind: 'compaction-prune', callId: sourceEntry.event.callId,\n originalSeq: node.seq, charsBefore, charsAfter,\n } },\n {\n event: { ...sourceEntry.event, message: replacement },\n surfaceOp: { op: 'replace', from: node.seq, to: node.seq, targets: [node.seq] },\n },\n ])\n pruned++\n }\n return pruned\n}\n\nfunction toolPairingBalanced(messages: readonly Message[], split: number): boolean {\n const side = new Map<ToolCallId, 'head' | 'tail'>()\n for (let index = 0; index < messages.length; index++) {\n const location = index < split ? 'head' : 'tail'\n for (const block of messages[index]?.content ?? []) {\n if (block.type === 'tool-call') side.set(block.id, location)\n }\n }\n for (let index = 0; index < messages.length; index++) {\n const location = index < split ? 'head' : 'tail'\n for (const block of messages[index]?.content ?? []) {\n if (block.type === 'tool-result' && side.get(block.toolCallId) !== location) return false\n }\n }\n return true\n}\n\nfunction truncateMiddleCodePoints(value: string, maxChars: number): string {\n const points = [...value]\n if (points.length <= maxChars) return value\n const marker = [...'\\n…[tool result pruned for context]…\\n']\n if (maxChars <= marker.length) return points.slice(0, maxChars).join('')\n const head = Math.ceil((maxChars - marker.length) / 2)\n const tail = Math.floor((maxChars - marker.length) / 2)\n return [...points.slice(0, head), ...marker, ...points.slice(points.length - tail)].join('')\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Message } from "../../message/message.js";
2
+ import { ModelToolSchema } from "../../contract/tool.js";
3
+ //#region src/agent/memory/token-estimator.d.ts
4
+ declare function estimateContextTokens(input: {
5
+ readonly system?: string;
6
+ readonly messages: readonly Message[];
7
+ readonly tools?: readonly ModelToolSchema[];
8
+ }): number;
9
+ declare function estimateMessageTokens(message: Message | undefined): number;
10
+ //#endregion
11
+ export { estimateContextTokens, estimateMessageTokens };
12
+ //# sourceMappingURL=token-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.d.ts","names":[],"sources":["../../../src/agent/memory/token-estimator.ts"],"mappings":";;;iBAMgB,sBAAsB;WAC3B;WACA,mBAAmB;WACnB,iBAAiB;;iBAQZ,sBAAsB,SAAS"}
@@ -0,0 +1,2 @@
1
+ function e(e){let n=e.system===void 0?0:r(e.system),a=e.messages.reduce((e,n)=>e+t(n),0),o=e.tools?.reduce((e,t)=>e+r(i(t))+8,0)??0;return n+a+o+8}function t(e){return e===void 0?0:4+e.content.reduce((e,t)=>e+n(t),0)}function n(e){switch(e.type){case`text`:return r(e.text)+2;case`reasoning`:return r(e.text)+r(i(e.providerState))+2;case`image`:return e.source.kind===`base64`?Math.max(1024,r(e.source.data)):512;case`tool-call`:return r(e.name)+r(e.arguments)+8;case`tool-result`:return e.content.reduce((e,t)=>e+n(t),8);case`native-tool-call`:return r(i(e))+8;default:return r(i(e))+4}}function r(e){return Math.ceil(e.length/4)}function i(e){try{return JSON.stringify(e)??``}catch{return String(e)}}export{e as estimateContextTokens,t as estimateMessageTokens};
2
+ //# sourceMappingURL=token-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.js","names":[],"sources":["../../../src/agent/memory/token-estimator.ts"],"sourcesContent":["/** Provider-neutral deterministic context estimator used by compaction policy. */\n\nimport type { ModelToolSchema } from '../../contract/index.ts'\nimport type { ContentBlock } from '../../message/index.ts'\nimport type { Message } from '../../message/index.ts'\n\nexport function estimateContextTokens(input: {\n readonly system?: string\n readonly messages: readonly Message[]\n readonly tools?: readonly ModelToolSchema[]\n}): number {\n const system = input.system === undefined ? 0 : estimateTextTokens(input.system)\n const messages = input.messages.reduce((total, message) => total + estimateMessageTokens(message), 0)\n const tools = input.tools?.reduce((total, tool) => total + estimateTextTokens(safeJson(tool)) + 8, 0) ?? 0\n return system + messages + tools + 8\n}\n\nexport function estimateMessageTokens(message: Message | undefined): number {\n if (message === undefined) return 0\n return 4 + message.content.reduce((total, block) => total + estimateBlockTokens(block), 0)\n}\n\nfunction estimateBlockTokens(block: ContentBlock): number {\n switch (block.type) {\n case 'text': return estimateTextTokens(block.text) + 2\n case 'reasoning': return estimateTextTokens(block.text) + estimateTextTokens(safeJson(block.providerState)) + 2\n case 'image': return block.source.kind === 'base64'\n ? Math.max(1024, estimateTextTokens(block.source.data))\n : 512\n case 'tool-call': return estimateTextTokens(block.name) + estimateTextTokens(block.arguments) + 8\n case 'tool-result': return block.content.reduce((total, child) => total + estimateBlockTokens(child), 8)\n case 'native-tool-call': return estimateTextTokens(safeJson(block)) + 8\n default: return estimateTextTokens(safeJson(block)) + 4\n }\n}\n\nfunction estimateTextTokens(text: string): number { return Math.ceil(text.length / 4) }\nfunction safeJson(value: unknown): string {\n try { return JSON.stringify(value) ?? '' } catch { return String(value) }\n}\n"],"mappings":"AAMA,SAAgB,EAAsB,EAI3B,CACT,IAAM,EAAS,EAAM,SAAW,IAAA,GAAY,EAAI,EAAmB,EAAM,MAAM,EACzE,EAAW,EAAM,SAAS,QAAQ,EAAO,IAAY,EAAQ,EAAsB,CAAO,EAAG,CAAC,EAC9F,EAAQ,EAAM,OAAO,QAAQ,EAAO,IAAS,EAAQ,EAAmB,EAAS,CAAI,CAAC,EAAI,EAAG,CAAC,GAAK,EACzG,OAAO,EAAS,EAAW,EAAQ,CACrC,CAEA,SAAgB,EAAsB,EAAsC,CAE1E,OADI,IAAY,IAAA,GAAkB,EAC3B,EAAI,EAAQ,QAAQ,QAAQ,EAAO,IAAU,EAAQ,EAAoB,CAAK,EAAG,CAAC,CAC3F,CAEA,SAAS,EAAoB,EAA6B,CACxD,OAAQ,EAAM,KAAd,CACE,IAAK,OAAQ,OAAO,EAAmB,EAAM,IAAI,EAAI,EACrD,IAAK,YAAa,OAAO,EAAmB,EAAM,IAAI,EAAI,EAAmB,EAAS,EAAM,aAAa,CAAC,EAAI,EAC9G,IAAK,QAAS,OAAO,EAAM,OAAO,OAAS,SACvC,KAAK,IAAI,KAAM,EAAmB,EAAM,OAAO,IAAI,CAAC,EACpD,IACJ,IAAK,YAAa,OAAO,EAAmB,EAAM,IAAI,EAAI,EAAmB,EAAM,SAAS,EAAI,EAChG,IAAK,cAAe,OAAO,EAAM,QAAQ,QAAQ,EAAO,IAAU,EAAQ,EAAoB,CAAK,EAAG,CAAC,EACvG,IAAK,mBAAoB,OAAO,EAAmB,EAAS,CAAK,CAAC,EAAI,EACtE,QAAS,OAAO,EAAmB,EAAS,CAAK,CAAC,EAAI,CACxD,CACF,CAEA,SAAS,EAAmB,EAAsB,CAAE,OAAO,KAAK,KAAK,EAAK,OAAS,CAAC,CAAE,CACtF,SAAS,EAAS,EAAwB,CACxC,GAAI,CAAE,OAAO,KAAK,UAAU,CAAK,GAAK,EAAG,MAAQ,CAAE,OAAO,OAAO,CAAK,CAAE,CAC1E"}
@@ -0,0 +1,79 @@
1
+ import { CallConfig } from "../../contract/call-config.js";
2
+ import { ToolCatalog } from "../tool/registry.js";
3
+ import { AgentEvent, TurnHooks, TurnOutcome } from "../loop/events.js";
4
+ import { TurnBounds } from "../loop/types.js";
5
+ import { RunTurnOptions } from "../loop/turn/types.js";
6
+ import { UserInputBroker, UserInputRequest, UserInputResponse } from "./user-input.js";
7
+ //#region src/agent/mode/run-agent.d.ts
8
+ declare const AGENT_CONTROL_TOOLS: Readonly<{
9
+ readonly complete: 'submit_result';
10
+ readonly requestUserInput: 'request_user_input';
11
+ }>;
12
+ /** Default high-level runtime requested by this SDK; `runTurn` remains provider-neutral. */
13
+ type AgentMode = 'basic' | 'deep' | 'deep-human-in-loop';
14
+ interface AgentRunCommon extends Omit<RunTurnOptions, 'bounds' | 'commentary' | 'config' | 'hooks' | 'system' | 'tools'> {
15
+ /** Explicit low-level model binding; composition users can select a configured provider default instead. */
16
+ readonly config: CallConfig;
17
+ readonly tools?: ToolCatalog;
18
+ readonly system?: string;
19
+ /** Maximum normal model iterations. A forced final answer may use one extra request. */
20
+ /** Model steps per prompt; 'auto' keeps completion and resource guards only. */
21
+ readonly maxTurns?: number | 'auto';
22
+ readonly bounds?: Omit<Partial<TurnBounds>, 'maxSteps'>;
23
+ readonly commentary?: RunTurnOptions['commentary'];
24
+ readonly hooks?: TurnHooks;
25
+ }
26
+ interface BasicAgentOptions extends AgentRunCommon {
27
+ readonly mode?: 'basic';
28
+ }
29
+ interface DeepAgentOptions extends AgentRunCommon {
30
+ readonly mode: 'deep';
31
+ /** Optional in deep mode: expose a blocking clarification tool when configured. */
32
+ readonly userInput?: UserInputBroker;
33
+ }
34
+ interface HumanInLoopAgentOptions extends AgentRunCommon {
35
+ readonly mode: 'deep-human-in-loop';
36
+ /** Required in HIL mode: the tool call remains parked until this broker answers. */
37
+ readonly userInput: UserInputBroker;
38
+ }
39
+ type RunAgentOptions = BasicAgentOptions | DeepAgentOptions | HumanInLoopAgentOptions;
40
+ interface CompletionSubmission {
41
+ readonly summary: string;
42
+ readonly evidence: readonly string[];
43
+ }
44
+ interface AgentRunOutcome extends TurnOutcome {
45
+ readonly mode: AgentMode;
46
+ /** Deep modes are complete only after the model explicitly submits its self-check. */
47
+ readonly completed: boolean;
48
+ readonly completion?: CompletionSubmission;
49
+ }
50
+ interface AgentModeStartEvent {
51
+ readonly type: 'agent-start';
52
+ readonly mode: AgentMode;
53
+ readonly maxTurns: number | 'auto';
54
+ }
55
+ interface UserInputRequestEvent {
56
+ readonly type: 'user-input-request';
57
+ readonly request: UserInputRequest;
58
+ }
59
+ interface UserInputResponseEvent {
60
+ readonly type: 'user-input-response';
61
+ readonly request: UserInputRequest;
62
+ readonly response: UserInputResponse | 'abort';
63
+ }
64
+ interface AgentModeEndEvent {
65
+ readonly type: 'agent-end';
66
+ readonly outcome: AgentRunOutcome;
67
+ }
68
+ type AgentRunEvent = AgentEvent | AgentModeStartEvent | UserInputRequestEvent | UserInputResponseEvent | AgentModeEndEvent;
69
+ /**
70
+ * Run an agent in basic, self-checking deep, or deep human-in-loop mode.
71
+ *
72
+ * The low-level `turn-*`, trace, commentary, reasoning-summary, and tool events are
73
+ * forwarded unchanged. High-level `agent-*` and `user-input-*` events make GUI
74
+ * orchestration possible without parsing assistant prose.
75
+ */
76
+ declare function runAgent(options: RunAgentOptions): AsyncIterable<AgentRunEvent>;
77
+ //#endregion
78
+ export { AGENT_CONTROL_TOOLS, AgentMode, AgentRunEvent, AgentRunOutcome, BasicAgentOptions, CompletionSubmission, DeepAgentOptions, HumanInLoopAgentOptions, RunAgentOptions, runAgent };
79
+ //# sourceMappingURL=run-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-agent.d.ts","names":[],"sources":["../../../src/agent/mode/run-agent.ts"],"mappings":";;;;;;;cAkBa,qBAAmB;WACpB;WACQ;;;KAIR;UAEF,uBAAuB,KAAK;;WAE3B,QAAQ;WACR,QAAQ;WACR;;;WAGA;WACA,SAAS,KAAK,QAAQ;WACtB,aAAa;WACb,QAAQ;;UAGF,0BAA0B;WAChC;;UAGM,yBAAyB;WAC/B;;WAEA,YAAY;;UAGN,gCAAgC;WACtC;;WAEA,WAAW;;KAGV,kBAAkB,oBAAoB,mBAAmB;UAEpD;WACN;WACA;;UAGM,wBAAwB;WAC9B,MAAM;;WAEN;WACA,aAAa;;UAGd;WACC;WACA,MAAM;WACN;;UAED;WACC;WACA,SAAS;;UAEV;WACC;WACA,SAAS;WACT,UAAU;;UAEX;WACC;WACA,SAAS;;KAGR,gBAAgB,aACxB,sBACA,wBACA,yBACA;;;;;;;;iBAsBY,SAAS,SAAS,kBAAkB,cAAc"}
@@ -0,0 +1,4 @@
1
+ import{detachedFrozen as e}from"../../primitives/snapshot.js";import{waitForSettlement as t}from"../../async/settlement.js";import{createUserMessage as n}from"../../message/message.js";import{defineTool as r}from"../tool/definition.js";import{AwaitedEventQueue as i}from"../loop/queue.js";import{readSpillTool as a}from"../tool/output-budget.js";import{runTurn as o}from"../loop/run-turn.js";const s=Object.freeze({complete:`submit_result`,requestUserInput:`request_user_input`});function c(n){return{async*[Symbol.asyncIterator](){let r=new i,a=new AbortController,o=T(n.teardownTimeoutMs??3e4,`teardownTimeoutMs`),s=n.signal===void 0?a.signal:AbortSignal.any([n.signal,a.signal]),c=Promise.resolve(),u=l(n,s,t=>{let n=c.then(()=>r.push(e(t)));return c=n.catch(()=>void 0),n}).then(async()=>{await c,r.close()},async e=>{await c,r.fail(e)});try{for(;;){let e=await r.take();if(e.done)break;yield e.value}await u}finally{if(a.abort(Error(`agent event consumer stopped`)),r.close(),!await t(u,o)){let e=Error(`agent producer ignored cancellation for more than ${o}ms`,{cause:a.signal.reason});throw e.code=`AGENT_TEARDOWN_TIMEOUT`,e}}}}}async function l(e,t,n){let r=e.mode??`basic`;if(![`basic`,`deep`,`deep-human-in-loop`].includes(r))throw RangeError(`unsupported agent mode "${String(r)}"`);let i=`userInput`in e?e.userInput:void 0;if(r===`deep-human-in-loop`&&(i===void 0||typeof i.request!=`function`))throw TypeError(`deep-human-in-loop mode requires a UserInputBroker`);let c=e.maxTurns??16;if(c!==`auto`&&(!Number.isSafeInteger(c)||c<1))throw RangeError(`maxTurns must be a positive safe integer or 'auto'`);await n({type:`agent-start`,mode:r,maxTurns:c});let l={completion:void 0,userAborted:!1,unverifiedAnswers:0,completionInvalidated:!1},p=r!==`basic`,_=e.mode===`deep`||e.mode===`deep-human-in-loop`?i:void 0,v=[];e.spillStore!==void 0&&v.push(a(e.spillStore)),p&&v.push(u()),_!==void 0&&r!==`basic`&&v.push(d(r,_,l,n,e.accounting));let y=v.length===0?e.tools:m(e.tools,v),b=p?f(e.hooks,e.history,l,c):e.hooks,C={registry:e.registry,config:e.config,history:e.history,...y===void 0?{}:{tools:y},...e.nativeTools===void 0?{}:{nativeTools:e.nativeTools},...e.toolChoice===void 0?{}:{toolChoice:e.toolChoice},...e.imagePolicy===void 0?{}:{imagePolicy:e.imagePolicy},...e.validateOutput===void 0?{}:{validateOutput:e.validateOutput},...e.outputFormat===void 0?{}:{outputFormat:e.outputFormat},system:S(e.system,x(r,_!==void 0)),...e.interceptors===void 0?{}:{interceptors:h(e.interceptors)},...e.approvals===void 0?{}:{approvals:e.approvals},bounds:{...e.bounds,maxSteps:c},...b===void 0?{}:{hooks:b},signal:t,...e.logger===void 0?{}:{logger:e.logger},commentary:e.commentary??`concise`,teardownTimeoutMs:e.teardownTimeoutMs??3e4,...e.modelTimeoutMs===void 0?{}:{modelTimeoutMs:e.modelTimeoutMs},...e.maxModelRequestBytes===void 0?{}:{maxModelRequestBytes:e.maxModelRequestBytes},...e.maxModelResponseBytes===void 0?{}:{maxModelResponseBytes:e.maxModelResponseBytes},...e.maxModelStreamEvents===void 0?{}:{maxModelStreamEvents:e.maxModelStreamEvents},...e.hookTimeoutMs===void 0?{}:{hookTimeoutMs:e.hookTimeoutMs},...e.hookTeardownTimeoutMs===void 0?{}:{hookTeardownTimeoutMs:e.hookTeardownTimeoutMs},...e.trace===void 0?{}:{trace:e.trace},...e.accounting===void 0?{}:{accounting:e.accounting},...e.spillStore===void 0?{}:{spillStore:e.spillStore},...e.contextSections===void 0?{}:{contextSections:e.contextSections}},w,T=[],E;for await(let e of o(C))e.type===`step-start`?(T=[],E=void 0):e.type===`tool-call`?(T.push(e.call.toolName),e.call.toolName!==s.complete&&y?.get(e.call.toolName)?.completionExempt!==!0&&(l.completion!==void 0&&(l.completionInvalidated=!0),l.completion=void 0,l.unverifiedAnswers=0)):e.type===`tool-result`&&e.call.toolName===s.complete&&!e.result.isError?E=g(e.result.value):e.type===`step-end`&&E!==void 0&&T.filter(e=>e===s.complete).length===1&&T.every(e=>e===s.complete||y?.get(e)?.completionExempt===!0)&&(l.completion=E,l.completionInvalidated=!1),e.type===`turn-end`&&(w=e.outcome),await n(e);if(w===void 0)throw Error(`runTurn ended without a turn-end event`);let D=r===`basic`?w.reason.kind===`completed`||w.reason.kind===`concluded-by-tool`:l.completion!==void 0&&!l.userAborted&&(w.reason.kind===`completed`||w.reason.kind===`concluded-by-tool`||w.reason.kind===`budget-exhausted`&&w.reason.forcedFinalAnswer)&&w.text.trim()!==``;await n({type:`agent-end`,outcome:{...w,mode:r,completed:D,...l.completion===void 0?{}:{completion:l.completion}}})}function u(){return r({name:s.complete,description:`Submit the self-check only when the user objective and constraints are fully satisfied. After acceptance, give the user the final answer.`,budgetExempt:!0,parameters:{type:`object`,properties:{summary:{type:`string`,description:`Concise statement of what was completed.`},evidence:{type:`array`,items:{type:`string`},description:`Concrete checks or tool results showing the objective is satisfied.`}},required:[`summary`,`evidence`],additionalProperties:!1},parse:v,execute:e=>({accepted:!0,summary:e.summary,evidence:[...e.evidence],instruction:`This self-check is accepted for the current run. Now provide the substantive final report itself: findings or changes, evidence or sources, checks performed, and remaining limitations. Do not merely say the self-check passed or refer to an earlier message. Do not call submit_result again in this run unless you perform new substantive tool work that invalidates this submission. A later user request or worker follow-up starts a new run and needs its own self-check.`})})}function d(e,t,n,i,a){return r({name:s.requestUserInput,budgetExempt:!0,description:e===`deep-human-in-loop`?`Ask the user one to three short questions when a material choice or missing fact requires human input, then wait for the response. Provide 2-3 mutually exclusive suggestions; free-form input is added by the client.`:`Ask the user one to three short clarification questions only when blocked, then wait for the response. Provide suggested choices; free-form input is added by the client.`,parameters:b(),parse:y,execute:async({questions:e},r)=>{let o=a?.startOperation(`user-input`,{toolCallId:r.callId,data:{questionCount:e.length}}),s={requestId:r.callId,callId:r.callId,turn:r.turn,step:r.step,questions:e,isBlocking:!0};try{let c=t.request(s,r.signal);await i({type:`user-input-request`,request:s});let l=await c;return await i({type:`user-input-response`,request:s,response:l}),l===`abort`?(n.userAborted=!0,r.concludeTurn(),o!==void 0&&a?.endOperation(o,`aborted`),{aborted:!0}):(o!==void 0&&a?.endOperation(o,`success`),_(l,e))}catch(e){throw o!==void 0&&a?.endOperation(o,r.signal.aborted?`aborted`:`error`,{error:e}),e}}})}function f(e,t,r,i){return{...e,onTurnEnd:async a=>{await e?.onTurnEnd?.(a),!(a.outcome.reason.kind!==`completed`||i!==`auto`&&a.outcome.steps>=i||r.completion!==void 0||r.userAborted)&&(r.unverifiedAnswers++,!(r.unverifiedAnswers>=3)&&t.append({kind:`user`,message:n({source:{kind:`app`,producer:`deep-mode-self-check`},content:[{type:`text`,text:(r.completionInvalidated?`Your previously accepted submission is no longer current because you called another substantive tool afterwards. Review the later tool results and call ${s.complete} again when complete; the old instruction not to resubmit no longer applies. `:``)+`Self-check required: this run has no accepted current self-check. Acceptance recorded in an earlier run does not complete this request or follow-up; an earlier instruction not to resubmit applied only to that earlier run. Compare the current result against the user's objective and every constraint. If anything is missing, continue with tools. If blocked and request_user_input is available, ask the user. Only when the work is actually complete, call ${s.complete}. Rephrasing a completion claim without submitting does not satisfy this gate.`}]})}))}}}var p=class{definitions;constructor(e,t){let n=new Map;for(let t of e?.names()??[]){let r=e?.get(t);r!==void 0&&n.set(t,r)}for(let e of t){if(n.has(e.name))throw Error(`tool name "${e.name}" is reserved by the selected agent mode`);n.set(e.name,e)}this.definitions=n}get(e){return this.definitions.get(e)}has(e){return this.definitions.has(e)}names(){return[...this.definitions.keys()]}schemas(){return[...this.definitions.values()].map(({name:e,description:t,parameters:n})=>({name:e,description:t,parameters:structuredClone(n)}))}executionMode(e,t){let n=this.definitions.get(e);if(n===void 0)return`exclusive`;try{return n.isConcurrencySafe?.(t)===!0?`parallel`:`exclusive`}catch{return`exclusive`}}};function m(e,t){return new p(e,t)}function h(e){let t=new Set(Object.values(s));return e.map(e=>({name:e.name,...e.before===void 0?{}:{before:(n,r)=>t.has(n.toolName)?r():e.before(n,r)},...e.around===void 0?{}:{around:(n,r)=>t.has(n.toolName)?r():e.around(n,r)},...e.after===void 0?{}:{after:(n,r,i)=>t.has(n.toolName)?i():e.after(n,r,i)}}))}function g(e){let t=C(e,`submit_result result`);return v({summary:t.summary,evidence:t.evidence})}function _(e,t){let n=new Set(t.map(e=>e.id));for(let t of n){let n=e.answers[t];if(n===void 0||!Array.isArray(n.answers)||n.answers.length===0||n.answers.some(e=>typeof e!=`string`||e.trim().length===0))throw Error(`the user-input broker returned no valid answer for "${t}"`)}for(let t of Object.keys(e.answers))if(!n.has(t))throw Error(`the user-input broker returned an answer for unknown question "${t}"`);return e}function v(e){let t=C(e,`submit_result arguments`);if(typeof t.summary!=`string`||t.summary.trim().length===0)throw Error(`summary must be a non-empty string`);if(!Array.isArray(t.evidence)||t.evidence.some(e=>typeof e!=`string`||e.trim().length===0))throw Error(`evidence must be an array of non-empty strings`);return{summary:t.summary,evidence:t.evidence}}function y(e){let t=C(e,`request_user_input arguments`);if(!Array.isArray(t.questions)||t.questions.length<1||t.questions.length>3)throw Error(`questions must contain one to three items`);let n=new Set,r=t.questions.map((e,t)=>{let r=C(e,`questions[${t}]`),i=w(r.id,`questions[${t}].id`);if(!/^[a-z][a-z0-9_]*$/.test(i))throw Error(`questions[${t}].id must be snake_case`);if(n.has(i))throw Error(`question id "${i}" is duplicated`);n.add(i);let a=w(r.header,`questions[${t}].header`),o=w(r.question,`questions[${t}].question`);if(!Array.isArray(r.options)||r.options.length<2||r.options.length>3)throw Error(`questions[${t}].options must contain two or three choices`);let s=r.options.map((e,n)=>{let r=C(e,`questions[${t}].options[${n}]`);return{label:w(r.label,`questions[${t}].options[${n}].label`),description:w(r.description,`questions[${t}].options[${n}].description`)}});return Object.freeze({id:i,header:a,question:o,options:Object.freeze(s),allowFreeForm:!0})});return{questions:Object.freeze(r)}}function b(){return{type:`object`,properties:{questions:{type:`array`,minItems:1,maxItems:3,description:`Questions to show the user. Prefer one and do not exceed three.`,items:{type:`object`,additionalProperties:!1,properties:{id:{type:`string`,description:`Stable snake_case answer key.`},header:{type:`string`,description:`Short UI label, ideally 12 characters or fewer.`},question:{type:`string`,description:`Single-sentence question.`},options:{type:`array`,minItems:2,maxItems:3,description:`Mutually exclusive choices. Put the recommended choice first and suffix its label with "(Recommended)". Do not add Other; the client supplies free-form input.`,items:{type:`object`,additionalProperties:!1,properties:{label:{type:`string`,description:`User-facing label, one to five words.`},description:{type:`string`,description:`One sentence explaining impact or trade-off.`}},required:[`label`,`description`]}}},required:[`id`,`header`,`question`,`options`]}}},required:[`questions`],additionalProperties:!1}}function x(e,t){if(e===`basic`)return[`Work as a bounded tool-using agent. Use available tools proactively when they materially improve correctness.`,`Stay within the configured iteration budget, then give the best final answer supported by the gathered results.`].join(` `);let n=t?`If a missing fact or material user choice blocks correct progress, call ${s.requestUserInput} and continue after the answer.`:`If blocked by missing user input, state that limitation plainly in the final response.`,r=e===`deep-human-in-loop`?`For material choices, surface 2-3 concise options with the recommended option first; the UI also permits free-form feedback.`:``;return[`Work autonomously in deep mode. After every tool result, compare the evidence against the user objective and all constraints; continue until gaps are closed.`,`Do not treat a plausible draft as completion. When the work is actually complete, call ${s.complete} with a summary and concrete evidence, then provide the final answer.`,n,r,`Never reveal private chain-of-thought. Use concise user-visible commentary for intent, progress, observations, and decisions.`].filter(Boolean).join(` `)}function S(...e){return e.filter(e=>e!==void 0&&e.length>0).join(`
2
+
3
+ `)}function C(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${t} must be an object`);return e}function w(e,t){if(typeof e!=`string`||e.trim().length===0)throw Error(`${t} must be a non-empty string`);return e}function T(e,t){if(!Number.isFinite(e)||e<=0)throw RangeError(`${t} must be a positive finite number`);return e}export{s as AGENT_CONTROL_TOOLS,c as runAgent};
4
+ //# sourceMappingURL=run-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-agent.js","names":[],"sources":["../../../src/agent/mode/run-agent.ts"],"sourcesContent":["/** High-level agent modes built on the provider-neutral bounded tool loop. */\n\nimport { createUserMessage } from '../../message/index.ts'\nimport type { CallConfig } from '../../contract/index.ts'\nimport type { JsonObject } from '../../primitives/index.ts'\nimport { detachedFrozen } from '../../primitives/index.ts'\nimport { runTurn, type RunTurnOptions } from '../loop/run-turn.ts'\nimport { AwaitedEventQueue } from '../loop/queue.ts'\nimport type { AgentEvent, TurnBounds, TurnHooks, TurnOutcome } from '../loop/types.ts'\nimport { defineTool, type ToolDefinition, type ToolExecutionMode } from '../tool/definition.ts'\nimport { readSpillTool } from '../tool/output-budget.ts'\nimport type { ToolInterceptor } from '../tool/pipeline.ts'\nimport type { ToolCatalog } from '../tool/registry.ts'\nimport { waitForSettlement } from '../../async/index.ts'\nimport type {\n UserInputBroker, UserInputQuestion, UserInputRequest, UserInputResponse,\n} from './user-input.ts'\n\nexport const AGENT_CONTROL_TOOLS = Object.freeze({\n complete: 'submit_result',\n requestUserInput: 'request_user_input',\n} as const)\n\n/** Default high-level runtime requested by this SDK; `runTurn` remains provider-neutral. */\nexport type AgentMode = 'basic' | 'deep' | 'deep-human-in-loop'\n\ninterface AgentRunCommon extends Omit<RunTurnOptions, 'bounds' | 'commentary' | 'config' | 'hooks' | 'system' | 'tools'> {\n /** Explicit low-level model binding; composition users can select a configured provider default instead. */\n readonly config: CallConfig\n readonly tools?: ToolCatalog\n readonly system?: string\n /** Maximum normal model iterations. A forced final answer may use one extra request. */\n /** Model steps per prompt; 'auto' keeps completion and resource guards only. */\n readonly maxTurns?: number | 'auto'\n readonly bounds?: Omit<Partial<TurnBounds>, 'maxSteps'>\n readonly commentary?: RunTurnOptions['commentary']\n readonly hooks?: TurnHooks\n}\n\nexport interface BasicAgentOptions extends AgentRunCommon {\n readonly mode?: 'basic'\n}\n\nexport interface DeepAgentOptions extends AgentRunCommon {\n readonly mode: 'deep'\n /** Optional in deep mode: expose a blocking clarification tool when configured. */\n readonly userInput?: UserInputBroker\n}\n\nexport interface HumanInLoopAgentOptions extends AgentRunCommon {\n readonly mode: 'deep-human-in-loop'\n /** Required in HIL mode: the tool call remains parked until this broker answers. */\n readonly userInput: UserInputBroker\n}\n\nexport type RunAgentOptions = BasicAgentOptions | DeepAgentOptions | HumanInLoopAgentOptions\n\nexport interface CompletionSubmission {\n readonly summary: string\n readonly evidence: readonly string[]\n}\n\nexport interface AgentRunOutcome extends TurnOutcome {\n readonly mode: AgentMode\n /** Deep modes are complete only after the model explicitly submits its self-check. */\n readonly completed: boolean\n readonly completion?: CompletionSubmission\n}\n\ninterface AgentModeStartEvent {\n readonly type: 'agent-start'\n readonly mode: AgentMode\n readonly maxTurns: number | 'auto'\n}\ninterface UserInputRequestEvent {\n readonly type: 'user-input-request'\n readonly request: UserInputRequest\n}\ninterface UserInputResponseEvent {\n readonly type: 'user-input-response'\n readonly request: UserInputRequest\n readonly response: UserInputResponse | 'abort'\n}\ninterface AgentModeEndEvent {\n readonly type: 'agent-end'\n readonly outcome: AgentRunOutcome\n}\n\nexport type AgentRunEvent = AgentEvent\n | AgentModeStartEvent\n | UserInputRequestEvent\n | UserInputResponseEvent\n | AgentModeEndEvent\n\ninterface DeepState {\n completion: CompletionSubmission | undefined\n userAborted: boolean\n /** Answers without intervening substantive tool work or an accepted check. */\n unverifiedAnswers: number\n completionInvalidated: boolean\n}\n\nconst DEFAULT_MAX_TURNS = 16\n\n/** Changing the wording of an unsubmitted conclusion is not execution progress. */\nconst UNVERIFIED_ANSWER_LIMIT = 3\n\n/**\n * Run an agent in basic, self-checking deep, or deep human-in-loop mode.\n *\n * The low-level `turn-*`, trace, commentary, reasoning-summary, and tool events are\n * forwarded unchanged. High-level `agent-*` and `user-input-*` events make GUI\n * orchestration possible without parsing assistant prose.\n */\nexport function runAgent(options: RunAgentOptions): AsyncIterable<AgentRunEvent> {\n return {\n async * [Symbol.asyncIterator]() {\n const queue = new AwaitedEventQueue<AgentRunEvent>()\n const consumer = new AbortController()\n const teardownTimeoutMs = positiveFinite(options.teardownTimeoutMs ?? 30_000, 'teardownTimeoutMs')\n const signal = options.signal === undefined\n ? consumer.signal\n : AbortSignal.any([options.signal, consumer.signal])\n let tail = Promise.resolve()\n const emit = (event: AgentRunEvent): Promise<void> => {\n const next = tail.then(() => queue.push(detachedFrozen(event)))\n tail = next.catch(() => undefined)\n return next\n }\n const task = driveAgent(options, signal, emit)\n .then(async () => { await tail; queue.close() }, async error => { await tail; queue.fail(error) })\n\n try {\n while (true) {\n const item = await queue.take()\n if (item.done) break\n yield item.value\n }\n await task\n } finally {\n consumer.abort(new Error('agent event consumer stopped'))\n queue.close()\n if (!await waitForSettlement(task, teardownTimeoutMs)) {\n const error = new Error(\n `agent producer ignored cancellation for more than ${teardownTimeoutMs}ms`,\n { cause: consumer.signal.reason },\n ) as Error & { code: string }\n error.code = 'AGENT_TEARDOWN_TIMEOUT'\n throw error\n }\n }\n },\n }\n}\n\nasync function driveAgent(\n options: RunAgentOptions,\n signal: AbortSignal,\n emit: (event: AgentRunEvent) => Promise<void>,\n): Promise<void> {\n const mode: AgentMode = options.mode ?? 'basic'\n if (!['basic', 'deep', 'deep-human-in-loop'].includes(mode)) {\n throw new RangeError(`unsupported agent mode \"${String(mode)}\"`)\n }\n const configuredUserInput = 'userInput' in options ? options.userInput : undefined\n if (mode === 'deep-human-in-loop'\n && (configuredUserInput === undefined || typeof configuredUserInput.request !== 'function')) {\n throw new TypeError('deep-human-in-loop mode requires a UserInputBroker')\n }\n const maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS\n if (maxTurns !== 'auto' && (!Number.isSafeInteger(maxTurns) || maxTurns < 1)) {\n throw new RangeError(\"maxTurns must be a positive safe integer or 'auto'\")\n }\n await emit({ type: 'agent-start', mode, maxTurns })\n\n const state: DeepState = {\n completion: undefined, userAborted: false, unverifiedAnswers: 0, completionInvalidated: false,\n }\n const deep = mode !== 'basic'\n const broker = options.mode === 'deep' || options.mode === 'deep-human-in-loop'\n ? configuredUserInput\n : undefined\n const internalTools: ToolDefinition[] = []\n // Spilling without a way to read the spill back would be worse than cutting\n // the output: the model would be told the rest exists and given no way in.\n if (options.spillStore !== undefined) {\n internalTools.push(readSpillTool(options.spillStore) as ToolDefinition)\n }\n if (deep) internalTools.push(completionTool())\n if (broker !== undefined && mode !== 'basic') {\n internalTools.push(userInputTool(mode, broker, state, emit, options.accounting))\n }\n const tools = internalTools.length === 0 ? options.tools : combineTools(options.tools, internalTools)\n const hooks = deep ? deepHooks(options.hooks, options.history, state, maxTurns) : options.hooks\n const turnOptions: RunTurnOptions = {\n registry: options.registry,\n config: options.config,\n history: options.history,\n ...tools === undefined ? {} : { tools },\n ...options.nativeTools === undefined ? {} : { nativeTools: options.nativeTools },\n ...options.toolChoice === undefined ? {} : { toolChoice: options.toolChoice },\n ...options.imagePolicy === undefined ? {} : { imagePolicy: options.imagePolicy },\n ...(options.validateOutput === undefined ? {} : { validateOutput: options.validateOutput }),\n ...options.outputFormat === undefined ? {} : { outputFormat: options.outputFormat },\n system: joinSystem(options.system, modeSystem(mode, broker !== undefined)),\n ...options.interceptors === undefined ? {} : { interceptors: shieldControlTools(options.interceptors) },\n ...options.approvals === undefined ? {} : { approvals: options.approvals },\n bounds: { ...options.bounds, maxSteps: maxTurns },\n ...hooks === undefined ? {} : { hooks },\n signal,\n ...options.logger === undefined ? {} : { logger: options.logger },\n commentary: options.commentary ?? 'concise',\n teardownTimeoutMs: options.teardownTimeoutMs ?? 30_000,\n ...options.modelTimeoutMs === undefined ? {} : { modelTimeoutMs: options.modelTimeoutMs },\n ...options.maxModelRequestBytes === undefined ? {} : { maxModelRequestBytes: options.maxModelRequestBytes },\n ...options.maxModelResponseBytes === undefined ? {} : { maxModelResponseBytes: options.maxModelResponseBytes },\n ...options.maxModelStreamEvents === undefined ? {} : { maxModelStreamEvents: options.maxModelStreamEvents },\n ...options.hookTimeoutMs === undefined ? {} : { hookTimeoutMs: options.hookTimeoutMs },\n ...options.hookTeardownTimeoutMs === undefined ? {} : { hookTeardownTimeoutMs: options.hookTeardownTimeoutMs },\n ...options.trace === undefined ? {} : { trace: options.trace },\n ...options.accounting === undefined ? {} : { accounting: options.accounting },\n ...options.spillStore === undefined ? {} : { spillStore: options.spillStore },\n ...options.contextSections === undefined ? {} : { contextSections: options.contextSections },\n }\n\n let terminal: TurnOutcome | undefined\n let stepCalls: string[] = []\n let completionCandidate: CompletionSubmission | undefined\n for await (const event of runTurn(turnOptions)) {\n if (event.type === 'step-start') {\n stepCalls = []\n completionCandidate = undefined\n } else if (event.type === 'tool-call') {\n stepCalls.push(event.call.toolName)\n // Work performed after an accepted submission invalidates that submission;\n // the new result has not yet passed the completion gate.\n if (event.call.toolName !== AGENT_CONTROL_TOOLS.complete\n && tools?.get(event.call.toolName)?.completionExempt !== true) {\n if (state.completion !== undefined) state.completionInvalidated = true\n state.completion = undefined\n state.unverifiedAnswers = 0\n }\n } else if (event.type === 'tool-result'\n && event.call.toolName === AGENT_CONTROL_TOOLS.complete\n && !event.result.isError) {\n completionCandidate = completionFromResult(event.result.value)\n } else if (event.type === 'step-end'\n && completionCandidate !== undefined\n && stepCalls.filter(name => name === AGENT_CONTROL_TOOLS.complete).length === 1\n && stepCalls.every(name => name === AGENT_CONTROL_TOOLS.complete || tools?.get(name)?.completionExempt === true)) {\n // A completion submission cannot share a batch with work whose results the\n // model had not seen when it claimed success.\n state.completion = completionCandidate\n state.completionInvalidated = false\n }\n if (event.type === 'turn-end') terminal = event.outcome\n await emit(event)\n }\n if (terminal === undefined) throw new Error('runTurn ended without a turn-end event')\n const completed = mode === 'basic'\n ? terminal.reason.kind === 'completed' || terminal.reason.kind === 'concluded-by-tool'\n : state.completion !== undefined && !state.userAborted\n && (terminal.reason.kind === 'completed'\n || terminal.reason.kind === 'concluded-by-tool'\n || (terminal.reason.kind === 'budget-exhausted' && terminal.reason.forcedFinalAnswer))\n && terminal.text.trim() !== ''\n const outcome: AgentRunOutcome = {\n ...terminal,\n mode,\n completed,\n ...state.completion === undefined ? {} : { completion: state.completion },\n }\n await emit({ type: 'agent-end', outcome })\n}\n\nfunction completionTool(): ToolDefinition<CompletionSubmission> {\n return defineTool({\n name: AGENT_CONTROL_TOOLS.complete,\n description: 'Submit the self-check only when the user objective and constraints are fully satisfied. After acceptance, give the user the final answer.',\n // The one call that ENDS a deep run. A budget that can block it can leave\n // the run with no way to complete at all.\n budgetExempt: true,\n parameters: {\n type: 'object',\n properties: {\n summary: { type: 'string', description: 'Concise statement of what was completed.' },\n evidence: {\n type: 'array', items: { type: 'string' },\n description: 'Concrete checks or tool results showing the objective is satisfied.',\n },\n },\n required: ['summary', 'evidence'],\n additionalProperties: false,\n },\n parse: parseCompletion,\n execute: submission => ({\n accepted: true,\n summary: submission.summary,\n evidence: [...submission.evidence],\n instruction: 'This self-check is accepted for the current run. Now provide the substantive final report itself: findings or changes, evidence or sources, checks performed, and remaining limitations. Do not merely say the self-check passed or refer to an earlier message. Do not call submit_result again in this run unless you perform new substantive tool work that invalidates this submission. A later user request or worker follow-up starts a new run and needs its own self-check.',\n }),\n })\n}\n\nfunction userInputTool(\n mode: Exclude<AgentMode, 'basic'>,\n broker: UserInputBroker,\n state: DeepState,\n emit: (event: AgentRunEvent) => Promise<void>,\n accounting?: RunTurnOptions['accounting'],\n): ToolDefinition<{ readonly questions: readonly UserInputQuestion[] }> {\n return defineTool({\n name: AGENT_CONTROL_TOOLS.requestUserInput,\n // Asking the user is how a blocked run gets unblocked; a spent budget must\n // not be the reason the question is never asked.\n budgetExempt: true,\n description: mode === 'deep-human-in-loop'\n ? 'Ask the user one to three short questions when a material choice or missing fact requires human input, then wait for the response. Provide 2-3 mutually exclusive suggestions; free-form input is added by the client.'\n : 'Ask the user one to three short clarification questions only when blocked, then wait for the response. Provide suggested choices; free-form input is added by the client.',\n parameters: requestUserInputSchema(),\n parse: parseUserInput,\n execute: async ({ questions }, ctx) => {\n const operation = accounting?.startOperation('user-input', {\n toolCallId: ctx.callId,\n data: { questionCount: questions.length },\n })\n const request: UserInputRequest = {\n requestId: ctx.callId, callId: ctx.callId, turn: ctx.turn, step: ctx.step,\n questions, isBlocking: true,\n }\n // Start the broker first: an event consumer may resolve synchronously, and\n // the waiter must already exist when the request event becomes visible.\n try {\n const pending = broker.request(request, ctx.signal)\n await emit({ type: 'user-input-request', request })\n const response = await pending\n await emit({ type: 'user-input-response', request, response })\n if (response === 'abort') {\n state.userAborted = true\n ctx.concludeTurn()\n if (operation !== undefined) accounting?.endOperation(operation, 'aborted')\n return { aborted: true }\n }\n if (operation !== undefined) accounting?.endOperation(operation, 'success')\n return validateUserResponse(response, questions) as unknown as JsonObject\n } catch (error) {\n if (operation !== undefined) accounting?.endOperation(\n operation,\n ctx.signal.aborted ? 'aborted' : 'error',\n { error },\n )\n throw error\n }\n },\n })\n}\n\nfunction deepHooks(\n userHooks: TurnHooks | undefined,\n history: RunAgentOptions['history'],\n state: DeepState,\n maxTurns: number | 'auto',\n): TurnHooks {\n return {\n ...userHooks,\n onTurnEnd: async context => {\n await userHooks?.onTurnEnd?.(context)\n if (context.outcome.reason.kind !== 'completed'\n || (maxTurns !== 'auto' && context.outcome.steps >= maxTurns)\n || state.completion !== undefined\n || state.userAborted) return\n // Auto must not pay indefinitely for paraphrases of \"already checked\".\n // Substantive tool work resets this allowance; progress-only updates do not.\n state.unverifiedAnswers++\n if (state.unverifiedAnswers >= UNVERIFIED_ANSWER_LIMIT) return\n history.append({ kind: 'user', message: createUserMessage({\n source: { kind: 'app', producer: 'deep-mode-self-check' },\n content: [{\n type: 'text',\n text: (state.completionInvalidated\n ? `Your previously accepted submission is no longer current because you called another substantive tool afterwards. Review the later tool results and call ${AGENT_CONTROL_TOOLS.complete} again when complete; the old instruction not to resubmit no longer applies. `\n : '')\n + `Self-check required: this run has no accepted current self-check. Acceptance recorded in an earlier run does not complete this request or follow-up; an earlier instruction not to resubmit applied only to that earlier run. Compare the current result against the user's objective and every constraint. If anything is missing, continue with tools. If blocked and request_user_input is available, ask the user. Only when the work is actually complete, call ${AGENT_CONTROL_TOOLS.complete}. Rephrasing a completion claim without submitting does not satisfy this gate.`,\n }],\n }) })\n },\n }\n}\n\nclass CombinedToolCatalog implements ToolCatalog {\n private readonly definitions: ReadonlyMap<string, ToolDefinition>\n constructor(base: ToolCatalog | undefined, additions: readonly ToolDefinition[]) {\n const definitions = new Map<string, ToolDefinition>()\n for (const name of base?.names() ?? []) {\n const definition = base?.get(name)\n if (definition !== undefined) definitions.set(name, definition)\n }\n for (const definition of additions) {\n if (definitions.has(definition.name)) {\n throw new Error(`tool name \"${definition.name}\" is reserved by the selected agent mode`)\n }\n definitions.set(definition.name, definition)\n }\n this.definitions = definitions\n }\n get(name: string): ToolDefinition | undefined { return this.definitions.get(name) }\n has(name: string): boolean { return this.definitions.has(name) }\n names(): readonly string[] { return [...this.definitions.keys()] }\n schemas() {\n return [...this.definitions.values()].map(({ name, description, parameters }) => ({\n name, description, parameters: structuredClone(parameters),\n }))\n }\n executionMode(name: string, args: unknown): ToolExecutionMode {\n const definition = this.definitions.get(name)\n if (definition === undefined) return 'exclusive'\n try { return definition.isConcurrencySafe?.(args) === true ? 'parallel' : 'exclusive' }\n catch { return 'exclusive' }\n }\n}\n\nfunction combineTools(base: ToolCatalog | undefined, additions: readonly ToolDefinition[]): ToolCatalog {\n return new CombinedToolCatalog(base, additions)\n}\n\n/** Control tools are host protocol, not application capabilities subject to tool policy. */\nfunction shieldControlTools(interceptors: readonly ToolInterceptor[]): readonly ToolInterceptor[] {\n const reserved = new Set<string>(Object.values(AGENT_CONTROL_TOOLS))\n return interceptors.map(interceptor => ({\n name: interceptor.name,\n ...interceptor.before === undefined ? {} : {\n before: (call, next) => reserved.has(call.toolName) ? next() : interceptor.before!(call, next),\n },\n ...interceptor.around === undefined ? {} : {\n around: (call, next) => reserved.has(call.toolName) ? next() : interceptor.around!(call, next),\n },\n ...interceptor.after === undefined ? {} : {\n after: (call, result, next) => reserved.has(call.toolName) ? next() : interceptor.after!(call, result, next),\n },\n }))\n}\n\nfunction completionFromResult(value: unknown): CompletionSubmission {\n const result = record(value, 'submit_result result')\n return parseCompletion({ summary: result.summary, evidence: result.evidence })\n}\n\nfunction validateUserResponse(\n response: UserInputResponse,\n questions: readonly UserInputQuestion[],\n): UserInputResponse {\n const expected = new Set(questions.map(question => question.id))\n for (const id of expected) {\n const answer = response.answers[id]\n if (answer === undefined || !Array.isArray(answer.answers) || answer.answers.length === 0\n || answer.answers.some(value => typeof value !== 'string' || value.trim().length === 0)) {\n throw new Error(`the user-input broker returned no valid answer for \"${id}\"`)\n }\n }\n for (const id of Object.keys(response.answers)) {\n if (!expected.has(id)) throw new Error(`the user-input broker returned an answer for unknown question \"${id}\"`)\n }\n return response\n}\n\nfunction parseCompletion(raw: unknown): CompletionSubmission {\n const value = record(raw, 'submit_result arguments')\n if (typeof value.summary !== 'string' || value.summary.trim().length === 0) {\n throw new Error('summary must be a non-empty string')\n }\n if (!Array.isArray(value.evidence) || value.evidence.some(item => typeof item !== 'string' || item.trim().length === 0)) {\n throw new Error('evidence must be an array of non-empty strings')\n }\n return { summary: value.summary, evidence: value.evidence as string[] }\n}\n\nfunction parseUserInput(raw: unknown): { readonly questions: readonly UserInputQuestion[] } {\n const value = record(raw, 'request_user_input arguments')\n if (!Array.isArray(value.questions) || value.questions.length < 1 || value.questions.length > 3) {\n throw new Error('questions must contain one to three items')\n }\n const ids = new Set<string>()\n const questions = value.questions.map((rawQuestion, index) => {\n const question = record(rawQuestion, `questions[${index}]`)\n const id = requiredString(question.id, `questions[${index}].id`)\n if (!/^[a-z][a-z0-9_]*$/.test(id)) throw new Error(`questions[${index}].id must be snake_case`)\n if (ids.has(id)) throw new Error(`question id \"${id}\" is duplicated`)\n ids.add(id)\n const header = requiredString(question.header, `questions[${index}].header`)\n const prompt = requiredString(question.question, `questions[${index}].question`)\n if (!Array.isArray(question.options) || question.options.length < 2 || question.options.length > 3) {\n throw new Error(`questions[${index}].options must contain two or three choices`)\n }\n const options = question.options.map((rawOption, optionIndex) => {\n const option = record(rawOption, `questions[${index}].options[${optionIndex}]`)\n return {\n label: requiredString(option.label, `questions[${index}].options[${optionIndex}].label`),\n description: requiredString(option.description, `questions[${index}].options[${optionIndex}].description`),\n }\n })\n return Object.freeze({ id, header, question: prompt, options: Object.freeze(options), allowFreeForm: true as const })\n })\n return { questions: Object.freeze(questions) }\n}\n\nfunction requestUserInputSchema(): Record<string, unknown> {\n return {\n type: 'object',\n properties: {\n questions: {\n type: 'array', minItems: 1, maxItems: 3,\n description: 'Questions to show the user. Prefer one and do not exceed three.',\n items: {\n type: 'object', additionalProperties: false,\n properties: {\n id: { type: 'string', description: 'Stable snake_case answer key.' },\n header: { type: 'string', description: 'Short UI label, ideally 12 characters or fewer.' },\n question: { type: 'string', description: 'Single-sentence question.' },\n options: {\n type: 'array', minItems: 2, maxItems: 3,\n description: 'Mutually exclusive choices. Put the recommended choice first and suffix its label with \"(Recommended)\". Do not add Other; the client supplies free-form input.',\n items: {\n type: 'object', additionalProperties: false,\n properties: {\n label: { type: 'string', description: 'User-facing label, one to five words.' },\n description: { type: 'string', description: 'One sentence explaining impact or trade-off.' },\n },\n required: ['label', 'description'],\n },\n },\n },\n required: ['id', 'header', 'question', 'options'],\n },\n },\n },\n required: ['questions'],\n additionalProperties: false,\n }\n}\n\nfunction modeSystem(mode: AgentMode, canAskUser: boolean): string {\n if (mode === 'basic') return [\n 'Work as a bounded tool-using agent. Use available tools proactively when they materially improve correctness.',\n 'Stay within the configured iteration budget, then give the best final answer supported by the gathered results.',\n ].join(' ')\n const ask = canAskUser\n ? `If a missing fact or material user choice blocks correct progress, call ${AGENT_CONTROL_TOOLS.requestUserInput} and continue after the answer.`\n : 'If blocked by missing user input, state that limitation plainly in the final response.'\n const hil = mode === 'deep-human-in-loop'\n ? 'For material choices, surface 2-3 concise options with the recommended option first; the UI also permits free-form feedback.'\n : ''\n return [\n 'Work autonomously in deep mode. After every tool result, compare the evidence against the user objective and all constraints; continue until gaps are closed.',\n `Do not treat a plausible draft as completion. When the work is actually complete, call ${AGENT_CONTROL_TOOLS.complete} with a summary and concrete evidence, then provide the final answer.`,\n ask, hil,\n 'Never reveal private chain-of-thought. Use concise user-visible commentary for intent, progress, observations, and decisions.',\n ].filter(Boolean).join(' ')\n}\n\nfunction joinSystem(...parts: readonly (string | undefined)[]): string {\n return parts.filter((part): part is string => part !== undefined && part.length > 0).join('\\n\\n')\n}\n\nfunction record(value: unknown, label: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new Error(`${label} must be an object`)\n return value as Record<string, unknown>\n}\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) throw new Error(`${label} must be a non-empty string`)\n return value\n}\nfunction positiveFinite(value: number, name: string): number {\n if (!Number.isFinite(value) || value <= 0) throw new RangeError(`${name} must be a positive finite number`)\n return value\n}\n"],"mappings":"wYAkBA,MAAa,EAAsB,OAAO,OAAO,CAC/C,SAAU,gBACV,iBAAkB,oBACpB,CAAU,EA6FV,SAAgB,EAAS,EAAwD,CAC/E,MAAO,CACL,OAAS,OAAO,gBAAiB,CAC/B,IAAM,EAAQ,IAAI,EACZ,EAAW,IAAI,gBACf,EAAoB,EAAe,EAAQ,mBAAqB,IAAQ,mBAAmB,EAC3F,EAAS,EAAQ,SAAW,IAAA,GAC9B,EAAS,OACT,YAAY,IAAI,CAAC,EAAQ,OAAQ,EAAS,MAAM,CAAC,EACjD,EAAO,QAAQ,QAAQ,EAMrB,EAAO,EAAW,EAAS,EALnB,GAAwC,CACpD,IAAM,EAAO,EAAK,SAAW,EAAM,KAAK,EAAe,CAAK,CAAC,CAAC,EAE9D,MADA,GAAO,EAAK,UAAY,IAAA,EAAS,EAC1B,CACT,CAC6C,CAAC,CAC3C,KAAK,SAAY,CAAE,MAAM,EAAM,EAAM,MAAM,CAAE,EAAG,KAAM,IAAS,CAAE,MAAM,EAAM,EAAM,KAAK,CAAK,CAAE,CAAC,EAEnG,GAAI,CACF,OAAa,CACX,IAAM,EAAO,MAAM,EAAM,KAAK,EAC9B,GAAI,EAAK,KAAM,MACf,MAAM,EAAK,KACb,CACA,MAAM,CACR,QAAU,CAGR,GAFA,EAAS,MAAU,MAAM,8BAA8B,CAAC,EACxD,EAAM,MAAM,EACR,CAAC,MAAM,EAAkB,EAAM,CAAiB,EAAG,CACrD,IAAM,EAAY,MAChB,qDAAqD,EAAkB,IACvE,CAAE,MAAO,EAAS,OAAO,MAAO,CAClC,EAEA,KADA,GAAM,KAAO,yBACP,CACR,CACF,CACF,CACF,CACF,CAEA,eAAe,EACb,EACA,EACA,EACe,CACf,IAAM,EAAkB,EAAQ,MAAQ,QACxC,GAAI,CAAC,CAAC,QAAS,OAAQ,oBAAoB,CAAC,CAAC,SAAS,CAAI,EACxD,MAAU,WAAW,2BAA2B,OAAO,CAAI,EAAE,EAAE,EAEjE,IAAM,EAAsB,cAAe,EAAU,EAAQ,UAAY,IAAA,GACzE,GAAI,IAAS,uBACP,IAAwB,IAAA,IAAa,OAAO,EAAoB,SAAY,YAChF,MAAU,UAAU,oDAAoD,EAE1E,IAAM,EAAW,EAAQ,UAAY,GACrC,GAAI,IAAa,SAAW,CAAC,OAAO,cAAc,CAAQ,GAAK,EAAW,GACxE,MAAU,WAAW,oDAAoD,EAE3E,MAAM,EAAK,CAAE,KAAM,cAAe,OAAM,UAAS,CAAC,EAElD,IAAM,EAAmB,CACvB,WAAY,IAAA,GAAW,YAAa,GAAO,kBAAmB,EAAG,sBAAuB,EAC1F,EACM,EAAO,IAAS,QAChB,EAAS,EAAQ,OAAS,QAAU,EAAQ,OAAS,qBACvD,EACA,IAAA,GACE,EAAkC,CAAC,EAGrC,EAAQ,aAAe,IAAA,IACzB,EAAc,KAAK,EAAc,EAAQ,UAAU,CAAmB,EAEpE,GAAM,EAAc,KAAK,EAAe,CAAC,EACzC,IAAW,IAAA,IAAa,IAAS,SACnC,EAAc,KAAK,EAAc,EAAM,EAAQ,EAAO,EAAM,EAAQ,UAAU,CAAC,EAEjF,IAAM,EAAQ,EAAc,SAAW,EAAI,EAAQ,MAAQ,EAAa,EAAQ,MAAO,CAAa,EAC9F,EAAQ,EAAO,EAAU,EAAQ,MAAO,EAAQ,QAAS,EAAO,CAAQ,EAAI,EAAQ,MACpF,EAA8B,CAClC,SAAU,EAAQ,SAClB,OAAQ,EAAQ,OAChB,QAAS,EAAQ,QACjB,GAAG,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,OAAM,EACtC,GAAG,EAAQ,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAQ,WAAY,EAC/E,GAAG,EAAQ,aAAe,IAAA,GAAY,CAAC,EAAI,CAAE,WAAY,EAAQ,UAAW,EAC5E,GAAG,EAAQ,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAQ,WAAY,EAC/E,GAAI,EAAQ,iBAAmB,IAAA,GAAY,CAAC,EAAI,CAAE,eAAgB,EAAQ,cAAe,EACzF,GAAG,EAAQ,eAAiB,IAAA,GAAY,CAAC,EAAI,CAAE,aAAc,EAAQ,YAAa,EAClF,OAAQ,EAAW,EAAQ,OAAQ,EAAW,EAAM,IAAW,IAAA,EAAS,CAAC,EACzE,GAAG,EAAQ,eAAiB,IAAA,GAAY,CAAC,EAAI,CAAE,aAAc,EAAmB,EAAQ,YAAY,CAAE,EACtG,GAAG,EAAQ,YAAc,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAQ,SAAU,EACzE,OAAQ,CAAE,GAAG,EAAQ,OAAQ,SAAU,CAAS,EAChD,GAAG,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,OAAM,EACtC,SACA,GAAG,EAAQ,SAAW,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAQ,MAAO,EAChE,WAAY,EAAQ,YAAc,UAClC,kBAAmB,EAAQ,mBAAqB,IAChD,GAAG,EAAQ,iBAAmB,IAAA,GAAY,CAAC,EAAI,CAAE,eAAgB,EAAQ,cAAe,EACxF,GAAG,EAAQ,uBAAyB,IAAA,GAAY,CAAC,EAAI,CAAE,qBAAsB,EAAQ,oBAAqB,EAC1G,GAAG,EAAQ,wBAA0B,IAAA,GAAY,CAAC,EAAI,CAAE,sBAAuB,EAAQ,qBAAsB,EAC7G,GAAG,EAAQ,uBAAyB,IAAA,GAAY,CAAC,EAAI,CAAE,qBAAsB,EAAQ,oBAAqB,EAC1G,GAAG,EAAQ,gBAAkB,IAAA,GAAY,CAAC,EAAI,CAAE,cAAe,EAAQ,aAAc,EACrF,GAAG,EAAQ,wBAA0B,IAAA,GAAY,CAAC,EAAI,CAAE,sBAAuB,EAAQ,qBAAsB,EAC7G,GAAG,EAAQ,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAQ,KAAM,EAC7D,GAAG,EAAQ,aAAe,IAAA,GAAY,CAAC,EAAI,CAAE,WAAY,EAAQ,UAAW,EAC5E,GAAG,EAAQ,aAAe,IAAA,GAAY,CAAC,EAAI,CAAE,WAAY,EAAQ,UAAW,EAC5E,GAAG,EAAQ,kBAAoB,IAAA,GAAY,CAAC,EAAI,CAAE,gBAAiB,EAAQ,eAAgB,CAC7F,EAEI,EACA,EAAsB,CAAC,EACvB,EACJ,UAAW,IAAM,KAAS,EAAQ,CAAW,EACvC,EAAM,OAAS,cACjB,EAAY,CAAC,EACb,EAAsB,IAAA,IACb,EAAM,OAAS,aACxB,EAAU,KAAK,EAAM,KAAK,QAAQ,EAG9B,EAAM,KAAK,WAAa,EAAoB,UAC3C,GAAO,IAAI,EAAM,KAAK,QAAQ,CAAC,EAAE,mBAAqB,KACrD,EAAM,aAAe,IAAA,KAAW,EAAM,sBAAwB,IAClE,EAAM,WAAa,IAAA,GACnB,EAAM,kBAAoB,IAEnB,EAAM,OAAS,eACrB,EAAM,KAAK,WAAa,EAAoB,UAC5C,CAAC,EAAM,OAAO,QACjB,EAAsB,EAAqB,EAAM,OAAO,KAAK,EACpD,EAAM,OAAS,YACrB,IAAwB,IAAA,IACxB,EAAU,OAAO,GAAQ,IAAS,EAAoB,QAAQ,CAAC,CAAC,SAAW,GAC3E,EAAU,MAAM,GAAQ,IAAS,EAAoB,UAAY,GAAO,IAAI,CAAI,CAAC,EAAE,mBAAqB,EAAI,IAG/G,EAAM,WAAa,EACnB,EAAM,sBAAwB,IAE5B,EAAM,OAAS,aAAY,EAAW,EAAM,SAChD,MAAM,EAAK,CAAK,EAElB,GAAI,IAAa,IAAA,GAAW,MAAU,MAAM,wCAAwC,EACpF,IAAM,EAAY,IAAS,QACvB,EAAS,OAAO,OAAS,aAAe,EAAS,OAAO,OAAS,oBACjE,EAAM,aAAe,IAAA,IAAa,CAAC,EAAM,cACrC,EAAS,OAAO,OAAS,aACxB,EAAS,OAAO,OAAS,qBACxB,EAAS,OAAO,OAAS,oBAAsB,EAAS,OAAO,oBAClE,EAAS,KAAK,KAAK,IAAM,GAOhC,MAAM,EAAK,CAAE,KAAM,YAAa,QAAA,CAL9B,GAAG,EACH,OACA,YACA,GAAG,EAAM,aAAe,IAAA,GAAY,CAAC,EAAI,CAAE,WAAY,EAAM,UAAW,CAEpC,CAAE,CAAC,CAC3C,CAEA,SAAS,GAAuD,CAC9D,OAAO,EAAW,CAChB,KAAM,EAAoB,SAC1B,YAAa,4IAGb,aAAc,GACd,WAAY,CACV,KAAM,SACN,WAAY,CACV,QAAS,CAAE,KAAM,SAAU,YAAa,0CAA2C,EACnF,SAAU,CACR,KAAM,QAAS,MAAO,CAAE,KAAM,QAAS,EACvC,YAAa,qEACf,CACF,EACA,SAAU,CAAC,UAAW,UAAU,EAChC,qBAAsB,EACxB,EACA,MAAO,EACP,QAAS,IAAe,CACtB,SAAU,GACV,QAAS,EAAW,QACpB,SAAU,CAAC,GAAG,EAAW,QAAQ,EACjC,YAAa,qdACf,EACF,CAAC,CACH,CAEA,SAAS,EACP,EACA,EACA,EACA,EACA,EACsE,CACtE,OAAO,EAAW,CAChB,KAAM,EAAoB,iBAG1B,aAAc,GACd,YAAa,IAAS,qBAClB,yNACA,4KACJ,WAAY,EAAuB,EACnC,MAAO,EACP,QAAS,MAAO,CAAE,aAAa,IAAQ,CACrC,IAAM,EAAY,GAAY,eAAe,aAAc,CACzD,WAAY,EAAI,OAChB,KAAM,CAAE,cAAe,EAAU,MAAO,CAC1C,CAAC,EACK,EAA4B,CAChC,UAAW,EAAI,OAAQ,OAAQ,EAAI,OAAQ,KAAM,EAAI,KAAM,KAAM,EAAI,KACrE,YAAW,WAAY,EACzB,EAGA,GAAI,CACF,IAAM,EAAU,EAAO,QAAQ,EAAS,EAAI,MAAM,EAClD,MAAM,EAAK,CAAE,KAAM,qBAAsB,SAAQ,CAAC,EAClD,IAAM,EAAW,MAAM,EASvB,OARA,MAAM,EAAK,CAAE,KAAM,sBAAuB,UAAS,UAAS,CAAC,EACzD,IAAa,SACf,EAAM,YAAc,GACpB,EAAI,aAAa,EACb,IAAc,IAAA,IAAW,GAAY,aAAa,EAAW,SAAS,EACnE,CAAE,QAAS,EAAK,IAErB,IAAc,IAAA,IAAW,GAAY,aAAa,EAAW,SAAS,EACnE,EAAqB,EAAU,CAAS,EACjD,OAAS,EAAO,CAMd,MALI,IAAc,IAAA,IAAW,GAAY,aACvC,EACA,EAAI,OAAO,QAAU,UAAY,QACjC,CAAE,OAAM,CACV,EACM,CACR,CACF,CACF,CAAC,CACH,CAEA,SAAS,EACP,EACA,EACA,EACA,EACW,CACX,MAAO,CACL,GAAG,EACH,UAAW,KAAM,IAAW,CAC1B,MAAM,GAAW,YAAY,CAAO,EAChC,IAAQ,QAAQ,OAAO,OAAS,aAC9B,IAAa,QAAU,EAAQ,QAAQ,OAAS,GACjD,EAAM,aAAe,IAAA,IACrB,EAAM,eAGX,EAAM,oBACF,IAAM,mBAAqB,IAC/B,EAAQ,OAAO,CAAE,KAAM,OAAQ,QAAS,EAAkB,CACxD,OAAQ,CAAE,KAAM,MAAO,SAAU,sBAAuB,EACxD,QAAS,CAAC,CACR,KAAM,OACN,MAAO,EAAM,sBACT,2JAA2J,EAAoB,SAAS,+EACxL,IACA,wcAAwc,EAAoB,SAAS,+EAC3e,CAAC,CACH,CAAC,CAAE,CAAC,EACN,CACF,CACF,CAEA,IAAM,EAAN,KAAiD,CAC/C,YACA,YAAY,EAA+B,EAAsC,CAC/E,IAAM,EAAc,IAAI,IACxB,IAAK,IAAM,KAAQ,GAAM,MAAM,GAAK,CAAC,EAAG,CACtC,IAAM,EAAa,GAAM,IAAI,CAAI,EAC7B,IAAe,IAAA,IAAW,EAAY,IAAI,EAAM,CAAU,CAChE,CACA,IAAK,IAAM,KAAc,EAAW,CAClC,GAAI,EAAY,IAAI,EAAW,IAAI,EACjC,MAAU,MAAM,cAAc,EAAW,KAAK,yCAAyC,EAEzF,EAAY,IAAI,EAAW,KAAM,CAAU,CAC7C,CACA,KAAK,YAAc,CACrB,CACA,IAAI,EAA0C,CAAE,OAAO,KAAK,YAAY,IAAI,CAAI,CAAE,CAClF,IAAI,EAAuB,CAAE,OAAO,KAAK,YAAY,IAAI,CAAI,CAAE,CAC/D,OAA2B,CAAE,MAAO,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAE,CACjE,SAAU,CACR,MAAO,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAE,OAAM,cAAa,iBAAkB,CAChF,OAAM,cAAa,WAAY,gBAAgB,CAAU,CAC3D,EAAE,CACJ,CACA,cAAc,EAAc,EAAkC,CAC5D,IAAM,EAAa,KAAK,YAAY,IAAI,CAAI,EAC5C,GAAI,IAAe,IAAA,GAAW,MAAO,YACrC,GAAI,CAAE,OAAO,EAAW,oBAAoB,CAAI,IAAM,GAAO,WAAa,WAAY,MAChF,CAAE,MAAO,WAAY,CAC7B,CACF,EAEA,SAAS,EAAa,EAA+B,EAAmD,CACtG,OAAO,IAAI,EAAoB,EAAM,CAAS,CAChD,CAGA,SAAS,EAAmB,EAAsE,CAChG,IAAM,EAAW,IAAI,IAAY,OAAO,OAAO,CAAmB,CAAC,EACnE,OAAO,EAAa,IAAI,IAAgB,CACtC,KAAM,EAAY,KAClB,GAAG,EAAY,SAAW,IAAA,GAAY,CAAC,EAAI,CACzC,QAAS,EAAM,IAAS,EAAS,IAAI,EAAK,QAAQ,EAAI,EAAK,EAAI,EAAY,OAAQ,EAAM,CAAI,CAC/F,EACA,GAAG,EAAY,SAAW,IAAA,GAAY,CAAC,EAAI,CACzC,QAAS,EAAM,IAAS,EAAS,IAAI,EAAK,QAAQ,EAAI,EAAK,EAAI,EAAY,OAAQ,EAAM,CAAI,CAC/F,EACA,GAAG,EAAY,QAAU,IAAA,GAAY,CAAC,EAAI,CACxC,OAAQ,EAAM,EAAQ,IAAS,EAAS,IAAI,EAAK,QAAQ,EAAI,EAAK,EAAI,EAAY,MAAO,EAAM,EAAQ,CAAI,CAC7G,CACF,EAAE,CACJ,CAEA,SAAS,EAAqB,EAAsC,CAClE,IAAM,EAAS,EAAO,EAAO,sBAAsB,EACnD,OAAO,EAAgB,CAAE,QAAS,EAAO,QAAS,SAAU,EAAO,QAAS,CAAC,CAC/E,CAEA,SAAS,EACP,EACA,EACmB,CACnB,IAAM,EAAW,IAAI,IAAI,EAAU,IAAI,GAAY,EAAS,EAAE,CAAC,EAC/D,IAAK,IAAM,KAAM,EAAU,CACzB,IAAM,EAAS,EAAS,QAAQ,GAChC,GAAI,IAAW,IAAA,IAAa,CAAC,MAAM,QAAQ,EAAO,OAAO,GAAK,EAAO,QAAQ,SAAW,GACnF,EAAO,QAAQ,KAAK,GAAS,OAAO,GAAU,UAAY,EAAM,KAAK,CAAC,CAAC,SAAW,CAAC,EACtF,MAAU,MAAM,uDAAuD,EAAG,EAAE,CAEhF,CACA,IAAK,IAAM,KAAM,OAAO,KAAK,EAAS,OAAO,EAC3C,GAAI,CAAC,EAAS,IAAI,CAAE,EAAG,MAAU,MAAM,kEAAkE,EAAG,EAAE,EAEhH,OAAO,CACT,CAEA,SAAS,EAAgB,EAAoC,CAC3D,IAAM,EAAQ,EAAO,EAAK,yBAAyB,EACnD,GAAI,OAAO,EAAM,SAAY,UAAY,EAAM,QAAQ,KAAK,CAAC,CAAC,SAAW,EACvE,MAAU,MAAM,oCAAoC,EAEtD,GAAI,CAAC,MAAM,QAAQ,EAAM,QAAQ,GAAK,EAAM,SAAS,KAAK,GAAQ,OAAO,GAAS,UAAY,EAAK,KAAK,CAAC,CAAC,SAAW,CAAC,EACpH,MAAU,MAAM,gDAAgD,EAElE,MAAO,CAAE,QAAS,EAAM,QAAS,SAAU,EAAM,QAAqB,CACxE,CAEA,SAAS,EAAe,EAAoE,CAC1F,IAAM,EAAQ,EAAO,EAAK,8BAA8B,EACxD,GAAI,CAAC,MAAM,QAAQ,EAAM,SAAS,GAAK,EAAM,UAAU,OAAS,GAAK,EAAM,UAAU,OAAS,EAC5F,MAAU,MAAM,2CAA2C,EAE7D,IAAM,EAAM,IAAI,IACV,EAAY,EAAM,UAAU,KAAK,EAAa,IAAU,CAC5D,IAAM,EAAW,EAAO,EAAa,aAAa,EAAM,EAAE,EACpD,EAAK,EAAe,EAAS,GAAI,aAAa,EAAM,KAAK,EAC/D,GAAI,CAAC,oBAAoB,KAAK,CAAE,EAAG,MAAU,MAAM,aAAa,EAAM,wBAAwB,EAC9F,GAAI,EAAI,IAAI,CAAE,EAAG,MAAU,MAAM,gBAAgB,EAAG,gBAAgB,EACpE,EAAI,IAAI,CAAE,EACV,IAAM,EAAS,EAAe,EAAS,OAAQ,aAAa,EAAM,SAAS,EACrE,EAAS,EAAe,EAAS,SAAU,aAAa,EAAM,WAAW,EAC/E,GAAI,CAAC,MAAM,QAAQ,EAAS,OAAO,GAAK,EAAS,QAAQ,OAAS,GAAK,EAAS,QAAQ,OAAS,EAC/F,MAAU,MAAM,aAAa,EAAM,4CAA4C,EAEjF,IAAM,EAAU,EAAS,QAAQ,KAAK,EAAW,IAAgB,CAC/D,IAAM,EAAS,EAAO,EAAW,aAAa,EAAM,YAAY,EAAY,EAAE,EAC9E,MAAO,CACL,MAAO,EAAe,EAAO,MAAO,aAAa,EAAM,YAAY,EAAY,QAAQ,EACvF,YAAa,EAAe,EAAO,YAAa,aAAa,EAAM,YAAY,EAAY,cAAc,CAC3G,CACF,CAAC,EACD,OAAO,OAAO,OAAO,CAAE,KAAI,SAAQ,SAAU,EAAQ,QAAS,OAAO,OAAO,CAAO,EAAG,cAAe,EAAc,CAAC,CACtH,CAAC,EACD,MAAO,CAAE,UAAW,OAAO,OAAO,CAAS,CAAE,CAC/C,CAEA,SAAS,GAAkD,CACzD,MAAO,CACL,KAAM,SACN,WAAY,CACV,UAAW,CACT,KAAM,QAAS,SAAU,EAAG,SAAU,EACtC,YAAa,kEACb,MAAO,CACL,KAAM,SAAU,qBAAsB,GACtC,WAAY,CACV,GAAI,CAAE,KAAM,SAAU,YAAa,+BAAgC,EACnE,OAAQ,CAAE,KAAM,SAAU,YAAa,iDAAkD,EACzF,SAAU,CAAE,KAAM,SAAU,YAAa,2BAA4B,EACrE,QAAS,CACP,KAAM,QAAS,SAAU,EAAG,SAAU,EACtC,YAAa,iKACb,MAAO,CACL,KAAM,SAAU,qBAAsB,GACtC,WAAY,CACV,MAAO,CAAE,KAAM,SAAU,YAAa,uCAAwC,EAC9E,YAAa,CAAE,KAAM,SAAU,YAAa,8CAA+C,CAC7F,EACA,SAAU,CAAC,QAAS,aAAa,CACnC,CACF,CACF,EACA,SAAU,CAAC,KAAM,SAAU,WAAY,SAAS,CAClD,CACF,CACF,EACA,SAAU,CAAC,WAAW,EACtB,qBAAsB,EACxB,CACF,CAEA,SAAS,EAAW,EAAiB,EAA6B,CAChE,GAAI,IAAS,QAAS,MAAO,CAC3B,gHACA,iHACF,CAAC,CAAC,KAAK,GAAG,EACV,IAAM,EAAM,EACR,2EAA2E,EAAoB,iBAAiB,iCAChH,yFACE,EAAM,IAAS,qBACjB,+HACA,GACJ,MAAO,CACL,gKACA,0FAA0F,EAAoB,SAAS,uEACvH,EAAK,EACL,+HACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAC5B,CAEA,SAAS,EAAW,GAAG,EAAgD,CACrE,OAAO,EAAM,OAAQ,GAAyB,IAAS,IAAA,IAAa,EAAK,OAAS,CAAC,CAAC,CAAC,KAAK;;CAAM,CAClG,CAEA,SAAS,EAAO,EAAgB,EAAwC,CACtE,GAAI,OAAO,GAAU,WAAY,GAAkB,MAAM,QAAQ,CAAK,EAAG,MAAU,MAAM,GAAG,EAAM,mBAAmB,EACrH,OAAO,CACT,CACA,SAAS,EAAe,EAAgB,EAAuB,CAC7D,GAAI,OAAO,GAAU,UAAY,EAAM,KAAK,CAAC,CAAC,SAAW,EAAG,MAAU,MAAM,GAAG,EAAM,4BAA4B,EACjH,OAAO,CACT,CACA,SAAS,EAAe,EAAe,EAAsB,CAC3D,GAAI,CAAC,OAAO,SAAS,CAAK,GAAK,GAAS,EAAG,MAAU,WAAW,GAAG,EAAK,kCAAkC,EAC1G,OAAO,CACT"}
@@ -0,0 +1,61 @@
1
+ import { ToolCallId } from "../../primitives/brand.js";
2
+ //#region src/agent/mode/user-input.d.ts
3
+ interface UserInputOption {
4
+ /** Short text shown on the choice button. */
5
+ readonly label: string;
6
+ /** One sentence explaining the consequence or trade-off. */
7
+ readonly description: string;
8
+ }
9
+ interface UserInputQuestion {
10
+ /** Stable snake_case key used to map the answer. */
11
+ readonly id: string;
12
+ /** Compact UI heading (12 characters or fewer is recommended). */
13
+ readonly header: string;
14
+ /** The single question shown to the user. */
15
+ readonly question: string;
16
+ /** Two or three mutually exclusive suggestions. Free-form input is separate. */
17
+ readonly options: readonly UserInputOption[];
18
+ /** A UI should offer a free-form answer in addition to the suggestions. */
19
+ readonly allowFreeForm: true;
20
+ }
21
+ interface UserInputRequest {
22
+ /** The provider tool-call id is the durable correlation id. */
23
+ readonly requestId: ToolCallId;
24
+ readonly callId: ToolCallId;
25
+ readonly turn: number;
26
+ readonly step: number;
27
+ readonly questions: readonly UserInputQuestion[];
28
+ readonly isBlocking: true;
29
+ }
30
+ interface UserInputAnswer {
31
+ /** One or more selected labels or free-form strings. */
32
+ readonly answers: readonly string[];
33
+ }
34
+ interface UserInputResponse {
35
+ /** Answers keyed by {@link UserInputQuestion.id}. */
36
+ readonly answers: Readonly<Record<string, UserInputAnswer>>;
37
+ }
38
+ type UserInputDecision = UserInputResponse | 'abort';
39
+ interface UserInputBroker {
40
+ readonly request: (request: UserInputRequest, signal?: AbortSignal) => Promise<UserInputDecision>;
41
+ }
42
+ interface InteractiveUserInputBroker extends UserInputBroker {
43
+ pending(): readonly UserInputRequest[];
44
+ onRequest(listener: (request: UserInputRequest) => void): () => void;
45
+ resolve(requestId: ToolCallId, response: UserInputResponse): boolean;
46
+ abortAll(): void;
47
+ }
48
+ interface InteractiveUserInputBrokerOptions {
49
+ /** Maximum requests parked across concurrent sessions. Defaults to 1,024. */
50
+ readonly maxPending?: number;
51
+ }
52
+ /**
53
+ * Create a broker for GUIs and CLIs that pause one tool call and resume it by id.
54
+ * The waiter is installed before listeners run, so a synchronous listener is safe.
55
+ */
56
+ declare function createUserInputBroker(options?: InteractiveUserInputBrokerOptions): InteractiveUserInputBroker;
57
+ /** A headless broker useful for policy-driven runs and tests. */
58
+ declare function fixedUserInputBroker(response: UserInputResponse | ((request: UserInputRequest) => UserInputDecision | Promise<UserInputDecision>)): UserInputBroker;
59
+ //#endregion
60
+ export { InteractiveUserInputBroker, InteractiveUserInputBrokerOptions, UserInputAnswer, UserInputBroker, UserInputDecision, UserInputOption, UserInputQuestion, UserInputRequest, UserInputResponse, createUserInputBroker, fixedUserInputBroker };
61
+ //# sourceMappingURL=user-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-input.d.ts","names":[],"sources":["../../../src/agent/mode/user-input.ts"],"mappings":";;UAKiB;;WAEN;;WAEA;;UAGM;;WAEN;;WAEA;;WAEA;;WAEA,kBAAkB;;WAElB;;UAGM;;WAEN,WAAW;WACX,QAAQ;WACR;WACA;WACA,oBAAoB;WACpB;;UAGM;;WAEN;;UAGM;;WAEN,SAAS,SAAS,eAAe;;KAGhC,oBAAoB;UAEf;WACN,UAAU,SAAS,kBAAkB,SAAS,gBAAgB,QAAQ;;UAGhE,mCAAmC;EAClD,oBAAoB;EACpB,UAAU,WAAW,SAAS;EAC9B,QAAQ,WAAW,YAAY,UAAU;EACzC;;UAGe;;WAEN;;;;;;iBAYK,sBAAsB,UAAS,oCAAyC;;iBA8DxE,qBACd,UAAU,sBAAsB,SAAS,qBAAqB,oBAAoB,QAAQ,sBACzF"}
@@ -0,0 +1,2 @@
1
+ import{detachedFrozen as e}from"../../primitives/snapshot.js";function t(t={}){let r=n(t.maxPending??1024,`user-input maxPending`),i=new Map,a=new Set;return{request(t,n){if(n?.aborted===!0)return Promise.resolve(`abort`);if(i.has(t.requestId))return Promise.reject(Error(`user-input request '${t.requestId}' is already pending`));if(i.size>=r)return Promise.reject(Error(`user-input broker reached its ${r}-request limit`));let o=e(t);return new Promise(e=>{let r=!1,s=a=>{r||(r=!0,i.delete(t.requestId),n?.removeEventListener(`abort`,c),e(a))};function c(){s(`abort`)}i.set(t.requestId,{request:o,settle:s}),n?.addEventListener(`abort`,c,{once:!0});for(let e of[...a])try{e(o)}catch{}})},pending(){return[...i.values()].map(e=>e.request)},onRequest(e){return a.add(e),()=>void a.delete(e)},resolve(t,n){let r=i.get(t);return r!==void 0&&(r.settle(e(n)),!0)},abortAll(){for(let e of[...i.values()])e.settle(`abort`)}}}function n(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`${t} must be a positive safe integer`);return e}function r(e){return{request:t=>Promise.resolve(typeof e==`function`?e(t):e)}}export{t as createUserInputBroker,r as fixedUserInputBroker};
2
+ //# sourceMappingURL=user-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-input.js","names":[],"sources":["../../../src/agent/mode/user-input.ts"],"sourcesContent":["/** Human input as a resumable, call-id-addressed boundary. */\n\nimport type { ToolCallId } from '../../primitives/index.ts'\nimport { detachedFrozen } from '../../primitives/index.ts'\n\nexport interface UserInputOption {\n /** Short text shown on the choice button. */\n readonly label: string\n /** One sentence explaining the consequence or trade-off. */\n readonly description: string\n}\n\nexport interface UserInputQuestion {\n /** Stable snake_case key used to map the answer. */\n readonly id: string\n /** Compact UI heading (12 characters or fewer is recommended). */\n readonly header: string\n /** The single question shown to the user. */\n readonly question: string\n /** Two or three mutually exclusive suggestions. Free-form input is separate. */\n readonly options: readonly UserInputOption[]\n /** A UI should offer a free-form answer in addition to the suggestions. */\n readonly allowFreeForm: true\n}\n\nexport interface UserInputRequest {\n /** The provider tool-call id is the durable correlation id. */\n readonly requestId: ToolCallId\n readonly callId: ToolCallId\n readonly turn: number\n readonly step: number\n readonly questions: readonly UserInputQuestion[]\n readonly isBlocking: true\n}\n\nexport interface UserInputAnswer {\n /** One or more selected labels or free-form strings. */\n readonly answers: readonly string[]\n}\n\nexport interface UserInputResponse {\n /** Answers keyed by {@link UserInputQuestion.id}. */\n readonly answers: Readonly<Record<string, UserInputAnswer>>\n}\n\nexport type UserInputDecision = UserInputResponse | 'abort'\n\nexport interface UserInputBroker {\n readonly request: (request: UserInputRequest, signal?: AbortSignal) => Promise<UserInputDecision>\n}\n\nexport interface InteractiveUserInputBroker extends UserInputBroker {\n pending(): readonly UserInputRequest[]\n onRequest(listener: (request: UserInputRequest) => void): () => void\n resolve(requestId: ToolCallId, response: UserInputResponse): boolean\n abortAll(): void\n}\n\nexport interface InteractiveUserInputBrokerOptions {\n /** Maximum requests parked across concurrent sessions. Defaults to 1,024. */\n readonly maxPending?: number\n}\n\ninterface Waiter {\n readonly request: UserInputRequest\n readonly settle: (decision: UserInputDecision) => void\n}\n\n/**\n * Create a broker for GUIs and CLIs that pause one tool call and resume it by id.\n * The waiter is installed before listeners run, so a synchronous listener is safe.\n */\nexport function createUserInputBroker(options: InteractiveUserInputBrokerOptions = {}): InteractiveUserInputBroker {\n const maxPending = positiveSafeInteger(options.maxPending ?? 1_024, 'user-input maxPending')\n const waiters = new Map<ToolCallId, Waiter>()\n const listeners = new Set<(request: UserInputRequest) => void>()\n\n return {\n request(request, signal) {\n if (signal?.aborted === true) return Promise.resolve('abort')\n if (waiters.has(request.requestId)) {\n return Promise.reject(new Error(`user-input request '${request.requestId}' is already pending`))\n }\n if (waiters.size >= maxPending) {\n return Promise.reject(new Error(`user-input broker reached its ${maxPending}-request limit`))\n }\n const published = detachedFrozen(request)\n return new Promise<UserInputDecision>((resolve) => {\n let settled = false\n const settle = (decision: UserInputDecision): void => {\n if (settled) return\n settled = true\n waiters.delete(request.requestId)\n signal?.removeEventListener('abort', onAbort)\n resolve(decision)\n }\n function onAbort(): void { settle('abort') }\n\n waiters.set(request.requestId, { request: published, settle })\n signal?.addEventListener('abort', onAbort, { once: true })\n for (const listener of [...listeners]) {\n try { listener(published) } catch { /* observers do not own the waiter */ }\n }\n })\n },\n\n pending() {\n return [...waiters.values()].map(waiter => waiter.request)\n },\n\n onRequest(listener) {\n listeners.add(listener)\n return () => void listeners.delete(listener)\n },\n\n resolve(requestId, response) {\n const waiter = waiters.get(requestId)\n if (waiter === undefined) return false\n waiter.settle(detachedFrozen(response))\n return true\n },\n\n abortAll() {\n for (const waiter of [...waiters.values()]) waiter.settle('abort')\n },\n }\n}\n\nfunction positiveSafeInteger(value: number, label: string): number {\n if (!Number.isSafeInteger(value) || value < 1) throw new RangeError(`${label} must be a positive safe integer`)\n return value\n}\n\n/** A headless broker useful for policy-driven runs and tests. */\nexport function fixedUserInputBroker(\n response: UserInputResponse | ((request: UserInputRequest) => UserInputDecision | Promise<UserInputDecision>),\n): UserInputBroker {\n return {\n request: request => Promise.resolve(typeof response === 'function' ? response(request) : response),\n }\n}\n"],"mappings":"8DAwEA,SAAgB,EAAsB,EAA6C,CAAC,EAA+B,CACjH,IAAM,EAAa,EAAoB,EAAQ,YAAc,KAAO,uBAAuB,EACrF,EAAU,IAAI,IACd,EAAY,IAAI,IAEtB,MAAO,CACL,QAAQ,EAAS,EAAQ,CACvB,GAAI,GAAQ,UAAY,GAAM,OAAO,QAAQ,QAAQ,OAAO,EAC5D,GAAI,EAAQ,IAAI,EAAQ,SAAS,EAC/B,OAAO,QAAQ,OAAW,MAAM,uBAAuB,EAAQ,UAAU,qBAAqB,CAAC,EAEjG,GAAI,EAAQ,MAAQ,EAClB,OAAO,QAAQ,OAAW,MAAM,iCAAiC,EAAW,eAAe,CAAC,EAE9F,IAAM,EAAY,EAAe,CAAO,EACxC,OAAO,IAAI,QAA4B,GAAY,CACjD,IAAI,EAAU,GACR,EAAU,GAAsC,CAChD,IACJ,EAAU,GACV,EAAQ,OAAO,EAAQ,SAAS,EAChC,GAAQ,oBAAoB,QAAS,CAAO,EAC5C,EAAQ,CAAQ,EAClB,EACA,SAAS,GAAgB,CAAE,EAAO,OAAO,CAAE,CAE3C,EAAQ,IAAI,EAAQ,UAAW,CAAE,QAAS,EAAW,QAAO,CAAC,EAC7D,GAAQ,iBAAiB,QAAS,EAAS,CAAE,KAAM,EAAK,CAAC,EACzD,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAClC,GAAI,CAAE,EAAS,CAAS,CAAE,MAAQ,CAAwC,CAE9E,CAAC,CACH,EAEA,SAAU,CACR,MAAO,CAAC,GAAG,EAAQ,OAAO,CAAC,CAAC,CAAC,IAAI,GAAU,EAAO,OAAO,CAC3D,EAEA,UAAU,EAAU,CAElB,OADA,EAAU,IAAI,CAAQ,MACT,KAAK,EAAU,OAAO,CAAQ,CAC7C,EAEA,QAAQ,EAAW,EAAU,CAC3B,IAAM,EAAS,EAAQ,IAAI,CAAS,EAGpC,OAFI,IAAW,IAAA,KACf,EAAO,OAAO,EAAe,CAAQ,CAAC,EAC/B,GACT,EAEA,UAAW,CACT,IAAK,IAAM,IAAU,CAAC,GAAG,EAAQ,OAAO,CAAC,EAAG,EAAO,OAAO,OAAO,CACnE,CACF,CACF,CAEA,SAAS,EAAoB,EAAe,EAAuB,CACjE,GAAI,CAAC,OAAO,cAAc,CAAK,GAAK,EAAQ,EAAG,MAAU,WAAW,GAAG,EAAM,iCAAiC,EAC9G,OAAO,CACT,CAGA,SAAgB,EACd,EACiB,CACjB,MAAO,CACL,QAAS,GAAW,QAAQ,QAAQ,OAAO,GAAa,WAAa,EAAS,CAAO,EAAI,CAAQ,CACnG,CACF"}
@@ -0,0 +1,53 @@
1
+ import { SkillDefinition, SkillLookupOptions, SkillResourceSummary, SkillSummary } from "./definition.js";
2
+ import { ActivatedSkillSnapshot, RuntimeSkillSource } from "./provider/types.js";
3
+ //#region src/agent/skill/catalog.d.ts
4
+ interface SkillCatalogOptions {
5
+ /** When present, only these skill ids are visible or loadable. */
6
+ readonly allowedSkillIds?: readonly string[];
7
+ readonly maxSkills?: number;
8
+ readonly maxCatalogBytes?: number;
9
+ }
10
+ declare class SkillCatalog {
11
+ private readonly sources;
12
+ private readonly allowedSkillIds;
13
+ private readonly allowedSkillIdSet;
14
+ private readonly maxSkills;
15
+ private readonly maxCatalogBytes;
16
+ private entries;
17
+ private visible;
18
+ private readonly activated;
19
+ private readonly activatedReferences;
20
+ private discoveryTail;
21
+ private discovered;
22
+ constructor(sources: readonly RuntimeSkillSource[], options?: SkillCatalogOptions);
23
+ /** Refresh provider metadata. Direct definitions remain available without I/O. */
24
+ discover(options?: SkillLookupOptions): Promise<readonly SkillSummary[]>;
25
+ private performDiscovery;
26
+ /** Last successfully discovered catalog. Direct skills are present immediately. */
27
+ summaries(): readonly SkillSummary[];
28
+ /** Load a complete body on demand. Provider definitions are intentionally not cached. */
29
+ load(id: string, options?: SkillLookupOptions): Promise<SkillDefinition | undefined>;
30
+ /** Load one selected skill and remember only its small resource manifest. */
31
+ activate(id: string, options?: SkillLookupOptions): Promise<SkillDefinition | undefined>;
32
+ isActivated(id: string): boolean;
33
+ activatedResources(id: string): readonly SkillResourceSummary[] | undefined;
34
+ /** Activated identities in deterministic catalog order, suitable for session persistence. */
35
+ activatedSummaries(): readonly SkillSummary[];
36
+ activatedSkillReferences(): readonly ActivatedSkillSnapshot[];
37
+ /** Forget conversation-scoped activation without rebuilding provider configuration. */
38
+ clearActivations(): void;
39
+ validateReferenceOwner(value: unknown): ActivatedSkillSnapshot;
40
+ restoreReference(value: unknown, options?: SkillLookupOptions): Promise<SkillDefinition>;
41
+ /** Read one advertised resource without hydrating the rest of the bundle. */
42
+ readResource(id: string, path: string, options?: SkillLookupOptions): Promise<string | undefined>;
43
+ private installDirectSkills;
44
+ private isAllowed;
45
+ private providerListOptions;
46
+ private runtimeLookupOptions;
47
+ private runtimeProviderListOptions;
48
+ private resolveRuntimeSkill;
49
+ private assertAllowedSkillsAvailable;
50
+ }
51
+ //#endregion
52
+ export { SkillCatalog, SkillCatalogOptions };
53
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","names":[],"sources":["../../../src/agent/skill/catalog.ts"],"mappings":";;;UAyCiB;;WAEN;WACA;WACA;;cAGE;mBACM;mBACA;mBACA;mBACA;mBACA;UACT;UACA;mBACS;mBACA;UACT;UACA;EAER,YAAY,kBAAkB,sBAAsB,UAAS;;EAsBvD,SAAS,UAAS,qBAA0B,iBAAiB;UAUrD;;EAiEd,sBAAsB;;EAGhB,KAAK,YAAY,UAAS,qBAA0B,QAAQ;;EAmC5D,SAAS,YAAY,UAAS,qBAA0B,QAAQ;EAsBtE,YAAY;EAEZ,mBAAmB,sBAAsB;;EAKzC,+BAA+B;EAI/B,qCAAqC;;EAMrC;EAEA,uBAAuB,iBAAiB;EAQlC,iBAAiB,gBAAgB,UAAS,qBAA0B,QAAQ;;EAwB5E,aACJ,YACA,cACA,UAAS,qBACR;UAwCK;UAcA;UAIA;UAMA;UAQA;UAOA;UASA"}
@@ -0,0 +1,2 @@
1
+ import{AgentSdkError as e}from"../../errors/agent-sdk-error.js";import{MAX_SKILL_RESOURCE_CHARS as t,defineSkill as n,skillSummary as r,validateCandidate as i,validateSkillId as a,validateSkillResourcePath as o,validateSkillSource as s}from"./definition.js";import{capabilityIdentityError as c}from"../../errors/capability-identity.js";import{SKILL_ERROR_CODES as l}from"./provider/config.js";import{captureSkillProviderPlugin as u}from"./provider/definition.js";import{skillProviderLogger as d}from"./provider/context.js";import{captureSkillCatalogSnapshot as f,captureSkillReference as p}from"./provider/snapshot.js";var m=class{sources;allowedSkillIds;allowedSkillIdSet;maxSkills;maxCatalogBytes;entries=new Map;visible=Object.freeze([]);activated=new Map;activatedReferences=new Map;discoveryTail=Promise.resolve();discovered=!1;constructor(e,t={}){if(this.maxSkills=j(t.maxSkills??1024,`skill catalog maxSkills`),this.maxCatalogBytes=j(t.maxCatalogBytes??4194304,`skill catalog maxCatalogBytes`),this.sources=v(e),t.allowedSkillIds===void 0)this.allowedSkillIds=void 0,this.allowedSkillIdSet=void 0;else{let e=[...t.allowedSkillIds],n=new Set;for(let t of e){if(a(t,`allowed skill`),n.has(t))throw TypeError(`duplicate allowed skill '${t}'`);n.add(t)}this.allowedSkillIds=Object.freeze(e),this.allowedSkillIdSet=n}this.installDirectSkills()}async discover(e={}){let t=this.discoveryTail,n=M(t,e.signal).then(()=>this.performDiscovery(e));return this.discoveryTail=Promise.allSettled([t,n]).then(()=>void 0),await n}async performDiscovery(e){k(e.signal);let t=new Map,n=0;if(this.allowedSkillIds?.length===0)return this.activated.clear(),this.entries=t,this.visible=Object.freeze([]),this.discovered=!0,this.visible;for(let a of this.sources){if(a.kind===`skill`){if(!this.isAllowed(a.id))continue;if(n=A(n,a,this.maxCatalogBytes),t.size>=this.maxSkills)throw RangeError(`skill catalog exceeds ${this.maxSkills} entries`);w(t,a.id,{summary:r(a),direct:a});continue}if(y(a)){let r=await M(a.list(this.runtimeProviderListOptions(e)),e.signal);k(e.signal);let i=f(a,r,this.maxSkills,this.maxCatalogBytes);for(let e=0;e<i.candidates.length;e++){let r=i.candidates[e];if(this.isAllowed(r.id)){if(n=A(n,r,this.maxCatalogBytes),t.size>=this.maxSkills)throw RangeError(`skill catalog exceeds ${this.maxSkills} entries`);w(t,r.id,{summary:g(r),runtimeProvider:a,reference:i.references[e]})}}continue}let o=await M(a.list(this.providerListOptions(e)),e.signal);if(k(e.signal),o.length>this.maxSkills)throw RangeError(`skill provider '${a.id}' exceeds the ${this.maxSkills}-candidate limit`);for(let e of o)if(i(e,a.id),this.isAllowed(e.id)){if(n=A(n,e,this.maxCatalogBytes),t.size>=this.maxSkills)throw RangeError(`skill catalog exceeds ${this.maxSkills} entries`);w(t,e.id,{summary:h(e),provider:a,candidate:e})}}this.assertAllowedSkillsAvailable(t);for(let e of this.activated.keys()){let n=this.entries.get(e),r=t.get(e);(n===void 0||r===void 0||!E(n,r))&&(this.activated.delete(e),this.activatedReferences.delete(e))}return this.entries=t,this.visible=T(t),this.discovered=!0,this.visible}summaries(){return this.visible}async load(e,t={}){k(t.signal),!this.discovered&&(this.allowedSkillIds!==void 0||this.sources.some(e=>e.kind===`skill-provider`))&&await this.discover(t);let r=this.entries.get(e);if(r?.direct!==void 0)return r.direct;if(r?.runtimeProvider!==void 0&&r.reference!==void 0){let e=await M(r.runtimeProvider.load(r.reference,this.runtimeLookupOptions(t)),t.signal);return k(t.signal),e===void 0?void 0:this.resolveRuntimeSkill(e,r)}if(r?.provider===void 0||r.candidate===void 0)return;let i=await M(r.provider.load(r.candidate,t),t.signal);if(k(t.signal),i===void 0)return;let a=i.resourceBase??r.summary.resourceBase,o=n({...i,source:r.summary.source,provider:r.provider.id,invocation:r.summary.invocation,...a===void 0?{}:{resourceBase:a}});if(o.id!==e)throw TypeError(`skill provider '${r.provider.id}' loaded '${o.id}' for candidate '${e}'`);return o}async activate(e,t={}){!this.discovered&&(this.allowedSkillIds!==void 0||this.sources.some(e=>e.kind===`skill-provider`))&&await this.discover(t);let n=this.entries.get(e),r=await this.load(e,t),i=this.entries.get(e);if(r!==void 0&&(n===void 0||i===void 0||!E(n,i)))throw Error(`skill '${e}' changed while its instructions were loading; load it again`);return r!==void 0&&(this.activated.set(e,r.resourceManifest),i?.reference!==void 0&&this.activatedReferences.set(e,Object.freeze({...i.reference,...r.resourceBase===void 0?{}:{resourceBase:Object.freeze({...r.resourceBase})}}))),r}isActivated(e){return this.activated.has(e)}activatedResources(e){return this.activated.get(e)}activatedSummaries(){return Object.freeze(this.visible.filter(e=>this.activated.has(e.id)))}activatedSkillReferences(){return Object.freeze([...this.activatedReferences.values()].sort((e,t)=>e.id.localeCompare(t.id)))}clearActivations(){this.activated.clear(),this.activatedReferences.clear()}validateReferenceOwner(t){let n=p(t);if(!this.sources.some(e=>y(e)&&e.id===n.provider))throw new e(`Persisted skill reference has no matching provider`,l.REFERENCE_INVALID);return n}async restoreReference(e,t={}){k(t.signal);let n=this.validateReferenceOwner(e),r=this.sources.find(e=>y(e)&&e.id===n.provider);if(r===void 0)throw S();let i=await M(r.load(b(n),this.runtimeLookupOptions(t)),t.signal);if(k(t.signal),i===void 0)throw C();let a={summary:_(i,n),runtimeProvider:r,reference:b(n)},o=this.resolveRuntimeSkill(i,a);if(n.resourceBase?.kind!==o.resourceBase?.kind||n.resourceBase?.value!==o.resourceBase?.value)throw C();return this.entries.set(n.id,a),this.visible=T(this.entries),this.activated.set(n.id,o.resourceManifest),this.activatedReferences.set(n.id,n),o}async readResource(e,n,r={}){if(k(r.signal),o(n,e),!this.isActivated(e))throw Error(`skill '${e}' must be activated before reading resources`);let i=this.entries.get(e),a=i?.direct,s=this.activated.get(e);if(a===void 0&&(s===void 0||i?.provider?.readResource===void 0)&&(a=await this.load(e,r)),a!==void 0&&a.id!==e)throw TypeError(`loaded skill '${a.id}' does not match '${e}'`);let c=a?.resourceManifest??s;if(c===void 0||!c.some(e=>e.path===n))return;let l=a?.resources[n];if(l!==void 0)return l;if(i?.runtimeProvider!==void 0&&i.reference!==void 0)return i.runtimeProvider.readResource===void 0?void 0:x(await M(i.runtimeProvider.readResource(i.reference,n,this.runtimeLookupOptions(r)),r.signal),n);if(i?.provider?.readResource===void 0||i.candidate===void 0)return;let u=await M(i.provider.readResource(i.candidate,n,r),r.signal);if(u!==void 0){if(typeof u!=`string`)throw TypeError(`skill provider '${i.provider.id}' returned a non-text resource '${n}'`);if(u.length>4e4)throw RangeError(`skill resource '${n}' exceeds ${t} characters`);return u}}installDirectSkills(){let e=new Map,t=0;for(let n of this.sources)if(n.kind===`skill`&&this.isAllowed(n.id)){if(t=A(t,n,this.maxCatalogBytes),e.size>=this.maxSkills)throw RangeError(`skill catalog exceeds ${this.maxSkills} entries`);w(e,n.id,{summary:r(n),direct:n})}this.entries=e,this.visible=T(e)}isAllowed(e){return this.allowedSkillIdSet?.has(e)??!0}providerListOptions(e){return this.allowedSkillIds===void 0?e:{...e,allowedSkillIds:this.allowedSkillIds}}runtimeLookupOptions(e){return Object.freeze({...e.cwd===void 0?{}:{cwd:e.cwd},signal:e.signal??new AbortController().signal,logger:d(this)})}runtimeProviderListOptions(e){return Object.freeze({...this.runtimeLookupOptions(e),...this.allowedSkillIds===void 0?{}:{allowedSkillIds:this.allowedSkillIds}})}resolveRuntimeSkill(e,t){let r=t.reference;if(r===void 0)throw S();let i=n({...e,id:r.id,source:r.source,provider:r.provider,invocation:t.summary.invocation});if(e.id!==r.id)throw C();return i}assertAllowedSkillsAvailable(e){if(this.allowedSkillIds===void 0)return;let t=this.allowedSkillIds.filter(t=>!e.has(t));if(t.length>0)throw Error(`configured skill${t.length===1?``:`s`} not available: ${t.join(`, `)}`)}};function h(e){return Object.freeze({id:e.id,name:e.name,description:e.description,...e.whenToUse===void 0?{}:{whenToUse:e.whenToUse},invocation:Object.freeze({...e.invocation}),source:e.source,provider:e.provider,...e.resourceBase===void 0?{}:{resourceBase:e.resourceBase}})}function g(e){return Object.freeze({id:e.id,name:e.name,description:e.description,...e.whenToUse===void 0?{}:{whenToUse:e.whenToUse},invocation:e.invocation??Object.freeze({modelInvocable:!0,userInvocable:!0}),source:e.source,provider:e.provider})}function _(e,t){return r(n({...e,id:t.id,source:t.source,provider:t.provider}))}function v(e){let t=e.map(e=>{if(e.kind===`skill`)return s(e),e;let t=Object.getOwnPropertyDescriptor(e,`apiVersion`);if(t===void 0)return s(e),e;if(!(`value`in t))throw S();return u(e)}),n=new Map;for(let[e,r]of t.entries()){if(r.kind===`skill`)continue;let t=n.get(r.id);if(t!==void 0)throw c(`SKILL_PROVIDER_ID_CONFLICT`,`skill-provider-id`,t,e);n.set(r.id,e)}return Object.freeze(t)}function y(e){return e.kind===`skill-provider`&&Object.getOwnPropertyDescriptor(e,`apiVersion`)?.value===1}function b(e){return Object.freeze({id:e.id,source:e.source,provider:e.provider,catalogRevision:e.catalogRevision,...e.locator===void 0?{}:{locator:e.locator}})}function x(e,n){if(e!==void 0){if(typeof e!=`string`)throw TypeError(`skill provider returned a non-text resource '${n}'`);if(e.length>4e4)throw RangeError(`skill resource '${n}' exceeds ${t} characters`);return e}}function S(){return new e(`Persisted skill reference is invalid`,l.REFERENCE_INVALID)}function C(){return new e(`Persisted skill reference is unavailable`,l.REFERENCE_UNAVAILABLE)}function w(e,t,n){if(e.get(t)!==void 0)throw c(`SKILL_ID_CONFLICT`,`skill-id`,[...e.keys()].indexOf(t),e.size);e.set(t,n)}function T(e){return Object.freeze([...e.values()].map(e=>e.summary).sort((e,t)=>e.id.localeCompare(t.id)))}function E(e,t){if(e.direct!==void 0||t.direct!==void 0)return e.direct===t.direct;if(e.provider!==t.provider)return!1;if(e.runtimeProvider!==void 0||t.runtimeProvider!==void 0)return e.runtimeProvider===t.runtimeProvider&&e.reference?.id===t.reference?.id&&e.reference?.source===t.reference?.source&&e.reference?.provider===t.reference?.provider&&e.reference?.catalogRevision===t.reference?.catalogRevision&&O(e.reference?.locator,t.reference?.locator);if(!D(e.summary,t.summary))return!1;let n=e.candidate,r=t.candidate;return n===void 0||r===void 0?n===r:n.path===r.path&&O(n.locator,r.locator)&&O(n.metadata,r.metadata)}function D(e,t){return e.id===t.id&&e.name===t.name&&e.description===t.description&&e.whenToUse===t.whenToUse&&e.source===t.source&&e.provider===t.provider&&e.invocation.modelInvocable===t.invocation.modelInvocable&&e.invocation.userInvocable===t.invocation.userInvocable&&e.resourceBase?.kind===t.resourceBase?.kind&&e.resourceBase?.value===t.resourceBase?.value}function O(e,t){let n=[[e,t]],r=new WeakMap,i=0;try{for(;n.length>0;){let e=n.pop();if(e===void 0)break;let[t,a]=e;if(Object.is(t,a))continue;if(typeof t!=`object`||!t||typeof a!=`object`||!a||++i>2048)return!1;let o=r.get(t);if(o?.has(a)===!0)continue;if(o===void 0&&(o=new WeakSet,r.set(t,o)),o.add(a),Array.isArray(t)||Array.isArray(a)){if(!Array.isArray(t)||!Array.isArray(a)||t.length!==a.length)return!1;for(let e=0;e<t.length;e++)n.push([t[e],a[e]]);continue}let s=Object.getPrototypeOf(t);if(s!==Object.getPrototypeOf(a)||s!==Object.prototype&&s!==null)return!1;let c=t,l=a,u=Object.keys(c).sort(),d=Object.keys(l).sort();if(u.length!==d.length||u.some((e,t)=>e!==d[t]))return!1;for(let e of u)n.push([c[e],l[e]])}return!0}catch{return!1}}function k(e){if(e?.aborted===!0)throw e.reason??Error(`skill discovery aborted`)}function A(e,t,n){let r=JSON.stringify(t);if(r===void 0)throw TypeError(`skill catalog entry is not JSON serializable`);let i=e+new TextEncoder().encode(r).byteLength;if(i>n)throw RangeError(`skill catalog exceeds ${n} serialized bytes`);return i}function j(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`${t} must be a positive safe integer`);return e}function M(e,t){return t===void 0?e:(k(t),new Promise((n,r)=>{let i=()=>{a(),r(t.reason??Error(`skill discovery aborted`))},a=()=>{t.removeEventListener(`abort`,i)};t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{a(),n(e)},e=>{a(),r(e)})}))}export{m as SkillCatalog};
2
+ //# sourceMappingURL=catalog.js.map