@vibe-forge/client 0.9.0 → 0.10.1

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 (301) hide show
  1. package/AGENTS.md +75 -0
  2. package/dist/assets/abap-DLDM7-KI.js +1 -0
  3. package/dist/assets/apex-DNDY2TF8.js +1 -0
  4. package/dist/assets/{arc-D9HxM0yv.js → arc-C1rWFTer.js} +1 -1
  5. package/dist/assets/azcli-Y6nb8tq_.js +1 -0
  6. package/dist/assets/bat-BwHxbl9M.js +1 -0
  7. package/dist/assets/bicep-CFznDFnq.js +2 -0
  8. package/dist/assets/{blockDiagram-c4efeb88-C_pTeiD4.js → blockDiagram-c4efeb88-DlZ9x70F.js} +1 -1
  9. package/dist/assets/{c4Diagram-c83219d4-_oYrCrLr.js → c4Diagram-c83219d4-BKKxi__y.js} +1 -1
  10. package/dist/assets/cameligo-Bf6VGUru.js +1 -0
  11. package/dist/assets/channel-F1aqMANO.js +1 -0
  12. package/dist/assets/{classDiagram-beda092f-9dnkgPhR.js → classDiagram-beda092f-CVGPySZq.js} +1 -1
  13. package/dist/assets/{classDiagram-v2-2358418a-BUIeZpdO.js → classDiagram-v2-2358418a-7kp8GVVj.js} +1 -1
  14. package/dist/assets/clojure-Dnu-v4kV.js +1 -0
  15. package/dist/assets/clone-B-GCuXNo.js +1 -0
  16. package/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  17. package/dist/assets/coffee-Bd8akH9Z.js +1 -0
  18. package/dist/assets/cpp-BbWJElDN.js +1 -0
  19. package/dist/assets/{createText-1719965b-DuRFplcD.js → createText-1719965b-Dykv8kT9.js} +1 -1
  20. package/dist/assets/csharp-Co3qMtFm.js +1 -0
  21. package/dist/assets/csp-D-4FJmMZ.js +1 -0
  22. package/dist/assets/css-DdJfP1eB.js +3 -0
  23. package/dist/assets/css.worker-BvV5MPou.js +93 -0
  24. package/dist/assets/cssMode-B59COYVW.js +1 -0
  25. package/dist/assets/cypher-cTPe9QuQ.js +1 -0
  26. package/dist/assets/dart-BOtBlQCF.js +1 -0
  27. package/dist/assets/dockerfile-BG73LgW2.js +1 -0
  28. package/dist/assets/ecl-BEgZUVRK.js +1 -0
  29. package/dist/assets/{edges-96097737-CTpq6Ih_.js → edges-96097737-CkZ1ZBro.js} +1 -1
  30. package/dist/assets/editor.worker-CKy7Pnvo.js +26 -0
  31. package/dist/assets/elixir-BkW5O-1t.js +1 -0
  32. package/dist/assets/{erDiagram-0228fc6a-CWFgdO1E.js → erDiagram-0228fc6a-281ADcRp.js} +1 -1
  33. package/dist/assets/flow9-BeJ5waoc.js +1 -0
  34. package/dist/assets/{flowDb-c6c81e3f-8Vdx29oZ.js → flowDb-c6c81e3f-BQjX_flP.js} +1 -1
  35. package/dist/assets/{flowDiagram-50d868cf-6S9wOVNl.js → flowDiagram-50d868cf-DMHZTjES.js} +1 -1
  36. package/dist/assets/flowDiagram-v2-4f6560a1-C5FzdVl1.js +1 -0
  37. package/dist/assets/{flowchart-elk-definition-6af322e1-DVcZ-ZBQ.js → flowchart-elk-definition-6af322e1-CI3yz4z8.js} +1 -1
  38. package/dist/assets/freemarker2-DWnWjibn.js +3 -0
  39. package/dist/assets/fsharp-PahG7c26.js +1 -0
  40. package/dist/assets/{ganttDiagram-a2739b55-DY1QSl-x.js → ganttDiagram-a2739b55-B3IING9L.js} +1 -1
  41. package/dist/assets/{gitGraphDiagram-82fe8481-BP08OBKL.js → gitGraphDiagram-82fe8481-CnArIr_T.js} +1 -1
  42. package/dist/assets/go-acbASCJo.js +1 -0
  43. package/dist/assets/{graph-D8GCszcN.js → graph-BZ1F0Yve.js} +1 -1
  44. package/dist/assets/graphql-BxJiqAUM.js +1 -0
  45. package/dist/assets/handlebars-C1QH9qTz.js +1 -0
  46. package/dist/assets/hcl-DtV1sZF8.js +1 -0
  47. package/dist/assets/html-D1NkqHjC.js +1 -0
  48. package/dist/assets/html.worker-BLJhxQJQ.js +470 -0
  49. package/dist/assets/htmlMode-DAZCE_rA.js +1 -0
  50. package/dist/assets/{index-5325376f-OOoAXU1u.js → index-5325376f-Da9zSHjA.js} +1 -1
  51. package/dist/assets/index-C0vjF3D0.js +1511 -0
  52. package/dist/assets/index-vzEbM21t.css +32 -0
  53. package/dist/assets/{infoDiagram-8eee0895-BHgkXjhJ.js → infoDiagram-8eee0895-DYbFvRM7.js} +1 -1
  54. package/dist/assets/ini-Kd9XrMLS.js +1 -0
  55. package/dist/assets/java-CXBNlu9o.js +1 -0
  56. package/dist/assets/javascript-CoMjGRHa.js +1 -0
  57. package/dist/assets/{journeyDiagram-c64418c1-BljInElp.js → journeyDiagram-c64418c1-Boebox0b.js} +1 -1
  58. package/dist/assets/json.worker-usMZ-FED.js +58 -0
  59. package/dist/assets/jsonMode-D__gAvuz.js +7 -0
  60. package/dist/assets/julia-cl7-CwDS.js +1 -0
  61. package/dist/assets/kotlin-s7OhZKlX.js +1 -0
  62. package/dist/assets/{layout-Cw-SwAFD.js → layout-CTcHNbHp.js} +1 -1
  63. package/dist/assets/less-9HpZscsL.js +2 -0
  64. package/dist/assets/lexon-OrD6JF1K.js +1 -0
  65. package/dist/assets/{line-Q-uZLuUr.js → line-4AwinCz2.js} +1 -1
  66. package/dist/assets/{linear-BahOnNn3.js → linear-CeSMLzJW.js} +1 -1
  67. package/dist/assets/liquid-DZF6egdE.js +1 -0
  68. package/dist/assets/lspLanguageFeatures-6K4lv5S2.js +4 -0
  69. package/dist/assets/lua-Cyyb5UIc.js +1 -0
  70. package/dist/assets/m3-B8OfTtLu.js +1 -0
  71. package/dist/assets/markdown-BFxVWTOG.js +1 -0
  72. package/dist/assets/mdx-Cnt4ka6w.js +1 -0
  73. package/dist/assets/{mermaid.core-BR0Qh3Rd.js → mermaid.core-B0yG5s4D.js} +6 -6
  74. package/dist/assets/{mindmap-definition-8da855dc-Brq2OJUZ.js → mindmap-definition-8da855dc-KJEvXMKj.js} +1 -1
  75. package/dist/assets/mips-CiqrrVzr.js +1 -0
  76. package/dist/assets/msdax-DmeGPVcC.js +1 -0
  77. package/dist/assets/mysql-C_tMU-Nz.js +1 -0
  78. package/dist/assets/objective-c-BDtDVThU.js +1 -0
  79. package/dist/assets/pascal-vHIfCaH5.js +1 -0
  80. package/dist/assets/pascaligo-DtZ0uQbO.js +1 -0
  81. package/dist/assets/perl-Ub6l9XKa.js +1 -0
  82. package/dist/assets/pgsql-BlNEE0v7.js +1 -0
  83. package/dist/assets/php-BBUBE1dy.js +1 -0
  84. package/dist/assets/{pieDiagram-a8764435-uhYdiXro.js → pieDiagram-a8764435-17nFAXPJ.js} +1 -1
  85. package/dist/assets/pla-DSh2-awV.js +1 -0
  86. package/dist/assets/postiats-CocnycG-.js +1 -0
  87. package/dist/assets/powerquery-tScXyioY.js +1 -0
  88. package/dist/assets/powershell-COWaemsV.js +1 -0
  89. package/dist/assets/protobuf-Brw8urJB.js +2 -0
  90. package/dist/assets/pug-8SOpv6rk.js +1 -0
  91. package/dist/assets/python-DA3TtjDv.js +1 -0
  92. package/dist/assets/qsharp-Bw9ernYp.js +1 -0
  93. package/dist/assets/{quadrantDiagram-1e28029f-TwqtEe7e.js → quadrantDiagram-1e28029f-Dt4vubi-.js} +1 -1
  94. package/dist/assets/r-j7ic8hl3.js +1 -0
  95. package/dist/assets/razor-CWDJgvX_.js +1 -0
  96. package/dist/assets/redis-Bu5POkcn.js +1 -0
  97. package/dist/assets/redshift-Bs9aos_-.js +1 -0
  98. package/dist/assets/{requirementDiagram-08caed73-DSXnPRDS.js → requirementDiagram-08caed73-H6aDyDK-.js} +1 -1
  99. package/dist/assets/restructuredtext-CqXO7rUv.js +1 -0
  100. package/dist/assets/ruby-zBfavPgS.js +1 -0
  101. package/dist/assets/rust-BzKRNQWT.js +1 -0
  102. package/dist/assets/{sankeyDiagram-a04cb91d-EADpJeAn.js → sankeyDiagram-a04cb91d-DxsVtbjI.js} +1 -1
  103. package/dist/assets/sb-BBc9UKZt.js +1 -0
  104. package/dist/assets/scala-D9hQfWCl.js +1 -0
  105. package/dist/assets/scheme-BPhDTwHR.js +1 -0
  106. package/dist/assets/scss-CBJaRo0y.js +3 -0
  107. package/dist/assets/{sequenceDiagram-c5b8d532-C8qXvt9z.js → sequenceDiagram-c5b8d532-BHa148XJ.js} +1 -1
  108. package/dist/assets/shell-DiJ1NA_G.js +1 -0
  109. package/dist/assets/solidity-Db0IVjzk.js +1 -0
  110. package/dist/assets/sophia-CnS9iZB_.js +1 -0
  111. package/dist/assets/sparql-CJmd_6j2.js +1 -0
  112. package/dist/assets/sql-ClhHkBeG.js +1 -0
  113. package/dist/assets/st-CHwy0fLd.js +1 -0
  114. package/dist/assets/{stateDiagram-1ecb1508-5W0ghy_S.js → stateDiagram-1ecb1508-DgwBm8LO.js} +1 -1
  115. package/dist/assets/{stateDiagram-v2-c2b004d7-BfwOQJw4.js → stateDiagram-v2-c2b004d7-BK7IQLVc.js} +1 -1
  116. package/dist/assets/{styles-b4e223ce-EkKH_ULb.js → styles-b4e223ce-DzW27Bc-.js} +1 -1
  117. package/dist/assets/{styles-ca3715f6-DwhrtqlU.js → styles-ca3715f6-Dex2GiLT.js} +1 -1
  118. package/dist/assets/{styles-d45a18b0-yqL8KH6x.js → styles-d45a18b0-B6fGtDKS.js} +1 -1
  119. package/dist/assets/{svgDrawCommon-b86b1483--5VjnjhC.js → svgDrawCommon-b86b1483-B4HYgfV5.js} +1 -1
  120. package/dist/assets/swift-Bqt4WxQ4.js +3 -0
  121. package/dist/assets/systemverilog-Bs9z6M-B.js +1 -0
  122. package/dist/assets/tcl-Dm6ycUr_.js +1 -0
  123. package/dist/assets/{timeline-definition-faaaa080-CWOTwik9.js → timeline-definition-faaaa080--QSbWb25.js} +1 -1
  124. package/dist/assets/ts.worker-DGHjMaqB.js +67731 -0
  125. package/dist/assets/tsMode-ZM7ocZCH.js +11 -0
  126. package/dist/assets/twig-Csy3S7wG.js +1 -0
  127. package/dist/assets/typescript-CKWDmBCc.js +1 -0
  128. package/dist/assets/typespec-Btyra-wh.js +1 -0
  129. package/dist/assets/vb-Db0cS2oM.js +1 -0
  130. package/dist/assets/wgsl-BTesnYfV.js +298 -0
  131. package/dist/assets/xml-DuEUAzPi.js +1 -0
  132. package/dist/assets/{xychartDiagram-f5964ef8-CZg47H1t.js → xychartDiagram-f5964ef8-D09Zkv2K.js} +1 -1
  133. package/dist/assets/yaml-DL7QPRYk.js +1 -0
  134. package/dist/favicon.svg +3 -3
  135. package/dist/index.html +2 -2
  136. package/package.json +14 -10
  137. package/public/favicon.svg +3 -3
  138. package/src/api/sessions.ts +36 -0
  139. package/src/api/workspace.ts +19 -0
  140. package/src/api.ts +4 -0
  141. package/src/components/NavRail.scss +9 -10
  142. package/src/components/ShortcutDisplay.scss +38 -0
  143. package/src/components/ShortcutDisplay.tsx +37 -0
  144. package/src/components/ShortcutTooltip.scss +36 -0
  145. package/src/components/ShortcutTooltip.tsx +84 -0
  146. package/src/components/Sidebar.scss +55 -13
  147. package/src/components/Sidebar.tsx +141 -52
  148. package/src/components/chat/AGENTS.md +163 -0
  149. package/src/components/chat/ChatHeader.scss +308 -49
  150. package/src/components/chat/ChatHeader.tsx +394 -80
  151. package/src/components/chat/ChatHistoryView.tsx +353 -69
  152. package/src/components/chat/ChatSettingsView.tsx +5 -3
  153. package/src/components/chat/ChatTimelineView.scss +3 -2
  154. package/src/components/chat/{sender/ThinkingStatus.tsx → ThinkingStatus.tsx} +1 -1
  155. package/src/components/chat/messages/MessageContextMenu.scss +145 -0
  156. package/src/components/chat/messages/MessageContextMenu.tsx +108 -0
  157. package/src/components/chat/messages/MessageContextMenuContent.tsx +87 -0
  158. package/src/components/chat/messages/MessageFooter.tsx +44 -24
  159. package/src/components/chat/messages/MessageItem.scss +157 -10
  160. package/src/components/chat/messages/MessageItem.tsx +382 -13
  161. package/src/components/chat/messages/build-message-context-menu-entries.ts +166 -0
  162. package/src/components/chat/messages/message-content-utils.ts +121 -0
  163. package/src/components/chat/messages/message-turns.ts +88 -0
  164. package/src/components/chat/messages/message-utils.ts +19 -1
  165. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +86 -0
  166. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.tsx +54 -0
  167. package/src/components/chat/sender/@components/adapter-select/AdapterSelectDropdown.scss +42 -0
  168. package/src/components/chat/sender/@components/effort-select/EffortSelectControl.scss +68 -0
  169. package/src/components/chat/sender/@components/effort-select/EffortSelectControl.tsx +137 -0
  170. package/src/components/chat/sender/@components/effort-select/EffortSelectDropdown.scss +96 -0
  171. package/src/components/chat/sender/@components/model-select/ModelSelectControl.scss +82 -0
  172. package/src/components/chat/sender/@components/model-select/ModelSelectControl.tsx +171 -0
  173. package/src/components/chat/sender/@components/model-select/ModelSelectMenu.scss +95 -0
  174. package/src/components/chat/sender/@components/model-select/ModelSelectMenuLabels.scss +144 -0
  175. package/src/components/chat/sender/@components/model-select/ModelSelectOptionLabel.tsx +109 -0
  176. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.scss +106 -0
  177. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.tsx +156 -0
  178. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsOption.scss +34 -0
  179. package/src/components/chat/sender/@components/reference-actions/ReferencePermissionActionsPopover.tsx +111 -0
  180. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.scss +103 -0
  181. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.tsx +47 -0
  182. package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +137 -0
  183. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.scss +178 -0
  184. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.tsx +145 -0
  185. package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.scss +47 -0
  186. package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.tsx +121 -0
  187. package/src/components/chat/sender/@components/sender-monaco-editor/monaco-runtime.ts +99 -0
  188. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-editor-handle.ts +48 -0
  189. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-editor.ts +209 -0
  190. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-theme.ts +24 -0
  191. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.scss +54 -0
  192. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.tsx +80 -0
  193. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectBase.scss +71 -0
  194. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectShared.scss +118 -0
  195. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.scss +99 -0
  196. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.tsx +87 -0
  197. package/src/components/chat/sender/@core/build-sender-controller-result.ts +119 -0
  198. package/src/components/chat/sender/@core/build-sender-toolbar.ts +122 -0
  199. package/src/components/chat/sender/@core/content-attachments.ts +76 -0
  200. package/src/components/chat/sender/@core/create-sender-toolbar-handlers.ts +115 -0
  201. package/src/components/chat/sender/@core/get-sender-interaction-state.ts +18 -0
  202. package/src/components/chat/sender/@core/get-sender-runtime-state.ts +14 -0
  203. package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +155 -0
  204. package/src/components/chat/sender/@hooks/use-model-select-browser.tsx +189 -0
  205. package/src/components/chat/sender/@hooks/use-sender-attachments.ts +143 -0
  206. package/src/components/chat/sender/@hooks/use-sender-autofocus.ts +34 -0
  207. package/src/components/chat/sender/@hooks/use-sender-completion.ts +62 -0
  208. package/src/components/chat/sender/@hooks/use-sender-composer-state.ts +34 -0
  209. package/src/components/chat/sender/@hooks/use-sender-controller.ts +193 -0
  210. package/src/components/chat/sender/@hooks/use-sender-focus-restore.ts +72 -0
  211. package/src/components/chat/sender/@hooks/use-sender-history.ts +79 -0
  212. package/src/components/chat/sender/@hooks/use-sender-keydown.ts +113 -0
  213. package/src/components/chat/sender/@hooks/use-sender-reference-actions.ts +191 -0
  214. package/src/components/chat/sender/@hooks/use-sender-reference-focus-restore.ts +21 -0
  215. package/src/components/chat/sender/@hooks/use-sender-refs.ts +19 -0
  216. package/src/components/chat/sender/@hooks/use-sender-select-overlays.ts +83 -0
  217. package/src/components/chat/sender/@hooks/use-sender-shortcuts.ts +78 -0
  218. package/src/components/chat/sender/@hooks/use-sender-submit.ts +81 -0
  219. package/src/components/chat/sender/@types/sender-composer.ts +19 -0
  220. package/src/components/chat/sender/@types/sender-editor.ts +12 -0
  221. package/src/components/chat/sender/@types/sender-props.ts +50 -0
  222. package/src/components/chat/sender/@types/sender-toolbar-types.ts +83 -0
  223. package/src/components/chat/sender/@types/sender-types.ts +21 -0
  224. package/src/components/chat/sender/@utils/sender-completion.ts +164 -0
  225. package/src/components/chat/sender/@utils/sender-constants.ts +18 -0
  226. package/src/components/chat/sender/@utils/sender-utils.ts +45 -0
  227. package/src/components/chat/sender/Sender.scss +6 -737
  228. package/src/components/chat/sender/Sender.tsx +53 -921
  229. package/src/components/chat/session-metadata.ts +55 -0
  230. package/src/components/chat/terminal/@hooks/use-terminal-instance.ts +152 -0
  231. package/src/components/chat/terminal/@hooks/use-terminal-session.ts +196 -0
  232. package/src/components/chat/terminal/ChatTerminalView.scss +62 -0
  233. package/src/components/chat/terminal/ChatTerminalView.tsx +114 -0
  234. package/src/components/chat/tools/core/ToolGroup.scss +7 -0
  235. package/src/components/chat/tools/core/ToolGroup.tsx +94 -44
  236. package/src/components/config/ConfigSectionForm.tsx +8 -1
  237. package/src/components/config/ConfigShortcutInput.tsx +9 -2
  238. package/src/components/config/configSchema.ts +12 -2
  239. package/src/components/config/record-editors/ModelServicesRecordEditor.tsx +0 -14
  240. package/src/components/dock-panel/DockPanel.scss +152 -0
  241. package/src/components/dock-panel/DockPanel.tsx +195 -0
  242. package/src/components/layout/AppShell.scss +40 -2
  243. package/src/components/layout/AppShell.tsx +25 -10
  244. package/src/components/sidebar/SessionContextMenu.scss +143 -0
  245. package/src/components/sidebar/SessionContextMenu.tsx +196 -0
  246. package/src/components/sidebar/SessionContextMenuContent.tsx +89 -0
  247. package/src/components/sidebar/SessionItem.scss +150 -67
  248. package/src/components/sidebar/SessionItem.tsx +183 -134
  249. package/src/components/sidebar/SessionList.scss +47 -17
  250. package/src/components/sidebar/SessionList.tsx +31 -16
  251. package/src/components/sidebar/SidebarHeader.scss +329 -49
  252. package/src/components/sidebar/SidebarHeader.tsx +108 -86
  253. package/src/components/sidebar/SidebarHeaderBatchActions.tsx +81 -0
  254. package/src/components/sidebar/SidebarHeaderSearchActions.tsx +176 -0
  255. package/src/components/sidebar/SidebarHeaderSelectField.tsx +24 -0
  256. package/src/components/sidebar/filter-utils.ts +23 -0
  257. package/src/components/workspace/ContextFilePicker.scss +64 -0
  258. package/src/components/workspace/ContextFilePicker.tsx +171 -0
  259. package/src/connectionManager.ts +4 -2
  260. package/src/hooks/chat/interaction-state.ts +67 -0
  261. package/src/hooks/chat/model-selector-data-builders.ts +146 -0
  262. package/src/hooks/chat/model-selector-data-option-utils.ts +62 -0
  263. package/src/hooks/chat/model-selector-data-types.ts +27 -0
  264. package/src/hooks/chat/model-selector-data.ts +109 -0
  265. package/src/hooks/chat/model-selector-recommendations.ts +69 -0
  266. package/src/hooks/chat/model-selector.ts +9 -0
  267. package/src/hooks/chat/use-chat-interaction.ts +13 -8
  268. package/src/hooks/chat/use-chat-model-adapter-selection.tsx +167 -164
  269. package/src/hooks/chat/use-chat-models.tsx +46 -23
  270. package/src/hooks/chat/use-chat-session-actions.ts +69 -23
  271. package/src/hooks/chat/use-chat-session-messages.ts +158 -60
  272. package/src/hooks/chat/use-chat-session.ts +34 -9
  273. package/src/hooks/chat/use-chat-view.ts +26 -6
  274. package/src/hooks/chat/use-composer-control-shortcuts.ts +69 -0
  275. package/src/hooks/chat/use-terminal-dock-visibility.ts +39 -0
  276. package/src/hooks/use-roving-focus-list.ts +104 -0
  277. package/src/hooks/use-sidebar-navigation.ts +9 -4
  278. package/src/hooks/use-sidebar-query-state.ts +79 -0
  279. package/src/main.tsx +6 -1
  280. package/src/resources/locales/en.json +140 -6
  281. package/src/resources/locales/zh.json +140 -6
  282. package/src/routes/ChatRoute.scss +159 -4
  283. package/src/routes/ChatRoute.tsx +72 -10
  284. package/src/runtime-config.ts +21 -0
  285. package/src/store/index.ts +1 -3
  286. package/src/styles/global.scss +12 -2
  287. package/src/utils/chat-links.ts +21 -0
  288. package/src/utils/copy.ts +18 -0
  289. package/src/utils/shortcutUtils.ts +111 -1
  290. package/src/vite-env.d.ts +1 -0
  291. package/src/ws.ts +6 -5
  292. package/vite.config.ts +71 -7
  293. package/dist/assets/channel-Di8KkPU4.js +0 -1
  294. package/dist/assets/clone-B065n6L-.js +0 -1
  295. package/dist/assets/flowDiagram-v2-4f6560a1-nj-oVLPK.js +0 -1
  296. package/dist/assets/index-BZe1Qtye.css +0 -1
  297. package/dist/assets/index-DV3eI2aD.js +0 -557
  298. package/src/components/chat/sender/CompletionMenu.scss +0 -70
  299. package/src/components/chat/sender/CompletionMenu.tsx +0 -58
  300. /package/src/components/chat/{sender/ThinkingStatus.scss → ThinkingStatus.scss} +0 -0
  301. /package/src/components/chat/sender/{interaction-request.ts → @core/interaction-request.ts} +0 -0
