@robota-sdk/agent-core 3.0.0-beta.1 → 3.0.0-beta.100

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 (557) hide show
  1. package/CHANGELOG.md +1202 -0
  2. package/LICENSE +661 -21
  3. package/README.md +267 -156
  4. package/dist/browser/bounded-output-BdWv9SX3.js +2 -0
  5. package/dist/browser/bounded-output-BdWv9SX3.js.map +1 -0
  6. package/dist/browser/command-executor-DIXaSMrr.js +2 -0
  7. package/dist/browser/command-executor-DIXaSMrr.js.map +1 -0
  8. package/dist/browser/http-executor-B4YgCJg7.js +2 -0
  9. package/dist/browser/http-executor-B4YgCJg7.js.map +1 -0
  10. package/dist/browser/index.d.ts +6904 -3346
  11. package/dist/browser/index.d.ts.map +1 -0
  12. package/dist/browser/index.js +15 -4
  13. package/dist/browser/index.js.map +1 -0
  14. package/dist/browser/verdict-decoder-Dz_rjoIZ.js +2 -0
  15. package/dist/browser/verdict-decoder-Dz_rjoIZ.js.map +1 -0
  16. package/dist/node/bounded-output-BdWv9SX3.js +2 -0
  17. package/dist/node/bounded-output-BdWv9SX3.js.map +1 -0
  18. package/dist/node/command-executor-D_UBZHxh.js +2 -0
  19. package/dist/node/command-executor-D_UBZHxh.js.map +1 -0
  20. package/dist/node/command-executor-wBgBdWXr.cjs +1 -0
  21. package/dist/node/http-executor-ADn4locH.js +2 -0
  22. package/dist/node/http-executor-ADn4locH.js.map +1 -0
  23. package/dist/node/http-executor-CeAAZotH.cjs +1 -0
  24. package/dist/node/index-BFTag17m.d.ts +7464 -0
  25. package/dist/node/index-BFTag17m.d.ts.map +1 -0
  26. package/dist/node/index-De7jXKGE.d.cts +7464 -0
  27. package/dist/node/index-De7jXKGE.d.cts.map +1 -0
  28. package/dist/node/index.cjs +14 -4
  29. package/dist/node/index.d.cts +3 -4237
  30. package/dist/node/index.d.ts +3 -4237
  31. package/dist/node/index.js +15 -4
  32. package/dist/node/index.js.map +1 -0
  33. package/dist/node/node.cjs +1 -0
  34. package/dist/node/node.d.cts +247 -0
  35. package/dist/node/node.d.cts.map +1 -0
  36. package/dist/node/node.d.ts +247 -0
  37. package/dist/node/node.d.ts.map +1 -0
  38. package/dist/node/node.js +2 -0
  39. package/dist/node/node.js.map +1 -0
  40. package/dist/node/project-tool-schema-DrDjGKnH.cjs +1 -0
  41. package/dist/node/project-tool-schema-_UKfY7yO.js +2 -0
  42. package/dist/node/project-tool-schema-_UKfY7yO.js.map +1 -0
  43. package/dist/node/rolldown-runtime-DK3Fl9T5.js +1 -0
  44. package/dist/node/rolldown-runtime-DWNI8pZO.cjs +1 -0
  45. package/dist/node/testing/index.cjs +1 -0
  46. package/dist/node/testing/index.d.cts +102 -0
  47. package/dist/node/testing/index.d.cts.map +1 -0
  48. package/dist/node/testing/index.d.ts +102 -0
  49. package/dist/node/testing/index.d.ts.map +1 -0
  50. package/dist/node/testing/index.js +2 -0
  51. package/dist/node/testing/index.js.map +1 -0
  52. package/dist/node/types-Ge2XB-y-.d.cts +334 -0
  53. package/dist/node/types-Ge2XB-y-.d.cts.map +1 -0
  54. package/dist/node/types-Ge2XB-y-.d.ts +334 -0
  55. package/dist/node/types-Ge2XB-y-.d.ts.map +1 -0
  56. package/dist/node/verdict-decoder-DQqwwDE7.cjs +1 -0
  57. package/dist/node/verdict-decoder-Dz_rjoIZ.js +2 -0
  58. package/dist/node/verdict-decoder-Dz_rjoIZ.js.map +1 -0
  59. package/package.json +103 -33
  60. package/dist/abstracts/abstract-agent.d.ts +0 -56
  61. package/dist/abstracts/abstract-agent.d.ts.map +0 -1
  62. package/dist/abstracts/abstract-agent.js +0 -55
  63. package/dist/abstracts/abstract-agent.js.map +0 -1
  64. package/dist/abstracts/abstract-ai-provider.d.ts +0 -187
  65. package/dist/abstracts/abstract-ai-provider.d.ts.map +0 -1
  66. package/dist/abstracts/abstract-ai-provider.js +0 -252
  67. package/dist/abstracts/abstract-ai-provider.js.map +0 -1
  68. package/dist/abstracts/abstract-executor.d.ts +0 -110
  69. package/dist/abstracts/abstract-executor.d.ts.map +0 -1
  70. package/dist/abstracts/abstract-executor.js +0 -156
  71. package/dist/abstracts/abstract-executor.js.map +0 -1
  72. package/dist/abstracts/abstract-manager.d.ts +0 -42
  73. package/dist/abstracts/abstract-manager.d.ts.map +0 -1
  74. package/dist/abstracts/abstract-manager.js +0 -49
  75. package/dist/abstracts/abstract-manager.js.map +0 -1
  76. package/dist/abstracts/abstract-module.d.ts +0 -365
  77. package/dist/abstracts/abstract-module.d.ts.map +0 -1
  78. package/dist/abstracts/abstract-module.js +0 -474
  79. package/dist/abstracts/abstract-module.js.map +0 -1
  80. package/dist/abstracts/abstract-plugin.d.ts +0 -369
  81. package/dist/abstracts/abstract-plugin.d.ts.map +0 -1
  82. package/dist/abstracts/abstract-plugin.js +0 -258
  83. package/dist/abstracts/abstract-plugin.js.map +0 -1
  84. package/dist/abstracts/abstract-tool.d.ts +0 -175
  85. package/dist/abstracts/abstract-tool.d.ts.map +0 -1
  86. package/dist/abstracts/abstract-tool.js +0 -140
  87. package/dist/abstracts/abstract-tool.js.map +0 -1
  88. package/dist/abstracts/abstract-workflow-converter.d.ts +0 -136
  89. package/dist/abstracts/abstract-workflow-converter.d.ts.map +0 -1
  90. package/dist/abstracts/abstract-workflow-converter.js +0 -252
  91. package/dist/abstracts/abstract-workflow-converter.js.map +0 -1
  92. package/dist/abstracts/abstract-workflow-validator.d.ts +0 -203
  93. package/dist/abstracts/abstract-workflow-validator.d.ts.map +0 -1
  94. package/dist/abstracts/abstract-workflow-validator.js +0 -447
  95. package/dist/abstracts/abstract-workflow-validator.js.map +0 -1
  96. package/dist/abstracts/index.d.ts +0 -6
  97. package/dist/abstracts/index.d.ts.map +0 -1
  98. package/dist/abstracts/index.js +0 -9
  99. package/dist/abstracts/index.js.map +0 -1
  100. package/dist/agents/constants.d.ts +0 -23
  101. package/dist/agents/constants.d.ts.map +0 -1
  102. package/dist/agents/constants.js +0 -22
  103. package/dist/agents/constants.js.map +0 -1
  104. package/dist/agents/index.d.ts +0 -1
  105. package/dist/agents/index.d.ts.map +0 -1
  106. package/dist/agents/index.js +0 -4
  107. package/dist/agents/index.js.map +0 -1
  108. package/dist/agents/robota.test.d.ts +0 -2
  109. package/dist/agents/robota.test.d.ts.map +0 -1
  110. package/dist/agents/robota.test.js +0 -416
  111. package/dist/agents/robota.test.js.map +0 -1
  112. package/dist/browser/builtin-templates.json +0 -107
  113. package/dist/core/robota.d.ts +0 -694
  114. package/dist/core/robota.d.ts.map +0 -1
  115. package/dist/core/robota.js +0 -1277
  116. package/dist/core/robota.js.map +0 -1
  117. package/dist/executors/local-executor.d.ts +0 -96
  118. package/dist/executors/local-executor.d.ts.map +0 -1
  119. package/dist/executors/local-executor.js +0 -197
  120. package/dist/executors/local-executor.js.map +0 -1
  121. package/dist/executors/local-executor.test.d.ts +0 -2
  122. package/dist/executors/local-executor.test.d.ts.map +0 -1
  123. package/dist/executors/local-executor.test.js +0 -192
  124. package/dist/executors/local-executor.test.js.map +0 -1
  125. package/dist/index.d.ts +0 -274
  126. package/dist/index.d.ts.map +0 -1
  127. package/dist/index.js +0 -235
  128. package/dist/index.js.map +0 -1
  129. package/dist/interfaces/agent.d.ts +0 -198
  130. package/dist/interfaces/agent.d.ts.map +0 -1
  131. package/dist/interfaces/agent.js +0 -2
  132. package/dist/interfaces/agent.js.map +0 -1
  133. package/dist/interfaces/event-service.d.ts +0 -79
  134. package/dist/interfaces/event-service.d.ts.map +0 -1
  135. package/dist/interfaces/event-service.js +0 -2
  136. package/dist/interfaces/event-service.js.map +0 -1
  137. package/dist/interfaces/executor.d.ts +0 -128
  138. package/dist/interfaces/executor.d.ts.map +0 -1
  139. package/dist/interfaces/executor.js +0 -2
  140. package/dist/interfaces/executor.js.map +0 -1
  141. package/dist/interfaces/history-module.d.ts +0 -19
  142. package/dist/interfaces/history-module.d.ts.map +0 -1
  143. package/dist/interfaces/history-module.js +0 -2
  144. package/dist/interfaces/history-module.js.map +0 -1
  145. package/dist/interfaces/index.d.ts +0 -13
  146. package/dist/interfaces/index.d.ts.map +0 -1
  147. package/dist/interfaces/index.js +0 -4
  148. package/dist/interfaces/index.js.map +0 -1
  149. package/dist/interfaces/manager.d.ts +0 -142
  150. package/dist/interfaces/manager.d.ts.map +0 -1
  151. package/dist/interfaces/manager.js +0 -2
  152. package/dist/interfaces/manager.js.map +0 -1
  153. package/dist/interfaces/messages.d.ts +0 -75
  154. package/dist/interfaces/messages.d.ts.map +0 -1
  155. package/dist/interfaces/messages.js +0 -29
  156. package/dist/interfaces/messages.js.map +0 -1
  157. package/dist/interfaces/progress-reporting.d.ts +0 -86
  158. package/dist/interfaces/progress-reporting.d.ts.map +0 -1
  159. package/dist/interfaces/progress-reporting.js +0 -37
  160. package/dist/interfaces/progress-reporting.js.map +0 -1
  161. package/dist/interfaces/provider.d.ts +0 -217
  162. package/dist/interfaces/provider.d.ts.map +0 -1
  163. package/dist/interfaces/provider.js +0 -2
  164. package/dist/interfaces/provider.js.map +0 -1
  165. package/dist/interfaces/service.d.ts +0 -205
  166. package/dist/interfaces/service.d.ts.map +0 -1
  167. package/dist/interfaces/service.js +0 -6
  168. package/dist/interfaces/service.js.map +0 -1
  169. package/dist/interfaces/tool.d.ts +0 -248
  170. package/dist/interfaces/tool.d.ts.map +0 -1
  171. package/dist/interfaces/tool.js +0 -2
  172. package/dist/interfaces/tool.js.map +0 -1
  173. package/dist/interfaces/types.d.ts +0 -71
  174. package/dist/interfaces/types.d.ts.map +0 -1
  175. package/dist/interfaces/types.js +0 -33
  176. package/dist/interfaces/types.js.map +0 -1
  177. package/dist/interfaces/workflow-converter.d.ts +0 -193
  178. package/dist/interfaces/workflow-converter.d.ts.map +0 -1
  179. package/dist/interfaces/workflow-converter.js +0 -11
  180. package/dist/interfaces/workflow-converter.js.map +0 -1
  181. package/dist/interfaces/workflow-validator.d.ts +0 -209
  182. package/dist/interfaces/workflow-validator.d.ts.map +0 -1
  183. package/dist/interfaces/workflow-validator.js +0 -16
  184. package/dist/interfaces/workflow-validator.js.map +0 -1
  185. package/dist/managers/agent-factory.d.ts +0 -132
  186. package/dist/managers/agent-factory.d.ts.map +0 -1
  187. package/dist/managers/agent-factory.js +0 -284
  188. package/dist/managers/agent-factory.js.map +0 -1
  189. package/dist/managers/agent-factory.test.d.ts +0 -2
  190. package/dist/managers/agent-factory.test.d.ts.map +0 -1
  191. package/dist/managers/agent-factory.test.js +0 -249
  192. package/dist/managers/agent-factory.test.js.map +0 -1
  193. package/dist/managers/agent-templates.d.ts +0 -84
  194. package/dist/managers/agent-templates.d.ts.map +0 -1
  195. package/dist/managers/agent-templates.js +0 -159
  196. package/dist/managers/agent-templates.js.map +0 -1
  197. package/dist/managers/ai-provider-manager.d.ts +0 -80
  198. package/dist/managers/ai-provider-manager.d.ts.map +0 -1
  199. package/dist/managers/ai-provider-manager.js +0 -226
  200. package/dist/managers/ai-provider-manager.js.map +0 -1
  201. package/dist/managers/conversation-history-manager.d.ts +0 -455
  202. package/dist/managers/conversation-history-manager.d.ts.map +0 -1
  203. package/dist/managers/conversation-history-manager.js +0 -578
  204. package/dist/managers/conversation-history-manager.js.map +0 -1
  205. package/dist/managers/conversation-history-manager.test.d.ts +0 -2
  206. package/dist/managers/conversation-history-manager.test.d.ts.map +0 -1
  207. package/dist/managers/conversation-history-manager.test.js +0 -374
  208. package/dist/managers/conversation-history-manager.test.js.map +0 -1
  209. package/dist/managers/index.d.ts +0 -8
  210. package/dist/managers/index.d.ts.map +0 -1
  211. package/dist/managers/index.js +0 -8
  212. package/dist/managers/index.js.map +0 -1
  213. package/dist/managers/module-registry.d.ts +0 -161
  214. package/dist/managers/module-registry.d.ts.map +0 -1
  215. package/dist/managers/module-registry.js +0 -519
  216. package/dist/managers/module-registry.js.map +0 -1
  217. package/dist/managers/module-type-registry.d.ts +0 -113
  218. package/dist/managers/module-type-registry.d.ts.map +0 -1
  219. package/dist/managers/module-type-registry.js +0 -439
  220. package/dist/managers/module-type-registry.js.map +0 -1
  221. package/dist/managers/plugins.d.ts +0 -166
  222. package/dist/managers/plugins.d.ts.map +0 -1
  223. package/dist/managers/plugins.js +0 -339
  224. package/dist/managers/plugins.js.map +0 -1
  225. package/dist/managers/tool-manager.d.ts +0 -70
  226. package/dist/managers/tool-manager.d.ts.map +0 -1
  227. package/dist/managers/tool-manager.js +0 -138
  228. package/dist/managers/tool-manager.js.map +0 -1
  229. package/dist/managers/tool-manager.test.d.ts +0 -2
  230. package/dist/managers/tool-manager.test.d.ts.map +0 -1
  231. package/dist/managers/tool-manager.test.js +0 -186
  232. package/dist/managers/tool-manager.test.js.map +0 -1
  233. package/dist/node/builtin-templates.json +0 -107
  234. package/dist/plugins/conversation-history/conversation-history-plugin.d.ts +0 -67
  235. package/dist/plugins/conversation-history/conversation-history-plugin.d.ts.map +0 -1
  236. package/dist/plugins/conversation-history/conversation-history-plugin.js +0 -270
  237. package/dist/plugins/conversation-history/conversation-history-plugin.js.map +0 -1
  238. package/dist/plugins/conversation-history/index.d.ts +0 -3
  239. package/dist/plugins/conversation-history/index.d.ts.map +0 -1
  240. package/dist/plugins/conversation-history/index.js +0 -2
  241. package/dist/plugins/conversation-history/index.js.map +0 -1
  242. package/dist/plugins/conversation-history/storages/database-storage.d.ts +0 -19
  243. package/dist/plugins/conversation-history/storages/database-storage.d.ts.map +0 -1
  244. package/dist/plugins/conversation-history/storages/database-storage.js +0 -94
  245. package/dist/plugins/conversation-history/storages/database-storage.js.map +0 -1
  246. package/dist/plugins/conversation-history/storages/file-storage.d.ts +0 -15
  247. package/dist/plugins/conversation-history/storages/file-storage.d.ts.map +0 -1
  248. package/dist/plugins/conversation-history/storages/file-storage.js +0 -94
  249. package/dist/plugins/conversation-history/storages/file-storage.js.map +0 -1
  250. package/dist/plugins/conversation-history/storages/index.d.ts +0 -4
  251. package/dist/plugins/conversation-history/storages/index.d.ts.map +0 -1
  252. package/dist/plugins/conversation-history/storages/index.js +0 -4
  253. package/dist/plugins/conversation-history/storages/index.js.map +0 -1
  254. package/dist/plugins/conversation-history/storages/memory-storage.d.ts +0 -15
  255. package/dist/plugins/conversation-history/storages/memory-storage.d.ts.map +0 -1
  256. package/dist/plugins/conversation-history/storages/memory-storage.js +0 -33
  257. package/dist/plugins/conversation-history/storages/memory-storage.js.map +0 -1
  258. package/dist/plugins/conversation-history/types.d.ts +0 -61
  259. package/dist/plugins/conversation-history/types.d.ts.map +0 -1
  260. package/dist/plugins/conversation-history/types.js +0 -2
  261. package/dist/plugins/conversation-history/types.js.map +0 -1
  262. package/dist/plugins/error-handling/context-adapter.d.ts +0 -30
  263. package/dist/plugins/error-handling/context-adapter.d.ts.map +0 -1
  264. package/dist/plugins/error-handling/context-adapter.js +0 -41
  265. package/dist/plugins/error-handling/context-adapter.js.map +0 -1
  266. package/dist/plugins/error-handling/error-handling-plugin.d.ts +0 -49
  267. package/dist/plugins/error-handling/error-handling-plugin.d.ts.map +0 -1
  268. package/dist/plugins/error-handling/error-handling-plugin.js +0 -229
  269. package/dist/plugins/error-handling/error-handling-plugin.js.map +0 -1
  270. package/dist/plugins/error-handling/index.d.ts +0 -10
  271. package/dist/plugins/error-handling/index.d.ts.map +0 -1
  272. package/dist/plugins/error-handling/index.js +0 -10
  273. package/dist/plugins/error-handling/index.js.map +0 -1
  274. package/dist/plugins/error-handling/types.d.ts +0 -73
  275. package/dist/plugins/error-handling/types.d.ts.map +0 -1
  276. package/dist/plugins/error-handling/types.js +0 -14
  277. package/dist/plugins/error-handling/types.js.map +0 -1
  278. package/dist/plugins/event-emitter/metrics.d.ts +0 -17
  279. package/dist/plugins/event-emitter/metrics.d.ts.map +0 -1
  280. package/dist/plugins/event-emitter/metrics.js +0 -17
  281. package/dist/plugins/event-emitter/metrics.js.map +0 -1
  282. package/dist/plugins/event-emitter/types.d.ts +0 -112
  283. package/dist/plugins/event-emitter/types.d.ts.map +0 -1
  284. package/dist/plugins/event-emitter/types.js +0 -65
  285. package/dist/plugins/event-emitter/types.js.map +0 -1
  286. package/dist/plugins/event-emitter-plugin.d.ts +0 -222
  287. package/dist/plugins/event-emitter-plugin.d.ts.map +0 -1
  288. package/dist/plugins/event-emitter-plugin.js +0 -432
  289. package/dist/plugins/event-emitter-plugin.js.map +0 -1
  290. package/dist/plugins/event-emitter-plugin.test.d.ts +0 -2
  291. package/dist/plugins/event-emitter-plugin.test.d.ts.map +0 -1
  292. package/dist/plugins/event-emitter-plugin.test.js +0 -94
  293. package/dist/plugins/event-emitter-plugin.test.js.map +0 -1
  294. package/dist/plugins/execution/execution-analytics-plugin.d.ts +0 -129
  295. package/dist/plugins/execution/execution-analytics-plugin.d.ts.map +0 -1
  296. package/dist/plugins/execution/execution-analytics-plugin.js +0 -517
  297. package/dist/plugins/execution/execution-analytics-plugin.js.map +0 -1
  298. package/dist/plugins/execution/index.d.ts +0 -3
  299. package/dist/plugins/execution/index.d.ts.map +0 -1
  300. package/dist/plugins/execution/index.js +0 -2
  301. package/dist/plugins/execution/index.js.map +0 -1
  302. package/dist/plugins/execution/types.d.ts +0 -90
  303. package/dist/plugins/execution/types.d.ts.map +0 -1
  304. package/dist/plugins/execution/types.js +0 -2
  305. package/dist/plugins/execution/types.js.map +0 -1
  306. package/dist/plugins/index.d.ts +0 -10
  307. package/dist/plugins/index.d.ts.map +0 -1
  308. package/dist/plugins/index.js +0 -11
  309. package/dist/plugins/index.js.map +0 -1
  310. package/dist/plugins/limits/types.d.ts +0 -61
  311. package/dist/plugins/limits/types.d.ts.map +0 -1
  312. package/dist/plugins/limits/types.js +0 -2
  313. package/dist/plugins/limits/types.js.map +0 -1
  314. package/dist/plugins/limits-plugin.d.ts +0 -113
  315. package/dist/plugins/limits-plugin.d.ts.map +0 -1
  316. package/dist/plugins/limits-plugin.js +0 -380
  317. package/dist/plugins/limits-plugin.js.map +0 -1
  318. package/dist/plugins/logging/formatters.d.ts +0 -14
  319. package/dist/plugins/logging/formatters.d.ts.map +0 -1
  320. package/dist/plugins/logging/formatters.js +0 -24
  321. package/dist/plugins/logging/formatters.js.map +0 -1
  322. package/dist/plugins/logging/index.d.ts +0 -3
  323. package/dist/plugins/logging/index.d.ts.map +0 -1
  324. package/dist/plugins/logging/index.js +0 -2
  325. package/dist/plugins/logging/index.js.map +0 -1
  326. package/dist/plugins/logging/logging-plugin.d.ts +0 -91
  327. package/dist/plugins/logging/logging-plugin.d.ts.map +0 -1
  328. package/dist/plugins/logging/logging-plugin.js +0 -335
  329. package/dist/plugins/logging/logging-plugin.js.map +0 -1
  330. package/dist/plugins/logging/storages/console-storage.d.ts +0 -14
  331. package/dist/plugins/logging/storages/console-storage.d.ts.map +0 -1
  332. package/dist/plugins/logging/storages/console-storage.js +0 -38
  333. package/dist/plugins/logging/storages/console-storage.js.map +0 -1
  334. package/dist/plugins/logging/storages/file-storage.d.ts +0 -14
  335. package/dist/plugins/logging/storages/file-storage.d.ts.map +0 -1
  336. package/dist/plugins/logging/storages/file-storage.js +0 -41
  337. package/dist/plugins/logging/storages/file-storage.js.map +0 -1
  338. package/dist/plugins/logging/storages/index.d.ts +0 -5
  339. package/dist/plugins/logging/storages/index.d.ts.map +0 -1
  340. package/dist/plugins/logging/storages/index.js +0 -5
  341. package/dist/plugins/logging/storages/index.js.map +0 -1
  342. package/dist/plugins/logging/storages/remote-storage.d.ts +0 -20
  343. package/dist/plugins/logging/storages/remote-storage.d.ts.map +0 -1
  344. package/dist/plugins/logging/storages/remote-storage.js +0 -61
  345. package/dist/plugins/logging/storages/remote-storage.js.map +0 -1
  346. package/dist/plugins/logging/storages/silent-storage.d.ts +0 -10
  347. package/dist/plugins/logging/storages/silent-storage.d.ts.map +0 -1
  348. package/dist/plugins/logging/storages/silent-storage.js +0 -15
  349. package/dist/plugins/logging/storages/silent-storage.js.map +0 -1
  350. package/dist/plugins/logging/types.d.ts +0 -84
  351. package/dist/plugins/logging/types.d.ts.map +0 -1
  352. package/dist/plugins/logging/types.js +0 -2
  353. package/dist/plugins/logging/types.js.map +0 -1
  354. package/dist/plugins/performance/collectors/system-metrics-collector.d.ts +0 -12
  355. package/dist/plugins/performance/collectors/system-metrics-collector.d.ts.map +0 -1
  356. package/dist/plugins/performance/collectors/system-metrics-collector.js +0 -65
  357. package/dist/plugins/performance/collectors/system-metrics-collector.js.map +0 -1
  358. package/dist/plugins/performance/index.d.ts +0 -5
  359. package/dist/plugins/performance/index.d.ts.map +0 -1
  360. package/dist/plugins/performance/index.js +0 -4
  361. package/dist/plugins/performance/index.js.map +0 -1
  362. package/dist/plugins/performance/performance-plugin.d.ts +0 -49
  363. package/dist/plugins/performance/performance-plugin.d.ts.map +0 -1
  364. package/dist/plugins/performance/performance-plugin.js +0 -293
  365. package/dist/plugins/performance/performance-plugin.js.map +0 -1
  366. package/dist/plugins/performance/storages/index.d.ts +0 -2
  367. package/dist/plugins/performance/storages/index.d.ts.map +0 -1
  368. package/dist/plugins/performance/storages/index.js +0 -4
  369. package/dist/plugins/performance/storages/index.js.map +0 -1
  370. package/dist/plugins/performance/storages/memory-storage.d.ts +0 -19
  371. package/dist/plugins/performance/storages/memory-storage.d.ts.map +0 -1
  372. package/dist/plugins/performance/storages/memory-storage.js +0 -69
  373. package/dist/plugins/performance/storages/memory-storage.js.map +0 -1
  374. package/dist/plugins/performance/types.d.ts +0 -154
  375. package/dist/plugins/performance/types.d.ts.map +0 -1
  376. package/dist/plugins/performance/types.js +0 -2
  377. package/dist/plugins/performance/types.js.map +0 -1
  378. package/dist/plugins/usage/aggregate-usage-stats.d.ts +0 -12
  379. package/dist/plugins/usage/aggregate-usage-stats.d.ts.map +0 -1
  380. package/dist/plugins/usage/aggregate-usage-stats.js +0 -115
  381. package/dist/plugins/usage/aggregate-usage-stats.js.map +0 -1
  382. package/dist/plugins/usage/index.d.ts +0 -5
  383. package/dist/plugins/usage/index.d.ts.map +0 -1
  384. package/dist/plugins/usage/index.js +0 -4
  385. package/dist/plugins/usage/index.js.map +0 -1
  386. package/dist/plugins/usage/storages/file-storage.d.ts +0 -22
  387. package/dist/plugins/usage/storages/file-storage.d.ts.map +0 -1
  388. package/dist/plugins/usage/storages/file-storage.js +0 -111
  389. package/dist/plugins/usage/storages/file-storage.js.map +0 -1
  390. package/dist/plugins/usage/storages/index.d.ts +0 -5
  391. package/dist/plugins/usage/storages/index.d.ts.map +0 -1
  392. package/dist/plugins/usage/storages/index.js +0 -5
  393. package/dist/plugins/usage/storages/index.js.map +0 -1
  394. package/dist/plugins/usage/storages/memory-storage.d.ts +0 -22
  395. package/dist/plugins/usage/storages/memory-storage.d.ts.map +0 -1
  396. package/dist/plugins/usage/storages/memory-storage.js +0 -42
  397. package/dist/plugins/usage/storages/memory-storage.js.map +0 -1
  398. package/dist/plugins/usage/storages/remote-storage.d.ts +0 -26
  399. package/dist/plugins/usage/storages/remote-storage.d.ts.map +0 -1
  400. package/dist/plugins/usage/storages/remote-storage.js +0 -115
  401. package/dist/plugins/usage/storages/remote-storage.js.map +0 -1
  402. package/dist/plugins/usage/storages/silent-storage.d.ts +0 -19
  403. package/dist/plugins/usage/storages/silent-storage.d.ts.map +0 -1
  404. package/dist/plugins/usage/storages/silent-storage.js +0 -26
  405. package/dist/plugins/usage/storages/silent-storage.js.map +0 -1
  406. package/dist/plugins/usage/types.d.ts +0 -127
  407. package/dist/plugins/usage/types.d.ts.map +0 -1
  408. package/dist/plugins/usage/types.js +0 -2
  409. package/dist/plugins/usage/types.js.map +0 -1
  410. package/dist/plugins/usage/usage-plugin.d.ts +0 -67
  411. package/dist/plugins/usage/usage-plugin.d.ts.map +0 -1
  412. package/dist/plugins/usage/usage-plugin.js +0 -309
  413. package/dist/plugins/usage/usage-plugin.js.map +0 -1
  414. package/dist/plugins/webhook/http-client.d.ts +0 -30
  415. package/dist/plugins/webhook/http-client.d.ts.map +0 -1
  416. package/dist/plugins/webhook/http-client.js +0 -110
  417. package/dist/plugins/webhook/http-client.js.map +0 -1
  418. package/dist/plugins/webhook/index.d.ts +0 -9
  419. package/dist/plugins/webhook/index.d.ts.map +0 -1
  420. package/dist/plugins/webhook/index.js +0 -9
  421. package/dist/plugins/webhook/index.js.map +0 -1
  422. package/dist/plugins/webhook/transformer.d.ts +0 -63
  423. package/dist/plugins/webhook/transformer.d.ts.map +0 -1
  424. package/dist/plugins/webhook/transformer.js +0 -157
  425. package/dist/plugins/webhook/transformer.js.map +0 -1
  426. package/dist/plugins/webhook/types.d.ts +0 -183
  427. package/dist/plugins/webhook/types.d.ts.map +0 -1
  428. package/dist/plugins/webhook/types.js +0 -2
  429. package/dist/plugins/webhook/types.js.map +0 -1
  430. package/dist/plugins/webhook/webhook-plugin.d.ts +0 -92
  431. package/dist/plugins/webhook/webhook-plugin.d.ts.map +0 -1
  432. package/dist/plugins/webhook/webhook-plugin.js +0 -328
  433. package/dist/plugins/webhook/webhook-plugin.js.map +0 -1
  434. package/dist/schemas/agent-template-schema.d.ts +0 -137
  435. package/dist/schemas/agent-template-schema.d.ts.map +0 -1
  436. package/dist/schemas/agent-template-schema.js +0 -87
  437. package/dist/schemas/agent-template-schema.js.map +0 -1
  438. package/dist/services/conversation-service/index.d.ts +0 -88
  439. package/dist/services/conversation-service/index.d.ts.map +0 -1
  440. package/dist/services/conversation-service/index.js +0 -441
  441. package/dist/services/conversation-service/index.js.map +0 -1
  442. package/dist/services/conversation-service/types.d.ts +0 -32
  443. package/dist/services/conversation-service/types.d.ts.map +0 -1
  444. package/dist/services/conversation-service/types.js +0 -8
  445. package/dist/services/conversation-service/types.js.map +0 -1
  446. package/dist/services/event-service.d.ts +0 -61
  447. package/dist/services/event-service.d.ts.map +0 -1
  448. package/dist/services/event-service.js +0 -110
  449. package/dist/services/event-service.js.map +0 -1
  450. package/dist/services/event-service.test.d.ts +0 -2
  451. package/dist/services/event-service.test.d.ts.map +0 -1
  452. package/dist/services/event-service.test.js +0 -86
  453. package/dist/services/event-service.test.js.map +0 -1
  454. package/dist/services/execution-service.d.ts +0 -151
  455. package/dist/services/execution-service.d.ts.map +0 -1
  456. package/dist/services/execution-service.js +0 -1262
  457. package/dist/services/execution-service.js.map +0 -1
  458. package/dist/services/execution-service.test.d.ts +0 -2
  459. package/dist/services/execution-service.test.d.ts.map +0 -1
  460. package/dist/services/execution-service.test.js +0 -338
  461. package/dist/services/execution-service.test.js.map +0 -1
  462. package/dist/services/history-module.d.ts +0 -15
  463. package/dist/services/history-module.d.ts.map +0 -1
  464. package/dist/services/history-module.js +0 -42
  465. package/dist/services/history-module.js.map +0 -1
  466. package/dist/services/in-memory-history-store.d.ts +0 -12
  467. package/dist/services/in-memory-history-store.d.ts.map +0 -1
  468. package/dist/services/in-memory-history-store.js +0 -41
  469. package/dist/services/in-memory-history-store.js.map +0 -1
  470. package/dist/services/index.d.ts +0 -7
  471. package/dist/services/index.d.ts.map +0 -1
  472. package/dist/services/index.js +0 -13
  473. package/dist/services/index.js.map +0 -1
  474. package/dist/services/task-events.d.ts +0 -6
  475. package/dist/services/task-events.d.ts.map +0 -1
  476. package/dist/services/task-events.js +0 -6
  477. package/dist/services/task-events.js.map +0 -1
  478. package/dist/services/tool-execution-service.d.ts +0 -74
  479. package/dist/services/tool-execution-service.d.ts.map +0 -1
  480. package/dist/services/tool-execution-service.js +0 -189
  481. package/dist/services/tool-execution-service.js.map +0 -1
  482. package/dist/services/user-events.d.ts +0 -7
  483. package/dist/services/user-events.d.ts.map +0 -1
  484. package/dist/services/user-events.js +0 -6
  485. package/dist/services/user-events.js.map +0 -1
  486. package/dist/tools/implementations/function-tool/index.d.ts +0 -9
  487. package/dist/tools/implementations/function-tool/index.d.ts.map +0 -1
  488. package/dist/tools/implementations/function-tool/index.js +0 -13
  489. package/dist/tools/implementations/function-tool/index.js.map +0 -1
  490. package/dist/tools/implementations/function-tool/schema-converter.d.ts +0 -32
  491. package/dist/tools/implementations/function-tool/schema-converter.d.ts.map +0 -1
  492. package/dist/tools/implementations/function-tool/schema-converter.js +0 -164
  493. package/dist/tools/implementations/function-tool/schema-converter.js.map +0 -1
  494. package/dist/tools/implementations/function-tool/types.d.ts +0 -72
  495. package/dist/tools/implementations/function-tool/types.d.ts.map +0 -1
  496. package/dist/tools/implementations/function-tool/types.js +0 -14
  497. package/dist/tools/implementations/function-tool/types.js.map +0 -1
  498. package/dist/tools/implementations/function-tool.d.ts +0 -49
  499. package/dist/tools/implementations/function-tool.d.ts.map +0 -1
  500. package/dist/tools/implementations/function-tool.js +0 -223
  501. package/dist/tools/implementations/function-tool.js.map +0 -1
  502. package/dist/tools/implementations/index.d.ts +0 -4
  503. package/dist/tools/implementations/index.d.ts.map +0 -1
  504. package/dist/tools/implementations/index.js +0 -5
  505. package/dist/tools/implementations/index.js.map +0 -1
  506. package/dist/tools/implementations/mcp-tool.d.ts +0 -72
  507. package/dist/tools/implementations/mcp-tool.d.ts.map +0 -1
  508. package/dist/tools/implementations/mcp-tool.js +0 -246
  509. package/dist/tools/implementations/mcp-tool.js.map +0 -1
  510. package/dist/tools/implementations/openapi-tool.d.ts +0 -56
  511. package/dist/tools/implementations/openapi-tool.d.ts.map +0 -1
  512. package/dist/tools/implementations/openapi-tool.js +0 -324
  513. package/dist/tools/implementations/openapi-tool.js.map +0 -1
  514. package/dist/tools/implementations/relay-mcp-tool.d.ts +0 -38
  515. package/dist/tools/implementations/relay-mcp-tool.d.ts.map +0 -1
  516. package/dist/tools/implementations/relay-mcp-tool.js +0 -46
  517. package/dist/tools/implementations/relay-mcp-tool.js.map +0 -1
  518. package/dist/tools/index.d.ts +0 -3
  519. package/dist/tools/index.d.ts.map +0 -1
  520. package/dist/tools/index.js +0 -4
  521. package/dist/tools/index.js.map +0 -1
  522. package/dist/tools/registry/index.d.ts +0 -2
  523. package/dist/tools/registry/index.d.ts.map +0 -1
  524. package/dist/tools/registry/index.js +0 -3
  525. package/dist/tools/registry/index.js.map +0 -1
  526. package/dist/tools/registry/tool-registry.d.ts +0 -54
  527. package/dist/tools/registry/tool-registry.d.ts.map +0 -1
  528. package/dist/tools/registry/tool-registry.js +0 -146
  529. package/dist/tools/registry/tool-registry.js.map +0 -1
  530. package/dist/utils/errors.d.ts +0 -155
  531. package/dist/utils/errors.d.ts.map +0 -1
  532. package/dist/utils/errors.js +0 -203
  533. package/dist/utils/errors.js.map +0 -1
  534. package/dist/utils/execution-proxy.d.ts +0 -75
  535. package/dist/utils/execution-proxy.d.ts.map +0 -1
  536. package/dist/utils/execution-proxy.js +0 -230
  537. package/dist/utils/execution-proxy.js.map +0 -1
  538. package/dist/utils/index.d.ts +0 -11
  539. package/dist/utils/index.d.ts.map +0 -1
  540. package/dist/utils/index.js +0 -7
  541. package/dist/utils/index.js.map +0 -1
  542. package/dist/utils/logger.d.ts +0 -74
  543. package/dist/utils/logger.d.ts.map +0 -1
  544. package/dist/utils/logger.js +0 -143
  545. package/dist/utils/logger.js.map +0 -1
  546. package/dist/utils/message-converter.d.ts +0 -68
  547. package/dist/utils/message-converter.d.ts.map +0 -1
  548. package/dist/utils/message-converter.js +0 -87
  549. package/dist/utils/message-converter.js.map +0 -1
  550. package/dist/utils/periodic-task.d.ts +0 -14
  551. package/dist/utils/periodic-task.d.ts.map +0 -1
  552. package/dist/utils/periodic-task.js +0 -26
  553. package/dist/utils/periodic-task.js.map +0 -1
  554. package/dist/utils/validation.d.ts +0 -40
  555. package/dist/utils/validation.d.ts.map +0 -1
  556. package/dist/utils/validation.js +0 -162
  557. package/dist/utils/validation.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,1207 @@
