@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.
- 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-D9HxM0yv.js → arc-C1rWFTer.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-C_pTeiD4.js → blockDiagram-c4efeb88-DlZ9x70F.js} +1 -1
- package/dist/assets/{c4Diagram-c83219d4-_oYrCrLr.js → c4Diagram-c83219d4-BKKxi__y.js} +1 -1
- package/dist/assets/cameligo-Bf6VGUru.js +1 -0
- package/dist/assets/channel-F1aqMANO.js +1 -0
- package/dist/assets/{classDiagram-beda092f-9dnkgPhR.js → classDiagram-beda092f-CVGPySZq.js} +1 -1
- package/dist/assets/{classDiagram-v2-2358418a-BUIeZpdO.js → classDiagram-v2-2358418a-7kp8GVVj.js} +1 -1
- package/dist/assets/clojure-Dnu-v4kV.js +1 -0
- package/dist/assets/clone-B-GCuXNo.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-DuRFplcD.js → createText-1719965b-Dykv8kT9.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-B59COYVW.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-CTpq6Ih_.js → edges-96097737-CkZ1ZBro.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-CWFgdO1E.js → erDiagram-0228fc6a-281ADcRp.js} +1 -1
- package/dist/assets/flow9-BeJ5waoc.js +1 -0
- package/dist/assets/{flowDb-c6c81e3f-8Vdx29oZ.js → flowDb-c6c81e3f-BQjX_flP.js} +1 -1
- package/dist/assets/{flowDiagram-50d868cf-6S9wOVNl.js → flowDiagram-50d868cf-DMHZTjES.js} +1 -1
- package/dist/assets/flowDiagram-v2-4f6560a1-C5FzdVl1.js +1 -0
- package/dist/assets/{flowchart-elk-definition-6af322e1-DVcZ-ZBQ.js → flowchart-elk-definition-6af322e1-CI3yz4z8.js} +1 -1
- package/dist/assets/freemarker2-DWnWjibn.js +3 -0
- package/dist/assets/fsharp-PahG7c26.js +1 -0
- package/dist/assets/{ganttDiagram-a2739b55-DY1QSl-x.js → ganttDiagram-a2739b55-B3IING9L.js} +1 -1
- package/dist/assets/{gitGraphDiagram-82fe8481-BP08OBKL.js → gitGraphDiagram-82fe8481-CnArIr_T.js} +1 -1
- package/dist/assets/go-acbASCJo.js +1 -0
- package/dist/assets/{graph-D8GCszcN.js → graph-BZ1F0Yve.js} +1 -1
- package/dist/assets/graphql-BxJiqAUM.js +1 -0
- package/dist/assets/handlebars-C1QH9qTz.js +1 -0
- package/dist/assets/hcl-DtV1sZF8.js +1 -0
- package/dist/assets/html-D1NkqHjC.js +1 -0
- package/dist/assets/html.worker-BLJhxQJQ.js +470 -0
- package/dist/assets/htmlMode-DAZCE_rA.js +1 -0
- package/dist/assets/{index-5325376f-OOoAXU1u.js → index-5325376f-Da9zSHjA.js} +1 -1
- package/dist/assets/index-C0vjF3D0.js +1511 -0
- package/dist/assets/index-vzEbM21t.css +32 -0
- package/dist/assets/{infoDiagram-8eee0895-BHgkXjhJ.js → infoDiagram-8eee0895-DYbFvRM7.js} +1 -1
- package/dist/assets/ini-Kd9XrMLS.js +1 -0
- package/dist/assets/java-CXBNlu9o.js +1 -0
- package/dist/assets/javascript-CoMjGRHa.js +1 -0
- package/dist/assets/{journeyDiagram-c64418c1-BljInElp.js → journeyDiagram-c64418c1-Boebox0b.js} +1 -1
- package/dist/assets/json.worker-usMZ-FED.js +58 -0
- package/dist/assets/jsonMode-D__gAvuz.js +7 -0
- package/dist/assets/julia-cl7-CwDS.js +1 -0
- package/dist/assets/kotlin-s7OhZKlX.js +1 -0
- package/dist/assets/{layout-Cw-SwAFD.js → layout-CTcHNbHp.js} +1 -1
- package/dist/assets/less-9HpZscsL.js +2 -0
- package/dist/assets/lexon-OrD6JF1K.js +1 -0
- package/dist/assets/{line-Q-uZLuUr.js → line-4AwinCz2.js} +1 -1
- package/dist/assets/{linear-BahOnNn3.js → linear-CeSMLzJW.js} +1 -1
- package/dist/assets/liquid-DZF6egdE.js +1 -0
- package/dist/assets/lspLanguageFeatures-6K4lv5S2.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-Cnt4ka6w.js +1 -0
- package/dist/assets/{mermaid.core-BR0Qh3Rd.js → mermaid.core-B0yG5s4D.js} +6 -6
- package/dist/assets/{mindmap-definition-8da855dc-Brq2OJUZ.js → mindmap-definition-8da855dc-KJEvXMKj.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-uhYdiXro.js → pieDiagram-a8764435-17nFAXPJ.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-DA3TtjDv.js +1 -0
- package/dist/assets/qsharp-Bw9ernYp.js +1 -0
- package/dist/assets/{quadrantDiagram-1e28029f-TwqtEe7e.js → quadrantDiagram-1e28029f-Dt4vubi-.js} +1 -1
- package/dist/assets/r-j7ic8hl3.js +1 -0
- package/dist/assets/razor-CWDJgvX_.js +1 -0
- package/dist/assets/redis-Bu5POkcn.js +1 -0
- package/dist/assets/redshift-Bs9aos_-.js +1 -0
- package/dist/assets/{requirementDiagram-08caed73-DSXnPRDS.js → requirementDiagram-08caed73-H6aDyDK-.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-EADpJeAn.js → sankeyDiagram-a04cb91d-DxsVtbjI.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-C8qXvt9z.js → sequenceDiagram-c5b8d532-BHa148XJ.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-5W0ghy_S.js → stateDiagram-1ecb1508-DgwBm8LO.js} +1 -1
- package/dist/assets/{stateDiagram-v2-c2b004d7-BfwOQJw4.js → stateDiagram-v2-c2b004d7-BK7IQLVc.js} +1 -1
- package/dist/assets/{styles-b4e223ce-EkKH_ULb.js → styles-b4e223ce-DzW27Bc-.js} +1 -1
- package/dist/assets/{styles-ca3715f6-DwhrtqlU.js → styles-ca3715f6-Dex2GiLT.js} +1 -1
- package/dist/assets/{styles-d45a18b0-yqL8KH6x.js → styles-d45a18b0-B6fGtDKS.js} +1 -1
- package/dist/assets/{svgDrawCommon-b86b1483--5VjnjhC.js → svgDrawCommon-b86b1483-B4HYgfV5.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-CWOTwik9.js → timeline-definition-faaaa080--QSbWb25.js} +1 -1
- package/dist/assets/ts.worker-DGHjMaqB.js +67731 -0
- package/dist/assets/tsMode-ZM7ocZCH.js +11 -0
- package/dist/assets/twig-Csy3S7wG.js +1 -0
- package/dist/assets/typescript-CKWDmBCc.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-DuEUAzPi.js +1 -0
- package/dist/assets/{xychartDiagram-f5964ef8-CZg47H1t.js → xychartDiagram-f5964ef8-D09Zkv2K.js} +1 -1
- package/dist/assets/yaml-DL7QPRYk.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 +353 -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 +157 -10
- package/src/components/chat/messages/MessageItem.tsx +382 -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/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 +6 -737
- package/src/components/chat/sender/Sender.tsx +53 -921
- 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 +94 -44
- 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 +67 -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 +158 -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 +140 -6
- package/src/resources/locales/zh.json +140 -6
- package/src/routes/ChatRoute.scss +159 -4
- package/src/routes/ChatRoute.tsx +72 -10
- 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-Di8KkPU4.js +0 -1
- package/dist/assets/clone-B065n6L-.js +0 -1
- package/dist/assets/flowDiagram-v2-4f6560a1-nj-oVLPK.js +0 -1
- package/dist/assets/index-BZe1Qtye.css +0 -1
- package/dist/assets/index-DV3eI2aD.js +0 -557
- 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
- /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
|
-
"
|
|
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": "
|
|
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
|
},
|