@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,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,19 +325,52 @@
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",
313
332
  "permissionRequestBadge": "Permission request",
333
+ "permissionRequestTitleWithTool": "Requesting permission to use 【{{tool}}】. Choose how to proceed.",
334
+ "permissionSubject": "Scope",
335
+ "permissionProjectConfig": "Project config",
314
336
  "permissionCurrentMode": "Current mode",
315
337
  "permissionSuggestedMode": "Suggested mode",
316
338
  "permissionDeniedTools": "Restricted tools",
317
339
  "permissionReasons": "Reasons",
340
+ "permissionExpandOptions": "Show more options",
341
+ "permissionCollapseOptions": "Show fewer options",
318
342
  "tooltipSlashCommands": "Slash commands",
319
343
  "tooltipMentionAgents": "Mention agents",
320
344
  "tooltipInjectContext": "Inject context",
321
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.",
322
366
  "effortSelectPlaceholder": "Effort",
367
+ "effortLabels": {
368
+ "default": "Standard",
369
+ "low": "Low",
370
+ "medium": "Medium",
371
+ "high": "High",
372
+ "max": "Max"
373
+ },
323
374
  "permissionModeSelectPlaceholder": "Permission mode",
324
375
  "assetWarningsTitle": "Compatibility notes",
325
376
  "assetWarningsCount": "{{count}} asset warnings",
@@ -329,18 +380,52 @@
329
380
  "selectionWarningReasonExcluded": "the model is excluded by adapter rules",
330
381
  "selectionWarningReasonNotIncluded": "the model is not included by adapter rules",
331
382
  "selectionWarningFallback": "Adapter {{adapter}} switched from {{requestedModel}} to {{resolvedModel}} because {{reason}}.",
383
+ "modelGroupBuiltin": "{{adapter}} built-in models",
384
+ "modelGroupServices": "Model Services",
332
385
  "imageTooLarge": "Image must be smaller than 5MB",
333
386
  "imageReadFailed": "Failed to read image",
334
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",
335
395
  "modelGroupRecommended": "Recommended Models",
396
+ "modelMoreModels": "More models",
336
397
  "availableTools": "Available Tools",
398
+ "availableToolsEmpty": "No tools are available for this session yet.",
337
399
  "toolGroupChromeDevtools": "ChromeDevtools",
338
400
  "toolGroupSystem": "System",
339
401
  "toolsCount": "{{count}} tools",
340
402
  "usedTools": "Used {{count}} tools",
341
- "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",
342
426
  "viewHistory": "History",
343
427
  "viewTimeline": "Timeline",
428
+ "viewTerminal": "Terminal",
344
429
  "viewSettings": "Settings",
345
430
  "deleteSessionTitle": "Delete session",
346
431
  "deleteSessionDesc": "This will permanently remove the session and all messages. Proceed carefully.",
@@ -380,6 +465,42 @@
380
465
  "destroyLabel": "Destroy {{name}} @ {{end}}",
381
466
  "rangeLabel": "{{name}} ({{start}} → {{end}})"
382
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",
383
504
  "hint": "Press Enter to send, Shift + Enter for new line, type / @ # for completion",
384
505
  "newSessionGuide": {
385
506
  "loading": "Loading...",
@@ -440,6 +561,11 @@
440
561
  "viewCommand": "View command",
441
562
  "unknown": "Unknown tool"
442
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
+ },
443
569
  "sessionSettings": "Session Settings",
444
570
  "enterTitle": "Enter session title...",
445
571
  "tags": "Tags",
@@ -691,7 +817,7 @@
691
817
  "models": {
692
818
  "items": {
693
819
  "label": "Model Selector Entries",
694
- "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"
695
821
  }
696
822
  },
697
823
  "modelServices": {
@@ -720,10 +846,6 @@
720
846
  "label": "Models",
721
847
  "desc": "Models supported by this service"
722
848
  },
723
- "modelsAlias": {
724
- "label": "Model Aliases",
725
- "desc": "Alias mapping for models"
726
- },
727
849
  "timeoutMs": {
728
850
  "label": "Timeout (ms)",
729
851
  "desc": "Provider timeout in milliseconds. Codex uses it as stream idle timeout; Claude Code Router uses global API timeout."
@@ -826,6 +948,18 @@
826
948
  "clearInput": {
827
949
  "label": "Clear Input",
828
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"
829
963
  }
830
964
  }
831
965
  },