@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
@@ -56,6 +56,8 @@ export interface SelectorsHost {
56
56
  getUserMessagesForForking(): ForkableUserMessage[];
57
57
  /** Selector surface; the implementation stays in the mode's selector area. */
58
58
  showSelector(create: (done: () => void) => SelectorMount): void;
59
+ /** Refresh the pending (queued) messages area under the editor. */
60
+ updatePendingMessagesDisplay(): void;
59
61
  showStatus(message: string): void;
60
62
  showError(message: string): void;
61
63
  showWarning(message: string): void;
@@ -88,6 +90,13 @@ export declare function findExactModelMatch(host: SelectorsHost, searchTerm: str
88
90
  export declare function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void;
89
91
  export declare function showModelsSelector(host: SelectorsHost): void;
90
92
  export declare function showUserMessageSelector(host: SelectorsHost): void;
93
+ /**
94
+ * Queued-message manager (/queue-list): grouped steering/follow-up entries
95
+ * with in-place reorder, remove, and restore-to-editor. Mutations go through
96
+ * the facade's queue operations; indices follow the facade's queue read view
97
+ * (getSteeringMessages/getFollowUpMessages order).
98
+ */
99
+ export declare function showQueueManagerSelector(host: SelectorsHost): void;
91
100
  export declare function handleCloneCommand(host: SelectorsHost): Promise<void>;
92
101
  export {};
93
102
  //# sourceMappingURL=interactive-selectors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-selectors.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Selectors for interactive mode (S5 slice 5): the suite, thinking, model,\n * scoped-models, user-message fork, and clone selectors.\n *\n * InteractiveMode implements SelectorsHost and keeps same-name delegate\n * methods so prototype-level tests and the command dispatch table keep\n * working; the functions below receive the mode through SelectorsHost and\n * mount every overlay through the host's selector surface (host.showSelector),\n * mirroring the AuthUiHost pattern in ./interactive-auth.ts. Model snapshot,\n * catalog-refresh, and facade access go through narrow host accessors (D-048:\n * facade projections) so this module never reads session internals directly.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport type { Component, EditorComponent, TUI } from \"@agent-forge/tui\";\nimport { Container, SelectList, Spacer, Text } from \"@agent-forge/tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ForkableUserMessage } from \"../../core/agent-session-projection.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../../core/defaults.ts\";\nimport type { CodingAgentFacadeV1, CodingAgentRuntimeFacadeV1 } from \"../../core/facade/index.ts\";\nimport { findExactModelReferenceMatch, resolveModelScopeFromModels } from \"../../core/model-resolver.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { listSuiteIds } from \"../../profiles/suite-loader.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { ModelSelectorComponent } from \"./components/model-selector.ts\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.ts\";\nimport { ThinkingSelectorComponent } from \"./components/thinking-selector.ts\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.ts\";\nimport { type ModelCatalogRuntime, refreshModelCatalogs } from \"./model-catalog-refresh.ts\";\nimport { getSelectListTheme, theme } from \"./theme/theme.ts\";\n\n/** Mount description accepted by the host's selector surface. */\ninterface SelectorMount {\n\tcomponent: Component;\n\tfocus: Component;\n\tdispose?: () => void;\n}\n\n/**\n * Host surface InteractiveMode exposes to this module: the selector entry\n * points (which stay on the mode for dispatch and prototype-level tests) plus\n * narrow accessors for the session runtime, the stable facades, and settings.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nexport interface SelectorsHost {\n\tui: TUI;\n\teditor: EditorComponent;\n\tfooter: FooterComponent;\n\tsettingsManager: SettingsManager;\n\t/** Stable facade (阶段 1 slice 1). */\n\tfacade: CodingAgentFacadeV1;\n\t/** Stable runtime facade (阶段 4 slice 3); manager-level session reads stay here (D-041). */\n\truntimeFacade: CodingAgentRuntimeFacadeV1;\n\n\t/** Narrow catalog-refresh projection through the stable facade (D-048). */\n\tgetModelCatalog(): ModelCatalogRuntime;\n\t/** Available model snapshot through the stable facade (D-048). */\n\tgetAvailableModels(): readonly Model<Api>[];\n\t/** Current session's suite id; the read stays on the mode (session entries). */\n\tgetCurrentSessionSuiteId(): string | undefined;\n\t/** Available thinking levels of the current session. */\n\tgetAvailableThinkingLevels(): ThinkingLevel[];\n\t/** Fork candidates of the current session. */\n\tgetUserMessagesForForking(): ForkableUserMessage[];\n\n\t/** Selector surface; the implementation stays in the mode's selector area. */\n\tshowSelector(create: (done: () => void) => SelectorMount): void;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tupdateEditorBorderColor(): void;\n\tupdateAvailableProviderCount(): void;\n\tmaybeWarnAboutAnthropicSubscriptionAuth(model?: Model<Api>): Promise<void>;\n\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n}\n\nexport function handleSuiteCommand(host: SelectorsHost, suiteId?: string): void {\n\tconst availableSuites = listSuiteIds(getAgentDir());\n\tif (!suiteId) {\n\t\tshowSuiteSelector(host, availableSuites);\n\t\treturn;\n\t}\n\n\tif (!availableSuites.includes(suiteId)) {\n\t\thost.showError(`Unknown suite \"${suiteId}\". Available suites: ${availableSuites.join(\", \")}.`);\n\t\treturn;\n\t}\n\n\thost.settingsManager.setProjectSuite(suiteId);\n\t// /new re-resolves the suite from current settings (the runtime factory\n\t// rebuilds services per session), so the pick applies to the very next\n\t// new session — unless the process was started with an explicit suite\n\t// source, which keeps winning for the whole process (设计 §9 precedence).\n\thost.showStatus(\n\t\t`Suite set to ${suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it`,\n\t);\n}\n\nexport function showSuiteSelector(host: SelectorsHost, availableSuites: readonly string[]): void {\n\topenSuiteListSelector(host, {\n\t\tavailableSuites,\n\t\tonSelect: (suiteId) => handleSuiteCommand(host, suiteId),\n\t\tonCancel: () => host.ui.requestRender(),\n\t});\n}\n\n/**\n * Shared suite list overlay (设计 §9). Marks and preselects the current\n * session's suite; the caller decides what a selection means.\n */\nexport function openSuiteListSelector(\n\thost: SelectorsHost,\n\tcallbacks: {\n\t\tavailableSuites: readonly string[];\n\t\t/** explanatory line under the title; defaults to the /suite wording */\n\t\tnote?: string;\n\t\tonSelect: (suiteId: string) => void;\n\t\tonCancel: () => void;\n\t},\n): void {\n\thost.showSelector((done) => {\n\t\tconst currentSuiteId = host.getCurrentSessionSuiteId();\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.bold(\"Select Suite\"), 1, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\tcallbacks.note ??\n\t\t\t\t\t\t\"The next new session (/new) uses the selected suite; this session keeps its current suite\",\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder());\n\t\tconst list = new SelectList(\n\t\t\tcallbacks.availableSuites.map((id) => ({\n\t\t\t\tvalue: id,\n\t\t\t\tlabel: id,\n\t\t\t\t...(id === currentSuiteId ? { description: \"current session\" } : {}),\n\t\t\t})),\n\t\t\t10,\n\t\t\tgetSelectListTheme(),\n\t\t);\n\t\tif (currentSuiteId !== undefined) {\n\t\t\tconst currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);\n\t\t\tif (currentIndex >= 0) list.setSelectedIndex(currentIndex);\n\t\t}\n\t\tlist.onSelect = (item) => {\n\t\t\tdone();\n\t\t\tcallbacks.onSelect(item.value);\n\t\t};\n\t\tlist.onCancel = () => {\n\t\t\tdone();\n\t\t\tcallbacks.onCancel();\n\t\t};\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new DynamicBorder());\n\t\treturn { component: container, focus: list };\n\t});\n}\n\nexport function handleThinkingCommand(host: SelectorsHost, searchTerm?: string): void {\n\tconst availableLevels = host.getAvailableThinkingLevels();\n\tif (!searchTerm) {\n\t\tshowThinkingSelector(host);\n\t\treturn;\n\t}\n\n\tconst normalized = searchTerm.trim().toLowerCase();\n\tconst level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);\n\tif (!level) {\n\t\thost.showError(`Unknown thinking level \"${searchTerm}\". Available levels: ${availableLevels.join(\", \")}.`);\n\t\treturn;\n\t}\n\n\tselectThinkingLevel(host, level, false);\n}\n\nexport function selectThinkingLevel(host: SelectorsHost, level: ThinkingLevel, persist: boolean): void {\n\ttry {\n\t\thost.facade.setThinkingLevel(level, { persist });\n\t\thost.footer.invalidate();\n\t\thost.updateEditorBorderColor();\n\t\thost.showStatus(persist ? `Default thinking level: ${level}` : `Thinking level: ${level}`);\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function showThinkingSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst selectLevel = (level: ThinkingLevel, persist: boolean) => {\n\t\t\tselectThinkingLevel(host, level, persist);\n\t\t\tdone();\n\t\t};\n\t\tconst selector = new ThinkingSelectorComponent(\n\t\t\thost.facade.getState().thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\thost.getAvailableThinkingLevels(),\n\t\t\t(level) => selectLevel(level, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\t(level) => selectLevel(level, true),\n\t\t\thost.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleModelCommand(host: SelectorsHost, searchTerm?: string): Promise<void> {\n\tif (!searchTerm) {\n\t\tshowModelSelector(host);\n\t\treturn;\n\t}\n\n\tconst model = await findExactModelMatch(host, searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait host.facade.setModel(model, { persist: false });\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(`Model: ${model.id}`);\n\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tshowModelSelector(host, searchTerm);\n}\n\nexport async function findExactModelMatch(host: SelectorsHost, searchTerm: string): Promise<Model<Api> | undefined> {\n\tconst cachedModels =\n\t\thost.facade.getScopedModels().length > 0\n\t\t\t? host.facade.getScopedModels().map((scoped) => scoped.model)\n\t\t\t: [...host.getAvailableModels()];\n\tconst cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);\n\tif (cachedMatch || host.facade.getScopedModels().length > 0) return cachedMatch;\n\n\thost.showStatus(\"Refreshing model catalogs…\");\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, 15_000);\n\ttry {\n\t\tconst result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);\n\t\tif (result.aborted && timedOut) {\n\t\t\thost.showWarning(\"Model refresh timed out; searching cached models.\");\n\t\t} else if (result.errors.size > 0) {\n\t\t\thost.showWarning(`Could not refresh ${[...result.errors.keys()].join(\", \")}; searching cached models.`);\n\t\t}\n\t} catch (error) {\n\t\thost.showWarning(\n\t\t\ttimedOut\n\t\t\t\t? \"Model refresh timed out; searching cached models.\"\n\t\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n\treturn findExactModelReferenceMatch(searchTerm, [...host.getAvailableModels()]);\n}\n\nexport function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void {\n\thost.showSelector((done) => {\n\t\tconst selectModel = async (model: Model<Api>, persist: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait host.facade.setModel(model, { persist });\n\t\t\t\thost.updateAvailableProviderCount();\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\thost.showStatus(persist ? `Default model: ${model.provider}/${model.id}` : `Model: ${model.id}`);\n\t\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t} catch (error) {\n\t\t\t\tdone();\n\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t};\n\t\tconst defaultProvider = host.settingsManager.getDefaultProvider();\n\t\tconst defaultModel = host.settingsManager.getDefaultModel();\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\thost.ui,\n\t\t\thost.facade.getModel(),\n\t\t\t{\n\t\t\t\t// D-048: the selector component consumes a narrow read projection;\n\t\t\t\t// the full ModelRuntime never crosses the host boundary.\n\t\t\t\tgetAvailableSnapshot: () => host.getAvailableModels(),\n\t\t\t\tgetError: () => host.facade.getModelsError(),\n\t\t\t\trefresh: (options) => host.getModelCatalog().refresh(options),\n\t\t\t},\n\t\t\thost.facade.getScopedModels(),\n\t\t\t(model) => selectModel(model, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t\t(model) => selectModel(model, true),\n\t\t\tdefaultProvider && defaultModel ? { provider: defaultProvider, id: defaultModel } : undefined,\n\t\t);\n\t\treturn { component: selector, focus: selector, dispose: () => selector.dispose() };\n\t});\n}\n\nexport function showModelsSelector(host: SelectorsHost): void {\n\tlet availableModels = [...host.getAvailableModels()];\n\tlet availableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = host.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = host.facade.getScopedModels();\n\tconst configuredEnabledIds = (models: readonly Model<Api>[]): string[] | null => {\n\t\tif (!configuredPatterns?.length) return null;\n\t\tconst resolved = resolveModelScopeFromModels(configuredPatterns, models);\n\t\tconst ids = resolved.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t\tfor (const diagnostic of resolved.diagnostics) {\n\t\t\tif (diagnostic.code === \"no-match\" && !ids.includes(diagnostic.pattern)) ids.push(diagnostic.pattern);\n\t\t}\n\t\treturn ids;\n\t};\n\n\tlet currentEnabledIds =\n\t\tsessionScopedModels.length > 0\n\t\t\t? sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`)\n\t\t\t: configuredEnabledIds(availableModels);\n\tlet selectionChanged = false;\n\n\tconst updateSessionModels = (enabledIds: string[] | null): void => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => availableModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled =\n\t\t\tenabledIds !== null && [...availableModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = resolveModelScopeFromModels(enabledIds, availableModels).scopedModels;\n\t\t\thost.facade.setScopedModels(\n\t\t\t\tnewScopedModels.map((scoped) => ({\n\t\t\t\t\tmodel: scoped.model,\n\t\t\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t\t\t})),\n\t\t\t);\n\t\t} else {\n\t\t\thost.facade.setScopedModels([]);\n\t\t}\n\t\thost.updateAvailableProviderCount();\n\t\thost.ui.requestRender();\n\t};\n\n\thost.showSelector((done) => {\n\t\tlet disposed = false;\n\t\tlet timedOut = false;\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort();\n\t\t}, 15_000);\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels: availableModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\trefreshStatus: \"Refreshing model catalogs…\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: (enabledIds) => {\n\t\t\t\t\tselectionChanged = true;\n\t\t\t\t\tupdateSessionModels(enabledIds);\n\t\t\t\t},\n\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\tconst allEnabled =\n\t\t\t\t\t\tenabledIds !== null &&\n\t\t\t\t\t\tenabledIds.length === availableModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => availableModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\thost.showStatus(\"Model selection saved to settings\");\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tvoid refreshModelCatalogs(host.getModelCatalog(), controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tavailableModels = [...host.getAvailableModels()];\n\t\t\t\tavailableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\t\t\t\tif (!selectionChanged && sessionScopedModels.length === 0) {\n\t\t\t\t\tcurrentEnabledIds = configuredEnabledIds(availableModels);\n\t\t\t\t\tselector.updateModels(availableModels, currentEnabledIds);\n\t\t\t\t} else {\n\t\t\t\t\tselector.updateModels(availableModels);\n\t\t\t\t}\n\t\t\t\tif (currentEnabledIds !== null) updateSessionModels(currentEnabledIds);\n\t\t\t\tif (result.aborted && timedOut) {\n\t\t\t\t\tselector.setRefreshStatus(\"Model refresh timed out; showing cached models.\", \"warning\");\n\t\t\t\t} else if (result.errors.size > 0) {\n\t\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\t\t`Could not refresh ${[...result.errors.keys()].join(\", \")}; showing cached models.`,\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tselector.setRefreshStatus(\"Model catalogs refreshed.\", \"success\");\n\t\t\t\t}\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\ttimedOut\n\t\t\t\t\t\t? \"Model refresh timed out; showing cached models.\"\n\t\t\t\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.finally(() => clearTimeout(timeout));\n\t\treturn {\n\t\t\tcomponent: selector,\n\t\t\tfocus: selector,\n\t\t\tdispose: () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tcontroller.abort();\n\t\t\t},\n\t\t};\n\t});\n}\n\nexport function showUserMessageSelector(host: SelectorsHost): void {\n\tconst userMessages = host.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\thost.showStatus(\"No messages to fork from\");\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\thost.showSelector((done) => {\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({\n\t\t\t\tid: m.entryId,\n\t\t\t\ttext: m.text,\n\t\t\t\t...(m.replySummary === undefined ? {} : { replySummary: m.replySummary }),\n\t\t\t})),\n\t\t\tasync (entryId) => {\n\t\t\t\tdone();\n\t\t\t\t// Restore the selected prompt into the editor even when the fork\n\t\t\t\t// fails, so the user never loses the text they chose (codex\n\t\t\t\t// backtrack precedent: restore_backtrack_prompt_after_revert_error).\n\t\t\t\tconst fallbackText = userMessages.find((m) => m.entryId === entryId)?.text ?? \"\";\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await host.runtimeFacade.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\thost.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\thost.showStatus(\"Forked to new session\");\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\thost.editor.setText(fallbackText);\n\t\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSelectedId,\n\t\t);\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n}\n\nexport async function handleCloneCommand(host: SelectorsHost): Promise<void> {\n\tconst leafId = host.facade.getLeafId();\n\tif (!leafId) {\n\t\thost.showStatus(\"Nothing to clone yet\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst result = await host.runtimeFacade.fork(leafId, { position: \"at\" });\n\t\tif (result.cancelled) {\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.setText(\"\");\n\t\thost.showStatus(\"Cloned to new session\");\n\t} catch (error: unknown) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n"]}
1
+ {"version":3,"file":"interactive-selectors.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Selectors for interactive mode (S5 slice 5): the suite, thinking, model,\n * scoped-models, user-message fork, and clone selectors.\n *\n * InteractiveMode implements SelectorsHost and keeps same-name delegate\n * methods so prototype-level tests and the command dispatch table keep\n * working; the functions below receive the mode through SelectorsHost and\n * mount every overlay through the host's selector surface (host.showSelector),\n * mirroring the AuthUiHost pattern in ./interactive-auth.ts. Model snapshot,\n * catalog-refresh, and facade access go through narrow host accessors (D-048:\n * facade projections) so this module never reads session internals directly.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport type { Component, EditorComponent, TUI } from \"@agent-forge/tui\";\nimport { Container, SelectList, Spacer, Text } from \"@agent-forge/tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ForkableUserMessage } from \"../../core/agent-session-projection.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../../core/defaults.ts\";\nimport type { CodingAgentFacadeV1, CodingAgentRuntimeFacadeV1 } from \"../../core/facade/index.ts\";\nimport { t } from \"../../core/i18n/index.ts\";\nimport { findExactModelReferenceMatch, resolveModelScopeFromModels } from \"../../core/model-resolver.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { listSuiteIds } from \"../../profiles/suite-loader.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { ModelSelectorComponent } from \"./components/model-selector.ts\";\nimport { QueueManagerSelectorComponent } from \"./components/queue-manager-selector.ts\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.ts\";\nimport { ThinkingSelectorComponent } from \"./components/thinking-selector.ts\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.ts\";\nimport { type ModelCatalogRuntime, refreshModelCatalogs } from \"./model-catalog-refresh.ts\";\nimport { getSelectListTheme, theme } from \"./theme/theme.ts\";\n\n/** Mount description accepted by the host's selector surface. */\ninterface SelectorMount {\n\tcomponent: Component;\n\tfocus: Component;\n\tdispose?: () => void;\n}\n\n/**\n * Host surface InteractiveMode exposes to this module: the selector entry\n * points (which stay on the mode for dispatch and prototype-level tests) plus\n * narrow accessors for the session runtime, the stable facades, and settings.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nexport interface SelectorsHost {\n\tui: TUI;\n\teditor: EditorComponent;\n\tfooter: FooterComponent;\n\tsettingsManager: SettingsManager;\n\t/** Stable facade (阶段 1 slice 1). */\n\tfacade: CodingAgentFacadeV1;\n\t/** Stable runtime facade (阶段 4 slice 3); manager-level session reads stay here (D-041). */\n\truntimeFacade: CodingAgentRuntimeFacadeV1;\n\n\t/** Narrow catalog-refresh projection through the stable facade (D-048). */\n\tgetModelCatalog(): ModelCatalogRuntime;\n\t/** Available model snapshot through the stable facade (D-048). */\n\tgetAvailableModels(): readonly Model<Api>[];\n\t/** Current session's suite id; the read stays on the mode (session entries). */\n\tgetCurrentSessionSuiteId(): string | undefined;\n\t/** Available thinking levels of the current session. */\n\tgetAvailableThinkingLevels(): ThinkingLevel[];\n\t/** Fork candidates of the current session. */\n\tgetUserMessagesForForking(): ForkableUserMessage[];\n\n\t/** Selector surface; the implementation stays in the mode's selector area. */\n\tshowSelector(create: (done: () => void) => SelectorMount): void;\n\t/** Refresh the pending (queued) messages area under the editor. */\n\tupdatePendingMessagesDisplay(): void;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tupdateEditorBorderColor(): void;\n\tupdateAvailableProviderCount(): void;\n\tmaybeWarnAboutAnthropicSubscriptionAuth(model?: Model<Api>): Promise<void>;\n\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n}\n\nexport function handleSuiteCommand(host: SelectorsHost, suiteId?: string): void {\n\tconst availableSuites = listSuiteIds(getAgentDir());\n\tif (!suiteId) {\n\t\tshowSuiteSelector(host, availableSuites);\n\t\treturn;\n\t}\n\n\tif (!availableSuites.includes(suiteId)) {\n\t\thost.showError(\n\t\t\tt('Unknown suite \"{suiteId}\". Available suites: {suites}.', {\n\t\t\t\tsuiteId,\n\t\t\t\tsuites: availableSuites.join(\", \"),\n\t\t\t}),\n\t\t);\n\t\treturn;\n\t}\n\n\thost.settingsManager.setProjectSuite(suiteId);\n\t// /new re-resolves the suite from current settings (the runtime factory\n\t// rebuilds services per session), so the pick applies to the very next\n\t// new session — unless the process was started with an explicit suite\n\t// source, which keeps winning for the whole process (设计 §9 precedence).\n\thost.showStatus(\n\t\tt(\n\t\t\t\"Suite set to {suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it\",\n\t\t\t{ suiteId },\n\t\t),\n\t);\n}\n\nexport function showSuiteSelector(host: SelectorsHost, availableSuites: readonly string[]): void {\n\topenSuiteListSelector(host, {\n\t\tavailableSuites,\n\t\tonSelect: (suiteId) => handleSuiteCommand(host, suiteId),\n\t\tonCancel: () => host.ui.requestRender(),\n\t});\n}\n\n/**\n * Shared suite list overlay (设计 §9). Marks and preselects the current\n * session's suite; the caller decides what a selection means.\n */\nexport function openSuiteListSelector(\n\thost: SelectorsHost,\n\tcallbacks: {\n\t\tavailableSuites: readonly string[];\n\t\t/** explanatory line under the title; defaults to the /suite wording */\n\t\tnote?: string;\n\t\tonSelect: (suiteId: string) => void;\n\t\tonCancel: () => void;\n\t},\n): void {\n\thost.showSelector((done) => {\n\t\tconst currentSuiteId = host.getCurrentSessionSuiteId();\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.bold(t(\"Select Suite\")), 1, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\tcallbacks.note ??\n\t\t\t\t\t\tt(\"The next new session (/new) uses the selected suite; this session keeps its current suite\"),\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder());\n\t\tconst list = new SelectList(\n\t\t\tcallbacks.availableSuites.map((id) => ({\n\t\t\t\tvalue: id,\n\t\t\t\tlabel: id,\n\t\t\t\t...(id === currentSuiteId ? { description: t(\"current session\") } : {}),\n\t\t\t})),\n\t\t\t10,\n\t\t\tgetSelectListTheme(),\n\t\t);\n\t\tif (currentSuiteId !== undefined) {\n\t\t\tconst currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);\n\t\t\tif (currentIndex >= 0) list.setSelectedIndex(currentIndex);\n\t\t}\n\t\tlist.onSelect = (item) => {\n\t\t\tdone();\n\t\t\tcallbacks.onSelect(item.value);\n\t\t};\n\t\tlist.onCancel = () => {\n\t\t\tdone();\n\t\t\tcallbacks.onCancel();\n\t\t};\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new DynamicBorder());\n\t\treturn { component: container, focus: list };\n\t});\n}\n\nexport function handleThinkingCommand(host: SelectorsHost, searchTerm?: string): void {\n\tconst availableLevels = host.getAvailableThinkingLevels();\n\tif (!searchTerm) {\n\t\tshowThinkingSelector(host);\n\t\treturn;\n\t}\n\n\tconst normalized = searchTerm.trim().toLowerCase();\n\tconst level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);\n\tif (!level) {\n\t\thost.showError(\n\t\t\tt('Unknown thinking level \"{level}\". Available levels: {levels}.', {\n\t\t\t\tlevel: searchTerm,\n\t\t\t\tlevels: availableLevels.join(\", \"),\n\t\t\t}),\n\t\t);\n\t\treturn;\n\t}\n\n\tselectThinkingLevel(host, level, false);\n}\n\nexport function selectThinkingLevel(host: SelectorsHost, level: ThinkingLevel, persist: boolean): void {\n\ttry {\n\t\thost.facade.setThinkingLevel(level, { persist });\n\t\thost.footer.invalidate();\n\t\thost.updateEditorBorderColor();\n\t\thost.showStatus(\n\t\t\tpersist ? t(\"Default thinking level: {level}\", { level }) : t(\"Thinking level: {level}\", { level }),\n\t\t);\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function showThinkingSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst selectLevel = (level: ThinkingLevel, persist: boolean) => {\n\t\t\tselectThinkingLevel(host, level, persist);\n\t\t\tdone();\n\t\t};\n\t\tconst selector = new ThinkingSelectorComponent(\n\t\t\thost.facade.getState().thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\thost.getAvailableThinkingLevels(),\n\t\t\t(level) => selectLevel(level, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\t(level) => selectLevel(level, true),\n\t\t\thost.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleModelCommand(host: SelectorsHost, searchTerm?: string): Promise<void> {\n\tif (!searchTerm) {\n\t\tshowModelSelector(host);\n\t\treturn;\n\t}\n\n\tconst model = await findExactModelMatch(host, searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait host.facade.setModel(model, { persist: false });\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(t(\"Model: {id}\", { id: model.id }));\n\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tshowModelSelector(host, searchTerm);\n}\n\nexport async function findExactModelMatch(host: SelectorsHost, searchTerm: string): Promise<Model<Api> | undefined> {\n\tconst cachedModels =\n\t\thost.facade.getScopedModels().length > 0\n\t\t\t? host.facade.getScopedModels().map((scoped) => scoped.model)\n\t\t\t: [...host.getAvailableModels()];\n\tconst cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);\n\tif (cachedMatch || host.facade.getScopedModels().length > 0) return cachedMatch;\n\n\thost.showStatus(t(\"Refreshing model catalogs…\"));\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, 15_000);\n\ttry {\n\t\tconst result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);\n\t\tif (result.aborted && timedOut) {\n\t\t\thost.showWarning(t(\"Model refresh timed out; searching cached models.\"));\n\t\t} else if (result.errors.size > 0) {\n\t\t\thost.showWarning(\n\t\t\t\tt(\"Could not refresh {providers}; searching cached models.\", {\n\t\t\t\t\tproviders: [...result.errors.keys()].join(\", \"),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\thost.showWarning(\n\t\t\ttimedOut\n\t\t\t\t? t(\"Model refresh timed out; searching cached models.\")\n\t\t\t\t: t(\"Could not refresh model catalogs: {message}\", {\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t}),\n\t\t);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n\treturn findExactModelReferenceMatch(searchTerm, [...host.getAvailableModels()]);\n}\n\nexport function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void {\n\thost.showSelector((done) => {\n\t\tconst selectModel = async (model: Model<Api>, persist: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait host.facade.setModel(model, { persist });\n\t\t\t\thost.updateAvailableProviderCount();\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\thost.showStatus(\n\t\t\t\t\tpersist\n\t\t\t\t\t\t? t(\"Default model: {provider}/{id}\", { provider: model.provider, id: model.id })\n\t\t\t\t\t\t: t(\"Model: {id}\", { id: model.id }),\n\t\t\t\t);\n\t\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t} catch (error) {\n\t\t\t\tdone();\n\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t};\n\t\tconst defaultProvider = host.settingsManager.getDefaultProvider();\n\t\tconst defaultModel = host.settingsManager.getDefaultModel();\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\thost.ui,\n\t\t\thost.facade.getModel(),\n\t\t\t{\n\t\t\t\t// D-048: the selector component consumes a narrow read projection;\n\t\t\t\t// the full ModelRuntime never crosses the host boundary.\n\t\t\t\tgetAvailableSnapshot: () => host.getAvailableModels(),\n\t\t\t\tgetError: () => host.facade.getModelsError(),\n\t\t\t\trefresh: (options) => host.getModelCatalog().refresh(options),\n\t\t\t},\n\t\t\thost.facade.getScopedModels(),\n\t\t\t(model) => selectModel(model, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t\t(model) => selectModel(model, true),\n\t\t\tdefaultProvider && defaultModel ? { provider: defaultProvider, id: defaultModel } : undefined,\n\t\t);\n\t\treturn { component: selector, focus: selector, dispose: () => selector.dispose() };\n\t});\n}\n\nexport function showModelsSelector(host: SelectorsHost): void {\n\tlet availableModels = [...host.getAvailableModels()];\n\tlet availableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = host.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = host.facade.getScopedModels();\n\tconst configuredEnabledIds = (models: readonly Model<Api>[]): string[] | null => {\n\t\tif (!configuredPatterns?.length) return null;\n\t\tconst resolved = resolveModelScopeFromModels(configuredPatterns, models);\n\t\tconst ids = resolved.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t\tfor (const diagnostic of resolved.diagnostics) {\n\t\t\tif (diagnostic.code === \"no-match\" && !ids.includes(diagnostic.pattern)) ids.push(diagnostic.pattern);\n\t\t}\n\t\treturn ids;\n\t};\n\n\tlet currentEnabledIds =\n\t\tsessionScopedModels.length > 0\n\t\t\t? sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`)\n\t\t\t: configuredEnabledIds(availableModels);\n\tlet selectionChanged = false;\n\n\tconst updateSessionModels = (enabledIds: string[] | null): void => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => availableModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled =\n\t\t\tenabledIds !== null && [...availableModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = resolveModelScopeFromModels(enabledIds, availableModels).scopedModels;\n\t\t\thost.facade.setScopedModels(\n\t\t\t\tnewScopedModels.map((scoped) => ({\n\t\t\t\t\tmodel: scoped.model,\n\t\t\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t\t\t})),\n\t\t\t);\n\t\t} else {\n\t\t\thost.facade.setScopedModels([]);\n\t\t}\n\t\thost.updateAvailableProviderCount();\n\t\thost.ui.requestRender();\n\t};\n\n\thost.showSelector((done) => {\n\t\tlet disposed = false;\n\t\tlet timedOut = false;\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort();\n\t\t}, 15_000);\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels: availableModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\trefreshStatus: t(\"Refreshing model catalogs…\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: (enabledIds) => {\n\t\t\t\t\tselectionChanged = true;\n\t\t\t\t\tupdateSessionModels(enabledIds);\n\t\t\t\t},\n\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\tconst allEnabled =\n\t\t\t\t\t\tenabledIds !== null &&\n\t\t\t\t\t\tenabledIds.length === availableModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => availableModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\thost.showStatus(t(\"Model selection saved to settings\"));\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tvoid refreshModelCatalogs(host.getModelCatalog(), controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tavailableModels = [...host.getAvailableModels()];\n\t\t\t\tavailableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\t\t\t\tif (!selectionChanged && sessionScopedModels.length === 0) {\n\t\t\t\t\tcurrentEnabledIds = configuredEnabledIds(availableModels);\n\t\t\t\t\tselector.updateModels(availableModels, currentEnabledIds);\n\t\t\t\t} else {\n\t\t\t\t\tselector.updateModels(availableModels);\n\t\t\t\t}\n\t\t\t\tif (currentEnabledIds !== null) updateSessionModels(currentEnabledIds);\n\t\t\t\tif (result.aborted && timedOut) {\n\t\t\t\t\tselector.setRefreshStatus(t(\"Model refresh timed out; showing cached models.\"), \"warning\");\n\t\t\t\t} else if (result.errors.size > 0) {\n\t\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\t\tt(\"Could not refresh {providers}; showing cached models.\", {\n\t\t\t\t\t\t\tproviders: [...result.errors.keys()].join(\", \"),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tselector.setRefreshStatus(t(\"Model catalogs refreshed.\"), \"success\");\n\t\t\t\t}\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\ttimedOut\n\t\t\t\t\t\t? t(\"Model refresh timed out; showing cached models.\")\n\t\t\t\t\t\t: t(\"Could not refresh model catalogs: {message}\", {\n\t\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.finally(() => clearTimeout(timeout));\n\t\treturn {\n\t\t\tcomponent: selector,\n\t\t\tfocus: selector,\n\t\t\tdispose: () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tcontroller.abort();\n\t\t\t},\n\t\t};\n\t});\n}\n\nexport function showUserMessageSelector(host: SelectorsHost): void {\n\tconst userMessages = host.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\thost.showStatus(t(\"No messages to fork from\"));\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\thost.showSelector((done) => {\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({\n\t\t\t\tid: m.entryId,\n\t\t\t\ttext: m.text,\n\t\t\t\t...(m.replySummary === undefined ? {} : { replySummary: m.replySummary }),\n\t\t\t})),\n\t\t\tasync (entryId) => {\n\t\t\t\tdone();\n\t\t\t\t// Restore the selected prompt into the editor even when the fork\n\t\t\t\t// fails, so the user never loses the text they chose (codex\n\t\t\t\t// backtrack precedent: restore_backtrack_prompt_after_revert_error).\n\t\t\t\tconst fallbackText = userMessages.find((m) => m.entryId === entryId)?.text ?? \"\";\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await host.runtimeFacade.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\thost.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\thost.showStatus(t(\"Forked to new session\"));\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\thost.editor.setText(fallbackText);\n\t\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSelectedId,\n\t\t);\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n}\n\n/**\n * Queued-message manager (/queue-list): grouped steering/follow-up entries\n * with in-place reorder, remove, and restore-to-editor. Mutations go through\n * the facade's queue operations; indices follow the facade's queue read view\n * (getSteeringMessages/getFollowUpMessages order).\n */\nexport function showQueueManagerSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst readQueues = (): { steering: string[]; followUp: string[] } => ({\n\t\t\tsteering: [...host.facade.getSteeringMessages()],\n\t\t\tfollowUp: [...host.facade.getFollowUpMessages()],\n\t\t});\n\t\tconst selector = new QueueManagerSelectorComponent(readQueues(), {\n\t\t\trefresh: readQueues,\n\t\t\tonReorder: (queue, from, to) => host.facade.reorderQueuedMessages(queue, from, to),\n\t\t\tonRemove: (queue, index) => host.facade.removeQueuedMessageAt(queue, index),\n\t\t\t// Restore mirrors /dequeue's editor merge order: the restored text\n\t\t\t// first, the surviving editor draft second, joined with a blank line.\n\t\t\tonRestore: (queue, index) => {\n\t\t\t\tconst text = host.facade.removeQueuedMessageAt(queue, index);\n\t\t\t\tif (text === null) return false;\n\t\t\t\tconst currentText = host.editor.getText();\n\t\t\t\tconst combinedText = [text, currentText].filter((part) => part.trim()).join(\"\\n\\n\");\n\t\t\t\thost.editor.setText(combinedText);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tonClose: () => {\n\t\t\t\tdone();\n\t\t\t\thost.updatePendingMessagesDisplay();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t});\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n}\n\nexport async function handleCloneCommand(host: SelectorsHost): Promise<void> {\n\tconst leafId = host.facade.getLeafId();\n\tif (!leafId) {\n\t\thost.showStatus(t(\"Nothing to clone yet\"));\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst result = await host.runtimeFacade.fork(leafId, { position: \"at\" });\n\t\tif (result.cancelled) {\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.setText(\"\");\n\t\thost.showStatus(t(\"Cloned to new session\"));\n\t} catch (error: unknown) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n"]}
@@ -1,10 +1,12 @@
1
1
  import { Container, SelectList, Spacer, Text } from "@agent-forge/tui";
2
2
  import { getAgentDir } from "../../config.js";
3
3
  import { DEFAULT_THINKING_LEVEL } from "../../core/defaults.js";
4
+ import { t } from "../../core/i18n/index.js";
4
5
  import { findExactModelReferenceMatch, resolveModelScopeFromModels } from "../../core/model-resolver.js";
5
6
  import { listSuiteIds } from "../../profiles/suite-loader.js";
6
7
  import { DynamicBorder } from "./components/dynamic-border.js";
7
8
  import { ModelSelectorComponent } from "./components/model-selector.js";
9
+ import { QueueManagerSelectorComponent } from "./components/queue-manager-selector.js";
8
10
  import { ScopedModelsSelectorComponent } from "./components/scoped-models-selector.js";
9
11
  import { ThinkingSelectorComponent } from "./components/thinking-selector.js";
10
12
  import { UserMessageSelectorComponent } from "./components/user-message-selector.js";
@@ -17,7 +19,10 @@ export function handleSuiteCommand(host, suiteId) {
17
19
  return;
18
20
  }
19
21
  if (!availableSuites.includes(suiteId)) {
20
- host.showError(`Unknown suite "${suiteId}". Available suites: ${availableSuites.join(", ")}.`);
22
+ host.showError(t('Unknown suite "{suiteId}". Available suites: {suites}.', {
23
+ suiteId,
24
+ suites: availableSuites.join(", "),
25
+ }));
21
26
  return;
22
27
  }
23
28
  host.settingsManager.setProjectSuite(suiteId);
@@ -25,7 +30,7 @@ export function handleSuiteCommand(host, suiteId) {
25
30
  // rebuilds services per session), so the pick applies to the very next
26
31
  // new session — unless the process was started with an explicit suite
27
32
  // source, which keeps winning for the whole process (设计 §9 precedence).
28
- host.showStatus(`Suite set to ${suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it`);
33
+ host.showStatus(t("Suite set to {suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it", { suiteId }));
29
34
  }
30
35
  export function showSuiteSelector(host, availableSuites) {
31
36
  openSuiteListSelector(host, {
@@ -43,15 +48,15 @@ export function openSuiteListSelector(host, callbacks) {
43
48
  const currentSuiteId = host.getCurrentSessionSuiteId();
44
49
  const container = new Container();
45
50
  container.addChild(new Spacer(1));
46
- container.addChild(new Text(theme.bold("Select Suite"), 1, 0));
51
+ container.addChild(new Text(theme.bold(t("Select Suite")), 1, 0));
47
52
  container.addChild(new Text(theme.fg("muted", callbacks.note ??
48
- "The next new session (/new) uses the selected suite; this session keeps its current suite"), 1, 0));
53
+ t("The next new session (/new) uses the selected suite; this session keeps its current suite")), 1, 0));
49
54
  container.addChild(new Spacer(1));
50
55
  container.addChild(new DynamicBorder());
51
56
  const list = new SelectList(callbacks.availableSuites.map((id) => ({
52
57
  value: id,
53
58
  label: id,
54
- ...(id === currentSuiteId ? { description: "current session" } : {}),
59
+ ...(id === currentSuiteId ? { description: t("current session") } : {}),
55
60
  })), 10, getSelectListTheme());
56
61
  if (currentSuiteId !== undefined) {
57
62
  const currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);
@@ -80,7 +85,10 @@ export function handleThinkingCommand(host, searchTerm) {
80
85
  const normalized = searchTerm.trim().toLowerCase();
81
86
  const level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);
82
87
  if (!level) {
83
- host.showError(`Unknown thinking level "${searchTerm}". Available levels: ${availableLevels.join(", ")}.`);
88
+ host.showError(t('Unknown thinking level "{level}". Available levels: {levels}.', {
89
+ level: searchTerm,
90
+ levels: availableLevels.join(", "),
91
+ }));
84
92
  return;
85
93
  }
86
94
  selectThinkingLevel(host, level, false);
@@ -90,7 +98,7 @@ export function selectThinkingLevel(host, level, persist) {
90
98
  host.facade.setThinkingLevel(level, { persist });
91
99
  host.footer.invalidate();
92
100
  host.updateEditorBorderColor();
93
- host.showStatus(persist ? `Default thinking level: ${level}` : `Thinking level: ${level}`);
101
+ host.showStatus(persist ? t("Default thinking level: {level}", { level }) : t("Thinking level: {level}", { level }));
94
102
  }
95
103
  catch (error) {
96
104
  host.showError(error instanceof Error ? error.message : String(error));
@@ -120,7 +128,7 @@ export async function handleModelCommand(host, searchTerm) {
120
128
  await host.facade.setModel(model, { persist: false });
121
129
  host.footer.invalidate();
122
130
  host.updateEditorBorderColor();
123
- host.showStatus(`Model: ${model.id}`);
131
+ host.showStatus(t("Model: {id}", { id: model.id }));
124
132
  void host.maybeWarnAboutAnthropicSubscriptionAuth(model);
125
133
  host.checkDaxnutsEasterEgg(model);
126
134
  }
@@ -138,7 +146,7 @@ export async function findExactModelMatch(host, searchTerm) {
138
146
  const cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);
139
147
  if (cachedMatch || host.facade.getScopedModels().length > 0)
140
148
  return cachedMatch;
141
- host.showStatus("Refreshing model catalogs…");
149
+ host.showStatus(t("Refreshing model catalogs…"));
142
150
  const controller = new AbortController();
143
151
  let timedOut = false;
144
152
  const timeout = setTimeout(() => {
@@ -148,16 +156,20 @@ export async function findExactModelMatch(host, searchTerm) {
148
156
  try {
149
157
  const result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);
150
158
  if (result.aborted && timedOut) {
151
- host.showWarning("Model refresh timed out; searching cached models.");
159
+ host.showWarning(t("Model refresh timed out; searching cached models."));
152
160
  }
153
161
  else if (result.errors.size > 0) {
154
- host.showWarning(`Could not refresh ${[...result.errors.keys()].join(", ")}; searching cached models.`);
162
+ host.showWarning(t("Could not refresh {providers}; searching cached models.", {
163
+ providers: [...result.errors.keys()].join(", "),
164
+ }));
155
165
  }
156
166
  }
157
167
  catch (error) {
158
168
  host.showWarning(timedOut
159
- ? "Model refresh timed out; searching cached models."
160
- : `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`);
169
+ ? t("Model refresh timed out; searching cached models.")
170
+ : t("Could not refresh model catalogs: {message}", {
171
+ message: error instanceof Error ? error.message : String(error),
172
+ }));
161
173
  }
162
174
  finally {
163
175
  clearTimeout(timeout);
@@ -173,7 +185,9 @@ export function showModelSelector(host, initialSearchInput) {
173
185
  host.footer.invalidate();
174
186
  host.updateEditorBorderColor();
175
187
  done();
176
- host.showStatus(persist ? `Default model: ${model.provider}/${model.id}` : `Model: ${model.id}`);
188
+ host.showStatus(persist
189
+ ? t("Default model: {provider}/{id}", { provider: model.provider, id: model.id })
190
+ : t("Model: {id}", { id: model.id }));
177
191
  void host.maybeWarnAboutAnthropicSubscriptionAuth(model);
178
192
  host.checkDaxnutsEasterEgg(model);
179
193
  }
@@ -245,7 +259,7 @@ export function showModelsSelector(host) {
245
259
  const selector = new ScopedModelsSelectorComponent({
246
260
  allModels: availableModels,
247
261
  enabledModelIds: currentEnabledIds,
248
- refreshStatus: "Refreshing model catalogs…",
262
+ refreshStatus: t("Refreshing model catalogs…"),
249
263
  }, {
250
264
  onChange: (enabledIds) => {
251
265
  selectionChanged = true;
@@ -257,7 +271,7 @@ export function showModelsSelector(host) {
257
271
  enabledIds.every((id) => availableModelIds.has(id));
258
272
  const newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;
259
273
  host.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);
260
- host.showStatus("Model selection saved to settings");
274
+ host.showStatus(t("Model selection saved to settings"));
261
275
  },
262
276
  onCancel: () => {
263
277
  done();
@@ -280,13 +294,15 @@ export function showModelsSelector(host) {
280
294
  if (currentEnabledIds !== null)
281
295
  updateSessionModels(currentEnabledIds);
282
296
  if (result.aborted && timedOut) {
283
- selector.setRefreshStatus("Model refresh timed out; showing cached models.", "warning");
297
+ selector.setRefreshStatus(t("Model refresh timed out; showing cached models."), "warning");
284
298
  }
285
299
  else if (result.errors.size > 0) {
286
- selector.setRefreshStatus(`Could not refresh ${[...result.errors.keys()].join(", ")}; showing cached models.`, "warning");
300
+ selector.setRefreshStatus(t("Could not refresh {providers}; showing cached models.", {
301
+ providers: [...result.errors.keys()].join(", "),
302
+ }), "warning");
287
303
  }
288
304
  else {
289
- selector.setRefreshStatus("Model catalogs refreshed.", "success");
305
+ selector.setRefreshStatus(t("Model catalogs refreshed."), "success");
290
306
  }
291
307
  host.ui.requestRender();
292
308
  })
@@ -294,8 +310,10 @@ export function showModelsSelector(host) {
294
310
  if (disposed)
295
311
  return;
296
312
  selector.setRefreshStatus(timedOut
297
- ? "Model refresh timed out; showing cached models."
298
- : `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`, "warning");
313
+ ? t("Model refresh timed out; showing cached models.")
314
+ : t("Could not refresh model catalogs: {message}", {
315
+ message: error instanceof Error ? error.message : String(error),
316
+ }), "warning");
299
317
  host.ui.requestRender();
300
318
  })
301
319
  .finally(() => clearTimeout(timeout));
@@ -313,7 +331,7 @@ export function showModelsSelector(host) {
313
331
  export function showUserMessageSelector(host) {
314
332
  const userMessages = host.getUserMessagesForForking();
315
333
  if (userMessages.length === 0) {
316
- host.showStatus("No messages to fork from");
334
+ host.showStatus(t("No messages to fork from"));
317
335
  return;
318
336
  }
319
337
  const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;
@@ -335,7 +353,7 @@ export function showUserMessageSelector(host) {
335
353
  return;
336
354
  }
337
355
  host.editor.setText(result.selectedText ?? "");
338
- host.showStatus("Forked to new session");
356
+ host.showStatus(t("Forked to new session"));
339
357
  }
340
358
  catch (error) {
341
359
  host.editor.setText(fallbackText);
@@ -348,10 +366,46 @@ export function showUserMessageSelector(host) {
348
366
  return { component: selector, focus: selector.getMessageList() };
349
367
  });
350
368
  }
369
+ /**
370
+ * Queued-message manager (/queue-list): grouped steering/follow-up entries
371
+ * with in-place reorder, remove, and restore-to-editor. Mutations go through
372
+ * the facade's queue operations; indices follow the facade's queue read view
373
+ * (getSteeringMessages/getFollowUpMessages order).
374
+ */
375
+ export function showQueueManagerSelector(host) {
376
+ host.showSelector((done) => {
377
+ const readQueues = () => ({
378
+ steering: [...host.facade.getSteeringMessages()],
379
+ followUp: [...host.facade.getFollowUpMessages()],
380
+ });
381
+ const selector = new QueueManagerSelectorComponent(readQueues(), {
382
+ refresh: readQueues,
383
+ onReorder: (queue, from, to) => host.facade.reorderQueuedMessages(queue, from, to),
384
+ onRemove: (queue, index) => host.facade.removeQueuedMessageAt(queue, index),
385
+ // Restore mirrors /dequeue's editor merge order: the restored text
386
+ // first, the surviving editor draft second, joined with a blank line.
387
+ onRestore: (queue, index) => {
388
+ const text = host.facade.removeQueuedMessageAt(queue, index);
389
+ if (text === null)
390
+ return false;
391
+ const currentText = host.editor.getText();
392
+ const combinedText = [text, currentText].filter((part) => part.trim()).join("\n\n");
393
+ host.editor.setText(combinedText);
394
+ return true;
395
+ },
396
+ onClose: () => {
397
+ done();
398
+ host.updatePendingMessagesDisplay();
399
+ host.ui.requestRender();
400
+ },
401
+ });
402
+ return { component: selector, focus: selector.getMessageList() };
403
+ });
404
+ }
351
405
  export async function handleCloneCommand(host) {
352
406
  const leafId = host.facade.getLeafId();
353
407
  if (!leafId) {
354
- host.showStatus("Nothing to clone yet");
408
+ host.showStatus(t("Nothing to clone yet"));
355
409
  return;
356
410
  }
357
411
  try {
@@ -361,7 +415,7 @@ export async function handleCloneCommand(host) {
361
415
  return;
362
416
  }
363
417
  host.editor.setText("");
364
- host.showStatus("Cloned to new session");
418
+ host.showStatus(t("Cloned to new session"));
365
419
  }
366
420
  catch (error) {
367
421
  host.showError(error instanceof Error ? error.message : String(error));
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-selectors.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEzG,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAA4B,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAiD7D,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAE,OAAgB,EAAQ;IAC/E,MAAM,eAAe,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACzC,OAAO;IACR,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,kBAAkB,OAAO,wBAAwB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/F,OAAO;IACR,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,wEAAwE;IACxE,uEAAuE;IACvE,wEAAsE;IACtE,6EAAwE;IACxE,IAAI,CAAC,UAAU,CACd,gBAAgB,OAAO,mHAAiH,CACxI,CAAC;AAAA,CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,eAAkC,EAAQ;IAChG,qBAAqB,CAAC,IAAI,EAAE;QAC3B,eAAe;QACf,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;QACxD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;KACvC,CAAC,CAAC;AAAA,CACH;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACpC,IAAmB,EACnB,SAMC,EACM;IACP,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,SAAS,CAAC,QAAQ,CACjB,IAAI,IAAI,CACP,KAAK,CAAC,EAAE,CACP,OAAO,EACP,SAAS,CAAC,IAAI;YACb,2FAA2F,CAC5F,EACD,CAAC,EACD,CAAC,CACD,CACD,CAAC;QACF,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,UAAU,CAC1B,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACtC,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,GAAG,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC,CAAC,EACH,EAAE,EACF,kBAAkB,EAAE,CACpB,CAAC;QACF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACvE,IAAI,YAAY,IAAI,CAAC;gBAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,IAAI,EAAE,CAAC;YACP,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAA,CAC/B,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;YACrB,IAAI,EAAE,CAAC;YACP,SAAS,CAAC,QAAQ,EAAE,CAAC;QAAA,CACrB,CAAC;QACF,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzB,SAAS,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAA,CAC7C,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAmB,EAAE,UAAmB,EAAQ;IACrF,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;IAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACR,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IAC1F,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,IAAI,CAAC,SAAS,CAAC,2BAA2B,UAAU,wBAAwB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3G,OAAO;IACR,CAAC;IAED,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAAA,CACxC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAmB,EAAE,KAAoB,EAAE,OAAgB,EAAQ;IACtG,IAAI,CAAC;QACJ,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;AAAA,CACD;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAmB,EAAQ;IAC/D,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAE,OAAgB,EAAE,EAAE,CAAC;YAC/D,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1C,IAAI,EAAE,CAAC;QAAA,CACP,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,yBAAyB,CAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,aAAa,IAAI,sBAAsB,EAC9D,IAAI,CAAC,0BAA0B,EAAE,EACjC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EACpC,GAAG,EAAE,CAAC;YACL,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EACnC,IAAI,CAAC,eAAe,CAAC,uBAAuB,EAAE,IAAI,sBAAsB,CACxE,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAA,CAChD,CAAC,CAAC;AAAA,CACH;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAmB,EAAE,UAAmB,EAAiB;IACjG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO;IACR,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1D,IAAI,KAAK,EAAE,CAAC;QACX,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO;IACR,CAAC;IAED,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAAA,CACpC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAmB,EAAE,UAAkB,EAAmC;IACnH,MAAM,YAAY,GACjB,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7D,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,4BAA4B,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC3E,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAEhF,IAAI,CAAC,UAAU,CAAC,8BAA4B,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;QAChC,QAAQ,GAAG,IAAI,CAAC;QAChB,UAAU,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB,EAAE,MAAM,CAAC,CAAC;IACX,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACrF,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzG,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,CACf,QAAQ;YACP,CAAC,CAAC,mDAAmD;YACrD,CAAC,CAAC,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAChG,CAAC;IACH,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,4BAA4B,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;AAAA,CAChF;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,kBAA2B,EAAQ;IACzF,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,KAAK,EAAE,KAAiB,EAAE,OAAgB,EAAE,EAAE,CAAC;YAClE,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC/B,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjG,KAAK,IAAI,CAAC,uCAAuC,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,CAAC;QAAA,CACD,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAC1C,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EACtB;YACC,mEAAmE;YACnE,yDAAyD;YACzD,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACrD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAC5C,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SAC7D,EACD,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EACpC,GAAG,EAAE,CAAC;YACL,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,EACD,kBAAkB,EAClB,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EACnC,eAAe,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAC7F,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;IAAA,CACnF,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAmB,EAAQ;IAC7D,IAAI,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACrD,IAAI,iBAAiB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjG,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;IACnE,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;IAC1D,MAAM,oBAAoB,GAAG,CAAC,MAA6B,EAAmB,EAAE,CAAC;QAChF,IAAI,CAAC,kBAAkB,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC;QAC7C,MAAM,QAAQ,GAAG,2BAA2B,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACjG,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC/C,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,GAAG,CAAC;IAAA,CACX,CAAC;IAEF,IAAI,iBAAiB,GACpB,mBAAmB,CAAC,MAAM,GAAG,CAAC;QAC7B,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACpF,CAAC,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,MAAM,mBAAmB,GAAG,CAAC,UAA2B,EAAQ,EAAE,CAAC;QAClE,iBAAiB,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;QACjE,MAAM,wBAAwB,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;QAC9F,MAAM,yBAAyB,GAC9B,UAAU,KAAK,IAAI,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,UAAU,IAAI,wBAAwB,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC1E,MAAM,eAAe,GAAG,2BAA2B,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,YAAY,CAAC;YAC9F,IAAI,CAAC,MAAM,CAAC,eAAe,CAC1B,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAChC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,aAAa,EAAE,MAAM,CAAC,aAAa;aACnC,CAAC,CAAC,CACH,CAAC;QACH,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IAAA,CACxB,CAAC;IAEF,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChC,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,KAAK,EAAE,CAAC;QAAA,CACnB,EAAE,MAAM,CAAC,CAAC;QACX,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CACjD;YACC,SAAS,EAAE,eAAe;YAC1B,eAAe,EAAE,iBAAiB;YAClC,aAAa,EAAE,8BAA4B;SAC3C,EACD;YACC,QAAQ,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;gBACzB,gBAAgB,GAAG,IAAI,CAAC;gBACxB,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAAA,CAChC;YACD,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC1B,MAAM,UAAU,GACf,UAAU,KAAK,IAAI;oBACnB,UAAU,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM;oBAC5C,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrD,MAAM,WAAW,GAAG,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC/E,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAClF,IAAI,CAAC,UAAU,CAAC,mCAAmC,CAAC,CAAC;YAAA,CACrD;YACD,QAAQ,EAAE,GAAG,EAAE,CAAC;gBACf,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YAAA,CACxB;SACD,CACD,CAAC;QACF,KAAK,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;aAClE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ;gBAAE,OAAO;YACrB,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACjD,iBAAiB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7F,IAAI,CAAC,gBAAgB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3D,iBAAiB,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;gBAC1D,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACP,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,iBAAiB,KAAK,IAAI;gBAAE,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;YACvE,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,QAAQ,CAAC,gBAAgB,CAAC,iDAAiD,EAAE,SAAS,CAAC,CAAC;YACzF,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,gBAAgB,CACxB,qBAAqB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EACnF,SAAS,CACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,QAAQ,CAAC,gBAAgB,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC;YAC1B,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,CAAC,gBAAgB,CACxB,QAAQ;gBACP,CAAC,CAAC,iDAAiD;gBACnD,CAAC,CAAC,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAChG,SAAS,CACT,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,CAAC;aACD,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,OAAO;YACN,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,GAAG,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,UAAU,CAAC,KAAK,EAAE,CAAC;YAAA,CACnB;SACD,CAAC;IAAA,CACF,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAmB,EAAQ;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAEtD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;QAC5C,OAAO;IACR,CAAC;IAED,MAAM,iBAAiB,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAEzE,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,4BAA4B,CAChD,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,CAAC,CAAC,OAAO;YACb,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;SACzE,CAAC,CAAC,EACH,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC;YACP,iEAAiE;YACjE,4DAA4D;YAC5D,qEAAqE;YACrE,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;YACjF,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;oBACxB,OAAO;gBACR,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAClC,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,CAAC;QAAA,CACD,EACD,GAAG,EAAE,CAAC;YACL,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QAAA,CACxB,EACD,iBAAiB,CACjB,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;IAAA,CACjE,CAAC,CAAC;AAAA,CACH;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAmB,EAAiB;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;QACxC,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;AAAA,CACD","sourcesContent":["/**\n * Selectors for interactive mode (S5 slice 5): the suite, thinking, model,\n * scoped-models, user-message fork, and clone selectors.\n *\n * InteractiveMode implements SelectorsHost and keeps same-name delegate\n * methods so prototype-level tests and the command dispatch table keep\n * working; the functions below receive the mode through SelectorsHost and\n * mount every overlay through the host's selector surface (host.showSelector),\n * mirroring the AuthUiHost pattern in ./interactive-auth.ts. Model snapshot,\n * catalog-refresh, and facade access go through narrow host accessors (D-048:\n * facade projections) so this module never reads session internals directly.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport type { Component, EditorComponent, TUI } from \"@agent-forge/tui\";\nimport { Container, SelectList, Spacer, Text } from \"@agent-forge/tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ForkableUserMessage } from \"../../core/agent-session-projection.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../../core/defaults.ts\";\nimport type { CodingAgentFacadeV1, CodingAgentRuntimeFacadeV1 } from \"../../core/facade/index.ts\";\nimport { findExactModelReferenceMatch, resolveModelScopeFromModels } from \"../../core/model-resolver.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { listSuiteIds } from \"../../profiles/suite-loader.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { ModelSelectorComponent } from \"./components/model-selector.ts\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.ts\";\nimport { ThinkingSelectorComponent } from \"./components/thinking-selector.ts\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.ts\";\nimport { type ModelCatalogRuntime, refreshModelCatalogs } from \"./model-catalog-refresh.ts\";\nimport { getSelectListTheme, theme } from \"./theme/theme.ts\";\n\n/** Mount description accepted by the host's selector surface. */\ninterface SelectorMount {\n\tcomponent: Component;\n\tfocus: Component;\n\tdispose?: () => void;\n}\n\n/**\n * Host surface InteractiveMode exposes to this module: the selector entry\n * points (which stay on the mode for dispatch and prototype-level tests) plus\n * narrow accessors for the session runtime, the stable facades, and settings.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nexport interface SelectorsHost {\n\tui: TUI;\n\teditor: EditorComponent;\n\tfooter: FooterComponent;\n\tsettingsManager: SettingsManager;\n\t/** Stable facade (阶段 1 slice 1). */\n\tfacade: CodingAgentFacadeV1;\n\t/** Stable runtime facade (阶段 4 slice 3); manager-level session reads stay here (D-041). */\n\truntimeFacade: CodingAgentRuntimeFacadeV1;\n\n\t/** Narrow catalog-refresh projection through the stable facade (D-048). */\n\tgetModelCatalog(): ModelCatalogRuntime;\n\t/** Available model snapshot through the stable facade (D-048). */\n\tgetAvailableModels(): readonly Model<Api>[];\n\t/** Current session's suite id; the read stays on the mode (session entries). */\n\tgetCurrentSessionSuiteId(): string | undefined;\n\t/** Available thinking levels of the current session. */\n\tgetAvailableThinkingLevels(): ThinkingLevel[];\n\t/** Fork candidates of the current session. */\n\tgetUserMessagesForForking(): ForkableUserMessage[];\n\n\t/** Selector surface; the implementation stays in the mode's selector area. */\n\tshowSelector(create: (done: () => void) => SelectorMount): void;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tupdateEditorBorderColor(): void;\n\tupdateAvailableProviderCount(): void;\n\tmaybeWarnAboutAnthropicSubscriptionAuth(model?: Model<Api>): Promise<void>;\n\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n}\n\nexport function handleSuiteCommand(host: SelectorsHost, suiteId?: string): void {\n\tconst availableSuites = listSuiteIds(getAgentDir());\n\tif (!suiteId) {\n\t\tshowSuiteSelector(host, availableSuites);\n\t\treturn;\n\t}\n\n\tif (!availableSuites.includes(suiteId)) {\n\t\thost.showError(`Unknown suite \"${suiteId}\". Available suites: ${availableSuites.join(\", \")}.`);\n\t\treturn;\n\t}\n\n\thost.settingsManager.setProjectSuite(suiteId);\n\t// /new re-resolves the suite from current settings (the runtime factory\n\t// rebuilds services per session), so the pick applies to the very next\n\t// new session — unless the process was started with an explicit suite\n\t// source, which keeps winning for the whole process (设计 §9 precedence).\n\thost.showStatus(\n\t\t`Suite set to ${suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it`,\n\t);\n}\n\nexport function showSuiteSelector(host: SelectorsHost, availableSuites: readonly string[]): void {\n\topenSuiteListSelector(host, {\n\t\tavailableSuites,\n\t\tonSelect: (suiteId) => handleSuiteCommand(host, suiteId),\n\t\tonCancel: () => host.ui.requestRender(),\n\t});\n}\n\n/**\n * Shared suite list overlay (设计 §9). Marks and preselects the current\n * session's suite; the caller decides what a selection means.\n */\nexport function openSuiteListSelector(\n\thost: SelectorsHost,\n\tcallbacks: {\n\t\tavailableSuites: readonly string[];\n\t\t/** explanatory line under the title; defaults to the /suite wording */\n\t\tnote?: string;\n\t\tonSelect: (suiteId: string) => void;\n\t\tonCancel: () => void;\n\t},\n): void {\n\thost.showSelector((done) => {\n\t\tconst currentSuiteId = host.getCurrentSessionSuiteId();\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.bold(\"Select Suite\"), 1, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\tcallbacks.note ??\n\t\t\t\t\t\t\"The next new session (/new) uses the selected suite; this session keeps its current suite\",\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder());\n\t\tconst list = new SelectList(\n\t\t\tcallbacks.availableSuites.map((id) => ({\n\t\t\t\tvalue: id,\n\t\t\t\tlabel: id,\n\t\t\t\t...(id === currentSuiteId ? { description: \"current session\" } : {}),\n\t\t\t})),\n\t\t\t10,\n\t\t\tgetSelectListTheme(),\n\t\t);\n\t\tif (currentSuiteId !== undefined) {\n\t\t\tconst currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);\n\t\t\tif (currentIndex >= 0) list.setSelectedIndex(currentIndex);\n\t\t}\n\t\tlist.onSelect = (item) => {\n\t\t\tdone();\n\t\t\tcallbacks.onSelect(item.value);\n\t\t};\n\t\tlist.onCancel = () => {\n\t\t\tdone();\n\t\t\tcallbacks.onCancel();\n\t\t};\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new DynamicBorder());\n\t\treturn { component: container, focus: list };\n\t});\n}\n\nexport function handleThinkingCommand(host: SelectorsHost, searchTerm?: string): void {\n\tconst availableLevels = host.getAvailableThinkingLevels();\n\tif (!searchTerm) {\n\t\tshowThinkingSelector(host);\n\t\treturn;\n\t}\n\n\tconst normalized = searchTerm.trim().toLowerCase();\n\tconst level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);\n\tif (!level) {\n\t\thost.showError(`Unknown thinking level \"${searchTerm}\". Available levels: ${availableLevels.join(\", \")}.`);\n\t\treturn;\n\t}\n\n\tselectThinkingLevel(host, level, false);\n}\n\nexport function selectThinkingLevel(host: SelectorsHost, level: ThinkingLevel, persist: boolean): void {\n\ttry {\n\t\thost.facade.setThinkingLevel(level, { persist });\n\t\thost.footer.invalidate();\n\t\thost.updateEditorBorderColor();\n\t\thost.showStatus(persist ? `Default thinking level: ${level}` : `Thinking level: ${level}`);\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function showThinkingSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst selectLevel = (level: ThinkingLevel, persist: boolean) => {\n\t\t\tselectThinkingLevel(host, level, persist);\n\t\t\tdone();\n\t\t};\n\t\tconst selector = new ThinkingSelectorComponent(\n\t\t\thost.facade.getState().thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\thost.getAvailableThinkingLevels(),\n\t\t\t(level) => selectLevel(level, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\t(level) => selectLevel(level, true),\n\t\t\thost.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleModelCommand(host: SelectorsHost, searchTerm?: string): Promise<void> {\n\tif (!searchTerm) {\n\t\tshowModelSelector(host);\n\t\treturn;\n\t}\n\n\tconst model = await findExactModelMatch(host, searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait host.facade.setModel(model, { persist: false });\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(`Model: ${model.id}`);\n\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tshowModelSelector(host, searchTerm);\n}\n\nexport async function findExactModelMatch(host: SelectorsHost, searchTerm: string): Promise<Model<Api> | undefined> {\n\tconst cachedModels =\n\t\thost.facade.getScopedModels().length > 0\n\t\t\t? host.facade.getScopedModels().map((scoped) => scoped.model)\n\t\t\t: [...host.getAvailableModels()];\n\tconst cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);\n\tif (cachedMatch || host.facade.getScopedModels().length > 0) return cachedMatch;\n\n\thost.showStatus(\"Refreshing model catalogs…\");\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, 15_000);\n\ttry {\n\t\tconst result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);\n\t\tif (result.aborted && timedOut) {\n\t\t\thost.showWarning(\"Model refresh timed out; searching cached models.\");\n\t\t} else if (result.errors.size > 0) {\n\t\t\thost.showWarning(`Could not refresh ${[...result.errors.keys()].join(\", \")}; searching cached models.`);\n\t\t}\n\t} catch (error) {\n\t\thost.showWarning(\n\t\t\ttimedOut\n\t\t\t\t? \"Model refresh timed out; searching cached models.\"\n\t\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n\treturn findExactModelReferenceMatch(searchTerm, [...host.getAvailableModels()]);\n}\n\nexport function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void {\n\thost.showSelector((done) => {\n\t\tconst selectModel = async (model: Model<Api>, persist: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait host.facade.setModel(model, { persist });\n\t\t\t\thost.updateAvailableProviderCount();\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\thost.showStatus(persist ? `Default model: ${model.provider}/${model.id}` : `Model: ${model.id}`);\n\t\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t} catch (error) {\n\t\t\t\tdone();\n\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t};\n\t\tconst defaultProvider = host.settingsManager.getDefaultProvider();\n\t\tconst defaultModel = host.settingsManager.getDefaultModel();\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\thost.ui,\n\t\t\thost.facade.getModel(),\n\t\t\t{\n\t\t\t\t// D-048: the selector component consumes a narrow read projection;\n\t\t\t\t// the full ModelRuntime never crosses the host boundary.\n\t\t\t\tgetAvailableSnapshot: () => host.getAvailableModels(),\n\t\t\t\tgetError: () => host.facade.getModelsError(),\n\t\t\t\trefresh: (options) => host.getModelCatalog().refresh(options),\n\t\t\t},\n\t\t\thost.facade.getScopedModels(),\n\t\t\t(model) => selectModel(model, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t\t(model) => selectModel(model, true),\n\t\t\tdefaultProvider && defaultModel ? { provider: defaultProvider, id: defaultModel } : undefined,\n\t\t);\n\t\treturn { component: selector, focus: selector, dispose: () => selector.dispose() };\n\t});\n}\n\nexport function showModelsSelector(host: SelectorsHost): void {\n\tlet availableModels = [...host.getAvailableModels()];\n\tlet availableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = host.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = host.facade.getScopedModels();\n\tconst configuredEnabledIds = (models: readonly Model<Api>[]): string[] | null => {\n\t\tif (!configuredPatterns?.length) return null;\n\t\tconst resolved = resolveModelScopeFromModels(configuredPatterns, models);\n\t\tconst ids = resolved.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t\tfor (const diagnostic of resolved.diagnostics) {\n\t\t\tif (diagnostic.code === \"no-match\" && !ids.includes(diagnostic.pattern)) ids.push(diagnostic.pattern);\n\t\t}\n\t\treturn ids;\n\t};\n\n\tlet currentEnabledIds =\n\t\tsessionScopedModels.length > 0\n\t\t\t? sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`)\n\t\t\t: configuredEnabledIds(availableModels);\n\tlet selectionChanged = false;\n\n\tconst updateSessionModels = (enabledIds: string[] | null): void => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => availableModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled =\n\t\t\tenabledIds !== null && [...availableModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = resolveModelScopeFromModels(enabledIds, availableModels).scopedModels;\n\t\t\thost.facade.setScopedModels(\n\t\t\t\tnewScopedModels.map((scoped) => ({\n\t\t\t\t\tmodel: scoped.model,\n\t\t\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t\t\t})),\n\t\t\t);\n\t\t} else {\n\t\t\thost.facade.setScopedModels([]);\n\t\t}\n\t\thost.updateAvailableProviderCount();\n\t\thost.ui.requestRender();\n\t};\n\n\thost.showSelector((done) => {\n\t\tlet disposed = false;\n\t\tlet timedOut = false;\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort();\n\t\t}, 15_000);\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels: availableModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\trefreshStatus: \"Refreshing model catalogs…\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: (enabledIds) => {\n\t\t\t\t\tselectionChanged = true;\n\t\t\t\t\tupdateSessionModels(enabledIds);\n\t\t\t\t},\n\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\tconst allEnabled =\n\t\t\t\t\t\tenabledIds !== null &&\n\t\t\t\t\t\tenabledIds.length === availableModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => availableModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\thost.showStatus(\"Model selection saved to settings\");\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tvoid refreshModelCatalogs(host.getModelCatalog(), controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tavailableModels = [...host.getAvailableModels()];\n\t\t\t\tavailableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\t\t\t\tif (!selectionChanged && sessionScopedModels.length === 0) {\n\t\t\t\t\tcurrentEnabledIds = configuredEnabledIds(availableModels);\n\t\t\t\t\tselector.updateModels(availableModels, currentEnabledIds);\n\t\t\t\t} else {\n\t\t\t\t\tselector.updateModels(availableModels);\n\t\t\t\t}\n\t\t\t\tif (currentEnabledIds !== null) updateSessionModels(currentEnabledIds);\n\t\t\t\tif (result.aborted && timedOut) {\n\t\t\t\t\tselector.setRefreshStatus(\"Model refresh timed out; showing cached models.\", \"warning\");\n\t\t\t\t} else if (result.errors.size > 0) {\n\t\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\t\t`Could not refresh ${[...result.errors.keys()].join(\", \")}; showing cached models.`,\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tselector.setRefreshStatus(\"Model catalogs refreshed.\", \"success\");\n\t\t\t\t}\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\ttimedOut\n\t\t\t\t\t\t? \"Model refresh timed out; showing cached models.\"\n\t\t\t\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.finally(() => clearTimeout(timeout));\n\t\treturn {\n\t\t\tcomponent: selector,\n\t\t\tfocus: selector,\n\t\t\tdispose: () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tcontroller.abort();\n\t\t\t},\n\t\t};\n\t});\n}\n\nexport function showUserMessageSelector(host: SelectorsHost): void {\n\tconst userMessages = host.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\thost.showStatus(\"No messages to fork from\");\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\thost.showSelector((done) => {\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({\n\t\t\t\tid: m.entryId,\n\t\t\t\ttext: m.text,\n\t\t\t\t...(m.replySummary === undefined ? {} : { replySummary: m.replySummary }),\n\t\t\t})),\n\t\t\tasync (entryId) => {\n\t\t\t\tdone();\n\t\t\t\t// Restore the selected prompt into the editor even when the fork\n\t\t\t\t// fails, so the user never loses the text they chose (codex\n\t\t\t\t// backtrack precedent: restore_backtrack_prompt_after_revert_error).\n\t\t\t\tconst fallbackText = userMessages.find((m) => m.entryId === entryId)?.text ?? \"\";\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await host.runtimeFacade.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\thost.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\thost.showStatus(\"Forked to new session\");\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\thost.editor.setText(fallbackText);\n\t\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSelectedId,\n\t\t);\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n}\n\nexport async function handleCloneCommand(host: SelectorsHost): Promise<void> {\n\tconst leafId = host.facade.getLeafId();\n\tif (!leafId) {\n\t\thost.showStatus(\"Nothing to clone yet\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst result = await host.runtimeFacade.fork(leafId, { position: \"at\" });\n\t\tif (result.cancelled) {\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.setText(\"\");\n\t\thost.showStatus(\"Cloned to new session\");\n\t} catch (error: unknown) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n"]}
1
+ {"version":3,"file":"interactive-selectors.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Selectors for interactive mode (S5 slice 5): the suite, thinking, model,\n * scoped-models, user-message fork, and clone selectors.\n *\n * InteractiveMode implements SelectorsHost and keeps same-name delegate\n * methods so prototype-level tests and the command dispatch table keep\n * working; the functions below receive the mode through SelectorsHost and\n * mount every overlay through the host's selector surface (host.showSelector),\n * mirroring the AuthUiHost pattern in ./interactive-auth.ts. Model snapshot,\n * catalog-refresh, and facade access go through narrow host accessors (D-048:\n * facade projections) so this module never reads session internals directly.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nimport type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport type { Api, Model } from \"@agent-forge/ai/compat\";\nimport type { Component, EditorComponent, TUI } from \"@agent-forge/tui\";\nimport { Container, SelectList, Spacer, Text } from \"@agent-forge/tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ForkableUserMessage } from \"../../core/agent-session-projection.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"../../core/defaults.ts\";\nimport type { CodingAgentFacadeV1, CodingAgentRuntimeFacadeV1 } from \"../../core/facade/index.ts\";\nimport { t } from \"../../core/i18n/index.ts\";\nimport { findExactModelReferenceMatch, resolveModelScopeFromModels } from \"../../core/model-resolver.ts\";\nimport type { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { listSuiteIds } from \"../../profiles/suite-loader.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { ModelSelectorComponent } from \"./components/model-selector.ts\";\nimport { QueueManagerSelectorComponent } from \"./components/queue-manager-selector.ts\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.ts\";\nimport { ThinkingSelectorComponent } from \"./components/thinking-selector.ts\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.ts\";\nimport { type ModelCatalogRuntime, refreshModelCatalogs } from \"./model-catalog-refresh.ts\";\nimport { getSelectListTheme, theme } from \"./theme/theme.ts\";\n\n/** Mount description accepted by the host's selector surface. */\ninterface SelectorMount {\n\tcomponent: Component;\n\tfocus: Component;\n\tdispose?: () => void;\n}\n\n/**\n * Host surface InteractiveMode exposes to this module: the selector entry\n * points (which stay on the mode for dispatch and prototype-level tests) plus\n * narrow accessors for the session runtime, the stable facades, and settings.\n *\n * Internal collaboration interface (same pattern as AuthUiHost): not a plugin\n * API and not exported from the package root.\n */\nexport interface SelectorsHost {\n\tui: TUI;\n\teditor: EditorComponent;\n\tfooter: FooterComponent;\n\tsettingsManager: SettingsManager;\n\t/** Stable facade (阶段 1 slice 1). */\n\tfacade: CodingAgentFacadeV1;\n\t/** Stable runtime facade (阶段 4 slice 3); manager-level session reads stay here (D-041). */\n\truntimeFacade: CodingAgentRuntimeFacadeV1;\n\n\t/** Narrow catalog-refresh projection through the stable facade (D-048). */\n\tgetModelCatalog(): ModelCatalogRuntime;\n\t/** Available model snapshot through the stable facade (D-048). */\n\tgetAvailableModels(): readonly Model<Api>[];\n\t/** Current session's suite id; the read stays on the mode (session entries). */\n\tgetCurrentSessionSuiteId(): string | undefined;\n\t/** Available thinking levels of the current session. */\n\tgetAvailableThinkingLevels(): ThinkingLevel[];\n\t/** Fork candidates of the current session. */\n\tgetUserMessagesForForking(): ForkableUserMessage[];\n\n\t/** Selector surface; the implementation stays in the mode's selector area. */\n\tshowSelector(create: (done: () => void) => SelectorMount): void;\n\t/** Refresh the pending (queued) messages area under the editor. */\n\tupdatePendingMessagesDisplay(): void;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n\tshowWarning(message: string): void;\n\tupdateEditorBorderColor(): void;\n\tupdateAvailableProviderCount(): void;\n\tmaybeWarnAboutAnthropicSubscriptionAuth(model?: Model<Api>): Promise<void>;\n\tcheckDaxnutsEasterEgg(model: { provider: string; id: string }): void;\n}\n\nexport function handleSuiteCommand(host: SelectorsHost, suiteId?: string): void {\n\tconst availableSuites = listSuiteIds(getAgentDir());\n\tif (!suiteId) {\n\t\tshowSuiteSelector(host, availableSuites);\n\t\treturn;\n\t}\n\n\tif (!availableSuites.includes(suiteId)) {\n\t\thost.showError(\n\t\t\tt('Unknown suite \"{suiteId}\". Available suites: {suites}.', {\n\t\t\t\tsuiteId,\n\t\t\t\tsuites: availableSuites.join(\", \"),\n\t\t\t}),\n\t\t);\n\t\treturn;\n\t}\n\n\thost.settingsManager.setProjectSuite(suiteId);\n\t// /new re-resolves the suite from current settings (the runtime factory\n\t// rebuilds services per session), so the pick applies to the very next\n\t// new session — unless the process was started with an explicit suite\n\t// source, which keeps winning for the whole process (设计 §9 precedence).\n\thost.showStatus(\n\t\tt(\n\t\t\t\"Suite set to {suiteId} — applies to the next new session (/new); an explicit --suite or AGENT_FORGE_SUITE startup keeps overriding it\",\n\t\t\t{ suiteId },\n\t\t),\n\t);\n}\n\nexport function showSuiteSelector(host: SelectorsHost, availableSuites: readonly string[]): void {\n\topenSuiteListSelector(host, {\n\t\tavailableSuites,\n\t\tonSelect: (suiteId) => handleSuiteCommand(host, suiteId),\n\t\tonCancel: () => host.ui.requestRender(),\n\t});\n}\n\n/**\n * Shared suite list overlay (设计 §9). Marks and preselects the current\n * session's suite; the caller decides what a selection means.\n */\nexport function openSuiteListSelector(\n\thost: SelectorsHost,\n\tcallbacks: {\n\t\tavailableSuites: readonly string[];\n\t\t/** explanatory line under the title; defaults to the /suite wording */\n\t\tnote?: string;\n\t\tonSelect: (suiteId: string) => void;\n\t\tonCancel: () => void;\n\t},\n): void {\n\thost.showSelector((done) => {\n\t\tconst currentSuiteId = host.getCurrentSessionSuiteId();\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.bold(t(\"Select Suite\")), 1, 0));\n\t\tcontainer.addChild(\n\t\t\tnew Text(\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"muted\",\n\t\t\t\t\tcallbacks.note ??\n\t\t\t\t\t\tt(\"The next new session (/new) uses the selected suite; this session keeps its current suite\"),\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder());\n\t\tconst list = new SelectList(\n\t\t\tcallbacks.availableSuites.map((id) => ({\n\t\t\t\tvalue: id,\n\t\t\t\tlabel: id,\n\t\t\t\t...(id === currentSuiteId ? { description: t(\"current session\") } : {}),\n\t\t\t})),\n\t\t\t10,\n\t\t\tgetSelectListTheme(),\n\t\t);\n\t\tif (currentSuiteId !== undefined) {\n\t\t\tconst currentIndex = callbacks.availableSuites.indexOf(currentSuiteId);\n\t\t\tif (currentIndex >= 0) list.setSelectedIndex(currentIndex);\n\t\t}\n\t\tlist.onSelect = (item) => {\n\t\t\tdone();\n\t\t\tcallbacks.onSelect(item.value);\n\t\t};\n\t\tlist.onCancel = () => {\n\t\t\tdone();\n\t\t\tcallbacks.onCancel();\n\t\t};\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new DynamicBorder());\n\t\treturn { component: container, focus: list };\n\t});\n}\n\nexport function handleThinkingCommand(host: SelectorsHost, searchTerm?: string): void {\n\tconst availableLevels = host.getAvailableThinkingLevels();\n\tif (!searchTerm) {\n\t\tshowThinkingSelector(host);\n\t\treturn;\n\t}\n\n\tconst normalized = searchTerm.trim().toLowerCase();\n\tconst level = availableLevels.find((candidate) => candidate.toLowerCase() === normalized);\n\tif (!level) {\n\t\thost.showError(\n\t\t\tt('Unknown thinking level \"{level}\". Available levels: {levels}.', {\n\t\t\t\tlevel: searchTerm,\n\t\t\t\tlevels: availableLevels.join(\", \"),\n\t\t\t}),\n\t\t);\n\t\treturn;\n\t}\n\n\tselectThinkingLevel(host, level, false);\n}\n\nexport function selectThinkingLevel(host: SelectorsHost, level: ThinkingLevel, persist: boolean): void {\n\ttry {\n\t\thost.facade.setThinkingLevel(level, { persist });\n\t\thost.footer.invalidate();\n\t\thost.updateEditorBorderColor();\n\t\thost.showStatus(\n\t\t\tpersist ? t(\"Default thinking level: {level}\", { level }) : t(\"Thinking level: {level}\", { level }),\n\t\t);\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function showThinkingSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst selectLevel = (level: ThinkingLevel, persist: boolean) => {\n\t\t\tselectThinkingLevel(host, level, persist);\n\t\t\tdone();\n\t\t};\n\t\tconst selector = new ThinkingSelectorComponent(\n\t\t\thost.facade.getState().thinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\thost.getAvailableThinkingLevels(),\n\t\t\t(level) => selectLevel(level, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\t(level) => selectLevel(level, true),\n\t\t\thost.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,\n\t\t);\n\t\treturn { component: selector, focus: selector };\n\t});\n}\n\nexport async function handleModelCommand(host: SelectorsHost, searchTerm?: string): Promise<void> {\n\tif (!searchTerm) {\n\t\tshowModelSelector(host);\n\t\treturn;\n\t}\n\n\tconst model = await findExactModelMatch(host, searchTerm);\n\tif (model) {\n\t\ttry {\n\t\t\tawait host.facade.setModel(model, { persist: false });\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(t(\"Model: {id}\", { id: model.id }));\n\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\treturn;\n\t}\n\n\tshowModelSelector(host, searchTerm);\n}\n\nexport async function findExactModelMatch(host: SelectorsHost, searchTerm: string): Promise<Model<Api> | undefined> {\n\tconst cachedModels =\n\t\thost.facade.getScopedModels().length > 0\n\t\t\t? host.facade.getScopedModels().map((scoped) => scoped.model)\n\t\t\t: [...host.getAvailableModels()];\n\tconst cachedMatch = findExactModelReferenceMatch(searchTerm, cachedModels);\n\tif (cachedMatch || host.facade.getScopedModels().length > 0) return cachedMatch;\n\n\thost.showStatus(t(\"Refreshing model catalogs…\"));\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, 15_000);\n\ttry {\n\t\tconst result = await refreshModelCatalogs(host.getModelCatalog(), controller.signal);\n\t\tif (result.aborted && timedOut) {\n\t\t\thost.showWarning(t(\"Model refresh timed out; searching cached models.\"));\n\t\t} else if (result.errors.size > 0) {\n\t\t\thost.showWarning(\n\t\t\t\tt(\"Could not refresh {providers}; searching cached models.\", {\n\t\t\t\t\tproviders: [...result.errors.keys()].join(\", \"),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\thost.showWarning(\n\t\t\ttimedOut\n\t\t\t\t? t(\"Model refresh timed out; searching cached models.\")\n\t\t\t\t: t(\"Could not refresh model catalogs: {message}\", {\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t}),\n\t\t);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n\treturn findExactModelReferenceMatch(searchTerm, [...host.getAvailableModels()]);\n}\n\nexport function showModelSelector(host: SelectorsHost, initialSearchInput?: string): void {\n\thost.showSelector((done) => {\n\t\tconst selectModel = async (model: Model<Api>, persist: boolean) => {\n\t\t\ttry {\n\t\t\t\tawait host.facade.setModel(model, { persist });\n\t\t\t\thost.updateAvailableProviderCount();\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tdone();\n\t\t\t\thost.showStatus(\n\t\t\t\t\tpersist\n\t\t\t\t\t\t? t(\"Default model: {provider}/{id}\", { provider: model.provider, id: model.id })\n\t\t\t\t\t\t: t(\"Model: {id}\", { id: model.id }),\n\t\t\t\t);\n\t\t\t\tvoid host.maybeWarnAboutAnthropicSubscriptionAuth(model);\n\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t} catch (error) {\n\t\t\t\tdone();\n\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t}\n\t\t};\n\t\tconst defaultProvider = host.settingsManager.getDefaultProvider();\n\t\tconst defaultModel = host.settingsManager.getDefaultModel();\n\t\tconst selector = new ModelSelectorComponent(\n\t\t\thost.ui,\n\t\t\thost.facade.getModel(),\n\t\t\t{\n\t\t\t\t// D-048: the selector component consumes a narrow read projection;\n\t\t\t\t// the full ModelRuntime never crosses the host boundary.\n\t\t\t\tgetAvailableSnapshot: () => host.getAvailableModels(),\n\t\t\t\tgetError: () => host.facade.getModelsError(),\n\t\t\t\trefresh: (options) => host.getModelCatalog().refresh(options),\n\t\t\t},\n\t\t\thost.facade.getScopedModels(),\n\t\t\t(model) => selectModel(model, false),\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSearchInput,\n\t\t\t(model) => selectModel(model, true),\n\t\t\tdefaultProvider && defaultModel ? { provider: defaultProvider, id: defaultModel } : undefined,\n\t\t);\n\t\treturn { component: selector, focus: selector, dispose: () => selector.dispose() };\n\t});\n}\n\nexport function showModelsSelector(host: SelectorsHost): void {\n\tlet availableModels = [...host.getAvailableModels()];\n\tlet availableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\tconst configuredPatterns = host.settingsManager.getEnabledModels();\n\tconst sessionScopedModels = host.facade.getScopedModels();\n\tconst configuredEnabledIds = (models: readonly Model<Api>[]): string[] | null => {\n\t\tif (!configuredPatterns?.length) return null;\n\t\tconst resolved = resolveModelScopeFromModels(configuredPatterns, models);\n\t\tconst ids = resolved.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);\n\t\tfor (const diagnostic of resolved.diagnostics) {\n\t\t\tif (diagnostic.code === \"no-match\" && !ids.includes(diagnostic.pattern)) ids.push(diagnostic.pattern);\n\t\t}\n\t\treturn ids;\n\t};\n\n\tlet currentEnabledIds =\n\t\tsessionScopedModels.length > 0\n\t\t\t? sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`)\n\t\t\t: configuredEnabledIds(availableModels);\n\tlet selectionChanged = false;\n\n\tconst updateSessionModels = (enabledIds: string[] | null): void => {\n\t\tcurrentEnabledIds = enabledIds === null ? null : [...enabledIds];\n\t\tconst hasEnabledAvailableModel = enabledIds?.some((id) => availableModelIds.has(id)) ?? false;\n\t\tconst allAvailableModelsEnabled =\n\t\t\tenabledIds !== null && [...availableModelIds].every((id) => enabledIds.includes(id));\n\t\tif (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {\n\t\t\tconst newScopedModels = resolveModelScopeFromModels(enabledIds, availableModels).scopedModels;\n\t\t\thost.facade.setScopedModels(\n\t\t\t\tnewScopedModels.map((scoped) => ({\n\t\t\t\t\tmodel: scoped.model,\n\t\t\t\t\tthinkingLevel: scoped.thinkingLevel,\n\t\t\t\t})),\n\t\t\t);\n\t\t} else {\n\t\t\thost.facade.setScopedModels([]);\n\t\t}\n\t\thost.updateAvailableProviderCount();\n\t\thost.ui.requestRender();\n\t};\n\n\thost.showSelector((done) => {\n\t\tlet disposed = false;\n\t\tlet timedOut = false;\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort();\n\t\t}, 15_000);\n\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t{\n\t\t\t\tallModels: availableModels,\n\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\trefreshStatus: t(\"Refreshing model catalogs…\"),\n\t\t\t},\n\t\t\t{\n\t\t\t\tonChange: (enabledIds) => {\n\t\t\t\t\tselectionChanged = true;\n\t\t\t\t\tupdateSessionModels(enabledIds);\n\t\t\t\t},\n\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\tconst allEnabled =\n\t\t\t\t\t\tenabledIds !== null &&\n\t\t\t\t\t\tenabledIds.length === availableModels.length &&\n\t\t\t\t\t\tenabledIds.every((id) => availableModelIds.has(id));\n\t\t\t\t\tconst newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;\n\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);\n\t\t\t\t\thost.showStatus(t(\"Model selection saved to settings\"));\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tvoid refreshModelCatalogs(host.getModelCatalog(), controller.signal)\n\t\t\t.then((result) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tavailableModels = [...host.getAvailableModels()];\n\t\t\t\tavailableModelIds = new Set(availableModels.map((model) => `${model.provider}/${model.id}`));\n\t\t\t\tif (!selectionChanged && sessionScopedModels.length === 0) {\n\t\t\t\t\tcurrentEnabledIds = configuredEnabledIds(availableModels);\n\t\t\t\t\tselector.updateModels(availableModels, currentEnabledIds);\n\t\t\t\t} else {\n\t\t\t\t\tselector.updateModels(availableModels);\n\t\t\t\t}\n\t\t\t\tif (currentEnabledIds !== null) updateSessionModels(currentEnabledIds);\n\t\t\t\tif (result.aborted && timedOut) {\n\t\t\t\t\tselector.setRefreshStatus(t(\"Model refresh timed out; showing cached models.\"), \"warning\");\n\t\t\t\t} else if (result.errors.size > 0) {\n\t\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\t\tt(\"Could not refresh {providers}; showing cached models.\", {\n\t\t\t\t\t\t\tproviders: [...result.errors.keys()].join(\", \"),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tselector.setRefreshStatus(t(\"Model catalogs refreshed.\"), \"success\");\n\t\t\t\t}\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (disposed) return;\n\t\t\t\tselector.setRefreshStatus(\n\t\t\t\t\ttimedOut\n\t\t\t\t\t\t? t(\"Model refresh timed out; showing cached models.\")\n\t\t\t\t\t\t: t(\"Could not refresh model catalogs: {message}\", {\n\t\t\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\thost.ui.requestRender();\n\t\t\t})\n\t\t\t.finally(() => clearTimeout(timeout));\n\t\treturn {\n\t\t\tcomponent: selector,\n\t\t\tfocus: selector,\n\t\t\tdispose: () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tcontroller.abort();\n\t\t\t},\n\t\t};\n\t});\n}\n\nexport function showUserMessageSelector(host: SelectorsHost): void {\n\tconst userMessages = host.getUserMessagesForForking();\n\n\tif (userMessages.length === 0) {\n\t\thost.showStatus(t(\"No messages to fork from\"));\n\t\treturn;\n\t}\n\n\tconst initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n\thost.showSelector((done) => {\n\t\tconst selector = new UserMessageSelectorComponent(\n\t\t\tuserMessages.map((m) => ({\n\t\t\t\tid: m.entryId,\n\t\t\t\ttext: m.text,\n\t\t\t\t...(m.replySummary === undefined ? {} : { replySummary: m.replySummary }),\n\t\t\t})),\n\t\t\tasync (entryId) => {\n\t\t\t\tdone();\n\t\t\t\t// Restore the selected prompt into the editor even when the fork\n\t\t\t\t// fails, so the user never loses the text they chose (codex\n\t\t\t\t// backtrack precedent: restore_backtrack_prompt_after_revert_error).\n\t\t\t\tconst fallbackText = userMessages.find((m) => m.entryId === entryId)?.text ?? \"\";\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await host.runtimeFacade.fork(entryId);\n\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\thost.editor.setText(result.selectedText ?? \"\");\n\t\t\t\t\thost.showStatus(t(\"Forked to new session\"));\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\thost.editor.setText(fallbackText);\n\t\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tdone();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t\tinitialSelectedId,\n\t\t);\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n}\n\n/**\n * Queued-message manager (/queue-list): grouped steering/follow-up entries\n * with in-place reorder, remove, and restore-to-editor. Mutations go through\n * the facade's queue operations; indices follow the facade's queue read view\n * (getSteeringMessages/getFollowUpMessages order).\n */\nexport function showQueueManagerSelector(host: SelectorsHost): void {\n\thost.showSelector((done) => {\n\t\tconst readQueues = (): { steering: string[]; followUp: string[] } => ({\n\t\t\tsteering: [...host.facade.getSteeringMessages()],\n\t\t\tfollowUp: [...host.facade.getFollowUpMessages()],\n\t\t});\n\t\tconst selector = new QueueManagerSelectorComponent(readQueues(), {\n\t\t\trefresh: readQueues,\n\t\t\tonReorder: (queue, from, to) => host.facade.reorderQueuedMessages(queue, from, to),\n\t\t\tonRemove: (queue, index) => host.facade.removeQueuedMessageAt(queue, index),\n\t\t\t// Restore mirrors /dequeue's editor merge order: the restored text\n\t\t\t// first, the surviving editor draft second, joined with a blank line.\n\t\t\tonRestore: (queue, index) => {\n\t\t\t\tconst text = host.facade.removeQueuedMessageAt(queue, index);\n\t\t\t\tif (text === null) return false;\n\t\t\t\tconst currentText = host.editor.getText();\n\t\t\t\tconst combinedText = [text, currentText].filter((part) => part.trim()).join(\"\\n\\n\");\n\t\t\t\thost.editor.setText(combinedText);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tonClose: () => {\n\t\t\t\tdone();\n\t\t\t\thost.updatePendingMessagesDisplay();\n\t\t\t\thost.ui.requestRender();\n\t\t\t},\n\t\t});\n\t\treturn { component: selector, focus: selector.getMessageList() };\n\t});\n}\n\nexport async function handleCloneCommand(host: SelectorsHost): Promise<void> {\n\tconst leafId = host.facade.getLeafId();\n\tif (!leafId) {\n\t\thost.showStatus(t(\"Nothing to clone yet\"));\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst result = await host.runtimeFacade.fork(leafId, { position: \"at\" });\n\t\tif (result.cancelled) {\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\thost.editor.setText(\"\");\n\t\thost.showStatus(t(\"Cloned to new session\"));\n\t} catch (error: unknown) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"theme-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EASN,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,qBAAa,0BAA0B;IACtC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,aAAa,CAA0D;IAC/E,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,8BAA8B,CAA2B;IAEjE,YACC,EAAE,EAAE,GAAG,EACP,OAAO,EAAE;QACR,kBAAkB,EAAE,MAAM,eAAe,CAAC;QAC1C,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QACrC,SAAS,EAAE,MAAM,IAAI,CAAC;QACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC7B,EAaD;IAED,SAAS,IAAI,IAAI,CAIhB;IAEK,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBvC;IAED,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtC;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,WAAW,CAO9D;IAEK,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzD;IAED,gBAAgB,CAAC,aAAa,EAAE,KAAK,GAAG,WAAW,CAMlD;IAED,OAAO,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAOxC;IAED,eAAe,IAAI,IAAI,CAEtB;IAED,gBAAgB,IAAI,aAAa,CAEhC;IAED,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,+BAA+B;IAMvC,OAAO,CAAC,kBAAkB;CAc1B","sourcesContent":["import type { TUI } from \"@agent-forge/tui\";\nimport type { SettingsManager } from \"../../../core/settings-manager.ts\";\nimport {\n\tdetectTerminalBackgroundFromEnv,\n\tdetectTerminalBackgroundTheme,\n\tdetectTerminalThemeForAuto,\n\tinitTheme,\n\tparseAutoThemeSetting,\n\tresolveThemeSetting,\n\tsetTheme,\n\tsetThemeInstance,\n\ttype TerminalTheme,\n\ttype Theme,\n} from \"./theme.ts\";\n\ntype ThemeResult = { success: boolean; error?: string };\n\nexport class InteractiveThemeController {\n\tprivate readonly ui: TUI;\n\tprivate readonly getSettingsManager: () => SettingsManager;\n\tprivate readonly showError: (message: string) => void;\n\tprivate readonly onChanged: () => void;\n\tprivate currentThemeSetting: string | undefined;\n\tprivate terminalTheme: TerminalTheme = detectTerminalBackgroundFromEnv().theme;\n\tprivate activeThemeName: string | undefined;\n\tprivate autoSyncEnabled = false;\n\tprivate terminalColorSchemeUnsubscribe: (() => void) | undefined;\n\n\tconstructor(\n\t\tui: TUI,\n\t\toptions: {\n\t\t\tgetSettingsManager: () => SettingsManager;\n\t\t\tshowError: (message: string) => void;\n\t\t\tonChanged: () => void;\n\t\t\tinitialThemeSetting?: string;\n\t\t},\n\t) {\n\t\tthis.ui = ui;\n\t\tthis.getSettingsManager = options.getSettingsManager;\n\t\tthis.showError = options.showError;\n\t\tthis.onChanged = options.onChanged;\n\t\tthis.currentThemeSetting = options.initialThemeSetting;\n\t\tthis.activeThemeName = resolveThemeSetting(\n\t\t\tthis.currentThemeSetting ?? this.getSettingsManager().getThemeSetting(),\n\t\t\tthis.terminalTheme,\n\t\t);\n\t\tinitTheme(this.activeThemeName, true);\n\t\tthis.bindTerminalColorSchemeListener();\n\t}\n\n\trebindTui(): void {\n\t\tthis.terminalColorSchemeUnsubscribe?.();\n\t\tthis.bindTerminalColorSchemeListener();\n\t\tthis.ui.setTerminalColorSchemeNotifications(this.autoSyncEnabled);\n\t}\n\n\tasync applyFromSettings(): Promise<void> {\n\t\tconst settingsManager = this.getSettingsManager();\n\t\tconst themeSetting = this.currentThemeSetting ?? settingsManager.getThemeSetting();\n\t\tconst autoTheme = parseAutoThemeSetting(themeSetting);\n\t\tif (autoTheme) {\n\t\t\tthis.terminalTheme = await detectTerminalThemeForAuto({ ui: this.ui, timeoutMs: 100 });\n\t\t\tthis.setAutoSync(true);\n\t\t\tthis.applyThemeName(this.terminalTheme === \"light\" ? autoTheme.lightTheme : autoTheme.darkTheme, true);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setAutoSync(false);\n\t\tif (themeSetting !== undefined) {\n\t\t\tthis.applyThemeName(themeSetting, true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst detection = await detectTerminalBackgroundTheme({ ui: this.ui, timeoutMs: 100 });\n\t\tthis.terminalTheme = detection.theme;\n\t\tif (!this.applyThemeName(detection.theme).success) return;\n\t\tif (detection.confidence === \"high\") {\n\t\t\tsettingsManager.setTheme(detection.theme);\n\t\t\tawait settingsManager.flush();\n\t\t}\n\t}\n\n\tgetThemeSelection(): string | undefined {\n\t\treturn this.currentThemeSetting ?? this.getSettingsManager().getThemeSetting() ?? this.activeThemeName;\n\t}\n\n\tsetThemeName(themeName: string, showError = false): ThemeResult {\n\t\tthis.setAutoSync(false);\n\t\tconst result = this.applyThemeName(themeName, showError);\n\t\tif (result.success) {\n\t\t\tthis.currentThemeSetting = themeName;\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync setThemeSetting(themeSetting: string): Promise<void> {\n\t\tthis.currentThemeSetting = themeSetting;\n\t\tawait this.applyFromSettings();\n\t}\n\n\tsetThemeInstance(themeInstance: Theme): ThemeResult {\n\t\tthis.setAutoSync(false);\n\t\tsetThemeInstance(themeInstance);\n\t\tthis.activeThemeName = \"<in-memory>\";\n\t\tthis.notifyChanged();\n\t\treturn { success: true };\n\t}\n\n\tpreview(themeSettingOrName: string): void {\n\t\tconst themeName = resolveThemeSetting(themeSettingOrName, this.terminalTheme) ?? this.activeThemeName;\n\t\tif (!themeName) return;\n\t\tif (setTheme(themeName, true).success) {\n\t\t\tthis.ui.invalidate();\n\t\t\tthis.ui.requestRender();\n\t\t}\n\t}\n\n\tdisableAutoSync(): void {\n\t\tthis.setAutoSync(false);\n\t}\n\n\tgetTerminalTheme(): TerminalTheme {\n\t\treturn this.terminalTheme;\n\t}\n\n\tprivate applyThemeName(themeName: string, showError = false): ThemeResult {\n\t\tconst result = setTheme(themeName, true);\n\t\tthis.activeThemeName = result.success ? themeName : \"dark\";\n\t\tthis.notifyChanged();\n\t\tif (!result.success && showError) {\n\t\t\tthis.showError(`Failed to load theme \"${themeName}\": ${result.error}\\nFell back to dark theme.`);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate notifyChanged(): void {\n\t\tthis.ui.invalidate();\n\t\tthis.onChanged();\n\t}\n\n\tprivate setAutoSync(enabled: boolean): void {\n\t\tif (this.autoSyncEnabled === enabled) return;\n\t\tthis.autoSyncEnabled = enabled;\n\t\tthis.ui.setTerminalColorSchemeNotifications(enabled);\n\t}\n\n\tprivate bindTerminalColorSchemeListener(): void {\n\t\tthis.terminalColorSchemeUnsubscribe = this.ui.onTerminalColorSchemeChange((terminalTheme) =>\n\t\t\tthis.applyTerminalTheme(terminalTheme),\n\t\t);\n\t}\n\n\tprivate applyTerminalTheme(terminalTheme: TerminalTheme): void {\n\t\tif (!this.autoSyncEnabled) return;\n\t\tthis.terminalTheme = terminalTheme;\n\t\tconst autoTheme = parseAutoThemeSetting(this.currentThemeSetting ?? this.getSettingsManager().getThemeSetting());\n\t\t// v8 ignore next -- auto sync is only enabled for an auto theme setting, which always parses\n\t\tif (!autoTheme) {\n\t\t\tthis.setAutoSync(false);\n\t\t\treturn;\n\t\t}\n\t\tconst themeName = terminalTheme === \"light\" ? autoTheme.lightTheme : autoTheme.darkTheme;\n\t\tif (themeName !== this.activeThemeName) {\n\t\t\tthis.applyThemeName(themeName);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"theme-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EASN,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,qBAAa,0BAA0B;IACtC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,aAAa,CAA0D;IAC/E,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,8BAA8B,CAA2B;IAEjE,YACC,EAAE,EAAE,GAAG,EACP,OAAO,EAAE;QACR,kBAAkB,EAAE,MAAM,eAAe,CAAC;QAC1C,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QACrC,SAAS,EAAE,MAAM,IAAI,CAAC;QACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC7B,EAaD;IAED,SAAS,IAAI,IAAI,CAIhB;IAEK,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBvC;IAED,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtC;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,WAAW,CAO9D;IAEK,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzD;IAED,gBAAgB,CAAC,aAAa,EAAE,KAAK,GAAG,WAAW,CAMlD;IAED,OAAO,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAOxC;IAED,eAAe,IAAI,IAAI,CAEtB;IAED,gBAAgB,IAAI,aAAa,CAEhC;IAED,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,+BAA+B;IAMvC,OAAO,CAAC,kBAAkB;CAc1B","sourcesContent":["import type { TUI } from \"@agent-forge/tui\";\nimport { t } from \"../../../core/i18n/index.ts\";\nimport type { SettingsManager } from \"../../../core/settings-manager.ts\";\nimport {\n\tdetectTerminalBackgroundFromEnv,\n\tdetectTerminalBackgroundTheme,\n\tdetectTerminalThemeForAuto,\n\tinitTheme,\n\tparseAutoThemeSetting,\n\tresolveThemeSetting,\n\tsetTheme,\n\tsetThemeInstance,\n\ttype TerminalTheme,\n\ttype Theme,\n} from \"./theme.ts\";\n\ntype ThemeResult = { success: boolean; error?: string };\n\nexport class InteractiveThemeController {\n\tprivate readonly ui: TUI;\n\tprivate readonly getSettingsManager: () => SettingsManager;\n\tprivate readonly showError: (message: string) => void;\n\tprivate readonly onChanged: () => void;\n\tprivate currentThemeSetting: string | undefined;\n\tprivate terminalTheme: TerminalTheme = detectTerminalBackgroundFromEnv().theme;\n\tprivate activeThemeName: string | undefined;\n\tprivate autoSyncEnabled = false;\n\tprivate terminalColorSchemeUnsubscribe: (() => void) | undefined;\n\n\tconstructor(\n\t\tui: TUI,\n\t\toptions: {\n\t\t\tgetSettingsManager: () => SettingsManager;\n\t\t\tshowError: (message: string) => void;\n\t\t\tonChanged: () => void;\n\t\t\tinitialThemeSetting?: string;\n\t\t},\n\t) {\n\t\tthis.ui = ui;\n\t\tthis.getSettingsManager = options.getSettingsManager;\n\t\tthis.showError = options.showError;\n\t\tthis.onChanged = options.onChanged;\n\t\tthis.currentThemeSetting = options.initialThemeSetting;\n\t\tthis.activeThemeName = resolveThemeSetting(\n\t\t\tthis.currentThemeSetting ?? this.getSettingsManager().getThemeSetting(),\n\t\t\tthis.terminalTheme,\n\t\t);\n\t\tinitTheme(this.activeThemeName, true);\n\t\tthis.bindTerminalColorSchemeListener();\n\t}\n\n\trebindTui(): void {\n\t\tthis.terminalColorSchemeUnsubscribe?.();\n\t\tthis.bindTerminalColorSchemeListener();\n\t\tthis.ui.setTerminalColorSchemeNotifications(this.autoSyncEnabled);\n\t}\n\n\tasync applyFromSettings(): Promise<void> {\n\t\tconst settingsManager = this.getSettingsManager();\n\t\tconst themeSetting = this.currentThemeSetting ?? settingsManager.getThemeSetting();\n\t\tconst autoTheme = parseAutoThemeSetting(themeSetting);\n\t\tif (autoTheme) {\n\t\t\tthis.terminalTheme = await detectTerminalThemeForAuto({ ui: this.ui, timeoutMs: 100 });\n\t\t\tthis.setAutoSync(true);\n\t\t\tthis.applyThemeName(this.terminalTheme === \"light\" ? autoTheme.lightTheme : autoTheme.darkTheme, true);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setAutoSync(false);\n\t\tif (themeSetting !== undefined) {\n\t\t\tthis.applyThemeName(themeSetting, true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst detection = await detectTerminalBackgroundTheme({ ui: this.ui, timeoutMs: 100 });\n\t\tthis.terminalTheme = detection.theme;\n\t\tif (!this.applyThemeName(detection.theme).success) return;\n\t\tif (detection.confidence === \"high\") {\n\t\t\tsettingsManager.setTheme(detection.theme);\n\t\t\tawait settingsManager.flush();\n\t\t}\n\t}\n\n\tgetThemeSelection(): string | undefined {\n\t\treturn this.currentThemeSetting ?? this.getSettingsManager().getThemeSetting() ?? this.activeThemeName;\n\t}\n\n\tsetThemeName(themeName: string, showError = false): ThemeResult {\n\t\tthis.setAutoSync(false);\n\t\tconst result = this.applyThemeName(themeName, showError);\n\t\tif (result.success) {\n\t\t\tthis.currentThemeSetting = themeName;\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync setThemeSetting(themeSetting: string): Promise<void> {\n\t\tthis.currentThemeSetting = themeSetting;\n\t\tawait this.applyFromSettings();\n\t}\n\n\tsetThemeInstance(themeInstance: Theme): ThemeResult {\n\t\tthis.setAutoSync(false);\n\t\tsetThemeInstance(themeInstance);\n\t\tthis.activeThemeName = \"<in-memory>\";\n\t\tthis.notifyChanged();\n\t\treturn { success: true };\n\t}\n\n\tpreview(themeSettingOrName: string): void {\n\t\tconst themeName = resolveThemeSetting(themeSettingOrName, this.terminalTheme) ?? this.activeThemeName;\n\t\tif (!themeName) return;\n\t\tif (setTheme(themeName, true).success) {\n\t\t\tthis.ui.invalidate();\n\t\t\tthis.ui.requestRender();\n\t\t}\n\t}\n\n\tdisableAutoSync(): void {\n\t\tthis.setAutoSync(false);\n\t}\n\n\tgetTerminalTheme(): TerminalTheme {\n\t\treturn this.terminalTheme;\n\t}\n\n\tprivate applyThemeName(themeName: string, showError = false): ThemeResult {\n\t\tconst result = setTheme(themeName, true);\n\t\tthis.activeThemeName = result.success ? themeName : \"dark\";\n\t\tthis.notifyChanged();\n\t\tif (!result.success && showError) {\n\t\t\tthis.showError(\n\t\t\t\t`${t('Failed to load theme \"{name}\": {error}', {\n\t\t\t\t\tname: themeName,\n\t\t\t\t\terror: result.error ?? \"unknown\",\n\t\t\t\t})}\\n${t(\"Fell back to dark theme.\")}`,\n\t\t\t);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate notifyChanged(): void {\n\t\tthis.ui.invalidate();\n\t\tthis.onChanged();\n\t}\n\n\tprivate setAutoSync(enabled: boolean): void {\n\t\tif (this.autoSyncEnabled === enabled) return;\n\t\tthis.autoSyncEnabled = enabled;\n\t\tthis.ui.setTerminalColorSchemeNotifications(enabled);\n\t}\n\n\tprivate bindTerminalColorSchemeListener(): void {\n\t\tthis.terminalColorSchemeUnsubscribe = this.ui.onTerminalColorSchemeChange((terminalTheme) =>\n\t\t\tthis.applyTerminalTheme(terminalTheme),\n\t\t);\n\t}\n\n\tprivate applyTerminalTheme(terminalTheme: TerminalTheme): void {\n\t\tif (!this.autoSyncEnabled) return;\n\t\tthis.terminalTheme = terminalTheme;\n\t\tconst autoTheme = parseAutoThemeSetting(this.currentThemeSetting ?? this.getSettingsManager().getThemeSetting());\n\t\t// v8 ignore next -- auto sync is only enabled for an auto theme setting, which always parses\n\t\tif (!autoTheme) {\n\t\t\tthis.setAutoSync(false);\n\t\t\treturn;\n\t\t}\n\t\tconst themeName = terminalTheme === \"light\" ? autoTheme.lightTheme : autoTheme.darkTheme;\n\t\tif (themeName !== this.activeThemeName) {\n\t\t\tthis.applyThemeName(themeName);\n\t\t}\n\t}\n}\n"]}