@vibe-forge/client 3.0.0-alpha.6 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. package/cli.cjs +55 -12
  2. package/dist/assets/{arc-CKcDlk7m.js → arc-lnVIZjVV.js} +1 -1
  3. package/dist/assets/{blockDiagram-c4efeb88-Si9lNhiR.js → blockDiagram-c4efeb88-CGc3VsM0.js} +1 -1
  4. package/dist/assets/{c4Diagram-c83219d4-CRTN1Bme.js → c4Diagram-c83219d4-KFbHuRdf.js} +1 -1
  5. package/dist/assets/channel-nqRbzJjc.js +1 -0
  6. package/dist/assets/{classDiagram-beda092f-Cn0JFKaM.js → classDiagram-beda092f-CDtKfvQN.js} +1 -1
  7. package/dist/assets/{classDiagram-v2-2358418a-CCRguPFP.js → classDiagram-v2-2358418a-DX8Wj36y.js} +1 -1
  8. package/dist/assets/clone-Dp80x0fP.js +1 -0
  9. package/dist/assets/{createText-1719965b-B7ypMies.js → createText-1719965b-BNBTbGpf.js} +1 -1
  10. package/dist/assets/{cssMode-CGqPieqo.js → cssMode-Ptqm0UgE.js} +1 -1
  11. package/dist/assets/{edges-96097737-DQTQ3TTh.js → edges-96097737-Ddj48nr8.js} +1 -1
  12. package/dist/assets/{erDiagram-0228fc6a-RWH9OCKP.js → erDiagram-0228fc6a-Ctc1Voxl.js} +1 -1
  13. package/dist/assets/{flowDb-c6c81e3f-ChBIZfFE.js → flowDb-c6c81e3f-B3LqoAaB.js} +1 -1
  14. package/dist/assets/{flowDiagram-50d868cf-B5L7Tbzq.js → flowDiagram-50d868cf-HhEHMvI3.js} +1 -1
  15. package/dist/assets/flowDiagram-v2-4f6560a1-BnkEnoEY.js +1 -0
  16. package/dist/assets/{flowchart-elk-definition-6af322e1-B7X89gyf.js → flowchart-elk-definition-6af322e1-BimqA4Ix.js} +1 -1
  17. package/dist/assets/{freemarker2-DG-xlAsn.js → freemarker2-BMLA0JoH.js} +1 -1
  18. package/dist/assets/{ganttDiagram-a2739b55-BedUmaPf.js → ganttDiagram-a2739b55-DbWekIop.js} +1 -1
  19. package/dist/assets/{gitGraphDiagram-82fe8481-B8HGnn-5.js → gitGraphDiagram-82fe8481-DugZXJxL.js} +1 -1
  20. package/dist/assets/{graph-D9-QnVc7.js → graph-BIUNEnmO.js} +1 -1
  21. package/dist/assets/{handlebars-D3MqxNWf.js → handlebars-CaH_OmK8.js} +1 -1
  22. package/dist/assets/{html-DufmGZMV.js → html-CJM7ZGkq.js} +1 -1
  23. package/dist/assets/{htmlMode-CUM_1bUX.js → htmlMode-BG64A-lN.js} +1 -1
  24. package/dist/assets/{index-5325376f-DvDnB8Ym.js → index-5325376f-DowhDAzC.js} +1 -1
  25. package/dist/assets/{index-CFwJnHev.js → index-DE5IhsLX.js} +5 -5
  26. package/dist/assets/{infoDiagram-8eee0895-CEkPslG6.js → infoDiagram-8eee0895-DCFO3Gq3.js} +1 -1
  27. package/dist/assets/{javascript-B6reuW3Q.js → javascript-WPwGMZFk.js} +1 -1
  28. package/dist/assets/{journeyDiagram-c64418c1-c8XBdi4a.js → journeyDiagram-c64418c1-DbnoY6Uo.js} +1 -1
  29. package/dist/assets/{jsonMode-srNnX9pn.js → jsonMode-C7yBbpF1.js} +1 -1
  30. package/dist/assets/{layout-XKv3I9bs.js → layout-C9lYzHQN.js} +1 -1
  31. package/dist/assets/{line-BUKiwgio.js → line-Da8bHZTb.js} +1 -1
  32. package/dist/assets/{linear-Dfad58q_.js → linear-CqRVyBRo.js} +1 -1
  33. package/dist/assets/{liquid-CEkxMSzk.js → liquid-DHZpN37G.js} +1 -1
  34. package/dist/assets/{lspLanguageFeatures-0mffeVGX.js → lspLanguageFeatures-C34m_8ti.js} +1 -1
  35. package/dist/assets/{mdx-B-Qq5FgQ.js → mdx-ChgypGoV.js} +1 -1
  36. package/dist/assets/{mermaid.core-DDK6pwbH.js → mermaid.core-4DaC4St_.js} +4 -4
  37. package/dist/assets/{mindmap-definition-8da855dc-CyIw0Vtn.js → mindmap-definition-8da855dc-hvBUs35M.js} +1 -1
  38. package/dist/assets/{pieDiagram-a8764435-DCdqfk2w.js → pieDiagram-a8764435-KKbynGsZ.js} +1 -1
  39. package/dist/assets/{python-CMoFKB7x.js → python-DssCQx-A.js} +1 -1
  40. package/dist/assets/{quadrantDiagram-1e28029f-mXna6sR0.js → quadrantDiagram-1e28029f-IItmvZDf.js} +1 -1
  41. package/dist/assets/{razor-B6DD072n.js → razor-xXXtaoJF.js} +1 -1
  42. package/dist/assets/{requirementDiagram-08caed73-DgC33PUx.js → requirementDiagram-08caed73-CYZ2UIRt.js} +1 -1
  43. package/dist/assets/{sankeyDiagram-a04cb91d-6DjDiGF1.js → sankeyDiagram-a04cb91d-BWor9f7d.js} +1 -1
  44. package/dist/assets/{sequenceDiagram-c5b8d532-BHEC8MLz.js → sequenceDiagram-c5b8d532-TWiqf82J.js} +1 -1
  45. package/dist/assets/{stateDiagram-1ecb1508-CnQIc7IJ.js → stateDiagram-1ecb1508-ITPwn2Bf.js} +1 -1
  46. package/dist/assets/{stateDiagram-v2-c2b004d7-DyYVXqRY.js → stateDiagram-v2-c2b004d7-YjTlGGeJ.js} +1 -1
  47. package/dist/assets/{styles-b4e223ce-BCRMXdaJ.js → styles-b4e223ce-BdOTgXu7.js} +1 -1
  48. package/dist/assets/{styles-ca3715f6-B0Uke183.js → styles-ca3715f6-DSryl5cS.js} +1 -1
  49. package/dist/assets/{styles-d45a18b0-CTIOlm5f.js → styles-d45a18b0-0wPNzh5D.js} +1 -1
  50. package/dist/assets/{svgDrawCommon-b86b1483-DIsUSZPw.js → svgDrawCommon-b86b1483-Bkv9XWwN.js} +1 -1
  51. package/dist/assets/{timeline-definition-faaaa080-Dioszvxi.js → timeline-definition-faaaa080-CVDgx3Ub.js} +1 -1
  52. package/dist/assets/{tsMode-C8qimCsh.js → tsMode-C7GDZM9j.js} +1 -1
  53. package/dist/assets/{typescript-DIHO7TTQ.js → typescript-B8cSShUe.js} +1 -1
  54. package/dist/assets/{xml-DE5CGUCp.js → xml-CdAKZrLj.js} +1 -1
  55. package/dist/assets/{xychartDiagram-f5964ef8-bhTIJLJy.js → xychartDiagram-f5964ef8-CtgQRYQp.js} +1 -1
  56. package/dist/assets/{yaml-Cac2zjUM.js → yaml-vZ3X6eTz.js} +1 -1
  57. package/dist/index.html +1 -1
  58. package/package.json +22 -16
  59. package/preview-runtime.cjs +128 -0
  60. package/preview-server.cjs +198 -0
  61. package/AGENTS.md +0 -115
  62. package/dist/assets/channel-_Q_52ef7.js +0 -1
  63. package/dist/assets/clone-BicNByr8.js +0 -1
  64. package/dist/assets/flowDiagram-v2-4f6560a1-CWSRSwc1.js +0 -1
  65. package/index.html +0 -18
  66. package/public/favicon.svg +0 -5
  67. package/public/manifest.webmanifest +0 -30
  68. package/public/pwa-icon-192.png +0 -0
  69. package/public/pwa-icon-512.png +0 -0
  70. package/public/sw.js +0 -105
  71. package/src/App.tsx +0 -40
  72. package/src/api/README.md +0 -27
  73. package/src/api/adapters.ts +0 -63
  74. package/src/api/auth-token.ts +0 -51
  75. package/src/api/auth.ts +0 -46
  76. package/src/api/automation.ts +0 -98
  77. package/src/api/base.ts +0 -166
  78. package/src/api/benchmark.ts +0 -50
  79. package/src/api/config.ts +0 -29
  80. package/src/api/git.ts +0 -90
  81. package/src/api/knowledge.ts +0 -131
  82. package/src/api/projects.ts +0 -15
  83. package/src/api/sessions.ts +0 -281
  84. package/src/api/skill-hub.ts +0 -126
  85. package/src/api/types.ts +0 -21
  86. package/src/api/workspace.ts +0 -51
  87. package/src/api/worktree-environments.ts +0 -53
  88. package/src/api.ts +0 -142
  89. package/src/assets/fonts/material-symbols-rounded.woff2 +0 -0
  90. package/src/client-build-info.ts +0 -19
  91. package/src/components/ArchiveView.scss +0 -257
  92. package/src/components/ArchiveView.tsx +0 -313
  93. package/src/components/CodeBlock.scss +0 -92
  94. package/src/components/CodeBlock.tsx +0 -181
  95. package/src/components/ConfigView.scss +0 -864
  96. package/src/components/ConfigView.tsx +0 -788
  97. package/src/components/MarkdownContent.tsx +0 -50
  98. package/src/components/NavRail.scss +0 -317
  99. package/src/components/NavRail.tsx +0 -198
  100. package/src/components/NavRailCompact.tsx +0 -107
  101. package/src/components/NavRailCompactMoreSheet.tsx +0 -141
  102. package/src/components/ShortcutDisplay.scss +0 -38
  103. package/src/components/ShortcutDisplay.tsx +0 -37
  104. package/src/components/ShortcutTooltip.scss +0 -36
  105. package/src/components/ShortcutTooltip.tsx +0 -86
  106. package/src/components/Sidebar.scss +0 -161
  107. package/src/components/Sidebar.tsx +0 -480
  108. package/src/components/auth/AuthGate.scss +0 -79
  109. package/src/components/auth/AuthGate.tsx +0 -174
  110. package/src/components/automation-view/@components/AutomationTaskComposer.tsx +0 -220
  111. package/src/components/automation-view/@components/AutomationTriggerRow.tsx +0 -192
  112. package/src/components/automation-view/@hooks/use-automation-startup-options-data.tsx +0 -289
  113. package/src/components/automation-view/@hooks/use-automation-startup-static-options.ts +0 -51
  114. package/src/components/automation-view/@utils/sender-model-options.tsx +0 -52
  115. package/src/components/automation-view/@utils/startup-options.ts +0 -26
  116. package/src/components/automation-view/AutomationEmptyGuide.tsx +0 -61
  117. package/src/components/automation-view/AutomationEmptyLanding.scss +0 -165
  118. package/src/components/automation-view/AutomationEmptyLanding.tsx +0 -211
  119. package/src/components/automation-view/AutomationRuleDetailPreview.tsx +0 -179
  120. package/src/components/automation-view/PanelTitleActions.tsx +0 -66
  121. package/src/components/automation-view/RuleFormPanel.scss +0 -279
  122. package/src/components/automation-view/RuleFormPanel.tsx +0 -365
  123. package/src/components/automation-view/RuleSidebar.scss +0 -332
  124. package/src/components/automation-view/RuleSidebar.tsx +0 -338
  125. package/src/components/automation-view/RunHistoryPanel.scss +0 -649
  126. package/src/components/automation-view/RunHistoryPanel.tsx +0 -382
  127. package/src/components/automation-view/TaskList.scss +0 -223
  128. package/src/components/automation-view/TaskList.tsx +0 -67
  129. package/src/components/automation-view/TriggerList.scss +0 -267
  130. package/src/components/automation-view/TriggerList.tsx +0 -68
  131. package/src/components/automation-view/index.scss +0 -230
  132. package/src/components/automation-view/index.tsx +0 -369
  133. package/src/components/automation-view/types.ts +0 -34
  134. package/src/components/benchmark-view/BenchmarkCasePanel.scss +0 -287
  135. package/src/components/benchmark-view/BenchmarkCasePanel.tsx +0 -309
  136. package/src/components/benchmark-view/BenchmarkSidebar.scss +0 -206
  137. package/src/components/benchmark-view/BenchmarkSidebar.tsx +0 -269
  138. package/src/components/benchmark-view/BenchmarkView.scss +0 -121
  139. package/src/components/benchmark-view/index.tsx +0 -237
  140. package/src/components/benchmark-view/types.ts +0 -11
  141. package/src/components/benchmark-view/utils.ts +0 -20
  142. package/src/components/chat/AGENTS.md +0 -177
  143. package/src/components/chat/ChatComposerCard.scss +0 -77
  144. package/src/components/chat/ChatComposerCard.tsx +0 -59
  145. package/src/components/chat/ChatHeader.scss +0 -865
  146. package/src/components/chat/ChatHeader.tsx +0 -832
  147. package/src/components/chat/ChatHistoryView.tsx +0 -887
  148. package/src/components/chat/ChatSettingsView.tsx +0 -24
  149. package/src/components/chat/ChatTimelineView.scss +0 -147
  150. package/src/components/chat/ChatTimelineView.tsx +0 -200
  151. package/src/components/chat/CurrentTodoList.scss +0 -256
  152. package/src/components/chat/CurrentTodoList.tsx +0 -171
  153. package/src/components/chat/NewSessionGuide.scss +0 -416
  154. package/src/components/chat/NewSessionGuide.tsx +0 -69
  155. package/src/components/chat/NewSessionGuideStarterList.tsx +0 -190
  156. package/src/components/chat/NewSessionGuideStarterSection.tsx +0 -121
  157. package/src/components/chat/QueuedMessagesCard.scss +0 -195
  158. package/src/components/chat/QueuedMessagesCard.tsx +0 -170
  159. package/src/components/chat/bottom-dock-constants.ts +0 -4
  160. package/src/components/chat/conversation-starter-apply.ts +0 -181
  161. package/src/components/chat/git-controls/BranchSwitcherDropdown.tsx +0 -162
  162. package/src/components/chat/git-controls/BranchSwitcherResults.tsx +0 -167
  163. package/src/components/chat/git-controls/BranchTreeEntries.tsx +0 -99
  164. package/src/components/chat/git-controls/ChatGitControls.scss +0 -1113
  165. package/src/components/chat/git-controls/ChatGitControls.tsx +0 -178
  166. package/src/components/chat/git-controls/DraftGitControls.tsx +0 -105
  167. package/src/components/chat/git-controls/DraftWorktreeEnvironmentDropdown.tsx +0 -115
  168. package/src/components/chat/git-controls/GitCommitModal.tsx +0 -199
  169. package/src/components/chat/git-controls/GitCommitModalParts.tsx +0 -151
  170. package/src/components/chat/git-controls/GitOperationsDropdown.tsx +0 -131
  171. package/src/components/chat/git-controls/GitPushModal.tsx +0 -106
  172. package/src/components/chat/git-controls/GitWorktreeDropdown.tsx +0 -341
  173. package/src/components/chat/git-controls/git-branch-tree.ts +0 -148
  174. package/src/components/chat/git-controls/git-branch-utils.ts +0 -88
  175. package/src/components/chat/git-controls/git-commit-utils.ts +0 -79
  176. package/src/components/chat/git-controls/git-mutation-utils.ts +0 -69
  177. package/src/components/chat/git-controls/git-operation-utils.ts +0 -98
  178. package/src/components/chat/git-controls/git-worktree-utils.ts +0 -49
  179. package/src/components/chat/git-controls/use-chat-draft-git-controls.ts +0 -168
  180. package/src/components/chat/git-controls/use-chat-git-commit.ts +0 -185
  181. package/src/components/chat/git-controls/use-chat-git-controls.ts +0 -273
  182. package/src/components/chat/git-controls/use-chat-git-push-state.ts +0 -19
  183. package/src/components/chat/git-controls/use-chat-git-worktrees.ts +0 -39
  184. package/src/components/chat/messages/MessageContextMenu.scss +0 -145
  185. package/src/components/chat/messages/MessageContextMenu.tsx +0 -110
  186. package/src/components/chat/messages/MessageContextMenuContent.tsx +0 -87
  187. package/src/components/chat/messages/MessageFooter.tsx +0 -68
  188. package/src/components/chat/messages/MessageItem.scss +0 -486
  189. package/src/components/chat/messages/MessageItem.tsx +0 -529
  190. package/src/components/chat/messages/MessageStatusNotice.scss +0 -163
  191. package/src/components/chat/messages/MessageStatusNotice.tsx +0 -56
  192. package/src/components/chat/messages/build-chat-history-status-notices.ts +0 -143
  193. package/src/components/chat/messages/build-message-context-menu-entries.ts +0 -166
  194. package/src/components/chat/messages/message-action-utils.ts +0 -29
  195. package/src/components/chat/messages/message-content-utils.ts +0 -121
  196. package/src/components/chat/messages/message-turns.ts +0 -88
  197. package/src/components/chat/messages/message-utils.ts +0 -189
  198. package/src/components/chat/new-session-guide-config.ts +0 -19
  199. package/src/components/chat/new-session-guide-items.ts +0 -172
  200. package/src/components/chat/new-session-guide-list-order.ts +0 -58
  201. package/src/components/chat/sender/@components/account-select/AccountSelectControl.scss +0 -112
  202. package/src/components/chat/sender/@components/account-select/AccountSelectControl.tsx +0 -280
  203. package/src/components/chat/sender/@components/account-select/AccountSelectDropdown.scss +0 -155
  204. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.scss +0 -148
  205. package/src/components/chat/sender/@components/adapter-select/AdapterSelectControl.tsx +0 -54
  206. package/src/components/chat/sender/@components/adapter-select/AdapterSelectDropdown.scss +0 -56
  207. package/src/components/chat/sender/@components/effort-select/EffortSelectControl.scss +0 -104
  208. package/src/components/chat/sender/@components/effort-select/EffortSelectControl.tsx +0 -142
  209. package/src/components/chat/sender/@components/effort-select/EffortSelectDropdown.scss +0 -96
  210. package/src/components/chat/sender/@components/model-select/ModelSelectControl.scss +0 -144
  211. package/src/components/chat/sender/@components/model-select/ModelSelectControl.tsx +0 -176
  212. package/src/components/chat/sender/@components/model-select/ModelSelectMenu.scss +0 -97
  213. package/src/components/chat/sender/@components/model-select/ModelSelectMenuLabels.scss +0 -168
  214. package/src/components/chat/sender/@components/model-select/ModelSelectOptionLabel.tsx +0 -109
  215. package/src/components/chat/sender/@components/permission-mode-control/PermissionModeControl.scss +0 -199
  216. package/src/components/chat/sender/@components/permission-mode-control/PermissionModeControl.tsx +0 -172
  217. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.scss +0 -114
  218. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsControl.tsx +0 -107
  219. package/src/components/chat/sender/@components/reference-actions/ReferenceActionsOption.scss +0 -34
  220. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.scss +0 -240
  221. package/src/components/chat/sender/@components/sender-attachments/SenderAttachments.tsx +0 -119
  222. package/src/components/chat/sender/@components/sender-body/SenderBody.tsx +0 -135
  223. package/src/components/chat/sender/@components/sender-header-controls/SenderHeaderControls.tsx +0 -157
  224. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.scss +0 -294
  225. package/src/components/chat/sender/@components/sender-interaction-panel/SenderInteractionPanel.tsx +0 -384
  226. package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.scss +0 -47
  227. package/src/components/chat/sender/@components/sender-monaco-editor/SenderMonacoEditor.tsx +0 -139
  228. package/src/components/chat/sender/@components/sender-monaco-editor/monaco-runtime.ts +0 -83
  229. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-editor-handle.ts +0 -48
  230. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-editor.ts +0 -286
  231. package/src/components/chat/sender/@components/sender-monaco-editor/use-sender-monaco-theme.ts +0 -73
  232. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.scss +0 -163
  233. package/src/components/chat/sender/@components/sender-submit-action/SenderSubmitAction.tsx +0 -200
  234. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectBase.scss +0 -108
  235. package/src/components/chat/sender/@components/sender-toolbar/SenderSelectShared.scss +0 -156
  236. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.scss +0 -164
  237. package/src/components/chat/sender/@components/sender-toolbar/SenderToolbar.tsx +0 -93
  238. package/src/components/chat/sender/@components/session-target/SenderSessionTargetBar.scss +0 -215
  239. package/src/components/chat/sender/@components/session-target/SenderSessionTargetBar.tsx +0 -185
  240. package/src/components/chat/sender/@core/build-sender-controller-result.ts +0 -119
  241. package/src/components/chat/sender/@core/build-sender-toolbar.ts +0 -151
  242. package/src/components/chat/sender/@core/content-attachments.ts +0 -76
  243. package/src/components/chat/sender/@core/create-sender-toolbar-handlers.ts +0 -142
  244. package/src/components/chat/sender/@core/get-sender-interaction-state.ts +0 -18
  245. package/src/components/chat/sender/@core/get-sender-runtime-state.ts +0 -15
  246. package/src/components/chat/sender/@core/interaction-request.ts +0 -5
  247. package/src/components/chat/sender/@core/sender-toolbar-bindings.ts +0 -191
  248. package/src/components/chat/sender/@hooks/use-model-select-browser.tsx +0 -191
  249. package/src/components/chat/sender/@hooks/use-sender-attachments.ts +0 -143
  250. package/src/components/chat/sender/@hooks/use-sender-autofocus.ts +0 -34
  251. package/src/components/chat/sender/@hooks/use-sender-completion.ts +0 -62
  252. package/src/components/chat/sender/@hooks/use-sender-composer-state.ts +0 -34
  253. package/src/components/chat/sender/@hooks/use-sender-controller.ts +0 -291
  254. package/src/components/chat/sender/@hooks/use-sender-focus-restore.ts +0 -72
  255. package/src/components/chat/sender/@hooks/use-sender-history.ts +0 -79
  256. package/src/components/chat/sender/@hooks/use-sender-keydown.ts +0 -177
  257. package/src/components/chat/sender/@hooks/use-sender-reference-actions.ts +0 -134
  258. package/src/components/chat/sender/@hooks/use-sender-reference-focus-restore.ts +0 -21
  259. package/src/components/chat/sender/@hooks/use-sender-refs.ts +0 -19
  260. package/src/components/chat/sender/@hooks/use-sender-select-overlays.ts +0 -83
  261. package/src/components/chat/sender/@hooks/use-sender-shortcuts.ts +0 -93
  262. package/src/components/chat/sender/@hooks/use-sender-submit.ts +0 -89
  263. package/src/components/chat/sender/@types/sender-composer.ts +0 -19
  264. package/src/components/chat/sender/@types/sender-editor.ts +0 -12
  265. package/src/components/chat/sender/@types/sender-props.ts +0 -82
  266. package/src/components/chat/sender/@types/sender-toolbar-types.ts +0 -101
  267. package/src/components/chat/sender/@types/sender-types.ts +0 -19
  268. package/src/components/chat/sender/@utils/sender-completion.ts +0 -164
  269. package/src/components/chat/sender/@utils/sender-constants.ts +0 -18
  270. package/src/components/chat/sender/@utils/sender-utils.ts +0 -45
  271. package/src/components/chat/sender/Sender.scss +0 -299
  272. package/src/components/chat/sender/Sender.tsx +0 -55
  273. package/src/components/chat/session-metadata.ts +0 -55
  274. package/src/components/chat/session-timeline-panel/EventList.scss +0 -146
  275. package/src/components/chat/session-timeline-panel/EventList.tsx +0 -264
  276. package/src/components/chat/session-timeline-panel/gantt.ts +0 -193
  277. package/src/components/chat/session-timeline-panel/git-graph.ts +0 -530
  278. package/src/components/chat/session-timeline-panel/index.scss +0 -41
  279. package/src/components/chat/session-timeline-panel/index.tsx +0 -197
  280. package/src/components/chat/session-timeline-panel/mermaid.ts +0 -4
  281. package/src/components/chat/session-timeline-panel/types.ts +0 -68
  282. package/src/components/chat/session-timeline-panel/utils.ts +0 -20
  283. package/src/components/chat/status-bar/ChatStatusBar.scss +0 -112
  284. package/src/components/chat/status-bar/ChatStatusBar.tsx +0 -87
  285. package/src/components/chat/terminal/@components/TerminalManagerList.tsx +0 -191
  286. package/src/components/chat/terminal/@components/TerminalPane.scss +0 -71
  287. package/src/components/chat/terminal/@components/TerminalPane.tsx +0 -137
  288. package/src/components/chat/terminal/@components/TerminalPanelActions.tsx +0 -75
  289. package/src/components/chat/terminal/@hooks/use-terminal-instance.ts +0 -188
  290. package/src/components/chat/terminal/@hooks/use-terminal-session.ts +0 -193
  291. package/src/components/chat/terminal/@hooks/use-terminal-title-editor.ts +0 -72
  292. package/src/components/chat/terminal/@utils/terminal-keyboard.ts +0 -141
  293. package/src/components/chat/terminal/@utils/terminal-panes.ts +0 -123
  294. package/src/components/chat/terminal/ChatTerminalView.scss +0 -334
  295. package/src/components/chat/terminal/ChatTerminalView.tsx +0 -192
  296. package/src/components/chat/tools/DefaultTool.tsx +0 -102
  297. package/src/components/chat/tools/adapter-claude/BashTool.scss +0 -87
  298. package/src/components/chat/tools/adapter-claude/BashTool.tsx +0 -116
  299. package/src/components/chat/tools/adapter-claude/ClaudeEditDiff.tsx +0 -30
  300. package/src/components/chat/tools/adapter-claude/GenericClaudeTool.scss +0 -128
  301. package/src/components/chat/tools/adapter-claude/GenericClaudeTool.tsx +0 -119
  302. package/src/components/chat/tools/adapter-claude/GlobTool.scss +0 -9
  303. package/src/components/chat/tools/adapter-claude/GlobTool.tsx +0 -65
  304. package/src/components/chat/tools/adapter-claude/GrepTool.scss +0 -9
  305. package/src/components/chat/tools/adapter-claude/GrepTool.tsx +0 -95
  306. package/src/components/chat/tools/adapter-claude/LSTool.scss +0 -6
  307. package/src/components/chat/tools/adapter-claude/LSTool.tsx +0 -94
  308. package/src/components/chat/tools/adapter-claude/ReadTool.scss +0 -1
  309. package/src/components/chat/tools/adapter-claude/ReadTool.tsx +0 -65
  310. package/src/components/chat/tools/adapter-claude/TodoTool.scss +0 -63
  311. package/src/components/chat/tools/adapter-claude/TodoTool.tsx +0 -73
  312. package/src/components/chat/tools/adapter-claude/WriteTool.scss +0 -44
  313. package/src/components/chat/tools/adapter-claude/WriteTool.tsx +0 -50
  314. package/src/components/chat/tools/adapter-claude/claude-tool-edit-builders.ts +0 -109
  315. package/src/components/chat/tools/adapter-claude/claude-tool-field-sections.tsx +0 -83
  316. package/src/components/chat/tools/adapter-claude/claude-tool-operation-builders.ts +0 -135
  317. package/src/components/chat/tools/adapter-claude/claude-tool-presentation.ts +0 -61
  318. package/src/components/chat/tools/adapter-claude/claude-tool-shared.ts +0 -185
  319. package/src/components/chat/tools/adapter-claude/claude-tool-summary.ts +0 -76
  320. package/src/components/chat/tools/adapter-claude/claude-tool-system-builders.ts +0 -125
  321. package/src/components/chat/tools/adapter-claude/claude-tool-task-builders.ts +0 -148
  322. package/src/components/chat/tools/adapter-claude/components/FileList.scss +0 -67
  323. package/src/components/chat/tools/adapter-claude/components/FileList.tsx +0 -185
  324. package/src/components/chat/tools/adapter-claude/index.ts +0 -31
  325. package/src/components/chat/tools/adapter-claude/utils.ts +0 -54
  326. package/src/components/chat/tools/core/ToolCallBox.scss +0 -700
  327. package/src/components/chat/tools/core/ToolCallBox.tsx +0 -77
  328. package/src/components/chat/tools/core/ToolDiffViewer.scss +0 -138
  329. package/src/components/chat/tools/core/ToolDiffViewer.tsx +0 -166
  330. package/src/components/chat/tools/core/ToolGroup.scss +0 -171
  331. package/src/components/chat/tools/core/ToolGroup.tsx +0 -156
  332. package/src/components/chat/tools/core/ToolRenderer.tsx +0 -47
  333. package/src/components/chat/tools/core/ToolResultContent.tsx +0 -66
  334. package/src/components/chat/tools/core/ToolSummaryHeader.tsx +0 -67
  335. package/src/components/chat/tools/core/generic-tool-presentation.ts +0 -661
  336. package/src/components/chat/tools/core/tool-content-presence.ts +0 -57
  337. package/src/components/chat/tools/core/tool-display.ts +0 -203
  338. package/src/components/chat/tools/core/tool-field-sections.tsx +0 -132
  339. package/src/components/chat/tools/core/tool-result-content-utils.ts +0 -171
  340. package/src/components/chat/tools/core/tool-summary.ts +0 -206
  341. package/src/components/chat/tools/defineToolRender.ts +0 -28
  342. package/src/components/chat/tools/plugin-chrome-devtools/ChromeDevtoolsTool.scss +0 -11
  343. package/src/components/chat/tools/plugin-chrome-devtools/ChromeDevtoolsTool.tsx +0 -81
  344. package/src/components/chat/tools/plugin-chrome-devtools/index.ts +0 -45
  345. package/src/components/chat/tools/task/GetTaskInfoTool.scss +0 -25
  346. package/src/components/chat/tools/task/GetTaskInfoTool.tsx +0 -115
  347. package/src/components/chat/tools/task/ListTasksTool.scss +0 -31
  348. package/src/components/chat/tools/task/ListTasksTool.tsx +0 -99
  349. package/src/components/chat/tools/task/StartTasksTool.scss +0 -31
  350. package/src/components/chat/tools/task/StartTasksTool.tsx +0 -106
  351. package/src/components/chat/tools/task/components/TaskRow.scss +0 -105
  352. package/src/components/chat/tools/task/components/TaskRow.tsx +0 -163
  353. package/src/components/chat/tools/task/components/TaskToolCard.scss +0 -185
  354. package/src/components/chat/tools/task/components/TaskToolCard.tsx +0 -179
  355. package/src/components/chat/tools/task/index.ts +0 -15
  356. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawer.scss +0 -778
  357. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawer.tsx +0 -112
  358. package/src/components/chat/workspace-drawer/ChatWorkspaceDrawerToolbar.tsx +0 -183
  359. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFileRow.tsx +0 -75
  360. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFiles.tsx +0 -161
  361. package/src/components/chat/workspace-drawer/WorkspaceDrawerChangedFolderTree.tsx +0 -191
  362. package/src/components/chat/workspace-drawer/WorkspaceDrawerTree.tsx +0 -35
  363. package/src/components/chat/workspace-drawer/WorkspaceDrawerTreeState.tsx +0 -17
  364. package/src/components/chat/workspace-drawer/changed-files-model.ts +0 -152
  365. package/src/components/chat/workspace-drawer/workspace-drawer-icons.ts +0 -110
  366. package/src/components/chat/workspace-file-editor/WorkspaceFileBreadcrumb.tsx +0 -17
  367. package/src/components/chat/workspace-file-editor/WorkspaceFileEditorView.scss +0 -283
  368. package/src/components/chat/workspace-file-editor/WorkspaceFileEditorView.tsx +0 -165
  369. package/src/components/chat/workspace-file-editor/WorkspaceFileTabs.tsx +0 -135
  370. package/src/components/chat/workspace-file-editor/use-workspace-file-editor-state.ts +0 -113
  371. package/src/components/chat/workspace-file-editor/workspace-file-editor-language.ts +0 -55
  372. package/src/components/composer-landing/ComposerLanding.scss +0 -75
  373. package/src/components/composer-landing/ComposerLanding.tsx +0 -47
  374. package/src/components/config/AGENTS.md +0 -45
  375. package/src/components/config/AdapterAccountsManager.scss +0 -540
  376. package/src/components/config/AdapterAccountsManager.tsx +0 -846
  377. package/src/components/config/AppSettingsPanel.tsx +0 -109
  378. package/src/components/config/ConfigAboutSection.scss +0 -117
  379. package/src/components/config/ConfigAboutSection.tsx +0 -104
  380. package/src/components/config/ConfigDisplayValue.scss +0 -22
  381. package/src/components/config/ConfigDisplayValue.tsx +0 -62
  382. package/src/components/config/ConfigEditors.scss +0 -91
  383. package/src/components/config/ConfigEditors.tsx +0 -98
  384. package/src/components/config/ConfigFieldRow.scss +0 -221
  385. package/src/components/config/ConfigFieldRow.tsx +0 -36
  386. package/src/components/config/ConfigSectionForm.scss +0 -185
  387. package/src/components/config/ConfigSectionForm.tsx +0 -1264
  388. package/src/components/config/ConfigSectionPanel.tsx +0 -250
  389. package/src/components/config/ConfigShortcutInput.scss +0 -11
  390. package/src/components/config/ConfigShortcutInput.tsx +0 -59
  391. package/src/components/config/ConfigSourceSwitch.tsx +0 -49
  392. package/src/components/config/DetailCollectionFieldActions.tsx +0 -63
  393. package/src/components/config/DetailListField.tsx +0 -413
  394. package/src/components/config/McpServerItemEditor.tsx +0 -154
  395. package/src/components/config/RecommendedModelsItemEditor.tsx +0 -146
  396. package/src/components/config/WorktreeEnvironmentDetailView.tsx +0 -126
  397. package/src/components/config/WorktreeEnvironmentListView.tsx +0 -126
  398. package/src/components/config/WorktreeEnvironmentPanel.scss +0 -430
  399. package/src/components/config/WorktreeEnvironmentPanel.tsx +0 -147
  400. package/src/components/config/WorktreeEnvironmentScriptEditorCard.tsx +0 -125
  401. package/src/components/config/WorktreeEnvironmentScriptEditors.tsx +0 -189
  402. package/src/components/config/channelDefinitions.ts +0 -6
  403. package/src/components/config/configConflict.ts +0 -41
  404. package/src/components/config/configDetail.ts +0 -381
  405. package/src/components/config/configSchema.ts +0 -1017
  406. package/src/components/config/configUtils.ts +0 -83
  407. package/src/components/config/index.tsx +0 -5
  408. package/src/components/config/record-editors/BooleanRecordEditor.scss +0 -1
  409. package/src/components/config/record-editors/BooleanRecordEditor.tsx +0 -75
  410. package/src/components/config/record-editors/ChannelRecordEditor.scss +0 -1
  411. package/src/components/config/record-editors/ChannelRecordEditor.tsx +0 -397
  412. package/src/components/config/record-editors/KeyValueEditor.scss +0 -1
  413. package/src/components/config/record-editors/KeyValueEditor.tsx +0 -97
  414. package/src/components/config/record-editors/McpServersRecordEditor.scss +0 -1
  415. package/src/components/config/record-editors/McpServersRecordEditor.tsx +0 -260
  416. package/src/components/config/record-editors/ModelServicesRecordEditor.scss +0 -1
  417. package/src/components/config/record-editors/ModelServicesRecordEditor.tsx +0 -265
  418. package/src/components/config/record-editors/RecordEditors.scss +0 -335
  419. package/src/components/config/record-editors/RecordJsonEditor.scss +0 -1
  420. package/src/components/config/record-editors/RecordJsonEditor.tsx +0 -140
  421. package/src/components/config/record-editors/SchemaObjectEditor.tsx +0 -183
  422. package/src/components/config/record-editors/SchemaRecordEditor.tsx +0 -184
  423. package/src/components/config/record-editors/index.tsx +0 -7
  424. package/src/components/config/record-editors/schemaRecordUtils.ts +0 -55
  425. package/src/components/config/use-worktree-environment-auto-save.ts +0 -386
  426. package/src/components/config/worktree-environment-panel-model.ts +0 -108
  427. package/src/components/dock-panel/DockPanel.scss +0 -223
  428. package/src/components/dock-panel/DockPanel.tsx +0 -194
  429. package/src/components/dock-panel/DockPanelHeader.tsx +0 -65
  430. package/src/components/dock-panel/use-dock-panel-fullscreen.ts +0 -51
  431. package/src/components/knowledge-base/KnowledgeBaseView.scss +0 -431
  432. package/src/components/knowledge-base/KnowledgeBaseView.tsx +0 -512
  433. package/src/components/knowledge-base/components/@hooks/use-skills-cli-modal-controller.ts +0 -157
  434. package/src/components/knowledge-base/components/@hooks/use-skills-tab-actions.ts +0 -63
  435. package/src/components/knowledge-base/components/ActionButton.scss +0 -35
  436. package/src/components/knowledge-base/components/ActionButton.tsx +0 -19
  437. package/src/components/knowledge-base/components/CreateSkillModal.tsx +0 -59
  438. package/src/components/knowledge-base/components/EmptyState.scss +0 -18
  439. package/src/components/knowledge-base/components/EmptyState.tsx +0 -42
  440. package/src/components/knowledge-base/components/EntitiesTab.scss +0 -5
  441. package/src/components/knowledge-base/components/EntitiesTab.tsx +0 -86
  442. package/src/components/knowledge-base/components/EntityItem.scss +0 -89
  443. package/src/components/knowledge-base/components/EntityItem.tsx +0 -79
  444. package/src/components/knowledge-base/components/EntityList.scss +0 -8
  445. package/src/components/knowledge-base/components/EntityList.tsx +0 -70
  446. package/src/components/knowledge-base/components/FilterBar.scss +0 -33
  447. package/src/components/knowledge-base/components/FilterBar.tsx +0 -55
  448. package/src/components/knowledge-base/components/FlowsTab.scss +0 -5
  449. package/src/components/knowledge-base/components/FlowsTab.tsx +0 -86
  450. package/src/components/knowledge-base/components/KnowledgeBaseHeader.scss +0 -6
  451. package/src/components/knowledge-base/components/KnowledgeBaseHeader.tsx +0 -25
  452. package/src/components/knowledge-base/components/KnowledgeContentControls.tsx +0 -35
  453. package/src/components/knowledge-base/components/KnowledgeList.scss +0 -39
  454. package/src/components/knowledge-base/components/KnowledgeList.tsx +0 -19
  455. package/src/components/knowledge-base/components/KnowledgeMobilePanel.tsx +0 -122
  456. package/src/components/knowledge-base/components/KnowledgeSidebar.tsx +0 -97
  457. package/src/components/knowledge-base/components/LoadingState.scss +0 -10
  458. package/src/components/knowledge-base/components/LoadingState.tsx +0 -11
  459. package/src/components/knowledge-base/components/MetaList.scss +0 -19
  460. package/src/components/knowledge-base/components/MetaList.tsx +0 -18
  461. package/src/components/knowledge-base/components/ProjectSkillsList.tsx +0 -79
  462. package/src/components/knowledge-base/components/RuleItem.scss +0 -86
  463. package/src/components/knowledge-base/components/RuleItem.tsx +0 -81
  464. package/src/components/knowledge-base/components/RuleList.scss +0 -8
  465. package/src/components/knowledge-base/components/RuleList.tsx +0 -70
  466. package/src/components/knowledge-base/components/RulesTab.scss +0 -5
  467. package/src/components/knowledge-base/components/RulesTab.tsx +0 -81
  468. package/src/components/knowledge-base/components/SectionHeader.scss +0 -19
  469. package/src/components/knowledge-base/components/SectionHeader.tsx +0 -19
  470. package/src/components/knowledge-base/components/SkillArchiveInput.tsx +0 -43
  471. package/src/components/knowledge-base/components/SkillHubResultItem.tsx +0 -112
  472. package/src/components/knowledge-base/components/SkillMarketResults.tsx +0 -98
  473. package/src/components/knowledge-base/components/SkillMarketView.tsx +0 -198
  474. package/src/components/knowledge-base/components/SkillMarketView.types.ts +0 -28
  475. package/src/components/knowledge-base/components/SkillRegistryErrors.tsx +0 -21
  476. package/src/components/knowledge-base/components/SkillRegistryModal.tsx +0 -74
  477. package/src/components/knowledge-base/components/SkillsCliModal.tsx +0 -154
  478. package/src/components/knowledge-base/components/SkillsTab.scss +0 -429
  479. package/src/components/knowledge-base/components/SkillsTab.tsx +0 -185
  480. package/src/components/knowledge-base/components/SkillsTabActions.tsx +0 -88
  481. package/src/components/knowledge-base/components/SpecItem.scss +0 -147
  482. package/src/components/knowledge-base/components/SpecItem.tsx +0 -131
  483. package/src/components/knowledge-base/components/SpecList.scss +0 -8
  484. package/src/components/knowledge-base/components/SpecList.tsx +0 -70
  485. package/src/components/knowledge-base/components/TabContent.scss +0 -9
  486. package/src/components/knowledge-base/components/TabContent.tsx +0 -17
  487. package/src/components/knowledge-base/components/TabLabel.scss +0 -10
  488. package/src/components/knowledge-base/components/TabLabel.tsx +0 -15
  489. package/src/components/knowledge-base/components/skill-hub-utils.ts +0 -108
  490. package/src/components/knowledge-base/components/use-skill-market-filters.ts +0 -37
  491. package/src/components/knowledge-base/components/use-skill-market-query-input.ts +0 -44
  492. package/src/components/knowledge-base/components/use-skill-market-search.ts +0 -49
  493. package/src/components/knowledge-base/components/use-skill-registry-modal.ts +0 -68
  494. package/src/components/knowledge-base/index.tsx +0 -1
  495. package/src/components/layout/@hooks/use-mobile-sidebar-modal.ts +0 -190
  496. package/src/components/layout/AppShell.scss +0 -157
  497. package/src/components/layout/AppShell.tsx +0 -168
  498. package/src/components/layout/PageShell.scss +0 -41
  499. package/src/components/layout/PageShell.tsx +0 -32
  500. package/src/components/layout/mobile-sidebar-constants.ts +0 -1
  501. package/src/components/monaco/monaco-runtime.ts +0 -44
  502. package/src/components/monaco/use-monaco-theme.ts +0 -63
  503. package/src/components/nav-rail-account-actions.tsx +0 -104
  504. package/src/components/nav-rail-compact-config.ts +0 -114
  505. package/src/components/nav-rail-items.tsx +0 -181
  506. package/src/components/server-connection/ServerConnectionGate.scss +0 -356
  507. package/src/components/server-connection/ServerConnectionGate.tsx +0 -238
  508. package/src/components/server-connection/ServerConnectionProfileModal.tsx +0 -145
  509. package/src/components/server-connection/ServerConnectionProfiles.tsx +0 -113
  510. package/src/components/server-connection/ServerConnectionUrlInput.tsx +0 -85
  511. package/src/components/sidebar/SessionContextMenu.scss +0 -143
  512. package/src/components/sidebar/SessionContextMenu.tsx +0 -198
  513. package/src/components/sidebar/SessionContextMenuContent.tsx +0 -89
  514. package/src/components/sidebar/SessionItem.scss +0 -417
  515. package/src/components/sidebar/SessionItem.tsx +0 -367
  516. package/src/components/sidebar/SessionList.scss +0 -122
  517. package/src/components/sidebar/SessionList.tsx +0 -187
  518. package/src/components/sidebar/SidebarHeader.scss +0 -372
  519. package/src/components/sidebar/SidebarHeader.tsx +0 -198
  520. package/src/components/sidebar/SidebarHeaderBatchActions.tsx +0 -85
  521. package/src/components/sidebar/SidebarHeaderSearchActions.tsx +0 -175
  522. package/src/components/sidebar/SidebarHeaderSelectField.tsx +0 -24
  523. package/src/components/sidebar/SidebarUtilityFooter.tsx +0 -69
  524. package/src/components/sidebar/filter-utils.ts +0 -23
  525. package/src/components/sidebar/sidebar-search-visibility.ts +0 -18
  526. package/src/components/sidebar-list/SidebarListHeader.scss +0 -246
  527. package/src/components/sidebar-list/SidebarListHeader.tsx +0 -146
  528. package/src/components/workspace/ContextFilePicker.scss +0 -47
  529. package/src/components/workspace/ContextFilePicker.tsx +0 -97
  530. package/src/components/workspace/context-file-types.ts +0 -36
  531. package/src/components/workspace/project-file-tree/ProjectFileTree.scss +0 -298
  532. package/src/components/workspace/project-file-tree/ProjectFileTree.tsx +0 -138
  533. package/src/components/workspace/project-file-tree/ProjectFileTreeRow.tsx +0 -167
  534. package/src/components/workspace/project-file-tree/ProjectFileTreeRowContextMenu.tsx +0 -106
  535. package/src/components/workspace/project-file-tree/ProjectFileTreeRows.tsx +0 -139
  536. package/src/components/workspace/project-file-tree/project-file-tree-helpers.ts +0 -101
  537. package/src/components/workspace/project-file-tree/project-file-tree-icons.ts +0 -93
  538. package/src/components/workspace/project-file-tree/project-file-tree-types.ts +0 -27
  539. package/src/components/workspace/project-file-tree/use-project-file-tree-data.ts +0 -197
  540. package/src/components/workspace/project-file-tree/use-project-file-tree-selection.ts +0 -144
  541. package/src/connectionManager.ts +0 -174
  542. package/src/hooks/chat/chat-session-target.ts +0 -69
  543. package/src/hooks/chat/chat-session-workspace-draft.ts +0 -32
  544. package/src/hooks/chat/interaction-state.ts +0 -125
  545. package/src/hooks/chat/model-selector-data-builders.ts +0 -146
  546. package/src/hooks/chat/model-selector-data-option-utils.ts +0 -62
  547. package/src/hooks/chat/model-selector-data-types.ts +0 -27
  548. package/src/hooks/chat/model-selector-data.ts +0 -109
  549. package/src/hooks/chat/model-selector-recommendations.ts +0 -69
  550. package/src/hooks/chat/model-selector.ts +0 -153
  551. package/src/hooks/chat/optimistic-session-creation.ts +0 -189
  552. package/src/hooks/chat/session-view-cache.ts +0 -83
  553. package/src/hooks/chat/use-chat-adapter-account-selection.tsx +0 -156
  554. package/src/hooks/chat/use-chat-adapter.ts +0 -97
  555. package/src/hooks/chat/use-chat-effort.ts +0 -55
  556. package/src/hooks/chat/use-chat-interaction.ts +0 -31
  557. package/src/hooks/chat/use-chat-model-adapter-selection.tsx +0 -562
  558. package/src/hooks/chat/use-chat-models.tsx +0 -347
  559. package/src/hooks/chat/use-chat-permission-mode.ts +0 -55
  560. package/src/hooks/chat/use-chat-route-bottom-panel.ts +0 -181
  561. package/src/hooks/chat/use-chat-route-deep-link-view.ts +0 -33
  562. package/src/hooks/chat/use-chat-scroll.ts +0 -68
  563. package/src/hooks/chat/use-chat-session-actions.ts +0 -520
  564. package/src/hooks/chat/use-chat-session-messages.ts +0 -607
  565. package/src/hooks/chat/use-chat-session.ts +0 -183
  566. package/src/hooks/chat/use-chat-view.ts +0 -59
  567. package/src/hooks/chat/use-composer-control-shortcuts.ts +0 -69
  568. package/src/hooks/chat/use-terminal-dock-visibility.ts +0 -39
  569. package/src/hooks/chat/workspace-file-panel-state.ts +0 -43
  570. package/src/hooks/session-subscription-cache.ts +0 -25
  571. package/src/hooks/use-app-preferences.ts +0 -51
  572. package/src/hooks/use-chat-layout-query-state.ts +0 -29
  573. package/src/hooks/use-responsive-layout.ts +0 -115
  574. package/src/hooks/use-roving-focus-list.ts +0 -104
  575. package/src/hooks/use-sender-header-query-state.ts +0 -35
  576. package/src/hooks/use-session-subscription.ts +0 -144
  577. package/src/hooks/use-sidebar-navigation.ts +0 -40
  578. package/src/hooks/use-sidebar-query-state.ts +0 -79
  579. package/src/hooks/useGlobalShortcut.ts +0 -26
  580. package/src/hooks/useQueryParams.ts +0 -124
  581. package/src/i18n-resources.ts +0 -44
  582. package/src/i18n.ts +0 -37
  583. package/src/main.tsx +0 -60
  584. package/src/pwa.ts +0 -46
  585. package/src/resources/adapters.ts +0 -46
  586. package/src/resources/locales/en.json +0 -1972
  587. package/src/resources/locales/zh.json +0 -1973
  588. package/src/routes/AppRoutes.tsx +0 -22
  589. package/src/routes/ArchiveRoute.tsx +0 -5
  590. package/src/routes/AutomationRoute.tsx +0 -5
  591. package/src/routes/BenchmarkRoute.tsx +0 -5
  592. package/src/routes/ChatRoute.scss +0 -529
  593. package/src/routes/ChatRoute.tsx +0 -40
  594. package/src/routes/ChatRouteBottomPanel.tsx +0 -47
  595. package/src/routes/ChatRouteView.tsx +0 -199
  596. package/src/routes/ConfigRoute.tsx +0 -5
  597. package/src/routes/KnowledgeRoute.tsx +0 -5
  598. package/src/runtime-config.ts +0 -239
  599. package/src/server-connection-history.ts +0 -179
  600. package/src/store/index.ts +0 -173
  601. package/src/styles/global.scss +0 -113
  602. package/src/styles/material-symbols-rounded.scss +0 -23
  603. package/src/utils/chat-links.ts +0 -21
  604. package/src/utils/copy.ts +0 -18
  605. package/src/utils/mobile-viewport.ts +0 -67
  606. package/src/utils/safe-serialize.ts +0 -84
  607. package/src/utils/shortcutUtils.ts +0 -198
  608. package/src/utils/strip-ansi.ts +0 -26
  609. package/src/version-compatibility.ts +0 -37
  610. package/src/vite-env.d.ts +0 -33
  611. package/src/ws.ts +0 -47
  612. package/vite.config.ts +0 -127
