@vibe-forge/client 0.7.4 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/cli.cjs +16 -17
  2. package/dist/assets/{arc-DXs6SvQX.js → arc-D8jtzr3m.js} +1 -1
  3. package/dist/assets/{blockDiagram-c4efeb88-h-xVkbzT.js → blockDiagram-c4efeb88-BJgpwJDu.js} +1 -1
  4. package/dist/assets/{c4Diagram-c83219d4-DEumwLCr.js → c4Diagram-c83219d4-D1tglS7Y.js} +1 -1
  5. package/dist/assets/channel-5WTe7pNn.js +1 -0
  6. package/dist/assets/{classDiagram-beda092f-Dh_6VL8e.js → classDiagram-beda092f-D0yKhAEF.js} +1 -1
  7. package/dist/assets/{classDiagram-v2-2358418a-D9hG_V5y.js → classDiagram-v2-2358418a-HMGLB-Su.js} +1 -1
  8. package/dist/assets/clone-LappdaLy.js +1 -0
  9. package/dist/assets/{createText-1719965b-DGO5tdKk.js → createText-1719965b-CdcVoxJT.js} +1 -1
  10. package/dist/assets/{edges-96097737-63FzeZDk.js → edges-96097737-D8eSYgyp.js} +1 -1
  11. package/dist/assets/{erDiagram-0228fc6a-jN2RzBTN.js → erDiagram-0228fc6a-Cz1bZvQg.js} +1 -1
  12. package/dist/assets/{flowDb-c6c81e3f-CvND0Kz-.js → flowDb-c6c81e3f-2Q7aPB-q.js} +1 -1
  13. package/dist/assets/{flowDiagram-50d868cf-jtMtLi5z.js → flowDiagram-50d868cf-CADXtRSY.js} +1 -1
  14. package/dist/assets/flowDiagram-v2-4f6560a1-VWENAHeD.js +1 -0
  15. package/dist/assets/{flowchart-elk-definition-6af322e1-Dic1wweO.js → flowchart-elk-definition-6af322e1-H7s8F7AZ.js} +1 -1
  16. package/dist/assets/{ganttDiagram-a2739b55-BLbYj7ru.js → ganttDiagram-a2739b55-ByPQlmCo.js} +1 -1
  17. package/dist/assets/{gitGraphDiagram-82fe8481-Dm4ee53U.js → gitGraphDiagram-82fe8481-BZVM0Fl8.js} +1 -1
  18. package/dist/assets/{graph-BnzAin3i.js → graph-ClMJH_U-.js} +1 -1
  19. package/dist/assets/{index-5325376f-gU7GGRnq.js → index-5325376f-HWUtfpil.js} +1 -1
  20. package/dist/assets/{index-BRIfON-w.css → index-DGEAe87I.css} +1 -1
  21. package/dist/assets/index-NlU1ELyk.js +557 -0
  22. package/dist/assets/{infoDiagram-8eee0895-BI_1UH70.js → infoDiagram-8eee0895-wi7-H9nz.js} +1 -1
  23. package/dist/assets/{journeyDiagram-c64418c1-Xc6td0Nk.js → journeyDiagram-c64418c1-CZCyqk1X.js} +1 -1
  24. package/dist/assets/{layout-PHWoi3a3.js → layout-CONWz1Dx.js} +1 -1
  25. package/dist/assets/{line-BJPgSD92.js → line-ugjigc8g.js} +1 -1
  26. package/dist/assets/{linear-DYKGy-mG.js → linear-CziOoP7o.js} +1 -1
  27. package/dist/assets/material-symbols-rounded-Cc81OfR0.woff2 +0 -0
  28. package/dist/assets/{mermaid.core-H3QJi-7A.js → mermaid.core-8jQ7wVtv.js} +4 -4
  29. package/dist/assets/{mindmap-definition-8da855dc-UC--JAZa.js → mindmap-definition-8da855dc-74YgrTXA.js} +1 -1
  30. package/dist/assets/{pieDiagram-a8764435-BTI_-cYX.js → pieDiagram-a8764435-9MHYBe77.js} +1 -1
  31. package/dist/assets/{quadrantDiagram-1e28029f-C4Gf_SaX.js → quadrantDiagram-1e28029f-T47Rsmlf.js} +1 -1
  32. package/dist/assets/{requirementDiagram-08caed73-BKwfGAsO.js → requirementDiagram-08caed73-DxX3Lp0B.js} +1 -1
  33. package/dist/assets/{sankeyDiagram-a04cb91d-DTp2p2pD.js → sankeyDiagram-a04cb91d-DtlrXeOV.js} +1 -1
  34. package/dist/assets/{sequenceDiagram-c5b8d532-CLuNEegU.js → sequenceDiagram-c5b8d532-0e8o5pPE.js} +1 -1
  35. package/dist/assets/{stateDiagram-1ecb1508-BUofUUM6.js → stateDiagram-1ecb1508-Uif8hYjc.js} +1 -1
  36. package/dist/assets/{stateDiagram-v2-c2b004d7-BATuZH_y.js → stateDiagram-v2-c2b004d7-D8sWSYsQ.js} +1 -1
  37. package/dist/assets/{styles-b4e223ce-CVO41uVV.js → styles-b4e223ce-D43vhmWC.js} +1 -1
  38. package/dist/assets/{styles-ca3715f6-fFE_-gsH.js → styles-ca3715f6-DWma2mkN.js} +1 -1
  39. package/dist/assets/{styles-d45a18b0-BeG4Dd2L.js → styles-d45a18b0-kT58cZYw.js} +1 -1
  40. package/dist/assets/{svgDrawCommon-b86b1483-D6PZVIuy.js → svgDrawCommon-b86b1483-D5ltvlh8.js} +1 -1
  41. package/dist/assets/{timeline-definition-faaaa080-CTFMc2GO.js → timeline-definition-faaaa080-PXG_aexc.js} +1 -1
  42. package/dist/assets/{xychartDiagram-f5964ef8-wWcw3yKn.js → xychartDiagram-f5964ef8-qTUp7CdK.js} +1 -1
  43. package/dist/index.html +2 -12
  44. package/index.html +0 -10
  45. package/package.json +10 -8
  46. package/src/App.tsx +1 -1
  47. package/src/api/base.ts +7 -7
  48. package/src/api/benchmark.ts +7 -3
  49. package/src/api/config.ts +2 -1
  50. package/src/api.ts +1 -1
  51. package/src/assets/fonts/material-symbols-rounded.woff2 +0 -0
  52. package/src/components/ArchiveView.tsx +1 -1
  53. package/src/components/ConfigView.tsx +18 -6
  54. package/src/components/MarkdownContent.tsx +1 -1
  55. package/src/components/Sidebar.tsx +2 -2
  56. package/src/components/automation-view/RuleFormPanel.tsx +7 -5
  57. package/src/components/automation-view/TaskList.tsx +8 -5
  58. package/src/components/automation-view/TriggerList.tsx +25 -15
  59. package/src/components/automation-view/types.ts +1 -1
  60. package/src/components/benchmark-view/BenchmarkCasePanel.tsx +94 -94
  61. package/src/components/benchmark-view/BenchmarkSidebar.scss +8 -6
  62. package/src/components/benchmark-view/BenchmarkSidebar.tsx +43 -30
  63. package/src/components/benchmark-view/index.tsx +4 -2
  64. package/src/components/benchmark-view/types.ts +3 -2
  65. package/src/components/benchmark-view/utils.ts +1 -2
  66. package/src/components/chat/ChatHeader.tsx +1 -1
  67. package/src/components/chat/ChatHistoryView.tsx +3 -2
  68. package/src/components/chat/CurrentTodoList.tsx +2 -3
  69. package/src/components/chat/messages/MessageItem.tsx +15 -14
  70. package/src/components/chat/messages/message-utils.ts +1 -1
  71. package/src/components/chat/sender/Sender.scss +8 -3
  72. package/src/components/chat/sender/Sender.tsx +71 -22
  73. package/src/components/chat/session-timeline-panel/git-graph.ts +8 -1
  74. package/src/components/chat/session-timeline-panel/index.scss +2 -2
  75. package/src/components/chat/tools/DefaultTool.tsx +3 -3
  76. package/src/components/chat/tools/adapter-claude/BashTool.tsx +2 -2
  77. package/src/components/chat/tools/adapter-claude/GlobTool.tsx +2 -2
  78. package/src/components/chat/tools/adapter-claude/GrepTool.tsx +2 -2
  79. package/src/components/chat/tools/adapter-claude/LSTool.tsx +4 -4
  80. package/src/components/chat/tools/adapter-claude/ReadTool.scss +1 -2
  81. package/src/components/chat/tools/adapter-claude/ReadTool.tsx +3 -3
  82. package/src/components/chat/tools/adapter-claude/TodoTool.tsx +1 -1
  83. package/src/components/chat/tools/adapter-claude/WriteTool.tsx +2 -2
  84. package/src/components/chat/tools/adapter-claude/components/FileList.scss +4 -2
  85. package/src/components/chat/tools/core/ToolCallBox.scss +34 -35
  86. package/src/components/chat/tools/core/ToolGroup.tsx +5 -5
  87. package/src/components/chat/tools/plugin-chrome-devtools/ChromeDevtoolsTool.tsx +1 -1
  88. package/src/components/chat/tools/task/GetTaskInfoTool.tsx +1 -1
  89. package/src/components/chat/tools/task/StartTasksTool.tsx +2 -2
  90. package/src/components/chat/tools/task/components/TaskRow.tsx +4 -4
  91. package/src/components/chat/tools/task/components/TaskToolCard.tsx +4 -4
  92. package/src/components/config/ConfigAboutSection.tsx +1 -1
  93. package/src/components/config/ConfigSectionForm.tsx +2 -1
  94. package/src/components/config/ConfigSectionPanel.tsx +1 -1
  95. package/src/components/config/ConfigShortcutInput.scss +1 -1
  96. package/src/components/config/ConfigSourceSwitch.tsx +1 -1
  97. package/src/components/config/configSchema.ts +16 -1
  98. package/src/components/config/index.tsx +1 -1
  99. package/src/components/config/record-editors/McpServersRecordEditor.tsx +125 -123
  100. package/src/components/config/record-editors/ModelServicesRecordEditor.tsx +138 -136
  101. package/src/components/config/record-editors/RecordJsonEditor.tsx +31 -29
  102. package/src/components/config/record-editors/index.tsx +1 -1
  103. package/src/components/knowledge-base/components/EmptyState.tsx +1 -1
  104. package/src/components/knowledge-base/components/EntitiesTab.tsx +2 -2
  105. package/src/components/knowledge-base/components/EntityItem.tsx +1 -1
  106. package/src/components/knowledge-base/components/EntityList.tsx +1 -1
  107. package/src/components/knowledge-base/components/FilterBar.tsx +2 -2
  108. package/src/components/knowledge-base/components/FlowsTab.tsx +1 -1
  109. package/src/components/knowledge-base/components/KnowledgeList.tsx +1 -1
  110. package/src/components/knowledge-base/components/MetaList.tsx +1 -1
  111. package/src/components/knowledge-base/components/RuleItem.tsx +1 -1
  112. package/src/components/knowledge-base/components/RuleList.tsx +1 -1
  113. package/src/components/knowledge-base/components/RulesTab.tsx +3 -3
  114. package/src/components/knowledge-base/components/SectionHeader.tsx +1 -1
  115. package/src/components/knowledge-base/components/SkillsTab.tsx +3 -3
  116. package/src/components/knowledge-base/components/SpecItem.tsx +1 -1
  117. package/src/components/knowledge-base/components/SpecList.tsx +1 -1
  118. package/src/components/knowledge-base/components/TabContent.tsx +1 -1
  119. package/src/components/knowledge-base/components/TabLabel.tsx +1 -1
  120. package/src/components/sidebar/SessionItem.scss +0 -1
  121. package/src/components/sidebar/SessionItem.tsx +1 -1
  122. package/src/hooks/chat/model-selector.ts +115 -121
  123. package/src/hooks/chat/use-chat-adapter.ts +3 -3
  124. package/src/hooks/chat/use-chat-interaction.ts +1 -1
  125. package/src/hooks/chat/use-chat-model-adapter-selection.tsx +549 -0
  126. package/src/hooks/chat/use-chat-models.tsx +7 -2
  127. package/src/hooks/chat/use-chat-permission-mode.ts +5 -1
  128. package/src/hooks/chat/use-chat-session-messages.ts +2 -2
  129. package/src/hooks/chat/use-chat-session.ts +14 -12
  130. package/src/hooks/chat/use-chat-view.ts +1 -1
  131. package/src/hooks/use-app-preferences.ts +14 -4
  132. package/src/hooks/use-session-subscription.ts +17 -6
  133. package/src/hooks/useQueryParams.ts +8 -6
  134. package/src/main.tsx +1 -0
  135. package/src/resources/adapters.ts +8 -2
  136. package/src/resources/locales/en.json +14 -1
  137. package/src/resources/locales/zh.json +14 -1
  138. package/src/routes/ChatRoute.scss +5 -1
  139. package/src/runtime-config.ts +17 -13
  140. package/src/styles/material-symbols-rounded.scss +23 -0
  141. package/src/utils/shortcutUtils.ts +1 -1
  142. package/vite.config.ts +5 -0
  143. package/dist/assets/channel-Hxo8SEEx.js +0 -1
  144. package/dist/assets/clone-Dd_kUYh5.js +0 -1
  145. package/dist/assets/flowDiagram-v2-4f6560a1-CmztIxNZ.js +0 -1
  146. package/dist/assets/index-Cw-fkktx.js +0 -557
