@ai-agent-forge/agent-forge 0.86.7 → 0.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (717) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +10 -11
  3. package/dist/artifacts/artifact-store.d.ts.map +1 -1
  4. package/dist/artifacts/artifact-store.js +9 -5
  5. package/dist/artifacts/artifact-store.js.map +1 -1
  6. package/dist/bundle/.build-manifest.json +430 -413
  7. package/dist/bundle/chunks/{chunk-A7GUOX2H.js → chunk-6ZKDNZHA.js} +5 -1
  8. package/dist/bundle/chunks/chunk-HLJEVRWP.js +13 -0
  9. package/dist/bundle/chunks/chunk-YGHQME4V.js +1456 -0
  10. package/dist/bundle/chunks/image-resize-worker.js +12 -1
  11. package/dist/bundle/chunks/{virtual-modules-3IZ4MYSQ.js → virtual-modules-KZ5DRH7Q.js} +1 -1
  12. package/dist/bundle/cli.js +1 -1
  13. package/dist/bundle/client.js +1 -1
  14. package/dist/bundle/index.js +2 -2
  15. package/dist/bundle/rpc-entry.js +1 -1
  16. package/dist/cli/args.d.ts.map +1 -1
  17. package/dist/cli/args.js +231 -185
  18. package/dist/cli/args.js.map +1 -1
  19. package/dist/cli/auth-check.d.ts.map +1 -1
  20. package/dist/cli/auth-check.js +17 -4
  21. package/dist/cli/auth-check.js.map +1 -1
  22. package/dist/cli/auth-command.d.ts.map +1 -1
  23. package/dist/cli/auth-command.js +15 -9
  24. package/dist/cli/auth-command.js.map +1 -1
  25. package/dist/cli/credential-print.d.ts.map +1 -1
  26. package/dist/cli/credential-print.js +14 -7
  27. package/dist/cli/credential-print.js.map +1 -1
  28. package/dist/cli/experimental/command.d.ts.map +1 -1
  29. package/dist/cli/experimental/command.js +6 -5
  30. package/dist/cli/experimental/command.js.map +1 -1
  31. package/dist/cli/list-models.d.ts.map +1 -1
  32. package/dist/cli/list-models.js +9 -8
  33. package/dist/cli/list-models.js.map +1 -1
  34. package/dist/cli/plugin-manager-controller.d.ts.map +1 -1
  35. package/dist/cli/plugin-manager-controller.js +2 -1
  36. package/dist/cli/plugin-manager-controller.js.map +1 -1
  37. package/dist/cli/serve.d.ts.map +1 -1
  38. package/dist/cli/serve.js +8 -5
  39. package/dist/cli/serve.js.map +1 -1
  40. package/dist/client/remote-session.d.ts.map +1 -1
  41. package/dist/client/remote-session.js +16 -9
  42. package/dist/client/remote-session.js.map +1 -1
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +5 -3
  45. package/dist/config.js.map +1 -1
  46. package/dist/core/agent-capability-contract.d.ts +0 -7
  47. package/dist/core/agent-capability-contract.d.ts.map +1 -1
  48. package/dist/core/agent-capability-contract.js +72 -68
  49. package/dist/core/agent-capability-contract.js.map +1 -1
  50. package/dist/core/agent-session-bash.d.ts.map +1 -1
  51. package/dist/core/agent-session-bash.js +5 -4
  52. package/dist/core/agent-session-bash.js.map +1 -1
  53. package/dist/core/agent-session-compaction.d.ts +6 -10
  54. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  55. package/dist/core/agent-session-compaction.js +35 -133
  56. package/dist/core/agent-session-compaction.js.map +1 -1
  57. package/dist/core/agent-session-context.d.ts.map +1 -1
  58. package/dist/core/agent-session-context.js +18 -13
  59. package/dist/core/agent-session-context.js.map +1 -1
  60. package/dist/core/agent-session-internal.d.ts +0 -6
  61. package/dist/core/agent-session-internal.d.ts.map +1 -1
  62. package/dist/core/agent-session-internal.js.map +1 -1
  63. package/dist/core/agent-session-model.d.ts.map +1 -1
  64. package/dist/core/agent-session-model.js +2 -1
  65. package/dist/core/agent-session-model.js.map +1 -1
  66. package/dist/core/agent-session-retry.d.ts.map +1 -1
  67. package/dist/core/agent-session-retry.js +3 -3
  68. package/dist/core/agent-session-retry.js.map +1 -1
  69. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  70. package/dist/core/agent-session-runtime.js +7 -6
  71. package/dist/core/agent-session-runtime.js.map +1 -1
  72. package/dist/core/agent-session-services.d.ts +1 -1
  73. package/dist/core/agent-session-services.d.ts.map +1 -1
  74. package/dist/core/agent-session-services.js.map +1 -1
  75. package/dist/core/agent-session-tools.d.ts.map +1 -1
  76. package/dist/core/agent-session-tools.js +3 -2
  77. package/dist/core/agent-session-tools.js.map +1 -1
  78. package/dist/core/agent-session.d.ts +40 -22
  79. package/dist/core/agent-session.d.ts.map +1 -1
  80. package/dist/core/agent-session.js +147 -67
  81. package/dist/core/agent-session.js.map +1 -1
  82. package/dist/core/auth-guidance.d.ts.map +1 -1
  83. package/dist/core/auth-guidance.js +11 -5
  84. package/dist/core/auth-guidance.js.map +1 -1
  85. package/dist/core/auth-storage.d.ts.map +1 -1
  86. package/dist/core/auth-storage.js +9 -6
  87. package/dist/core/auth-storage.js.map +1 -1
  88. package/dist/core/compaction/compaction.d.ts.map +1 -1
  89. package/dist/core/compaction/compaction.js +2 -1
  90. package/dist/core/compaction/compaction.js.map +1 -1
  91. package/dist/core/embedded-sdk.d.ts.map +1 -1
  92. package/dist/core/embedded-sdk.js +10 -6
  93. package/dist/core/embedded-sdk.js.map +1 -1
  94. package/dist/core/export-html/index.d.ts.map +1 -1
  95. package/dist/core/export-html/index.js +9 -4
  96. package/dist/core/export-html/index.js.map +1 -1
  97. package/dist/core/extensions/agent-composition.d.ts.map +1 -1
  98. package/dist/core/extensions/agent-composition.js +26 -19
  99. package/dist/core/extensions/agent-composition.js.map +1 -1
  100. package/dist/core/extensions/bootstrap-agent-loop.d.ts.map +1 -1
  101. package/dist/core/extensions/bootstrap-agent-loop.js +3 -2
  102. package/dist/core/extensions/bootstrap-agent-loop.js.map +1 -1
  103. package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +1 -1
  104. package/dist/core/extensions/bootstrap-compaction-policy.js +0 -34
  105. package/dist/core/extensions/bootstrap-compaction-policy.js.map +1 -1
  106. package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -1
  107. package/dist/core/extensions/bootstrap-lifecycle.js +20 -17
  108. package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -1
  109. package/dist/core/extensions/bootstrap-overflow-policy.d.ts.map +1 -1
  110. package/dist/core/extensions/bootstrap-overflow-policy.js +2 -1
  111. package/dist/core/extensions/bootstrap-overflow-policy.js.map +1 -1
  112. package/dist/core/extensions/bootstrap-retry-policy.d.ts.map +1 -1
  113. package/dist/core/extensions/bootstrap-retry-policy.js +4 -3
  114. package/dist/core/extensions/bootstrap-retry-policy.js.map +1 -1
  115. package/dist/core/extensions/bootstrap-skills.d.ts.map +1 -1
  116. package/dist/core/extensions/bootstrap-skills.js +7 -6
  117. package/dist/core/extensions/bootstrap-skills.js.map +1 -1
  118. package/dist/core/extensions/bootstrap-tools.d.ts.map +1 -1
  119. package/dist/core/extensions/bootstrap-tools.js +2 -1
  120. package/dist/core/extensions/bootstrap-tools.js.map +1 -1
  121. package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
  122. package/dist/core/extensions/capability-plugin.js +37 -13
  123. package/dist/core/extensions/capability-plugin.js.map +1 -1
  124. package/dist/core/extensions/capability-runtime-events.d.ts.map +1 -1
  125. package/dist/core/extensions/capability-runtime-events.js +17 -13
  126. package/dist/core/extensions/capability-runtime-events.js.map +1 -1
  127. package/dist/core/extensions/capability-runtime-guards.d.ts.map +1 -1
  128. package/dist/core/extensions/capability-runtime-guards.js +16 -15
  129. package/dist/core/extensions/capability-runtime-guards.js.map +1 -1
  130. package/dist/core/extensions/capability-runtime-manifest.d.ts.map +1 -1
  131. package/dist/core/extensions/capability-runtime-manifest.js +52 -30
  132. package/dist/core/extensions/capability-runtime-manifest.js.map +1 -1
  133. package/dist/core/extensions/capability-runtime-validation.d.ts.map +1 -1
  134. package/dist/core/extensions/capability-runtime-validation.js +66 -65
  135. package/dist/core/extensions/capability-runtime-validation.js.map +1 -1
  136. package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
  137. package/dist/core/extensions/capability-runtime.js +147 -127
  138. package/dist/core/extensions/capability-runtime.js.map +1 -1
  139. package/dist/core/extensions/compaction-memory-failure-mode.d.ts.map +1 -1
  140. package/dist/core/extensions/compaction-memory-failure-mode.js +3 -2
  141. package/dist/core/extensions/compaction-memory-failure-mode.js.map +1 -1
  142. package/dist/core/extensions/context-strategy-binding.d.ts.map +1 -1
  143. package/dist/core/extensions/context-strategy-binding.js +7 -4
  144. package/dist/core/extensions/context-strategy-binding.js.map +1 -1
  145. package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -1
  146. package/dist/core/extensions/lifecycle-catalog.js +290 -279
  147. package/dist/core/extensions/lifecycle-catalog.js.map +1 -1
  148. package/dist/core/extensions/lifecycle-delivery-queue.d.ts.map +1 -1
  149. package/dist/core/extensions/lifecycle-delivery-queue.js +3 -2
  150. package/dist/core/extensions/lifecycle-delivery-queue.js.map +1 -1
  151. package/dist/core/extensions/provider-failover.d.ts +7 -3
  152. package/dist/core/extensions/provider-failover.d.ts.map +1 -1
  153. package/dist/core/extensions/provider-failover.js +9 -8
  154. package/dist/core/extensions/provider-failover.js.map +1 -1
  155. package/dist/core/facade/coding-agent-facade.d.ts +6 -6
  156. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  157. package/dist/core/facade/coding-agent-facade.js +2 -3
  158. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  159. package/dist/core/http-dispatcher.d.ts.map +1 -1
  160. package/dist/core/http-dispatcher.js +2 -1
  161. package/dist/core/http-dispatcher.js.map +1 -1
  162. package/dist/core/i18n/index.d.ts +14 -0
  163. package/dist/core/i18n/index.d.ts.map +1 -0
  164. package/dist/core/i18n/index.js +67 -0
  165. package/dist/core/i18n/index.js.map +1 -0
  166. package/dist/core/i18n/locales/en/example.d.ts +7 -0
  167. package/dist/core/i18n/locales/en/example.d.ts.map +1 -0
  168. package/dist/core/i18n/locales/en/example.js +7 -0
  169. package/dist/core/i18n/locales/en/example.js.map +1 -0
  170. package/dist/core/i18n/locales/zh-cn/cli.d.ts +8 -0
  171. package/dist/core/i18n/locales/zh-cn/cli.d.ts.map +1 -0
  172. package/dist/core/i18n/locales/zh-cn/cli.js +229 -0
  173. package/dist/core/i18n/locales/zh-cn/cli.js.map +1 -0
  174. package/dist/core/i18n/locales/zh-cn/common.d.ts +6 -0
  175. package/dist/core/i18n/locales/zh-cn/common.d.ts.map +1 -0
  176. package/dist/core/i18n/locales/zh-cn/common.js +6 -0
  177. package/dist/core/i18n/locales/zh-cn/common.js.map +1 -0
  178. package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts +13 -0
  179. package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts.map +1 -0
  180. package/dist/core/i18n/locales/zh-cn/core-contract-core.js +173 -0
  181. package/dist/core/i18n/locales/zh-cn/core-contract-core.js.map +1 -0
  182. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts +12 -0
  183. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts.map +1 -0
  184. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js +582 -0
  185. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js.map +1 -0
  186. package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts +9 -0
  187. package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts.map +1 -0
  188. package/dist/core/i18n/locales/zh-cn/core-contract-final.js +55 -0
  189. package/dist/core/i18n/locales/zh-cn/core-contract-final.js.map +1 -0
  190. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts +11 -0
  191. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts.map +1 -0
  192. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js +455 -0
  193. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js.map +1 -0
  194. package/dist/core/i18n/locales/zh-cn/core-errors.d.ts +9 -0
  195. package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -0
  196. package/dist/core/i18n/locales/zh-cn/core-errors.js +191 -0
  197. package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -0
  198. package/dist/core/i18n/locales/zh-cn/example.d.ts +7 -0
  199. package/dist/core/i18n/locales/zh-cn/example.d.ts.map +1 -0
  200. package/dist/core/i18n/locales/zh-cn/example.js +10 -0
  201. package/dist/core/i18n/locales/zh-cn/example.js.map +1 -0
  202. package/dist/core/i18n/locales/zh-cn/index.d.ts +2 -0
  203. package/dist/core/i18n/locales/zh-cn/index.d.ts.map +1 -0
  204. package/dist/core/i18n/locales/zh-cn/index.js +41 -0
  205. package/dist/core/i18n/locales/zh-cn/index.js.map +1 -0
  206. package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts +10 -0
  207. package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts.map +1 -0
  208. package/dist/core/i18n/locales/zh-cn/interactive-mode.js +267 -0
  209. package/dist/core/i18n/locales/zh-cn/interactive-mode.js.map +1 -0
  210. package/dist/core/i18n/locales/zh-cn/keybindings.d.ts +11 -0
  211. package/dist/core/i18n/locales/zh-cn/keybindings.d.ts.map +1 -0
  212. package/dist/core/i18n/locales/zh-cn/keybindings.js +67 -0
  213. package/dist/core/i18n/locales/zh-cn/keybindings.js.map +1 -0
  214. package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts +7 -0
  215. package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts.map +1 -0
  216. package/dist/core/i18n/locales/zh-cn/slash-commands.js +39 -0
  217. package/dist/core/i18n/locales/zh-cn/slash-commands.js.map +1 -0
  218. package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts +10 -0
  219. package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts.map +1 -0
  220. package/dist/core/i18n/locales/zh-cn/tui-builtin.js +15 -0
  221. package/dist/core/i18n/locales/zh-cn/tui-builtin.js.map +1 -0
  222. package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts +13 -0
  223. package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts.map +1 -0
  224. package/dist/core/i18n/locales/zh-cn/tui-components-misc.js +102 -0
  225. package/dist/core/i18n/locales/zh-cn/tui-components-misc.js.map +1 -0
  226. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts +12 -0
  227. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts.map +1 -0
  228. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js +286 -0
  229. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js.map +1 -0
  230. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts +9 -0
  231. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts.map +1 -0
  232. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js +79 -0
  233. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js.map +1 -0
  234. package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts +8 -0
  235. package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts.map +1 -0
  236. package/dist/core/i18n/locales/zh-cn/tui-self-owned.js +72 -0
  237. package/dist/core/i18n/locales/zh-cn/tui-self-owned.js.map +1 -0
  238. package/dist/core/keybindings.d.ts +15 -0
  239. package/dist/core/keybindings.d.ts.map +1 -1
  240. package/dist/core/keybindings.js +18 -0
  241. package/dist/core/keybindings.js.map +1 -1
  242. package/dist/core/logger.d.ts.map +1 -1
  243. package/dist/core/logger.js +5 -1
  244. package/dist/core/logger.js.map +1 -1
  245. package/dist/core/model-config.d.ts +0 -1
  246. package/dist/core/model-config.d.ts.map +1 -1
  247. package/dist/core/model-config.js +9 -1
  248. package/dist/core/model-config.js.map +1 -1
  249. package/dist/core/model-registry.d.ts.map +1 -1
  250. package/dist/core/model-registry.js +2 -1
  251. package/dist/core/model-registry.js.map +1 -1
  252. package/dist/core/model-runtime.d.ts.map +1 -1
  253. package/dist/core/model-runtime.js +11 -7
  254. package/dist/core/model-runtime.js.map +1 -1
  255. package/dist/core/package-install-host.d.ts.map +1 -1
  256. package/dist/core/package-install-host.js +4 -3
  257. package/dist/core/package-install-host.js.map +1 -1
  258. package/dist/core/package-manager.d.ts.map +1 -1
  259. package/dist/core/package-manager.js +15 -10
  260. package/dist/core/package-manager.js.map +1 -1
  261. package/dist/core/package-resource-collection.d.ts.map +1 -1
  262. package/dist/core/package-resource-collection.js +2 -1
  263. package/dist/core/package-resource-collection.js.map +1 -1
  264. package/dist/core/package-source.d.ts.map +1 -1
  265. package/dist/core/package-source.js +3 -2
  266. package/dist/core/package-source.js.map +1 -1
  267. package/dist/core/provider-composer.d.ts +2 -2
  268. package/dist/core/provider-composer.d.ts.map +1 -1
  269. package/dist/core/provider-composer.js +29 -21
  270. package/dist/core/provider-composer.js.map +1 -1
  271. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  272. package/dist/core/remote-catalog-provider.js +6 -2
  273. package/dist/core/remote-catalog-provider.js.map +1 -1
  274. package/dist/core/resolve-config-value.d.ts.map +1 -1
  275. package/dist/core/resolve-config-value.js +15 -5
  276. package/dist/core/resolve-config-value.js.map +1 -1
  277. package/dist/core/sdk.d.ts +27 -5
  278. package/dist/core/sdk.d.ts.map +1 -1
  279. package/dist/core/sdk.js +80 -55
  280. package/dist/core/sdk.js.map +1 -1
  281. package/dist/core/session-cwd.d.ts.map +1 -1
  282. package/dist/core/session-cwd.js +5 -2
  283. package/dist/core/session-cwd.js.map +1 -1
  284. package/dist/core/session-export.d.ts.map +1 -1
  285. package/dist/core/session-export.js +2 -1
  286. package/dist/core/session-export.js.map +1 -1
  287. package/dist/core/session-manager.d.ts.map +1 -1
  288. package/dist/core/session-manager.js +39 -29
  289. package/dist/core/session-manager.js.map +1 -1
  290. package/dist/core/session-storage.d.ts.map +1 -1
  291. package/dist/core/session-storage.js +3 -3
  292. package/dist/core/session-storage.js.map +1 -1
  293. package/dist/core/settings-manager.d.ts +20 -20
  294. package/dist/core/settings-manager.d.ts.map +1 -1
  295. package/dist/core/settings-manager.js +47 -59
  296. package/dist/core/settings-manager.js.map +1 -1
  297. package/dist/core/slash-commands.d.ts.map +1 -1
  298. package/dist/core/slash-commands.js +53 -32
  299. package/dist/core/slash-commands.js.map +1 -1
  300. package/dist/core/system-prompt.d.ts.map +1 -1
  301. package/dist/core/system-prompt.js +25 -2
  302. package/dist/core/system-prompt.js.map +1 -1
  303. package/dist/core/tools/bash.d.ts.map +1 -1
  304. package/dist/core/tools/bash.js +11 -7
  305. package/dist/core/tools/bash.js.map +1 -1
  306. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  307. package/dist/core/tools/edit-diff.js +9 -4
  308. package/dist/core/tools/edit-diff.js.map +1 -1
  309. package/dist/core/tools/edit.d.ts.map +1 -1
  310. package/dist/core/tools/edit.js +4 -3
  311. package/dist/core/tools/edit.js.map +1 -1
  312. package/dist/core/tools/index.d.ts.map +1 -1
  313. package/dist/core/tools/index.js +3 -2
  314. package/dist/core/tools/index.js.map +1 -1
  315. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  316. package/dist/core/tools/output-accumulator.js +2 -1
  317. package/dist/core/tools/output-accumulator.js.map +1 -1
  318. package/dist/core/tools/read.d.ts.map +1 -1
  319. package/dist/core/tools/read.js +6 -2
  320. package/dist/core/tools/read.js.map +1 -1
  321. package/dist/core/tools/write.d.ts.map +1 -1
  322. package/dist/core/tools/write.js +2 -1
  323. package/dist/core/tools/write.js.map +1 -1
  324. package/dist/durable/durable-service.d.ts.map +1 -1
  325. package/dist/durable/durable-service.js +25 -18
  326. package/dist/durable/durable-service.js.map +1 -1
  327. package/dist/host/checkpoint-commit.d.ts.map +1 -1
  328. package/dist/host/checkpoint-commit.js +2 -1
  329. package/dist/host/checkpoint-commit.js.map +1 -1
  330. package/dist/host/manual-compaction.d.ts.map +1 -1
  331. package/dist/host/manual-compaction.js +2 -1
  332. package/dist/host/manual-compaction.js.map +1 -1
  333. package/dist/host/output-projection.d.ts +0 -13
  334. package/dist/host/output-projection.d.ts.map +1 -1
  335. package/dist/host/output-projection.js +16 -2
  336. package/dist/host/output-projection.js.map +1 -1
  337. package/dist/host/summary-retry.d.ts.map +1 -1
  338. package/dist/host/summary-retry.js +3 -2
  339. package/dist/host/summary-retry.js.map +1 -1
  340. package/dist/main.d.ts.map +1 -1
  341. package/dist/main.js +97 -60
  342. package/dist/main.js.map +1 -1
  343. package/dist/modes/interactive/components/agents-view.d.ts.map +1 -1
  344. package/dist/modes/interactive/components/agents-view.js +18 -15
  345. package/dist/modes/interactive/components/agents-view.js.map +1 -1
  346. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  347. package/dist/modes/interactive/components/assistant-message.js +6 -5
  348. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  349. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  350. package/dist/modes/interactive/components/bash-execution.js +12 -7
  351. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  352. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  353. package/dist/modes/interactive/components/bordered-loader.js +2 -1
  354. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  355. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  356. package/dist/modes/interactive/components/branch-summary-message.js +6 -5
  357. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  358. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  359. package/dist/modes/interactive/components/compaction-summary-message.js +9 -5
  360. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  361. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  362. package/dist/modes/interactive/components/config-selector.js +18 -15
  363. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  364. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  365. package/dist/modes/interactive/components/custom-entry.js +2 -1
  366. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  367. package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -1
  368. package/dist/modes/interactive/components/dialog-editor.js +5 -4
  369. package/dist/modes/interactive/components/dialog-editor.js.map +1 -1
  370. package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -1
  371. package/dist/modes/interactive/components/dialog-input.js +2 -1
  372. package/dist/modes/interactive/components/dialog-input.js.map +1 -1
  373. package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -1
  374. package/dist/modes/interactive/components/dialog-selector.js +4 -3
  375. package/dist/modes/interactive/components/dialog-selector.js.map +1 -1
  376. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  377. package/dist/modes/interactive/components/first-time-setup.js +11 -10
  378. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  379. package/dist/modes/interactive/components/footer.d.ts +0 -2
  380. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  381. package/dist/modes/interactive/components/footer.js +8 -10
  382. package/dist/modes/interactive/components/footer.js.map +1 -1
  383. package/dist/modes/interactive/components/index.d.ts +1 -0
  384. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  385. package/dist/modes/interactive/components/index.js +1 -0
  386. package/dist/modes/interactive/components/index.js.map +1 -1
  387. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  388. package/dist/modes/interactive/components/keybinding-hints.js +3 -2
  389. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  390. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  391. package/dist/modes/interactive/components/login-dialog.js +12 -11
  392. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  393. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  394. package/dist/modes/interactive/components/mermaid.js +6 -2
  395. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  396. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  397. package/dist/modes/interactive/components/model-selector.js +28 -16
  398. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  399. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  400. package/dist/modes/interactive/components/oauth-selector.js +10 -9
  401. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  402. package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -1
  403. package/dist/modes/interactive/components/plugin-manager-entry.js +22 -13
  404. package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -1
  405. package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -1
  406. package/dist/modes/interactive/components/plugin-selection-entry.js +27 -12
  407. package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -1
  408. package/dist/modes/interactive/components/queue-manager-selector.d.ts +60 -0
  409. package/dist/modes/interactive/components/queue-manager-selector.d.ts.map +1 -0
  410. package/dist/modes/interactive/components/queue-manager-selector.js +166 -0
  411. package/dist/modes/interactive/components/queue-manager-selector.js.map +1 -0
  412. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  413. package/dist/modes/interactive/components/scoped-models-selector.js +16 -14
  414. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  415. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  416. package/dist/modes/interactive/components/session-selector.js +43 -31
  417. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  418. package/dist/modes/interactive/components/settings-selector.d.ts +4 -6
  419. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  420. package/dist/modes/interactive/components/settings-selector.js +115 -120
  421. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  422. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  423. package/dist/modes/interactive/components/settings-submenu.js +5 -4
  424. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  425. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  426. package/dist/modes/interactive/components/show-images-selector.js +3 -2
  427. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  428. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  429. package/dist/modes/interactive/components/skill-invocation-message.js +4 -3
  430. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  431. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  432. package/dist/modes/interactive/components/status-indicator.js +14 -5
  433. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  434. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/theme-selector.js +2 -1
  436. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  437. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/thinking-selector.js +11 -4
  439. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  440. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  441. package/dist/modes/interactive/components/tool-execution.js +8 -3
  442. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  443. package/dist/modes/interactive/components/tree-list.d.ts.map +1 -1
  444. package/dist/modes/interactive/components/tree-list.js +7 -6
  445. package/dist/modes/interactive/components/tree-list.js.map +1 -1
  446. package/dist/modes/interactive/components/tree-render.d.ts.map +1 -1
  447. package/dist/modes/interactive/components/tree-render.js +28 -23
  448. package/dist/modes/interactive/components/tree-render.js.map +1 -1
  449. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/tree-selector.js +9 -7
  451. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  452. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  453. package/dist/modes/interactive/components/user-message-selector.js +5 -4
  454. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  455. package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -1
  456. package/dist/modes/interactive/components/workflow-view.js +36 -21
  457. package/dist/modes/interactive/components/workflow-view.js.map +1 -1
  458. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  459. package/dist/modes/interactive/external-editor.js +2 -1
  460. package/dist/modes/interactive/external-editor.js.map +1 -1
  461. package/dist/modes/interactive/interactive-auth.d.ts.map +1 -1
  462. package/dist/modes/interactive/interactive-auth.js +71 -40
  463. package/dist/modes/interactive/interactive-auth.js.map +1 -1
  464. package/dist/modes/interactive/interactive-commands.d.ts +1 -0
  465. package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
  466. package/dist/modes/interactive/interactive-commands.js +3 -0
  467. package/dist/modes/interactive/interactive-commands.js.map +1 -1
  468. package/dist/modes/interactive/interactive-dialog-ui.d.ts.map +1 -1
  469. package/dist/modes/interactive/interactive-dialog-ui.js +5 -5
  470. package/dist/modes/interactive/interactive-dialog-ui.js.map +1 -1
  471. package/dist/modes/interactive/interactive-format.d.ts.map +1 -1
  472. package/dist/modes/interactive/interactive-format.js +34 -18
  473. package/dist/modes/interactive/interactive-format.js.map +1 -1
  474. package/dist/modes/interactive/interactive-helpers.d.ts.map +1 -1
  475. package/dist/modes/interactive/interactive-helpers.js +7 -2
  476. package/dist/modes/interactive/interactive-helpers.js.map +1 -1
  477. package/dist/modes/interactive/interactive-mode.d.ts +4 -2
  478. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  479. package/dist/modes/interactive/interactive-mode.js +350 -279
  480. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  481. package/dist/modes/interactive/interactive-selectors.d.ts +9 -0
  482. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  483. package/dist/modes/interactive/interactive-selectors.js +79 -25
  484. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  485. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  486. package/dist/modes/interactive/theme/theme-controller.js +5 -1
  487. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  488. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  489. package/dist/modes/interactive/theme/theme.js +26 -23
  490. package/dist/modes/interactive/theme/theme.js.map +1 -1
  491. package/dist/modes/json-event.d.ts.map +1 -1
  492. package/dist/modes/json-event.js +3 -2
  493. package/dist/modes/json-event.js.map +1 -1
  494. package/dist/modes/print-mode.d.ts.map +1 -1
  495. package/dist/modes/print-mode.js +3 -2
  496. package/dist/modes/print-mode.js.map +1 -1
  497. package/dist/modes/rpc/rpc-client.d.ts +0 -8
  498. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  499. package/dist/modes/rpc/rpc-client.js +3 -14
  500. package/dist/modes/rpc/rpc-client.js.map +1 -1
  501. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  502. package/dist/modes/rpc/rpc-mode.js +0 -9
  503. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  504. package/dist/modes/rpc/rpc-types.d.ts +0 -19
  505. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  506. package/dist/modes/rpc/rpc-types.js.map +1 -1
  507. package/dist/package-manager-cli.d.ts.map +1 -1
  508. package/dist/package-manager-cli.js +28 -13
  509. package/dist/package-manager-cli.js.map +1 -1
  510. package/dist/plugins/ecosystem/catalog.d.ts.map +1 -1
  511. package/dist/plugins/ecosystem/catalog.js +3 -2
  512. package/dist/plugins/ecosystem/catalog.js.map +1 -1
  513. package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
  514. package/dist/plugins/ecosystem/cli.js +2 -1
  515. package/dist/plugins/ecosystem/cli.js.map +1 -1
  516. package/dist/plugins/ecosystem/default-plugin-market.d.ts.map +1 -1
  517. package/dist/plugins/ecosystem/default-plugin-market.js +3 -2
  518. package/dist/plugins/ecosystem/default-plugin-market.js.map +1 -1
  519. package/dist/plugins/ecosystem/distribution.d.ts.map +1 -1
  520. package/dist/plugins/ecosystem/distribution.js +2 -1
  521. package/dist/plugins/ecosystem/distribution.js.map +1 -1
  522. package/dist/plugins/ecosystem/installer.d.ts.map +1 -1
  523. package/dist/plugins/ecosystem/installer.js +3 -2
  524. package/dist/plugins/ecosystem/installer.js.map +1 -1
  525. package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
  526. package/dist/plugins/ecosystem/node-disk-registry-source.js +20 -17
  527. package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
  528. package/dist/plugins/ecosystem/node-distribution-host.d.ts.map +1 -1
  529. package/dist/plugins/ecosystem/node-distribution-host.js +35 -34
  530. package/dist/plugins/ecosystem/node-distribution-host.js.map +1 -1
  531. package/dist/plugins/ecosystem/node-npm-registry-source.d.ts.map +1 -1
  532. package/dist/plugins/ecosystem/node-npm-registry-source.js +35 -34
  533. package/dist/plugins/ecosystem/node-npm-registry-source.js.map +1 -1
  534. package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
  535. package/dist/plugins/ecosystem/node-package-install-host.js +9 -8
  536. package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
  537. package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -1
  538. package/dist/plugins/ecosystem/node-package-install-persistence.js +4 -3
  539. package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -1
  540. package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts +9 -2
  541. package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
  542. package/dist/plugins/ecosystem/node-plugin-bootstrap.js +44 -5
  543. package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -1
  544. package/dist/plugins/ecosystem/node-plugin-trust-root.d.ts.map +1 -1
  545. package/dist/plugins/ecosystem/node-plugin-trust-root.js +10 -9
  546. package/dist/plugins/ecosystem/node-plugin-trust-root.js.map +1 -1
  547. package/dist/plugins/ecosystem/node-registry-source.d.ts.map +1 -1
  548. package/dist/plugins/ecosystem/node-registry-source.js +31 -30
  549. package/dist/plugins/ecosystem/node-registry-source.js.map +1 -1
  550. package/dist/plugins/ecosystem/node-release-package-source.d.ts.map +1 -1
  551. package/dist/plugins/ecosystem/node-release-package-source.js +30 -29
  552. package/dist/plugins/ecosystem/node-release-package-source.js.map +1 -1
  553. package/dist/plugins/ecosystem/node-tar-writer.d.ts.map +1 -1
  554. package/dist/plugins/ecosystem/node-tar-writer.js +11 -10
  555. package/dist/plugins/ecosystem/node-tar-writer.js.map +1 -1
  556. package/dist/plugins/ecosystem/node-url-package-source.d.ts.map +1 -1
  557. package/dist/plugins/ecosystem/node-url-package-source.js +21 -20
  558. package/dist/plugins/ecosystem/node-url-package-source.js.map +1 -1
  559. package/dist/plugins/ecosystem/plugin-acquisition.d.ts.map +1 -1
  560. package/dist/plugins/ecosystem/plugin-acquisition.js +3 -2
  561. package/dist/plugins/ecosystem/plugin-acquisition.js.map +1 -1
  562. package/dist/plugins/ecosystem/plugin-bootstrap.d.ts +9 -1
  563. package/dist/plugins/ecosystem/plugin-bootstrap.d.ts.map +1 -1
  564. package/dist/plugins/ecosystem/plugin-bootstrap.js +5 -0
  565. package/dist/plugins/ecosystem/plugin-bootstrap.js.map +1 -1
  566. package/dist/plugins/ecosystem/registry-cli-adapter.d.ts.map +1 -1
  567. package/dist/plugins/ecosystem/registry-cli-adapter.js +2 -1
  568. package/dist/plugins/ecosystem/registry-cli-adapter.js.map +1 -1
  569. package/dist/plugins/ecosystem/registry.d.ts.map +1 -1
  570. package/dist/plugins/ecosystem/registry.js +35 -32
  571. package/dist/plugins/ecosystem/registry.js.map +1 -1
  572. package/dist/plugins/ecosystem/resolver.d.ts.map +1 -1
  573. package/dist/plugins/ecosystem/resolver.js +3 -2
  574. package/dist/plugins/ecosystem/resolver.js.map +1 -1
  575. package/dist/plugins/ecosystem/selection-store.d.ts.map +1 -1
  576. package/dist/plugins/ecosystem/selection-store.js +11 -10
  577. package/dist/plugins/ecosystem/selection-store.js.map +1 -1
  578. package/dist/plugins/ecosystem/selection.d.ts.map +1 -1
  579. package/dist/plugins/ecosystem/selection.js +8 -7
  580. package/dist/plugins/ecosystem/selection.js.map +1 -1
  581. package/dist/plugins/ecosystem/state.d.ts.map +1 -1
  582. package/dist/plugins/ecosystem/state.js +24 -23
  583. package/dist/plugins/ecosystem/state.js.map +1 -1
  584. package/dist/plugins/ecosystem/updates.d.ts.map +1 -1
  585. package/dist/plugins/ecosystem/updates.js +5 -4
  586. package/dist/plugins/ecosystem/updates.js.map +1 -1
  587. package/dist/plugins/mcp-http.d.ts +0 -17
  588. package/dist/plugins/mcp-http.d.ts.map +1 -1
  589. package/dist/plugins/mcp-http.js +30 -7
  590. package/dist/plugins/mcp-http.js.map +1 -1
  591. package/dist/plugins/plugin-supervisor.d.ts.map +1 -1
  592. package/dist/plugins/plugin-supervisor.js +19 -1
  593. package/dist/plugins/plugin-supervisor.js.map +1 -1
  594. package/dist/profile/first-roles.d.ts.map +1 -1
  595. package/dist/profile/first-roles.js +10 -1
  596. package/dist/profile/first-roles.js.map +1 -1
  597. package/dist/profile/goal-plugin.d.ts.map +1 -1
  598. package/dist/profile/goal-plugin.js +24 -5
  599. package/dist/profile/goal-plugin.js.map +1 -1
  600. package/dist/profile/identity.d.ts.map +1 -1
  601. package/dist/profile/identity.js +7 -6
  602. package/dist/profile/identity.js.map +1 -1
  603. package/dist/profile/lock.d.ts.map +1 -1
  604. package/dist/profile/lock.js +15 -1
  605. package/dist/profile/lock.js.map +1 -1
  606. package/dist/profile/plan-plugin.d.ts.map +1 -1
  607. package/dist/profile/plan-plugin.js +26 -13
  608. package/dist/profile/plan-plugin.js.map +1 -1
  609. package/dist/profile/plugin-profiles.d.ts.map +1 -1
  610. package/dist/profile/plugin-profiles.js +2 -1
  611. package/dist/profile/plugin-profiles.js.map +1 -1
  612. package/dist/profile/policy-manifest.d.ts.map +1 -1
  613. package/dist/profile/policy-manifest.js +5 -4
  614. package/dist/profile/policy-manifest.js.map +1 -1
  615. package/dist/profile/profile-registry.d.ts +0 -12
  616. package/dist/profile/profile-registry.d.ts.map +1 -1
  617. package/dist/profile/profile-registry.js +14 -1
  618. package/dist/profile/profile-registry.js.map +1 -1
  619. package/dist/profile/role-catalog.d.ts +0 -1
  620. package/dist/profile/role-catalog.d.ts.map +1 -1
  621. package/dist/profile/role-catalog.js +17 -15
  622. package/dist/profile/role-catalog.js.map +1 -1
  623. package/dist/profile/role-orchestrator.d.ts.map +1 -1
  624. package/dist/profile/role-orchestrator.js +8 -7
  625. package/dist/profile/role-orchestrator.js.map +1 -1
  626. package/dist/profile/role-runner.d.ts.map +1 -1
  627. package/dist/profile/role-runner.js +3 -2
  628. package/dist/profile/role-runner.js.map +1 -1
  629. package/dist/profile/root-facade.d.ts.map +1 -1
  630. package/dist/profile/root-facade.js +2 -1
  631. package/dist/profile/root-facade.js.map +1 -1
  632. package/dist/profile/skill-discovery-wiring.d.ts.map +1 -1
  633. package/dist/profile/skill-discovery-wiring.js +7 -2
  634. package/dist/profile/skill-discovery-wiring.js.map +1 -1
  635. package/dist/profile/state-store.d.ts.map +1 -1
  636. package/dist/profile/state-store.js +13 -9
  637. package/dist/profile/state-store.js.map +1 -1
  638. package/dist/profile/todo-plugin.d.ts.map +1 -1
  639. package/dist/profile/todo-plugin.js +9 -4
  640. package/dist/profile/todo-plugin.js.map +1 -1
  641. package/dist/profiles/builtin-suites.d.ts +13 -6
  642. package/dist/profiles/builtin-suites.d.ts.map +1 -1
  643. package/dist/profiles/builtin-suites.js +15 -6
  644. package/dist/profiles/builtin-suites.js.map +1 -1
  645. package/dist/profiles/suite-loader.d.ts +25 -1
  646. package/dist/profiles/suite-loader.d.ts.map +1 -1
  647. package/dist/profiles/suite-loader.js +34 -9
  648. package/dist/profiles/suite-loader.js.map +1 -1
  649. package/dist/remote/server-entry.d.ts.map +1 -1
  650. package/dist/remote/server-entry.js +3 -2
  651. package/dist/remote/server-entry.js.map +1 -1
  652. package/dist/remote/session-source.d.ts.map +1 -1
  653. package/dist/remote/session-source.js +8 -4
  654. package/dist/remote/session-source.js.map +1 -1
  655. package/dist/share/session-share.d.ts.map +1 -1
  656. package/dist/share/session-share.js +14 -2
  657. package/dist/share/session-share.js.map +1 -1
  658. package/dist/testing/plugin-testkit.d.ts.map +1 -1
  659. package/dist/testing/plugin-testkit.js +4 -3
  660. package/dist/testing/plugin-testkit.js.map +1 -1
  661. package/dist/testing/runtime-delivery-queue.d.ts.map +1 -1
  662. package/dist/testing/runtime-delivery-queue.js +2 -1
  663. package/dist/testing/runtime-delivery-queue.js.map +1 -1
  664. package/dist/testing/session-plugin-testkit.d.ts.map +1 -1
  665. package/dist/testing/session-plugin-testkit.js +10 -7
  666. package/dist/testing/session-plugin-testkit.js.map +1 -1
  667. package/dist/utils/ansi.d.ts.map +1 -1
  668. package/dist/utils/ansi.js +2 -1
  669. package/dist/utils/ansi.js.map +1 -1
  670. package/dist/utils/clipboard.d.ts.map +1 -1
  671. package/dist/utils/clipboard.js +7 -6
  672. package/dist/utils/clipboard.js.map +1 -1
  673. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  674. package/dist/utils/image-resize-worker.js +3 -2
  675. package/dist/utils/image-resize-worker.js.map +1 -1
  676. package/dist/utils/photon.d.ts +2 -2
  677. package/dist/utils/photon.d.ts.map +1 -1
  678. package/dist/utils/photon.js +2 -2
  679. package/dist/utils/photon.js.map +1 -1
  680. package/dist/utils/shell.d.ts.map +1 -1
  681. package/dist/utils/shell.js +9 -8
  682. package/dist/utils/shell.js.map +1 -1
  683. package/dist/utils/tools-manager.d.ts.map +1 -1
  684. package/dist/utils/tools-manager.js +23 -13
  685. package/dist/utils/tools-manager.js.map +1 -1
  686. package/dist/utils/version-check.d.ts.map +1 -1
  687. package/dist/utils/version-check.js +5 -1
  688. package/dist/utils/version-check.js.map +1 -1
  689. package/docs/compaction.md +1 -3
  690. package/docs/docs.json +4 -0
  691. package/docs/index.md +1 -0
  692. package/docs/keybindings.md +3 -0
  693. package/docs/mcp.md +103 -0
  694. package/docs/models.md +14 -22
  695. package/docs/providers.md +0 -1
  696. package/docs/quickstart.md +1 -1
  697. package/docs/rpc.md +1 -26
  698. package/docs/sdk.md +4 -6
  699. package/docs/settings.md +10 -12
  700. package/docs/skills.md +1 -9
  701. package/docs/terminal-setup.md +2 -3
  702. package/docs/usage.md +7 -6
  703. package/examples/extensions/with-deps/package-lock.json +2 -2
  704. package/examples/extensions/with-deps/package.json +1 -1
  705. package/examples/extensions/with-deps/plugin.json +1 -1
  706. package/examples/sdk/10-settings.ts +2 -4
  707. package/examples/sdk/12-full-control.ts +1 -2
  708. package/package.json +1 -3
  709. package/dist/bundle/chunks/chunk-EALJ5DDX.js +0 -1452
  710. package/dist/core/extensions/microcompact.d.ts +0 -80
  711. package/dist/core/extensions/microcompact.d.ts.map +0 -1
  712. package/dist/core/extensions/microcompact.js +0 -134
  713. package/dist/core/extensions/microcompact.js.map +0 -1
  714. package/dist/server/create-harness.d.ts +0 -26
  715. package/dist/server/create-harness.d.ts.map +0 -1
  716. package/dist/server/create-harness.js +0 -106
  717. package/dist/server/create-harness.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-model.js","sourceRoot":"","sources":["../../src/core/agent-session-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model selection and thinking-level resolution for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch. `setModel` and `cycleModel` stay parallel implementations: each\n * keeps its own apply/persist/thinking/model_select sequence and never calls\n * the other.\n */\n\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport { modelsAreEqual } from \"@agent-forge/ai/compat\";\nimport type { ModelCycleResult, ModelMutationOptions } from \"./agent-session.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchModelSelectLifecycle } from \"./agent-session-lifecycle.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelFactsViewV1 } from \"./extensions/public-api.ts\";\n\nexport async function emitModelSelect(\n\tsession: AgentSessionInternals,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tawait dispatchModelSelectLifecycle(session, { provider: nextModel.provider, id: nextModel.id }, source);\n}\n\n/**\n * Set model directly.\n * Validates that auth is configured and saves to the session transcript.\n * Persists to global defaults only when options.persist is true.\n * @throws Error if no auth is configured for the model\n */\nexport async function setModel(\n\tsession: AgentSessionInternals,\n\tmodel: Model<Api>,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\tif (!(await session._modelRuntime.checkAuth(model.provider))) {\n\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t}\n\n\tconst previousModel = session.model;\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(model);\n\tsession.agent.state.model = model;\n\tsession.sessionManager.appendModelChange(model.provider, model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Per-model thinking level overrides take priority over the global default.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(model, previousModel, \"set\");\n}\n\nexport function addPersistedDefaultToNonEmptyScope(session: AgentSessionInternals, model: Model<Api>): void {\n\tif (session._scopedModels.length === 0) return;\n\tif (session._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model))) return;\n\n\tsession._scopedModels = [...session._scopedModels, { model }];\n\n\tconst enabledModels = session.settingsManager.getEnabledModels();\n\tif (!enabledModels?.length) return;\n\n\tconst modelReference = `${model.provider}/${model.id}`;\n\tif (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase())) return;\n\tsession.settingsManager.setEnabledModels([...enabledModels, modelReference]);\n}\n\n/**\n * Cycle to next/previous model.\n * Uses scoped models (from --models flag) if available, otherwise all available models.\n * @param direction - \"forward\" (default) or \"backward\"\n * @returns The new model info, or undefined if only one model available\n */\nexport async function cycleModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n\toptions: ModelMutationOptions = {},\n): Promise<ModelCycleResult | undefined> {\n\tif (session._scopedModels.length > 0) {\n\t\treturn session._cycleScopedModel(direction, options);\n\t}\n\treturn session._cycleAvailableModel(direction, options);\n}\n\nexport async function cycleScopedModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableIds = new Set(\n\t\tsession._modelRuntime.getAvailableSnapshot().map((model) => `${model.provider}\\0${model.id}`),\n\t);\n\tconst scopedModels = session._scopedModels.filter((scoped) =>\n\t\tavailableIds.has(`${scoped.model.provider}\\0${scoped.model.id}`),\n\t);\n\tif (scopedModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = scopedModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst next = scopedModels[nextIndex];\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);\n\n\t// Apply model\n\tsession.agent.state.model = next.model;\n\tsession.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(next.model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// - Explicit scoped model thinking level overrides defaults\n\t// - Per-model thinking level overrides take priority over the global default\n\t// setThinkingLevel clamps to model capabilities.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(next.model, currentModel, \"cycle\");\n\n\treturn { model: next.model, thinkingLevel: session.thinkingLevel, isScoped: true };\n}\n\nexport async function cycleAvailableModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableModels = session._modelRuntime.getAvailableSnapshot();\n\tif (availableModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = availableModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst nextModel = availableModels[nextIndex];\n\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(nextModel);\n\tsession.agent.state.model = nextModel;\n\tsession.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(nextModel);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(nextModel, currentModel, \"cycle\");\n\n\treturn { model: nextModel, thinkingLevel: session.thinkingLevel, isScoped: false };\n}\n\n/** Scoped models for cycling (from --models flag). */\nexport function getScopedModels(\n\tsession: AgentSessionInternals,\n): ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }> {\n\treturn session._scopedModels;\n}\n\n/** Project provider-agnostic facts off a Model without exposing api/headers/cost internals. */\nexport function modelFactsView(model: Model<Api>): ModelFactsViewV1 {\n\treturn {\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\treasoning: model.reasoning,\n\t};\n}\n\n/** Update scoped models for cycling. */\nexport function setScopedModels(\n\tsession: AgentSessionInternals,\n\tscopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>,\n): void {\n\tsession._scopedModels = scopedModels;\n}\n\nexport function getThinkingLevelForModelSwitch(\n\tsession: AgentSessionInternals,\n\ttargetModel?: Model<Api>,\n\texplicitLevel?: ThinkingLevel,\n): ThinkingLevel {\n\tif (explicitLevel !== undefined) {\n\t\treturn explicitLevel;\n\t}\n\t// Per-model default takes priority when switching to a model that has one\n\tif (targetModel) {\n\t\tconst perModel = session.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);\n\t\tif (perModel !== undefined) {\n\t\t\treturn perModel;\n\t\t}\n\t}\n\treturn session.settingsManager.getDefaultThinkingLevel() ?? session.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n"]}
