@ai-agent-forge/agent-forge 0.86.6 → 0.87.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 (665) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +8 -9
  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 +410 -371
  7. package/dist/bundle/chunks/{chunk-A7GUOX2H.js → chunk-6ZKDNZHA.js} +5 -1
  8. package/dist/bundle/chunks/chunk-BFC2BDVJ.js +13 -0
  9. package/dist/bundle/chunks/chunk-MOHOLL3F.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 +3 -2
  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 +2 -1
  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.map +1 -1
  54. package/dist/core/agent-session-compaction.js +28 -22
  55. package/dist/core/agent-session-compaction.js.map +1 -1
  56. package/dist/core/agent-session-context.d.ts.map +1 -1
  57. package/dist/core/agent-session-context.js +18 -13
  58. package/dist/core/agent-session-context.js.map +1 -1
  59. package/dist/core/agent-session-model.d.ts.map +1 -1
  60. package/dist/core/agent-session-model.js +2 -1
  61. package/dist/core/agent-session-model.js.map +1 -1
  62. package/dist/core/agent-session-retry.d.ts.map +1 -1
  63. package/dist/core/agent-session-retry.js +3 -2
  64. package/dist/core/agent-session-retry.js.map +1 -1
  65. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  66. package/dist/core/agent-session-runtime.js +7 -6
  67. package/dist/core/agent-session-runtime.js.map +1 -1
  68. package/dist/core/agent-session-services.d.ts +1 -1
  69. package/dist/core/agent-session-services.d.ts.map +1 -1
  70. package/dist/core/agent-session-services.js.map +1 -1
  71. package/dist/core/agent-session-tools.d.ts.map +1 -1
  72. package/dist/core/agent-session-tools.js +3 -2
  73. package/dist/core/agent-session-tools.js.map +1 -1
  74. package/dist/core/agent-session.d.ts +40 -2
  75. package/dist/core/agent-session.d.ts.map +1 -1
  76. package/dist/core/agent-session.js +142 -34
  77. package/dist/core/agent-session.js.map +1 -1
  78. package/dist/core/auth-guidance.d.ts.map +1 -1
  79. package/dist/core/auth-guidance.js +11 -5
  80. package/dist/core/auth-guidance.js.map +1 -1
  81. package/dist/core/auth-storage.d.ts.map +1 -1
  82. package/dist/core/auth-storage.js +9 -6
  83. package/dist/core/auth-storage.js.map +1 -1
  84. package/dist/core/compaction/compaction.d.ts.map +1 -1
  85. package/dist/core/compaction/compaction.js +2 -1
  86. package/dist/core/compaction/compaction.js.map +1 -1
  87. package/dist/core/embedded-sdk.d.ts.map +1 -1
  88. package/dist/core/embedded-sdk.js +10 -6
  89. package/dist/core/embedded-sdk.js.map +1 -1
  90. package/dist/core/export-html/index.d.ts.map +1 -1
  91. package/dist/core/export-html/index.js +9 -4
  92. package/dist/core/export-html/index.js.map +1 -1
  93. package/dist/core/extensions/agent-composition.d.ts.map +1 -1
  94. package/dist/core/extensions/agent-composition.js +26 -19
  95. package/dist/core/extensions/agent-composition.js.map +1 -1
  96. package/dist/core/extensions/bootstrap-agent-loop.d.ts.map +1 -1
  97. package/dist/core/extensions/bootstrap-agent-loop.js +3 -2
  98. package/dist/core/extensions/bootstrap-agent-loop.js.map +1 -1
  99. package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -1
  100. package/dist/core/extensions/bootstrap-lifecycle.js +20 -17
  101. package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -1
  102. package/dist/core/extensions/bootstrap-overflow-policy.d.ts.map +1 -1
  103. package/dist/core/extensions/bootstrap-overflow-policy.js +2 -1
  104. package/dist/core/extensions/bootstrap-overflow-policy.js.map +1 -1
  105. package/dist/core/extensions/bootstrap-retry-policy.d.ts.map +1 -1
  106. package/dist/core/extensions/bootstrap-retry-policy.js +2 -1
  107. package/dist/core/extensions/bootstrap-retry-policy.js.map +1 -1
  108. package/dist/core/extensions/bootstrap-skills.d.ts.map +1 -1
  109. package/dist/core/extensions/bootstrap-skills.js +7 -6
  110. package/dist/core/extensions/bootstrap-skills.js.map +1 -1
  111. package/dist/core/extensions/bootstrap-tools.d.ts.map +1 -1
  112. package/dist/core/extensions/bootstrap-tools.js +2 -1
  113. package/dist/core/extensions/bootstrap-tools.js.map +1 -1
  114. package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
  115. package/dist/core/extensions/capability-plugin.js +37 -13
  116. package/dist/core/extensions/capability-plugin.js.map +1 -1
  117. package/dist/core/extensions/capability-runtime-events.d.ts.map +1 -1
  118. package/dist/core/extensions/capability-runtime-events.js +17 -13
  119. package/dist/core/extensions/capability-runtime-events.js.map +1 -1
  120. package/dist/core/extensions/capability-runtime-guards.d.ts.map +1 -1
  121. package/dist/core/extensions/capability-runtime-guards.js +16 -15
  122. package/dist/core/extensions/capability-runtime-guards.js.map +1 -1
  123. package/dist/core/extensions/capability-runtime-manifest.d.ts.map +1 -1
  124. package/dist/core/extensions/capability-runtime-manifest.js +52 -30
  125. package/dist/core/extensions/capability-runtime-manifest.js.map +1 -1
  126. package/dist/core/extensions/capability-runtime-validation.d.ts.map +1 -1
  127. package/dist/core/extensions/capability-runtime-validation.js +66 -65
  128. package/dist/core/extensions/capability-runtime-validation.js.map +1 -1
  129. package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
  130. package/dist/core/extensions/capability-runtime.js +147 -127
  131. package/dist/core/extensions/capability-runtime.js.map +1 -1
  132. package/dist/core/extensions/compaction-memory-failure-mode.d.ts.map +1 -1
  133. package/dist/core/extensions/compaction-memory-failure-mode.js +3 -2
  134. package/dist/core/extensions/compaction-memory-failure-mode.js.map +1 -1
  135. package/dist/core/extensions/context-strategy-binding.d.ts.map +1 -1
  136. package/dist/core/extensions/context-strategy-binding.js +7 -4
  137. package/dist/core/extensions/context-strategy-binding.js.map +1 -1
  138. package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -1
  139. package/dist/core/extensions/lifecycle-catalog.js +290 -279
  140. package/dist/core/extensions/lifecycle-catalog.js.map +1 -1
  141. package/dist/core/extensions/lifecycle-delivery-queue.d.ts.map +1 -1
  142. package/dist/core/extensions/lifecycle-delivery-queue.js +3 -2
  143. package/dist/core/extensions/lifecycle-delivery-queue.js.map +1 -1
  144. package/dist/core/facade/coding-agent-facade.d.ts +6 -0
  145. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  146. package/dist/core/facade/coding-agent-facade.js +2 -0
  147. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  148. package/dist/core/http-dispatcher.d.ts.map +1 -1
  149. package/dist/core/http-dispatcher.js +2 -1
  150. package/dist/core/http-dispatcher.js.map +1 -1
  151. package/dist/core/i18n/index.d.ts +14 -0
  152. package/dist/core/i18n/index.d.ts.map +1 -0
  153. package/dist/core/i18n/index.js +67 -0
  154. package/dist/core/i18n/index.js.map +1 -0
  155. package/dist/core/i18n/locales/en/example.d.ts +7 -0
  156. package/dist/core/i18n/locales/en/example.d.ts.map +1 -0
  157. package/dist/core/i18n/locales/en/example.js +7 -0
  158. package/dist/core/i18n/locales/en/example.js.map +1 -0
  159. package/dist/core/i18n/locales/zh-cn/cli.d.ts +8 -0
  160. package/dist/core/i18n/locales/zh-cn/cli.d.ts.map +1 -0
  161. package/dist/core/i18n/locales/zh-cn/cli.js +227 -0
  162. package/dist/core/i18n/locales/zh-cn/cli.js.map +1 -0
  163. package/dist/core/i18n/locales/zh-cn/common.d.ts +6 -0
  164. package/dist/core/i18n/locales/zh-cn/common.d.ts.map +1 -0
  165. package/dist/core/i18n/locales/zh-cn/common.js +6 -0
  166. package/dist/core/i18n/locales/zh-cn/common.js.map +1 -0
  167. package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts +13 -0
  168. package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts.map +1 -0
  169. package/dist/core/i18n/locales/zh-cn/core-contract-core.js +173 -0
  170. package/dist/core/i18n/locales/zh-cn/core-contract-core.js.map +1 -0
  171. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts +12 -0
  172. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts.map +1 -0
  173. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js +582 -0
  174. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js.map +1 -0
  175. package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts +9 -0
  176. package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts.map +1 -0
  177. package/dist/core/i18n/locales/zh-cn/core-contract-final.js +55 -0
  178. package/dist/core/i18n/locales/zh-cn/core-contract-final.js.map +1 -0
  179. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts +11 -0
  180. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts.map +1 -0
  181. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js +455 -0
  182. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js.map +1 -0
  183. package/dist/core/i18n/locales/zh-cn/core-errors.d.ts +9 -0
  184. package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -0
  185. package/dist/core/i18n/locales/zh-cn/core-errors.js +191 -0
  186. package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -0
  187. package/dist/core/i18n/locales/zh-cn/example.d.ts +7 -0
  188. package/dist/core/i18n/locales/zh-cn/example.d.ts.map +1 -0
  189. package/dist/core/i18n/locales/zh-cn/example.js +10 -0
  190. package/dist/core/i18n/locales/zh-cn/example.js.map +1 -0
  191. package/dist/core/i18n/locales/zh-cn/index.d.ts +2 -0
  192. package/dist/core/i18n/locales/zh-cn/index.d.ts.map +1 -0
  193. package/dist/core/i18n/locales/zh-cn/index.js +41 -0
  194. package/dist/core/i18n/locales/zh-cn/index.js.map +1 -0
  195. package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts +10 -0
  196. package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts.map +1 -0
  197. package/dist/core/i18n/locales/zh-cn/interactive-mode.js +265 -0
  198. package/dist/core/i18n/locales/zh-cn/interactive-mode.js.map +1 -0
  199. package/dist/core/i18n/locales/zh-cn/keybindings.d.ts +11 -0
  200. package/dist/core/i18n/locales/zh-cn/keybindings.d.ts.map +1 -0
  201. package/dist/core/i18n/locales/zh-cn/keybindings.js +67 -0
  202. package/dist/core/i18n/locales/zh-cn/keybindings.js.map +1 -0
  203. package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts +7 -0
  204. package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts.map +1 -0
  205. package/dist/core/i18n/locales/zh-cn/slash-commands.js +39 -0
  206. package/dist/core/i18n/locales/zh-cn/slash-commands.js.map +1 -0
  207. package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts +10 -0
  208. package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts.map +1 -0
  209. package/dist/core/i18n/locales/zh-cn/tui-builtin.js +15 -0
  210. package/dist/core/i18n/locales/zh-cn/tui-builtin.js.map +1 -0
  211. package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts +13 -0
  212. package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts.map +1 -0
  213. package/dist/core/i18n/locales/zh-cn/tui-components-misc.js +102 -0
  214. package/dist/core/i18n/locales/zh-cn/tui-components-misc.js.map +1 -0
  215. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts +12 -0
  216. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts.map +1 -0
  217. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js +288 -0
  218. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js.map +1 -0
  219. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts +9 -0
  220. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts.map +1 -0
  221. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js +79 -0
  222. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js.map +1 -0
  223. package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts +8 -0
  224. package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts.map +1 -0
  225. package/dist/core/i18n/locales/zh-cn/tui-self-owned.js +72 -0
  226. package/dist/core/i18n/locales/zh-cn/tui-self-owned.js.map +1 -0
  227. package/dist/core/keybindings.d.ts +15 -0
  228. package/dist/core/keybindings.d.ts.map +1 -1
  229. package/dist/core/keybindings.js +18 -0
  230. package/dist/core/keybindings.js.map +1 -1
  231. package/dist/core/logger.d.ts.map +1 -1
  232. package/dist/core/logger.js +5 -1
  233. package/dist/core/logger.js.map +1 -1
  234. package/dist/core/model-registry.d.ts.map +1 -1
  235. package/dist/core/model-registry.js +2 -1
  236. package/dist/core/model-registry.js.map +1 -1
  237. package/dist/core/model-runtime.d.ts.map +1 -1
  238. package/dist/core/model-runtime.js +8 -4
  239. package/dist/core/model-runtime.js.map +1 -1
  240. package/dist/core/package-install-host.d.ts.map +1 -1
  241. package/dist/core/package-install-host.js +4 -3
  242. package/dist/core/package-install-host.js.map +1 -1
  243. package/dist/core/package-manager.d.ts.map +1 -1
  244. package/dist/core/package-manager.js +15 -10
  245. package/dist/core/package-manager.js.map +1 -1
  246. package/dist/core/package-resource-collection.d.ts.map +1 -1
  247. package/dist/core/package-resource-collection.js +2 -1
  248. package/dist/core/package-resource-collection.js.map +1 -1
  249. package/dist/core/package-source.d.ts.map +1 -1
  250. package/dist/core/package-source.js +3 -2
  251. package/dist/core/package-source.js.map +1 -1
  252. package/dist/core/provider-composer.d.ts.map +1 -1
  253. package/dist/core/provider-composer.js +22 -13
  254. package/dist/core/provider-composer.js.map +1 -1
  255. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  256. package/dist/core/remote-catalog-provider.js +6 -2
  257. package/dist/core/remote-catalog-provider.js.map +1 -1
  258. package/dist/core/resolve-config-value.d.ts.map +1 -1
  259. package/dist/core/resolve-config-value.js +15 -5
  260. package/dist/core/resolve-config-value.js.map +1 -1
  261. package/dist/core/sdk.d.ts +19 -5
  262. package/dist/core/sdk.d.ts.map +1 -1
  263. package/dist/core/sdk.js +74 -54
  264. package/dist/core/sdk.js.map +1 -1
  265. package/dist/core/session-cwd.d.ts.map +1 -1
  266. package/dist/core/session-cwd.js +5 -2
  267. package/dist/core/session-cwd.js.map +1 -1
  268. package/dist/core/session-export.d.ts.map +1 -1
  269. package/dist/core/session-export.js +2 -1
  270. package/dist/core/session-export.js.map +1 -1
  271. package/dist/core/session-manager.d.ts.map +1 -1
  272. package/dist/core/session-manager.js +39 -29
  273. package/dist/core/session-manager.js.map +1 -1
  274. package/dist/core/session-storage.d.ts.map +1 -1
  275. package/dist/core/session-storage.js +3 -3
  276. package/dist/core/session-storage.js.map +1 -1
  277. package/dist/core/settings-manager.d.ts +11 -0
  278. package/dist/core/settings-manager.d.ts.map +1 -1
  279. package/dist/core/settings-manager.js +27 -5
  280. package/dist/core/settings-manager.js.map +1 -1
  281. package/dist/core/slash-commands.d.ts.map +1 -1
  282. package/dist/core/slash-commands.js +53 -32
  283. package/dist/core/slash-commands.js.map +1 -1
  284. package/dist/core/system-prompt.d.ts.map +1 -1
  285. package/dist/core/system-prompt.js +25 -2
  286. package/dist/core/system-prompt.js.map +1 -1
  287. package/dist/core/tools/bash.d.ts.map +1 -1
  288. package/dist/core/tools/bash.js +11 -7
  289. package/dist/core/tools/bash.js.map +1 -1
  290. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  291. package/dist/core/tools/edit-diff.js +9 -4
  292. package/dist/core/tools/edit-diff.js.map +1 -1
  293. package/dist/core/tools/edit.d.ts.map +1 -1
  294. package/dist/core/tools/edit.js +4 -3
  295. package/dist/core/tools/edit.js.map +1 -1
  296. package/dist/core/tools/index.d.ts.map +1 -1
  297. package/dist/core/tools/index.js +3 -2
  298. package/dist/core/tools/index.js.map +1 -1
  299. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  300. package/dist/core/tools/output-accumulator.js +2 -1
  301. package/dist/core/tools/output-accumulator.js.map +1 -1
  302. package/dist/core/tools/read.d.ts.map +1 -1
  303. package/dist/core/tools/read.js +6 -2
  304. package/dist/core/tools/read.js.map +1 -1
  305. package/dist/core/tools/write.d.ts.map +1 -1
  306. package/dist/core/tools/write.js +2 -1
  307. package/dist/core/tools/write.js.map +1 -1
  308. package/dist/durable/durable-service.d.ts.map +1 -1
  309. package/dist/durable/durable-service.js +25 -18
  310. package/dist/durable/durable-service.js.map +1 -1
  311. package/dist/host/checkpoint-commit.d.ts.map +1 -1
  312. package/dist/host/checkpoint-commit.js +2 -1
  313. package/dist/host/checkpoint-commit.js.map +1 -1
  314. package/dist/host/manual-compaction.d.ts.map +1 -1
  315. package/dist/host/manual-compaction.js +2 -1
  316. package/dist/host/manual-compaction.js.map +1 -1
  317. package/dist/host/output-projection.d.ts +0 -13
  318. package/dist/host/output-projection.d.ts.map +1 -1
  319. package/dist/host/output-projection.js +16 -2
  320. package/dist/host/output-projection.js.map +1 -1
  321. package/dist/host/summary-retry.d.ts.map +1 -1
  322. package/dist/host/summary-retry.js +3 -2
  323. package/dist/host/summary-retry.js.map +1 -1
  324. package/dist/main.d.ts.map +1 -1
  325. package/dist/main.js +94 -58
  326. package/dist/main.js.map +1 -1
  327. package/dist/modes/interactive/components/agents-view.d.ts.map +1 -1
  328. package/dist/modes/interactive/components/agents-view.js +18 -15
  329. package/dist/modes/interactive/components/agents-view.js.map +1 -1
  330. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  331. package/dist/modes/interactive/components/assistant-message.js +6 -5
  332. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  333. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  334. package/dist/modes/interactive/components/bash-execution.js +12 -7
  335. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  336. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  337. package/dist/modes/interactive/components/bordered-loader.js +2 -1
  338. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  339. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  340. package/dist/modes/interactive/components/branch-summary-message.js +6 -5
  341. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  342. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  343. package/dist/modes/interactive/components/compaction-summary-message.js +9 -5
  344. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  345. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  346. package/dist/modes/interactive/components/config-selector.js +18 -15
  347. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  348. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  349. package/dist/modes/interactive/components/custom-entry.js +2 -1
  350. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  351. package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -1
  352. package/dist/modes/interactive/components/dialog-editor.js +5 -4
  353. package/dist/modes/interactive/components/dialog-editor.js.map +1 -1
  354. package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -1
  355. package/dist/modes/interactive/components/dialog-input.js +2 -1
  356. package/dist/modes/interactive/components/dialog-input.js.map +1 -1
  357. package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -1
  358. package/dist/modes/interactive/components/dialog-selector.js +4 -3
  359. package/dist/modes/interactive/components/dialog-selector.js.map +1 -1
  360. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  361. package/dist/modes/interactive/components/first-time-setup.js +11 -10
  362. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  363. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/footer.js +7 -4
  365. package/dist/modes/interactive/components/footer.js.map +1 -1
  366. package/dist/modes/interactive/components/index.d.ts +1 -0
  367. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  368. package/dist/modes/interactive/components/index.js +1 -0
  369. package/dist/modes/interactive/components/index.js.map +1 -1
  370. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  371. package/dist/modes/interactive/components/keybinding-hints.js +3 -2
  372. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  373. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  374. package/dist/modes/interactive/components/login-dialog.js +12 -11
  375. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  376. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  377. package/dist/modes/interactive/components/mermaid.js +6 -2
  378. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  379. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  380. package/dist/modes/interactive/components/model-selector.js +28 -16
  381. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  382. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  383. package/dist/modes/interactive/components/oauth-selector.js +10 -9
  384. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  385. package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/plugin-manager-entry.js +22 -13
  387. package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -1
  388. package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -1
  389. package/dist/modes/interactive/components/plugin-selection-entry.js +27 -12
  390. package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -1
  391. package/dist/modes/interactive/components/queue-manager-selector.d.ts +60 -0
  392. package/dist/modes/interactive/components/queue-manager-selector.d.ts.map +1 -0
  393. package/dist/modes/interactive/components/queue-manager-selector.js +166 -0
  394. package/dist/modes/interactive/components/queue-manager-selector.js.map +1 -0
  395. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  396. package/dist/modes/interactive/components/scoped-models-selector.js +16 -14
  397. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  398. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  399. package/dist/modes/interactive/components/session-selector.js +43 -31
  400. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  401. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  402. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  403. package/dist/modes/interactive/components/settings-selector.js +113 -96
  404. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  405. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  406. package/dist/modes/interactive/components/settings-submenu.js +5 -4
  407. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  408. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  409. package/dist/modes/interactive/components/show-images-selector.js +3 -2
  410. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  411. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  412. package/dist/modes/interactive/components/skill-invocation-message.js +4 -3
  413. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  414. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  415. package/dist/modes/interactive/components/status-indicator.js +14 -5
  416. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  417. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  418. package/dist/modes/interactive/components/theme-selector.js +2 -1
  419. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  420. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  421. package/dist/modes/interactive/components/thinking-selector.js +11 -4
  422. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  423. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  424. package/dist/modes/interactive/components/tool-execution.js +8 -3
  425. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  426. package/dist/modes/interactive/components/tree-list.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/tree-list.js +7 -6
  428. package/dist/modes/interactive/components/tree-list.js.map +1 -1
  429. package/dist/modes/interactive/components/tree-render.d.ts.map +1 -1
  430. package/dist/modes/interactive/components/tree-render.js +28 -23
  431. package/dist/modes/interactive/components/tree-render.js.map +1 -1
  432. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  433. package/dist/modes/interactive/components/tree-selector.js +9 -7
  434. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  435. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  436. package/dist/modes/interactive/components/user-message-selector.js +5 -4
  437. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  438. package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -1
  439. package/dist/modes/interactive/components/workflow-view.js +36 -21
  440. package/dist/modes/interactive/components/workflow-view.js.map +1 -1
  441. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  442. package/dist/modes/interactive/external-editor.js +2 -1
  443. package/dist/modes/interactive/external-editor.js.map +1 -1
  444. package/dist/modes/interactive/interactive-auth.d.ts.map +1 -1
  445. package/dist/modes/interactive/interactive-auth.js +71 -40
  446. package/dist/modes/interactive/interactive-auth.js.map +1 -1
  447. package/dist/modes/interactive/interactive-commands.d.ts +1 -0
  448. package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
  449. package/dist/modes/interactive/interactive-commands.js +3 -0
  450. package/dist/modes/interactive/interactive-commands.js.map +1 -1
  451. package/dist/modes/interactive/interactive-dialog-ui.d.ts.map +1 -1
  452. package/dist/modes/interactive/interactive-dialog-ui.js +5 -5
  453. package/dist/modes/interactive/interactive-dialog-ui.js.map +1 -1
  454. package/dist/modes/interactive/interactive-format.d.ts.map +1 -1
  455. package/dist/modes/interactive/interactive-format.js +34 -18
  456. package/dist/modes/interactive/interactive-format.js.map +1 -1
  457. package/dist/modes/interactive/interactive-helpers.d.ts.map +1 -1
  458. package/dist/modes/interactive/interactive-helpers.js +7 -2
  459. package/dist/modes/interactive/interactive-helpers.js.map +1 -1
  460. package/dist/modes/interactive/interactive-mode.d.ts +4 -1
  461. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  462. package/dist/modes/interactive/interactive-mode.js +327 -243
  463. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  464. package/dist/modes/interactive/interactive-selectors.d.ts +9 -0
  465. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  466. package/dist/modes/interactive/interactive-selectors.js +79 -25
  467. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  468. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  469. package/dist/modes/interactive/theme/theme-controller.js +5 -1
  470. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  471. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  472. package/dist/modes/interactive/theme/theme.js +26 -23
  473. package/dist/modes/interactive/theme/theme.js.map +1 -1
  474. package/dist/modes/json-event.d.ts.map +1 -1
  475. package/dist/modes/json-event.js +3 -2
  476. package/dist/modes/json-event.js.map +1 -1
  477. package/dist/modes/print-mode.d.ts.map +1 -1
  478. package/dist/modes/print-mode.js +3 -2
  479. package/dist/modes/print-mode.js.map +1 -1
  480. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  481. package/dist/modes/rpc/rpc-client.js +3 -2
  482. package/dist/modes/rpc/rpc-client.js.map +1 -1
  483. package/dist/package-manager-cli.d.ts.map +1 -1
  484. package/dist/package-manager-cli.js +28 -13
  485. package/dist/package-manager-cli.js.map +1 -1
  486. package/dist/plugins/ecosystem/catalog.d.ts.map +1 -1
  487. package/dist/plugins/ecosystem/catalog.js +3 -2
  488. package/dist/plugins/ecosystem/catalog.js.map +1 -1
  489. package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
  490. package/dist/plugins/ecosystem/cli.js +2 -1
  491. package/dist/plugins/ecosystem/cli.js.map +1 -1
  492. package/dist/plugins/ecosystem/default-plugin-market.d.ts.map +1 -1
  493. package/dist/plugins/ecosystem/default-plugin-market.js +3 -2
  494. package/dist/plugins/ecosystem/default-plugin-market.js.map +1 -1
  495. package/dist/plugins/ecosystem/distribution.d.ts.map +1 -1
  496. package/dist/plugins/ecosystem/distribution.js +2 -1
  497. package/dist/plugins/ecosystem/distribution.js.map +1 -1
  498. package/dist/plugins/ecosystem/installer.d.ts.map +1 -1
  499. package/dist/plugins/ecosystem/installer.js +3 -2
  500. package/dist/plugins/ecosystem/installer.js.map +1 -1
  501. package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
  502. package/dist/plugins/ecosystem/node-disk-registry-source.js +20 -17
  503. package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
  504. package/dist/plugins/ecosystem/node-distribution-host.d.ts.map +1 -1
  505. package/dist/plugins/ecosystem/node-distribution-host.js +35 -34
  506. package/dist/plugins/ecosystem/node-distribution-host.js.map +1 -1
  507. package/dist/plugins/ecosystem/node-npm-registry-source.d.ts.map +1 -1
  508. package/dist/plugins/ecosystem/node-npm-registry-source.js +35 -34
  509. package/dist/plugins/ecosystem/node-npm-registry-source.js.map +1 -1
  510. package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
  511. package/dist/plugins/ecosystem/node-package-install-host.js +9 -8
  512. package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
  513. package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -1
  514. package/dist/plugins/ecosystem/node-package-install-persistence.js +4 -3
  515. package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -1
  516. package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
  517. package/dist/plugins/ecosystem/node-plugin-bootstrap.js +21 -5
  518. package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -1
  519. package/dist/plugins/ecosystem/node-plugin-trust-root.d.ts.map +1 -1
  520. package/dist/plugins/ecosystem/node-plugin-trust-root.js +10 -9
  521. package/dist/plugins/ecosystem/node-plugin-trust-root.js.map +1 -1
  522. package/dist/plugins/ecosystem/node-registry-source.d.ts.map +1 -1
  523. package/dist/plugins/ecosystem/node-registry-source.js +31 -30
  524. package/dist/plugins/ecosystem/node-registry-source.js.map +1 -1
  525. package/dist/plugins/ecosystem/node-release-package-source.d.ts.map +1 -1
  526. package/dist/plugins/ecosystem/node-release-package-source.js +30 -29
  527. package/dist/plugins/ecosystem/node-release-package-source.js.map +1 -1
  528. package/dist/plugins/ecosystem/node-tar-writer.d.ts.map +1 -1
  529. package/dist/plugins/ecosystem/node-tar-writer.js +11 -10
  530. package/dist/plugins/ecosystem/node-tar-writer.js.map +1 -1
  531. package/dist/plugins/ecosystem/node-url-package-source.d.ts.map +1 -1
  532. package/dist/plugins/ecosystem/node-url-package-source.js +21 -20
  533. package/dist/plugins/ecosystem/node-url-package-source.js.map +1 -1
  534. package/dist/plugins/ecosystem/plugin-acquisition.d.ts.map +1 -1
  535. package/dist/plugins/ecosystem/plugin-acquisition.js +3 -2
  536. package/dist/plugins/ecosystem/plugin-acquisition.js.map +1 -1
  537. package/dist/plugins/ecosystem/registry-cli-adapter.d.ts.map +1 -1
  538. package/dist/plugins/ecosystem/registry-cli-adapter.js +2 -1
  539. package/dist/plugins/ecosystem/registry-cli-adapter.js.map +1 -1
  540. package/dist/plugins/ecosystem/registry.d.ts.map +1 -1
  541. package/dist/plugins/ecosystem/registry.js +35 -32
  542. package/dist/plugins/ecosystem/registry.js.map +1 -1
  543. package/dist/plugins/ecosystem/resolver.d.ts.map +1 -1
  544. package/dist/plugins/ecosystem/resolver.js +3 -2
  545. package/dist/plugins/ecosystem/resolver.js.map +1 -1
  546. package/dist/plugins/ecosystem/selection-store.d.ts.map +1 -1
  547. package/dist/plugins/ecosystem/selection-store.js +11 -10
  548. package/dist/plugins/ecosystem/selection-store.js.map +1 -1
  549. package/dist/plugins/ecosystem/selection.d.ts.map +1 -1
  550. package/dist/plugins/ecosystem/selection.js +8 -7
  551. package/dist/plugins/ecosystem/selection.js.map +1 -1
  552. package/dist/plugins/ecosystem/state.d.ts.map +1 -1
  553. package/dist/plugins/ecosystem/state.js +24 -23
  554. package/dist/plugins/ecosystem/state.js.map +1 -1
  555. package/dist/plugins/ecosystem/updates.d.ts.map +1 -1
  556. package/dist/plugins/ecosystem/updates.js +5 -4
  557. package/dist/plugins/ecosystem/updates.js.map +1 -1
  558. package/dist/plugins/mcp-http.d.ts +0 -17
  559. package/dist/plugins/mcp-http.d.ts.map +1 -1
  560. package/dist/plugins/mcp-http.js +30 -7
  561. package/dist/plugins/mcp-http.js.map +1 -1
  562. package/dist/plugins/plugin-supervisor.d.ts.map +1 -1
  563. package/dist/plugins/plugin-supervisor.js +19 -1
  564. package/dist/plugins/plugin-supervisor.js.map +1 -1
  565. package/dist/profile/first-roles.d.ts.map +1 -1
  566. package/dist/profile/first-roles.js +10 -1
  567. package/dist/profile/first-roles.js.map +1 -1
  568. package/dist/profile/goal-plugin.d.ts.map +1 -1
  569. package/dist/profile/goal-plugin.js +24 -5
  570. package/dist/profile/goal-plugin.js.map +1 -1
  571. package/dist/profile/identity.d.ts.map +1 -1
  572. package/dist/profile/identity.js +7 -6
  573. package/dist/profile/identity.js.map +1 -1
  574. package/dist/profile/lock.d.ts.map +1 -1
  575. package/dist/profile/lock.js +15 -1
  576. package/dist/profile/lock.js.map +1 -1
  577. package/dist/profile/plan-plugin.d.ts.map +1 -1
  578. package/dist/profile/plan-plugin.js +26 -13
  579. package/dist/profile/plan-plugin.js.map +1 -1
  580. package/dist/profile/plugin-profiles.d.ts.map +1 -1
  581. package/dist/profile/plugin-profiles.js +2 -1
  582. package/dist/profile/plugin-profiles.js.map +1 -1
  583. package/dist/profile/policy-manifest.d.ts.map +1 -1
  584. package/dist/profile/policy-manifest.js +5 -4
  585. package/dist/profile/policy-manifest.js.map +1 -1
  586. package/dist/profile/profile-registry.d.ts +0 -12
  587. package/dist/profile/profile-registry.d.ts.map +1 -1
  588. package/dist/profile/profile-registry.js +14 -1
  589. package/dist/profile/profile-registry.js.map +1 -1
  590. package/dist/profile/role-catalog.d.ts +0 -1
  591. package/dist/profile/role-catalog.d.ts.map +1 -1
  592. package/dist/profile/role-catalog.js +17 -15
  593. package/dist/profile/role-catalog.js.map +1 -1
  594. package/dist/profile/role-orchestrator.d.ts.map +1 -1
  595. package/dist/profile/role-orchestrator.js +8 -7
  596. package/dist/profile/role-orchestrator.js.map +1 -1
  597. package/dist/profile/role-runner.d.ts.map +1 -1
  598. package/dist/profile/role-runner.js +3 -2
  599. package/dist/profile/role-runner.js.map +1 -1
  600. package/dist/profile/root-facade.d.ts.map +1 -1
  601. package/dist/profile/root-facade.js +2 -1
  602. package/dist/profile/root-facade.js.map +1 -1
  603. package/dist/profile/skill-discovery-wiring.d.ts.map +1 -1
  604. package/dist/profile/skill-discovery-wiring.js +7 -2
  605. package/dist/profile/skill-discovery-wiring.js.map +1 -1
  606. package/dist/profile/state-store.d.ts.map +1 -1
  607. package/dist/profile/state-store.js +13 -9
  608. package/dist/profile/state-store.js.map +1 -1
  609. package/dist/profile/todo-plugin.d.ts.map +1 -1
  610. package/dist/profile/todo-plugin.js +9 -4
  611. package/dist/profile/todo-plugin.js.map +1 -1
  612. package/dist/profiles/builtin-suites.d.ts +13 -6
  613. package/dist/profiles/builtin-suites.d.ts.map +1 -1
  614. package/dist/profiles/builtin-suites.js +15 -6
  615. package/dist/profiles/builtin-suites.js.map +1 -1
  616. package/dist/profiles/suite-loader.d.ts +25 -1
  617. package/dist/profiles/suite-loader.d.ts.map +1 -1
  618. package/dist/profiles/suite-loader.js +34 -9
  619. package/dist/profiles/suite-loader.js.map +1 -1
  620. package/dist/remote/server-entry.d.ts.map +1 -1
  621. package/dist/remote/server-entry.js +3 -2
  622. package/dist/remote/server-entry.js.map +1 -1
  623. package/dist/remote/session-source.d.ts.map +1 -1
  624. package/dist/remote/session-source.js +8 -4
  625. package/dist/remote/session-source.js.map +1 -1
  626. package/dist/share/session-share.d.ts.map +1 -1
  627. package/dist/share/session-share.js +14 -2
  628. package/dist/share/session-share.js.map +1 -1
  629. package/dist/testing/plugin-testkit.d.ts.map +1 -1
  630. package/dist/testing/plugin-testkit.js +4 -3
  631. package/dist/testing/plugin-testkit.js.map +1 -1
  632. package/dist/testing/runtime-delivery-queue.d.ts.map +1 -1
  633. package/dist/testing/runtime-delivery-queue.js +2 -1
  634. package/dist/testing/runtime-delivery-queue.js.map +1 -1
  635. package/dist/testing/session-plugin-testkit.d.ts.map +1 -1
  636. package/dist/testing/session-plugin-testkit.js +10 -7
  637. package/dist/testing/session-plugin-testkit.js.map +1 -1
  638. package/dist/utils/ansi.d.ts.map +1 -1
  639. package/dist/utils/ansi.js +2 -1
  640. package/dist/utils/ansi.js.map +1 -1
  641. package/dist/utils/clipboard.d.ts.map +1 -1
  642. package/dist/utils/clipboard.js +7 -6
  643. package/dist/utils/clipboard.js.map +1 -1
  644. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  645. package/dist/utils/image-resize-worker.js +3 -2
  646. package/dist/utils/image-resize-worker.js.map +1 -1
  647. package/dist/utils/shell.d.ts.map +1 -1
  648. package/dist/utils/shell.js +9 -8
  649. package/dist/utils/shell.js.map +1 -1
  650. package/dist/utils/tools-manager.d.ts.map +1 -1
  651. package/dist/utils/tools-manager.js +23 -13
  652. package/dist/utils/tools-manager.js.map +1 -1
  653. package/dist/utils/version-check.d.ts.map +1 -1
  654. package/dist/utils/version-check.js +5 -1
  655. package/dist/utils/version-check.js.map +1 -1
  656. package/docs/keybindings.md +3 -0
  657. package/docs/quickstart.md +1 -1
  658. package/docs/settings.md +1 -0
  659. package/docs/terminal-setup.md +2 -3
  660. package/docs/usage.md +6 -5
  661. package/examples/extensions/with-deps/package-lock.json +2 -2
  662. package/examples/extensions/with-deps/package.json +1 -1
  663. package/examples/extensions/with-deps/plugin.json +1 -1
  664. package/package.json +1 -1
  665. package/dist/bundle/chunks/chunk-EALJ5DDX.js +0 -1452
