@vibe-forge/client 0.8.4 → 0.10.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 (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-DCuZPvAs.js → arc-CCXV7u3V.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-C39d7-Bu.js → blockDiagram-c4efeb88-Bm52FmvT.js} +1 -1
  9. package/dist/assets/{c4Diagram-c83219d4-jWPBJdeq.js → c4Diagram-c83219d4-C8tTEpcK.js} +1 -1
  10. package/dist/assets/cameligo-Bf6VGUru.js +1 -0
  11. package/dist/assets/channel-gq_WMRvv.js +1 -0
  12. package/dist/assets/{classDiagram-beda092f-Bo7Yvv2T.js → classDiagram-beda092f-CNAIBAH1.js} +1 -1
  13. package/dist/assets/{classDiagram-v2-2358418a-DfoCP9XM.js → classDiagram-v2-2358418a-BHeZAVdc.js} +1 -1
  14. package/dist/assets/clojure-Dnu-v4kV.js +1 -0
  15. package/dist/assets/clone-XxGY7A5N.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-8_Ez5rxh.js → createText-1719965b-BS2hLG8t.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-WHcTFAOU.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-BEegO-R-.js → edges-96097737-C07f4iWA.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-derRgkLz.js → erDiagram-0228fc6a-BytsAWUs.js} +1 -1
  33. package/dist/assets/flow9-BeJ5waoc.js +1 -0
  34. package/dist/assets/{flowDb-c6c81e3f-ChtOxgsJ.js → flowDb-c6c81e3f-CQJkOpAs.js} +1 -1
  35. package/dist/assets/{flowDiagram-50d868cf-Bm4ufmmA.js → flowDiagram-50d868cf-CD5Tng2S.js} +1 -1
  36. package/dist/assets/flowDiagram-v2-4f6560a1-DIBOANLV.js +1 -0
  37. package/dist/assets/{flowchart-elk-definition-6af322e1-BRYLO-BL.js → flowchart-elk-definition-6af322e1-ylso-GWH.js} +1 -1
  38. package/dist/assets/freemarker2-U_9Jyyr3.js +3 -0
  39. package/dist/assets/fsharp-PahG7c26.js +1 -0
  40. package/dist/assets/{ganttDiagram-a2739b55-CbP6dzRO.js → ganttDiagram-a2739b55-Cg98bJx5.js} +1 -1
  41. package/dist/assets/{gitGraphDiagram-82fe8481-Du44v02s.js → gitGraphDiagram-82fe8481-7Yp4hz0N.js} +1 -1
  42. package/dist/assets/go-acbASCJo.js +1 -0
  43. package/dist/assets/{graph-0_VzJX6O.js → graph-Ig3nvzvL.js} +1 -1
  44. package/dist/assets/graphql-BxJiqAUM.js +1 -0
  45. package/dist/assets/handlebars-DQyCBwHe.js +1 -0
  46. package/dist/assets/hcl-DtV1sZF8.js +1 -0
  47. package/dist/assets/html-CNC2AT5k.js +1 -0
  48. package/dist/assets/html.worker-BLJhxQJQ.js +470 -0
  49. package/dist/assets/htmlMode-DlATk4xW.js +1 -0
  50. package/dist/assets/{index-5325376f-DLP7F7of.js → index-5325376f-C4zed9sb.js} +1 -1
  51. package/dist/assets/index-DRLsOoqb.css +32 -0
  52. package/dist/assets/index-Dbx0JG0p.js +1511 -0
  53. package/dist/assets/{infoDiagram-8eee0895-DY19rRl6.js → infoDiagram-8eee0895-C8oSBaFs.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-9wv9uKW4.js +1 -0
  57. package/dist/assets/{journeyDiagram-c64418c1-4Asnwc86.js → journeyDiagram-c64418c1-D5kJldvy.js} +1 -1
  58. package/dist/assets/json.worker-usMZ-FED.js +58 -0
  59. package/dist/assets/jsonMode-45dv39mU.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-BILp7GjD.js → layout-DYNFLnIl.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-D0Xqr8mi.js → line-1gvOYQYZ.js} +1 -1
  66. package/dist/assets/{linear-LpL8RZsq.js → linear-DHGm6Zdw.js} +1 -1
  67. package/dist/assets/liquid-BGoxrdXO.js +1 -0
  68. package/dist/assets/lspLanguageFeatures-CpCCXhrd.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-Dc2iMbEw.js +1 -0
  73. package/dist/assets/{mermaid.core-Bk0Y_0sz.js → mermaid.core-Cq2bBFF1.js} +6 -6
  74. package/dist/assets/{mindmap-definition-8da855dc-eCAgn5kY.js → mindmap-definition-8da855dc-y5l6GRVh.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-BeGFFS1p.js → pieDiagram-a8764435-PNROcv9y.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-DjYAge7h.js +1 -0
  92. package/dist/assets/qsharp-Bw9ernYp.js +1 -0
  93. package/dist/assets/{quadrantDiagram-1e28029f-tLqbYOHC.js → quadrantDiagram-1e28029f-CFJ3VPpp.js} +1 -1
  94. package/dist/assets/r-j7ic8hl3.js +1 -0
  95. package/dist/assets/razor-OIY8fx_i.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-DCverr_g.js → requirementDiagram-08caed73-BpzDIINS.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-DidhF5PL.js → sankeyDiagram-a04cb91d-CH69-iIn.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-CEKaiwTo.js → sequenceDiagram-c5b8d532-yBBEeVFU.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-Cj9ZY7RH.js → stateDiagram-1ecb1508-BvF4sign.js} +1 -1
  115. package/dist/assets/{stateDiagram-v2-c2b004d7-Gsmps-dk.js → stateDiagram-v2-c2b004d7-BeyT7Ghx.js} +1 -1
  116. package/dist/assets/{styles-b4e223ce-D7E8Th0j.js → styles-b4e223ce-C58zxmK6.js} +1 -1
  117. package/dist/assets/{styles-ca3715f6-tTC26Jsm.js → styles-ca3715f6-DCE5sFi5.js} +1 -1
  118. package/dist/assets/{styles-d45a18b0-Bf6oqNdR.js → styles-d45a18b0-CG-C1aM8.js} +1 -1
  119. package/dist/assets/{svgDrawCommon-b86b1483-BxKi01m2.js → svgDrawCommon-b86b1483-F-K8GeDd.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-D6PePEip.js → timeline-definition-faaaa080-DPv4uqVX.js} +1 -1
  124. package/dist/assets/ts.worker-DGHjMaqB.js +67731 -0
  125. package/dist/assets/tsMode-BtU8ZELV.js +11 -0
  126. package/dist/assets/twig-Csy3S7wG.js +1 -0
  127. package/dist/assets/typescript-CJHgISWo.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-C_TJw4Bi.js +1 -0
  132. package/dist/assets/{xychartDiagram-f5964ef8-BuP4qfXm.js → xychartDiagram-f5964ef8-BmXlhBzX.js} +1 -1
  133. package/dist/assets/yaml-BujeJOJ6.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 +284 -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 +147 -10
  160. package/src/components/chat/messages/MessageItem.tsx +378 -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/interaction-request.ts +5 -0
  204. package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +155 -0
  205. package/src/components/chat/sender/@hooks/use-model-select-browser.tsx +189 -0
  206. package/src/components/chat/sender/@hooks/use-sender-attachments.ts +143 -0
  207. package/src/components/chat/sender/@hooks/use-sender-autofocus.ts +34 -0
  208. package/src/components/chat/sender/@hooks/use-sender-completion.ts +62 -0
  209. package/src/components/chat/sender/@hooks/use-sender-composer-state.ts +34 -0
  210. package/src/components/chat/sender/@hooks/use-sender-controller.ts +193 -0
  211. package/src/components/chat/sender/@hooks/use-sender-focus-restore.ts +72 -0
  212. package/src/components/chat/sender/@hooks/use-sender-history.ts +79 -0
  213. package/src/components/chat/sender/@hooks/use-sender-keydown.ts +113 -0
  214. package/src/components/chat/sender/@hooks/use-sender-reference-actions.ts +191 -0
  215. package/src/components/chat/sender/@hooks/use-sender-reference-focus-restore.ts +21 -0
  216. package/src/components/chat/sender/@hooks/use-sender-refs.ts +19 -0
  217. package/src/components/chat/sender/@hooks/use-sender-select-overlays.ts +83 -0
  218. package/src/components/chat/sender/@hooks/use-sender-shortcuts.ts +78 -0
  219. package/src/components/chat/sender/@hooks/use-sender-submit.ts +81 -0
  220. package/src/components/chat/sender/@types/sender-composer.ts +19 -0
  221. package/src/components/chat/sender/@types/sender-editor.ts +12 -0
  222. package/src/components/chat/sender/@types/sender-props.ts +50 -0
  223. package/src/components/chat/sender/@types/sender-toolbar-types.ts +83 -0
  224. package/src/components/chat/sender/@types/sender-types.ts +21 -0
  225. package/src/components/chat/sender/@utils/sender-completion.ts +164 -0
  226. package/src/components/chat/sender/@utils/sender-constants.ts +18 -0
  227. package/src/components/chat/sender/@utils/sender-utils.ts +45 -0
  228. package/src/components/chat/sender/Sender.scss +8 -605
  229. package/src/components/chat/sender/Sender.tsx +54 -880
  230. package/src/components/chat/session-metadata.ts +55 -0
  231. package/src/components/chat/terminal/@hooks/use-terminal-instance.ts +152 -0
  232. package/src/components/chat/terminal/@hooks/use-terminal-session.ts +196 -0
  233. package/src/components/chat/terminal/ChatTerminalView.scss +62 -0
  234. package/src/components/chat/terminal/ChatTerminalView.tsx +114 -0
  235. package/src/components/chat/tools/core/ToolGroup.scss +7 -0
  236. package/src/components/chat/tools/core/ToolGroup.tsx +97 -56
  237. package/src/components/config/ConfigSectionForm.tsx +8 -1
  238. package/src/components/config/ConfigShortcutInput.tsx +9 -2
  239. package/src/components/config/configSchema.ts +12 -2
  240. package/src/components/config/record-editors/ModelServicesRecordEditor.tsx +0 -14
  241. package/src/components/dock-panel/DockPanel.scss +152 -0
  242. package/src/components/dock-panel/DockPanel.tsx +195 -0
  243. package/src/components/layout/AppShell.scss +40 -2
  244. package/src/components/layout/AppShell.tsx +25 -10
  245. package/src/components/sidebar/SessionContextMenu.scss +143 -0
  246. package/src/components/sidebar/SessionContextMenu.tsx +196 -0
  247. package/src/components/sidebar/SessionContextMenuContent.tsx +89 -0
  248. package/src/components/sidebar/SessionItem.scss +150 -67
  249. package/src/components/sidebar/SessionItem.tsx +183 -134
  250. package/src/components/sidebar/SessionList.scss +47 -17
  251. package/src/components/sidebar/SessionList.tsx +31 -16
  252. package/src/components/sidebar/SidebarHeader.scss +329 -49
  253. package/src/components/sidebar/SidebarHeader.tsx +108 -86
  254. package/src/components/sidebar/SidebarHeaderBatchActions.tsx +81 -0
  255. package/src/components/sidebar/SidebarHeaderSearchActions.tsx +176 -0
  256. package/src/components/sidebar/SidebarHeaderSelectField.tsx +24 -0
  257. package/src/components/sidebar/filter-utils.ts +23 -0
  258. package/src/components/workspace/ContextFilePicker.scss +64 -0
  259. package/src/components/workspace/ContextFilePicker.tsx +171 -0
  260. package/src/connectionManager.ts +4 -2
  261. package/src/hooks/chat/interaction-state.ts +104 -0
  262. package/src/hooks/chat/model-selector-data-builders.ts +146 -0
  263. package/src/hooks/chat/model-selector-data-option-utils.ts +62 -0
  264. package/src/hooks/chat/model-selector-data-types.ts +27 -0
  265. package/src/hooks/chat/model-selector-data.ts +109 -0
  266. package/src/hooks/chat/model-selector-recommendations.ts +69 -0
  267. package/src/hooks/chat/model-selector.ts +9 -0
  268. package/src/hooks/chat/use-chat-interaction.ts +13 -8
  269. package/src/hooks/chat/use-chat-model-adapter-selection.tsx +167 -164
  270. package/src/hooks/chat/use-chat-models.tsx +46 -23
  271. package/src/hooks/chat/use-chat-session-actions.ts +69 -23
  272. package/src/hooks/chat/use-chat-session-messages.ts +165 -60
  273. package/src/hooks/chat/use-chat-session.ts +34 -9
  274. package/src/hooks/chat/use-chat-view.ts +26 -6
  275. package/src/hooks/chat/use-composer-control-shortcuts.ts +69 -0
  276. package/src/hooks/chat/use-terminal-dock-visibility.ts +39 -0
  277. package/src/hooks/use-roving-focus-list.ts +104 -0
  278. package/src/hooks/use-sidebar-navigation.ts +9 -4
  279. package/src/hooks/use-sidebar-query-state.ts +79 -0
  280. package/src/main.tsx +6 -1
  281. package/src/resources/locales/en.json +151 -6
  282. package/src/resources/locales/zh.json +151 -6
  283. package/src/routes/ChatRoute.scss +159 -4
  284. package/src/routes/ChatRoute.tsx +43 -9
  285. package/src/runtime-config.ts +21 -0
  286. package/src/store/index.ts +1 -3
  287. package/src/styles/global.scss +12 -2
  288. package/src/utils/chat-links.ts +21 -0
  289. package/src/utils/copy.ts +18 -0
  290. package/src/utils/shortcutUtils.ts +111 -1
  291. package/src/vite-env.d.ts +1 -0
  292. package/src/ws.ts +6 -5
  293. package/vite.config.ts +71 -7
  294. package/dist/assets/channel-bLjHfx-Q.js +0 -1
  295. package/dist/assets/clone-upfY39Je.js +0 -1
  296. package/dist/assets/flowDiagram-v2-4f6560a1-F66FzZTY.js +0 -1
  297. package/dist/assets/index-C1O04Df8.js +0 -557
  298. package/dist/assets/index-sE8VA1N7.css +0 -1
  299. package/src/components/chat/sender/CompletionMenu.scss +0 -70
  300. package/src/components/chat/sender/CompletionMenu.tsx +0 -58
  301. /package/src/components/chat/{sender/ThinkingStatus.scss → ThinkingStatus.scss} +0 -0