1
+ {"version":3,"file":"agent-session-model.js","sourceRoot":"","sources":["../../src/core/agent-session-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,OAA8B,EAC9B,SAAqB,EACrB,aAAqC,EACrC,MAAmC,EACnB;IAChB,IAAI,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC;QAAE,OAAO;IACrD,MAAM,4BAA4B,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,CACxG;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,OAA8B,EAC9B,KAAiB,EACjB,OAAO,GAAyB,EAAE,EAClB;IAChB,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IACpC,MAAM,aAAa,GAAG,OAAO,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAClC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,mCAAmC,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,0CAA0C;IAC1C,4EAA4E;IAC5E,6EAA6E;IAC7E,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAExC,MAAM,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AAAA,CAC5D;AAED,MAAM,UAAU,kCAAkC,CAAC,OAA8B,EAAE,KAAiB,EAAQ;IAC3G,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/C,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAAE,OAAO;IAExF,OAAO,CAAC,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAE9D,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;IACjE,IAAI,CAAC,aAAa,EAAE,MAAM;QAAE,OAAO;IAEnC,MAAM,cAAc,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;IACvD,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO;IACpG,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,GAAG,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;AAAA,CAC7E;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,OAA8B,EAC9B,SAAS,GAA2B,SAAS,EAC7C,OAAO,GAAyB,EAAE,EACM;IACxC,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,OAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,OAAO,CAAC,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAAA,CACxD;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAA8B,EAC9B,SAAiC,EACjC,OAA6B,EACW;IACxC,MAAM,YAAY,GAAG,IAAI,GAAG,CAC3B,OAAO,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC,CAC7F,CAAC;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5D,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAChE,CAAC;IACF,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;IACnC,IAAI,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAE1F,IAAI,YAAY,KAAK,CAAC,CAAC;QAAE,YAAY,GAAG,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC;IAChC,MAAM,SAAS,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACtG,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,OAAO,CAAC,+BAA+B,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAE9F,cAAc;IACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACvC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,0CAA0C;IAC1C,4DAA4D;IAC5D,6EAA6E;IAC7E,iDAAiD;IACjD,6EAA6E;IAC7E,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAExC,MAAM,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAElE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,CACnF;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,OAA8B,EAC9B,SAAiC,EACjC,OAA6B,EACW;IACxC,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC;IACrE,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAElD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;IACnC,IAAI,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAErF,IAAI,YAAY,KAAK,CAAC,CAAC;QAAE,YAAY,GAAG,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC;IACnC,MAAM,SAAS,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACtG,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE7C,MAAM,aAAa,GAAG,OAAO,CAAC,+BAA+B,CAAC,SAAS,CAAC,CAAC;IACzE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;IACtC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,0BAA0B,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;QACrF,OAAO,CAAC,mCAAmC,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,0CAA0C;IAC1C,6EAA6E;IAC7E,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAExC,MAAM,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEjE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAAA,CACnF;AAED,sDAAsD;AACtD,MAAM,UAAU,eAAe,CAC9B,OAA8B,EACwC;IACtE,OAAO,OAAO,CAAC,aAAa,CAAC;AAAA,CAC7B;AAED,+FAA+F;AAC/F,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAoB;IACnE,OAAO;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC;AAAA,CACF;AAED,wCAAwC;AACxC,MAAM,UAAU,eAAe,CAC9B,OAA8B,EAC9B,YAAyE,EAClE;IACP,OAAO,CAAC,aAAa,GAAG,YAAY,CAAC;AAAA,CACrC;AAED,MAAM,UAAU,8BAA8B,CAC7C,OAA8B,EAC9B,WAAwB,EACxB,aAA6B,EACb;IAChB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACtB,CAAC;IACD,0EAA0E;IAC1E,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,qBAAqB,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QACrG,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACjB,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC,eAAe,CAAC,uBAAuB,EAAE,IAAI,OAAO,CAAC,aAAa,IAAI,sBAAsB,CAAC;AAAA,CAC5G","sourcesContent":["/**\n * Model selection and thinking-level resolution for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name delegates so call sites, dynamic dispatch, and test spies\n * keep working unchanged. Method-to-method calls that have a facade member go\n * through the session parameter (not direct function calls) to preserve that\n * dispatch. `setModel` and `cycleModel` stay parallel implementations: each\n * keeps its own apply/persist/thinking/model_select sequence and never calls\n * the other.\n */\n\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport { modelsAreEqual } from \"@agent-forge/ai/compat\";\nimport type { ModelCycleResult, ModelMutationOptions } from \"./agent-session.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchModelSelectLifecycle } from \"./agent-session-lifecycle.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelFactsViewV1 } from \"./extensions/public-api.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport async function emitModelSelect(\n\tsession: AgentSessionInternals,\n\tnextModel: Model<Api>,\n\tpreviousModel: Model<Api> | undefined,\n\tsource: \"set\" | \"cycle\" | \"restore\",\n): Promise<void> {\n\tif (modelsAreEqual(previousModel, nextModel)) return;\n\tawait dispatchModelSelectLifecycle(session, { provider: nextModel.provider, id: nextModel.id }, source);\n}\n\n/**\n * Set model directly.\n * Validates that auth is configured and saves to the session transcript.\n * Persists to global defaults only when options.persist is true.\n * @throws Error if no auth is configured for the model\n */\nexport async function setModel(\n\tsession: AgentSessionInternals,\n\tmodel: Model<Api>,\n\toptions: ModelMutationOptions = {},\n): Promise<void> {\n\tif (!(await session._modelRuntime.checkAuth(model.provider))) {\n\t\tthrow new Error(t(\"No API key for {provider}/{model}\", { provider: model.provider, model: model.id }));\n\t}\n\n\tconst previousModel = session.model;\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(model);\n\tsession.agent.state.model = model;\n\tsession.sessionManager.appendModelChange(model.provider, model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Per-model thinking level overrides take priority over the global default.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(model, previousModel, \"set\");\n}\n\nexport function addPersistedDefaultToNonEmptyScope(session: AgentSessionInternals, model: Model<Api>): void {\n\tif (session._scopedModels.length === 0) return;\n\tif (session._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model))) return;\n\n\tsession._scopedModels = [...session._scopedModels, { model }];\n\n\tconst enabledModels = session.settingsManager.getEnabledModels();\n\tif (!enabledModels?.length) return;\n\n\tconst modelReference = `${model.provider}/${model.id}`;\n\tif (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase())) return;\n\tsession.settingsManager.setEnabledModels([...enabledModels, modelReference]);\n}\n\n/**\n * Cycle to next/previous model.\n * Uses scoped models (from --models flag) if available, otherwise all available models.\n * @param direction - \"forward\" (default) or \"backward\"\n * @returns The new model info, or undefined if only one model available\n */\nexport async function cycleModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\" = \"forward\",\n\toptions: ModelMutationOptions = {},\n): Promise<ModelCycleResult | undefined> {\n\tif (session._scopedModels.length > 0) {\n\t\treturn session._cycleScopedModel(direction, options);\n\t}\n\treturn session._cycleAvailableModel(direction, options);\n}\n\nexport async function cycleScopedModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableIds = new Set(\n\t\tsession._modelRuntime.getAvailableSnapshot().map((model) => `${model.provider}\\0${model.id}`),\n\t);\n\tconst scopedModels = session._scopedModels.filter((scoped) =>\n\t\tavailableIds.has(`${scoped.model.provider}\\0${scoped.model.id}`),\n\t);\n\tif (scopedModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = scopedModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst next = scopedModels[nextIndex];\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);\n\n\t// Apply model\n\tsession.agent.state.model = next.model;\n\tsession.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(next.model);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// - Explicit scoped model thinking level overrides defaults\n\t// - Per-model thinking level overrides take priority over the global default\n\t// setThinkingLevel clamps to model capabilities.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(next.model, currentModel, \"cycle\");\n\n\treturn { model: next.model, thinkingLevel: session.thinkingLevel, isScoped: true };\n}\n\nexport async function cycleAvailableModel(\n\tsession: AgentSessionInternals,\n\tdirection: \"forward\" | \"backward\",\n\toptions: ModelMutationOptions,\n): Promise<ModelCycleResult | undefined> {\n\tconst availableModels = session._modelRuntime.getAvailableSnapshot();\n\tif (availableModels.length <= 1) return undefined;\n\n\tconst currentModel = session.model;\n\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\tif (currentIndex === -1) currentIndex = 0;\n\tconst len = availableModels.length;\n\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\tconst nextModel = availableModels[nextIndex];\n\n\tconst thinkingLevel = session._getThinkingLevelForModelSwitch(nextModel);\n\tsession.agent.state.model = nextModel;\n\tsession.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\tif (options.persist) {\n\t\tsession.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);\n\t\tsession._addPersistedDefaultToNonEmptyScope(nextModel);\n\t}\n\n\t// Apply thinking level for the new model.\n\t// Model persistence does not implicitly rewrite the global thinking default.\n\tsession.setThinkingLevel(thinkingLevel);\n\n\tawait session._emitModelSelect(nextModel, currentModel, \"cycle\");\n\n\treturn { model: nextModel, thinkingLevel: session.thinkingLevel, isScoped: false };\n}\n\n/** Scoped models for cycling (from --models flag). */\nexport function getScopedModels(\n\tsession: AgentSessionInternals,\n): ReadonlyArray<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }> {\n\treturn session._scopedModels;\n}\n\n/** Project provider-agnostic facts off a Model without exposing api/headers/cost internals. */\nexport function modelFactsView(model: Model<Api>): ModelFactsViewV1 {\n\treturn {\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\treasoning: model.reasoning,\n\t};\n}\n\n/** Update scoped models for cycling. */\nexport function setScopedModels(\n\tsession: AgentSessionInternals,\n\tscopedModels: Array<{ model: Model<Api>; thinkingLevel?: ThinkingLevel }>,\n): void {\n\tsession._scopedModels = scopedModels;\n}\n\nexport function getThinkingLevelForModelSwitch(\n\tsession: AgentSessionInternals,\n\ttargetModel?: Model<Api>,\n\texplicitLevel?: ThinkingLevel,\n): ThinkingLevel {\n\tif (explicitLevel !== undefined) {\n\t\treturn explicitLevel;\n\t}\n\t// Per-model default takes priority when switching to a model that has one\n\tif (targetModel) {\n\t\tconst perModel = session.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);\n\t\tif (perModel !== undefined) {\n\t\t\treturn perModel;\n\t\t}\n\t}\n\treturn session.settingsManager.getDefaultThinkingLevel() ?? session.thinkingLevel ?? DEFAULT_THINKING_LEVEL;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-retry.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,wBAAsB,sBAAsB,CAC3C,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,EACjD,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CA8BlB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,SAAS,CAAC,EAAE,gBAAgB,EAC5B,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,WAAW,CAChC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,SAAS,CAAC,EAAE,gBAAgB,EAC5B,MAAM,CAAC,EAAE,WAAW,gEAiBpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CACjC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,GACzE,OAAO,CAAC,OAAO,CAAC,CA0DlB","sourcesContent":["/**\n * Auto-retry and overflow classification for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name private delegates so call sites, dynamic dispatch, and test\n * spies keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentEvent } from \"@agent-forge/agent-core\";\nimport { retryDelayMs } from \"@agent-forge/ai\";\nimport type { AssistantMessage } from \"@agent-forge/ai/compat\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { decideOverflow, executionFacts } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchAutoRetryLifecycle } from \"./agent-session-lifecycle.ts\";\nimport type { CapabilityRuntime, ExecutionFactsV1 } from \"./extensions/index.ts\";\n\nexport async function willRetryAfterAgentEnd(\n\tsession: AgentSessionInternals,\n\tevent: Extract<AgentEvent, { type: \"agent_end\" }>,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\tif (signal?.aborted) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\tconst settings = session.settingsManager.getRetrySettings();\n\tif (session._retryAttempt >= settings.maxRetries) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\n\tfor (let i = event.messages.length - 1; i >= 0; i--) {\n\t\tconst message = event.messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMessage = message as AssistantMessage;\n\t\t\ttry {\n\t\t\t\tconst decision = await decideRetry(session, assistantMessage, undefined, signal);\n\t\t\t\tsession._pendingRetryDecision = { message: assistantMessage, decision };\n\t\t\t\treturn decision.retry;\n\t\t\t} catch (error) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tsession._pendingRetryDecision = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tsession._pendingRetryDecision = undefined;\n\treturn false;\n}\n\n/**\n * Check if an error is retryable (overloaded, rate limit, server errors).\n * Context overflow errors are NOT retryable (handled by compaction instead).\n */\nexport async function isRetryableError(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\t// Context overflow is handled by compaction, not retry.\n\tif ((await decideOverflow(session, message, execution, signal)).contextOverflow) return false;\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(\"Capability runtime is not available\");\n\treturn runtime.classifyRetry(session._retryPolicyName, {\n\t\tmessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\nexport async function decideRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n) {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(\"Capability runtime is not available\");\n\treturn runtime.decideRetry(session._retryPolicyName, {\n\t\tretryable: await session._isRetryableError(message, execution, signal),\n\t\tenabled: settings.enabled,\n\t\tattempt: session._retryAttempt + 1,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tbaseDelayMs: settings.baseDelayMs,\n\t\terrorMessage: message.errorMessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\n/**\n * Prepare a retryable error for continuation with exponential backoff.\n * @returns true if the caller should continue the agent, false otherwise\n */\nexport async function prepareRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n): Promise<boolean> {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst decision = precomputedDecision ?? (await decideRetry(session, message));\n\tif (!decision.retry) return false;\n\tsession._retryAttempt++;\n\t// ±10% jitter on the exponential backoff (borrowed from codex's backoff):\n\t// prevents synchronized retry storms when many sessions hit the same outage.\n\t// The effective delay is capped by maxAgentDelayMs before jitter (retryDelayMs\n\t// already caps the exponential path; the min() also clamps policy-provided\n\t// delayMs), so a capped delay can overshoot the cap by at most the jitter band.\n\tconst baseDelayMs = Math.min(\n\t\tdecision.delayMs ?? retryDelayMs(settings, session._retryAttempt),\n\t\tsettings.maxAgentDelayMs,\n\t);\n\tconst delayMs = Math.round(baseDelayMs * (0.9 + Math.random() * 0.2));\n\t// Install the controller before announcing the retry so listeners can cancel\n\t// the pending delay from the auto_retry_start event itself.\n\tsession._retryAbortController = new AbortController();\n\n\tsession._emit({\n\t\ttype: \"auto_retry_start\",\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\tawait dispatchAutoRetryLifecycle(session, {\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\n\t// Remove error message from agent state (keep in session for history)\n\tconst messages = session.agent.state.messages;\n\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\tawait session._applyContextTransition(messages.slice(0, -1), \"retry\");\n\t}\n\n\t// Wait with exponential backoff (abortable)\n\ttry {\n\t\tawait sleep(delayMs, session._retryAbortController.signal);\n\t} catch {\n\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\tconst attempt = session._retryAttempt;\n\t\tsession._retryAttempt = 0;\n\t\tsession._emit({\n\t\t\ttype: \"auto_retry_end\",\n\t\t\tsuccess: false,\n\t\t\tattempt,\n\t\t\tfinalError: \"Retry cancelled\",\n\t\t});\n\t\treturn false;\n\t} finally {\n\t\tsession._retryAbortController = undefined;\n\t}\n\n\treturn true;\n}\n"]}
1
+ {"version":3,"file":"agent-session-retry.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,wBAAsB,sBAAsB,CAC3C,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,EACjD,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CA8BlB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,SAAS,CAAC,EAAE,gBAAgB,EAC5B,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,WAAW,CAChC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,SAAS,CAAC,EAAE,gBAAgB,EAC5B,MAAM,CAAC,EAAE,WAAW,gEAgBpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CACjC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,gBAAgB,EACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,GACzE,OAAO,CAAC,OAAO,CAAC,CA0DlB","sourcesContent":["/**\n * Auto-retry and overflow classification for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name private delegates so call sites, dynamic dispatch, and test\n * spies keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentEvent } from \"@agent-forge/agent-core\";\nimport { retryDelayMs } from \"@agent-forge/ai\";\nimport type { AssistantMessage } from \"@agent-forge/ai/compat\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { decideOverflow, executionFacts } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchAutoRetryLifecycle } from \"./agent-session-lifecycle.ts\";\nimport type { CapabilityRuntime, ExecutionFactsV1 } from \"./extensions/index.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport async function willRetryAfterAgentEnd(\n\tsession: AgentSessionInternals,\n\tevent: Extract<AgentEvent, { type: \"agent_end\" }>,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\tif (signal?.aborted) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\tconst settings = session.settingsManager.getRetrySettings();\n\tif (session._retryAttempt >= settings.maxRetries) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\n\tfor (let i = event.messages.length - 1; i >= 0; i--) {\n\t\tconst message = event.messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMessage = message as AssistantMessage;\n\t\t\ttry {\n\t\t\t\tconst decision = await decideRetry(session, assistantMessage, undefined, signal);\n\t\t\t\tsession._pendingRetryDecision = { message: assistantMessage, decision };\n\t\t\t\treturn decision.retry;\n\t\t\t} catch (error) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tsession._pendingRetryDecision = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tsession._pendingRetryDecision = undefined;\n\treturn false;\n}\n\n/**\n * Check if an error is retryable (overloaded, rate limit, server errors).\n * Context overflow errors are NOT retryable (handled by compaction instead).\n */\nexport async function isRetryableError(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\t// Context overflow is handled by compaction, not retry.\n\tif ((await decideOverflow(session, message, execution, signal)).contextOverflow) return false;\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(t(\"Capability runtime is not available\"));\n\treturn runtime.classifyRetry(session._retryPolicyName, {\n\t\tmessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\nexport async function decideRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n) {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(t(\"Capability runtime is not available\"));\n\treturn runtime.decideRetry(session._retryPolicyName, {\n\t\tretryable: await session._isRetryableError(message, execution, signal),\n\t\tattempt: session._retryAttempt + 1,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tbaseDelayMs: settings.baseDelayMs,\n\t\terrorMessage: message.errorMessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\n/**\n * Prepare a retryable error for continuation with exponential backoff.\n * @returns true if the caller should continue the agent, false otherwise\n */\nexport async function prepareRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n): Promise<boolean> {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst decision = precomputedDecision ?? (await decideRetry(session, message));\n\tif (!decision.retry) return false;\n\tsession._retryAttempt++;\n\t// ±10% jitter on the exponential backoff (borrowed from codex's backoff):\n\t// prevents synchronized retry storms when many sessions hit the same outage.\n\t// The effective delay is capped by maxAgentDelayMs before jitter (retryDelayMs\n\t// already caps the exponential path; the min() also clamps policy-provided\n\t// delayMs), so a capped delay can overshoot the cap by at most the jitter band.\n\tconst baseDelayMs = Math.min(\n\t\tdecision.delayMs ?? retryDelayMs(settings, session._retryAttempt),\n\t\tsettings.maxAgentDelayMs,\n\t);\n\tconst delayMs = Math.round(baseDelayMs * (0.9 + Math.random() * 0.2));\n\t// Install the controller before announcing the retry so listeners can cancel\n\t// the pending delay from the auto_retry_start event itself.\n\tsession._retryAbortController = new AbortController();\n\n\tsession._emit({\n\t\ttype: \"auto_retry_start\",\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\tawait dispatchAutoRetryLifecycle(session, {\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\n\t// Remove error message from agent state (keep in session for history)\n\tconst messages = session.agent.state.messages;\n\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\tawait session._applyContextTransition(messages.slice(0, -1), \"retry\");\n\t}\n\n\t// Wait with exponential backoff (abortable)\n\ttry {\n\t\tawait sleep(delayMs, session._retryAbortController.signal);\n\t} catch {\n\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\tconst attempt = session._retryAttempt;\n\t\tsession._retryAttempt = 0;\n\t\tsession._emit({\n\t\t\ttype: \"auto_retry_end\",\n\t\t\tsuccess: false,\n\t\t\tattempt,\n\t\t\tfinalError: \"Retry cancelled\",\n\t\t});\n\t\treturn false;\n\t} finally {\n\t\tsession._retryAbortController = undefined;\n\t}\n\n\treturn true;\n}\n"]}
@@ -11,6 +11,7 @@ import { retryDelayMs } from "@agent-forge/ai";
11
11
  import { sleep } from "../utils/sleep.js";
12
12
  import { decideOverflow, executionFacts } from "./agent-session-compaction.js";
13
13
  import { dispatchAutoRetryLifecycle } from "./agent-session-lifecycle.js";
14
+ import { t } from "./i18n/index.js";
14
15
  export async function willRetryAfterAgentEnd(session, event, signal) {
15
16
  if (signal?.aborted) {
16
17
  session._pendingRetryDecision = undefined;
@@ -53,7 +54,7 @@ export async function isRetryableError(session, message, execution, signal) {
53
54
  const runtime = session._capabilityRuntime;
54
55
  // v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在
55
56
  if (!runtime)
56
- throw new Error("Capability runtime is not available");
57
+ throw new Error(t("Capability runtime is not available"));
57
58
  return runtime.classifyRetry(session._retryPolicyName, {
58
59
  message,
59
60
  signal,
@@ -66,10 +67,9 @@ export async function decideRetry(session, message, execution, signal) {
66
67
  const runtime = session._capabilityRuntime;
67
68
  // v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在
68
69
  if (!runtime)
69
- throw new Error("Capability runtime is not available");
70
+ throw new Error(t("Capability runtime is not available"));
70
71
  return runtime.decideRetry(session._retryPolicyName, {
71
72
  retryable: await session._isRetryableError(message, execution, signal),
72
- enabled: settings.enabled,
73
73
  attempt: session._retryAttempt + 1,
74
74
  maxAttempts: settings.maxRetries,
75
75
  baseDelayMs: settings.baseDelayMs,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-retry.js","sourceRoot":"","sources":["../../src/core/agent-session-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG1E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,OAA8B,EAC9B,KAAiD,EACjD,MAAoB,EACD;IACnB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAC1C,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;IAC5D,IAAI,OAAO,CAAC,aAAa,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAClD,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAC1C,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,gBAAgB,GAAG,OAA2B,CAAC;YACrD,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBACjF,OAAO,CAAC,qBAAqB,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;gBACxE,OAAO,QAAQ,CAAC,KAAK,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACrB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;oBAC1C,OAAO,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACb,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAC1C,OAAO,KAAK,CAAC;AAAA,CACb;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAA8B,EAC9B,OAAyB,EACzB,SAA4B,EAC5B,MAAoB,EACD;IACnB,wDAAwD;IACxD,IAAI,CAAC,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAC9F,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC3C,kHAAgF;IAChF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE;QACtD,OAAO;QACP,MAAM;QACN,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;QACrE,SAAS,EAAE,SAAS,IAAI,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC;KACxD,CAAC,CAAC;AAAA,CACH;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,OAA8B,EAC9B,OAAyB,EACzB,SAA4B,EAC5B,MAAoB,EACnB;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC3C,kHAAgF;IAChF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,EAAE;QACpD,SAAS,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;QACtE,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,OAAO,EAAE,OAAO,CAAC,aAAa,GAAG,CAAC;QAClC,WAAW,EAAE,QAAQ,CAAC,UAAU;QAChC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,MAAM;QACN,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;QACrE,SAAS,EAAE,SAAS,IAAI,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC;KACxD,CAAC,CAAC;AAAA,CACH;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,OAA8B,EAC9B,OAAyB,EACzB,mBAA2E,EACxD;IACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;IAC5D,MAAM,QAAQ,GAAG,mBAAmB,IAAI,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,CAAC,aAAa,EAAE,CAAC;IACxB,2EAA0E;IAC1E,6EAA6E;IAC7E,+EAA+E;IAC/E,2EAA2E;IAC3E,gFAAgF;IAChF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC3B,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,EACjE,QAAQ,CAAC,eAAe,CACxB,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACtE,6EAA6E;IAC7E,4DAA4D;IAC5D,OAAO,CAAC,qBAAqB,GAAG,IAAI,eAAe,EAAE,CAAC;IAEtD,OAAO,CAAC,KAAK,CAAC;QACb,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO,CAAC,aAAa;QAC9B,WAAW,EAAE,QAAQ,CAAC,UAAU;QAChC,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,eAAe;KACrD,CAAC,CAAC;IACH,MAAM,0BAA0B,CAAC,OAAO,EAAE;QACzC,OAAO,EAAE,OAAO,CAAC,aAAa;QAC9B,WAAW,EAAE,QAAQ,CAAC,UAAU;QAChC,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,eAAe;KACrD,CAAC,CAAC;IAEH,sEAAsE;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/E,MAAM,OAAO,CAAC,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACR,2DAA2D;QAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;QACtC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC;YACb,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,OAAO;YACP,UAAU,EAAE,iBAAiB;SAC7B,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACV,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,CAAC;AAAA,CACZ","sourcesContent":["/**\n * Auto-retry and overflow classification for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name private delegates so call sites, dynamic dispatch, and test\n * spies keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentEvent } from \"@agent-forge/agent-core\";\nimport { retryDelayMs } from \"@agent-forge/ai\";\nimport type { AssistantMessage } from \"@agent-forge/ai/compat\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { decideOverflow, executionFacts } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchAutoRetryLifecycle } from \"./agent-session-lifecycle.ts\";\nimport type { CapabilityRuntime, ExecutionFactsV1 } from \"./extensions/index.ts\";\n\nexport async function willRetryAfterAgentEnd(\n\tsession: AgentSessionInternals,\n\tevent: Extract<AgentEvent, { type: \"agent_end\" }>,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\tif (signal?.aborted) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\tconst settings = session.settingsManager.getRetrySettings();\n\tif (session._retryAttempt >= settings.maxRetries) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\n\tfor (let i = event.messages.length - 1; i >= 0; i--) {\n\t\tconst message = event.messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMessage = message as AssistantMessage;\n\t\t\ttry {\n\t\t\t\tconst decision = await decideRetry(session, assistantMessage, undefined, signal);\n\t\t\t\tsession._pendingRetryDecision = { message: assistantMessage, decision };\n\t\t\t\treturn decision.retry;\n\t\t\t} catch (error) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tsession._pendingRetryDecision = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tsession._pendingRetryDecision = undefined;\n\treturn false;\n}\n\n/**\n * Check if an error is retryable (overloaded, rate limit, server errors).\n * Context overflow errors are NOT retryable (handled by compaction instead).\n */\nexport async function isRetryableError(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\t// Context overflow is handled by compaction, not retry.\n\tif ((await decideOverflow(session, message, execution, signal)).contextOverflow) return false;\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(\"Capability runtime is not available\");\n\treturn runtime.classifyRetry(session._retryPolicyName, {\n\t\tmessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\nexport async function decideRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n) {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(\"Capability runtime is not available\");\n\treturn runtime.decideRetry(session._retryPolicyName, {\n\t\tretryable: await session._isRetryableError(message, execution, signal),\n\t\tenabled: settings.enabled,\n\t\tattempt: session._retryAttempt + 1,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tbaseDelayMs: settings.baseDelayMs,\n\t\terrorMessage: message.errorMessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\n/**\n * Prepare a retryable error for continuation with exponential backoff.\n * @returns true if the caller should continue the agent, false otherwise\n */\nexport async function prepareRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n): Promise<boolean> {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst decision = precomputedDecision ?? (await decideRetry(session, message));\n\tif (!decision.retry) return false;\n\tsession._retryAttempt++;\n\t// ±10% jitter on the exponential backoff (borrowed from codex's backoff):\n\t// prevents synchronized retry storms when many sessions hit the same outage.\n\t// The effective delay is capped by maxAgentDelayMs before jitter (retryDelayMs\n\t// already caps the exponential path; the min() also clamps policy-provided\n\t// delayMs), so a capped delay can overshoot the cap by at most the jitter band.\n\tconst baseDelayMs = Math.min(\n\t\tdecision.delayMs ?? retryDelayMs(settings, session._retryAttempt),\n\t\tsettings.maxAgentDelayMs,\n\t);\n\tconst delayMs = Math.round(baseDelayMs * (0.9 + Math.random() * 0.2));\n\t// Install the controller before announcing the retry so listeners can cancel\n\t// the pending delay from the auto_retry_start event itself.\n\tsession._retryAbortController = new AbortController();\n\n\tsession._emit({\n\t\ttype: \"auto_retry_start\",\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\tawait dispatchAutoRetryLifecycle(session, {\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\n\t// Remove error message from agent state (keep in session for history)\n\tconst messages = session.agent.state.messages;\n\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\tawait session._applyContextTransition(messages.slice(0, -1), \"retry\");\n\t}\n\n\t// Wait with exponential backoff (abortable)\n\ttry {\n\t\tawait sleep(delayMs, session._retryAbortController.signal);\n\t} catch {\n\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\tconst attempt = session._retryAttempt;\n\t\tsession._retryAttempt = 0;\n\t\tsession._emit({\n\t\t\ttype: \"auto_retry_end\",\n\t\t\tsuccess: false,\n\t\t\tattempt,\n\t\t\tfinalError: \"Retry cancelled\",\n\t\t});\n\t\treturn false;\n\t} finally {\n\t\tsession._retryAbortController = undefined;\n\t}\n\n\treturn true;\n}\n"]}
1
+ {"version":3,"file":"agent-session-retry.js","sourceRoot":"","sources":["../../src/core/agent-session-retry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Auto-retry and overflow classification for AgentSession.\n *\n * Extracted from `agent-session.ts`. Every function here operates on the\n * internal session facade ({@link AgentSessionInternals}); `AgentSession`\n * keeps same-name private delegates so call sites, dynamic dispatch, and test\n * spies keep working unchanged. Method-to-method calls go through the session\n * parameter (not direct function calls) to preserve that dispatch.\n */\n\nimport type { AgentEvent } from \"@agent-forge/agent-core\";\nimport { retryDelayMs } from \"@agent-forge/ai\";\nimport type { AssistantMessage } from \"@agent-forge/ai/compat\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { decideOverflow, executionFacts } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternals } from \"./agent-session-internal.ts\";\nimport { dispatchAutoRetryLifecycle } from \"./agent-session-lifecycle.ts\";\nimport type { CapabilityRuntime, ExecutionFactsV1 } from \"./extensions/index.ts\";\nimport { t } from \"./i18n/index.ts\";\n\nexport async function willRetryAfterAgentEnd(\n\tsession: AgentSessionInternals,\n\tevent: Extract<AgentEvent, { type: \"agent_end\" }>,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\tif (signal?.aborted) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\tconst settings = session.settingsManager.getRetrySettings();\n\tif (session._retryAttempt >= settings.maxRetries) {\n\t\tsession._pendingRetryDecision = undefined;\n\t\treturn false;\n\t}\n\n\tfor (let i = event.messages.length - 1; i >= 0; i--) {\n\t\tconst message = event.messages[i];\n\t\tif (message.role === \"assistant\") {\n\t\t\tconst assistantMessage = message as AssistantMessage;\n\t\t\ttry {\n\t\t\t\tconst decision = await decideRetry(session, assistantMessage, undefined, signal);\n\t\t\t\tsession._pendingRetryDecision = { message: assistantMessage, decision };\n\t\t\t\treturn decision.retry;\n\t\t\t} catch (error) {\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tsession._pendingRetryDecision = undefined;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\tsession._pendingRetryDecision = undefined;\n\treturn false;\n}\n\n/**\n * Check if an error is retryable (overloaded, rate limit, server errors).\n * Context overflow errors are NOT retryable (handled by compaction instead).\n */\nexport async function isRetryableError(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\t// Context overflow is handled by compaction, not retry.\n\tif ((await decideOverflow(session, message, execution, signal)).contextOverflow) return false;\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(t(\"Capability runtime is not available\"));\n\treturn runtime.classifyRetry(session._retryPolicyName, {\n\t\tmessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\nexport async function decideRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\texecution?: ExecutionFactsV1,\n\tsignal?: AbortSignal,\n) {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst runtime = session._capabilityRuntime;\n\t// v8 ignore next -- capability runtime 恒由 _buildRuntime 创建,dispose 后不再调用,运行期恒存在\n\tif (!runtime) throw new Error(t(\"Capability runtime is not available\"));\n\treturn runtime.decideRetry(session._retryPolicyName, {\n\t\tretryable: await session._isRetryableError(message, execution, signal),\n\t\tattempt: session._retryAttempt + 1,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tbaseDelayMs: settings.baseDelayMs,\n\t\terrorMessage: message.errorMessage,\n\t\tsignal,\n\t\tcontext: { version: 1, sessionId: session.sessionId, phase: \"retry\" },\n\t\texecution: execution ?? executionFacts(session, \"retry\"),\n\t});\n}\n\n/**\n * Prepare a retryable error for continuation with exponential backoff.\n * @returns true if the caller should continue the agent, false otherwise\n */\nexport async function prepareRetry(\n\tsession: AgentSessionInternals,\n\tmessage: AssistantMessage,\n\tprecomputedDecision?: Awaited<ReturnType<CapabilityRuntime[\"decideRetry\"]>>,\n): Promise<boolean> {\n\tconst settings = session.settingsManager.getRetrySettings();\n\tconst decision = precomputedDecision ?? (await decideRetry(session, message));\n\tif (!decision.retry) return false;\n\tsession._retryAttempt++;\n\t// ±10% jitter on the exponential backoff (borrowed from codex's backoff):\n\t// prevents synchronized retry storms when many sessions hit the same outage.\n\t// The effective delay is capped by maxAgentDelayMs before jitter (retryDelayMs\n\t// already caps the exponential path; the min() also clamps policy-provided\n\t// delayMs), so a capped delay can overshoot the cap by at most the jitter band.\n\tconst baseDelayMs = Math.min(\n\t\tdecision.delayMs ?? retryDelayMs(settings, session._retryAttempt),\n\t\tsettings.maxAgentDelayMs,\n\t);\n\tconst delayMs = Math.round(baseDelayMs * (0.9 + Math.random() * 0.2));\n\t// Install the controller before announcing the retry so listeners can cancel\n\t// the pending delay from the auto_retry_start event itself.\n\tsession._retryAbortController = new AbortController();\n\n\tsession._emit({\n\t\ttype: \"auto_retry_start\",\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\tawait dispatchAutoRetryLifecycle(session, {\n\t\tattempt: session._retryAttempt,\n\t\tmaxAttempts: settings.maxRetries,\n\t\tdelayMs,\n\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t});\n\n\t// Remove error message from agent state (keep in session for history)\n\tconst messages = session.agent.state.messages;\n\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\tawait session._applyContextTransition(messages.slice(0, -1), \"retry\");\n\t}\n\n\t// Wait with exponential backoff (abortable)\n\ttry {\n\t\tawait sleep(delayMs, session._retryAbortController.signal);\n\t} catch {\n\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\tconst attempt = session._retryAttempt;\n\t\tsession._retryAttempt = 0;\n\t\tsession._emit({\n\t\t\ttype: \"auto_retry_end\",\n\t\t\tsuccess: false,\n\t\t\tattempt,\n\t\t\tfinalError: \"Retry cancelled\",\n\t\t});\n\t\treturn false;\n\t} finally {\n\t\tsession._retryAbortController = undefined;\n\t}\n\n\treturn true;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants, copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, parse, resolve } from \"node:path\";\nimport type { ImageContent, TextContent } from \"@agent-forge/ai/compat\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type { AgentTaskChildProfileV1 } from \"./extensions/public-api.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport type { CreateAgentSessionResult, PluginRejection } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SessionStartMetadata } from \"./session-start.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\n/**\n * Fresh session-bound context passed to `withSession()` callbacks on\n * `newSession()`, `fork()`, and `switchSession()`. It targets the replacement\n * session: every call routes into the session that became current after the\n * replacement committed.\n */\nexport interface ReplacedSessionContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\t/**\n\t * 仅当工厂收到 `childProfile` 时存在:叶子会话的**可核验事实**(实际生效的工具面、\n\t * 模型、模式)。runner 侧 server 用它与请求档案比对后才允许任务起跑——\"要求了但\n\t * 没人能证明\"与\"没要求\"是同一风险。\n\t */\n\tchildFacts?: {\n\t\treadonly activeTools: readonly string[];\n\t\treadonly model?: {\n\t\t\treadonly provider: string;\n\t\t\treadonly id: string;\n\t\t\treadonly contextWindow: number;\n\t\t\treadonly maxTokens: number;\n\t\t\treadonly reasoning: boolean;\n\t\t};\n\t\treadonly capabilityMode: string;\n\t\t/** 叶子实际思考级别(档案请求了 thinkingLevel 时核验用)。 */\n\t\treadonly thinkingLevel?: string;\n\t\t/** 叶子实际生效的系统提示词追加段(档案请求了 systemPromptAppend 时核验用,已含方案 APPEND_SYSTEM.md 门控结果)。 */\n\t\treadonly systemPromptAppend?: string;\n\t};\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartMetadata;\n\t/**\n\t * 子任务档案(AgentTaskChildProfileV1):pooled runner 的叶子会话按它收窄\n\t * (tools/mode/thinkingLevel)。父会话创建路径不传该字段——档案只服务子任务。\n\t */\n\tchildProfile?: AgentTaskChildProfileV1;\n\t/**\n\t * 子代理通信面的宿主接线(D-060 S5 pooled parity):runner 叶子装配注入\n\t * post/drainInbox 闭包(身份绑定到叶子会话),叶子会话由此获得\n\t * escalate/兄弟消息工具。父会话创建路径不传该字段。\n\t */\n\tsubagentCommunicationWiring?: import(\"./sdk.ts\").CreateAgentSessionOptions[\"subagentCommunicationWiring\"];\n\t/**\n\t * 档案 model 的目标 id(D-060 pooled parity 补口):runner 侧把叶子会话模型\n\t * 解析到**自己的 scoped models**(档案不能把会话带到 runner 未授权的模型上),\n\t * 解析不到即失败并列出可用 id。父会话创建路径不传该字段。\n\t */\n\tchildModelId?: string;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/** Maps suite assembly findings onto the runtime diagnostic channel as info. */\nfunction toSuiteRuntimeDiagnostics(suiteDiagnostics: readonly string[]): AgentSessionRuntimeDiagnostic[] {\n\treturn suiteDiagnostics.map((message) => ({ type: \"info\" as const, message }));\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _suiteDiagnostics: readonly string[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate _pluginRejections: readonly PluginRejection[];\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\t_pluginRejections: readonly PluginRejection[] = [],\n\t\t_suiteDiagnostics: readonly string[] = [],\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._suiteDiagnostics = _suiteDiagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis._pluginRejections = _pluginRejections;\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\t/** /metrics 数据源共享 ref(observability 插件门面,空 = 未挂载)。 */\n\tget observabilityGetMetricsRef(): AgentSessionServices[\"observabilityGetMetricsRef\"] {\n\t\treturn this._services.observabilityGetMetricsRef;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn [...this._diagnostics, ...toSuiteRuntimeDiagnostics(this._suiteDiagnostics)];\n\t}\n\n\t/**\n\t * Suite assembly findings from the last runtime creation (initial,\n\t * /new, /fork, /switch). Surfaced as info-level entries on the\n\t * `diagnostics` channel.\n\t */\n\tget suiteDiagnostics(): readonly string[] {\n\t\treturn this._suiteDiagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget pluginRejections(): readonly PluginRejection[] {\n\t\treturn this._pluginRejections;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async teardownCurrent(_reason: \"new\" | \"resume\" | \"fork\", _targetSessionFile?: string): Promise<void> {\n\t\t// Settle any active response first so the aborted turn (including tool\n\t\t// results) is persisted to the outgoing session before it is replaced.\n\t\t// Internal teardown aborts deliberately skip the interruption marker.\n\t\tawait this.session._abortInternal();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._suiteDiagnostics = result.suiteDiagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis._pluginRejections = result.pluginRejections;\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tconst context = this.session.sessionManager.buildSessionContext().messages;\n\t\t\tif (this.session.contextStrategyName) {\n\t\t\t\tawait this.session.replaceContext(context);\n\t\t\t} else {\n\t\t\t\tthis.session.agent.state.messages = context;\n\t\t\t}\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(\"Persisted session is missing a session file\");\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(\"This session has not been saved yet. Send a message before cloning or forking it.\");\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.open(currentSessionFile, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t\t}\n\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\tthis.apply(\n\t\t\t\tawait this.createRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager;\n\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tlet destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst sourceAlreadyStored = resolve(destinationPath) === resolvedPath;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tconst { name, ext } = parse(destinationPath);\n\t\t\tlet suffix = 1;\n\t\t\twhile (existsSync(destinationPath)) {\n\t\t\t\tdestinationPath = join(sessionDir, `${name}-${suffix++}${ext}`);\n\t\t\t}\n\t\t}\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath, constants.COPYFILE_EXCL);\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartMetadata;\n\t},\n): Promise<AgentSessionRuntime> {\n\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\tconst result = await createRuntime(options);\n\treturn new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\tresult.pluginRejections,\n\t\tresult.suiteDiagnostics,\n\t);\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
1
+ {"version":3,"file":"agent-session-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;;;GAKG;AACH;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACtC,WAAW,CAAC,CAAC,GAAG,OAAO,EACtB,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC,EACjF,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,CAAA;KAAE,GAChF,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,eAAe,CACd,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;QAAC,qBAAqB,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7E,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB;AAED,MAAM,WAAW,+BAAgC,SAAQ,wBAAwB;IAChF,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,WAAW,EAAE,6BAA6B,EAAE,CAAC;IAC7C;;;;OAIG;IACH,UAAU,CAAC,EAAE;QACZ,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;YAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;YACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;YAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;YAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;SAC5B,CAAC;QACF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,kFAA0C;QAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAChC,yJAAiF;QACjF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;KACrC,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gCAAgC,GAAG,CAAC,OAAO,EAAE;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,CAAC,EAAE,oBAAoB,CAAC;IACzC;;;OAGG;IACH,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,OAAO,UAAU,EAAE,yBAAyB,CAAC,6BAA6B,CAAC,CAAC;IAC1G;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,KAAK,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAE/C;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,YAAY,QAAQ,EAAE,MAAM,EAI3B;CACD;AAkBD;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,aAAa,CAAC,CAA2C;IACjE,OAAO,CAAC,uBAAuB,CAAC,CAAa;IAC7C,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,iBAAiB,CAA6B;IAEtD,YACC,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,oBAAoB,EAC/B,aAAa,EAAE,gCAAgC,EAC/C,YAAY,GAAE,6BAA6B,EAAO,EAClD,qBAAqB,CAAC,EAAE,MAAM,EAC9B,iBAAiB,GAAE,SAAS,eAAe,EAAO,EAClD,iBAAiB,GAAE,SAAS,MAAM,EAAO,EASzC;IAED,IAAI,QAAQ,IAAI,oBAAoB,CAEnC;IAED,wFAAsD;IACtD,IAAI,0BAA0B,IAAI,oBAAoB,CAAC,4BAA4B,CAAC,CAEnF;IAED,IAAI,OAAO,IAAI,YAAY,CAE1B;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,WAAW,IAAI,SAAS,6BAA6B,EAAE,CAE1D;IAED;;;;OAIG;IACH,IAAI,gBAAgB,IAAI,SAAS,MAAM,EAAE,CAExC;IAED,IAAI,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAE7C;IAED,IAAI,gBAAgB,IAAI,SAAS,eAAe,EAAE,CAEjD;IAED,gBAAgB,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAE/E;IAED;;;;;;;OAOG;IACH,0BAA0B,CAAC,uBAAuB,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAErE;YAEa,eAAe;IAS7B,OAAO,CAAC,KAAK;YASC,wBAAwB;IAShC,aAAa,CAClB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7D,GACC,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAejC;IAEK,UAAU,CAAC,OAAO,CAAC,EAAE;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7D,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CA8BlC;IAEK,IAAI,CACT,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;QAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,GACpG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAiFxD;IAED;;;;;OAKG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAsC9F;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAG7B;CACD;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC9C,aAAa,EAAE,gCAAgC,EAC/C,OAAO,EAAE;IACR,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,CAAC,EAAE,oBAAoB,CAAC;CACzC,GACC,OAAO,CAAC,mBAAmB,CAAC,CAY9B;AAED,OAAO,EACN,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,qCAAqC,EAC1C,KAAK,iCAAiC,EACtC,8BAA8B,EAC9B,0BAA0B,GAC1B,MAAM,6BAA6B,CAAC","sourcesContent":["import { constants, copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, parse, resolve } from \"node:path\";\nimport type { ImageContent, TextContent } from \"@agent-forge/ai/compat\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type { AgentTaskChildProfileV1 } from \"./extensions/public-api.ts\";\nimport { t } from \"./i18n/index.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport type { CreateAgentSessionResult, PluginRejection } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SessionStartMetadata } from \"./session-start.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\n/**\n * Fresh session-bound context passed to `withSession()` callbacks on\n * `newSession()`, `fork()`, and `switchSession()`. It targets the replacement\n * session: every call routes into the session that became current after the\n * replacement committed.\n */\nexport interface ReplacedSessionContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\t/**\n\t * 仅当工厂收到 `childProfile` 时存在:叶子会话的**可核验事实**(实际生效的工具面、\n\t * 模型、模式)。runner 侧 server 用它与请求档案比对后才允许任务起跑——\"要求了但\n\t * 没人能证明\"与\"没要求\"是同一风险。\n\t */\n\tchildFacts?: {\n\t\treadonly activeTools: readonly string[];\n\t\treadonly model?: {\n\t\t\treadonly provider: string;\n\t\t\treadonly id: string;\n\t\t\treadonly contextWindow: number;\n\t\t\treadonly maxTokens: number;\n\t\t\treadonly reasoning: boolean;\n\t\t};\n\t\treadonly capabilityMode: string;\n\t\t/** 叶子实际思考级别(档案请求了 thinkingLevel 时核验用)。 */\n\t\treadonly thinkingLevel?: string;\n\t\t/** 叶子实际生效的系统提示词追加段(档案请求了 systemPromptAppend 时核验用,已含方案 APPEND_SYSTEM.md 门控结果)。 */\n\t\treadonly systemPromptAppend?: string;\n\t};\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartMetadata;\n\t/**\n\t * 子任务档案(AgentTaskChildProfileV1):pooled runner 的叶子会话按它收窄\n\t * (tools/mode/thinkingLevel)。父会话创建路径不传该字段——档案只服务子任务。\n\t */\n\tchildProfile?: AgentTaskChildProfileV1;\n\t/**\n\t * 子代理通信面的宿主接线(D-060 S5 pooled parity):runner 叶子装配注入\n\t * post/drainInbox 闭包(身份绑定到叶子会话),叶子会话由此获得\n\t * escalate/兄弟消息工具。父会话创建路径不传该字段。\n\t */\n\tsubagentCommunicationWiring?: import(\"./sdk.ts\").CreateAgentSessionOptions[\"subagentCommunicationWiring\"];\n\t/**\n\t * 档案 model 的目标 id(D-060 pooled parity 补口):runner 侧把叶子会话模型\n\t * 解析到**自己的 scoped models**(档案不能把会话带到 runner 未授权的模型上),\n\t * 解析不到即失败并列出可用 id。父会话创建路径不传该字段。\n\t */\n\tchildModelId?: string;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(t(\"File not found: {path}\", { path: filePath }));\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/** Maps suite assembly findings onto the runtime diagnostic channel as info. */\nfunction toSuiteRuntimeDiagnostics(suiteDiagnostics: readonly string[]): AgentSessionRuntimeDiagnostic[] {\n\treturn suiteDiagnostics.map((message) => ({ type: \"info\" as const, message }));\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _suiteDiagnostics: readonly string[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate _pluginRejections: readonly PluginRejection[];\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\t_pluginRejections: readonly PluginRejection[] = [],\n\t\t_suiteDiagnostics: readonly string[] = [],\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._suiteDiagnostics = _suiteDiagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis._pluginRejections = _pluginRejections;\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\t/** /metrics 数据源共享 ref(observability 插件门面,空 = 未挂载)。 */\n\tget observabilityGetMetricsRef(): AgentSessionServices[\"observabilityGetMetricsRef\"] {\n\t\treturn this._services.observabilityGetMetricsRef;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn [...this._diagnostics, ...toSuiteRuntimeDiagnostics(this._suiteDiagnostics)];\n\t}\n\n\t/**\n\t * Suite assembly findings from the last runtime creation (initial,\n\t * /new, /fork, /switch). Surfaced as info-level entries on the\n\t * `diagnostics` channel.\n\t */\n\tget suiteDiagnostics(): readonly string[] {\n\t\treturn this._suiteDiagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget pluginRejections(): readonly PluginRejection[] {\n\t\treturn this._pluginRejections;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async teardownCurrent(_reason: \"new\" | \"resume\" | \"fork\", _targetSessionFile?: string): Promise<void> {\n\t\t// Settle any active response first so the aborted turn (including tool\n\t\t// results) is persisted to the outgoing session before it is replaced.\n\t\t// Internal teardown aborts deliberately skip the interruption marker.\n\t\tawait this.session._abortInternal();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._suiteDiagnostics = result.suiteDiagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis._pluginRejections = result.pluginRejections;\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tconst context = this.session.sessionManager.buildSessionContext().messages;\n\t\t\tif (this.session.contextStrategyName) {\n\t\t\t\tawait this.session.replaceContext(context);\n\t\t\t} else {\n\t\t\t\tthis.session.agent.state.messages = context;\n\t\t\t}\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(t(\"Invalid entry ID for forking\"));\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(t(\"Invalid entry ID for forking\"));\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(t(\"Persisted session is missing a session file\"));\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(t(\"This session has not been saved yet. Send a message before cloning or forking it.\"));\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.open(currentSessionFile, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(t(\"Failed to create forked session\"));\n\t\t\t}\n\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\tthis.apply(\n\t\t\t\tawait this.createRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager;\n\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tlet destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst sourceAlreadyStored = resolve(destinationPath) === resolvedPath;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tconst { name, ext } = parse(destinationPath);\n\t\t\tlet suffix = 1;\n\t\t\twhile (existsSync(destinationPath)) {\n\t\t\t\tdestinationPath = join(sessionDir, `${name}-${suffix++}${ext}`);\n\t\t\t}\n\t\t}\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath, constants.COPYFILE_EXCL);\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartMetadata;\n\t},\n): Promise<AgentSessionRuntime> {\n\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\tconst result = await createRuntime(options);\n\treturn new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\tresult.pluginRejections,\n\t\tresult.suiteDiagnostics,\n\t);\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
@@ -1,6 +1,7 @@
1
1
  import { constants, copyFileSync, existsSync, mkdirSync } from "node:fs";
2
2
  import { basename, join, parse, resolve } from "node:path";
3
3
  import { resolvePath } from "../utils/paths.js";
4
+ import { t } from "./i18n/index.js";
4
5
  import { assertSessionCwdExists } from "./session-cwd.js";
5
6
  import { SessionManager } from "./session-manager.js";
6
7
  /**
@@ -9,7 +10,7 @@ import { SessionManager } from "./session-manager.js";
9
10
  export class SessionImportFileNotFoundError extends Error {
10
11
  filePath;
11
12
  constructor(filePath) {
12
- super(`File not found: ${filePath}`);
13
+ super(t("File not found: {path}", { path: filePath }));
13
14
  this.name = "SessionImportFileNotFoundError";
14
15
  this.filePath = filePath;
15
16
  }
@@ -170,14 +171,14 @@ export class AgentSessionRuntime {
170
171
  let selectedText;
171
172
  const selectedEntry = this.session.sessionManager.getEntry(entryId);
172
173
  if (!selectedEntry) {
173
- throw new Error("Invalid entry ID for forking");
174
+ throw new Error(t("Invalid entry ID for forking"));
174
175
  }
175
176
  if (position === "at") {
176
177
  targetLeafId = selectedEntry.id;
177
178
  }
178
179
  else {
179
180
  if (selectedEntry.type !== "message" || selectedEntry.message.role !== "user") {
180
- throw new Error("Invalid entry ID for forking");
181
+ throw new Error(t("Invalid entry ID for forking"));
181
182
  }
182
183
  targetLeafId = selectedEntry.parentId;
183
184
  selectedText = extractUserMessageText(selectedEntry.message.content);
@@ -186,7 +187,7 @@ export class AgentSessionRuntime {
186
187
  if (this.session.sessionManager.isPersisted()) {
187
188
  const currentSessionFile = this.session.sessionFile;
188
189
  if (!currentSessionFile) {
189
- throw new Error("Persisted session is missing a session file");
190
+ throw new Error(t("Persisted session is missing a session file"));
190
191
  }
191
192
  const sessionDir = this.session.sessionManager.getSessionDir();
192
193
  if (!targetLeafId) {
@@ -203,12 +204,12 @@ export class AgentSessionRuntime {
203
204
  return { cancelled: false, selectedText };
204
205
  }
205
206
  if (!existsSync(currentSessionFile)) {
206
- throw new Error("This session has not been saved yet. Send a message before cloning or forking it.");
207
+ throw new Error(t("This session has not been saved yet. Send a message before cloning or forking it."));
207
208
  }
208
209
  const sessionManager = SessionManager.open(currentSessionFile, sessionDir);
209
210
  const forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);
210
211
  if (!forkedSessionPath) {
211
- throw new Error("Failed to create forked session");
212
+ throw new Error(t("Failed to create forked session"));
212
213
  }
213
214
  await this.teardownCurrent("fork", sessionManager.getSessionFile());
214
215
  this.apply(await this.createRuntime({
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-runtime.js","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants, copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, parse, resolve } from \"node:path\";\nimport type { ImageContent, TextContent } from \"@agent-forge/ai/compat\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type { AgentTaskChildProfileV1 } from \"./extensions/public-api.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport type { CreateAgentSessionResult, PluginRejection } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SessionStartMetadata } from \"./session-start.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\n/**\n * Fresh session-bound context passed to `withSession()` callbacks on\n * `newSession()`, `fork()`, and `switchSession()`. It targets the replacement\n * session: every call routes into the session that became current after the\n * replacement committed.\n */\nexport interface ReplacedSessionContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\t/**\n\t * 仅当工厂收到 `childProfile` 时存在:叶子会话的**可核验事实**(实际生效的工具面、\n\t * 模型、模式)。runner 侧 server 用它与请求档案比对后才允许任务起跑——\"要求了但\n\t * 没人能证明\"与\"没要求\"是同一风险。\n\t */\n\tchildFacts?: {\n\t\treadonly activeTools: readonly string[];\n\t\treadonly model?: {\n\t\t\treadonly provider: string;\n\t\t\treadonly id: string;\n\t\t\treadonly contextWindow: number;\n\t\t\treadonly maxTokens: number;\n\t\t\treadonly reasoning: boolean;\n\t\t};\n\t\treadonly capabilityMode: string;\n\t\t/** 叶子实际思考级别(档案请求了 thinkingLevel 时核验用)。 */\n\t\treadonly thinkingLevel?: string;\n\t\t/** 叶子实际生效的系统提示词追加段(档案请求了 systemPromptAppend 时核验用,已含方案 APPEND_SYSTEM.md 门控结果)。 */\n\t\treadonly systemPromptAppend?: string;\n\t};\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartMetadata;\n\t/**\n\t * 子任务档案(AgentTaskChildProfileV1):pooled runner 的叶子会话按它收窄\n\t * (tools/mode/thinkingLevel)。父会话创建路径不传该字段——档案只服务子任务。\n\t */\n\tchildProfile?: AgentTaskChildProfileV1;\n\t/**\n\t * 子代理通信面的宿主接线(D-060 S5 pooled parity):runner 叶子装配注入\n\t * post/drainInbox 闭包(身份绑定到叶子会话),叶子会话由此获得\n\t * escalate/兄弟消息工具。父会话创建路径不传该字段。\n\t */\n\tsubagentCommunicationWiring?: import(\"./sdk.ts\").CreateAgentSessionOptions[\"subagentCommunicationWiring\"];\n\t/**\n\t * 档案 model 的目标 id(D-060 pooled parity 补口):runner 侧把叶子会话模型\n\t * 解析到**自己的 scoped models**(档案不能把会话带到 runner 未授权的模型上),\n\t * 解析不到即失败并列出可用 id。父会话创建路径不传该字段。\n\t */\n\tchildModelId?: string;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/** Maps suite assembly findings onto the runtime diagnostic channel as info. */\nfunction toSuiteRuntimeDiagnostics(suiteDiagnostics: readonly string[]): AgentSessionRuntimeDiagnostic[] {\n\treturn suiteDiagnostics.map((message) => ({ type: \"info\" as const, message }));\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _suiteDiagnostics: readonly string[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate _pluginRejections: readonly PluginRejection[];\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\t_pluginRejections: readonly PluginRejection[] = [],\n\t\t_suiteDiagnostics: readonly string[] = [],\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._suiteDiagnostics = _suiteDiagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis._pluginRejections = _pluginRejections;\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\t/** /metrics 数据源共享 ref(observability 插件门面,空 = 未挂载)。 */\n\tget observabilityGetMetricsRef(): AgentSessionServices[\"observabilityGetMetricsRef\"] {\n\t\treturn this._services.observabilityGetMetricsRef;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn [...this._diagnostics, ...toSuiteRuntimeDiagnostics(this._suiteDiagnostics)];\n\t}\n\n\t/**\n\t * Suite assembly findings from the last runtime creation (initial,\n\t * /new, /fork, /switch). Surfaced as info-level entries on the\n\t * `diagnostics` channel.\n\t */\n\tget suiteDiagnostics(): readonly string[] {\n\t\treturn this._suiteDiagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget pluginRejections(): readonly PluginRejection[] {\n\t\treturn this._pluginRejections;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async teardownCurrent(_reason: \"new\" | \"resume\" | \"fork\", _targetSessionFile?: string): Promise<void> {\n\t\t// Settle any active response first so the aborted turn (including tool\n\t\t// results) is persisted to the outgoing session before it is replaced.\n\t\t// Internal teardown aborts deliberately skip the interruption marker.\n\t\tawait this.session._abortInternal();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._suiteDiagnostics = result.suiteDiagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis._pluginRejections = result.pluginRejections;\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tconst context = this.session.sessionManager.buildSessionContext().messages;\n\t\t\tif (this.session.contextStrategyName) {\n\t\t\t\tawait this.session.replaceContext(context);\n\t\t\t} else {\n\t\t\t\tthis.session.agent.state.messages = context;\n\t\t\t}\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(\"Persisted session is missing a session file\");\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(\"This session has not been saved yet. Send a message before cloning or forking it.\");\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.open(currentSessionFile, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t\t}\n\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\tthis.apply(\n\t\t\t\tawait this.createRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager;\n\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tlet destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst sourceAlreadyStored = resolve(destinationPath) === resolvedPath;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tconst { name, ext } = parse(destinationPath);\n\t\t\tlet suffix = 1;\n\t\t\twhile (existsSync(destinationPath)) {\n\t\t\t\tdestinationPath = join(sessionDir, `${name}-${suffix++}${ext}`);\n\t\t\t}\n\t\t}\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath, constants.COPYFILE_EXCL);\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartMetadata;\n\t},\n): Promise<AgentSessionRuntime> {\n\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\tconst result = await createRuntime(options);\n\treturn new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\tresult.pluginRejections,\n\t\tresult.suiteDiagnostics,\n\t);\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
1
+ {"version":3,"file":"agent-session-runtime.js","sourceRoot":"","sources":["../../src/core/agent-session-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants, copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, parse, resolve } from \"node:path\";\nimport type { ImageContent, TextContent } from \"@agent-forge/ai/compat\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { AgentSession } from \"./agent-session.ts\";\nimport type { AgentSessionRuntimeDiagnostic, AgentSessionServices } from \"./agent-session-services.ts\";\nimport type { AgentTaskChildProfileV1 } from \"./extensions/public-api.ts\";\nimport { t } from \"./i18n/index.ts\";\nimport type { CustomMessage } from \"./messages.ts\";\nimport type { CreateAgentSessionResult, PluginRejection } from \"./sdk.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport { SessionManager } from \"./session-manager.ts\";\nimport type { SessionStartMetadata } from \"./session-start.ts\";\n\n/**\n * Result returned by runtime creation.\n *\n * The caller gets the created session, its cwd-bound services, and all\n * diagnostics collected during setup.\n */\n/**\n * Fresh session-bound context passed to `withSession()` callbacks on\n * `newSession()`, `fork()`, and `switchSession()`. It targets the replacement\n * session: every call routes into the session that became current after the\n * replacement committed.\n */\nexport interface ReplacedSessionContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n\nexport interface CreateAgentSessionRuntimeResult extends CreateAgentSessionResult {\n\tservices: AgentSessionServices;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\t/**\n\t * 仅当工厂收到 `childProfile` 时存在:叶子会话的**可核验事实**(实际生效的工具面、\n\t * 模型、模式)。runner 侧 server 用它与请求档案比对后才允许任务起跑——\"要求了但\n\t * 没人能证明\"与\"没要求\"是同一风险。\n\t */\n\tchildFacts?: {\n\t\treadonly activeTools: readonly string[];\n\t\treadonly model?: {\n\t\t\treadonly provider: string;\n\t\t\treadonly id: string;\n\t\t\treadonly contextWindow: number;\n\t\t\treadonly maxTokens: number;\n\t\t\treadonly reasoning: boolean;\n\t\t};\n\t\treadonly capabilityMode: string;\n\t\t/** 叶子实际思考级别(档案请求了 thinkingLevel 时核验用)。 */\n\t\treadonly thinkingLevel?: string;\n\t\t/** 叶子实际生效的系统提示词追加段(档案请求了 systemPromptAppend 时核验用,已含方案 APPEND_SYSTEM.md 门控结果)。 */\n\t\treadonly systemPromptAppend?: string;\n\t};\n}\n\n/**\n * Creates a full runtime for a target cwd and session manager.\n *\n * The factory closes over process-global fixed inputs, recreates cwd-bound\n * services for the effective cwd, resolves session options against those\n * services, and finally creates the AgentSession.\n */\nexport type CreateAgentSessionRuntimeFactory = (options: {\n\tcwd: string;\n\tagentDir: string;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartMetadata;\n\t/**\n\t * 子任务档案(AgentTaskChildProfileV1):pooled runner 的叶子会话按它收窄\n\t * (tools/mode/thinkingLevel)。父会话创建路径不传该字段——档案只服务子任务。\n\t */\n\tchildProfile?: AgentTaskChildProfileV1;\n\t/**\n\t * 子代理通信面的宿主接线(D-060 S5 pooled parity):runner 叶子装配注入\n\t * post/drainInbox 闭包(身份绑定到叶子会话),叶子会话由此获得\n\t * escalate/兄弟消息工具。父会话创建路径不传该字段。\n\t */\n\tsubagentCommunicationWiring?: import(\"./sdk.ts\").CreateAgentSessionOptions[\"subagentCommunicationWiring\"];\n\t/**\n\t * 档案 model 的目标 id(D-060 pooled parity 补口):runner 侧把叶子会话模型\n\t * 解析到**自己的 scoped models**(档案不能把会话带到 runner 未授权的模型上),\n\t * 解析不到即失败并列出可用 id。父会话创建路径不传该字段。\n\t */\n\tchildModelId?: string;\n}) => Promise<CreateAgentSessionRuntimeResult>;\n\n/**\n * Thrown when /import references a JSONL file path that does not exist.\n */\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(t(\"File not found: {path}\", { path: filePath }));\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\n/** Maps suite assembly findings onto the runtime diagnostic channel as info. */\nfunction toSuiteRuntimeDiagnostics(suiteDiagnostics: readonly string[]): AgentSessionRuntimeDiagnostic[] {\n\treturn suiteDiagnostics.map((message) => ({ type: \"info\" as const, message }));\n}\n\n/**\n * Owns the current AgentSession plus its cwd-bound services.\n *\n * Session replacement methods tear down the current runtime first, then create\n * and apply the next runtime. If creation fails, the error is propagated to the\n * caller. The caller is responsible for user-facing error handling.\n */\nexport class AgentSessionRuntime {\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\tprivate _session: AgentSession;\n\tprivate _services: AgentSessionServices;\n\tprivate readonly createRuntime: CreateAgentSessionRuntimeFactory;\n\tprivate _diagnostics: AgentSessionRuntimeDiagnostic[];\n\tprivate _suiteDiagnostics: readonly string[];\n\tprivate _modelFallbackMessage?: string;\n\tprivate _pluginRejections: readonly PluginRejection[];\n\n\tconstructor(\n\t\t_session: AgentSession,\n\t\t_services: AgentSessionServices,\n\t\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\t\t_diagnostics: AgentSessionRuntimeDiagnostic[] = [],\n\t\t_modelFallbackMessage?: string,\n\t\t_pluginRejections: readonly PluginRejection[] = [],\n\t\t_suiteDiagnostics: readonly string[] = [],\n\t) {\n\t\tthis._session = _session;\n\t\tthis._services = _services;\n\t\tthis.createRuntime = createRuntime;\n\t\tthis._diagnostics = _diagnostics;\n\t\tthis._suiteDiagnostics = _suiteDiagnostics;\n\t\tthis._modelFallbackMessage = _modelFallbackMessage;\n\t\tthis._pluginRejections = _pluginRejections;\n\t}\n\n\tget services(): AgentSessionServices {\n\t\treturn this._services;\n\t}\n\n\t/** /metrics 数据源共享 ref(observability 插件门面,空 = 未挂载)。 */\n\tget observabilityGetMetricsRef(): AgentSessionServices[\"observabilityGetMetricsRef\"] {\n\t\treturn this._services.observabilityGetMetricsRef;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this._session;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services.cwd;\n\t}\n\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn [...this._diagnostics, ...toSuiteRuntimeDiagnostics(this._suiteDiagnostics)];\n\t}\n\n\t/**\n\t * Suite assembly findings from the last runtime creation (initial,\n\t * /new, /fork, /switch). Surfaced as info-level entries on the\n\t * `diagnostics` channel.\n\t */\n\tget suiteDiagnostics(): readonly string[] {\n\t\treturn this._suiteDiagnostics;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget pluginRejections(): readonly PluginRejection[] {\n\t\treturn this._pluginRejections;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\t/**\n\t * Set a synchronous callback that runs after `session_shutdown` handlers finish\n\t * but before the current session is invalidated.\n\t *\n\t * This is for host-owned UI teardown that must not yield to the event loop,\n\t * such as detaching extension-provided TUI components before the old extension\n\t * context becomes stale.\n\t */\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async teardownCurrent(_reason: \"new\" | \"resume\" | \"fork\", _targetSessionFile?: string): Promise<void> {\n\t\t// Settle any active response first so the aborted turn (including tool\n\t\t// results) is persisted to the outgoing session before it is replaced.\n\t\t// Internal teardown aborts deliberately skip the interruption marker.\n\t\tawait this.session._abortInternal();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n\n\tprivate apply(result: CreateAgentSessionRuntimeResult): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._suiteDiagnostics = result.suiteDiagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t\tthis._pluginRejections = result.pluginRejections;\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionManager = SessionManager.open(sessionPath, undefined, options?.cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tconst sessionManager = this.session.sessionManager.isPersisted()\n\t\t\t? SessionManager.create(this.cwd, sessionDir)\n\t\t\t: SessionManager.inMemory(this.cwd);\n\t\tif (options?.parentSession) {\n\t\t\tsessionManager.newSession({ parentSession: options.parentSession });\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"new\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.sessionManager);\n\t\t\tconst context = this.session.sessionManager.buildSessionContext().messages;\n\t\t\tif (this.session.contextStrategyName) {\n\t\t\t\tawait this.session.replaceContext(context);\n\t\t\t} else {\n\t\t\t\tthis.session.agent.state.messages = context;\n\t\t\t}\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.sessionManager.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(t(\"Invalid entry ID for forking\"));\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(t(\"Invalid entry ID for forking\"));\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (this.session.sessionManager.isPersisted()) {\n\t\t\tconst currentSessionFile = this.session.sessionFile;\n\t\t\tif (!currentSessionFile) {\n\t\t\t\tthrow new Error(t(\"Persisted session is missing a session file\"));\n\t\t\t}\n\t\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\t\tif (!targetLeafId) {\n\t\t\t\tconst sessionManager = SessionManager.create(this.cwd, sessionDir);\n\t\t\t\tsessionManager.newSession({ parentSession: currentSessionFile });\n\t\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\t\tthis.apply(\n\t\t\t\t\tawait this.createRuntime({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\t\treturn { cancelled: false, selectedText };\n\t\t\t}\n\n\t\t\tif (!existsSync(currentSessionFile)) {\n\t\t\t\tthrow new Error(t(\"This session has not been saved yet. Send a message before cloning or forking it.\"));\n\t\t\t}\n\t\t\tconst sessionManager = SessionManager.open(currentSessionFile, sessionDir);\n\t\t\tconst forkedSessionPath = sessionManager.createBranchedSession(targetLeafId);\n\t\t\tif (!forkedSessionPath) {\n\t\t\t\tthrow new Error(t(\"Failed to create forked session\"));\n\t\t\t}\n\t\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\t\tthis.apply(\n\t\t\t\tawait this.createRuntime({\n\t\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\t\tsessionManager,\n\t\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\t\treturn { cancelled: false, selectedText };\n\t\t}\n\n\t\tconst sessionManager = this.session.sessionManager;\n\t\tawait this.teardownCurrent(\"fork\", sessionManager.getSessionFile());\n\t\tif (!targetLeafId) {\n\t\t\tsessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tsessionManager.createBranchedSession(targetLeafId);\n\t\t}\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"fork\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\t/**\n\t * Import a session JSONL file and switch runtime state to the imported session.\n\t *\n\t * @throws {SessionImportFileNotFoundError} When the input path does not exist.\n\t * @throws {MissingSessionCwdError} When the imported session cwd cannot be resolved and no override is provided.\n\t */\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolvePath(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst sessionDir = this.session.sessionManager.getSessionDir();\n\t\tif (!existsSync(sessionDir)) {\n\t\t\tmkdirSync(sessionDir, { recursive: true });\n\t\t}\n\n\t\tlet destinationPath = join(sessionDir, basename(resolvedPath));\n\t\tconst sourceAlreadyStored = resolve(destinationPath) === resolvedPath;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tconst { name, ext } = parse(destinationPath);\n\t\t\tlet suffix = 1;\n\t\t\twhile (existsSync(destinationPath)) {\n\t\t\t\tdestinationPath = join(sessionDir, `${name}-${suffix++}${ext}`);\n\t\t\t}\n\t\t}\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tif (!sourceAlreadyStored) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath, constants.COPYFILE_EXCL);\n\t\t}\n\n\t\tconst sessionManager = SessionManager.open(destinationPath, sessionDir, cwdOverride);\n\t\tassertSessionCwdExists(sessionManager, this.cwd);\n\t\tawait this.teardownCurrent(\"resume\", sessionManager.getSessionFile());\n\t\tthis.apply(\n\t\t\tawait this.createRuntime({\n\t\t\t\tcwd: sessionManager.getCwd(),\n\t\t\t\tagentDir: this.services.agentDir,\n\t\t\t\tsessionManager,\n\t\t\t\tsessionStartEvent: { reason: \"resume\", previousSessionFile },\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tthis.beforeSessionInvalidate?.();\n\t\tawait this.session.dispose();\n\t}\n}\n\n/**\n * Create the initial runtime from a runtime factory and initial session target.\n *\n * The same factory is stored on the returned AgentSessionRuntime and reused for\n * later /new, /resume, /fork, and import flows.\n */\nexport async function createAgentSessionRuntime(\n\tcreateRuntime: CreateAgentSessionRuntimeFactory,\n\toptions: {\n\t\tcwd: string;\n\t\tagentDir: string;\n\t\tsessionManager: SessionManager;\n\t\tsessionStartEvent?: SessionStartMetadata;\n\t},\n): Promise<AgentSessionRuntime> {\n\tassertSessionCwdExists(options.sessionManager, options.cwd);\n\tconst result = await createRuntime(options);\n\treturn new AgentSessionRuntime(\n\t\tresult.session,\n\t\tresult.services,\n\t\tcreateRuntime,\n\t\tresult.diagnostics,\n\t\tresult.modelFallbackMessage,\n\t\tresult.pluginRejections,\n\t\tresult.suiteDiagnostics,\n\t);\n}\n\nexport {\n\ttype AgentSessionRuntimeDiagnostic,\n\ttype AgentSessionServices,\n\ttype CreateAgentSessionFromServicesOptions,\n\ttype CreateAgentSessionServicesOptions,\n\tcreateAgentSessionFromServices,\n\tcreateAgentSessionServices,\n} from \"./agent-session-services.ts\";\n"]}
@@ -47,7 +47,7 @@ export interface CreateAgentSessionServicesOptions {
47
47
  resourceLoaderReloadOptions?: ResourceLoaderReloadOptions;
48
48
  /**
49
49
  * Explicit suite id (highest resolution priority, 设计 §9). Without it the
50
- * suite resolves via AGENT_FORGE_SUITE, then settings, then "assistant".
50
+ * suite resolves via AGENT_FORGE_SUITE, then settings, then "coding".
51
51
  */
52
52
  suite?: string;
53
53
  /**