package/CHANGELOG.md CHANGED
@@ -2,7 +2,25 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
- ## [0.86.6] - 2026-10-02
5
+ ## [0.87.0] - 2026-10-02
6
+ ### Added
7
+
8
+ - i18n mechanism, batch 1 of the full-localization program (设计 `docs/design/国际化与本地化.md`, experimental): `t(key, params?)` in `src/core/i18n/` treats English source strings as dictionary keys — zh-CN looks up the aggregated domain dictionaries and falls back to the English key verbatim on miss; `en` passes through without lookup; `{name}` placeholders interpolate on all paths and missing params keep the placeholder instead of throwing. Language resolves as `AGENT_FORGE_I18N_LANG` env > injected value (`setI18nLanguage`) > default `zh-CN`; the new `ui.language` setting (`"zh-CN"` | `"en"`, default `"zh-CN"`, `getUiLanguage()`/`setUiLanguage()`) is the persistence face the host injects from. Vitest runs pin the language to `en` so the existing English-text assertions stay untouched.
9
+ - Full zh-CN localization of user-visible strings, batches 2-8 of the program: ~1,000 user-facing English strings across the interactive TUI (status hints, dialog titles/options, selector and component labels, `/help` `/hotkeys` `/session` tables, startup banner, footer), the CLI (`--help` and auth-command help, flag/option/environment descriptions, suite lifecycle and session errors, print-mode fallbacks), core-layer user-visible runtime errors (config/auth/network/file-IO/session-corruption throws, ~165 entries; plugin-developer contract errors deliberately excluded pending batch 9), and the 48 keybinding descriptions (translated at the agent-forge rendering channel — the tui registry data is untouched). The host wires the language through: interactive mode injects it at construction and on `/reload` (`applyRuntimeSettings`), the CLI bootstrap injects it before any output, and `/settings` gains an "Interface language" row that switches immediately without a restart. Wrapped strings degrade to the English key verbatim wherever a dictionary entry is missing, so upstream-synced new strings stay visible. tui-builtin copy (`Find transcript`/`No matches`/`Copied!`/`Copy failed`) moved to injectable labels (default English) instead of a reverse package dependency, and the tui-mirror harness gains an `i18n-zh-smoke` scenario asserting Chinese rendering fits the terminal width (CJK double-width aware); the mirror CLI runner pins `en` like vitest so existing scenario assertions are unaffected. Singular/plural message pairs stay split keys so English grammar holds for count=1 in every path (retry attempts, background subagents, compaction times, cache misses, queued messages). A final re-review sweep (batch 10) closed the batch-boundary gaps: the interactive-auth login/logout flow, /metrics and /doctor output labels, the plugin confirm dialog, external-editor handoff notice, theme-load fallback notice, serve-mode console lines, and the OAuth manual-code prompt are now wrapped too (61-entry tui-interactive-misc domain plus cli/core-errors additions); a full key-to-dictionary audit across all 1,032 t() call-site keys leaves only 9 deliberate fallbacks (argument-hint syntax tokens, data markers, a pure {title}/{message} skeleton). Batch 9 then wrapped the remaining ~1,200 developer-facing contract and internal throws across core/extensions (17 files), the core root layer, plugins/ecosystem, profile, durable, host, utils, and the remaining CLI diagnostics (about 1,160 new dictionary entries across four core-contract domains (a final sweep closed 35 stragglers the three parallel batches' self-checks missed); 2,152 total keys audited, same 9 fallbacks, translatable throws now zero). Machine-matched messages that behavior depends on (the installer plugin-installation series, cancelled/aborted/timeout prefixes, the authHeader sentinel, Unknown-option prefixes, snapshot-validation prefixes) stay English and are registered as explicit non-goals in the design doc, alongside all non-agent-forge workspace packages (plugin-sdk/ai/agent/server contract faces, 361 throws), ErrorEnvelope commandError payloads, and generated stdio-plugin source. The upstream-sync rulebook (docs/upgrade/README.md) gains principle 8: ported user-visible copy must realign t() keys, with dictionary misses falling back to English until backfilled.
10
+ - Suite custom orientation persona (设计 `docs/design/方案系统设计.md` §6.3): user suites can set `"orientation": "custom"` in suite.json and own their persona text via `<agentDir>/suites/<id>/persona.md` — read verbatim (BOM stripped, not trimmed) and injected exactly like the two builtin personas (missing file degrades to an empty prompt with a dangling diagnostic, never a silent fallback to a builtin persona; the context-budget `personaChars` accounting follows the resolved text). Builtin suites stay locked to `assistant`/`coding` and `FACTORY_CONTENTS_VERSION` is unchanged; schemaVersion stays 1.
11
+ - Queued-message management (D-078, 设计 `docs/design/决策记录.md` D-078 + `docs/design/稳定门面统一入口设计.md` §3.1 #90-91): the new `/queue-list` builtin command (single entry point, no keybinding) opens a queue manager listing the steering and follow-up queues — entries are reordered with alt+up / alt+down, deleted with delete, or recalled to the editor with enter; escape closes the selector (those three are in-component keys of the selector, not feature triggers). The backing public API is index-based and spans three layers: `Agent` gains `peekSteeringQueue()`/`peekFollowUpQueue()` (snapshot shallow copies) plus `reorderQueuedMessages()`/`removeQueuedMessage()` (stale indices during streaming drains return `false`/`null` instead of throwing); `AgentSession.reorderQueuedMessages()`/`removeQueuedMessageAt()` treat the `_steeringMessages`/`_followUpMessages` text copies as the source of truth, sync the agent queue at the same index on success, emit `queue_update`, and leave both layers untouched on failure; the facade forwards both members verbatim. `sendCustomMessage` with `deliverAs: "steer"`/`"followUp"` now also records the display text into the matching text copy, closing the gap where the agent queue held a message the text copy did not (the two layers stay isomorphic, which the index semantics rely on). The tui-mirror harness gains a `queue-manager` scenario for the selector.
12
+
13
+ ### Changed
14
+
15
+ - Factory default suite flips from `assistant` to `coding` (user ruling 2026-10-02: the product is a coding agent — README "专注编写代码的 AI Agent", npm "Interactive coding agent CLI" — so the no-configuration default must not land on the companion-style assistant persona). A session with no explicit suite source (CLI `--suite` / `AGENT_FORGE_SUITE` / project settings / global settings) now resolves to the coding orientation persona (rigor-first engineering) with the `code` memory strategy; the assistant suite stays available as the explicit-switch fallback, both suites keep the identical 8-tool surface and capability set, and `FACTORY_CONTENTS_VERSION` is unchanged (declarations did not change — no `--suite-reset` upgrade proposal). Environments with an explicit suite configuration are unaffected; existing assistant-domain memories stay in the assistant domain (suiteId isolation is unchanged).
16
+ - Background delegation settlements are written back to the main session immediately as a persisted, TUI-visible custom message instead of the old request-time digest injection (user ruling 2026-10-02, D-060 ruling 12: delegated work must be accepted by the parent, no config switch). When a background subagent task settles, the host sink turns the settlement line into one `agent-task-settled` custom message (content: `Background subagent task <taskId> settled: <status>` plus guidance to read the full result with `subagent_result` and review it) delivered via `sendCustomMessage({ deliverAs: "followUp", triggerTurn: true })`: while the parent is streaming the message rides the follow-up queue (drained this turn, current turn not preempted), and when the parent is idle the same call atomically triggers an acceptance turn. The retired mechanism — the in-memory `backgroundDigest` buffer (20-entry cap, oldest dropped) plus the one-shot `transformContext` injection on the next model round — lost settlements across process restarts, was invisible in the TUI, and left an idle parent waiting forever. Multiple simultaneous settlements each get their own message (the first triggers the idle turn, the rest queue through the streaming branch); a write-back failure only logs a host warn and never affects the task; settlements after the session is disposed are skipped (no orphan turns); the `agent.task.settled@1` lifecycle dispatch is unchanged.
17
+
18
+ ### Fixed
19
+
20
+ - Read-only tool surface no longer promises file editing in the system prompt (设计 `docs/design/提示词设计宪法.md` §6 2026-10-02): `buildSystemPrompt()` unconditionally opened with "…editing or creating files", contradicting sessions narrowed via `--tools read,grep,find,ls` — observed the model burning minutes improvising workarounds with read-only tools when asked to make changes. When no known mutating tool is active (`MUTATING_TOOL_NAMES`: write/edit/bash/powershell/process_exec/workspace_write/test_run/formatter_linter_check/desktop_execute/image_edit — extend the set when new mutating capability tools ship), the intro now states the non-mutating scope and a work rule reframes execution requests as change-plan requests (exact files/edits/verification; delivering the plan completes the task) — wording sourced from the prompt-reference baseline `OpenAI/Codex/plan_mode.md`. The `customPrompt` branch is untouched. Verified end-to-end: the same narrowed session asked to "fix it directly" now reads once and returns a concrete change plan instead of looping on read tools.
21
+ - Stale default keybindings in the English docs: `usage.md`/`README.md` claimed `Alt+Enter`/`Alt+Up` for follow-up queueing and dequeue, `terminal-setup.md` claimed `Ctrl+Q`/`Alt+Q`/`Alt+P`, and `quickstart.md`/`README.md` claimed `Ctrl+L`/`Ctrl+P`/`Shift+Tab` — all of these shipped defaults were cleared by the single-entry-point rulings (2026-10-01, cf. 0.86.7 `/queue`/`/dequeue` entry). The docs now describe the command entries (`/queue`, `/dequeue`, `/model`, `/thinking`, `/scoped-models`) and point at `keybindings.json` for rebinding.
22
+
23
+ ## [0.86.7] - 2026-10-02
6
24
  ### Added
7
25
 
8
26
  - Interrupt grading for background subagents (设计 子代理运行时 §4.2, user ruling 2026-10-02; industry alignment: codex Esc stops only the current thread's turn, Claude Code stops background agents through a separate confirmed entry): `AgentSession.abort()` gains `{ cancelAgentTasks?: boolean }` (default `true`, original cascade contract unchanged for SDK/dispose paths) — `false` stops the current turn (model stream/tool loop/bash) without touching the background-agent cancel fence. **The TUI Esc always passes `false`**: Esc now has exactly one meaning (stop the current turn) and never terminates background subagents — previously one accidental Esc irreversibly cancelled every running subagent (fence epoch refresh made it unrecoverable). When background subagents are still running after an interrupt, a status line points at the way out. New `/stop-agents` command (single entry, no keybinding) is the only explicit termination face, reporting how many tasks it terminated; `getActiveAgentTaskCount()` (session/facade) exposes the runtime's live-task projection, and `abortAgentTasks()` is the command's execution face. Two implementation traps the new tests caught: the fence epoch must refresh only when the cascade actually fired (otherwise live tasks' fence listeners detach from the controller, and a later explicit termination misses them), and terminal-but-not-yet-disposed tasks stay in the live set (the count filters by status).
package/README.md CHANGED
@@ -68,7 +68,7 @@ agent-forge
68
68
 
69
69
  ## Providers & Models
70
70
 
71
- Agent Forge 为已配置 provider 维护可用模型目录;运行 `agent-forge update --models` 可手动刷新。通过订阅(`/login`)或 API key 认证后,可用 `/model`(或 Ctrl+L)选择模型;在模型选择器中按 Ctrl+S 可保存启动默认值。
71
+ Agent Forge 为已配置 provider 维护可用模型目录;运行 `agent-forge update --models` 可手动刷新。通过订阅(`/login`)或 API key 认证后,可用 `/model` 选择模型;在模型选择器中按 Ctrl+S 可保存启动默认值。
72
72
 
73
73
  **Subscriptions:**
74
74
  - Anthropic Claude Pro/Max
@@ -152,7 +152,7 @@ Type `/` in the editor to trigger commands. [Extensions](#extensions) can regist
152
152
  | [`/llama`](docs/llama-cpp.md) | Download, load, and unload llama.cpp router models |
153
153
  | `/model` | Switch models; Ctrl+S in the picker saves the startup default |
154
154
  | `/thinking` | Switch thinking level; Ctrl+S in the picker saves the startup default |
155
- | `/scoped-models` | Enable/disable models for Ctrl+P cycling |
155
+ | `/scoped-models` | Enable/disable models for model cycling (bindable, no default key) |
156
156
  | `/settings` | Theme, message delivery, transport, and other preferences |
157
157
  | `/resume` | Pick from previous sessions |
158
158
  | `/new` | Start a new session |
@@ -183,23 +183,22 @@ See `/hotkeys` for the full list. Customize via `~/.agent-forge/agent/keybinding
183
183
  | Ctrl+C twice | Quit |
184
184
  | Escape | Cancel/abort |
185
185
  | Escape twice | Open `/tree` |
186
- | Ctrl+L | Open model selector |
187
- | Ctrl+P / Shift+Ctrl+P | Cycle scoped models forward/backward |
188
- | Shift+Tab | Cycle thinking level |
189
186
  | Ctrl+O | Collapse/expand tool output |
190
187
  | Ctrl+T | Collapse/expand thinking blocks |
191
188
  | Ctrl+X | Copy the last assistant message; with fullscreen copy-on-select disabled, copy the active text selection |
192
189
 
190
+ Model selection, model cycling, and thinking-level cycling are command-only by default (`/model`, `/thinking`, `/scoped-models`); their shipped default keybindings were cleared per the single-entry-point rule and can be re-bound in `~/.agent-forge/agent/keybindings.json` (see [docs/keybindings.md](docs/keybindings.md)).
191
+
193
192
  ### Message Queue
194
193
 
195
194
  Submit messages while the agent is working:
196
195
 
197
196
  - **Enter** queues a *steering* message, delivered after the current assistant turn finishes executing its tool calls
198
- - **Alt+Enter** queues a *follow-up* message, delivered only after the agent finishes all work
197
+ - **`/queue <text>`** queues a *follow-up* message, delivered only after the agent finishes all work
199
198
  - **Escape** aborts and restores queued messages to editor
200
- - **Alt+Up** retrieves queued messages back to editor
199
+ - **`/dequeue`** restores queued messages back to editor
201
200
 
202
- On Windows Terminal, `Alt+Enter` is fullscreen by default. Remap it in [docs/terminal-setup.md](docs/terminal-setup.md) so Agent Forge can receive the follow-up shortcut.
201
+ Follow-up queueing and dequeue are command-only by default (no shipped keybindings); bind `app.message.followUp` / `app.message.dequeue` in [docs/keybindings.md](docs/keybindings.md) if you want keys.
203
202
 
204
203
  Configure delivery in [settings](docs/settings.md): `steeringMode` and `followUpMode` can be `"one-at-a-time"` (default, waits for response) or `"all"` (delivers all queued at once). `transport` selects provider transport preference (`"sse"`, `"websocket"`, or `"auto"`) for providers that support multiple transports.
205
204
 
@@ -483,7 +482,7 @@ cat README.md | agent-forge -p "Summarize this text"
483
482
  | `--model <pattern>` | Model pattern or ID (supports `provider/id` and optional `:<thinking>`) |
484
483
  | `--api-key <key>` | API key (overrides env vars) |
485
484
  | `--thinking <level>` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max` |
486
- | `--models <patterns>` | Comma-separated patterns for Ctrl+P cycling |
485
+ | `--models <patterns>` | Comma-separated patterns for model cycling (bindable, no default key) |
487
486
  | `--list-models [search]` | List available models |
488
487
 
489
488
  ### Session Options
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-store.d.ts","sourceRoot":"","sources":["../../src/artifacts/artifact-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,CAAC,KAAK,EAAE;QACZ,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;KAC3B,GAAG;QAAE,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;KAAE,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG;QACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;KAC3B,CAAC;IACF,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAAC;IACnD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC;CACrF;AAyBD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAAG,eAAe,CA8DlG","sourcesContent":["/**\n * Artifact store (2.6a) — session export artifacts with refs, a bounded\n * read boundary, and an explicit end-of-life.\n *\n * Writers store bytes once and hand out serializable refs (id, session,\n * operation, kind, media type, size). Readers get the bytes only through\n * `read`, which is scoped to the owning session; `stat` exposes metadata\n * only. `endLifecycle` terminates an artifact explicitly: later reads fail\n * with a structured `ended` error and stats report the terminal state —\n * nothing is silently deleted or silently kept alive. Renderers and share\n * transports belong to later slices (2.6b-d).\n */\nimport type { ArtifactRefV1 } from \"../core/agent-capability-contract.ts\";\n\nexport type { ArtifactRefV1 };\n\nexport interface ArtifactStatV1 {\n\treadonly artifactId: string;\n\treadonly sessionId: string;\n\treadonly operationId: string;\n\treadonly kind: string;\n\treadonly mediaType: string;\n\treadonly sizeBytes?: number;\n\treadonly state: \"available\" | \"ended\";\n\treadonly endReason?: string;\n}\n\nexport interface ArtifactStoreV1 {\n\twrite(input: {\n\t\treadonly sessionId: string;\n\t\treadonly operationId: string;\n\t\treadonly kind: string;\n\t\treadonly mediaType: string;\n\t\treadonly bytes: Uint8Array;\n\t}): { readonly ref: ArtifactRefV1 };\n\tread(input: { readonly artifactId: string; readonly sessionId: string }): {\n\t\treadonly mediaType: string;\n\t\treadonly bytes: Uint8Array;\n\t};\n\tstat(artifactId: string): ArtifactStatV1 | undefined;\n\tlist(sessionId: string): readonly ArtifactStatV1[];\n\tendLifecycle(artifactId: string, input: { readonly reason: string }): ArtifactStatV1;\n}\n\n/** FNV-1a 32-bit over the artifact content — deterministic artifact ids. */\nfunction contentHash(bytes: Uint8Array): string {\n\tlet hash = 0x811c9dc5;\n\tfor (const byte of bytes) {\n\t\thash ^= byte;\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36);\n}\n\nfunction toStat(entry: { ref: ArtifactRefV1; bytes: Uint8Array; ended: boolean; endReason?: string }): ArtifactStatV1 {\n\treturn {\n\t\tartifactId: entry.ref.artifactId,\n\t\tsessionId: entry.ref.sessionId,\n\t\toperationId: entry.ref.operationId,\n\t\tkind: entry.ref.kind,\n\t\tmediaType: entry.ref.mediaType,\n\t\tsizeBytes: entry.ref.sizeBytes,\n\t\tstate: entry.ended ? \"ended\" : \"available\",\n\t\t...(entry.ended ? { endReason: entry.endReason } : {}),\n\t};\n}\n\nexport function createArtifactStore(options: { readonly now?: () => number } = {}): ArtifactStoreV1 {\n\tconst now = options.now ?? (() => Date.now());\n\tconst artifacts = new Map<string, { ref: ArtifactRefV1; bytes: Uint8Array; ended: boolean; endReason?: string }>();\n\tconst sequenceByIdentity = new Map<string, number>();\n\t// Global write counter: guarantees artifact ids are unique across ALL\n\t// (session, operation) identities — identical bytes written by two\n\t// different identities must never collide into one id.\n\tlet globalWriteSequence = 0;\n\n\treturn {\n\t\twrite(input) {\n\t\t\tif (input.bytes.length === 0) throw new Error(\"Artifact bytes must not be empty\");\n\t\t\tconst identity = `${input.sessionId}\\u0000${input.operationId}`;\n\t\t\tconst sequence = (sequenceByIdentity.get(identity) ?? 0) + 1;\n\t\t\tsequenceByIdentity.set(identity, sequence);\n\t\t\tglobalWriteSequence += 1;\n\t\t\tconst artifactId = `art-${contentHash(input.bytes)}-${sequence}-${globalWriteSequence}`;\n\t\t\tconst ref: ArtifactRefV1 = {\n\t\t\t\tartifactId,\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\toperationId: input.operationId,\n\t\t\t\tkind: input.kind,\n\t\t\t\tmediaType: input.mediaType,\n\t\t\t\tsizeBytes: input.bytes.length,\n\t\t\t\ttruncated: false,\n\t\t\t\tcreatedAt: now(),\n\t\t\t};\n\t\t\tartifacts.set(artifactId, { ref, bytes: input.bytes, ended: false });\n\t\t\treturn { ref };\n\t\t},\n\t\tread(input) {\n\t\t\tconst entry = artifacts.get(input.artifactId);\n\t\t\tif (!entry) throw new Error(`Artifact not found: ${input.artifactId}`);\n\t\t\tif (entry.ref.sessionId !== input.sessionId) {\n\t\t\t\tthrow new Error(`Artifact ${input.artifactId} belongs to a different session`);\n\t\t\t}\n\t\t\tif (entry.ended) {\n\t\t\t\tthrow new Error(`Artifact ${input.artifactId} lifecycle has ended: ${entry.endReason ?? \"ended\"}`);\n\t\t\t}\n\t\t\treturn { mediaType: entry.ref.mediaType, bytes: entry.bytes };\n\t\t},\n\t\tstat(artifactId) {\n\t\t\tconst entry = artifacts.get(artifactId);\n\t\t\treturn entry === undefined ? undefined : toStat(entry);\n\t\t},\n\t\tlist(sessionId) {\n\t\t\treturn [...artifacts.values()]\n\t\t\t\t.filter((entry) => entry.ref.sessionId === sessionId)\n\t\t\t\t.map((entry) => toStat(entry));\n\t\t},\n\t\tendLifecycle(artifactId, input) {\n\t\t\tconst entry = artifacts.get(artifactId);\n\t\t\tif (!entry) throw new Error(`Artifact not found: ${artifactId}`);\n\t\t\tif (entry.ended) {\n\t\t\t\tthrow new Error(`Artifact ${artifactId} lifecycle has already ended`);\n\t\t\t}\n\t\t\tentry.ended = true;\n\t\t\tentry.endReason = input.reason;\n\t\t\tentry.bytes = new Uint8Array(0);\n\t\t\treturn toStat(entry);\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"artifact-store.d.ts","sourceRoot":"","sources":["../../src/artifacts/artifact-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAG1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,CAAC,KAAK,EAAE;QACZ,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;KAC3B,GAAG;QAAE,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;KAAE,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG;QACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;KAC3B,CAAC;IACF,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAAC;IACnD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC;CACrF;AAyBD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAAG,eAAe,CAqElG","sourcesContent":["/**\n * Artifact store (2.6a) — session export artifacts with refs, a bounded\n * read boundary, and an explicit end-of-life.\n *\n * Writers store bytes once and hand out serializable refs (id, session,\n * operation, kind, media type, size). Readers get the bytes only through\n * `read`, which is scoped to the owning session; `stat` exposes metadata\n * only. `endLifecycle` terminates an artifact explicitly: later reads fail\n * with a structured `ended` error and stats report the terminal state —\n * nothing is silently deleted or silently kept alive. Renderers and share\n * transports belong to later slices (2.6b-d).\n */\nimport type { ArtifactRefV1 } from \"../core/agent-capability-contract.ts\";\nimport { t } from \"../core/i18n/index.ts\";\n\nexport type { ArtifactRefV1 };\n\nexport interface ArtifactStatV1 {\n\treadonly artifactId: string;\n\treadonly sessionId: string;\n\treadonly operationId: string;\n\treadonly kind: string;\n\treadonly mediaType: string;\n\treadonly sizeBytes?: number;\n\treadonly state: \"available\" | \"ended\";\n\treadonly endReason?: string;\n}\n\nexport interface ArtifactStoreV1 {\n\twrite(input: {\n\t\treadonly sessionId: string;\n\t\treadonly operationId: string;\n\t\treadonly kind: string;\n\t\treadonly mediaType: string;\n\t\treadonly bytes: Uint8Array;\n\t}): { readonly ref: ArtifactRefV1 };\n\tread(input: { readonly artifactId: string; readonly sessionId: string }): {\n\t\treadonly mediaType: string;\n\t\treadonly bytes: Uint8Array;\n\t};\n\tstat(artifactId: string): ArtifactStatV1 | undefined;\n\tlist(sessionId: string): readonly ArtifactStatV1[];\n\tendLifecycle(artifactId: string, input: { readonly reason: string }): ArtifactStatV1;\n}\n\n/** FNV-1a 32-bit over the artifact content — deterministic artifact ids. */\nfunction contentHash(bytes: Uint8Array): string {\n\tlet hash = 0x811c9dc5;\n\tfor (const byte of bytes) {\n\t\thash ^= byte;\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36);\n}\n\nfunction toStat(entry: { ref: ArtifactRefV1; bytes: Uint8Array; ended: boolean; endReason?: string }): ArtifactStatV1 {\n\treturn {\n\t\tartifactId: entry.ref.artifactId,\n\t\tsessionId: entry.ref.sessionId,\n\t\toperationId: entry.ref.operationId,\n\t\tkind: entry.ref.kind,\n\t\tmediaType: entry.ref.mediaType,\n\t\tsizeBytes: entry.ref.sizeBytes,\n\t\tstate: entry.ended ? \"ended\" : \"available\",\n\t\t...(entry.ended ? { endReason: entry.endReason } : {}),\n\t};\n}\n\nexport function createArtifactStore(options: { readonly now?: () => number } = {}): ArtifactStoreV1 {\n\tconst now = options.now ?? (() => Date.now());\n\tconst artifacts = new Map<string, { ref: ArtifactRefV1; bytes: Uint8Array; ended: boolean; endReason?: string }>();\n\tconst sequenceByIdentity = new Map<string, number>();\n\t// Global write counter: guarantees artifact ids are unique across ALL\n\t// (session, operation) identities — identical bytes written by two\n\t// different identities must never collide into one id.\n\tlet globalWriteSequence = 0;\n\n\treturn {\n\t\twrite(input) {\n\t\t\tif (input.bytes.length === 0) throw new Error(\"Artifact bytes must not be empty\");\n\t\t\tconst identity = `${input.sessionId}\\u0000${input.operationId}`;\n\t\t\tconst sequence = (sequenceByIdentity.get(identity) ?? 0) + 1;\n\t\t\tsequenceByIdentity.set(identity, sequence);\n\t\t\tglobalWriteSequence += 1;\n\t\t\tconst artifactId = `art-${contentHash(input.bytes)}-${sequence}-${globalWriteSequence}`;\n\t\t\tconst ref: ArtifactRefV1 = {\n\t\t\t\tartifactId,\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\toperationId: input.operationId,\n\t\t\t\tkind: input.kind,\n\t\t\t\tmediaType: input.mediaType,\n\t\t\t\tsizeBytes: input.bytes.length,\n\t\t\t\ttruncated: false,\n\t\t\t\tcreatedAt: now(),\n\t\t\t};\n\t\t\tartifacts.set(artifactId, { ref, bytes: input.bytes, ended: false });\n\t\t\treturn { ref };\n\t\t},\n\t\tread(input) {\n\t\t\tconst entry = artifacts.get(input.artifactId);\n\t\t\tif (!entry) throw new Error(t(\"Artifact not found: {artifactId}\", { artifactId: input.artifactId }));\n\t\t\tif (entry.ref.sessionId !== input.sessionId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tt(\"Artifact {artifactId} belongs to a different session\", { artifactId: input.artifactId }),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (entry.ended) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tt(\"Artifact {artifactId} lifecycle has ended: {reason}\", {\n\t\t\t\t\t\tartifactId: input.artifactId,\n\t\t\t\t\t\treason: entry.endReason ?? \"ended\",\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn { mediaType: entry.ref.mediaType, bytes: entry.bytes };\n\t\t},\n\t\tstat(artifactId) {\n\t\t\tconst entry = artifacts.get(artifactId);\n\t\t\treturn entry === undefined ? undefined : toStat(entry);\n\t\t},\n\t\tlist(sessionId) {\n\t\t\treturn [...artifacts.values()]\n\t\t\t\t.filter((entry) => entry.ref.sessionId === sessionId)\n\t\t\t\t.map((entry) => toStat(entry));\n\t\t},\n\t\tendLifecycle(artifactId, input) {\n\t\t\tconst entry = artifacts.get(artifactId);\n\t\t\tif (!entry) throw new Error(t(\"Artifact not found: {artifactId}\", { artifactId }));\n\t\t\tif (entry.ended) {\n\t\t\t\tthrow new Error(t(\"Artifact {artifactId} lifecycle has already ended\", { artifactId }));\n\t\t\t}\n\t\t\tentry.ended = true;\n\t\t\tentry.endReason = input.reason;\n\t\t\tentry.bytes = new Uint8Array(0);\n\t\t\treturn toStat(entry);\n\t\t},\n\t};\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { t } from "../core/i18n/index.js";
1
2
  /** FNV-1a 32-bit over the artifact content — deterministic artifact ids. */
2
3
  function contentHash(bytes) {
3
4
  let hash = 0x811c9dc5;
@@ -52,12 +53,15 @@ export function createArtifactStore(options = {}) {
52
53
  read(input) {
53
54
  const entry = artifacts.get(input.artifactId);
54
55
  if (!entry)
55
- throw new Error(`Artifact not found: ${input.artifactId}`);
56
+ throw new Error(t("Artifact not found: {artifactId}", { artifactId: input.artifactId }));
56
57
  if (entry.ref.sessionId !== input.sessionId) {
57
- throw new Error(`Artifact ${input.artifactId} belongs to a different session`);
58
+ throw new Error(t("Artifact {artifactId} belongs to a different session", { artifactId: input.artifactId }));
58
59
  }
59
60
  if (entry.ended) {
60
- throw new Error(`Artifact ${input.artifactId} lifecycle has ended: ${entry.endReason ?? "ended"}`);
61
+ throw new Error(t("Artifact {artifactId} lifecycle has ended: {reason}", {
62
+ artifactId: input.artifactId,
63
+ reason: entry.endReason ?? "ended",
64
+ }));
61
65
  }
62
66
  return { mediaType: entry.ref.mediaType, bytes: entry.bytes };
63
67
  },
@@ -73,9 +77,9 @@ export function createArtifactStore(options = {}) {
73
77
  endLifecycle(artifactId, input) {
74
78
  const entry = artifacts.get(artifactId);
75
79
  if (!entry)
76
- throw new Error(`Artifact not found: ${artifactId}`);
80
+ throw new Error(t("Artifact not found: {artifactId}", { artifactId }));
77
81
  if (entry.ended) {
78
- throw new Error(`Artifact ${artifactId} lifecycle has already ended`);
82
+ throw new Error(t("Artifact {artifactId} lifecycle has already ended", { artifactId }));
79
83
  }
80
84
  entry.ended = true;
81
85
  entry.endReason = input.reason;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-store.js","sourceRoot":"","sources":["../../src/artifacts/artifact-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Artifact store (2.6a) — session export artifacts with refs, a bounded\n * read boundary, and an explicit end-of-life.\n *\n * Writers store bytes once and hand out serializable refs (id, session,\n * operation, kind, media type, size). Readers get the bytes only through\n * `read`, which is scoped to the owning session; `stat` exposes metadata\n * only. `endLifecycle` terminates an artifact explicitly: later reads fail\n * with a structured `ended` error and stats report the terminal state —\n * nothing is silently deleted or silently kept alive. Renderers and share\n * transports belong to later slices (2.6b-d).\n */\nimport type { ArtifactRefV1 } from \"../core/agent-capability-contract.ts\";\n\nexport type { ArtifactRefV1 };\n\nexport interface ArtifactStatV1 {\n\treadonly artifactId: string;\n\treadonly sessionId: string;\n\treadonly operationId: string;\n\treadonly kind: string;\n\treadonly mediaType: string;\n\treadonly sizeBytes?: number;\n\treadonly state: \"available\" | \"ended\";\n\treadonly endReason?: string;\n}\n\nexport interface ArtifactStoreV1 {\n\twrite(input: {\n\t\treadonly sessionId: string;\n\t\treadonly operationId: string;\n\t\treadonly kind: string;\n\t\treadonly mediaType: string;\n\t\treadonly bytes: Uint8Array;\n\t}): { readonly ref: ArtifactRefV1 };\n\tread(input: { readonly artifactId: string; readonly sessionId: string }): {\n\t\treadonly mediaType: string;\n\t\treadonly bytes: Uint8Array;\n\t};\n\tstat(artifactId: string): ArtifactStatV1 | undefined;\n\tlist(sessionId: string): readonly ArtifactStatV1[];\n\tendLifecycle(artifactId: string, input: { readonly reason: string }): ArtifactStatV1;\n}\n\n/** FNV-1a 32-bit over the artifact content — deterministic artifact ids. */\nfunction contentHash(bytes: Uint8Array): string {\n\tlet hash = 0x811c9dc5;\n\tfor (const byte of bytes) {\n\t\thash ^= byte;\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36);\n}\n\nfunction toStat(entry: { ref: ArtifactRefV1; bytes: Uint8Array; ended: boolean; endReason?: string }): ArtifactStatV1 {\n\treturn {\n\t\tartifactId: entry.ref.artifactId,\n\t\tsessionId: entry.ref.sessionId,\n\t\toperationId: entry.ref.operationId,\n\t\tkind: entry.ref.kind,\n\t\tmediaType: entry.ref.mediaType,\n\t\tsizeBytes: entry.ref.sizeBytes,\n\t\tstate: entry.ended ? \"ended\" : \"available\",\n\t\t...(entry.ended ? { endReason: entry.endReason } : {}),\n\t};\n}\n\nexport function createArtifactStore(options: { readonly now?: () => number } = {}): ArtifactStoreV1 {\n\tconst now = options.now ?? (() => Date.now());\n\tconst artifacts = new Map<string, { ref: ArtifactRefV1; bytes: Uint8Array; ended: boolean; endReason?: string }>();\n\tconst sequenceByIdentity = new Map<string, number>();\n\t// Global write counter: guarantees artifact ids are unique across ALL\n\t// (session, operation) identities — identical bytes written by two\n\t// different identities must never collide into one id.\n\tlet globalWriteSequence = 0;\n\n\treturn {\n\t\twrite(input) {\n\t\t\tif (input.bytes.length === 0) throw new Error(\"Artifact bytes must not be empty\");\n\t\t\tconst identity = `${input.sessionId}\\u0000${input.operationId}`;\n\t\t\tconst sequence = (sequenceByIdentity.get(identity) ?? 0) + 1;\n\t\t\tsequenceByIdentity.set(identity, sequence);\n\t\t\tglobalWriteSequence += 1;\n\t\t\tconst artifactId = `art-${contentHash(input.bytes)}-${sequence}-${globalWriteSequence}`;\n\t\t\tconst ref: ArtifactRefV1 = {\n\t\t\t\tartifactId,\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\toperationId: input.operationId,\n\t\t\t\tkind: input.kind,\n\t\t\t\tmediaType: input.mediaType,\n\t\t\t\tsizeBytes: input.bytes.length,\n\t\t\t\ttruncated: false,\n\t\t\t\tcreatedAt: now(),\n\t\t\t};\n\t\t\tartifacts.set(artifactId, { ref, bytes: input.bytes, ended: false });\n\t\t\treturn { ref };\n\t\t},\n\t\tread(input) {\n\t\t\tconst entry = artifacts.get(input.artifactId);\n\t\t\tif (!entry) throw new Error(`Artifact not found: ${input.artifactId}`);\n\t\t\tif (entry.ref.sessionId !== input.sessionId) {\n\t\t\t\tthrow new Error(`Artifact ${input.artifactId} belongs to a different session`);\n\t\t\t}\n\t\t\tif (entry.ended) {\n\t\t\t\tthrow new Error(`Artifact ${input.artifactId} lifecycle has ended: ${entry.endReason ?? \"ended\"}`);\n\t\t\t}\n\t\t\treturn { mediaType: entry.ref.mediaType, bytes: entry.bytes };\n\t\t},\n\t\tstat(artifactId) {\n\t\t\tconst entry = artifacts.get(artifactId);\n\t\t\treturn entry === undefined ? undefined : toStat(entry);\n\t\t},\n\t\tlist(sessionId) {\n\t\t\treturn [...artifacts.values()]\n\t\t\t\t.filter((entry) => entry.ref.sessionId === sessionId)\n\t\t\t\t.map((entry) => toStat(entry));\n\t\t},\n\t\tendLifecycle(artifactId, input) {\n\t\t\tconst entry = artifacts.get(artifactId);\n\t\t\tif (!entry) throw new Error(`Artifact not found: ${artifactId}`);\n\t\t\tif (entry.ended) {\n\t\t\t\tthrow new Error(`Artifact ${artifactId} lifecycle has already ended`);\n\t\t\t}\n\t\t\tentry.ended = true;\n\t\t\tentry.endReason = input.reason;\n\t\t\tentry.bytes = new Uint8Array(0);\n\t\t\treturn toStat(entry);\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"artifact-store.js","sourceRoot":"","sources":["../../src/artifacts/artifact-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Artifact store (2.6a) — session export artifacts with refs, a bounded\n * read boundary, and an explicit end-of-life.\n *\n * Writers store bytes once and hand out serializable refs (id, session,\n * operation, kind, media type, size). Readers get the bytes only through\n * `read`, which is scoped to the owning session; `stat` exposes metadata\n * only. `endLifecycle` terminates an artifact explicitly: later reads fail\n * with a structured `ended` error and stats report the terminal state —\n * nothing is silently deleted or silently kept alive. Renderers and share\n * transports belong to later slices (2.6b-d).\n */\nimport type { ArtifactRefV1 } from \"../core/agent-capability-contract.ts\";\nimport { t } from \"../core/i18n/index.ts\";\n\nexport type { ArtifactRefV1 };\n\nexport interface ArtifactStatV1 {\n\treadonly artifactId: string;\n\treadonly sessionId: string;\n\treadonly operationId: string;\n\treadonly kind: string;\n\treadonly mediaType: string;\n\treadonly sizeBytes?: number;\n\treadonly state: \"available\" | \"ended\";\n\treadonly endReason?: string;\n}\n\nexport interface ArtifactStoreV1 {\n\twrite(input: {\n\t\treadonly sessionId: string;\n\t\treadonly operationId: string;\n\t\treadonly kind: string;\n\t\treadonly mediaType: string;\n\t\treadonly bytes: Uint8Array;\n\t}): { readonly ref: ArtifactRefV1 };\n\tread(input: { readonly artifactId: string; readonly sessionId: string }): {\n\t\treadonly mediaType: string;\n\t\treadonly bytes: Uint8Array;\n\t};\n\tstat(artifactId: string): ArtifactStatV1 | undefined;\n\tlist(sessionId: string): readonly ArtifactStatV1[];\n\tendLifecycle(artifactId: string, input: { readonly reason: string }): ArtifactStatV1;\n}\n\n/** FNV-1a 32-bit over the artifact content — deterministic artifact ids. */\nfunction contentHash(bytes: Uint8Array): string {\n\tlet hash = 0x811c9dc5;\n\tfor (const byte of bytes) {\n\t\thash ^= byte;\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36);\n}\n\nfunction toStat(entry: { ref: ArtifactRefV1; bytes: Uint8Array; ended: boolean; endReason?: string }): ArtifactStatV1 {\n\treturn {\n\t\tartifactId: entry.ref.artifactId,\n\t\tsessionId: entry.ref.sessionId,\n\t\toperationId: entry.ref.operationId,\n\t\tkind: entry.ref.kind,\n\t\tmediaType: entry.ref.mediaType,\n\t\tsizeBytes: entry.ref.sizeBytes,\n\t\tstate: entry.ended ? \"ended\" : \"available\",\n\t\t...(entry.ended ? { endReason: entry.endReason } : {}),\n\t};\n}\n\nexport function createArtifactStore(options: { readonly now?: () => number } = {}): ArtifactStoreV1 {\n\tconst now = options.now ?? (() => Date.now());\n\tconst artifacts = new Map<string, { ref: ArtifactRefV1; bytes: Uint8Array; ended: boolean; endReason?: string }>();\n\tconst sequenceByIdentity = new Map<string, number>();\n\t// Global write counter: guarantees artifact ids are unique across ALL\n\t// (session, operation) identities — identical bytes written by two\n\t// different identities must never collide into one id.\n\tlet globalWriteSequence = 0;\n\n\treturn {\n\t\twrite(input) {\n\t\t\tif (input.bytes.length === 0) throw new Error(\"Artifact bytes must not be empty\");\n\t\t\tconst identity = `${input.sessionId}\\u0000${input.operationId}`;\n\t\t\tconst sequence = (sequenceByIdentity.get(identity) ?? 0) + 1;\n\t\t\tsequenceByIdentity.set(identity, sequence);\n\t\t\tglobalWriteSequence += 1;\n\t\t\tconst artifactId = `art-${contentHash(input.bytes)}-${sequence}-${globalWriteSequence}`;\n\t\t\tconst ref: ArtifactRefV1 = {\n\t\t\t\tartifactId,\n\t\t\t\tsessionId: input.sessionId,\n\t\t\t\toperationId: input.operationId,\n\t\t\t\tkind: input.kind,\n\t\t\t\tmediaType: input.mediaType,\n\t\t\t\tsizeBytes: input.bytes.length,\n\t\t\t\ttruncated: false,\n\t\t\t\tcreatedAt: now(),\n\t\t\t};\n\t\t\tartifacts.set(artifactId, { ref, bytes: input.bytes, ended: false });\n\t\t\treturn { ref };\n\t\t},\n\t\tread(input) {\n\t\t\tconst entry = artifacts.get(input.artifactId);\n\t\t\tif (!entry) throw new Error(t(\"Artifact not found: {artifactId}\", { artifactId: input.artifactId }));\n\t\t\tif (entry.ref.sessionId !== input.sessionId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tt(\"Artifact {artifactId} belongs to a different session\", { artifactId: input.artifactId }),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (entry.ended) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tt(\"Artifact {artifactId} lifecycle has ended: {reason}\", {\n\t\t\t\t\t\tartifactId: input.artifactId,\n\t\t\t\t\t\treason: entry.endReason ?? \"ended\",\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn { mediaType: entry.ref.mediaType, bytes: entry.bytes };\n\t\t},\n\t\tstat(artifactId) {\n\t\t\tconst entry = artifacts.get(artifactId);\n\t\t\treturn entry === undefined ? undefined : toStat(entry);\n\t\t},\n\t\tlist(sessionId) {\n\t\t\treturn [...artifacts.values()]\n\t\t\t\t.filter((entry) => entry.ref.sessionId === sessionId)\n\t\t\t\t.map((entry) => toStat(entry));\n\t\t},\n\t\tendLifecycle(artifactId, input) {\n\t\t\tconst entry = artifacts.get(artifactId);\n\t\t\tif (!entry) throw new Error(t(\"Artifact not found: {artifactId}\", { artifactId }));\n\t\t\tif (entry.ended) {\n\t\t\t\tthrow new Error(t(\"Artifact {artifactId} lifecycle has already ended\", { artifactId }));\n\t\t\t}\n\t\t\tentry.ended = true;\n\t\t\tentry.endReason = input.reason;\n\t\t\tentry.bytes = new Uint8Array(0);\n\t\t\treturn toStat(entry);\n\t\t},\n\t};\n}\n"]}