@@ -0,0 +1,39 @@
1
+ import { useEffect, useState } from 'react'
2
+
3
+ const TERMINAL_EXIT_ANIMATION_MS = 240
4
+
5
+ export function useTerminalDockVisibility(isOpen: boolean) {
6
+ const [isRendered, setIsRendered] = useState(isOpen)
7
+ const [isVisible, setIsVisible] = useState(isOpen)
8
+
9
+ useEffect(() => {
10
+ if (isOpen) {
11
+ setIsRendered(true)
12
+ const timeoutId = window.setTimeout(() => {
13
+ setIsVisible(true)
14
+ }, 0)
15
+ return () => {
16
+ window.clearTimeout(timeoutId)
17
+ }
18
+ }
19
+
20
+ setIsVisible(false)
21
+
22
+ if (!isRendered) {
23
+ return
24
+ }
25
+
26
+ const timeoutId = window.setTimeout(() => {
27
+ setIsRendered(false)
28
+ }, TERMINAL_EXIT_ANIMATION_MS)
29
+
30
+ return () => {
31
+ window.clearTimeout(timeoutId)
32
+ }
33
+ }, [isOpen, isRendered])
34
+
35
+ return {
36
+ isRendered,
37
+ isVisible
38
+ }
39
+ }
@@ -0,0 +1,104 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
2
+
3
+ export const getLoopedIndex = (
4
+ currentIndex: number,
5
+ delta: number,
6
+ itemCount: number
7
+ ) => {
8
+ if (itemCount <= 0) {
9
+ return -1
10
+ }
11
+
12
+ const nextIndex = (currentIndex + delta) % itemCount
13
+ return nextIndex < 0 ? nextIndex + itemCount : nextIndex
14
+ }
15
+
16
+ export const useRovingFocusList = <T extends string>(
17
+ keys: T[],
18
+ initialKey?: T | null
19
+ ) => {
20
+ const itemRefs = useRef(new Map<T, HTMLElement>())
21
+ const [activeKey, setActiveKey] = useState<T | null>(() => {
22
+ if (initialKey != null && keys.includes(initialKey)) {
23
+ return initialKey
24
+ }
25
+ return keys[0] ?? null
26
+ })
27
+
28
+ useEffect(() => {
29
+ if (keys.length === 0) {
30
+ setActiveKey(null)
31
+ return
32
+ }
33
+
34
+ if (activeKey != null && keys.includes(activeKey)) {
35
+ return
36
+ }
37
+
38
+ if (initialKey != null && keys.includes(initialKey)) {
39
+ setActiveKey(initialKey)
40
+ return
41
+ }
42
+
43
+ setActiveKey(keys[0] ?? null)
44
+ }, [activeKey, initialKey, keys])
45
+
46
+ const registerItem = useCallback((key: T) => {
47
+ return (node: HTMLElement | null) => {
48
+ if (node == null) {
49
+ itemRefs.current.delete(key)
50
+ return
51
+ }
52
+ itemRefs.current.set(key, node)
53
+ }
54
+ }, [])
55
+
56
+ const focusKey = useCallback((key: T | null) => {
57
+ if (key == null) {
58
+ return
59
+ }
60
+ setActiveKey(key)
61
+ itemRefs.current.get(key)?.focus()
62
+ }, [])
63
+
64
+ const keyIndexMap = useMemo(() => {
65
+ return new Map(keys.map((key, index) => [key, index]))
66
+ }, [keys])
67
+
68
+ const moveFocus = useCallback((delta: number, fromKey?: T | null) => {
69
+ if (keys.length === 0) {
70
+ return null
71
+ }
72
+
73
+ const sourceKey = fromKey ?? activeKey ?? keys[0] ?? null
74
+ const sourceIndex = sourceKey == null ? 0 : (keyIndexMap.get(sourceKey) ?? 0)
75
+ const nextIndex = getLoopedIndex(sourceIndex, delta, keys.length)
76
+ const nextKey = keys[nextIndex] ?? null
77
+ if (nextKey != null) {
78
+ focusKey(nextKey)
79
+ }
80
+ return nextKey
81
+ }, [activeKey, focusKey, keyIndexMap, keys])
82
+
83
+ const focusFirst = useCallback(() => {
84
+ const firstKey = keys[0] ?? null
85
+ focusKey(firstKey)
86
+ return firstKey
87
+ }, [focusKey, keys])
88
+
89
+ const focusLast = useCallback(() => {
90
+ const lastKey = keys.at(-1) ?? null
91
+ focusKey(lastKey)
92
+ return lastKey
93
+ }, [focusKey, keys])
94
+
95
+ return {
96
+ activeKey,
97
+ setActiveKey,
98
+ registerItem,
99
+ focusKey,
100
+ moveFocus,
101
+ focusFirst,
102
+ focusLast
103
+ }
104
+ }
@@ -16,14 +16,19 @@ export function useSidebarNavigation() {
16
16
  const activeSessionId = sessionMatch?.params.sessionId
17
17
  const showSidebar = location.pathname === '/' || activeSessionId != null
18
18
 
19
+ const getNavigationTarget = useCallback((pathname: string) => ({
20
+ pathname,
21
+ search: location.search
22
+ }), [location.search])
23
+
19
24
  const handleSelectSession = useCallback((session: Session, _isNew?: boolean) => {
20
- void navigate(session.id === '' ? '/' : `/session/${session.id}`)
21
- }, [navigate])
25
+ void navigate(getNavigationTarget(session.id === '' ? '/' : `/session/${session.id}`))
26
+ }, [getNavigationTarget, navigate])
22
27
 