@@ -1,1264 +0,0 @@
1
- import './ConfigSectionForm.scss'
2
-
3
- import { Button, Collapse, Empty, Input, InputNumber, Select, Slider, Switch } from 'antd'
4
- import type { ReactNode } from 'react'
5
- import { Fragment, useMemo } from 'react'
6
- import useSWR from 'swr'
7
-
8
- import type { ConfigUiObjectSchema, ConfigUiSection } from '@vibe-forge/types'
9
-
10
- import { getAdapterAccounts } from '#~/api'
11
- import { normalizeSendShortcut, resolveSendShortcut } from '#~/utils/shortcutUtils'
12
-
13
- import { AdapterAccountsManager, mergeAccounts } from './AdapterAccountsManager'
14
- import { DisplayValue } from './ConfigDisplayValue'
15
- import { ComplexTextEditor, StringArrayEditor } from './ConfigEditors'
16
- import { FieldRow } from './ConfigFieldRow'
17
- import { ShortcutInput } from './ConfigShortcutInput'
18
- import { DetailCollectionField } from './DetailListField'
19
- import { McpServerItemEditor } from './McpServerItemEditor'
20
- import { RecommendedModelsItemEditor } from './RecommendedModelsItemEditor'
21
- import type { ConfigDetailRoute } from './configDetail'
22
- import { resolveConfigDetailRouteMeta } from './configDetail'
23
- import type { FieldSpec } from './configSchema'
24
- import { configGroupMeta, configGroupOrder, configSchema } from './configSchema'
25
- import {
26
- getFieldDescription,
27
- getFieldLabel,
28
- getTypeIcon,
29
- getValueByPath,
30
- getValueType,
31
- setValueByPath
32
- } from './configUtils'
33
- import type { TranslationFn } from './configUtils'
34
- import {
35
- BooleanRecordEditor,
36
- KeyValueEditor,
37
- McpServersRecordEditor,
38
- ModelServicesRecordEditor,
39
- RecordJsonEditor,
40
- SchemaObjectEditor,
41
- SchemaRecordEditor
42
- } from './record-editors/index'
43
- import { resolveConfigUiRecordEntry } from './record-editors/schemaRecordUtils'
44
-
45
- const directRecordSections = new Set(['models'])
46
- const directDetailSections = new Set(['modelServices', 'channels', 'adapters'])
47
- const defaultGroupOrder = ['base', 'permissions', 'env', 'items', 'default']
48
- const isRecord = (value: unknown): value is Record<string, unknown> => (
49
- value != null && typeof value === 'object' && !Array.isArray(value)
50
- )
51
- const isTopLevelField = (path: string[], key: string) => path.length === 1 && path[0] === key
52
- const configSelectSuffixIcon = (
53
- <span className='material-symbols-rounded config-view__select-chevron'>expand_more</span>
54
- )
55
-
56
- export const SectionForm = ({
57
- sectionKey,
58
- fields: providedFields,
59
- uiSection,
60
- value,
61
- resolvedValue,
62
- onChange,
63
- mergedModelServices,
64
- mergedAdapters,
65
- selectedModelService,
66
- worktreeEnvironmentOptions,
67
- detailRoute = null,
68
- onOpenDetailRoute,
69
- t
70
- }: {
71
- sectionKey: string
72
- fields?: FieldSpec[]
73
- uiSection?: ConfigUiSection
74
- value: unknown
75
- resolvedValue?: unknown
76
- onChange: (nextValue: unknown) => void
77
- mergedModelServices: Record<string, unknown>
78
- mergedAdapters: Record<string, unknown>
79
- selectedModelService?: string
80
- worktreeEnvironmentOptions?: Array<{ value: string; label: ReactNode }>
81
- detailRoute?: ConfigDetailRoute | null
82
- onOpenDetailRoute?: (route: ConfigDetailRoute) => void
83
- t: TranslationFn
84
- }) => {
85
- const fields = providedFields ?? configSchema[sectionKey] ?? []
86
- const detailContext = {
87
- mergedModelServices,
88
- mergedAdapters,
89
- t
90
- }
91
- const resolveSchemaFieldLabel = (schemaSectionKey: string) => (field: { path: string[] }, fallback: string) => (
92
- getFieldLabel(t, schemaSectionKey, field.path, fallback)
93
- )
94
- const resolveSchemaFieldDescription = (schemaSectionKey: string) => (field: { path: string[] }, fallback: string) => {
95
- const translated = getFieldDescription(t, schemaSectionKey, field.path)
96
- return translated !== '' ? translated : fallback
97
- }
98
- const renderAdapterSection = ({
99
- body,
100
- title,
101
- collapsible = false,
102
- defaultExpanded = true,
103
- collapseKey = 'section'
104
- }: {
105
- body: ReactNode
106
- title?: string
107
- collapsible?: boolean
108
- defaultExpanded?: boolean
109
- collapseKey?: string
110
- }) => {
111
- if (collapsible) {
112
- return (
113
- <Collapse
114
- className='config-view__subsection-collapse'
115
- ghost
116
- expandIconPosition='end'
117
- expandIcon={({ isActive }) => (
118
- <span
119
- className={`material-symbols-rounded config-view__subsection-expand-icon${isActive ? ' is-active' : ''}`}
120
- >
121
- chevron_right
122
- </span>
123
- )}
124
- defaultActiveKey={defaultExpanded ? [collapseKey] : []}
125
- items={[
126
- {
127
- key: collapseKey,
128
- label: <div className='config-view__subsection-title'>{title}</div>,
129
- children: body
130
- }
131
- ]}
132
- />
133
- )
134
- }
135
-
136
- return (
137
- <div className='config-view__subsection'>
138
- {title != null && title !== '' && (
139
- <div className='config-view__subsection-title'>{title}</div>
140
- )}
141
- {body}
142
- </div>
143
- )
144
- }
145
- const renderAdapterSchemaSection = ({
146
- schema,
147
- currentValue,
148
- onCurrentValueChange,
149
- visibleFieldPaths,
150
- title,
151
- collapsible = false,
152
- defaultExpanded = true,
153
- collapseKey,
154
- resolveFieldOptions
155
- }: {
156
- schema: ConfigUiObjectSchema
157
- currentValue: Record<string, unknown>
158
- onCurrentValueChange: (nextValue: Record<string, unknown>) => void
159
- visibleFieldPaths: string[][]
160
- title?: string
161
- collapsible?: boolean
162
- defaultExpanded?: boolean
163
- collapseKey?: string
164
- resolveFieldOptions?: Parameters<typeof SchemaObjectEditor>[0]['resolveFieldOptions']
165
- }) => {
166
- if (visibleFieldPaths.length === 0) return null
167
-
168
- return renderAdapterSection({
169
- title,
170
- collapsible,
171
- defaultExpanded,
172
- collapseKey,
173
- body: (
174
- <div className='config-view__subsection-body'>
175
- <SchemaObjectEditor
176
- value={currentValue}
177
- schema={schema}
178
- onChange={onCurrentValueChange}
179
- t={t}
180
- visibleFieldPaths={visibleFieldPaths}
181
- resolveFieldLabel={resolveSchemaFieldLabel('adapters')}
182
- resolveFieldDescription={resolveSchemaFieldDescription('adapters')}
183
- resolveFieldOptions={resolveFieldOptions}
184
- />
185
- </div>
186
- )
187
- })
188
- }
189
- const renderAdapterAdvancedSections = ({
190
- schema,
191
- currentValue,
192
- onCurrentValueChange,
193
- modelSection,
194
- advancedSections
195
- }: {
196
- schema: ConfigUiObjectSchema
197
- currentValue: Record<string, unknown>
198
- onCurrentValueChange: (nextValue: Record<string, unknown>) => void
199
- modelSection?: {
200
- title: string
201
- visibleFieldPaths: string[][]
202
- }
203
- advancedSections: Array<{
204
- key: string
205
- title: string
206
- visibleFieldPaths: string[][]
207
- }>
208
- }) => {
209
- const visibleAdvancedSections = advancedSections.filter(section => section.visibleFieldPaths.length > 0)
210
- const hasModelSection = modelSection != null && modelSection.visibleFieldPaths.length > 0
211
- if (!hasModelSection && visibleAdvancedSections.length === 0) return null
212
- const shouldExpandAdvancedByDefault = !hasModelSection && visibleAdvancedSections.length > 0
213
-
214
- return (
215
- <div className='config-view__field-stack'>
216
- {hasModelSection && renderAdapterSchemaSection({
217
- schema,
218
- currentValue,
219
- onCurrentValueChange,
220
- visibleFieldPaths: modelSection.visibleFieldPaths,
221
- title: modelSection.title,
222
- collapsible: true,
223
- defaultExpanded: true,
224
- collapseKey: 'models'
225
- })}
226
- {visibleAdvancedSections.length > 0 && renderAdapterSection({
227
- title: t('config.sectionGroups.advanced'),
228
- collapsible: true,
229
- defaultExpanded: shouldExpandAdvancedByDefault,
230
- collapseKey: 'advanced',
231
- body: (
232
- <div className='config-view__subsection-body'>
233
- <div className='config-view__field-stack'>
234
- {visibleAdvancedSections.map(section => (
235
- <Fragment key={section.key}>
236
- {renderAdapterSchemaSection({
237
- schema,
238
- currentValue,
239
- onCurrentValueChange,
240
- visibleFieldPaths: section.visibleFieldPaths,
241
- title: section.title
242
- })}
243
- </Fragment>
244
- ))}
245
- </div>
246
- </div>
247
- )
248
- })}
249
- </div>
250
- )
251
- }
252
-
253
- if (uiSection?.kind === 'recordMap' && fields.length === 0) {
254
- const recordValue = (value != null && typeof value === 'object')
255
- ? value as Record<string, unknown>
256
- : {}
257
- if (uiSection.recordMap.mode === 'discriminated' && (uiSection.recordMap.entryKinds?.length ?? 0) === 0) {
258
- return (
259
- <RecordJsonEditor
260
- value={recordValue}
261
- onChange={onChange}
262
- t={t}
263
- keyPlaceholder={t('config.editor.fieldKey')}
264
- />
265
- )
266
- }
267
- return (
268
- <SchemaRecordEditor
269
- value={recordValue}
270
- schema={uiSection.recordMap}
271
- onChange={onChange}
272
- t={t}
273
- keyPlaceholder={uiSection.recordMap.keyPlaceholder ?? t('config.editor.fieldKey')}
274
- />
275
- )
276
- }
277
-
278
- if (fields.length === 0) {
279
- return <Empty description={t('common.noData')} image={null} />
280
- }
281
-
282
- const modelServiceEntries = Object.entries(mergedModelServices)
283
- const modelServiceOptions: Array<{ value: string; label: ReactNode }> = modelServiceEntries.map(([key, entry]) => {
284
- const record = (entry != null && typeof entry === 'object') ? entry as Record<string, unknown> : {}
285
- const title = typeof record.title === 'string' && record.title.trim() !== '' ? record.title : key
286
- const description = typeof record.description === 'string' ? record.description : ''
287
- return {
288
- value: key,
289
- label: (
290
- <div className='config-view__option'>
291
- <div className='config-view__option-title'>{title}</div>
292
- {description !== '' && (
293
- <div className='config-view__option-desc'>{description}</div>
294
- )}
295
- </div>
296
- )
297
- }
298
- })
299
- const selectedServiceRecord = selectedModelService
300
- ? mergedModelServices[selectedModelService]
301
- : undefined
302
- const selectedServiceModels = (selectedServiceRecord != null && typeof selectedServiceRecord === 'object')
303
- ? (selectedServiceRecord as Record<string, unknown>).models
304
- : undefined
305
- const modelOptions: Array<{ value: string; label: ReactNode }> = Array.isArray(selectedServiceModels)
306
- ? selectedServiceModels.filter(item => typeof item === 'string').map(item => ({
307
- value: item,
308
- label: <span>{item}</span>
309
- }))
310
- : []
311
- const adapterOptions: Array<{ value: string; label: ReactNode }> = Object.keys(mergedAdapters).map(key => ({
312
- value: key,
313
- label: <span>{key}</span>
314
- }))
315
-
316
- const renderInheritedReadonlyControl = ({
317
- fieldValue,
318
- fieldPath,
319
- onOverride
320
- }: {
321
- fieldValue: unknown
322
- fieldPath: string[]
323
- onOverride?: () => void
324
- }) => (
325
- <div className='config-view__field-readonly'>
326
- <div className='config-view__field-readonly-value'>
327
- <DisplayValue value={fieldValue} sectionKey={sectionKey} path={fieldPath} t={t} />
328
- </div>
329
- {onOverride != null && (
330
- <Button size='small' onClick={onOverride}>
331
- {t('config.detail.override')}
332
- </Button>
333
- )}
334
- </div>
335
- )
336
-
337
- const renderField = ({
338
- field,
339
- currentValue,
340
- currentResolvedValue,
341
- onCurrentValueChange,
342
- keyPrefix,
343
- readOnly = false
344
- }: {
345
- field: FieldSpec
346
- currentValue: unknown
347
- currentResolvedValue?: unknown
348
- onCurrentValueChange: (nextValue: unknown) => void
349
- keyPrefix: string
350
- readOnly?: boolean
351
- }) => {
352
- const fieldValue = getValueByPath(currentValue, field.path)
353
- const resolvedFieldValue = getValueByPath(currentResolvedValue, field.path)
354
- const hasLocalValue = fieldValue !== undefined
355
- const hasResolvedValue = resolvedFieldValue !== undefined
356
- const inheritedOnly = !hasLocalValue && hasResolvedValue
357
- const canInlineOverride = field.type === 'string' ||
358
- field.type === 'multiline' ||
359
- field.type === 'number' ||
360
- field.type === 'boolean' ||
361
- field.type === 'select' ||
362
- field.type === 'shortcut'
363
- const valueToUse = hasLocalValue
364
- ? fieldValue
365
- : hasResolvedValue && canInlineOverride
366
- ? resolvedFieldValue
367
- : field.defaultValue
368
- const label = field.labelKey
369
- ? t(field.labelKey)
370
- : getFieldLabel(t, sectionKey, field.path, field.path[field.path.length - 1] ?? '')
371
- const description = field.descriptionKey
372
- ? t(field.descriptionKey)
373
- : getFieldDescription(t, sectionKey, field.path)
374
- const icon = field.icon ?? getTypeIcon(getValueType(valueToUse))
375
- const handleValueChange = (nextValue: unknown) => {
376
- onCurrentValueChange(setValueByPath(currentValue, field.path, nextValue))
377
- }
378
-
379
- let control: ReactNode = null
380
- const isStacked = ['multiline', 'json', 'record', 'string[]', 'detailCollection'].includes(field.type)
381
- const overrideCurrentField = () => {
382
- if (!hasResolvedValue) return
383
- handleValueChange(resolvedFieldValue)
384
- }
385
-
386
- if (readOnly) {
387
- control = (
388
- <DisplayValue
389
- value={hasResolvedValue ? resolvedFieldValue : fieldValue ?? field.defaultValue}
390
- sectionKey={sectionKey}
391
- path={field.path}
392
- t={t}
393
- />
394
- )
395
- } else if (field.type === 'detailCollection') {
396
- control = (
397
- <DetailCollectionField
398
- sectionKey={sectionKey}
399
- field={field}
400
- value={fieldValue}
401
- resolvedValue={resolvedFieldValue}
402
- onChange={(next) => handleValueChange(next)}
403
- onOpenDetail={(route) => onOpenDetailRoute?.(route)}
404
- mergedModelServices={mergedModelServices}
405
- mergedAdapters={mergedAdapters}
406
- uiSection={uiSection}
407
- t={t}
408
- />
409
- )
410
- } else if (inheritedOnly && !canInlineOverride) {
411
- control = renderInheritedReadonlyControl({
412
- fieldValue: resolvedFieldValue,
413
- fieldPath: field.path,
414
- onOverride: overrideCurrentField
415
- })
416
- } else if (field.type === 'string') {
417
- const placeholder = field.placeholderKey ? t(field.placeholderKey) : undefined
418
- if (field.sensitive === true) {
419
- control = (
420
- <Input.Password
421
- value={typeof valueToUse === 'string' ? valueToUse : ''}
422
- onChange={(event) => handleValueChange(event.target.value)}
423
- placeholder={t('config.editor.secretPlaceholder')}
424
- />
425
- )
426
- } else {
427
- control = (
428
- <Input
429
- value={typeof valueToUse === 'string' ? valueToUse : ''}
430
- onChange={(event) => handleValueChange(event.target.value)}
431
- placeholder={placeholder}
432
- />
433
- )
434
- }
435
- } else if (field.type === 'multiline') {
436
- const currentText = typeof valueToUse === 'string' ? valueToUse : ''
437
- const placeholder = field.placeholderKey ? t(field.placeholderKey) : t('config.editor.multilinePlaceholder')
438
- control = (
439
- <div className='config-view__multiline'>
440
- <Input.TextArea
441
- className='config-view__multiline-input'
442
- value={currentText}
443
- onChange={(event) => handleValueChange(event.target.value)}
444
- autoSize={{ minRows: 3 }}
445
- placeholder={placeholder}
446
- />
447
- </div>
448
- )
449
- } else if (field.type === 'number') {
450
- const isNotificationVolume = field.path.join('.') === 'notifications.volume'
451
- if (isNotificationVolume) {
452
- const sliderValue = typeof valueToUse === 'number' ? valueToUse : 0
453
- control = (
454
- <Slider
455
- className='config-view__slider'
456
- min={0}
457
- max={100}
458
- step={1}
459
- value={sliderValue}
460
- onChange={(next) => handleValueChange(typeof next === 'number' ? next : 0)}
461
- />
462
- )
463
- } else {
464
- control = (
465
- <InputNumber
466
- value={typeof valueToUse === 'number' ? valueToUse : 0}
467
- onChange={(next) => handleValueChange(typeof next === 'number' ? next : 0)}
468
- />
469
- )
470
- }
471
- } else if (field.type === 'boolean') {
472
- control = (
473
- <Switch
474
- checked={Boolean(valueToUse)}
475
- onChange={(next) => handleValueChange(next)}
476
- />
477
- )
478
- } else if (field.type === 'string[]') {
479
- const current = Array.isArray(valueToUse) ? valueToUse.filter(item => typeof item === 'string') : []
480
- control = (
481
- <StringArrayEditor
482
- value={current}
483
- onChange={(next) => handleValueChange(next)}
484
- t={t}
485
- />
486
- )
487
- } else if (field.type === 'select') {
488
- const isDefaultAdapter = sectionKey === 'general' && field.path.join('.') === 'defaultAdapter'
489
- const isDefaultModelService = sectionKey === 'general' && field.path.join('.') === 'defaultModelService'
490
- const isDefaultModel = sectionKey === 'general' && field.path.join('.') === 'defaultModel'
491
- const isWorktreeEnvironment = sectionKey === 'conversation' && field.path.join('.') === 'worktreeEnvironment'
492
- const options: Array<{ value: string; label: ReactNode }> = isDefaultModelService
493
- ? modelServiceOptions
494
- : isDefaultModel
495
- ? modelOptions
496
- : isDefaultAdapter
497
- ? adapterOptions
498
- : isWorktreeEnvironment
499
- ? worktreeEnvironmentOptions ?? []
500
- : (field.options ?? []).map(option => ({
501
- value: option.value,
502
- label: <span>{t(option.label)}</span>
503
- }))
504
- control = (
505
- <Select
506
- value={typeof valueToUse === 'string' && valueToUse !== '' ? valueToUse : undefined}
507
- options={options}
508
- onChange={(next) => handleValueChange(next)}
509
- allowClear
510
- suffixIcon={configSelectSuffixIcon}
511
- disabled={isDefaultModel && modelOptions.length === 0}
512
- placeholder={t(
513
- isDefaultAdapter
514
- ? 'config.editor.defaultAdapterPlaceholder'
515
- : isDefaultModelService
516
- ? 'config.editor.defaultModelServicePlaceholder'
517
- : isWorktreeEnvironment
518
- ? 'config.editor.worktreeEnvironmentPlaceholder'
519
- : 'config.editor.defaultModelPlaceholder'
520
- )}
521
- />
522
- )
523
- } else if (field.type === 'json') {
524
- control = (
525
- <ComplexTextEditor
526
- value={valueToUse}
527
- onChange={handleValueChange}
528
- />
529
- )
530
- } else if (field.type === 'record') {
531
- const recordValue = (valueToUse != null && typeof valueToUse === 'object')
532
- ? valueToUse as Record<string, unknown>
533
- : {}
534
- if (field.recordKind === 'modelServices') {
535
- control = (
536
- <ModelServicesRecordEditor
537
- value={recordValue}
538
- onChange={handleValueChange}
539
- t={t}
540
- keyPlaceholder={getRecordKeyPlaceholder(sectionKey, field, t)}
541
- />
542
- )
543
- } else if (field.recordKind === 'channels') {
544
- control = (
545
- <RecordJsonEditor
546
- value={recordValue}
547
- onChange={handleValueChange}
548
- t={t}
549
- keyPlaceholder={getRecordKeyPlaceholder(sectionKey, field, t)}
550
- />
551
- )
552
- } else if (field.recordKind === 'mcpServers') {
553
- control = (
554
- <McpServersRecordEditor
555
- value={recordValue}
556
- onChange={handleValueChange}
557
- t={t}
558
- keyPlaceholder={getRecordKeyPlaceholder(sectionKey, field, t)}
559
- />
560
- )
561
- } else if (field.recordKind === 'keyValue') {
562
- control = (
563
- <KeyValueEditor
564
- value={recordValue as Record<string, string>}
565
- onChange={handleValueChange}
566
- t={t}
567
- keyPlaceholder={getRecordKeyPlaceholder(sectionKey, field, t)}
568
- />
569
- )
570
- } else if (field.recordKind === 'boolean') {
571
- control = (
572
- <BooleanRecordEditor
573
- value={recordValue as Record<string, boolean>}
574
- onChange={handleValueChange}
575
- t={t}
576
- keyPlaceholder={getRecordKeyPlaceholder(sectionKey, field, t)}
577
- />
578
- )
579
- } else {
580
- control = (
581
- <RecordJsonEditor
582
- value={recordValue}
583
- onChange={handleValueChange}
584
- t={t}
585
- keyPlaceholder={getRecordKeyPlaceholder(sectionKey, field, t)}
586
- />
587
- )
588
- }
589
- } else if (field.type === 'shortcut') {
590
- const isMac = navigator.platform.includes('Mac')
591
- const rawValue = typeof valueToUse === 'string' ? valueToUse : ''
592
- const isSendMessageShortcut = field.shortcutKind === 'sendMessage'
593
- control = (
594
- <ShortcutInput
595
- value={rawValue}
596
- displayValue={isSendMessageShortcut ? resolveSendShortcut(rawValue, isMac) : undefined}
597
- onChange={(next) => handleValueChange(next)}
598
- placeholder={t('config.editor.shortcutPlaceholder')}
599
- normalizeShortcut={isSendMessageShortcut
600
- ? (next) => normalizeSendShortcut(next, isMac)
601
- : undefined}
602
- isMac={isMac}
603
- t={t}
604
- />
605
- )
606
- }
607
-
608
- if (directRecordSections.has(sectionKey) && field.type === 'record') {
609
- return (
610
- <div key={`${keyPrefix}:${field.path.join('.')}:${field.type}:${field.recordKind ?? ''}`}>
611
- {control}
612
- </div>
613
- )
614
- }
615
-
616
- if (directDetailSections.has(sectionKey) && field.type === 'detailCollection' && field.path.length === 0) {
617
- return (
618
- <div key={`${keyPrefix}:${field.path.join('.')}:${field.type}`}>
619
- {control}
620
- </div>
621
- )
622
- }
623
-
624
- return (
625
- <FieldRow
626
- key={`${keyPrefix}:${field.path.join('.')}:${field.type}:${field.labelKey ?? ''}:${field.recordKind ?? ''}`}
627
- title={label}
628
- description={description}
629
- icon={icon}
630
- layout={isStacked ? 'stacked' : 'inline'}
631
- >
632
- {control}
633
- </FieldRow>
634
- )
635
- }
636
-
637
- const renderFieldGroups = ({
638
- currentFields,
639
- currentValue,
640
- currentResolvedValue,
641
- onCurrentValueChange,
642
- keyPrefix,
643
- readOnly = false
644
- }: {
645
- currentFields: FieldSpec[]
646
- currentValue: unknown
647
- currentResolvedValue?: unknown
648
- onCurrentValueChange: (nextValue: unknown) => void
649
- keyPrefix: string
650
- readOnly?: boolean
651
- }) => {
652
- const groupedFields = currentFields.reduce<Record<string, FieldSpec[]>>((acc, field) => {
653
- const key = field.group ?? 'default'
654
- if (!acc[key]) acc[key] = []
655
- acc[key].push(field)
656
- return acc
657
- }, {})
658
- const orderedGroups = (configGroupOrder[sectionKey] ?? defaultGroupOrder).filter(key => groupedFields[key]?.length)
659
-
660
- return (
661
- <div className='config-view__field-stack'>
662
- {orderedGroups.map((groupKey) => {
663
- const groupFields = groupedFields[groupKey] ?? []
664
- if (groupKey === 'default') {
665
- if (directRecordSections.has(sectionKey)) {
666
- return (
667
- <div key={`${keyPrefix}:${groupKey}`}>
668
- {groupFields.map(field =>
669
- renderField({
670
- field,
671
- currentValue,
672
- currentResolvedValue,
673
- onCurrentValueChange,
674
- keyPrefix,
675
- readOnly
676
- })
677
- )}
678
- </div>
679
- )
680
- }
681
- return (
682
- <div key={`${keyPrefix}:${groupKey}`} className='config-view__field-list'>
683
- {groupFields.map(field =>
684
- renderField({
685
- field,
686
- currentValue,
687
- currentResolvedValue,
688
- onCurrentValueChange,
689
- keyPrefix,
690
- readOnly
691
- })
692
- )}
693
- </div>
694
- )
695
- }
696
-
697
- const groupMeta = configGroupMeta[sectionKey]?.[groupKey]
698
- const groupLabel = (() => {
699
- const labelKey = groupMeta?.labelKey
700
- if (labelKey) return t(labelKey)
701
- return groupKey === 'base'
702
- ? t('config.sectionGroups.base')
703
- : groupKey === 'models'
704
- ? t('config.sectionGroups.models')
705
- : groupKey === 'advanced'
706
- ? t('config.sectionGroups.advanced')
707
- : groupKey === 'permissions'
708
- ? t('config.sectionGroups.permissions')
709
- : groupKey === 'env'
710
- ? t('config.sectionGroups.env')
711
- : sectionKey === 'plugins'
712
- ? t('config.sectionGroups.plugins')
713
- : t('config.sectionGroups.items')
714
- })()
715
-
716
- const visibleFields = groupFields.filter(field => field.hidden !== true)
717
- const collapseFields = visibleFields.filter(field => field.collapse != null)
718
- const nonCollapseFields = visibleFields.filter(field => field.collapse == null)
719
- const collapseGroups = collapseFields.reduce<
720
- Map<string, { meta: NonNullable<FieldSpec['collapse']>; fields: FieldSpec[] }>
721
- >((acc, field) => {
722
- const meta = field.collapse
723
- if (!meta) return acc
724
- const existing = acc.get(meta.key)
725
- if (existing) {
726
- existing.fields.push(field)
727
- } else {
728
- acc.set(meta.key, { meta, fields: [field] })
729
- }
730
- return acc
731
- }, new Map())
732
- const collapseItems = Array.from(collapseGroups.values()).map(group => ({
733
- key: group.meta.key,
734
- collapsible: 'header' as const,
735
- label: (
736
- <div className='config-view__collapse-header'>
737
- <div className='config-view__collapse-header-main'>
738
- <div className='config-view__collapse-title'>
739
- {t(group.meta.labelKey)}
740
- </div>
741
- {group.meta.descKey && (
742
- <div className='config-view__collapse-desc'>
743
- {t(group.meta.descKey)}
744
- </div>
745
- )}
746
- </div>
747
- {group.meta.togglePath && (
748
- <Switch
749
- checked={!getValueByPath(currentValue, group.meta.togglePath)}
750
- onChange={(next) => {
751
- onCurrentValueChange(setValueByPath(currentValue, group.meta.togglePath!, !next))
752
- }}
753
- disabled={readOnly}
754
- onClick={(_, event) => {
755
- event.stopPropagation()
756
- }}
757
- />
758
- )}
759
- </div>
760
- ),
761
- children: (
762
- <div className='config-view__field-list'>
763
- {group.fields.map(field =>
764
- renderField({
765
- field,
766
- currentValue,
767
- currentResolvedValue,
768
- onCurrentValueChange,
769
- keyPrefix,
770
- readOnly
771
- })
772
- )}
773
- </div>
774
- )
775
- }))
776
-
777
- const groupBody = (
778
- <div className='config-view__subsection-body'>
779
- {nonCollapseFields.map(field =>
780
- renderField({
781
- field,
782
- currentValue,
783
- currentResolvedValue,
784
- onCurrentValueChange,
785
- keyPrefix,
786
- readOnly
787
- })
788
- )}
789
- {collapseItems.length > 0 && (
790
- <Collapse
791
- className='config-view__collapse-group config-view__field-row'
792
- ghost
793
- items={collapseItems}
794
- />
795
- )}
796
- </div>
797
- )
798
-
799
- if (groupMeta?.collapsible === true) {
800
- return (
801
- <Collapse
802
- key={`${keyPrefix}:${groupKey}`}
803
- className='config-view__subsection-collapse'
804
- ghost
805
- expandIconPosition='end'
806
- expandIcon={({ isActive }) => (
807
- <span
808
- className={`material-symbols-rounded config-view__subsection-expand-icon${
809
- isActive ? ' is-active' : ''
810
- }`}
811
- >
812
- chevron_right
813
- </span>
814
- )}
815
- defaultActiveKey={groupMeta.defaultExpanded === false ? [] : [groupKey]}
816
- items={[
817
- {
818
- key: groupKey,
819
- label: <div className='config-view__subsection-title'>{groupLabel}</div>,
820
- children: groupBody
821
- }
822
- ]}
823
- />
824
- )
825
- }
826
-
827
- return (
828
- <div key={`${keyPrefix}:${groupKey}`} className='config-view__subsection'>
829
- <div className='config-view__subsection-title'>
830
- {groupLabel}
831
- </div>
832
- {groupBody}
833
- </div>
834
- )
835
- })}
836
- </div>
837
- )
838
- }
839
-
840
- const detailMeta = resolveConfigDetailRouteMeta({
841
- sectionKey,
842
- fields,
843
- value,
844
- resolvedValue,
845
- route: detailRoute,
846
- detailContext,
847
- t
848
- })
849
- const adapterDetailKey = (
850
- sectionKey === 'adapters' &&
851
- uiSection?.kind === 'recordMap' &&
852
- detailMeta?.field.path.length === 0
853
- )
854
- ? detailMeta.itemKey
855
- : null
856
- const { data: adapterAccountsData } = useSWR(
857
- adapterDetailKey != null ? `/api/adapters/${adapterDetailKey}/accounts` : null,
858
- () => getAdapterAccounts(adapterDetailKey!)
859
- )
860
- const adapterDefaultAccountOptions = useMemo(() => {
861
- if (adapterDetailKey == null || !isRecord(detailMeta?.item)) return undefined
862
-
863
- const configuredDefaultAccount =
864
- typeof detailMeta.item.defaultAccount === 'string' && detailMeta.item.defaultAccount.trim() !== ''
865
- ? detailMeta.item.defaultAccount.trim()
866
- : undefined
867
- const configuredAccountsValue = getValueByPath(detailMeta.item, ['accounts'])
868
- const configuredAccounts = isRecord(configuredAccountsValue) ? { ...configuredAccountsValue } : {}
869
-
870
- if (configuredDefaultAccount != null && configuredAccounts[configuredDefaultAccount] == null) {
871
- configuredAccounts[configuredDefaultAccount] = { title: configuredDefaultAccount }
872
- }
873
-
874
- return mergeAccounts(configuredAccounts, adapterAccountsData?.accounts ?? [], configuredDefaultAccount)
875
- .map((account) => ({
876
- value: account.key,
877
- label: account.title === account.key ? account.key : `${account.title} (${account.key})`
878
- }))
879
- }, [adapterAccountsData?.accounts, adapterDetailKey, detailMeta?.item])
880
-
881
- if (detailMeta != null) {
882
- const detailCollection = detailMeta.field.detailCollection
883
- const canOverrideInheritedDetailItem = detailCollection != null &&
884
- (
885
- detailCollection.collectionKind !== 'list' ||
886
- detailCollection.getMergeKey != null
887
- )
888
- const writeDetailItem = (nextItem: unknown) => {
889
- if (detailMeta.field.type !== 'detailCollection' || detailMeta.field.detailCollection == null) return
890
- const resolvedNextItem = (
891
- nextItem != null &&
892
- typeof nextItem === 'object' &&
893
- !Array.isArray(nextItem)
894
- )
895
- ? nextItem as Record<string, unknown>
896
- : {}
897
-
898
- if (detailMeta.field.detailCollection.collectionKind === 'list') {
899
- const currentListValue = getValueByPath(value, detailMeta.field.path)
900
- const currentItems = Array.isArray(currentListValue)
901
- ? currentListValue.filter((item): item is Record<string, unknown> => (
902
- item != null &&
903
- typeof item === 'object' &&
904
- !Array.isArray(item)
905
- ))
906
- : []
907
- const nextItems = [...currentItems]
908
- if (detailMeta.localItemIndex == null) {
909
- nextItems.push(resolvedNextItem)
910
- } else {
911
- nextItems[detailMeta.localItemIndex] = resolvedNextItem
912
- }
913
- onChange(setValueByPath(value, detailMeta.field.path, nextItems))
914
- return
915
- }
916
-
917
- onChange(setValueByPath(value, [...detailMeta.field.path, detailMeta.itemKey], resolvedNextItem))
918
- }
919
- const overrideDetailItem = () => {
920
- if (!canOverrideInheritedDetailItem) return
921
- writeDetailItem(detailMeta.resolvedItem)
922
- }
923
- const detailNotice = detailMeta.itemSource === 'inherited'
924
- ? (
925
- <div className='config-view__detail-notice'>
926
- <div className='config-view__detail-notice-text'>
927
- {canOverrideInheritedDetailItem
928
- ? t('config.detail.inheritedReadonly')
929
- : t('config.detail.inheritedAppendOnly')}
930
- </div>
931
- {canOverrideInheritedDetailItem && (
932
- <Button size='small' type='primary' onClick={overrideDetailItem}>
933
- {t('config.detail.override')}
934
- </Button>
935
- )}
936
- </div>
937
- )
938
- : detailMeta.hasResolvedOverlay
939
- ? (
940
- <div className='config-view__detail-notice'>
941
- <div className='config-view__detail-notice-text'>
942
- {t('config.detail.partialOverride')}
943
- </div>
944
- </div>
945
- )
946
- : null
947
-
948
- if (detailMeta.itemSource === 'inherited') {
949
- if ((detailMeta.field.detailCollection?.itemFields?.length ?? 0) > 0) {
950
- return (
951
- <div className='config-view__detail-panel'>
952
- {detailNotice}
953
- {renderFieldGroups({
954
- currentFields: detailMeta.field.detailCollection!.itemFields!,
955
- currentValue: undefined,
956
- currentResolvedValue: detailMeta.resolvedItem,
957
- onCurrentValueChange: () => undefined,
958
- keyPrefix: `detail:${detailMeta.field.path.join('.')}:${detailMeta.itemKey}`,
959
- readOnly: true
960
- })}
961
- </div>
962
- )
963
- }
964
-
965
- return (
966
- <div className='config-view__detail-panel'>
967
- {detailNotice}
968
- <DisplayValue value={detailMeta.resolvedItem} sectionKey={sectionKey} path={detailMeta.field.path} t={t} />
969
- </div>
970
- )
971
- }
972
-
973
- if (detailMeta.field.detailCollection?.detailKind === 'recommendedModels') {
974
- return (
975
- <div className='config-view__detail-panel'>
976
- {detailNotice}
977
- <RecommendedModelsItemEditor
978
- value={detailMeta.item}
979
- onChange={writeDetailItem}
980
- mergedModelServices={mergedModelServices}
981
- t={t}
982
- />
983
- </div>
984
- )
985
- }
986
-
987
- if (detailMeta.field.detailCollection?.detailKind === 'mcpServer') {
988
- return (
989
- <div className='config-view__detail-panel'>
990
- {detailNotice}
991
- <McpServerItemEditor
992
- value={detailMeta.item}
993
- onChange={writeDetailItem}
994
- t={t}
995
- />
996
- </div>
997
- )
998
- }
999
-
1000
- if (uiSection?.kind === 'recordMap' && detailMeta.field.path.length === 0) {
1001
- const { itemSchema, isKnownEntry } = resolveConfigUiRecordEntry({
1002
- schema: uiSection.recordMap,
1003
- entryKey: detailMeta.itemKey,
1004
- entryValue: detailMeta.item
1005
- })
1006
- const shouldRenderJsonFallback = !isKnownEntry && uiSection.recordMap.unknownEditor === 'json'
1007
- const discriminatorField = uiSection.recordMap.discriminatorField ?? 'type'
1008
-
1009
- if (shouldRenderJsonFallback) {
1010
- return (
1011
- <div className='config-view__detail-panel'>
1012
- {detailNotice}
1013
- <ComplexTextEditor
1014
- value={detailMeta.item}
1015
- onChange={(next) => writeDetailItem((next ?? {}) as Record<string, unknown>)}
1016
- />
1017
- </div>
1018
- )
1019
- }
1020
-
1021
- if (itemSchema != null) {
1022
- if (sectionKey === 'adapters') {
1023
- const accountItemSchema = itemSchema.recordFields?.accounts?.itemSchema
1024
- const isAccountsNestedRoute = detailRoute?.nestedPath?.[0] === 'accounts'
1025
- const hiddenFieldPaths = [
1026
- ...(isKnownEntry && uiSection.recordMap.mode === 'discriminated' ? [[discriminatorField]] : []),
1027
- ['accounts']
1028
- ]
1029
- const visibleAdapterFields = itemSchema.fields.filter(field =>
1030
- !hiddenFieldPaths.some(hiddenPath => (
1031
- field.path.length === hiddenPath.length &&
1032
- field.path.every((segment, index) => segment === hiddenPath[index])
1033
- ))
1034
- )
1035
- const defaultAccountFieldPaths = visibleAdapterFields
1036
- .filter(field => field.path.length === 1 && field.path[0] === 'defaultAccount')
1037
- .map(field => field.path)
1038
- const advancedFields = visibleAdapterFields
1039
- .filter(field => (
1040
- (field.path.length === 1 && (
1041
- field.path[0] === 'includeModels' ||
1042
- field.path[0] === 'excludeModels' ||
1043
- field.path[0] === 'experimentalApi' ||
1044
- field.path[0] === 'maxOutputTokens'
1045
- )) ||
1046
- field.type === 'json' ||
1047
- field.type === 'multiline' ||
1048
- field.type === 'string[]'
1049
- ))
1050
- const primaryFieldPaths = visibleAdapterFields
1051
- .filter(field =>
1052
- !defaultAccountFieldPaths.some(path => (
1053
- field.path.length === path.length &&
1054
- field.path.every((segment, index) => segment === path[index])
1055
- ))
1056
- )
1057
- .filter(field =>
1058
- !advancedFields.some(advancedField => (
1059
- field.path.length === advancedField.path.length &&
1060
- field.path.every((segment, index) => segment === advancedField.path[index])
1061
- ))
1062
- )
1063
- .map(field => field.path)
1064
- const modelSection = {
1065
- title: t('config.sectionGroups.models'),
1066
- visibleFieldPaths: advancedFields
1067
- .filter(field => (
1068
- isTopLevelField(field.path, 'includeModels') ||
1069
- isTopLevelField(field.path, 'excludeModels')
1070
- ))
1071
- .map(field => field.path)
1072
- }
1073
- const advancedSections = [
1074
- {
1075
- key: 'runtime',
1076
- title: t('config.sectionGroups.advancedRuntime'),
1077
- visibleFieldPaths: advancedFields
1078
- .filter(field => (
1079
- isTopLevelField(field.path, 'experimentalApi') ||
1080
- isTopLevelField(field.path, 'maxOutputTokens')
1081
- ))
1082
- .map(field => field.path)
1083
- },
1084
- {
1085
- key: 'sandbox',
1086
- title: t('config.sectionGroups.advancedSandbox'),
1087
- visibleFieldPaths: advancedFields
1088
- .filter(field => isTopLevelField(field.path, 'sandboxPolicy'))
1089
- .map(field => field.path)
1090
- },
1091
- {
1092
- key: 'client',
1093
- title: t('config.sectionGroups.advancedClient'),
1094
- visibleFieldPaths: advancedFields
1095
- .filter(field => isTopLevelField(field.path, 'clientInfo'))
1096
- .map(field => field.path)
1097
- },
1098
- {
1099
- key: 'overrides',
1100
- title: t('config.sectionGroups.advancedOverrides'),
1101
- visibleFieldPaths: advancedFields
1102
- .filter(field => (
1103
- isTopLevelField(field.path, 'configOverrides') ||
1104
- isTopLevelField(field.path, 'features')
1105
- ))
1106
- .map(field => field.path)
1107
- },
1108
- {
1109
- key: 'misc',
1110
- title: t('config.sectionGroups.advancedMisc'),
1111
- visibleFieldPaths: advancedFields
1112
- .filter(field =>
1113
- !(
1114
- isTopLevelField(field.path, 'includeModels') ||
1115
- isTopLevelField(field.path, 'excludeModels') ||
1116
- isTopLevelField(field.path, 'experimentalApi') ||
1117
- isTopLevelField(field.path, 'maxOutputTokens') ||
1118
- isTopLevelField(field.path, 'sandboxPolicy') ||
1119
- isTopLevelField(field.path, 'clientInfo') ||
1120
- isTopLevelField(field.path, 'configOverrides') ||
1121
- isTopLevelField(field.path, 'features')
1122
- )
1123
- )
1124
- .map(field => field.path)
1125
- }
1126
- ]
1127
-
1128
- if (isAccountsNestedRoute) {
1129
- return (
1130
- <div className='config-view__detail-panel'>
1131
- {detailNotice}
1132
- <AdapterAccountsManager
1133
- adapterKey={detailMeta.itemKey}
1134
- value={detailMeta.item}
1135
- accountItemSchema={accountItemSchema}
1136
- onChange={writeDetailItem}
1137
- nestedPath={detailRoute?.nestedPath}
1138
- onOpenNestedPath={(nextPath) => {
1139
- onOpenDetailRoute?.({
1140
- kind: detailRoute?.kind ?? 'detailCollectionItem',
1141
- fieldPath: detailMeta.field.path,
1142
- itemKey: detailMeta.itemKey,
1143
- nestedPath: nextPath
1144
- })
1145
- }}
1146
- t={t}
1147
- />
1148
- </div>
1149
- )
1150
- }
1151
-
1152
- return (
1153
- <div className='config-view__detail-panel'>
1154
- {detailNotice}
1155
- <div className='config-view__field-stack'>
1156
- {renderAdapterSchemaSection({
1157
- schema: itemSchema,
1158
- currentValue: detailMeta.item,
1159
- onCurrentValueChange: writeDetailItem,
1160
- visibleFieldPaths: primaryFieldPaths,
1161
- title: t('config.sectionGroups.base'),
1162
- collapsible: true,
1163
- defaultExpanded: true,
1164
- collapseKey: 'base'
1165
- })}
1166
- {renderAdapterSchemaSection({
1167
- schema: itemSchema,
1168
- currentValue: detailMeta.item,
1169
- onCurrentValueChange: writeDetailItem,
1170
- visibleFieldPaths: defaultAccountFieldPaths,
1171
- title: undefined,
1172
- resolveFieldOptions: (field) => (
1173
- field.path.length === 1 && field.path[0] === 'defaultAccount'
1174
- ? adapterDefaultAccountOptions ?? []
1175
- : undefined
1176
- )
1177
- })}
1178
- <AdapterAccountsManager
1179
- adapterKey={detailMeta.itemKey}
1180
- value={detailMeta.item}
1181
- accountItemSchema={accountItemSchema}
1182
- onChange={writeDetailItem}
1183
- nestedPath={detailRoute?.nestedPath}
1184
- onOpenNestedPath={(nextPath) => {
1185
- onOpenDetailRoute?.({
1186
- kind: detailRoute?.kind ?? 'detailCollectionItem',
1187
- fieldPath: detailMeta.field.path,
1188
- itemKey: detailMeta.itemKey,
1189
- nestedPath: nextPath
1190
- })
1191
- }}
1192
- t={t}
1193
- />
1194
- {renderAdapterAdvancedSections({
1195
- schema: itemSchema,
1196
- currentValue: detailMeta.item,
1197
- onCurrentValueChange: writeDetailItem,
1198
- modelSection,
1199
- advancedSections
1200
- })}
1201
- </div>
1202
- </div>
1203
- )
1204
- }
1205
-
1206
- return (
1207
- <div className='config-view__detail-panel'>
1208
- {detailNotice}
1209
- <SchemaObjectEditor
1210
- value={detailMeta.item}
1211
- schema={itemSchema}
1212
- onChange={writeDetailItem}
1213
- t={t}
1214
- hideFieldPaths={isKnownEntry && uiSection.recordMap.mode === 'discriminated'
1215
- ? [[discriminatorField]]
1216
- : undefined}
1217
- />
1218
- </div>
1219
- )
1220
- }
1221
- }
1222
-
1223
- if ((detailMeta.field.detailCollection?.itemFields?.length ?? 0) > 0) {
1224
- return (
1225
- <div className='config-view__detail-panel'>
1226
- {detailNotice}
1227
- {renderFieldGroups({
1228
- currentFields: detailMeta.field.detailCollection!.itemFields!,
1229
- currentValue: detailMeta.item,
1230
- currentResolvedValue: detailMeta.resolvedItem,
1231
- onCurrentValueChange: writeDetailItem,
1232
- keyPrefix: `detail:${detailMeta.field.path.join('.')}:${detailMeta.itemKey}`
1233
- })}
1234
- </div>
1235
- )
1236
- }
1237
-
1238
- return (
1239
- <div className='config-view__detail-panel'>
1240
- {detailNotice}
1241
- <Empty description={t('common.noData')} image={null} />
1242
- </div>
1243
- )
1244
- }
1245
-
1246
- return renderFieldGroups({
1247
- currentFields: fields,
1248
- currentValue: value,
1249
- currentResolvedValue: resolvedValue,
1250
- onCurrentValueChange: onChange,
1251
- keyPrefix: sectionKey
1252
- })
1253
- }
1254
-
1255
- const getRecordKeyPlaceholder = (sectionKey: string, field: FieldSpec, t: TranslationFn) => {
1256
- if (sectionKey === 'models') return t('config.editor.newModelSelectorName')
1257
- if (sectionKey === 'modelServices') return t('config.editor.newModelServiceName')
1258
- if (sectionKey === 'channels') return t('config.editor.newChannelName')
1259
- if (sectionKey === 'adapters') return t('config.editor.newAdapterName')
1260
- if (sectionKey === 'plugins') return t('config.editor.newPluginName')
1261
- if (sectionKey === 'mcp') return t('config.editor.newMcpServerName')
1262
- if (sectionKey === 'general' && field.path.join('.') === 'env') return t('config.editor.newEnvVarName')
1263
- return t('config.editor.fieldKey')
1264
- }