@@ -3,11 +3,11 @@ import './McpServersRecordEditor.scss'
3
3
  import { Button, Input, Select, Switch, Tooltip } from 'antd'
4
4
  import { useEffect, useMemo, useState } from 'react'
5
5
 
6
+ import { StringArrayEditor } from '../ConfigEditors'
6
7
  import { FieldRow } from '../ConfigFieldRow'
7
8
  import { getTypeIcon } from '../configUtils'
8
9
  import type { TranslationFn } from '../configUtils'
9
10
  import { KeyValueEditor } from './KeyValueEditor'
10
- import { StringArrayEditor } from '../ConfigEditors'
11
11
 
12
12
  export const McpServersRecordEditor = ({
13
13
  value,
@@ -71,7 +71,9 @@ export const McpServersRecordEditor = ({
71
71
  type='text'
72
72
  className='config-view__icon-button config-view__icon-button--compact'
73
73
  aria-label={isCollapsed ? t('config.editor.expand') : t('config.editor.collapse')}
74
- icon={<span className='material-symbols-rounded'>{isCollapsed ? 'chevron_right' : 'expand_more'}</span>}
74
+ icon={
75
+ <span className='material-symbols-rounded'>{isCollapsed ? 'chevron_right' : 'expand_more'}</span>
76
+ }
75
77
  onClick={() => {
76
78
  setCollapsedKeys(prev => ({ ...prev, [key]: !isCollapsed }))
77
79
  }}
@@ -97,127 +99,127 @@ export const McpServersRecordEditor = ({
97
99
  </div>
98
100
  <div className='config-view__record-body'>
99
101
  <div className='config-view__record-fields'>
100
- <FieldRow
101
- title={t('config.fields.mcpServer.enabled.label')}
102
- description={t('config.fields.mcpServer.enabled.desc')}
103
- icon={getTypeIcon('boolean')}
104
- >
105
- <Switch
106
- checked={Boolean(recordValue.enabled)}
107
- onChange={(next) => {
108
- updateRecord({ ...recordValue, enabled: next })
109
- }}
110
- />
111
- </FieldRow>
112
- <FieldRow
113
- title={t('config.fields.mcpServer.type.label')}
114
- description={t('config.fields.mcpServer.type.desc')}
115
- icon={getTypeIcon('string')}
116
- >
117
- <Select
118
- value={typeValue}
119
- options={[
120
- { value: 'command', label: t('config.options.mcp.command') },
121
- { value: 'sse', label: t('config.options.mcp.sse') },
122
- { value: 'http', label: t('config.options.mcp.http') }
123
- ]}
124
- onChange={(next) => {
125
- const nextRecord = { ...recordValue }
126
- if (next === 'command') {
127
- delete nextRecord.type
128
- if (nextRecord.command == null) nextRecord.command = ''
129
- if (nextRecord.args == null) nextRecord.args = []
130
- delete nextRecord.url
131
- delete nextRecord.headers
132
- } else {
133
- nextRecord.type = next
134
- if (nextRecord.url == null) nextRecord.url = ''
135
- if (nextRecord.headers == null) nextRecord.headers = {}
136
- delete nextRecord.command
137
- delete nextRecord.args
138
- }
139
- updateRecord(nextRecord)
140
- }}
141
- />
142
- </FieldRow>
143
- {typeValue === 'command' && (
144
- <>
145
- <FieldRow
146
- title={t('config.fields.mcpServer.command.label')}
147
- description={t('config.fields.mcpServer.command.desc')}
148
- icon={getTypeIcon('string')}
149
- >
150
- <Input
151
- value={typeof recordValue.command === 'string' ? recordValue.command : ''}
152
- onChange={(event) => {
153
- updateRecord({ ...recordValue, command: event.target.value })
154
- }}
155
- placeholder={t('config.editor.commandPlaceholder')}
156
- />
157
- </FieldRow>
158
- <FieldRow
159
- title={t('config.fields.mcpServer.args.label')}
160
- description={t('config.fields.mcpServer.args.desc')}
161
- icon={getTypeIcon('array')}
162
- layout='stacked'
163
- >
164
- <StringArrayEditor
165
- value={argsValue}
166
- onChange={(next) => {
167
- updateRecord({ ...recordValue, args: next })
168
- }}
169
- t={t}
170
- />
171
- </FieldRow>
172
- </>
173
- )}
174
- {typeValue !== 'command' && (
175
- <>
176
- <FieldRow
177
- title={t('config.fields.mcpServer.url.label')}
178
- description={t('config.fields.mcpServer.url.desc')}
179
- icon={getTypeIcon('string')}
180
- >
181
- <Input
182
- value={typeof recordValue.url === 'string' ? recordValue.url : ''}
183
- onChange={(event) => {
184
- updateRecord({ ...recordValue, url: event.target.value })
185
- }}
186
- placeholder={t('config.editor.urlPlaceholder')}
187
- />
188
- </FieldRow>
189
- <FieldRow
190
- title={t('config.fields.mcpServer.headers.label')}
191
- description={t('config.fields.mcpServer.headers.desc')}
192
- icon={getTypeIcon('object')}
193
- layout='stacked'
194
- >
195
- <KeyValueEditor
196
- value={headersValue}
197
- onChange={(next) => {
198
- updateRecord({ ...recordValue, headers: next })
199
- }}
200
- t={t}
201
- keyPlaceholder={t('config.editor.newHeaderName')}
202
- />
203
- </FieldRow>
204
- </>
205
- )}
206
- <FieldRow
207
- title={t('config.fields.mcpServer.env.label')}
208
- description={t('config.fields.mcpServer.env.desc')}
209
- icon={getTypeIcon('object')}
210
- layout='stacked'
211
- >
212
- <KeyValueEditor
213
- value={envValue}
214
- onChange={(next) => {
215
- updateRecord({ ...recordValue, env: next })
216
- }}
217
- t={t}
218
- keyPlaceholder={t('config.editor.newEnvVarName')}
219
- />
220
- </FieldRow>
102
+ <FieldRow
103
+ title={t('config.fields.mcpServer.enabled.label')}
104
+ description={t('config.fields.mcpServer.enabled.desc')}
105
+ icon={getTypeIcon('boolean')}
106
+ >
107
+ <Switch
108
+ checked={Boolean(recordValue.enabled)}
109
+ onChange={(next) => {
110
+ updateRecord({ ...recordValue, enabled: next })
111
+ }}
112
+ />
113
+ </FieldRow>
114
+ <FieldRow
115
+ title={t('config.fields.mcpServer.type.label')}
116
+ description={t('config.fields.mcpServer.type.desc')}
117
+ icon={getTypeIcon('string')}
118
+ >
119
+ <Select
120
+ value={typeValue}
121
+ options={[
122
+ { value: 'command', label: t('config.options.mcp.command') },
123
+ { value: 'sse', label: t('config.options.mcp.sse') },
124
+ { value: 'http', label: t('config.options.mcp.http') }
125
+ ]}
126
+ onChange={(next) => {
127
+ const nextRecord = { ...recordValue }
128
+ if (next === 'command') {
129
+ delete nextRecord.type
130
+ if (nextRecord.command == null) nextRecord.command = ''
131
+ if (nextRecord.args == null) nextRecord.args = []
132
+ delete nextRecord.url
133
+ delete nextRecord.headers
134
+ } else {
135
+ nextRecord.type = next
136
+ if (nextRecord.url == null) nextRecord.url = ''
137
+ if (nextRecord.headers == null) nextRecord.headers = {}
138
+ delete nextRecord.command
139
+ delete nextRecord.args
140
+ }
141
+ updateRecord(nextRecord)
142
+ }}
143
+ />
144
+ </FieldRow>
145
+ {typeValue === 'command' && (
146
+ <>
147
+ <FieldRow
148
+ title={t('config.fields.mcpServer.command.label')}
149
+ description={t('config.fields.mcpServer.command.desc')}
150
+ icon={getTypeIcon('string')}
151
+ >
152
+ <Input
153
+ value={typeof recordValue.command === 'string' ? recordValue.command : ''}
154
+ onChange={(event) => {
155
+ updateRecord({ ...recordValue, command: event.target.value })
156
+ }}
157
+ placeholder={t('config.editor.commandPlaceholder')}
158
+ />
159
+ </FieldRow>
160
+ <FieldRow
161
+ title={t('config.fields.mcpServer.args.label')}
162
+ description={t('config.fields.mcpServer.args.desc')}
163
+ icon={getTypeIcon('array')}
164
+ layout='stacked'
165
+ >
166
+ <StringArrayEditor
167
+ value={argsValue}
168
+ onChange={(next) => {
169
+ updateRecord({ ...recordValue, args: next })
170
+ }}
171
+ t={t}
172
+ />
173
+ </FieldRow>
174
+ </>
175
+ )}
176
+ {typeValue !== 'command' && (
177
+ <>
178
+ <FieldRow
179
+ title={t('config.fields.mcpServer.url.label')}
180
+ description={t('config.fields.mcpServer.url.desc')}
181
+ icon={getTypeIcon('string')}
182
+ >
183
+ <Input
184
+ value={typeof recordValue.url === 'string' ? recordValue.url : ''}
185
+ onChange={(event) => {
186
+ updateRecord({ ...recordValue, url: event.target.value })
187
+ }}
188
+ placeholder={t('config.editor.urlPlaceholder')}
189
+ />
190
+ </FieldRow>
191
+ <FieldRow
192
+ title={t('config.fields.mcpServer.headers.label')}
193
+ description={t('config.fields.mcpServer.headers.desc')}
194
+ icon={getTypeIcon('object')}
195
+ layout='stacked'
196
+ >
197
+ <KeyValueEditor
198
+ value={headersValue}
199
+ onChange={(next) => {
200
+ updateRecord({ ...recordValue, headers: next })
201
+ }}
202
+ t={t}
203
+ keyPlaceholder={t('config.editor.newHeaderName')}
204
+ />
205
+ </FieldRow>
206
+ </>
207
+ )}
208
+ <FieldRow
209
+ title={t('config.fields.mcpServer.env.label')}
210
+ description={t('config.fields.mcpServer.env.desc')}
211
+ icon={getTypeIcon('object')}
212
+ layout='stacked'
213
+ >
214
+ <KeyValueEditor
215
+ value={envValue}
216
+ onChange={(next) => {
217
+ updateRecord({ ...recordValue, env: next })
218
+ }}
219
+ t={t}
220
+ keyPlaceholder={t('config.editor.newEnvVarName')}
221
+ />
222
+ </FieldRow>
221
223
  </div>
222
224
  </div>
223
225
  </div>
@@ -62,7 +62,9 @@ export const ModelServicesRecordEditor = ({
62
62
  type='text'
63
63
  className='config-view__icon-button config-view__icon-button--compact'
64
64
  aria-label={isCollapsed ? t('config.editor.expand') : t('config.editor.collapse')}
65
- icon={<span className='material-symbols-rounded'>{isCollapsed ? 'chevron_right' : 'expand_more'}</span>}
65
+ icon={
66
+ <span className='material-symbols-rounded'>{isCollapsed ? 'chevron_right' : 'expand_more'}</span>
67
+ }
66
68
  onClick={() => {
67
69
  setCollapsedKeys(prev => ({ ...prev, [key]: !isCollapsed }))
68
70
  }}
@@ -96,141 +98,141 @@ export const ModelServicesRecordEditor = ({
96
98
  </div>
97
99
  <div className='config-view__record-body'>
98
100
  <div className='config-view__record-fields'>
99
- <FieldRow
100
- title={t('config.fields.modelServices.item.title.label')}
101
- description={t('config.fields.modelServices.item.title.desc')}
102
- icon={getTypeIcon('string')}
103
- >
104
- <Input
105
- value={titleValue}
106
- onChange={(event) => {
107
- onChange({ ...value, [key]: { ...recordValue, title: event.target.value } })
108
- }}
109
- placeholder={t('config.editor.titlePlaceholder')}
110
- />
111
- </FieldRow>
112
- <FieldRow
113
- title={t('config.fields.modelServices.item.description.label')}
114
- description={t('config.fields.modelServices.item.description.desc')}
115
- icon={getTypeIcon('string')}
116
- layout='stacked'
117
- >
118
- <Input.TextArea
119
- value={descriptionValue}
120
- onChange={(event) => {
121
- onChange({ ...value, [key]: { ...recordValue, description: event.target.value } })
122
- }}
123
- autoSize={{ minRows: 2 }}
124
- placeholder={t('config.editor.descriptionPlaceholder')}
125
- />
126
- </FieldRow>
127
- <FieldRow
128
- title={t('config.fields.modelServices.item.apiBaseUrl.label')}
129
- description={t('config.fields.modelServices.item.apiBaseUrl.desc')}
130
- icon={getTypeIcon('string')}
131
- >
132
- <Input
133
- value={typeof recordValue.apiBaseUrl === 'string' ? recordValue.apiBaseUrl : ''}
134
- onChange={(event) => {
135
- onChange({ ...value, [key]: { ...recordValue, apiBaseUrl: event.target.value } })
136
- }}
137
- />
138
- </FieldRow>
139
- <FieldRow
140
- title={t('config.fields.modelServices.item.apiKey.label')}
141
- description={t('config.fields.modelServices.item.apiKey.desc')}
142
- icon={getTypeIcon('string')}
143
- >
144
- <Input.Password
145
- value={typeof recordValue.apiKey === 'string' ? recordValue.apiKey : ''}
146
- onChange={(event) => {
147
- onChange({ ...value, [key]: { ...recordValue, apiKey: event.target.value } })
148
- }}
149
- placeholder={t('config.editor.secretPlaceholder')}
150
- />
151
- </FieldRow>
152
- <FieldRow
153
- title={t('config.fields.modelServices.item.models.label')}
154
- description={t('config.fields.modelServices.item.models.desc')}
155
- icon={getTypeIcon('array')}
156
- layout='stacked'
157
- >
158
- <StringArrayEditor
159
- value={models}
160
- onChange={(next) => {
161
- onChange({ ...value, [key]: { ...recordValue, models: next } })
162
- }}
163
- t={t}
164
- />
165
- </FieldRow>
166
- <FieldRow
167
- title={t('config.fields.modelServices.item.modelsAlias.label')}
168
- description={t('config.fields.modelServices.item.modelsAlias.desc')}
169
- icon={getTypeIcon('object')}
170
- layout='stacked'
171
- >
172
- <ComplexTextEditor
173
- value={recordValue.modelsAlias ?? {}}
174
- onChange={(next) => {
175
- onChange({ ...value, [key]: { ...recordValue, modelsAlias: next } })
176
- }}
177
- />
178
- </FieldRow>
179
- <FieldRow
180
- title={t('config.fields.modelServices.item.timeoutMs.label')}
181
- description={t('config.fields.modelServices.item.timeoutMs.desc')}
182
- icon={getTypeIcon('number')}
183
- >
184
- <InputNumber
185
- min={1}
186
- step={1000}
187
- value={typeof recordValue.timeoutMs === 'number' ? recordValue.timeoutMs : undefined}
188
- onChange={(nextValue) => {
189
- onChange({
190
- ...value,
191
- [key]: {
192
- ...recordValue,
193
- ...(typeof nextValue === 'number' ? { timeoutMs: nextValue } : { timeoutMs: undefined })
194
- }
195
- })
196
- }}
197
- />
198
- </FieldRow>
199
- <FieldRow
200
- title={t('config.fields.modelServices.item.maxOutputTokens.label')}
201
- description={t('config.fields.modelServices.item.maxOutputTokens.desc')}
202
- icon={getTypeIcon('number')}
203
- >
204
- <InputNumber
205
- min={1}
206
- step={256}
207
- value={typeof recordValue.maxOutputTokens === 'number' ? recordValue.maxOutputTokens : undefined}
208
- onChange={(nextValue) => {
209
- onChange({
210
- ...value,
211
- [key]: {
212
- ...recordValue,
213
- ...(typeof nextValue === 'number'
214
- ? { maxOutputTokens: nextValue }
215
- : { maxOutputTokens: undefined })
216
- }
217
- })
218
- }}
219
- />
220
- </FieldRow>
221
- <FieldRow
222
- title={t('config.fields.modelServices.item.extra.label')}
223
- description={t('config.fields.modelServices.item.extra.desc')}
224
- icon={getTypeIcon('object')}
225
- layout='stacked'
226
- >
227
- <ComplexTextEditor
228
- value={recordValue.extra ?? {}}
229
- onChange={(next) => {
230
- onChange({ ...value, [key]: { ...recordValue, extra: next } })
231
- }}
232
- />
233
- </FieldRow>
101
+ <FieldRow
102
+ title={t('config.fields.modelServices.item.title.label')}
103
+ description={t('config.fields.modelServices.item.title.desc')}
104
+ icon={getTypeIcon('string')}
105
+ >
106
+ <Input
107
+ value={titleValue}
108
+ onChange={(event) => {
109
+ onChange({ ...value, [key]: { ...recordValue, title: event.target.value } })
110
+ }}
111
+ placeholder={t('config.editor.titlePlaceholder')}
112
+ />
113
+ </FieldRow>
114
+ <FieldRow
115
+ title={t('config.fields.modelServices.item.description.label')}
116
+ description={t('config.fields.modelServices.item.description.desc')}
117
+ icon={getTypeIcon('string')}
118
+ layout='stacked'
119
+ >
120
+ <Input.TextArea
121
+ value={descriptionValue}
122
+ onChange={(event) => {
123
+ onChange({ ...value, [key]: { ...recordValue, description: event.target.value } })
124
+ }}
125
+ autoSize={{ minRows: 2 }}
126
+ placeholder={t('config.editor.descriptionPlaceholder')}
127
+ />
128
+ </FieldRow>
129
+ <FieldRow
130
+ title={t('config.fields.modelServices.item.apiBaseUrl.label')}
131
+ description={t('config.fields.modelServices.item.apiBaseUrl.desc')}
132
+ icon={getTypeIcon('string')}
133
+ >
134
+ <Input
135
+ value={typeof recordValue.apiBaseUrl === 'string' ? recordValue.apiBaseUrl : ''}
136
+ onChange={(event) => {
137
+ onChange({ ...value, [key]: { ...recordValue, apiBaseUrl: event.target.value } })
138
+ }}
139
+ />
140
+ </FieldRow>
141
+ <FieldRow
142
+ title={t('config.fields.modelServices.item.apiKey.label')}
143
+ description={t('config.fields.modelServices.item.apiKey.desc')}
144
+ icon={getTypeIcon('string')}
145
+ >
146
+ <Input.Password
147
+ value={typeof recordValue.apiKey === 'string' ? recordValue.apiKey : ''}
148
+ onChange={(event) => {
149
+ onChange({ ...value, [key]: { ...recordValue, apiKey: event.target.value } })
150
+ }}
151
+ placeholder={t('config.editor.secretPlaceholder')}
152
+ />
153
+ </FieldRow>
154
+ <FieldRow
155
+ title={t('config.fields.modelServices.item.models.label')}
156
+ description={t('config.fields.modelServices.item.models.desc')}
157
+ icon={getTypeIcon('array')}
158
+ layout='stacked'
159
+ >
160
+ <StringArrayEditor
161
+ value={models}
162
+ onChange={(next) => {
163
+ onChange({ ...value, [key]: { ...recordValue, models: next } })
164
+ }}
165
+ t={t}
166
+ />
167
+ </FieldRow>
168
+ <FieldRow
169
+ title={t('config.fields.modelServices.item.modelsAlias.label')}
170
+ description={t('config.fields.modelServices.item.modelsAlias.desc')}
171
+ icon={getTypeIcon('object')}
172
+ layout='stacked'
173
+ >
174
+ <ComplexTextEditor
175
+ value={recordValue.modelsAlias ?? {}}
176
+ onChange={(next) => {
177
+ onChange({ ...value, [key]: { ...recordValue, modelsAlias: next } })
178
+ }}
179
+ />
180
+ </FieldRow>
181
+ <FieldRow
182
+ title={t('config.fields.modelServices.item.timeoutMs.label')}
183
+ description={t('config.fields.modelServices.item.timeoutMs.desc')}
184
+ icon={getTypeIcon('number')}
185
+ >
186
+ <InputNumber
187
+ min={1}
188
+ step={1000}
189
+ value={typeof recordValue.timeoutMs === 'number' ? recordValue.timeoutMs : undefined}
190
+ onChange={(nextValue) => {
191
+ onChange({
192
+ ...value,
193
+ [key]: {
194
+ ...recordValue,
195
+ ...(typeof nextValue === 'number' ? { timeoutMs: nextValue } : { timeoutMs: undefined })
196
+ }
197
+ })
198
+ }}
199
+ />
200
+ </FieldRow>
201
+ <FieldRow
202
+ title={t('config.fields.modelServices.item.maxOutputTokens.label')}
203
+ description={t('config.fields.modelServices.item.maxOutputTokens.desc')}
204
+ icon={getTypeIcon('number')}
205
+ >
206
+ <InputNumber
207
+ min={1}
208
+ step={256}
209
+ value={typeof recordValue.maxOutputTokens === 'number' ? recordValue.maxOutputTokens : undefined}
210
+ onChange={(nextValue) => {
211
+ onChange({
212
+ ...value,
213
+ [key]: {
214
+ ...recordValue,
215
+ ...(typeof nextValue === 'number'
216
+ ? { maxOutputTokens: nextValue }
217
+ : { maxOutputTokens: undefined })
218
+ }
219
+ })
220
+ }}
221
+ />
222
+ </FieldRow>
223
+ <FieldRow
224
+ title={t('config.fields.modelServices.item.extra.label')}
225
+ description={t('config.fields.modelServices.item.extra.desc')}
226
+ icon={getTypeIcon('object')}
227
+ layout='stacked'
228
+ >
229
+ <ComplexTextEditor
230
+ value={recordValue.extra ?? {}}
231
+ onChange={(next) => {
232
+ onChange({ ...value, [key]: { ...recordValue, extra: next } })
233
+ }}
234
+ />
235
+ </FieldRow>
234
236
  </div>
235
237
  </div>
236
238
  </div>