23
28
  const handleDeletedSession = useCallback((deletedId: string, nextId?: string) => {
24
29
  if (activeSessionId !== deletedId) return
25
- void navigate(nextId ? `/session/${nextId}` : '/')
26
- }, [activeSessionId, navigate])
30
+ void navigate(getNavigationTarget(nextId ? `/session/${nextId}` : '/'))
31
+ }, [activeSessionId, getNavigationTarget, navigate])
27
32
 
28
33
  return {
29
34
  activeSessionId,
@@ -0,0 +1,79 @@
1
+ import { useMemo } from 'react'
2
+
3
+ import { useQueryParams } from '#~/hooks/useQueryParams.js'
4
+
5
+ export type SidebarSessionSortOrder = 'asc' | 'desc'
6
+
7
+ const splitFilterValues = (raw: string) => {
8
+ return Array.from(
9
+ new Set(
10
+ raw
11
+ .split(',')
12
+ .map((value) => value.trim())
13
+ .filter(Boolean)
14
+ )
15
+ )
16
+ }
17
+
18
+ const joinFilterValues = (values: string[]) => {
19
+ return Array.from(
20
+ new Set(
21
+ values
22
+ .map((value) => value.trim())
23
+ .filter(Boolean)
24
+ )
25
+ ).join(',')
26
+ }
27
+
28
+ export function useSidebarQueryState() {
29
+ const { values, update } = useQueryParams<{
30
+ adapter: string
31
+ search: string
32
+ sort: string
33
+ sidebar: string
34
+ tag: string
35
+ }>({
36
+ keys: ['sidebar', 'search', 'tag', 'adapter', 'sort'],
37
+ defaults: {
38
+ sidebar: '',
39
+ search: '',
40
+ tag: '',
41
+ adapter: '',
42
+ sort: ''
43
+ },
44
+ omit: {
45
+ sidebar: (value) => value === '',
46
+ search: (value) => value === '',
47
+ tag: (value) => value === '',
48
+ adapter: (value) => value === '',
49
+ sort: (value) => value === ''
50
+ }
51
+ })
52
+
53
+ const tagFilters = useMemo(() => splitFilterValues(values.tag), [values.tag])
54
+ const adapterFilters = useMemo(() => splitFilterValues(values.adapter), [values.adapter])
55
+ const searchQuery = values.search
56
+ const sortSelection: SidebarSessionSortOrder | undefined = values.sort === 'asc' || values.sort === 'desc'
57
+ ? values.sort
58
+ : undefined
59
+ const sortOrder: SidebarSessionSortOrder = sortSelection ?? 'desc'
60
+ const isSidebarCollapsed = values.sidebar === 'collapsed'
61
+ const hasActiveFilterConditions = searchQuery.trim() !== '' || tagFilters.length > 0 || adapterFilters.length > 0
62
+ const hasActiveSearchControls = hasActiveFilterConditions || sortSelection != null
63
+
64
+ return {
65
+ adapterFilters,
66
+ hasActiveFilterConditions,
67
+ hasActiveSearchControls,
68
+ isSidebarCollapsed,
69
+ searchQuery,
70
+ setSortOrder: (sort?: SidebarSessionSortOrder) => update({ sort: sort ?? '' }),
71
+ setAdapterFilters: (filters: string[]) => update({ adapter: joinFilterValues(filters) }),
72
+ setSearchQuery: (search: string) => update({ search }),
73
+ setSidebarCollapsed: (collapsed: boolean) => update({ sidebar: collapsed ? 'collapsed' : '' }),
74
+ setTagFilters: (filters: string[]) => update({ tag: joinFilterValues(filters) }),
75
+ sortOrder,
76
+ sortSelection,
77
+ tagFilters
78
+ }
79
+ }
package/src/main.tsx CHANGED
@@ -12,7 +12,7 @@ import { BrowserRouter } from 'react-router-dom'
12
12
  import { SWRConfig } from 'swr'
13
13
 
14
14
  import { fetchApiJson } from '#~/api/base.js'
15
- import { getClientBase } from '#~/runtime-config.js'
15
+ import { getClientBase, resolveDevDocumentTitle } from '#~/runtime-config.js'
16
16
 
17
17
  import App from './App'
18
18
 
@@ -20,6 +20,11 @@ const root = createRoot(document.getElementById('root')!)
20
20
 
21
21
  const clientBase = getClientBase()
22
22
 
23
+ document.title = resolveDevDocumentTitle(document.title, {
24
+ isDev: import.meta.env.DEV,
25
+ gitRef: import.meta.env.__VF_PROJECT_AI_DEV_GIT_REF__
26
+ })
27
+
23
28
  root.render(
24
29
  <React.StrictMode>
25
30
  <ConfigProvider locale={zhCN} theme={{ token: { colorPrimary: '#000000' } }}>
@@ -25,6 +25,7 @@
25
25
  "batchRestoreFailed": "Failed to restore some sessions",
26
26
  "cancel": "Cancel",
27
27
  "confirm": "Confirm",
28
+ "confirmAction": "Confirm {{action}}",
28
29
  "startNewChat": "No active sessions found. Start a new chat!",
29
30
  "backToHome": "Back to Home",
30
31
  "noData": "No data",
@@ -44,7 +45,14 @@
44
45
  "batchDeleteSuccess": "Batch deleted successfully",
45
46
  "batchDeleteFailed": "Failed to delete some sessions",
46
47
  "selectedCount": "{{count}} sessions selected",
48
+ "selectAll": "Select all",
49
+ "deselectAll": "Deselect all",
47
50
  "collapse": "Collapse sidebar",
51
+ "close": "Close",
52
+ "sort": "Sort order",
53
+ "allTags": "All tags",
54
+ "allAdapters": "All adapters",
55
+ "searchActions": "Search and filters",
48
56
  "expandChildren": "Expand children",
49
57
  "collapseChildren": "Collapse children",
50
58
  "childSummary": "{{count}} child sessions",
@@ -52,9 +60,19 @@
52
60
  "deleteConfirm": "Are you sure you want to delete the selected {{count}} chats?",
53
61
  "deleteSuccess": "Deleted successfully",
54
62
  "deleteFailed": "Failed to delete",
63
+ "operationFailed": "Operation failed",
64
+ "copyFailed": "Copy failed",
55
65
  "star": "Star",
56
66
  "unstar": "Unstar",
67
+ "rename": "Rename",
68
+ "renameSession": "Rename session",
57
69
  "addTag": "Tag",
70
+ "copySessionLink": "Copy session link",
71
+ "copySessionId": "Copy session ID",
72
+ "copyResumeCommand": "Copy resume command",
73
+ "moreActions": "More actions",
74
+ "sessionLinkCopied": "Session link copied to clipboard",
75
+ "resumeCommandCopied": "Resume command copied to clipboard",
58
76
  "sessionIdCopied": "Session ID copied to clipboard",
59
77
  "doubleClickToCopy": "Double click to copy Session ID",
60
78
  "status": {
@@ -307,9 +325,53 @@
307
325
  "modelUnavailable": "No models available",
308
326
  "modelConfigRequired": "Add a model service in config before starting a session",
309
327
  "connectionErrorTitle": "Connection error",
328
+ "sessionErrorTitle": "Task failed",
310
329
  "connectionError": "WebSocket connection failed. Check the server and try again.",
311
330
  "connectionClosed": "WebSocket connection closed. Try reconnecting.",
312
331
  "retryConnection": "Retry",
332
+ "permissionRequestBadge": "Permission request",
333
+ "permissionRequestTitleWithTool": "Requesting permission to use 【{{tool}}】. Choose how to proceed.",
334
+ "permissionSubject": "Scope",
335
+ "permissionProjectConfig": "Project config",
336
+ "permissionCurrentMode": "Current mode",
337
+ "permissionSuggestedMode": "Suggested mode",
338
+ "permissionDeniedTools": "Restricted tools",
339
+ "permissionReasons": "Reasons",
340
+ "permissionExpandOptions": "Show more options",
341
+ "permissionCollapseOptions": "Show fewer options",
342
+ "tooltipSlashCommands": "Slash commands",
343
+ "tooltipMentionAgents": "Mention agents",
344
+ "tooltipInjectContext": "Inject context",
345
+ "tooltipUploadImages": "Upload images",
346
+ "tooltipReferenceActions": "More",
347
+ "referenceActionsShortcutTooltip": "More / Permission mode",
348
+ "modelShortcutTooltip": "Switch model",
349
+ "modelAddRecommendation": "Add to recommended models",
350
+ "modelAlreadyRecommended": "Already recommended",
351
+ "modelRemoveRecommendation": "Remove from recommended models",
352
+ "effortShortcutTooltip": "Switch reasoning effort",
353
+ "sendShortcutTooltip": "Send message",
354
+ "adapterLockedTooltip": "Adapters are locked after a session is created",
355
+ "referenceActionsShort": "More",
356
+ "referenceActionsTitle": "More",
357
+ "referenceActionsDescription": "Add photos, files, and permission-related settings.",
358
+ "referenceAttachments": "Add photos and files",
359
+ "referenceAttachmentsDescription": "Choose images or project files as references.",
360
+ "referencePermission": "Permission mode",
361
+ "referencePermissionDescription": "Control how tool actions are authorized.",
362
+ "referenceImage": "Image",
363
+ "referenceImageDescription": "Choose a local image and attach it to the message.",
364
+ "referenceFile": "File",
365
+ "referenceFileDescription": "Choose files from the current project tree.",
366
+ "effortSelectPlaceholder": "Effort",
367
+ "effortLabels": {
368
+ "default": "Standard",
369
+ "low": "Low",
370
+ "medium": "Medium",
371
+ "high": "High",
372
+ "max": "Max"
373
+ },
374
+ "permissionModeSelectPlaceholder": "Permission mode",
313
375
  "assetWarningsTitle": "Compatibility notes",
314
376
  "assetWarningsCount": "{{count}} asset warnings",
315
377
  "assetWarningsMore": "+{{count}} more",
@@ -318,18 +380,52 @@
318
380
  "selectionWarningReasonExcluded": "the model is excluded by adapter rules",
319
381
  "selectionWarningReasonNotIncluded": "the model is not included by adapter rules",
320
382
  "selectionWarningFallback": "Adapter {{adapter}} switched from {{requestedModel}} to {{resolvedModel}} because {{reason}}.",
383
+ "modelGroupBuiltin": "{{adapter}} built-in models",
384
+ "modelGroupServices": "Model Services",
321
385
  "imageTooLarge": "Image must be smaller than 5MB",
322
386
  "imageReadFailed": "Failed to read image",
323
387
  "imageNotSupportedInInteraction": "Images are not supported for this interaction",
388
+ "fileNotSupportedInInteraction": "Files are not supported for this interaction",
389
+ "contextPickerTitle": "Reference files",
390
+ "contextPickerDescription": "Choose one or more files from the current project tree.",
391
+ "contextPickerConfirm": "Reference files",
392
+ "contextPickerLoading": "Loading workspace tree...",
393
+ "contextPickerEmpty": "No files available in this directory",
394
+ "contextPickerLoadFailed": "Failed to load workspace tree",
324
395
  "modelGroupRecommended": "Recommended Models",
396
+ "modelMoreModels": "More models",
325
397
  "availableTools": "Available Tools",
398
+ "availableToolsEmpty": "No tools are available for this session yet.",
326
399
  "toolGroupChromeDevtools": "ChromeDevtools",
327
400
  "toolGroupSystem": "System",
328
401
  "toolsCount": "{{count}} tools",
329
402
  "usedTools": "Used {{count}} tools",
330
- "viewInitInfo": "Double click to view initialization info",
403
+ "debugSessionId": "Session",
404
+ "debugType": "Type",
405
+ "debugUuid": "UUID",
406
+ "debugLeafUuid": "Leaf",
407
+ "debugAdapter": "Adapter",
408
+ "debugModel": "Model",
409
+ "debugEffort": "Effort",
410
+ "debugVersion": "Version",
411
+ "debugTools": "Tools",
412
+ "debugAgents": "Agents",
413
+ "debugCwd": "CWD",
414
+ "debugTags": "Tags",
415
+ "debugView": "View",
416
+ "debugStarred": "Starred",
417
+ "debugArchived": "Archived",
418
+ "debugEnable": "Enable debug mode",
419
+ "debugDisable": "Disable debug mode",
420
+ "debugEnabledValue": "Enabled",
421
+ "debugDisabledValue": "Disabled",
422
+ "debugSectionTitle": "Debug Session Info",
423
+ "debugModeTitle": "Debug mode is on",
424
+ "debugModeDescription": "This section is visible because the current URL contains a debug query.",
425
+ "viewInitInfo": "Click the title 5 times to toggle debug mode",
331
426
  "viewHistory": "History",
332
427
  "viewTimeline": "Timeline",
428
+ "viewTerminal": "Terminal",
333
429
  "viewSettings": "Settings",
334
430
  "deleteSessionTitle": "Delete session",
335
431
  "deleteSessionDesc": "This will permanently remove the session and all messages. Proceed carefully.",
@@ -369,6 +465,42 @@
369
465
  "destroyLabel": "Destroy {{name}} @ {{end}}",
370
466
  "rangeLabel": "{{name}} ({{start}} → {{end}})"
371
467
  },
468
+ "messageActions": {
469
+ "copy": "Copy raw text",
470
+ "copySuccess": "Raw message copied",
471
+ "copyFailed": "Failed to copy raw message",
472
+ "copyLink": "Copy message link",
473
+ "copyLinkSuccess": "Message link copied",
474
+ "copyId": "Copy message ID",
475
+ "copyIdSuccess": "Message ID copied",
476
+ "copyJson": "Copy message JSON",
477
+ "copyJsonSuccess": "Message JSON copied",
478
+ "copyTimestamp": "Copy timestamp",
479
+ "copyTimestampSuccess": "Timestamp copied",
480
+ "edit": "Edit message",
481
+ "editInProgress": "A message is already being edited. Send or cancel it first.",
482
+ "saveEdit": "Save as branch",
483
+ "confirmInline": "Confirm",
484
+ "recall": "Recall to here",
485
+ "fork": "Fork from here",
486
+ "recallConfirmTitle": "Recall to this message?",
487
+ "recallConfirmContent": "Messages after this point will be rolled back. Continue?",
488
+ "forkConfirmTitle": "Fork from this message?",
489
+ "forkConfirmContent": "This will create a new session branch from this message. Continue?"
490
+ },
491
+ "messageFooter": {
492
+ "tokens": "Tokens",
493
+ "copyTimestampSuccess": "Copied ISO timestamp",
494
+ "copyTimestampTitle": "Double-click to copy the ISO timestamp and log the message payload"
495
+ },
496
+ "turnProcessedDuration": "Processed {{duration}}",
497
+ "turnDurationUnderSecond": "<1s",
498
+ "turnDurationHours": "{{count}}h",
499
+ "turnDurationMinutes": "{{count}}m",
500
+ "turnDurationSeconds": "{{count}}s",
501
+ "turnSummaryCount": "{{count}} hidden messages",
502
+ "turnExpandAction": "Expand",
503
+ "turnCollapseAction": "Collapse",
372
504
  "hint": "Press Enter to send, Shift + Enter for new line, type / @ # for completion",
373
505
  "newSessionGuide": {
374
506
  "loading": "Loading...",
@@ -429,6 +561,11 @@
429
561
  "viewCommand": "View command",
430
562
  "unknown": "Unknown tool"
431
563
  },
564
+ "terminal": {
565
+ "connectionError": "Terminal connection failed. Check the server and try again.",
566
+ "exitSummary": "Terminal exited with exitCode={{code}}, signal={{signal}}",
567
+ "resizePanel": "Drag to resize terminal height"
568
+ },
432
569
  "sessionSettings": "Session Settings",
433
570
  "enterTitle": "Enter session title...",
434
571
  "tags": "Tags",
@@ -680,7 +817,7 @@
680
817
  "models": {
681
818
  "items": {
682
819
  "label": "Model Selector Entries",
683
- "desc": "Selector metadata keyed by `service` or `service,model`"
820
+ "desc": "Model metadata keyed by `service` or `service,model`. Display metadata like alias/title/description only applies to exact `model` or `service,model` matches"
684
821
  }
685
822
  },
686
823
  "modelServices": {
@@ -709,10 +846,6 @@
709
846
  "label": "Models",
710
847
  "desc": "Models supported by this service"
711
848
  },
712
- "modelsAlias": {
713
- "label": "Model Aliases",
714
- "desc": "Alias mapping for models"
715
- },
716
849
  "timeoutMs": {
717
850
  "label": "Timeout (ms)",
718
851
  "desc": "Provider timeout in milliseconds. Codex uses it as stream idle timeout; Claude Code Router uses global API timeout."
@@ -815,6 +948,18 @@
815
948
  "clearInput": {
816
949
  "label": "Clear Input",
817
950
  "desc": "Shortcut for clearing the input"
951
+ },
952
+ "switchModel": {
953
+ "label": "Switch Model",
954
+ "desc": "Open the model selector and navigate it with the keyboard"
955
+ },
956
+ "switchEffort": {
957
+ "label": "Switch Reasoning Effort",
958
+ "desc": "Open the effort selector and navigate it with the keyboard"
959
+ },
960
+ "switchPermissionMode": {
961
+ "label": "Switch Permission Mode",
962
+ "desc": "Open the permission menu and navigate it with the keyboard"
818
963
  }
819
964
  }
820
965
  },