@@ -0,0 +1,146 @@
1
+ import type {
2
+ AdapterBuiltinModel,
3
+ ModelMetadataConfig,
4
+ ModelServiceConfig,
5
+ RecommendedModelConfig
6
+ } from '@vibe-forge/types'
7
+
8
+ import type { ServiceModelEntry } from './model-selector'
9
+ import {
10
+ buildServiceModelSelector,
11
+ resolveModelDisplayMetadata,
12
+ resolveModelServiceTitle,
13
+ resolveServiceModelSelector
14
+ } from './model-selector'
15
+ import { buildModelSelectOption } from './model-selector-data-option-utils'
16
+
17
+ export const buildServiceModelGroups = (params: {
18
+ mergedModelServices: Record<string, ModelServiceConfig>
19
+ mergedModels: Record<string, ModelMetadataConfig>
20
+ }) => {
21
+ return Object.entries(params.mergedModelServices)
22
+ .map(([serviceKey, serviceValue]) => {
23
+ const service = (serviceValue != null && typeof serviceValue === 'object')
24
+ ? serviceValue
25
+ : undefined
26
+ const serviceTitle = resolveModelServiceTitle({
27
+ serviceKey,
28
+ service
29
+ })
30
+ const title = serviceTitle?.trim() !== '' ? serviceTitle : serviceKey
31
+ const models = Array.isArray(service?.models)
32
+ ? service.models.filter((item: unknown): item is string => typeof item === 'string')
33
+ : []
34
+
35
+ if (models.length === 0) return null
36
+
37
+ return {
38
+ key: `service:${serviceKey}`,
39
+ title,
40
+ description: service?.description?.trim() || undefined,
41
+ options: models.map((model) => {
42
+ const value = buildServiceModelSelector(serviceKey, model)
43
+ const metadata = resolveModelDisplayMetadata({
44
+ model: value,
45
+ models: params.mergedModels
46
+ })
47
+
48
+ return buildModelSelectOption({
49
+ value,
50
+ title: metadata?.title ?? metadata?.aliases[0] ?? model,
51
+ modelName: model,
52
+ description: metadata?.description,
53
+ aliases: metadata?.aliases,
54
+ serviceKey,
55
+ serviceTitle,
56
+ searchTerms: [model, ...(metadata?.aliases ?? []), metadata?.title]
57
+ })
58
+ })
59
+ }
60
+ })
61
+ .filter((group): group is NonNullable<typeof group> => group != null)
62
+ }
63
+
64
+ export const buildBuiltinModelGroups = (params: {
65
+ activeBuiltinModels: Record<string, AdapterBuiltinModel[]>
66
+ builtinGroupTitle: (adapterKey: string) => string
67
+ mergedModels: Record<string, ModelMetadataConfig>
68
+ }) => {
69
+ return Object.entries(params.activeBuiltinModels)
70
+ .map(([adapterKey, models]) => {
71
+ if (!Array.isArray(models) || models.length === 0) return null
72
+
73
+ return {
74
+ key: `builtin:${adapterKey}`,
75
+ title: params.builtinGroupTitle(adapterKey),
76
+ options: models.map((model) => {
77
+ const metadata = resolveModelDisplayMetadata({
78
+ model: model.value,
79
+ models: params.mergedModels
80
+ })
81
+
82
+ return buildModelSelectOption({
83
+ value: model.value,
84
+ title: metadata?.title ?? metadata?.aliases[0] ?? model.title,
85
+ modelName: model.value,
86
+ description: metadata?.description ?? model.description,
87
+ aliases: metadata?.aliases,
88
+ searchTerms: [model.value, ...(metadata?.aliases ?? []), metadata?.title]
89
+ })
90
+ })
91
+ }
92
+ })
93
+ .filter((group): group is NonNullable<typeof group> => group != null)
94
+ }
95
+
96
+ export const buildRecommendedModelOptions = (params: {
97
+ availableServiceModels: ServiceModelEntry[]
98
+ defaultModelService?: string
99
+ mergedModels: Record<string, ModelMetadataConfig>
100
+ mergedModelServices: Record<string, ModelServiceConfig>
101
+ recommendedModels: RecommendedModelConfig[]
102
+ modelToService: Map<string, { key: string; title: string }>
103
+ }) => {
104
+ return params.recommendedModels
105
+ .filter((item) => {
106
+ if (item.placement && item.placement !== 'modelSelector') return false
107
+
108
+ return resolveServiceModelSelector({
109
+ value: item.service ? buildServiceModelSelector(item.service, item.model) : item.model,
110
+ serviceModels: params.availableServiceModels,
111
+ preferredServiceKey: item.service ?? params.defaultModelService
112
+ }) != null
113
+ })
114
+ .map((item) => {
115
+ const serviceInfo = item.service ? params.mergedModelServices[item.service] : undefined
116
+ const serviceTitle = item.service
117
+ ? resolveModelServiceTitle({
118
+ serviceKey: item.service,
119
+ service: serviceInfo
120
+ })
121
+ : params.modelToService.get(item.model)?.title
122
+ const resolvedModel = item.service ? buildServiceModelSelector(item.service, item.model) : item.model
123
+ const metadata = resolveModelDisplayMetadata({
124
+ model: resolvedModel,
125
+ models: params.mergedModels
126
+ })
127
+ const recommendedTitle = item.title?.trim()
128
+ const recommendedDescription = item.description?.trim()
129
+ const value = resolveServiceModelSelector({
130
+ value: resolvedModel,
131
+ serviceModels: params.availableServiceModels,
132
+ preferredServiceKey: item.service ?? params.defaultModelService
133
+ }) ?? item.model
134
+
135
+ return buildModelSelectOption({
136
+ value,
137
+ title: recommendedTitle || metadata?.title || metadata?.aliases[0] || item.model,
138
+ modelName: item.model,
139
+ description: recommendedDescription || metadata?.description,
140
+ aliases: metadata?.aliases,
141
+ serviceKey: item.service ?? params.modelToService.get(item.model)?.key,
142
+ serviceTitle,
143
+ searchTerms: [item.model, ...(metadata?.aliases ?? []), metadata?.title]
144
+ })
145
+ })
146
+ }
@@ -0,0 +1,62 @@
1
+ import type { ModelSelectOptionData } from './model-selector-data-types'
2
+
3
+ export const sortOptionsByDisplayLabel = (options: ModelSelectOptionData[]) => {
4
+ return [...options].sort((left, right) => {
5
+ const labelComparison = left.displayLabel.localeCompare(right.displayLabel, undefined, {
6
+ sensitivity: 'base'
7
+ })
8
+ if (labelComparison !== 0) return labelComparison
9
+
10
+ const modelComparison = left.modelName.localeCompare(right.modelName, undefined, {
11
+ sensitivity: 'base'
12
+ })
13
+ if (modelComparison !== 0) return modelComparison
14
+
15
+ return left.value.localeCompare(right.value, undefined, {
16
+ sensitivity: 'base'
17
+ })
18
+ })
19
+ }
20
+
21
+ export const buildModelSelectOption = (option: {
22
+ value: string
23
+ title: string
24
+ modelName: string
25
+ description?: string
26
+ aliases?: string[]
27
+ serviceKey?: string
28
+ serviceTitle?: string
29
+ searchTerms?: Array<string | undefined>
30
+ }): ModelSelectOptionData => {
31
+ const description = option.description?.trim()
32
+ const aliases = Array.from(new Set((option.aliases ?? []).filter(Boolean)))
33
+ const tooltipLines = [
34
+ ...aliases.filter(alias => alias !== option.title),
35
+ option.modelName !== option.title ? option.modelName : undefined,
36
+ description
37
+ ].filter((item): item is string => Boolean(item))
38
+
39
+ return {
40
+ value: option.value,
41
+ title: option.title,
42
+ description,
43
+ aliases,
44
+ modelName: option.modelName,
45
+ tooltipLines,
46
+ serviceKey: option.serviceKey,
47
+ serviceTitle: option.serviceTitle,
48
+ searchText: [
49
+ option.title,
50
+ option.modelName,
51
+ option.value,
52
+ option.serviceTitle,
53
+ option.serviceKey,
54
+ description,
55
+ ...aliases,
56
+ ...(option.searchTerms ?? [])
57
+ ]
58
+ .filter(Boolean)
59
+ .join(' '),
60
+ displayLabel: option.title
61
+ }
62
+ }
@@ -0,0 +1,27 @@
1
+ export interface ModelSelectOptionData {
2
+ value: string
3
+ title: string
4
+ description?: string
5
+ aliases: string[]
6
+ modelName: string
7
+ tooltipLines: string[]
8
+ serviceKey?: string
9
+ serviceTitle?: string
10
+ searchText: string
11
+ displayLabel: string
12
+ }
13
+
14
+ export interface ModelSelectGroupData {
15
+ key: string
16
+ title: string
17
+ description?: string
18
+ options: ModelSelectOptionData[]
19
+ }
20
+
21
+ export interface ModelSelectorData {
22
+ servicePreviewOptions: ModelSelectOptionData[]
23
+ recommendedOptions: ModelSelectOptionData[]
24
+ moreModelGroups: ModelSelectGroupData[]
25
+ flatGroups: ModelSelectGroupData[]
26
+ searchOptions: ModelSelectOptionData[]
27
+ }
@@ -0,0 +1,109 @@
1
+ import type {
2
+ AdapterBuiltinModel,
3
+ ModelMetadataConfig,
4
+ ModelServiceConfig,
5
+ RecommendedModelConfig
6
+ } from '@vibe-forge/types'
7
+
8
+ import type { ServiceModelEntry } from './model-selector'
9
+ import { resolveModelServiceTitle } from './model-selector'
10
+ import {
11
+ buildBuiltinModelGroups,
12
+ buildRecommendedModelOptions,
13
+ buildServiceModelGroups
14
+ } from './model-selector-data-builders'
15
+ import { sortOptionsByDisplayLabel } from './model-selector-data-option-utils'
16
+ import type { ModelSelectGroupData, ModelSelectOptionData, ModelSelectorData } from './model-selector-data-types'
17
+
18
+ export type { ModelSelectGroupData, ModelSelectOptionData, ModelSelectorData } from './model-selector-data-types'
19
+
20
+ export const buildModelSelectorData = (params: {
21
+ activeBuiltinModels: Record<string, AdapterBuiltinModel[]>
22
+ availableServiceModels: ServiceModelEntry[]
23
+ defaultModelService?: string
24
+ mergedModels: Record<string, ModelMetadataConfig>
25
+ mergedModelServices: Record<string, ModelServiceConfig>
26
+ recommendedModels: RecommendedModelConfig[]
27
+ recommendedGroupTitle: string
28
+ servicePreviewGroupTitle: string
29
+ builtinGroupTitle: (adapterKey: string) => string
30
+ }): ModelSelectorData => {
31
+ const modelToService = new Map<string, { key: string; title: string }>()
32
+ for (const entry of params.availableServiceModels) {
33
+ const serviceValue = params.mergedModelServices[entry.serviceKey]
34
+ const serviceTitle = resolveModelServiceTitle({
35
+ serviceKey: entry.serviceKey,
36
+ service: serviceValue
37
+ })
38
+ if (!modelToService.has(entry.model)) {
39
+ modelToService.set(entry.model, { key: entry.serviceKey, title: serviceTitle })
40
+ }
41
+ }
42
+
43
+ const serviceGroups = buildServiceModelGroups({
44
+ mergedModelServices: params.mergedModelServices,
45
+ mergedModels: params.mergedModels
46
+ })
47
+ const builtinGroups = buildBuiltinModelGroups({
48
+ activeBuiltinModels: params.activeBuiltinModels,
49
+ builtinGroupTitle: params.builtinGroupTitle,
50
+ mergedModels: params.mergedModels
51
+ })
52
+ const configuredRecommendedOptions = buildRecommendedModelOptions({
53
+ availableServiceModels: params.availableServiceModels,
54
+ defaultModelService: params.defaultModelService,
55
+ mergedModels: params.mergedModels,
56
+ mergedModelServices: params.mergedModelServices,
57
+ recommendedModels: params.recommendedModels,
58
+ modelToService
59
+ })
60
+
61
+ const servicePreviewOptions = serviceGroups
62
+ .map(group => group.options[0] ?? null)
63
+ .filter((option): option is ModelSelectOptionData => option != null)
64
+
65
+ const recommendedOptions = sortOptionsByDisplayLabel(configuredRecommendedOptions)
66
+
67
+ const flatGroups: ModelSelectGroupData[] = []
68
+ if (servicePreviewOptions.length > 0) {
69
+ flatGroups.push({
70
+ key: 'service-preview',
71
+ title: params.servicePreviewGroupTitle,
72
+ options: servicePreviewOptions
73
+ })
74
+ }
75
+
76
+ if (recommendedOptions.length > 0) {
77
+ flatGroups.push({
78
+ key: 'recommended',
79
+ title: params.recommendedGroupTitle,
80
+ options: recommendedOptions
81
+ })
82
+ }
83
+
84
+ const moreModelGroups = [...builtinGroups, ...serviceGroups]
85
+ flatGroups.push(...moreModelGroups)
86
+
87
+ const searchOptionMap = new Map<string, ModelSelectOptionData>()
88
+ for (
89
+ const option of [
90
+ ...recommendedOptions,
91
+ ...servicePreviewOptions,
92
+ ...moreModelGroups.flatMap(group => group.options)
93
+ ]
94
+ ) {
95
+ if (!searchOptionMap.has(option.value)) {
96
+ searchOptionMap.set(option.value, option)
97
+ }
98
+ }
99
+
100
+ const searchOptions = Array.from(searchOptionMap.values())
101
+
102
+ return {
103
+ servicePreviewOptions,
104
+ recommendedOptions,
105
+ moreModelGroups,
106
+ flatGroups,
107
+ searchOptions
108
+ }
109
+ }
@@ -0,0 +1,69 @@
1
+ import type { ConfigSection, RecommendedModelConfig } from '@vibe-forge/types'
2
+
3
+ const MODEL_SELECTOR_RECOMMENDATION_PLACEMENT = 'modelSelector' as const
4
+
5
+ const isRecommendedModelConfig = (value: unknown): value is RecommendedModelConfig => (
6
+ value != null &&
7
+ typeof value === 'object' &&
8
+ typeof (value as RecommendedModelConfig).model === 'string' &&
9
+ (value as RecommendedModelConfig).model.trim() !== ''
10
+ )
11
+
12
+ export const isModelSelectorRecommendation = (value: RecommendedModelConfig) => (
13
+ value.placement == null || value.placement === MODEL_SELECTOR_RECOMMENDATION_PLACEMENT
14
+ )
15
+
16
+ export const buildRecommendedModelKey = ({
17
+ model,
18
+ service
19
+ }: {
20
+ model: string
21
+ service?: string
22
+ }) => `${service ?? ''}::${model}`
23
+
24
+ export const buildUpdatedUserGeneralSection = ({
25
+ currentGeneral,
26
+ recommendedModels
27
+ }: {
28
+ currentGeneral?: ConfigSection['general']
29
+ recommendedModels: RecommendedModelConfig[]
30
+ }) => ({
31
+ ...(currentGeneral ?? {}),
32
+ recommendedModels: recommendedModels.length > 0 ? recommendedModels : undefined
33
+ })
34
+
35
+ export const toggleModelSelectorRecommendation = ({
36
+ currentRecommendedModels,
37
+ nextRecommendedModel
38
+ }: {
39
+ currentRecommendedModels: unknown
40
+ nextRecommendedModel: RecommendedModelConfig
41
+ }) => {
42
+ const normalizedCurrentRecommendedModels = Array.isArray(currentRecommendedModels)
43
+ ? currentRecommendedModels.filter(isRecommendedModelConfig)
44
+ : []
45
+ const nextRecommendedModelKey = buildRecommendedModelKey(nextRecommendedModel)
46
+ const isCurrentlyRecommended = normalizedCurrentRecommendedModels.some(item => (
47
+ isModelSelectorRecommendation(item) &&
48
+ buildRecommendedModelKey(item) === nextRecommendedModelKey
49
+ ))
50
+
51
+ return {
52
+ isCurrentlyRecommended,
53
+ recommendedModels: isCurrentlyRecommended
54
+ ? normalizedCurrentRecommendedModels.filter(item =>
55
+ !(
56
+ isModelSelectorRecommendation(item) &&
57
+ buildRecommendedModelKey(item) === nextRecommendedModelKey
58
+ )
59
+ )
60
+ : [
61
+ {
62
+ service: nextRecommendedModel.service,
63
+ model: nextRecommendedModel.model,
64
+ placement: MODEL_SELECTOR_RECOMMENDATION_PLACEMENT
65
+ },
66
+ ...normalizedCurrentRecommendedModels
67
+ ]
68
+ }
69
+ }
@@ -9,6 +9,7 @@ import {
9
9
  resolveAdapterModelCompatibility,
10
10
  resolveDefaultModelSelection,
11
11
  resolveModelDefaultAdapter,
12
+ resolveModelDisplayMetadata,
12
13
  resolveModelSelection,
13
14
  resolveServiceModelSelector
14
15
  } from '@vibe-forge/utils/model-selection'
