@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.
- package/AGENTS.md +75 -0
- package/dist/assets/abap-DLDM7-KI.js +1 -0
- package/dist/assets/apex-DNDY2TF8.js +1 -0
- package/dist/assets/{arc-DCuZPvAs.js → arc-CCXV7u3V.js} +1 -1
- package/dist/assets/azcli-Y6nb8tq_.js +1 -0
- package/dist/assets/bat-BwHxbl9M.js +1 -0
- package/dist/assets/bicep-CFznDFnq.js +2 -0
- package/dist/assets/{blockDiagram-c4efeb88-C39d7-Bu.js → blockDiagram-c4efeb88-Bm52FmvT.js} +1 -1
- package/dist/assets/{c4Diagram-c83219d4-jWPBJdeq.js → c4Diagram-c83219d4-C8tTEpcK.js} +1 -1
- package/dist/assets/cameligo-Bf6VGUru.js +1 -0
- package/dist/assets/channel-gq_WMRvv.js +1 -0
- package/dist/assets/{classDiagram-beda092f-Bo7Yvv2T.js → classDiagram-beda092f-CNAIBAH1.js} +1 -1
- package/dist/assets/{classDiagram-v2-2358418a-DfoCP9XM.js → classDiagram-v2-2358418a-BHeZAVdc.js} +1 -1
- package/dist/assets/clojure-Dnu-v4kV.js +1 -0
- package/dist/assets/clone-XxGY7A5N.js +1 -0
- package/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/dist/assets/coffee-Bd8akH9Z.js +1 -0
- package/dist/assets/cpp-BbWJElDN.js +1 -0
- package/dist/assets/{createText-1719965b-8_Ez5rxh.js → createText-1719965b-BS2hLG8t.js} +1 -1
- package/dist/assets/csharp-Co3qMtFm.js +1 -0
- package/dist/assets/csp-D-4FJmMZ.js +1 -0
- package/dist/assets/css-DdJfP1eB.js +3 -0
- package/dist/assets/css.worker-BvV5MPou.js +93 -0
- package/dist/assets/cssMode-WHcTFAOU.js +1 -0
- package/dist/assets/cypher-cTPe9QuQ.js +1 -0
- package/dist/assets/dart-BOtBlQCF.js +1 -0
- package/dist/assets/dockerfile-BG73LgW2.js +1 -0
- package/dist/assets/ecl-BEgZUVRK.js +1 -0
- package/dist/assets/{edges-96097737-BEegO-R-.js → edges-96097737-C07f4iWA.js} +1 -1
- package/dist/assets/editor.worker-CKy7Pnvo.js +26 -0
- package/dist/assets/elixir-BkW5O-1t.js +1 -0
- package/dist/assets/{erDiagram-0228fc6a-derRgkLz.js → erDiagram-0228fc6a-BytsAWUs.js} +1 -1
- package/dist/assets/flow9-BeJ5waoc.js +1 -0
- package/dist/assets/{flowDb-c6c81e3f-ChtOxgsJ.js → flowDb-c6c81e3f-CQJkOpAs.js} +1 -1
- package/dist/assets/{flowDiagram-50d868cf-Bm4ufmmA.js → flowDiagram-50d868cf-CD5Tng2S.js} +1 -1
- package/dist/assets/flowDiagram-v2-4f6560a1-DIBOANLV.js +1 -0
- package/dist/assets/{flowchart-elk-definition-6af322e1-BRYLO-BL.js → flowchart-elk-definition-6af322e1-ylso-GWH.js} +1 -1
- package/dist/assets/freemarker2-U_9Jyyr3.js +3 -0
- package/dist/assets/fsharp-PahG7c26.js +1 -0
- package/dist/assets/{ganttDiagram-a2739b55-CbP6dzRO.js → ganttDiagram-a2739b55-Cg98bJx5.js} +1 -1
- package/dist/assets/{gitGraphDiagram-82fe8481-Du44v02s.js → gitGraphDiagram-82fe8481-7Yp4hz0N.js} +1 -1
- package/dist/assets/go-acbASCJo.js +1 -0
- package/dist/assets/{graph-0_VzJX6O.js → graph-Ig3nvzvL.js} +1 -1
- package/dist/assets/graphql-BxJiqAUM.js +1 -0
- package/dist/assets/handlebars-DQyCBwHe.js +1 -0
- package/dist/assets/hcl-DtV1sZF8.js +1 -0
- package/dist/assets/html-CNC2AT5k.js +1 -0
- package/dist/assets/html.worker-BLJhxQJQ.js +470 -0
- package/dist/assets/htmlMode-DlATk4xW.js +1 -0
- package/dist/assets/{index-5325376f-DLP7F7of.js → index-5325376f-C4zed9sb.js} +1 -1
- package/dist/assets/index-DRLsOoqb.css +32 -0
- package/dist/assets/index-Dbx0JG0p.js +1511 -0
- package/dist/assets/{infoDiagram-8eee0895-DY19rRl6.js → infoDiagram-8eee0895-C8oSBaFs.js} +1 -1
- package/dist/assets/ini-Kd9XrMLS.js +1 -0
- package/dist/assets/java-CXBNlu9o.js +1 -0
- package/dist/assets/javascript-9wv9uKW4.js +1 -0
- package/dist/assets/{journeyDiagram-c64418c1-4Asnwc86.js → journeyDiagram-c64418c1-D5kJldvy.js} +1 -1
- package/dist/assets/json.worker-usMZ-FED.js +58 -0
- package/dist/assets/jsonMode-45dv39mU.js +7 -0
- package/dist/assets/julia-cl7-CwDS.js +1 -0
- package/dist/assets/kotlin-s7OhZKlX.js +1 -0
- package/dist/assets/{layout-BILp7GjD.js → layout-DYNFLnIl.js} +1 -1
- package/dist/assets/less-9HpZscsL.js +2 -0
- package/dist/assets/lexon-OrD6JF1K.js +1 -0
- package/dist/assets/{line-D0Xqr8mi.js → line-1gvOYQYZ.js} +1 -1
- package/dist/assets/{linear-LpL8RZsq.js → linear-DHGm6Zdw.js} +1 -1
- package/dist/assets/liquid-BGoxrdXO.js +1 -0
- package/dist/assets/lspLanguageFeatures-CpCCXhrd.js +4 -0
- package/dist/assets/lua-Cyyb5UIc.js +1 -0
- package/dist/assets/m3-B8OfTtLu.js +1 -0
- package/dist/assets/markdown-BFxVWTOG.js +1 -0
- package/dist/assets/mdx-Dc2iMbEw.js +1 -0
- package/dist/assets/{mermaid.core-Bk0Y_0sz.js → mermaid.core-Cq2bBFF1.js} +6 -6
- package/dist/assets/{mindmap-definition-8da855dc-eCAgn5kY.js → mindmap-definition-8da855dc-y5l6GRVh.js} +1 -1
- package/dist/assets/mips-CiqrrVzr.js +1 -0
- package/dist/assets/msdax-DmeGPVcC.js +1 -0
- package/dist/assets/mysql-C_tMU-Nz.js +1 -0
- package/dist/assets/objective-c-BDtDVThU.js +1 -0
- package/dist/assets/pascal-vHIfCaH5.js +1 -0
- package/dist/assets/pascaligo-DtZ0uQbO.js +1 -0
- package/dist/assets/perl-Ub6l9XKa.js +1 -0
- package/dist/assets/pgsql-BlNEE0v7.js +1 -0
- package/dist/assets/php-BBUBE1dy.js +1 -0
- package/dist/assets/{pieDiagram-a8764435-BeGFFS1p.js → pieDiagram-a8764435-PNROcv9y.js} +1 -1
- package/dist/assets/pla-DSh2-awV.js +1 -0
- package/dist/assets/postiats-CocnycG-.js +1 -0
- package/dist/assets/powerquery-tScXyioY.js +1 -0
- package/dist/assets/powershell-COWaemsV.js +1 -0
- package/dist/assets/protobuf-Brw8urJB.js +2 -0
- package/dist/assets/pug-8SOpv6rk.js +1 -0
- package/dist/assets/python-DjYAge7h.js +1 -0
- package/dist/assets/qsharp-Bw9ernYp.js +1 -0
- package/dist/assets/{quadrantDiagram-1e28029f-tLqbYOHC.js → quadrantDiagram-1e28029f-CFJ3VPpp.js} +1 -1
- package/dist/assets/r-j7ic8hl3.js +1 -0
- package/dist/assets/razor-OIY8fx_i.js +1 -0
- package/dist/assets/redis-Bu5POkcn.js +1 -0
- package/dist/assets/redshift-Bs9aos_-.js +1 -0
- package/dist/assets/{requirementDiagram-08caed73-DCverr_g.js → requirementDiagram-08caed73-BpzDIINS.js} +1 -1
- package/dist/assets/restructuredtext-CqXO7rUv.js +1 -0
- package/dist/assets/ruby-zBfavPgS.js +1 -0
- package/dist/assets/rust-BzKRNQWT.js +1 -0
- package/dist/assets/{sankeyDiagram-a04cb91d-DidhF5PL.js → sankeyDiagram-a04cb91d-CH69-iIn.js} +1 -1
- package/dist/assets/sb-BBc9UKZt.js +1 -0
- package/dist/assets/scala-D9hQfWCl.js +1 -0
- package/dist/assets/scheme-BPhDTwHR.js +1 -0
- package/dist/assets/scss-CBJaRo0y.js +3 -0
- package/dist/assets/{sequenceDiagram-c5b8d532-CEKaiwTo.js → sequenceDiagram-c5b8d532-yBBEeVFU.js} +1 -1
- package/dist/assets/shell-DiJ1NA_G.js +1 -0
- package/dist/assets/solidity-Db0IVjzk.js +1 -0
- package/dist/assets/sophia-CnS9iZB_.js +1 -0
- package/dist/assets/sparql-CJmd_6j2.js +1 -0
- package/dist/assets/sql-ClhHkBeG.js +1 -0
- package/dist/assets/st-CHwy0fLd.js +1 -0
- package/dist/assets/{stateDiagram-1ecb1508-Cj9ZY7RH.js → stateDiagram-1ecb1508-BvF4sign.js} +1 -1
- package/dist/assets/{stateDiagram-v2-c2b004d7-Gsmps-dk.js → stateDiagram-v2-c2b004d7-BeyT7Ghx.js} +1 -1
- package/dist/assets/{styles-b4e223ce-D7E8Th0j.js → styles-b4e223ce-C58zxmK6.js} +1 -1
- package/dist/assets/{styles-ca3715f6-tTC26Jsm.js → styles-ca3715f6-DCE5sFi5.js} +1 -1
- package/dist/assets/{styles-d45a18b0-Bf6oqNdR.js → styles-d45a18b0-CG-C1aM8.js} +1 -1
- package/dist/assets/{svgDrawCommon-b86b1483-BxKi01m2.js → svgDrawCommon-b86b1483-F-K8GeDd.js} +1 -1
- package/dist/assets/swift-Bqt4WxQ4.js +3 -0
- package/dist/assets/systemverilog-Bs9z6M-B.js +1 -0
- package/dist/assets/tcl-Dm6ycUr_.js +1 -0
- package/dist/assets/{timeline-definition-faaaa080-D6PePEip.js → timeline-definition-faaaa080-DPv4uqVX.js} +1 -1
- package/dist/assets/ts.worker-DGHjMaqB.js +67731 -0
- package/dist/assets/tsMode-BtU8ZELV.js +11 -0
- package/dist/assets/twig-Csy3S7wG.js +1 -0
- package/dist/assets/typescript-CJHgISWo.js +1 -0
- package/dist/assets/typespec-Btyra-wh.js +1 -0
- package/dist/assets/vb-Db0cS2oM.js +1 -0
- package/dist/assets/wgsl-BTesnYfV.js +298 -0
- package/dist/assets/xml-C_TJw4Bi.js +1 -0
- package/dist/assets/{xychartDiagram-f5964ef8-BuP4qfXm.js → xychartDiagram-f5964ef8-BmXlhBzX.js} +1 -1
- package/dist/assets/yaml-BujeJOJ6.js +1 -0
- package/dist/favicon.svg +3 -3
- package/dist/index.html +2 -2
- package/package.json +14 -10
- package/public/favicon.svg +3 -3
- package/src/api/sessions.ts +36 -0
- package/src/api/workspace.ts +19 -0
- package/src/api.ts +4 -0
- package/src/components/NavRail.scss +9 -10
- package/src/components/ShortcutDisplay.scss +38 -0
- package/src/components/ShortcutDisplay.tsx +37 -0
- package/src/components/ShortcutTooltip.scss +36 -0
- package/src/components/ShortcutTooltip.tsx +84 -0
- package/src/components/Sidebar.scss +55 -13
- package/src/components/Sidebar.tsx +141 -52
- package/src/components/chat/AGENTS.md +163 -0
- package/src/components/chat/ChatHeader.scss +308 -49
- package/src/components/chat/ChatHeader.tsx +394 -80
- package/src/components/chat/ChatHistoryView.tsx +284 -69
- package/src/components/chat/ChatSettingsView.tsx +5 -3
- package/src/components/chat/ChatTimelineView.scss +3 -2
- package/src/components/chat/{sender/ThinkingStatus.tsx → ThinkingStatus.tsx} +1 -1
- package/src/components/chat/messages/MessageContextMenu.scss +145 -0
- package/src/components/chat/messages/MessageContextMenu.tsx +108 -0
- package/src/components/chat/messages/MessageContextMenuContent.tsx +87 -0
- package/src/components/chat/messages/MessageFooter.tsx +44 -24
- package/src/components/chat/messages/MessageItem.scss +147 -10
- package/src/components/chat/messages/MessageItem.tsx +378 -13
- package/src/components/chat/messages/build-message-context-menu-entries.ts +166 -0
- package/src/components/chat/messages/message-content-utils.ts +121 -0
- package/src/components/chat/messages/message-turns.ts +88 -0
- package/src/components/chat/messages/message-utils.ts +19 -1
- package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +86 -0
- package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.tsx +54 -0
- package/src/components/chat/sender/@components/adapter-select/AdapterSelectDropdown.scss +42 -0
- package/src/components/chat/sender/@components/effort-select/EffortSelectControl.scss +68 -0
- package/src/components/chat/sender/@components/effort-select/EffortSelectControl.tsx +137 -0
- package/src/components/chat/sender/@components/effort-select/EffortSelectDropdown.scss +96 -0
- package/src/components/chat/sender/@components/model-select/ModelSelectControl.scss +82 -0
- package/src/components/chat/sender/@components/model-select/ModelSelectControl.tsx +171 -0
- package/src/components/chat/sender/@components/model-select/ModelSelectMenu.scss +95 -0
- package/src/components/chat/sender/@components/model-select/ModelSelectMenuLabels.scss +144 -0
- package/src/components/chat/sender/@components/model-select/ModelSelectOptionLabel.tsx +109 -0
- package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.scss +106 -0
- package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.tsx +156 -0
- package/src/components/chat/sender/@components/reference-actions/ReferenceActionsOption.scss +34 -0
- package/src/components/chat/sender/@components/reference-actions/ReferencePermissionActionsPopover.tsx +111 -0
- package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.scss +103 -0
- package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.tsx +47 -0
- package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +137 -0
- package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.scss +178 -0
- package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.tsx +145 -0
- package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.scss +47 -0
- package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.tsx +121 -0
- package/src/components/chat/sender/@components/sender-monaco-editor/monaco-runtime.ts +99 -0
- package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-editor-handle.ts +48 -0
- package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-editor.ts +209 -0
- package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-theme.ts +24 -0
- package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.scss +54 -0
- package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.tsx +80 -0
- package/src/components/chat/sender/@components/sender-toolbar/SenderSelectBase.scss +71 -0
- package/src/components/chat/sender/@components/sender-toolbar/SenderSelectShared.scss +118 -0
- package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.scss +99 -0
- package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.tsx +87 -0
- package/src/components/chat/sender/@core/build-sender-controller-result.ts +119 -0
- package/src/components/chat/sender/@core/build-sender-toolbar.ts +122 -0
- package/src/components/chat/sender/@core/content-attachments.ts +76 -0
- package/src/components/chat/sender/@core/create-sender-toolbar-handlers.ts +115 -0
- package/src/components/chat/sender/@core/get-sender-interaction-state.ts +18 -0
- package/src/components/chat/sender/@core/get-sender-runtime-state.ts +14 -0
- package/src/components/chat/sender/@core/interaction-request.ts +5 -0
- package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +155 -0
- package/src/components/chat/sender/@hooks/use-model-select-browser.tsx +189 -0
- package/src/components/chat/sender/@hooks/use-sender-attachments.ts +143 -0
- package/src/components/chat/sender/@hooks/use-sender-autofocus.ts +34 -0
- package/src/components/chat/sender/@hooks/use-sender-completion.ts +62 -0
- package/src/components/chat/sender/@hooks/use-sender-composer-state.ts +34 -0
- package/src/components/chat/sender/@hooks/use-sender-controller.ts +193 -0
- package/src/components/chat/sender/@hooks/use-sender-focus-restore.ts +72 -0
- package/src/components/chat/sender/@hooks/use-sender-history.ts +79 -0
- package/src/components/chat/sender/@hooks/use-sender-keydown.ts +113 -0
- package/src/components/chat/sender/@hooks/use-sender-reference-actions.ts +191 -0
- package/src/components/chat/sender/@hooks/use-sender-reference-focus-restore.ts +21 -0
- package/src/components/chat/sender/@hooks/use-sender-refs.ts +19 -0
- package/src/components/chat/sender/@hooks/use-sender-select-overlays.ts +83 -0
- package/src/components/chat/sender/@hooks/use-sender-shortcuts.ts +78 -0
- package/src/components/chat/sender/@hooks/use-sender-submit.ts +81 -0
- package/src/components/chat/sender/@types/sender-composer.ts +19 -0
- package/src/components/chat/sender/@types/sender-editor.ts +12 -0
- package/src/components/chat/sender/@types/sender-props.ts +50 -0
- package/src/components/chat/sender/@types/sender-toolbar-types.ts +83 -0
- package/src/components/chat/sender/@types/sender-types.ts +21 -0
- package/src/components/chat/sender/@utils/sender-completion.ts +164 -0
- package/src/components/chat/sender/@utils/sender-constants.ts +18 -0
- package/src/components/chat/sender/@utils/sender-utils.ts +45 -0
- package/src/components/chat/sender/Sender.scss +8 -605
- package/src/components/chat/sender/Sender.tsx +54 -880
- package/src/components/chat/session-metadata.ts +55 -0
- package/src/components/chat/terminal/@hooks/use-terminal-instance.ts +152 -0
- package/src/components/chat/terminal/@hooks/use-terminal-session.ts +196 -0
- package/src/components/chat/terminal/ChatTerminalView.scss +62 -0
- package/src/components/chat/terminal/ChatTerminalView.tsx +114 -0
- package/src/components/chat/tools/core/ToolGroup.scss +7 -0
- package/src/components/chat/tools/core/ToolGroup.tsx +97 -56
- package/src/components/config/ConfigSectionForm.tsx +8 -1
- package/src/components/config/ConfigShortcutInput.tsx +9 -2
- package/src/components/config/configSchema.ts +12 -2
- package/src/components/config/record-editors/ModelServicesRecordEditor.tsx +0 -14
- package/src/components/dock-panel/DockPanel.scss +152 -0
- package/src/components/dock-panel/DockPanel.tsx +195 -0
- package/src/components/layout/AppShell.scss +40 -2
- package/src/components/layout/AppShell.tsx +25 -10
- package/src/components/sidebar/SessionContextMenu.scss +143 -0
- package/src/components/sidebar/SessionContextMenu.tsx +196 -0
- package/src/components/sidebar/SessionContextMenuContent.tsx +89 -0
- package/src/components/sidebar/SessionItem.scss +150 -67
- package/src/components/sidebar/SessionItem.tsx +183 -134
- package/src/components/sidebar/SessionList.scss +47 -17
- package/src/components/sidebar/SessionList.tsx +31 -16
- package/src/components/sidebar/SidebarHeader.scss +329 -49
- package/src/components/sidebar/SidebarHeader.tsx +108 -86
- package/src/components/sidebar/SidebarHeaderBatchActions.tsx +81 -0
- package/src/components/sidebar/SidebarHeaderSearchActions.tsx +176 -0
- package/src/components/sidebar/SidebarHeaderSelectField.tsx +24 -0
- package/src/components/sidebar/filter-utils.ts +23 -0
- package/src/components/workspace/ContextFilePicker.scss +64 -0
- package/src/components/workspace/ContextFilePicker.tsx +171 -0
- package/src/connectionManager.ts +4 -2
- package/src/hooks/chat/interaction-state.ts +104 -0
- package/src/hooks/chat/model-selector-data-builders.ts +146 -0
- package/src/hooks/chat/model-selector-data-option-utils.ts +62 -0
- package/src/hooks/chat/model-selector-data-types.ts +27 -0
- package/src/hooks/chat/model-selector-data.ts +109 -0
- package/src/hooks/chat/model-selector-recommendations.ts +69 -0
- package/src/hooks/chat/model-selector.ts +9 -0
- package/src/hooks/chat/use-chat-interaction.ts +13 -8
- package/src/hooks/chat/use-chat-model-adapter-selection.tsx +167 -164
- package/src/hooks/chat/use-chat-models.tsx +46 -23
- package/src/hooks/chat/use-chat-session-actions.ts +69 -23
- package/src/hooks/chat/use-chat-session-messages.ts +165 -60
- package/src/hooks/chat/use-chat-session.ts +34 -9
- package/src/hooks/chat/use-chat-view.ts +26 -6
- package/src/hooks/chat/use-composer-control-shortcuts.ts +69 -0
- package/src/hooks/chat/use-terminal-dock-visibility.ts +39 -0
- package/src/hooks/use-roving-focus-list.ts +104 -0
- package/src/hooks/use-sidebar-navigation.ts +9 -4
- package/src/hooks/use-sidebar-query-state.ts +79 -0
- package/src/main.tsx +6 -1
- package/src/resources/locales/en.json +151 -6
- package/src/resources/locales/zh.json +151 -6
- package/src/routes/ChatRoute.scss +159 -4
- package/src/routes/ChatRoute.tsx +43 -9
- package/src/runtime-config.ts +21 -0
- package/src/store/index.ts +1 -3
- package/src/styles/global.scss +12 -2
- package/src/utils/chat-links.ts +21 -0
- package/src/utils/copy.ts +18 -0
- package/src/utils/shortcutUtils.ts +111 -1
- package/src/vite-env.d.ts +1 -0
- package/src/ws.ts +6 -5
- package/vite.config.ts +71 -7
- package/dist/assets/channel-bLjHfx-Q.js +0 -1
- package/dist/assets/clone-upfY39Je.js +0 -1
- package/dist/assets/flowDiagram-v2-4f6560a1-F66FzZTY.js +0 -1
- package/dist/assets/index-C1O04Df8.js +0 -557
- package/dist/assets/index-sE8VA1N7.css +0 -1
- package/src/components/chat/sender/CompletionMenu.scss +0 -70
- package/src/components/chat/sender/CompletionMenu.tsx +0 -58
- /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
|
-
"
|
|
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": "
|
|
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
|
},
|