1
1
  # @robota-sdk/agent-core
2
2
 
3
+ ## 3.0.0-beta.100
4
+
5
+ ## 3.0.0-beta.99
6
+
7
+ ## 3.0.0-beta.98
8
+
9
+ ## 3.0.0-beta.97
10
+ ### Patch Changes
11
+
12
+ - c207a31: Keep automatic compaction aligned with the active model and pending input, preserve provider usage when estimating new context, and keep summary text out of the response stream. Display live context changes and successful automatic compaction in the shared app interface.
13
+ - 9b4f63b: Allow explicitly borrowed providers to outlive agent destruction and Session shutdown while keeping
14
+ owned providers as the default. Track replaced and removed provider cleanup, expose current provider
15
+ registrations after swapping, and hold Roundtable resource leases until runtime teardown finishes.
16
+ Borrowing does not permit concurrent provider use across leases.
17
+ Serialize manager lifecycle transitions so reinitialization cannot admit providers during pending teardown.
18
+ - 23a30cd: Preserve paired tool history when the repeated-input guard rejects an ordinary run, recording every blocked batch member as undispatched while retaining the original failure.
19
+
20
+ ## 3.0.0-beta.96
21
+
22
+ ## 3.0.0-beta.95
23
+ ### Minor Changes
24
+
25
+ - 04a6de4: **Reasoning text a provider streams now reaches the editor as an ACP `agent_thought_chunk`, through a new `thinking_delta` session event.**
26
+
27
+ `IChatOptions.onThinkingDelta`, `IRunOptions.onThinkingDelta` and `IResumeExecutionOptions.onThinkingDelta`
28
+ (typed `TThinkingDeltaCallback`) carry reasoning text from a provider through the run, and the session
29
+ options (`ISessionOptions.onThinkingDelta`, `ICreateSessionOptions.onThinkingDelta`) hand it to the
30
+ session's owner. `InteractiveSession` emits it as `thinking_delta(delta)`, beside `text_delta`. The
31
+ text is never part of the reply: it is not appended to the conversation, not streamed through
32
+ `onTextDelta`, and the core adds no record of its own for it (no text-delta log entry, no
33
+ `provider_stream_raw_delta`); a provider's own native payload capture and response metadata keep
34
+ what the provider sent, as before. A reasoning delta counts as provider activity for the idle
35
+ timeout whether or not anyone listens to it, so a model that is only thinking is not cut off. The
36
+ existing `thinking(isThinking)` event is unchanged and remains the busy indicator. Where a provider
37
+ sends no reasoning text, nothing is emitted and nothing new is switched on.
38
+
39
+ `@robota-sdk/agent-interface-session` is a major change because a new session event name makes an
40
+ exhaustive map over the event names stop compiling until it classifies the event.
41
+
42
+ `@robota-sdk/agent-transport-acp` sends each non-empty `thinking_delta` to the editor as an
43
+ `agent_thought_chunk`, in order with the message chunks, so `robota acp` shows the model's reasoning
44
+ in the editor. A turn that streamed only thoughts still shows its result text, because only reply
45
+ text marks a turn as streamed. The WebSocket wire, the HTTP stream, headless stream-json, `query()`
46
+ and the terminal UI do not carry the new event in this change (`@robota-sdk/agent-transport` and
47
+ `@robota-sdk/agent-ui-terminal` classify it as non-surface). A forked skill and an in-process subagent
48
+ pass their reply text up but not their reasoning.
49
+
50
+ Two providers already receive reasoning text and now report it. `@robota-sdk/agent-provider-openai`
51
+ passes `response.reasoning_summary_text.delta` events of a streamed Responses call to
52
+ `onThinkingDelta`; the API sends them only when the provider profile asks for a reasoning summary, and
53
+ no request option changed; a summary streamed in several parts, and the summary of a later reasoning
54
+ item, each start on a new paragraph (`\n\n`) so the parts do not run together.
55
+ `@robota-sdk/agent-provider-openai-compatible` reports the text of Gemma's thought channel, which the
56
+ provider already removed from the reply, as it streams across chunk boundaries, with each later
57
+ channel of one reply on a new paragraph; the reply text is unchanged. No other provider reports
58
+ reasoning, and Anthropic thinking is not enabled. A model fallback chain still moves to the next model when only reasoning had streamed.
59
+
60
+ The scripted test provider (`@robota-sdk/agent-core/testing`) accepts an optional `thinking` string on
61
+ a turn and delivers it through `onThinkingDelta` before the turn's text; the scripted session harness
62
+ collects `thinking_delta` and now keeps a scripted tool-call turn's `usage`, which it used to drop.
63
+ - 0ba247b: A tool result can now carry a view its source declared (an MCP app), and a surface can invoke a
64
+ runtime tool through the session's permission gate with a prompt. This is the contract and wiring
65
+ layer: nothing produces a view yet, and the GUI does not yet host one.
66
+
67
+ - `agent-core` — `IToolResult.view` carries an `IToolAppView` (source, `ui://` resource, mime type,
68
+ HTML, structured content, callable tools, the call's input). `view` is now a typed key of
69
+ `IToolResult`, so an extension that already used a `view` key with another type must rename it.
70
+ The view is display data: it never enters model context or the size that decides a spill, and a
71
+ result replaced by its reference keeps it.
72
+ - `agent-interface-session` — `invokeRuntimeTool` takes `permissionInteraction` (`'interactive'` or
73
+ the default `'deny'`), a `driverId` (a host that attributes prompts names it as the requester) and
74
+ an `executionId` its events carry. A finished model call's `tool_end` names its view with
75
+ `IToolState.appView` (`viewId`, source, resource), and the new
76
+ `ISessionToolAppViews.readToolAppView(viewId)` reads the document. A permission handler may take
77
+ `{ signal }`, and aborting it withdraws the prompt.
78
+ - `agent-session` — a direct call asks a person only when its caller says so, and the handler is
79
+ given the call's own signal; the tool end event carries the view, never in the logged result data.
80
+ - `agent-framework` — the view of a model's call is kept under a `viewId` the session mints, in a
81
+ bounded per-session store (16 views, 4 MiB each, 16 MiB in all, measured on the whole serialized
82
+ view), and read on demand, so the document never rides `tool_end` to every surface, never enters
83
+ the recorded history, and a repeated provider tool-call id cannot overwrite another turn's view.
84
+ A malformed view is dropped. A direct call keeps and names no view, recognised by the id it was
85
+ started with. A submission or agent wakeup that arrives while a direct call holds the session is
86
+ queued behind it, as during a turn, instead of refused. A direct call acting for a driver
87
+ attributes its permission prompt and tool events to that driver, and aborting its signal withdraws
88
+ an open prompt from every surface.
89
+ - `agent-transport` — a driving connection sends `call-app-tool` (answered by `app_tool_result`) and
90
+ `read-app-view` (answered by `app_view`). A call names its view and reaches only the tools that
91
+ view's source declared; a call or read that decodes but cannot be served answers `protocol_error`
92
+ echoing the `requestId`, while an observer's attempt is refused like any non-read. A call still
93
+ waiting on its prompt is cancelled when its connection goes away (for the resume bridge, when the
94
+ bridge is disposed). `maxFrameBytes` bounds an app answer to what a carrier's channel carries;
95
+ the WebRTC carrier uses a history page's worth. `IProtocolSession` now includes the runtime-tool
96
+ and app-view roles.
97
+ - `agent-ui-web` — the two new server messages are recorded as not rendered until the app-view host
98
+ consumes them.
99
+
100
+ An implementation of `IInteractiveSession` or `IProtocolSession` outside this repository must add
101
+ `readToolAppView` (and, for `IProtocolSession`, `listRuntimeTools` and `invokeRuntimeTool`); the
102
+ members are required so a host cannot silently lack them.
103
+
104
+ ### Patch Changes
105
+
106
+ - 02053ec: Leave unregistered DeepSeek model costs unknown instead of applying unrelated legacy model prices.
107
+
108
+ ## 3.0.0-beta.94
109
+
110
+ ## 3.0.0-beta.93
111
+ ### Patch Changes
112
+
113
+ - Release the integrated provider credential isolation and consumer runtime and interaction composition updates.
114
+
115
+ ## 3.0.0-beta.92
116
+ ### Patch Changes
117
+
118
+ - Local OpenAI-compatible servers can be set up without saving a placeholder API key. Explicit credentials and environment references remain effective for authenticated servers and connection tests. Optional credentials are managed through the user-only provider edit command.
119
+
120
+ ## 3.0.0-beta.91
121
+
122
+ ## 3.0.0-beta.90
123
+
124
+ ## 3.0.0-beta.89
125
+
126
+ ## 3.0.0-beta.88
127
+
128
+ ## 3.0.0-beta.87
129
+
130
+ ### Patch Changes
131
+
132
+ - Release the migrated Robota product with its public SDK namespace, robota command, compatible SDK exports, internal product configuration, and verified CLI startup and delivery corrections.
133
+ - 66af868: Accept Claude-compatible WebFetch domain permission rules during session initialization while preserving hostname boundaries and deny/ask enforcement.
134
+ - 7d9cc66: Add trusted host scheduling for model tool rounds, with dependencies, bounded independent work,
135
+ and shared-resource reader/writer exclusion. Unknown resources serialize conservatively. Failed
136
+ predecessors or invalid plans produce paired skipped receipts, while settled recovery receipts
137
+ and already running sibling outcomes remain intact.
138
+ - 7d9cc66: Retain typed text and image observations alongside structured tool data through runtime settlement, history, and recovery. Deliver tool images as native content in OpenAI Responses and Anthropic requests, retain structured error receipts, include media in bounded result admission, and reject malformed MCP image observations with reconciliation state intact.
139
+ - 7d9cc66: Preserve a result for each remaining call when a sequential tool batch stops after failure. Persist skipped calls without dispatch and reject recovery records that claim an executed action was skipped.
140
+ - 7d9cc66: Retain typed resource and audio observations alongside structured tool results through history, durable receipts, recovery, size admission, and session persistence. Preserve opaque resource references without fetching them, project embedded text and explicit unsupported binary/audio diagnostics into provider requests and compaction transcripts, and validate persisted observation shapes on reload.
141
+ - 7d9cc66: Retain registered tool source attribution in observations and preserve ordered outcome receipts independently of conversation summaries.
142
+ - 7d9cc66: Observe scheduler queue intervals separately from pre-dispatch admission, permission and tool work.
143
+ Preserve valid duration totals when live trace detail is bounded, reporting invalid evidence explicitly
144
+ through content-free console and OTLP traces without altering dispatch, recovery or settlement.
145
+ - 7d9cc66: Retain registered attribution on refused and interrupted call receipts without replacing the source of actual or recovered settlements, and project undispatched registered calls into live and restored presentation history.
146
+
147
+ ## 3.0.0-beta.86
148
+
149
+ ## 3.0.0-beta.85
150
+
151
+ ### Patch Changes
152
+
153
+ - 41cca13: Fixed `run(input, { allowToolOnlyCompletion: true })` throwing an internal `[STRICT-POLICY]` error
154
+ when a round produced neither a tool call nor any text — for example a tool-calling decision agent
155
+ whose model answered with nothing at all. `allowToolOnlyCompletion` only widens what counts as a
156
+ finished turn (a tool call alone, with no final text); an ordinary text-only reply already completes
157
+ normally and is unaffected, and a turn that ends in tool results still resolves with `''`. A turn
158
+ that ends with neither text nor a tool result now rejects with a new, catchable `EmptyCompletionError`
159
+ (`code: 'EMPTY_COMPLETION'`) instead of the internal invariant message; `resume()` of such an
160
+ execution raises the same error.
161
+ - ada3841: Dispatch tool-call plugin hooks around each decoded attempt, including unknown-tool refusals,
162
+ and emit the event emitter plugin's before-execution event. A pre-effect wait resumes the same
163
+ logical call without repeating its before hooks; recovered results do not replay call hooks.
164
+
165
+ Pair parallel tool analytics by the logical execution ID, including calls of the same tool.
166
+
167
+ - 5093a30: A `ConversationAgent` run now calls `beforeConversation`, with `beforeExecution`, and `onStreamingChunk` for
168
+ each streamed piece of text, in order; the round waits for those chunk hooks before it goes on,
169
+ whether the provider call returned, failed or was interrupted. `EventEmitterPlugin` therefore emits
170
+ `CONVERSATION_START`.
171
+
172
+ The run result's `toolCalls` now carry each executed call's id and `result: null` for one that
173
+ failed, so `EventEmitterPlugin` emits `TOOL_ERROR` instead of `TOOL_SUCCESS` for a failed call, and
174
+ `WebhookPlugin`'s `tool.executed` payload reports it as failed with its call id.
175
+
176
+ `EXECUTION_START`, `EXECUTION_COMPLETE` and `EXECUTION_ERROR` are marked deprecated: no run emits
177
+ them; the `AGENT_EXECUTION_*` events are the ones a run emits. `beforeToolCall`,
178
+ `beforeToolExecution` and `afterToolCall` are still not called.
179
+
180
+ - 94b2c87: A PreToolUse `command` hook can now steer a tool call, not only refuse it. The permission gate
181
+ applies the winning `hookSpecificOutput.permissionDecision`:
182
+
183
+ - `allow` skips the prompt a person would otherwise get. Deny rules, refusals from the mode, the
184
+ `auto` mode classifier and asks that must reach a person (an `ask` rule, a protected path, a
185
+ policy that asks about everything) still apply.
186
+ - `ask` sends the call to a person even when the mode or a remembered consent would run it. The
187
+ answer is not remembered, and with no one to ask the call is refused.
188
+ - `defer` leaves the call to the normal flow, as before.
189
+
190
+ Before this change these decisions were read and then ignored.
191
+
192
+ `updatedInput` is still not applied: the call runs the input it was made with, and an `allow` sent
193
+ with an `updatedInput` is not applied either, since it approved another input.
194
+
195
+ `runHooks` (agent-core) now reads a decision and an `updatedInput` only from `command` hooks: a
196
+ `prompt` or `agent` hook answers from a model that reads the tool input it judges, so it can only
197
+ refuse. With several hooks, `ask` now outranks `defer` (`deny` > `ask` > `defer` > `allow`), and the
198
+ reported `updatedInput` is the one sent with the winning decision.
199
+
200
+ - 3ab2eca: - External presets accept every permission mode a session does, `auto` included; `auto` used to fail validation.
201
+ - `createDagFramework({ ports: { costMeta } })` wires cost-metadata management; without it cost operations still report that they are unsupported.
202
+ - `startCli()` runs the subagent worker when a subagent starts the embedder's entry script again, as the `robota` executable already did; an embedded CLI used to start a second CLI there.
203
+ - The provider `executor` option docs no longer import a `RemoteExecutor` that does not exist, and `IRemoteExecutorConfig` is marked deprecated: nothing implements a remote executor.
204
+
205
+ ## 3.0.0-beta.84
206
+
207
+ ### Minor Changes
208
+
209
+ - 9f46375: A run can record its model calls and tool effects in a journal the host owns, and continue from it
210
+ later. Pass `executionJournal` in the run options: each model request and response, and each tool
211
+ call's intent, start and result, is written and awaited before the run moves on. If a write fails,
212
+ the run stops with an `ExecutionJournalError`, even when it is also being cancelled; the model never
213
+ sees it as a tool failure it could retry. A journaled run waits for a cancelled model call to
214
+ finish, because its late reply can still carry usage or tool calls that must be recorded.
215
+
216
+ With a journal that can also read its records back (`IRecoverableExecutionJournal`), a new `ConversationAgent`
217
+ for the same conversation continues where the old one stopped, without new user input and without
218
+ repeating calls whose results were saved:
219
+
220
+ - `ConversationAgent.resumeToolCalls()` runs the latest saved batch of tool calls without calling the model.
221
+ - `ConversationAgent.resume()` continues the whole execution, keeping its remaining round and repeated-input
222
+ limits. It refuses a different provider or model. Turn-level lifecycle hooks do not run again, and
223
+ structured output cannot be recovered. A deferred tool the execution had loaded that is no longer
224
+ registered raises `ExecutionRecoveryError`.
225
+
226
+ A tool can ask for an answer before it acts, through `continuation` on its execution context. The
227
+ request is saved and the run ends with `ExecutionSuspendedError`, without a completion or failure.
228
+ Tools already running beside it finish and save their real results; only calls not yet started wait.
229
+ Answering it through `toolResponses` on a later `resume()` continues the same action; an unanswered
230
+ request never lets the tool act. A tool call that may have started without a saved result raises
231
+ `ExecutionRecoveryError` and must be reconciled by the host: it is never run again automatically.
232
+ `isExecutionControlError` recognizes these errors. `callJournaledProvider`, with an
233
+ `IModelJournalContext`, journals a model call made outside a run.
234
+
235
+ ### Patch Changes
236
+
237
+ - 9c6a8db: Provider adapters now throw the specific typed failure a vendor response describes, instead of a
238
+ generic `ProviderError` carrying only its status. A 401/403 (or a vendor-specific authentication type)
239
+ becomes an `AuthenticationError`; a response naming an unavailable model — by code or, when the vendor
240
+ gives neither (Anthropic's and Gemini's real bodies carry no distinguishing code), by its message —
241
+ becomes a `ModelNotAvailableError`, whose `model` is now optional since a bare HTTP status does not
242
+ always name one; a transport failure becomes a `NetworkError`, which now also carries the provider
243
+ name. A 429's `retry-after` header (a delta or an HTTP-date) is read into `RateLimitError.retryAfter`
244
+ when the vendor sends one.
245
+
246
+ Vendor error text is scrubbed of anything that reads like a credential — an `Authorization`/`Bearer`
247
+ value, an API key in a header, query string or JSON body, a bare `sk-`/`AIza…` token — before it is
248
+ kept on any of these typed errors, so a misconfigured self-hosted gateway that echoes a request back
249
+ can no longer leak one into a message or a "Details" disclosure. The new `scrubSecrets` export applies
250
+ the same scrubbing to arbitrary text.
251
+
252
+ ## 3.0.0-beta.83
253
+
254
+ ### Minor Changes
255
+
256
+ - e689c8e: Follow-ups to connection approval and `/handoff`.
257
+
258
+ - `agent-transport-webrtc-web` — the browser remote client says `Waiting for the host to approve this connection…`
259
+ (`awaiting-approval`) after pairing, and `Connected` only once the host's session answers. A host that closes the
260
+ channel instead is shown as `refused` and is not retried, since a retry would only ask the operator again; a
261
+ first connection lost before the host answered is `failed`. Reconnect attempts count until the host admits a
262
+ connection, so a link that keeps dropping while approval is pending gives up instead of asking again and again.
263
+ - `agent-core`, `agent-session`, `agent-framework` — a turn that did not come from the operator stores its
264
+ `turnSource` (`peer`, `external`, `agent-wakeup`) beside `driverId` on the user message and in the display
265
+ history (`IRunOptions.turnSource`), so a session handed off keeps where each turn came from.
266
+ - `agent-cli` — a `/handoff` resent after a lost confirmation reports what stays behind as it is now, not as it was
267
+ at the first attempt, and after refusing to resend a session that changed, the hand-off status shows that refusal
268
+ instead of the earlier lost confirmation.
269
+
270
+ - be0e53c: A tool instance shared by several sessions sends each call's span to the session that made the call.
271
+
272
+ - **Before:** each session set its event service on the shared instance, so the span went to whichever session had set it last.
273
+ - **`agent-core`:** `IToolExecutionContext` gains an optional `instanceEventService`. `FunctionTool` emits its span there when a call carries one.
274
+ - **`agent-session`:** the permission wrapper keeps its session's service and passes it with every call.
275
+
276
+ ### Patch Changes
277
+
278
+ - 8bd5fac: Cached input tokens are no longer dropped (#3209 R3). The OpenAI and OpenAI-compatible adapters read
279
+ `prompt_tokens_details.cached_tokens` (Chat Completions, including the final streamed usage chunk) and
280
+ `input_tokens_details.cached_tokens` (Responses, OpenAI and Qwen) into `cacheReadTokens` on the message
281
+ usage: the part of the prompt served from the provider's prompt cache, present only when reported.
282
+ It reaches the committed assistant message, `readTokenUsageFromMessage()`, and the
283
+ `provider_call_completed` execution event, so a consumer can apply the cache discount.
284
+
285
+ New `sumMessagesUsage(messages)` sums the usage on assistant messages (with `cacheReadTokens` when any
286
+ reported it), so one run's usage is `sumMessagesUsage(agent.getHistory().slice(before))` without
287
+ converting through `messageToHistoryEntry` (#3209 S1). `sumHistoryUsage` returns the same triple as before.
288
+
289
+ A forced-summary reply now keeps the usage its provider reported the same way a tool round's reply
290
+ does: an endpoint that omits `total_tokens` no longer loses exactly the summary call's usage (#3209 N3). Counts
291
+ the adapter could not attest as a consistent total are recorded with `usageProvenance: 'partial'`.
292
+
293
+ - 57280bf: Every published package now declares `"engines": { "node": ">=22.12.0" }`. Before, 27 of the 38
294
+ packages declared no floor (`agent-core`, `agent-tools` and every provider among them),
295
+ `agent-session` and `agent-file-authority` declared `>=20.19.0`, and the other nine declared
296
+ `>=22.0.0`, so a consumer on Node 20 saw at most a warning from a transitive dependency.
297
+
298
+ Why 22.12: `agent-cli` and `agent-ui-terminal` need Node 22 through `ink` 7, and the CommonJS entries
299
+ of `agent-tools` and its dependents, `agent-transport`/`node` and its dependents, and
300
+ `agent-ui-terminal` `require()` ESM-only dependencies (`p-limit`, `jose`, `chalk`), which Node 22
301
+ supports unflagged only from 22.12. `engines` is advisory unless the consumer enables `engine-strict`.
302
+
303
+ No code changes: `tsdown` now reads `node22.12.0` as its build target from the field.
304
+
305
+ - 5033dd9: When the round cap ends a run on a tool round and the follow-up summary call fails, `run()` and
306
+ `runStream()` now reject with that call's own provider error (for example a `RateLimitError` with
307
+ `recoverable: true`, or the provider's 400 error) instead of a generic
308
+ `[STRICT-POLICY] Failed execution result missing error field` error. The failure is recorded in
309
+ history like a failed round. An aborted summary call now resolves the run as interrupted, like an aborted round, instead of failing.
310
+ - 18c0d5c: Every published package now exports `./package.json`, so `require('<package>/package.json')` and
311
+ `import('<package>/package.json', { with: { type: 'json' } })` work instead of failing with
312
+ `ERR_PACKAGE_PATH_NOT_EXPORTED`, and each tarball now ships the package's `CHANGELOG.md`.
313
+ - dbd888d: A `run()` or `runStream()` whose signal is already aborted when its turn comes now fails as an abort:
314
+ `name === 'AbortError'`, so `isAbortFailure(err)` holds without the signal. The signal's own reason is
315
+ thrown when it already is an `AbortError` (the default `controller.abort()`); any other reason,
316
+ including an error that only wraps an abort, becomes the `cause` of an abort error whose message says
317
+ `Run aborted before it started`, or `Run aborted while queued behind another run on this instance`
318
+ only when the run actually waited behind another. It still never reaches the provider or the history.
319
+ Previously it was a plain `Error` that always claimed the run had been queued.
320
+ - 1887e54: A run's answer now comes from its own turn. A turn run with `allowToolOnlyCompletion` that ends in
321
+ tool calls resolves with `''` instead of throwing a `[STRICT-POLICY]` error, and a later turn that
322
+ produces no text no longer resolves with the previous turn's answer. An aborted run resolves with the
323
+ text it committed before the abort (the same text history keeps, marked `interrupted`) instead of
324
+ `''`, and its result lists the tool calls the turn handled before the abort. `tokensUsed`, which plugins receive
325
+ after each run, counts only that run's provider calls instead of the whole conversation's.
326
+
327
+ ## 3.0.0-beta.82
328
+
329
+ ### Minor Changes
330
+
331
+ - c7f9203: Connected sessions can send each other files.
332
+
333
+ - `/peers send-file <session-id> <path>` sends a copy of any file the operator can read to another
334
+ live session on this host.
335
+ - The model sends a file only through the `peer_send_file` tool. Every call asks the user, showing
336
+ the path, size, hash and destination; no permission mode, rule or remembered consent answers it.
337
+ The tool reaches only files inside the workspace whose path does not look like it holds secrets
338
+ (`.env*`, `~/.ssh`, keys and credentials), and it does not exist in a turn a peer's message started.
339
+ - The receiving operator approves every file. A received file is kept as an inert copy (mode 0600)
340
+ under `$PRODUCT_USER_STATE_DIR/peer-files/<sender>/`. It is never run and never placed in the model's context.
341
+ The conversation is told only its name, size and sha256. A name that leaves that directory is
342
+ refused, a symbolic link is never written through, and nothing is overwritten.
343
+ - Transfers travel on a channel of their own (a separate connection on this host, a separate data
344
+ channel between devices), in chunks the receiver paces, up to 32 MiB, and are kept only when the
345
+ whole content matches the offered sha256. A transfer that ends early is discarded; there is no
346
+ resume.
347
+
348
+ **API**
349
+
350
+ - `agent-interface-session-mobility`: the `file` capability, which asks the operator for every
351
+ request; `ConnectionAuthority.authorizeFile`; `IFileOffer` and `IFileFrameChannel`.
352
+ - `agent-transport/node`: `sendFileOverChannel` and `receiveFileOverChannel`, the carrier over any
353
+ `IFileFrameChannel`; `DEFAULT_MAX_FILE_BYTES`.
354
+ - `agent-transport-webrtc`: `IDeviceMeshLink.openFileChannel` and `onFileChannel`.
355
+ - `agent-remote-pairing`: `file` joins `DEVICE_CAPABILITIES`. A device certificate that names it is
356
+ refused as malformed by an earlier version.
357
+ - `agent-core`: `IToolPermissionProfile.notInPeerTurn` withholds a tool from a turn a peer's message
358
+ started.
359
+ - `agent-framework`: `ICommandLocalPeersAdapter.prepareFile`.
360
+
361
+ ## 3.0.0-beta.81
362
+
363
+ ### Minor Changes
364
+
365
+ - 3038eb7: A message from another session is instant messaging: text from an untrusted third party that
366
+ carries no authority. What the model does with it is decided by the session's ordinary permissions —
367
+ rules, permission mode and remembered consent — exactly like the session's own work. The per-origin
368
+ peer policy is gone.
369
+
370
+ **BREAKING**
371
+
372
+ - `agent-core`: `IPermissionEvaluationContext.peerTurn` is now a boolean. It decides only whether a
373
+ `repliesToPeer` tool exists; every other call in a peer turn is decided as in any turn. Removed:
374
+ `isToolAvailableInPeerTurn`, `isSecretPath`, `IPeerTurnAuthority`, `TPeerReach` (now exported by
375
+ `agent-interface-session-mobility`) and `IToolPermissionProfile.workspacePaths`.
376
+ - `agent-tools`: `Read` and `Glob` no longer declare `workspacePaths`.
377
+ - `agent-session`: `ISessionRunOptions.peerReach` is replaced by `peerTurn?: boolean`, and
378
+ `ISessionOptions.allowPeerChanges` is removed. An ask in a peer turn is answered like any other:
379
+ a consent the operator remembered answers it, and an "always allow" given there is remembered.
380
+ - `agent-interface-session`: `IPeerTurnContext` no longer has `reach`; it carries only the reply
381
+ route.
382
+ - `agent-interface-session-mobility`: `peerReachOf` is removed; `TPeerReach` moves here. A delegated
383
+ turn carries no reach.
384
+ - `agent-framework`: the `peers.allowChanges` setting is removed (an existing value is ignored). A
385
+ peer turn is offered the ordinary tools, plus `peer_reply`.
386
+
387
+ **Changes**
388
+
389
+ - `agent-framework`: the per-turn statement tells the model the message is an opinion from an
390
+ untrusted third party, not its owner's instruction, and that it decides for itself whether and how
391
+ to act. A message still expands no `@path` and attaches no context reference, and its requests
392
+ still carry no provider-hosted tool, since no permission step can decide one. The session takes
393
+ at most 6 messages a minute and 30 an hour from each sender for a turn; a message over the limit
394
+ is refused with a reason the sender receives. A prompt answer given in the name of a `peer:` or `external:`
395
+ driver is ignored. External-event turns keep their tool-less baseline.
396
+ - `agent-cli`: incoming peer turns carry only their reply route.
397
+
398
+ - 02b7452: A reply to a peer session is decided by the permission system like any call that sends something
399
+ off this machine, and it goes only to the sender that was admitted.
400
+
401
+ - `agent-core` — a tool declaring `repliesToPeer` is still refused outside a peer turn; inside one it
402
+ is decided by the ordinary steps: deny, ask and allow rules, then the mode. It declares no risk
403
+ class, so it asks by default, is refused in plan mode and proceeds under bypass. `IPeerTurnAuthority`
404
+ no longer has `toolUsed`.
405
+ - `agent-session` — an "always allow" answer to the reply is remembered and answers later replies,
406
+ as for any tool; other asks in a peer turn still need a fresh approval each time.
407
+ - `agent-framework` — `peer_reply` asks the operator by default, showing the full text and the peer
408
+ it goes to; `permissions.allow`/`deny` rules naming `peer_reply` apply. `PeerMessageIngress`
409
+ refuses a message whose origin names a sender other than the admitted one, or whose admission names
410
+ no sender, and submits the turn with the admitted identity.
411
+ - `agent-cli` — a local peer message is taken as coming from the session it names only when that
412
+ session confirms, at its own socket, that it is sending exactly that message to this receiver.
413
+ The reply target, the driver id and the operator's notices come from the confirmed sender. A
414
+ session on an earlier version cannot confirm, so its messages are refused; both sessions need this
415
+ version to message each other.
416
+
417
+ - ec5e477: Add a credential store port (`ICredentialStore` in `agent-core`) and keep the CLI's secrets behind it: the OS keychain through the optional `@napi-rs/keyring` binding (macOS Keychain, Windows Credential Manager, Linux Secret Service), else an owner-only file under `$PRODUCT_USER_STATE_DIR/credentials`. The backend is chosen at first use, recorded, and named by `/remote-control status`; a recorded keychain that stops working fails closed instead of degrading to the file.
418
+
419
+ The remote-control host identity key moves into the store. The old `$PRODUCT_USER_STATE_DIR/remote-host-identity.json` may have been copied by backups or dotfile sync, so it is not carried over: on the first run after upgrading a new host key is generated, the old file is removed, and the operator is told once that trusted devices must pair again.
420
+
421
+ ## 3.0.0-beta.80
422
+
423
+ ### Major Changes
424
+
425
+ - 4eea54b: **`@robota-sdk/agent-core` removes `IMCPToolConfig` and `IToolFactory.createMCPTool()` with no compatibility facade.**
426
+
427
+ Both were exported with no producer and no consumer. `IToolFactory` had no implementation anywhere in
428
+ this repository — `grep -rn 'IToolFactory' packages/*/src apps/*/src` returned only the declaration
429
+ and its export line — and nothing constructed an `IMCPToolConfig`. An MCP server definition is now
430
+ owned by `@robota-sdk/agent-mcp` (MCP-001), which also absorbs the raw/validated/resolved
431
+ forms, source provenance and shadow metadata, strict foreign `mcpServers` decoding, environment
432
+ templates, whole-entry precedence, reversible disable overlays, redacted management projections and
433
+ activation identity.
434
+
435
+ `major` because an exported type and an interface member are gone. An external implementer of
436
+ `IToolFactory` — there is none in this repository — stops compiling until it removes its
437
+ `createMCPTool` member; a caller of the removed type must take the `agent-mcp` definition contract
438
+ instead. No facade is retained deliberately: keeping a deprecated alias would re-create the state
439
+ this change exists to end, two MCP contracts with one of them dead.
440
+
441
+ `@robota-sdk/agent-mcp` is the same workspace package previously named `@robota-sdk/agent-tool-mcp`,
442
+ renamed in place. It stays `private`, so the rename publishes nothing; MCP-002 owns its publication
443
+ together with the official MCP TypeScript SDK client and the first product-reachable slice.
444
+
445
+ - f336838: One permission evaluation order for every caller. The interactive session, background tasks and
446
+ subagents used to run two different resolvers, so the same call could be decided differently
447
+ depending on who made it. They now share `evaluatePermission`, and a background policy only adds a
448
+ ceiling, an ask-everything flag and the task's own lists to it:
449
+
450
+ deny → caller ceiling → unevaluable deny (ask) → never-auto-approve set (ask) → ask-everything →
451
+ bypassPermissions → allow → mode.
452
+
453
+ - **`ask` rules.** `permissions.ask` patterns always ask, in every mode including
454
+ `bypassPermissions`. They are matched per command like a deny rule, and are validated at
455
+ construction alongside `allow` and `deny`.
456
+ - **Never auto-approved, bypass included:** removing a critical path with `rm`/`rmdir` (the root, a
457
+ top-level directory, home, the working directory or a parent), and a modify-class write into
458
+ `.git`, `.Robota`, `.claude`, `.agents`, `.mcp.json`, `.gitconfig`, `.npmrc` or a shell rc file.
459
+ Files inside an isolated worktree (`$PRODUCT_PROJECT_STATE_DIR/worktrees/<name>/…`) are ordinary files. With no
460
+ approver attached, an ask is a denial.
461
+ - **A ceiling is checked before bypass and before any ask.** A subagent's `inherit-allowlist` ceiling
462
+ is now the parent's _effective_ rules, read live at spawn: settings, preset lists and command
463
+ auto-allows. It used to be the raw settings file. An unevaluable deny under a policy now asks,
464
+ like everywhere else, where it used to deny outright; with no approver it is still a denial.
465
+ - **Settings layers union `permissions.allow`**, as they already did `deny`. A checked-in project
466
+ file no longer silently discards the user's allow list.
467
+ - **Print mode, `createQuery()` and headless sessions default to `default` mode**, not
468
+ `bypassPermissions`. They have no approver, so a call that would ask is denied. Pass
469
+ `--permission-mode` / `permissionMode: 'bypassPermissions'` explicitly for unattended runs.
470
+
471
+ **Breaking:**
472
+ - `@robota-sdk/agent-core` removes `resolvePermissionByPolicy` and `TPermissionPolicyDecision` in
473
+ favour of `projectPermissionPolicy` plus `evaluatePermission`'s new `context` argument.
474
+ - `@robota-sdk/agent-framework` changes the settings merge rule for `permissions.allow`, and the
475
+ default permission mode of `createQuery()` and headless sessions.
476
+
477
+ - 475e085: **BREAKING — CORE-028: the Node-only surface moves from the main barrel to `@robota-sdk/agent-core/node`.**
478
+
479
+ `canonicalizePath`, `isPathInside`, `CommandExecutor` and `HttpExecutor` were exported from the main
480
+ barrel. Each one needs `node:fs`, `node:path` or `node:child_process`, so the package's `browser`
481
+ build had those three builtins in its static import graph — a package declaring a `browser` export
482
+ condition while statically importing Node builtins. A bundler resolves that one of two ways: it
483
+ errors, or it aliases the builtin to an empty object and the code fails later at a call site with no
484
+ useful trace. Neither is a build you want to ship.
485
+
486
+ The four now live at the `./node` subpath, which makes the dependency legible at the import site
487
+ instead of hiding it inside a barrel. The main barrel's static graph imports zero Node builtins,
488
+ which a test now holds at zero rather than at a list of known remainders.
489
+
490
+ **Migration** — change the import path; no signature changed:
491
+
492
+ ```ts
493
+ // before
494
+ import {
495
+ canonicalizePath,
496
+ isPathInside,
497
+ CommandExecutor,
498
+ HttpExecutor,
499
+ } from '@robota-sdk/agent-core';
500
+
501
+ // after
502
+ import {
503
+ canonicalizePath,
504
+ isPathInside,
505
+ CommandExecutor,
506
+ HttpExecutor,
507
+ } from '@robota-sdk/agent-core/node';
508
+ ```
509
+
510
+ `./node` carries `"browser": null`, declaring that the subpath has no browser implementation, so a
511
+ resolver that honours a null target refuses it by name instead of quietly serving the Node build.
512
+
513
+ That declaration is worth stating precisely, because it was measured rather than assumed. Bundling
514
+ `import '@robota-sdk/agent-core/node'` under `['browser', 'import', 'default']` with the repo's own
515
+ bundler does NOT stop at the null: through a workspace link it resolves the `source` entry and then
516
+ fails on `node:fs`, `node:path` and `node:child_process`. The build still breaks, and the message
517
+ still names the Node dependency, so the failure is visible either way — but by a different mechanism
518
+ than the null, and only spec-compliant resolvers give the cleaner error. The claim here is the
519
+ declaration, not a guarantee about every bundler.
520
+
521
+ ### Minor Changes
522
+
523
+ - 1698be4: A child-process subagent can no longer send the parent's provider credential to a different
524
+ endpoint.
525
+
526
+ - **Before spawning a child**, the parent compares every environment variable that decides where
527
+ the provider connects or which credential it sends. If the child's environment differs, the job
528
+ is refused before the credential leaves the parent. The error names the variable, never its
529
+ value. The variables compared are:
530
+ - the proxy and TLS variables;
531
+ - the variables the provider's SDK reads, such as `OPENAI_BASE_URL`, `ANTHROPIC_AUTH_TOKEN` and
532
+ the Vertex settings;
533
+ - the credential's own variable.
534
+ - **The child** repeats the check before it builds its provider. It builds that provider from the
535
+ parent's effective connection exactly: it no longer fills in a base URL, options or a default
536
+ credential from its own registry, and a credential reference that resolves to nothing is refused.
537
+ - **Where the effective connection comes from:** the parent applies its own definition defaults
538
+ (base URL, options). `profileName` is sent only when it names the connection actually sent.
539
+ - **New contracts:**
540
+ - `IProviderDefinition.destinationEnvironment`, declared by every built-in provider.
541
+ - `createProviderFromExactProfile`, `connectionEnvironmentNames`,
542
+ `findConnectionEnvironmentDivergence`, `sealConnectionEnvironment`,
543
+ `verifyConnectionEnvironment` and `TRANSPORT_ENVIRONMENT`.
544
+ - The start payload's `connectionCheck`.
545
+ - The child-process runner's `providerDefinitions` option, now required: a provider with no
546
+ definition there is refused, because its connection cannot be checked.
547
+
548
+ - d4189b9: The rest of the per-server MCP OAuth lifecycle: signing in to a server without a local browser,
549
+ signing out of it with token revocation, and each server's sign-in state in `/mcp`.
550
+
551
+ - **`robota mcp login <name> --no-browser`** prints the authorization URL and reads the redirect URL
552
+ the user pastes back (not echoed). `runMCPOAuthLogin` takes `readRedirect` for this; nothing
553
+ listens on the redirect URI then. The pasted URL is held to the loopback listener's rules through
554
+ `createPastedRedirectAcceptor`: it must be the registered redirect URI (same origin and path, no
555
+ user info), carry the sign-in's `state` (compared in constant time), and is accepted once; an
556
+ error redirect is `authorization-denied` without its `error_description`, and the RFC 9207 `iss`
557
+ check applies as before. `openBrowser` now also receives the redirect URI. `readRedirect` gets a
558
+ signal that aborts on cancel or at `callbackTimeoutMs` (5 minutes by default, as for the loopback
559
+ listener); a paste longer than the prompt accepts fails as `redirect-too-long`.
560
+ - **Signing out** (`runMCPOAuthLogout`; `robota mcp logout <name>`; `/mcp logout <serverId>`):
561
+ deletes the stored credential under the refresh lock, then revokes the refresh token and the
562
+ access token (RFC 7009) when the stored issuer advertises `revocation_endpoint`. Revocation is a
563
+ POST through the egress policy that never follows a redirect and is byte-bounded; it authenticates
564
+ the client by `revocation_endpoint_auth_methods_supported` when advertised, otherwise the way its
565
+ refresh does. The local delete always happens. Each token's outcome is reported in `tokens`, and
566
+ overall as `revoked`, `partial`, `unsupported`, `failed` or `not-attempted`, with fixed reasons
567
+ only (new: `revocation-failed`, and `token-type-not-revocable` for RFC 7009
568
+ `unsupported_token_type`). `/mcp logout` also makes the session's authenticator drop the token it
569
+ holds (`IMCPOAuthAuthenticator.forget`).
570
+ - **Sign-in state:** `readMCPOAuthCredentialState` answers `signed-in`, `expired-refreshable`,
571
+ `sign-in-required` or `signed-out` — never anything token-derived. `/mcp` shows it for every
572
+ OAuth server; a server this session was told needs a sign-in reads `sign-in-required`.
573
+ `ICommandMCPActivationAdapter` gains optional `oauthStatus` and `oauthLogout`
574
+ (`ICommandMCPOAuthStatus`, `ICommandMCPOAuthLogoutResult`).
575
+ - **No in-session sign-in:** signing in stays `robota mcp login <server>` in a terminal, since it
576
+ needs the terminal (browser, pasted redirect, hidden secret prompt) a running session owns. `/mcp`
577
+ names that command for a server that needs a sign-in, as does the session's sign-in notice; the
578
+ server name is shown there only when it is safe to paste into any shell — a plain token not
579
+ starting with `-` or `=` — and is otherwise replaced by `<server>` (`shellArgumentForDisplay` in
580
+ `agent-core`; nothing is quoted, since quoting rules differ between shells). Server names in OAuth
581
+ notices have control and format characters escaped.
582
+ - **Refresh hardening:** on `invalid_grant`, the store is read again under the lock; a refresh token
583
+ another holder rotated in meanwhile is kept (and used when still valid) instead of being deleted.
584
+ The expiry skew is capped at half the token's lifetime, so a short-lived token is not refreshed on
585
+ every request; credentials now record `issuedAt` for this.
586
+
587
+ - 9edae52: Remote MCP servers can authenticate with OAuth: `robota mcp login <name>` signs in, and sessions
588
+ send the stored token.
589
+
590
+ - **Declaring it:** `"oauth": { "clientId"?, "callbackPort"?, "authServerMetadataUrl"?, "scopes"? }`
591
+ on a remote server definition, decoded into `IMCPOAuthConfig`.
592
+ - `authServerMetadataUrl` must be `https`. `scopes` wins over the server's metadata and a 401's
593
+ `scope`.
594
+ - A `clientId` needs a `callbackPort`: a pre-registered client's redirect URI is fixed.
595
+ - `clientSecret`, unknown keys and `${}` templates are refused; `oauth` beside `headersHelper`,
596
+ or on a stdio server, is refused.
597
+ - `oauth` is no longer reported as unsupported authentication, and it is part of the definition
598
+ fingerprint.
599
+ - **Signing in** (`runMCPOAuthLogin`; `robota mcp login <name> [--client-secret]`):
600
+ - Discovery is done here, not by the SDK's `discoverOAuthServerInfo`: the protected-resource
601
+ metadata `resource` must be the canonical server URL, the authorization server's `issuer` must
602
+ be the server it was fetched for, the server, authorization, token and registration
603
+ endpoints must be `https`, and the authorization server must advertise PKCE `S256`
604
+ (`pkce-unsupported` otherwise). A 401's `resource_metadata` is never followed to another origin,
605
+ and a server without resource metadata is not guessed at.
606
+ `authServerMetadataUrl` skips resource discovery.
607
+ - Dynamic client registration when there is no `clientId`; PKCE, a random `state` and the
608
+ RFC 8707 resource indicator on the authorization request; the RFC 9207 `iss` checked on the
609
+ redirect when sent, and required when the server promises it.
610
+ - The loopback callback listens on `127.0.0.1`, checks `Host`, answers only `GET /callback` with
611
+ the sign-in's `state` (compared in constant time), once, within 5 minutes, and serves a static
612
+ page that never shows `error_description`.
613
+ - The browser opens by argv (`open`, `xdg-open`, `rundll32 url.dll,FileProtocolHandler`) and only
614
+ for an `https` URL. `--client-secret` asks for the secret without echo (or reads stdin's first
615
+ line) and only for a pre-registered client.
616
+ - **Network:** every OAuth request goes through the egress policy and is capped at 256 KiB.
617
+ `agent-core` adds `postWithEgressPolicy`, which refuses a redirect (`redirect_refused`) instead
618
+ of following it; registration, token and refresh requests use it.
619
+ - **Storage:** `IMCPOAuthCredentialStore` (`get`/`set`/`delete`), keyed by the server's security
620
+ identity and canonical URL together. `createFileOAuthCredentialStore` keeps 0600 files in a 0700
621
+ `$PRODUCT_USER_STATE_DIR/mcp-credentials/`. The issuer, token endpoint and client (with its secret, if any, and
622
+ the client authentication method dynamic registration returned) are stored with the tokens. A
623
+ sign-in stores its credential under the refresh lock, so a refresh in flight cannot overwrite it.
624
+ - **Sessions** (`createOAuthAuthenticator`, wired for every `oauth` definition):
625
+ - Sends the stored token as `Authorization: Bearer`, refreshing it first when expired — including
626
+ a token cached earlier in the session — and only at the stored token endpoint.
627
+ - One refresh at a time per credential: in a process through `MCPSingleFlightCache`, across
628
+ processes under `createFileOAuthRefreshLock`, re-reading the store once the lock is held. A
629
+ stale lock is taken over, and a lock released, only after it is renamed aside and proven to be
630
+ the one judged — never another process's fresh lock.
631
+ - A 401 rediscovers, then refreshes once and retries; an authorization server that changed clears
632
+ the tokens — compared, under the lock, with what is stored then, so a newer sign-in is kept. `invalid_grant`, or nothing stored, asks the user to run `robota mcp login <name>`. A 403
633
+ `insufficient_scope` fails and names the scope.
634
+ - An `oauth` definition is never connected without the authenticator (`oauth-unavailable`).
635
+ - Failures are `MCPOAuthError` with a fixed reason; no code, verifier, token, secret or
636
+ authorization-server text reaches an error, a notice or a log.
637
+
638
+ - 4078a72: Model fallback chain. `--fallback-model a,b` (or the `fallbackModel` settings array; the flag wins) names up to three models a turn moves to when its model is overloaded, unavailable or failing on the server. An entry is a provider profile, `profile:model`, a bare model on the primary's provider, or `default`. The move happens only before any output has streamed, lasts for the current turn, and is shown as a system note; entries that cannot be built are passed over and entries outside the organization's `allowedProviders` are dropped with a notice. `FallbackProvider` in agent-framework implements it over the session's provider; `IChatOptions` gains `executionId`, `onModelFallback` and `preserveContextWindow`, `IAIProvider` gains optional `resolveModelRoute`, and the execution loop emits a `provider_fallback` event and attributes requests, call observations, committed replies, the response cache and usage to the model that answered. A turn that ran on more than one model records per-model `modelShares` on its usage observation, which personal usage reports split by model and provider. A `/provider` switch keeps the chain, read again for the new primary.
639
+ - 4c73a0b: Provider failures keep the vendor's HTTP status and error type. `ProviderError` gains `status` and `type`, adapters throw `ProviderError` (or `RateLimitError` for a rate limit) instead of a bare `Error`, an Anthropic mid-stream `overloaded_error` event surfaces as a `ProviderError` with that type, and media errors carry `status`. New `classifyProviderFailure` says whether a failure is worth retrying on another model, and `toProviderError` is the shared adapter mapping.
640
+ - 196a900: Permission rules can say more than one argument per tool.
641
+
642
+ - **`Tool(name:value)` in deny and ask rules** matches a named top-level parameter, with `*` in the
643
+ value (`Bash(run_in_background:true)`, `Agent(model:opus*)`, `github__create_issue(repo:acme/*)`).
644
+ It is a parameter rule only when `name` is one of the tool's parameters, so
645
+ `WebFetch(https://…)` keeps its meaning. A parameter the call omits never matches, and a
646
+ non-scalar value is unevaluable, so the call asks. Allow rules may not use the form.
647
+ - **A rule on the primary field** (`Bash(command:rm *)`) is reported at startup and asks on every
648
+ call, instead of being silently ignored.
649
+ - **Tool-name globs.** Deny and ask rules may glob the tool name (`github__*`). Allow rules may do so
650
+ only after a literal `<server>__` prefix; an unanchored allow glob is refused at construction.
651
+ - **A bare-name deny removes the tool from the model's context.** `Tool`, `Tool(*)` or a name glob
652
+ withholds it from the offered set and the deferred-tool catalogue, live, instead of offering it
653
+ and refusing every call. `IAgentConfig.isToolVisible` is the new seam.
654
+ - **MCP canonical names keep the whole `<server>__` prefix when truncated**, so a server glob still
655
+ names every tool of that server.
656
+
657
+ - 34e50f0: A new permission mode, `auto`, lets a model classifier approve or block what would otherwise prompt.
658
+
659
+ - **What it decides:**
660
+ - Reads and in-workspace edits run as in `acceptEdits`.
661
+ - Commands and other calls the mode leaves open go to the classifier, a side call to the
662
+ session's own model. It sees the call, the working directory and the git remotes, never the
663
+ conversation.
664
+ - A block reaches the model with its reason, so it can take another route.
665
+ - **What still reaches a person, or is refused:**
666
+ - Deny rules and background ceilings apply first.
667
+ - `ask` rules, critical removals and protected paths ask a person.
668
+ - After 3 refusals in a row (blocks, or no usable verdict), or 20 blocks in the session, the
669
+ mode asks a person until one approves.
670
+ With no one to ask, the call is denied.
671
+ - **Allow rules:** in `auto` mode, allow rules that approve any command are set aside while the
672
+ mode is on. Examples are `Bash(*)`, an interpreter (`Bash(python *)`), a package runner
673
+ (`Bash(npm run *)`, `Bash(pnpm exec *)`), `Agent`, `ExecuteCommand` or `Computer`. Narrow
674
+ rules still apply.
675
+ - **Retry:** `/permissions` lists classifier blocks. `/permissions retry <n>` lets that exact call
676
+ run once, unjudged, when the model tries it again.
677
+ - **Turning it on and off:**
678
+ - `--permission-mode auto`, `/mode auto` or `/permissions auto`.
679
+ - An organization turns it off with `disableAutoMode` in the org policy.
680
+ - **New contracts:**
681
+ - `TPermissionMode` gains `'auto'`.
682
+ - `allowRulesForAutoMode` and `isBroadExecutionAllowRule`.
683
+ - `IPermissionClassifier` and `AutoModeGate`.
684
+ - The `permissionClassifier` session option.
685
+ - `Session.retryPermissionDenial`, and `retryDenial` on the permission-mode adapter.
686
+ - The `'classifier'` denial reason.
687
+ - `createModelPermissionClassifier`.
688
+ - The `disableAutoMode` option on `createSession` and `IOrgPolicy`.
689
+
690
+ - 722e88a: Shell commands can run in an OS-level sandbox: bubblewrap on Linux and WSL2, Seatbelt on macOS.
691
+
692
+ - **Confinement:** covers the command and every process it starts.
693
+ - Writes are limited to the working directory, the temporary directories and
694
+ `sandbox.filesystem.allowWrite`.
695
+ - Agent, git-hook, MCP and shell configuration inside the workspace stays read-only.
696
+ - `sandbox.filesystem.denyRead` hides paths from the command.
697
+ - The network is on or off (`sandbox.network.enabled`).
698
+ - **Modes:** `/sandbox` switches between `auto-allow`, `regular` and `off` for the next command and
699
+ saves the choice.
700
+ - In `auto-allow` (`sandbox.autoAllowBashIfSandboxed`), a confined command runs without a prompt
701
+ in `default` and `acceptEdits`.
702
+ - Deny rules, ask rules, critical removals and plan mode still apply first.
703
+ - **Exclusions:** `sandbox.excludedCommands` run unconfined, through the ordinary permission path.
704
+ - **When the sandbox cannot run:** a missing or unusable backend is reported at startup, in
705
+ `robota doctor` and in `/sandbox`, and commands then run unconfined.
706
+ `sandbox.failIfUnavailable` refuses to start instead.
707
+ - **New contracts:**
708
+ - `OsSandboxClient`, `detectOsSandbox`, `bubblewrapArguments`, `seatbeltProfile`.
709
+ - `ISandboxClient.wrapCommand` and `autoApproves`.
710
+ - `IPermissionEvaluationContext.sandboxAutoApproved`.
711
+ - The `commandSandbox` session option.
712
+ - The `sandbox` settings key and the `sandbox` command host adapter.
713
+
714
+ - d23c848: Built-in read-only shell commands run without a prompt.
715
+
716
+ A Bash call is decided like a read, and runs without a prompt in every mode (`plan` included), when
717
+ every command in it comes from the fixed read-only set (`ls`, `cat`, `grep`, `find` without actions,
718
+ `git status`/`log`/`diff`/`show` and similar) and it also:
719
+
720
+ - stays inside the workspace: every path operand resolves inside once symlinks are followed, as
721
+ `Read` requires;
722
+ - uses only printable ASCII syntax that bash, zsh, fish and PowerShell all read the same way.
723
+
724
+ Deny and ask rules still apply first. A command that writes through a redirect, expands or
725
+ substitutes anything, or runs git outside the session's repository takes the ordinary path.
726
+
727
+ New exports: `isReadOnlyCommandLine` and `TResolveInWorkspace`. `IPermissionEvaluationContext`
728
+ gains `resolveInWorkspace`, which `PermissionEnforcer` supplies.
729
+
730
+ - fec722f: Carry a trusted canonical absolute execution root from DAG product composition through worker task
731
+ input and node lifecycle context. Filesystem-capable DAG nodes now use that injected authority instead
732
+ of ambient `process.cwd()`, and authored `cwd` values may only narrow it.
733
+
734
+ BREAKING: `ITaskExecutionInput`, `INodeExecutionContext`, worker composition dependencies,
735
+ `LocalDagRuntimeProvider`, and the CLI-local runner now require an execution root at their non-convenience
736
+ boundaries. `createDagFramework()` preserves no-argument construction by validating and capturing its
737
+ current directory at the factory boundary. The filesystem-backed skill node is explicitly Node-only and
738
+ no longer advertises a browser export condition.
739
+
740
+ - 2d3b2c0: Make shell resolution executable-aware across managed and scheduled background command runners. The core
741
+ resolver now accepts one request with explicit-executable precedence, returns matching argument families
742
+ for sh/bash, PowerShell/pwsh, and cmd, and fails closed with `UnsupportedShellError` for unknown explicit
743
+ executables. Executor exposes one shared request adapter and both concrete runners consume its pair.
744
+ - 4772067: **BREAKING — ARCH-031: the subagent seam is derived from its transport SSOT instead of copied.**
745
+
746
+ One field family — what a subagent job IS — was declared three times as independent shapes and carried
747
+ between them by six hand-written object literals that nothing checked for totality. A field added to
748
+ either side had to be hand-copied at every hop, and a miss compiled clean as a silent no-op. TYPE-003
749
+ named this cause and derived one hop; the next two changes each dropped a field at a hop it had skipped
750
+ (CORE-025's permission policy, and ANALYTICS-001's `usage`, dropped in the very commit that added it).
751
+
752
+ ```ts
753
+ // now, in @robota-sdk/agent-interface-transport
754
+ export type ISubagentSpawnRequest = Omit<IAgentBackgroundTaskRequest, 'kind'>;
755
+ export type ISubagentJobResult = Omit<IBackgroundTaskResult, 'kind' | 'exitCode' | 'signalCode'>;
756
+ ```
757
+
758
+ All four projections collapse to spreads. `parentTaskId` and `providerProfile` now reach the runner
759
+ because they exist on the source, not because someone remembered them.
760
+
761
+ **Per package, classified against each barrel:**
762
+
763
+ - **`agent-executor` (major)** — the barrel loses `ISubagentSpawnRequest` and `ISubagentJobResult` (they
764
+ moved to their owner; re-publishing them here would be a pass-through re-export). `ISubagentJobStart`
765
+ and `ISubagentJobHandle` rename `jobId` → `taskId`, `ISubagentJobStart` gains `worktree?`, and
766
+ `ISubagentWorktreePrepareRequest` renames `jobId` → `taskId`.
767
+ - **`agent-framework` (major)** — the barrel loses eleven type-only re-exports of `agent-executor`-owned
768
+ types. They carried zero runtime values, so they bought none of the assembly convenience a runtime
769
+ facade exists for, while making one field family look like it had three owners. Separately,
770
+ `ISpawnAgentTaskRequest.permissionPolicy` goes optional → **required**.
771
+ - **`agent-subagent-runner` (major)** — `ISubagentWorkerStartPayload` renames `jobId` → `taskId` and gains
772
+ `worktree?`. This package is not in the item's declared `area:`; the audit that caught it is the reason
773
+ it is here.
774
+ - **`agent-interface-transport` (minor)** — two new barrel exports; nothing removed or renamed.
775
+ - **`agent-core` (minor)** — **two** new barrel exports. `DEFAULT_BACKGROUND_PERMISSION_POLICY` is the
776
+ intended one; collapsing the hand-listed permissions block to `export *` also surfaced
777
+ `clearRegisteredToolArgumentKeys`, which the old list had omitted. It is documented as public rather
778
+ than re-narrowed — a barrel that cannot fall out of step with its owner is the point of the collapse.
779
+ Nothing was removed: all nine previously-listed permission types remain on the barrel.
780
+ - **`agent-cli` (patch)** — migrated as the only in-repo implementer of `ISubagentWorktreeAdapter`; no
781
+ barrel change.
782
+
783
+ **`permissionPolicy` is now required at the spawn boundary**, and its default is one exported constant
784
+ owned by the permission SSOT. It was previously applied as `?? 'inherit-allowlist'` in the middle of a
785
+ projection, in **two** packages independently, with nothing keeping them equal — a security-relevant value
786
+ whose default was declared twice. Every spawn site now states its own policy.
787
+
788
+ **The worktree identity moved to the runner envelope.** It is runner-produced — the worktree does not
789
+ exist when a caller builds a request — so it rides on `ISubagentJobStart.worktree` and crosses the IPC
790
+ boundary there. The runner no longer also rewrites `request.cwd`, which had given ARCH-010's execution-root
791
+ rule two carriers that could disagree. `branchName` **relocated rather than being deleted**: it has no
792
+ reader in this repository today, and for a library that is not a reason to drop a legitimate contract.
793
+
794
+ **Renames are consistent across the SPI** (`type` → `agentType`, `jobId` → `taskId`) rather than applied to
795
+ one shape, which would have left two names for one identifier in a single file. The IPC validator's
796
+ string-literal keys are now typed against the contract, so the next rename is a compile error instead of a
797
+ runtime rejection of every start payload.
798
+
799
+ - 9fbab1b: Provider DIP Stage B (ARCH-PROVIDER-003), part 1: collapse infrastructure. Adds the
800
+ provider-registry-driven `@robota-sdk/dag-node-llm-text` node that supersedes the
801
+ per-vendor LLM nodes + router, relocates the provider config resolver into
802
+ `agent-core`, adds SSOT cost/allowedModels fields, inverts the `llm-text` validator
803
+ tombstone, and wires `createDagFramework({ providers })`. Additive — the per-vendor
804
+ nodes still exist; consumer migration + their removal follow in part 2.
805
+ - b6d14ce: Make the universal JSON-schema subset able to express an object, so a nested `z.object()` keeps its
806
+ properties and required fields instead of reaching the model as `{ "type": "object" }`. Tools and
807
+ structured-output schemas with one level of nesting are now advertised in full and enforced on the
808
+ tool-input path; `z.union` / `z.discriminatedUnion` / `z.literal` are supported and map to `anyOf`
809
+ and single-value enums; `.nullable()` keeps its null branch; and Zod's `strip`, `strict` and
810
+ `passthrough` modes stop collapsing into two `additionalProperties` emissions. Fixes the shipped
811
+ `Computer` and `AskUserQuestion` built-ins, whose action and question fields were being dropped
812
+ entirely.
813
+
814
+ `agent-core` is **minor**, not patch: `IObjectParameterSchema` is a new export, and
815
+ `IParameterSchema.type` became optional (a union node carries `anyOf` instead of a type), which is a
816
+ consumer-visible type change — two call sites in this repo needed editing to keep compiling.
817
+ `additionalProperties` also widened to `boolean | IParameterSchema`, and `required` and `anyOf` are
818
+ new members. The provider packages are **patch**: each adapts to the widened subset without changing
819
+ its own public surface.
820
+
821
+ ### Patch Changes
822
+
823
+ - 7b6234c: A tool call whose arguments fail to decode to a JSON object (invalid JSON, or a `null`/scalar/array
824
+ root — including a stream truncated mid-argument) no longer breaks the rest of its batch or the round
825
+ after it. Every other call in the same batch still executes and gets its real result; the malformed
826
+ call gets a clear per-call error instead, naming the tool and call id, and the run continues rather
827
+ than rejecting. The Anthropic and Gemini providers no longer throw when building the next request
828
+ from a conversation that still carries that call's original malformed arguments.
829
+ - a009f5b: Provider DIP Stage E (ARCH-PROVIDER-006): repo-hygiene + policy cleanup. Codified the
830
+ Family Decomposition Rule in project-structure.md (split driver = consumer/third-party
831
+ opt-in installability / extension-point registration, not dep-weight). Removed dangling
832
+ tracked references to deleted packages (tsconfig project refs, eslint glob, changeset
833
+ config `fixed` + pending changeset files), pruned 37 dead `.changeset/pre.json` entries,
834
+ and removed 24 untracked husk directories. Closes ARL-15 — the provider dependency-
835
+ inversion arc (Stages A–E) is complete.
836
+ - 4f3c075: Assemble complete, verified package generations before switching build output; preserve the previous generation on build failure and pack only verified regular-file images. Include copied CLI web assets in affected-build ordering and artifact transfer. Preserve the CLI version in managed build paths. Public runtime contracts remain compatible (patch).
837
+ - e477440: CORE-033: the abnormal paths now emit the required replay events, and history stays append-only
838
+
839
+ `provider_request`, `assistant_message_committed` and `history_mutation` are REQUIRED families, and
840
+ `agent-session` builds its session log from them: replaying every announced append, in order, is
841
+ supposed to reconstruct the conversation. Three engine sites appended without announcing, so the
842
+ reconstruction diverged at exactly the moments a reader goes to the log — the round cap, the
843
+ hard-capacity block, and a provider failure. On a capped run the summary the user actually read was
844
+ absent from every replay, and the provider call that produced it was invisible.
845
+
846
+ - The forced-summary call emits `provider_request` (`forcedSummary: true`, carrying the assembled
847
+ messages), then `assistant_message_committed` and `history_mutation` for the summary it commits.
848
+ - The hard-capacity block announces its diagnostic — the only message explaining why the turn stopped.
849
+ - A provider failure announces the `Request failed: …` record it appends.
850
+
851
+ The forced-summary call also **rewrote** history: it appended a synthetic round-limit instruction,
852
+ sent it, then removed it with `clear()` + re-add — a non-append mutation this vocabulary has no way
853
+ to describe. The instruction is a per-call prompt artifact, so it no longer enters the conversation
854
+ store at all; it exists only in the outgoing array, the same shape the structured-output transport
855
+ uses for a schema instruction. Nothing is added, so nothing has to be removed, and `mutation` still
856
+ needs no removal member.
857
+
858
+ The item also reported that the streaming path emitted no families at all. CORE-042 had already
859
+ fixed that by removing the second engine — `runStream` runs the same `execute()` — and this change
860
+ adds the test that says so rather than leaving it assumed.
861
+
862
+ - 9dcb5da: CORE-035: the identical-tool-input loop guard throws a named error, and the SPEC now matches it
863
+
864
+ The SPEC documented an `AbortError` thrown at the Nth identical call. The code threw a bare `Error`
865
+ at the N+1th. The type difference was behavioral, not cosmetic: `isAbortFailure` resolves an
866
+ `AbortError` as `success: true, interrupted: true`, so a run that detected a pathological loop and
867
+ produced no answer would have been reported as a SUCCESS.
868
+
869
+ Resolved toward the code's semantics and the SPEC's intent, which are not the same thing:
870
+
871
+ - **Failure, not abort.** A guard trip is the agent giving up, not the user cancelling. `AbortError`
872
+ means the caller asked the turn to stop, and here nobody did.
873
+ - **Named, not bare.** `SameToolInputLoopError` (`code: 'SAME_TOOL_INPUT_LOOP'`, `category: 'system'`,
874
+ `recoverable: true`) carries `toolName`, `callCount` and `maxSameToolInputs`. Naming a type is what
875
+ the SPEC was reaching for: a caller must be able to tell "the agent looped" from "the network died",
876
+ and CORE-027 carries those fields out intact.
877
+ - **`maxSameToolInputs` is a MAXIMUM.** The Nth identical call is allowed; the N+1th trips. The SPEC's
878
+ "N or more times" contradicted its own option name.
879
+
880
+ `ErrorUtils` moves to `utils/error-utils.ts`, split from the class taxonomy it operates on — two
881
+ responsibilities in one file, and keeping them together made the taxonomy file impossible to extend.
882
+ Both remain exported from the package entry.
883
+
884
+ - a95ca85: Apply `config.systemMessage` on the streaming path. `runStream()` built its provider request straight
885
+ from the conversation store and never entered the session initialization that attaches the system
886
+ prompt, so an agent obeyed its persona through `run()` and ignored it through `runStream()` — silently,
887
+ on the default interactive surface. An agent used through both entry points only acquired its prompt
888
+ from the first non-streaming turn onward.
889
+
890
+ The streaming path now enters the same `initializeConversationStore` the round path enters, so the
891
+ prompt, the inject-once rule and the conversation restore are owned in one place. Contained under
892
+ CORE-042, which is the duplication itself.
893
+
894
+ - 0382a51: CORE-041: `z.nativeEnum()` and `z.date()` convert; the rest of the boundary is published, not discovered
895
+
896
+ `zodToJsonSchema` threw `Unsupported Zod type: …` on five constructs, so a schema Zod accepts could
897
+ not be turned into a tool or a structured-output spec. Re-running the decision the item reserved,
898
+ those five are two different problems:
899
+
900
+ - **`ZodNativeEnum` and `ZodDate` are exactly expressible** and were missing for no reason.
901
+ A native enum becomes an `enum` of its VALUES — for a numeric TypeScript enum the compiler's
902
+ reverse mapping is filtered out, so a field accepting `0` is no longer advertised as accepting
903
+ `"Low"`. A date becomes `{ type: 'string', format: 'date-time' }`, which is not a lossy stand-in:
904
+ JSON has no date type, so a string is what the provider receives either way.
905
+ - **`ZodTuple`, `ZodIntersection` and `ZodLazy` are not expressible**, and still throw. A tuple needs
906
+ positional `items` (the subset models `items` as one schema), an intersection needs `allOf`,
907
+ recursion needs `$ref` — none of which the field-enumerated provider mappers would forward.
908
+ Adopting `zod-to-json-schema` does not dissolve this, as CORE-039 had conceded it might: the
909
+ library emits exactly those constructs. The difficulty was never parsing Zod; the target language
910
+ cannot say these things.
911
+
912
+ Mapping them lossily was rejected — a tuple flattened to `array of anyOf[...]` would tell the model
913
+ that any order and any length are acceptable, a contract the author did not write.
914
+
915
+ The error now names the construct, says why the subset cannot carry it, and names a Zod expression to
916
+ write instead. `Unsupported Zod type: ZodTuple` told a consumer the name of their own construct and
917
+ nothing they could act on.
918
+
919
+ - 93d061d: CORE-043: structured output now knows which transport can carry the schema before the first call
920
+
921
+ `run(input, { output })` asked every provider for `responseFormat: { type: 'json_schema' }`. A
922
+ provider whose surface cannot express that accepted the option and dropped it — and the schema was
923
+ stated in words only by the RETRY feedback turn, which runs on attempt two. So against such a
924
+ provider, attempt one carried nothing describing the required shape and could only succeed by luck:
925
+ the advertised three attempts were really two, and the first was spent discovering something the
926
+ capability table already knew.
927
+
928
+ A `(provider, model)` pair now resolves to a mechanism (`response_schema` / `json_object` / `none`)
929
+ and a provenance (`catalog` / `vendor-default` / `undeclared` / `unverified-endpoint`), and the
930
+ request is shaped to match at the one seam that holds both the resolved provider and the outgoing
931
+ messages. When the wire cannot carry the shape, the schema is stated in the prompt on the FIRST
932
+ attempt. Each structured request emits a `structured_output_transport` event reporting what the
933
+ request actually did.
934
+
935
+ - `IAIProvider.endpointIsVendorDefault?()` — a provider configured with a custom `baseURL` reports
936
+ it, so the runtime stops claiming enforcement a gateway may not provide. Separate from
937
+ `capabilityTable?()` on purpose: `@robota-sdk/agent-provider-openai` declares no table (nobody has
938
+ verified one) and must still be able to answer.
939
+ - DeepSeek's capability table declared `json_schema`; DeepSeek guarantees the response PARSES but
940
+ takes no schema parameter. Corrected to `json_object`.
941
+ - A provider that declares nothing is still sent the request unchanged — silence is not a denial.
942
+
943
+ - 39554a1: CORE-047: the model-configuration API is reachable before the first turn
944
+
945
+ `getModel()`, `setModel()` and `swapDefaultProvider()` refused on a freshly constructed agent with
946
+ `Agent must be fully initialized before ...`. So you had to ask the model a question before you could
947
+ ask which model you were using.
948
+
949
+ The state they guarded — the provider registry and the current `(provider, model)` pair — turned out
950
+ to be synchronous and derived entirely from config the constructor had already validated. It merely
951
+ lived inside the async initializer, next to work that genuinely is async (modules, plugins, the
952
+ execution service). Both steps now run in the constructor, so an agent knows which model it is
953
+ configured for from the moment it exists, and the readiness guard on those three methods protected
954
+ nothing and is gone.
955
+
956
+ A destroyed agent still refuses — and now says so accurately (`AIProviders was disposed`) instead of
957
+ misreporting teardown as missing initialization.
958
+
959
+ `Robota.ensureReady()` is unchanged and remains the way to complete the asynchronous half without
960
+ running a turn. It is no longer a precondition for reading or changing the model.
961
+
962
+ - d28430a: CORE-048: `resolveStructuredOutputCapability` is exported
963
+
964
+ `TStructuredOutputMechanism` and `TStructuredOutputProvenance` were already public while the function
965
+ that produces them was not — a caller could name the answer but not obtain it. Exporting it also lets
966
+ a consumer ask, before spending a call, what will happen to their schema against a given
967
+ `(provider, model)` pair.
968
+
969
+ No behaviour changed. This falls out of CORE-048, which asked whether a forced tool call should join
970
+ the mechanism vocabulary and answered no: the transport would need a provider that both lacks a
971
+ schema parameter and has enforceable strict tool arguments, and across this workspace that
972
+ intersection is empty.
973
+
974
+ - 07b627f: A local peer can now be answered, and what its turn may do depends on where it runs.
975
+
976
+ - `agent-core`: the permission evaluator takes a peer turn's authority as one more input
977
+ (`IPermissionEvaluationContext.peerTurn`), decided after the deny list and ceiling and before
978
+ bypass and allow rules. A peer on another host uses no tool. A peer on the same host may use an
979
+ inspect-class tool that declares `workspacePaths`, only when every named location resolves inside
980
+ the workspace and is not a credential (`isSecretPath`); write and execute tools are refused unless
981
+ enabled, and then every use asks. A tool declaring `repliesToPeer` exists only in a peer turn and
982
+ asks once the turn used another tool. New: `isToolAvailableInPeerTurn`, `TPeerReach`,
983
+ `IPeerTurnAuthority`. `IRunOptions.withholdHostedTools` leaves a provider's hosted tools out of a
984
+ run's requests (`nativeWebTools` with `false` withholds a hosted tool for one call).
985
+ - `agent-tools`: `Read` and `Glob` declare the arguments that say where they look. `Grep` does not:
986
+ it reads files it was never named, so a peer turn does not get it.
987
+ - `agent-session`: `ISessionRunOptions.peerReach` makes a run a peer turn for the permission policy;
988
+ every ask in it needs a fresh approval, and its requests carry no provider-hosted tool. `ISessionOptions.allowPeerChanges` enables write and execute
989
+ tools for same-host peer turns.
990
+ - `agent-interface-session`: `ISubmitOptions.peer` (`IPeerTurnContext`) carries a peer turn's reach,
991
+ the message it answers and the session a reply goes to.
992
+ - `agent-interface-session-mobility`: `IPeerMessage.inReplyTo` threads a conversation;
993
+ `peerReachOf(admission)` maps admission to a reach.
994
+ - `agent-framework`: a peer turn is offered what its origin allows, and a new `peer_reply` tool
995
+ answers the peer that sent the message, threaded to it. The setting `peers.allowChanges` enables
996
+ write and execute tools for same-host peer turns.
997
+ - `agent-ui-terminal`: a permission prompt in a peer turn names the requesting peer.
998
+ - `agent-cli`: incoming peer turns carry their reach and reply route; a conversation is limited in
999
+ depth and in how often this session answers it, and a reply over a limit is not sent and the
1000
+ operator is told.
1001
+ - `agent-provider-anthropic`, `agent-provider-openai-compatible` (Qwen): a request whose
1002
+ `nativeWebTools` sets a hosted tool to `false` is sent without it.
1003
+
1004
+ - d0de5b2: A peer session's message now reaches the model as a peer's, and a peer turn runs on the external
1005
+ baseline.
1006
+
1007
+ - `agent-core` marks every user message whose driver id starts with `peer:` as
1008
+ `<peer_message from="…">…</peer_message>` in the outgoing request — both the round and the forced
1009
+ summary — while the stored history keeps the text as sent. Wrapper-shaped text in user and tool
1010
+ messages is escaped, and an id that is not a plain identifier is printed as `peer:unverified`.
1011
+ New exports: `peerDriverOf`, `printablePeerDriver`.
1012
+ - `agent-session`'s conversation transcript (compaction, advisor) labels a peer message with the same
1013
+ printable id, so no rendering echoes a sender-chosen id that is not a plain identifier.
1014
+ - `agent-framework` runs a `peer` turn like an `external` one — no tools (`toolChoice: 'none'`), no
1015
+ `@path` expansion, no context references — and adds a per-turn system statement that the message
1016
+ came from another session and carries no authority. A `peer` turn must carry a `peer:` driver id.
1017
+
1018
+ - d6b9404: Remove polynomial-ReDoS backtracking (SEC-003, CodeQL `js/polynomial-redos`) from three parsers whose input is not repo-controlled.
1019
+
1020
+ `parseStructuredResponseText` (agent-core) parses raw model output; its fenced-code-block regex used `\s*\n`, and because `\s` also matches a newline the two overlapped, so an unterminated fence containing many blank lines was rejected in O(n^2) — 12.7s for a 400 KB string, now ~1ms. The whitespace run is now restricted to horizontal whitespace, which makes the newline split point unique.
1021
+
1022
+ `/schedule cron` and `/monitor` (agent-command) are declared `modelInvocable: true`, so their argument string is composed by the model. Both matched the trailing instruction with `\s+(.+)$`; since `.` also matches a space the split point was ambiguous and a non-matching argument cost O(n^2) — ~15s for a 200 KB argument, now <1ms. The instruction is now required to start with a non-space character, which pins the split point without changing which inputs are accepted.
1023
+
1024
+ No behaviour change: the set of accepted inputs and the parsed values are identical in every case.
1025
+
1026
+ - 9814afc: Type-SSOT convergence (TYPE-003; re-audit CONTRACT-002/003/011/012 + RUNTIME-47 + STRUCT-04). Behavior is unchanged — this is a type-level refactor. `ITokenUsage` (agent-core) is confirmed as the usage-triple SSOT: `ISessionUsageTotals` and `IBackgroundTaskUsage` become aliases, and every inline `{ promptTokens; completionTokens; totalTokens }` copy (service/orchestration/executor/remote-client shapes) now references the SSOT (structurally identical → patch). The subagent-job contracts derive from the background-task SSOT — `TSubagentJobStatus = Exclude<TBackgroundTaskStatus, 'paused'>`, mode alias, and a `Pick`-projection `ISubagentJobState` — with a compile-enforced parity test so a drifting hand copy can no longer exist. `@robota-sdk/agent-session` is minor because the public `ISessionRecord` type is now the typed `IInteractiveSessionRecord` alias (previously a relaxed `unknown[]` mirror): runtime behavior of `SessionStore` is identical, but downstream code that assigned loose payloads to the record's fields may need explicit casts at its own trust boundary (the framework store facade's `as unknown as` cast bridge is deleted). agent-session's duplicate `@robota-sdk/agent-core` deps/devDeps declaration is also removed (STRUCT-04).
1027
+
1028
+ ## 3.0.0-beta.79
1029
+
1030
+ ## 3.0.0-beta.78
1031
+
1032
+ ### Patch Changes
1033
+
1034
+ - 6f308d1: fix(streaming): expose token usage on the streaming execution path (BEHAVIOR-005)
1035
+
1036
+ Token usage was silently dropped on streaming turns, so `readTokenUsageFromMessage` and Robota's usage analytics returned empty/0 for every `run()`/`runStream()` (which always stream). OpenAI-compatible streaming requests now send `stream_options: { include_usage: true }`, the stream assembler and the `runStream` commit path attach the same top-level `usage` shape the non-streaming path already emits, and both `run()` and `runStream()` now expose usage. New opt-out `IOpenAIProviderOptions.includeStreamUsage` (default `true`) for OpenAI-compatible servers that reject `stream_options`.
1037
+
1038
+ ## 3.0.0-beta.77
1039
+
1040
+ ### Patch Changes
1041
+
1042
+ - Coordinated beta.77 release. Runtime hardening across the session/execution/subagent stack
1043
+ (CORE-019..024: compaction-failure contract, strict execution error propagation, plugin/timer
1044
+ disposal, process-tree kill via the new `@robota-sdk/agent-process`, scheduler & IPC integrity),
1045
+ TUI shutdown/channel hygiene (CLI-075: listener unwiring, permission-queue drain, timeout-bounded
1046
+ graceful shutdown, second-signal force-quit), and agent-cli decoupled from the unpublished
1047
+ DAG/workflow chain so the published CLI installs cleanly (CLI-077). First publish of
1048
+ `@robota-sdk/agent-process`.
1049
+
1050
+ ## 3.0.0-beta.76
1051
+
1052
+ ### Patch Changes
1053
+
1054
+ - DQ-AUDIT-002 — consolidate duplicated domain data onto single owners: one model-pricing SSOT in agent-core (`MODEL_PRICES`/`lookupModelPrice`/`calculateModelCost`/`estimateBlendedCostPer1000`) consumed by agent-command and agent-plugin (drops two embedded/stale price tables); the `len/4` token estimator replaced by core `CONTEXT_ESTIMATE_CHARS_PER_TOKEN`; TUI `TContextState` derived from core `IContextWindowState`; dead pass-through re-exports removed from agent-session.
1055
+ - DQ-AUDIT-006 — error/observability hygiene: replace raw `throw new Error()` on core-service and provider hot paths with typed `AgentRuntimeError` subclasses (`ConfigurationError`/`ValidationError`) so error-handling can branch on category/recoverable; surface fire-and-forget hook failures via `logger.warn` instead of silent `.catch(() => {})`; wire the error-handling plugin's `totalRetries`/`successfulRecoveries` stats to real counters.
1056
+ - DQ-AUDIT-007 — remove the silent `model || 'gpt-4o-mini'` default in the OpenAI streaming handler (a missing model now throws `ConfigurationError` instead of substituting a vendor default); document `IAIProvider`'s universal (`chat`) vs raw (`generateResponse`) dual surface as intentional in the agent-core SPEC.
1057
+ - 576af62: Fix `ConfigurationError: Agent must be fully initialized before changing model configuration` when running `/preset` (or any live model re-apply) on a fresh interactive session before the first message. The Robota agent initialized lazily on the first `run()`, but `setModel` requires full initialization. `Session.applyModelOptions` now awaits the new idempotent `Robota.ensureReady()` before `setModel`, and the preset live-switch path (`applyPresetToSession` → `executePresetCommand`) is async end-to-end. Adds a real cold-session regression test (no mocked Robota).
1058
+
1059
+ ## 3.0.0-beta.75
1060
+
1061
+ ### Patch Changes
1062
+
1063
+ - Agent preset system + live preset switching + context/history correctness fixes.
1064
+
1065
+ - **Preset system (PRESET-001~017):** new `@robota-sdk/agent-preset` package layering framework
1066
+ assembly options into named, selectable profiles (`default`, `autonomous-builder`, `careful-reviewer`,
1067
+ `neutral-executor`) plus user-authored external presets loaded from `$PRODUCT_USER_STATE_DIR/presets/*.json`.
1068
+ - **Live preset switching:** `/preset` command (list + active marker + switch) and a TUI active-preset
1069
+ display. Switching live re-applies permission posture, model/effort, persona, command-module
1070
+ selection, parallel-subagents gating, and a self-verification system-prompt section via the single
1071
+ `applyPresetToSession` engine.
1072
+ - **CTX-001:** the TUI Context display + session auto-compact now use the accurate provider-based token
1073
+ estimate (system prompt + tool schemas included) instead of a crude history-only char heuristic.
1074
+ - **HIST-001:** conversation history is now append-only — removed the silent 100-message count cap that
1075
+ could drop early context; context size is managed solely by size-based compaction.
1076
+
1077
+ ## 3.0.0-beta.74
1078
+
1079
+ ## 3.0.0-beta.73
1080
+
1081
+ ## 3.0.0-beta.72
1082
+
1083
+ ## 3.0.0-beta.71
1084
+
1085
+ ### Patch Changes
1086
+
1087
+ - fix(context): unify token estimation to single SSOT — status bar and /context list now use the same serialized JSON estimate
1088
+
1089
+ ## 3.0.0-beta.70
1090
+
1091
+ ## 3.0.0-beta.69
1092
+
1093
+ ## 3.0.0-beta.68
1094
+
1095
+ ## 3.0.0-beta.67
1096
+
1097
+ ## 3.0.0-beta.66
1098
+
1099
+ ## 3.0.0-beta.65
1100
+
1101
+ ## 3.0.0-beta.64
1102
+
1103
+ ## 3.0.0-beta.63
1104
+
1105
+ ## 3.0.0-beta.62
1106
+
1107
+ ### Patch Changes
1108
+
1109
+ - Add CLI second-screen browser monitor (PLG-002)
1110
+ - New `@robota-sdk/agent-web` package: WebSocket client, `useWsSession` hook, `SessionMonitor` component with Markdown rendering
1111
+ - `--web` flag on `agent-cli`: starts WebSocket sidecar server and auto-opens browser monitor
1112
+ - `--no-open` flag and `PRODUCT_NO_OPEN` env var to suppress browser launch
1113
+ - `user_message` event added to `IInteractiveSessionEvents` so user prompts stream to browser in real-time
1114
+ - `TServerMessage` protocol extended with `user_message` type
1115
+
1116
+ ## 3.0.0-beta.61
1117
+
1118
+ ### Patch Changes
1119
+
1120
+ - 1c0d44c: Align context usage estimation across session display, auto-compaction, and core hard-capacity guards so mid-window sessions do not block prematurely.
1121
+ - 36eb7a9: Add provider-owned native replay payload hooks, replay validation coverage, and a session log validation command.
1122
+ - d97bdf2: Add provider-owned model catalog metadata, route `/model` suggestions through the active provider, and make `cli:dev` resolve the CLI workspace dependency closure through source export conditions.
1123
+
1124
+ ## 3.0.0-beta.60
1125
+
1126
+ ### Minor Changes
1127
+
1128
+ - 7439391: Add provider-neutral native web search/fetch capability contracts, explicit unsupported handling for OpenAI-compatible/LM Studio profiles, and local WebFetch/WebSearch permission/documentation alignment.
1129
+
1130
+ ## 3.0.0-beta.59
1131
+
1132
+ ## 3.0.0-beta.58
1133
+
1134
+ ### Patch Changes
1135
+
1136
+ - Refresh package docs and Robota.io content for the beta 57 feature set.
1137
+
1138
+ ## 3.0.0-beta.57
1139
+
1140
+ ### Minor Changes
1141
+
1142
+ - f61e2cb: Add Qwen provider-owned Responses API support for built-in web search/fetch tools and pass provider-owned profile options through generic CLI/runtime configuration.
1143
+
1144
+ ### Patch Changes
1145
+
1146
+ - 16c3b6f: Persist and render provider-neutral per-turn usage summaries with pre-send context updates in CLI sessions.
1147
+
1148
+ ## 3.0.0-beta.56
1149
+
1150
+ ### Patch Changes
1151
+
1152
+ - Prepare a coordinated beta release for batch npm publishing.
1153
+
1154
+ ## 3.0.0-beta.55
1155
+
1156
+ ### Patch Changes
1157
+
1158
+ - 38a72bf: fix: resolve ESLint tsconfig parsing errors and improve pnpm CI reliability
1159
+ - Add tsconfig.eslint.json to all packages for per-package ESLint runs
1160
+ - Migrate typecheck from pnpm -r exec tsc to per-package typecheck scripts
1161
+ - Add --if-present to all recursive pnpm run scripts
1162
+ - Fix React type imports, dynamic imports in tests, Express.Multer types
1163
+
1164
+ ## 3.0.0-beta.54
1165
+
1166
+ ### Patch Changes
1167
+
1168
+ - fix: resolve all typecheck errors across packages
1169
+
1170
+ ## 3.0.0-beta.53
1171
+
1172
+ ### Patch Changes
1173
+
1174
+ - refactor: monolith decomposition — all agent-\* files under 300 lines
1175
+ - fix: PR #69 code review — session resume tool messages, type SSOT, fork isolation, settings crash, Notification removal, chat validation
1176
+
1177
+ ## 3.0.0-beta.52
1178
+
1179
+ ## 3.0.0-beta.51
1180
+
1181
+ ## 3.0.0-beta.50
1182
+
1183
+ ## 3.0.0-beta.49
1184
+
1185
+ ## 3.0.0-beta.48
1186
+
1187
+ ## 3.0.0-beta.47
1188
+
1189
+ ## 3.0.0-beta.46
1190
+
1191
+ ## 3.0.0-beta.45
1192
+
1193
+ ## 3.0.0-beta.44
1194
+
1195
+ ### Patch Changes
1196
+
1197
+ - feat: IHistoryEntry universal history architecture + test quality cleanup
1198
+ - IHistoryEntry as universal history type across all 4 packages (core → sessions → sdk → cli)
1199
+ - Tool summary stored as event entry in history (category: 'event', type: 'tool-summary')
1200
+ - TuiStateManager pure TypeScript class for CLI rendering state
1201
+ - MessageList renders IHistoryEntry[] with Tool:/System:/You:/Robota: labels
1202
+ - Display order fixed: Tool → Robota (both streaming and abort)
1203
+ - Remove 25 tautological, duplicate, and hardcoded tests
1204
+
3
1205
  ## 2.0.9
4
1206
 
5
1207
  ### Patch Changes