@@ -21,9 +22,17 @@ export {
21
22
  normalizeNonEmptyString,
22
23
  parseServiceModelSelector,
23
24
  resolveAdapterModelCompatibility,
25
+ resolveModelDisplayMetadata,
24
26
  resolveServiceModelSelector
25
27
  }
26
28
 
29
+ export const resolveModelServiceTitle = (params: {
30
+ serviceKey: string
31
+ service?: { title?: string | null } | null
32
+ }) => {
33
+ return normalizeNonEmptyString(params.service?.title) ?? params.serviceKey
34
+ }
35
+
27
36
  export const resolveChatModelSelection = (params: {
28
37
  value?: string
29
38
  builtinModels?: Iterable<string>
@@ -1,21 +1,26 @@
1
1
  import { useCallback, useState } from 'react'
2
2
 
3
- import { connectionManager } from '#~/connectionManager.js'
3
+ import { respondSessionInteraction } from '#~/api/sessions'
4
4
  import type { AskUserQuestionParams } from '@vibe-forge/core'
5
5
 
6
- export function useChatInteraction({ sessionId }: { sessionId?: string }) {
6
+ export function useChatInteraction({
7
+ sessionId
8
+ }: {
9
+ sessionId?: string
10
+ }) {
7
11
  const [interactionRequest, setInteractionRequest] = useState<{ id: string; payload: AskUserQuestionParams } | null>(
8
12
  null
9
13
  )
10
14
 
11
15
  const handleInteractionResponse = useCallback((id: string, data: string | string[]) => {
12
16
  if (!sessionId) return
13
- connectionManager.send(sessionId, {
14
- type: 'interaction_response',
15
- id,
16
- data
17
- })
18
- setInteractionRequest(null)
17
+ void respondSessionInteraction(sessionId, id, data)
18
+ .then(() => {
19
+ setInteractionRequest(current => (current?.id === id ? null : current))
20
+ })
21
+ .catch((error) => {
22
+ console.error('Failed to submit interaction response:', error)
23
+ })
19
24
  }, [sessionId])
20
25
 
21
26
  return {