codexmate 0.0.39 → 0.0.40

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.
@@ -947,483 +947,465 @@ return function render(_ctx, _cache) {
947
947
  ])
948
948
  ]))
949
949
  : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [
950
- (!_ctx.loading && !_ctx.initError)
951
- ? (_openBlock(), _createElementBlock("button", {
952
- key: 0,
953
- class: "btn-add",
954
- onClick: $event => {_ctx.showAddProviderKey = false; _ctx.showAddModal = true}
955
- }, [
956
- (_openBlock(), _createElementBlock("svg", {
957
- class: "icon",
958
- viewBox: "0 0 20 20",
959
- fill: "none",
960
- stroke: "currentColor",
961
- "stroke-width": "2"
962
- }, [
963
- _createElementVNode("path", { d: "M10 4v12M4 10h12" })
964
- ])),
965
- _createTextVNode(" " + _toDisplayString(_ctx.t('config.addProvider')), 1 /* TEXT */)
966
- ], 8 /* PROPS */, ["onClick"]))
967
- : _createCommentVNode("v-if", true),
968
- (_ctx.isCodexConfigMode && _ctx.codexProviderTemplates.length)
969
- ? (_openBlock(), _createElementBlock("div", {
970
- key: 1,
971
- class: "selector-section"
972
- }, [
973
- _createElementVNode("div", { class: "selector-header" }, [
974
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.providerTemplate.title')), 1 /* TEXT */)
975
- ]),
976
- _createElementVNode("div", {
977
- class: "btn-group",
978
- style: {"flex-wrap":"wrap","gap":"8px","margin-top":"0"}
979
- }, [
980
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.codexProviderTemplates, (tpl) => {
981
- return (_openBlock(), _createElementBlock("button", {
982
- key: tpl.name,
983
- type: "button",
984
- class: "btn-mini",
985
- onClick: $event => {_ctx.newProvider.name = tpl.name; _ctx.newProvider.url = tpl.url; _ctx.newProvider.model = tpl.model || ''; _ctx.newProvider.useTransform = !!tpl.useTransform; _ctx.showAddProviderKey = false; _ctx.showAddModal = true}
986
- }, _toDisplayString(tpl.label), 9 /* TEXT, PROPS */, ["onClick"]))
987
- }), 128 /* KEYED_FRAGMENT */))
988
- ])
989
- ]))
990
- : _createCommentVNode("v-if", true),
991
- _createElementVNode("div", { class: "selector-section" }, [
992
- _createElementVNode("div", { class: "selector-header" }, [
993
- _createElementVNode("span", { class: "selector-title" }, "AGENTS.md")
994
- ]),
995
- _createElementVNode("button", {
996
- class: "btn-tool",
997
- onClick: _ctx.openAgentsEditor,
998
- disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
999
- }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('config.agents.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1000
- ]),
1001
- _createElementVNode("div", { class: "selector-section" }, [
1002
- _createElementVNode("div", { class: "selector-header" }, [
1003
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.models')), 1 /* TEXT */),
1004
- _createElementVNode("div", { class: "selector-actions" }, [
1005
- (_ctx.modelsSource === 'legacy')
1006
- ? (_openBlock(), _createElementBlock("button", {
1007
- key: 0,
1008
- class: "btn-icon",
1009
- onClick: $event => (_ctx.showModelModal = true),
1010
- "aria-label": _ctx.t('modal.modelAdd.title'),
1011
- title: _ctx.t('modal.modelAdd.title')
1012
- }, "+", 8 /* PROPS */, ["onClick", "aria-label", "title"]))
1013
- : _createCommentVNode("v-if", true),
1014
- (_ctx.modelsSource === 'legacy')
1015
- ? (_openBlock(), _createElementBlock("button", {
1016
- key: 1,
1017
- class: "btn-icon",
1018
- onClick: $event => (_ctx.showModelListModal = true),
1019
- "aria-label": _ctx.t('modal.modelManage.title'),
1020
- title: _ctx.t('modal.modelManage.title')
1021
- }, "≡", 8 /* PROPS */, ["onClick", "aria-label", "title"]))
1022
- : _createCommentVNode("v-if", true)
1023
- ])
950
+ _createElementVNode("section", {
951
+ class: "tool-config-write-card",
952
+ "aria-label": _ctx.t('toolConfig.codex.title')
953
+ }, [
954
+ _createElementVNode("div", { class: "tool-config-write-copy" }, [
955
+ _createElementVNode("div", { class: "tool-config-write-title" }, _toDisplayString(_ctx.t('toolConfig.codex.title')), 1 /* TEXT */),
956
+ _createElementVNode("p", { class: "tool-config-write-desc" }, _toDisplayString(_ctx.t('toolConfig.codex.desc')), 1 /* TEXT */)
1024
957
  ]),
1025
- (_ctx.codexModelsLoading || _ctx.modelsSource === 'remote')
1026
- ? _withDirectives((_openBlock(), _createElementBlock("select", {
1027
- key: 0,
1028
- class: "model-select",
1029
- "onUpdate:modelValue": $event => ((_ctx.currentModel) = $event),
1030
- onChange: _ctx.onModelChange,
1031
- disabled: _ctx.codexModelsLoading
1032
- }, [
1033
- (_ctx.codexModelsLoading)
1034
- ? (_openBlock(), _createElementBlock("option", {
1035
- key: 0,
1036
- value: ""
1037
- }, _toDisplayString(_ctx.t('config.modelLoading')), 1 /* TEXT */))
1038
- : (_openBlock(true), _createElementBlock(_Fragment, { key: 1 }, _renderList(_ctx.codexModelOptions, (model) => {
1039
- return (_openBlock(), _createElementBlock("option", {
1040
- key: model,
1041
- value: model
1042
- }, _toDisplayString(model), 9 /* TEXT, PROPS */, ["value"]))
1043
- }), 128 /* KEYED_FRAGMENT */))
1044
- ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "disabled"])), [
1045
- [_vModelSelect, _ctx.currentModel]
1046
- ])
1047
- : _createCommentVNode("v-if", true),
1048
- (!_ctx.codexModelsLoading && (_ctx.modelsSource !== 'remote' || !_ctx.modelsHasCurrent))
1049
- ? _withDirectives((_openBlock(), _createElementBlock("input", {
1050
- key: 1,
1051
- class: "model-input",
1052
- "onUpdate:modelValue": $event => ((_ctx.currentModel) = $event),
1053
- onBlur: _ctx.onModelChange,
1054
- onKeyup: _withKeys(_ctx.onModelChange, ["enter"]),
1055
- placeholder: _ctx.activeProviderModelPlaceholder,
1056
- list: _ctx.codexModelHasList ? 'codex-model-options' : null
1057
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur", "onKeyup", "placeholder", "list"])), [
1058
- [_vModelText, _ctx.currentModel]
1059
- ])
1060
- : _createCommentVNode("v-if", true),
1061
- (_ctx.codexModelHasList)
1062
- ? (_openBlock(), _createElementBlock("datalist", {
1063
- key: 2,
1064
- id: "codex-model-options"
1065
- }, [
1066
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.codexModelOptions, (model) => {
1067
- return (_openBlock(), _createElementBlock("option", {
1068
- key: model,
1069
- value: model
1070
- }, null, 8 /* PROPS */, ["value"]))
1071
- }), 128 /* KEYED_FRAGMENT */))
1072
- ]))
1073
- : _createCommentVNode("v-if", true),
1074
- (_ctx.modelsSource === 'unlimited')
1075
- ? (_openBlock(), _createElementBlock("div", {
1076
- key: 3,
1077
- class: "config-template-hint"
1078
- }, _toDisplayString(_ctx.t('config.models.unlimited')), 1 /* TEXT */))
1079
- : _createCommentVNode("v-if", true),
1080
- (_ctx.modelsSource === 'error')
1081
- ? (_openBlock(), _createElementBlock("div", {
1082
- key: 4,
1083
- class: "config-template-hint"
1084
- }, _toDisplayString(_ctx.t('config.models.error')), 1 /* TEXT */))
1085
- : _createCommentVNode("v-if", true),
1086
- (_ctx.modelsSource === 'remote' && !_ctx.modelsHasCurrent)
1087
- ? (_openBlock(), _createElementBlock("div", {
1088
- key: 5,
1089
- class: "config-template-hint"
1090
- }, _toDisplayString(_ctx.isCodexConfigMode ? _ctx.t('config.models.notInList.codex') : _ctx.t('config.models.notInList.other')), 1 /* TEXT */))
1091
- : _createCommentVNode("v-if", true),
1092
- (_ctx.isCodexConfigMode)
1093
- ? (_openBlock(), _createElementBlock("div", {
1094
- key: 6,
1095
- class: "config-template-hint"
1096
- }, _toDisplayString(_ctx.t('config.template.editFirst')), 1 /* TEXT */))
1097
- : (_ctx.activeProviderBridgeHint)
1098
- ? (_openBlock(), _createElementBlock("div", {
1099
- key: 7,
1100
- class: "config-template-hint"
1101
- }, _toDisplayString(_ctx.t('config.template.bridgeCodexOnly', { hint: _ctx.activeProviderBridgeHint })), 1 /* TEXT */))
1102
- : _createCommentVNode("v-if", true),
1103
- (_ctx.isCodexConfigMode)
1104
- ? (_openBlock(), _createElementBlock("button", {
1105
- key: 8,
1106
- class: "btn-tool btn-template-editor",
1107
- onClick: _ctx.openConfigTemplateEditor,
1108
- disabled: _ctx.loading || !!_ctx.initError
1109
- }, _toDisplayString(_ctx.t('config.template.openEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]))
1110
- : _createCommentVNode("v-if", true)
1111
- ]),
1112
- (_ctx.isCodexConfigMode)
1113
- ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [
1114
- _createElementVNode("div", { class: "config-row" }, [
1115
- _createElementVNode("div", {
1116
- class: "selector-section",
1117
- style: {"flex":"1"}
958
+ _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
959
+ _createElementVNode("input", {
960
+ type: "checkbox",
961
+ checked: _ctx.isToolConfigWriteAllowed('codex'),
962
+ disabled: _ctx.toolConfigPermissionSaving.codex,
963
+ onChange: $event => (_ctx.setToolConfigPermission('codex', $event.target.checked))
964
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "disabled", "onChange"]),
965
+ _createElementVNode("span", { class: "toggle-track" }, [
966
+ _createElementVNode("span", { class: "toggle-thumb" })
967
+ ]),
968
+ _createElementVNode("span", null, _toDisplayString(_ctx.toolConfigPermissionStatusLabel('codex')), 1 /* TEXT */)
969
+ ])
970
+ ], 8 /* PROPS */, ["aria-label"]),
971
+ _createElementVNode("div", {
972
+ class: _normalizeClass(["tool-config-write-scope", { locked: !_ctx.isToolConfigWriteAllowed('codex') }])
973
+ }, [
974
+ _createElementVNode("div", { class: "tool-config-write-body" }, [
975
+ (!_ctx.loading && !_ctx.initError)
976
+ ? (_openBlock(), _createElementBlock("button", {
977
+ key: 0,
978
+ class: "btn-add",
979
+ onClick: $event => {_ctx.showAddProviderKey = false; _ctx.showAddModal = true},
980
+ disabled: !_ctx.isToolConfigWriteAllowed('codex')
1118
981
  }, [
1119
- _createElementVNode("div", { class: "selector-header" }, [
1120
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.serviceTier')), 1 /* TEXT */)
1121
- ]),
1122
- _withDirectives(_createElementVNode("select", {
1123
- class: "model-select",
1124
- "onUpdate:modelValue": $event => ((_ctx.serviceTier) = $event),
1125
- onChange: _ctx.onServiceTierChange
982
+ (_openBlock(), _createElementBlock("svg", {
983
+ class: "icon",
984
+ viewBox: "0 0 20 20",
985
+ fill: "none",
986
+ stroke: "currentColor",
987
+ "stroke-width": "2"
1126
988
  }, [
1127
- _createElementVNode("option", { value: "fast" }, _toDisplayString(_ctx.t('config.serviceTier.fast')), 1 /* TEXT */),
1128
- _createElementVNode("option", { value: "standard" }, _toDisplayString(_ctx.t('config.serviceTier.standard')), 1 /* TEXT */)
1129
- ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange"]), [
1130
- [_vModelSelect, _ctx.serviceTier]
1131
- ]),
1132
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.serviceTier.hint', { field: 'service_tier' })), 1 /* TEXT */)
1133
- ]),
1134
- _createElementVNode("div", {
1135
- class: "selector-section",
1136
- style: {"flex":"1"}
989
+ _createElementVNode("path", { d: "M10 4v12M4 10h12" })
990
+ ])),
991
+ _createTextVNode(" " + _toDisplayString(_ctx.t('config.addProvider')), 1 /* TEXT */)
992
+ ], 8 /* PROPS */, ["onClick", "disabled"]))
993
+ : _createCommentVNode("v-if", true),
994
+ (_ctx.isCodexConfigMode && _ctx.codexProviderTemplates.length)
995
+ ? (_openBlock(), _createElementBlock("div", {
996
+ key: 1,
997
+ class: "selector-section"
1137
998
  }, [
1138
999
  _createElementVNode("div", { class: "selector-header" }, [
1139
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.reasoningEffort')), 1 /* TEXT */)
1000
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.providerTemplate.title')), 1 /* TEXT */)
1140
1001
  ]),
1141
- _withDirectives(_createElementVNode("select", {
1142
- class: "model-select",
1143
- "onUpdate:modelValue": $event => ((_ctx.modelReasoningEffort) = $event),
1144
- onChange: _ctx.onReasoningEffortChange
1002
+ _createElementVNode("div", {
1003
+ class: "btn-group",
1004
+ style: {"flex-wrap":"wrap","gap":"8px","margin-top":"0"}
1145
1005
  }, [
1146
- _createElementVNode("option", { value: "high" }, "high"),
1147
- _createElementVNode("option", { value: "medium" }, _toDisplayString(_ctx.t('config.reasoningEffort.medium')), 1 /* TEXT */),
1148
- _createElementVNode("option", { value: "low" }, "low"),
1149
- _createElementVNode("option", { value: "xhigh" }, "xhigh")
1150
- ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange"]), [
1151
- [_vModelSelect, _ctx.modelReasoningEffort]
1152
- ]),
1153
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.reasoningEffort.hint')), 1 /* TEXT */)
1006
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.codexProviderTemplates, (tpl) => {
1007
+ return (_openBlock(), _createElementBlock("button", {
1008
+ key: tpl.name,
1009
+ type: "button",
1010
+ class: "btn-mini",
1011
+ onClick: $event => {_ctx.newProvider.name = tpl.name; _ctx.newProvider.url = tpl.url; _ctx.newProvider.model = tpl.model || ''; _ctx.newProvider.useTransform = !!tpl.useTransform; _ctx.showAddProviderKey = false; _ctx.showAddModal = true}
1012
+ }, _toDisplayString(tpl.label), 9 /* TEXT, PROPS */, ["onClick"]))
1013
+ }), 128 /* KEYED_FRAGMENT */))
1014
+ ])
1015
+ ]))
1016
+ : _createCommentVNode("v-if", true),
1017
+ _createElementVNode("div", { class: "selector-section" }, [
1018
+ _createElementVNode("div", { class: "selector-header" }, [
1019
+ _createElementVNode("span", { class: "selector-title" }, "AGENTS.md")
1020
+ ]),
1021
+ _createElementVNode("button", {
1022
+ class: "btn-tool",
1023
+ onClick: _ctx.openAgentsEditor,
1024
+ disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
1025
+ }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('config.agents.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1026
+ ]),
1027
+ _createElementVNode("div", { class: "selector-section" }, [
1028
+ _createElementVNode("div", { class: "selector-header" }, [
1029
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.models')), 1 /* TEXT */),
1030
+ _createElementVNode("div", { class: "selector-actions" }, [
1031
+ (_ctx.modelsSource === 'legacy')
1032
+ ? (_openBlock(), _createElementBlock("button", {
1033
+ key: 0,
1034
+ class: "btn-icon",
1035
+ onClick: $event => (_ctx.showModelModal = true),
1036
+ "aria-label": _ctx.t('modal.modelAdd.title'),
1037
+ title: _ctx.t('modal.modelAdd.title')
1038
+ }, "+", 8 /* PROPS */, ["onClick", "aria-label", "title"]))
1039
+ : _createCommentVNode("v-if", true),
1040
+ (_ctx.modelsSource === 'legacy')
1041
+ ? (_openBlock(), _createElementBlock("button", {
1042
+ key: 1,
1043
+ class: "btn-icon",
1044
+ onClick: $event => (_ctx.showModelListModal = true),
1045
+ "aria-label": _ctx.t('modal.modelManage.title'),
1046
+ title: _ctx.t('modal.modelManage.title')
1047
+ }, "≡", 8 /* PROPS */, ["onClick", "aria-label", "title"]))
1048
+ : _createCommentVNode("v-if", true)
1154
1049
  ])
1155
1050
  ]),
1156
- _createElementVNode("div", { class: "selector-section" }, [
1157
- _createElementVNode("div", { class: "selector-header" }, [
1158
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.contextBudget')), 1 /* TEXT */),
1159
- _createElementVNode("div", { class: "selector-actions" }, [
1160
- _createElementVNode("button", {
1161
- class: "btn-tool btn-tool-compact",
1162
- onClick: _ctx.resetCodexContextBudgetDefaults,
1163
- disabled: _ctx.loading || !!_ctx.initError || _ctx.codexApplying
1164
- }, _toDisplayString(_ctx.t('config.reset')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1051
+ (_ctx.codexModelsLoading || _ctx.modelsSource === 'remote')
1052
+ ? _withDirectives((_openBlock(), _createElementBlock("select", {
1053
+ key: 0,
1054
+ class: "model-select",
1055
+ "onUpdate:modelValue": $event => ((_ctx.currentModel) = $event),
1056
+ onChange: _ctx.onModelChange,
1057
+ disabled: _ctx.codexModelsLoading
1058
+ }, [
1059
+ (_ctx.codexModelsLoading)
1060
+ ? (_openBlock(), _createElementBlock("option", {
1061
+ key: 0,
1062
+ value: ""
1063
+ }, _toDisplayString(_ctx.t('config.modelLoading')), 1 /* TEXT */))
1064
+ : (_openBlock(true), _createElementBlock(_Fragment, { key: 1 }, _renderList(_ctx.codexModelOptions, (model) => {
1065
+ return (_openBlock(), _createElementBlock("option", {
1066
+ key: model,
1067
+ value: model
1068
+ }, _toDisplayString(model), 9 /* TEXT, PROPS */, ["value"]))
1069
+ }), 128 /* KEYED_FRAGMENT */))
1070
+ ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "disabled"])), [
1071
+ [_vModelSelect, _ctx.currentModel]
1165
1072
  ])
1166
- ]),
1167
- _createElementVNode("div", { class: "codex-config-grid" }, [
1168
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
1169
- _createElementVNode("label", {
1170
- class: "form-label",
1171
- for: "codex-model-context-window"
1172
- }, "model_context_window"),
1173
- _withDirectives(_createElementVNode("input", {
1174
- id: "codex-model-context-window",
1175
- "onUpdate:modelValue": $event => ((_ctx.modelContextWindowInput) = $event),
1176
- class: "form-input",
1177
- inputmode: "numeric",
1178
- autocomplete: "off",
1179
- placeholder: _ctx.t('config.example', { value: 190000 }),
1180
- onFocus: $event => (_ctx.editingCodexBudgetField = 'modelContextWindowInput'),
1181
- onInput: $event => (_ctx.sanitizePositiveIntegerDraft('modelContextWindowInput')),
1182
- onBlur: _ctx.onModelContextWindowBlur,
1183
- onKeydown: _withKeys(_withModifiers(_ctx.onModelContextWindowBlur, ["prevent"]), ["enter"])
1184
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onFocus", "onInput", "onBlur", "onKeydown"]), [
1185
- [_vModelText, _ctx.modelContextWindowInput]
1073
+ : _createCommentVNode("v-if", true),
1074
+ (!_ctx.codexModelsLoading && (_ctx.modelsSource !== 'remote' || !_ctx.modelsHasCurrent))
1075
+ ? _withDirectives((_openBlock(), _createElementBlock("input", {
1076
+ key: 1,
1077
+ class: "model-input",
1078
+ "onUpdate:modelValue": $event => ((_ctx.currentModel) = $event),
1079
+ onBlur: _ctx.onModelChange,
1080
+ onKeyup: _withKeys(_ctx.onModelChange, ["enter"]),
1081
+ placeholder: _ctx.activeProviderModelPlaceholder,
1082
+ list: _ctx.codexModelHasList ? 'codex-model-options' : null
1083
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur", "onKeyup", "placeholder", "list"])), [
1084
+ [_vModelText, _ctx.currentModel]
1085
+ ])
1086
+ : _createCommentVNode("v-if", true),
1087
+ (_ctx.codexModelHasList)
1088
+ ? (_openBlock(), _createElementBlock("datalist", {
1089
+ key: 2,
1090
+ id: "codex-model-options"
1091
+ }, [
1092
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.codexModelOptions, (model) => {
1093
+ return (_openBlock(), _createElementBlock("option", {
1094
+ key: model,
1095
+ value: model
1096
+ }, null, 8 /* PROPS */, ["value"]))
1097
+ }), 128 /* KEYED_FRAGMENT */))
1098
+ ]))
1099
+ : _createCommentVNode("v-if", true),
1100
+ (_ctx.modelsSource === 'unlimited')
1101
+ ? (_openBlock(), _createElementBlock("div", {
1102
+ key: 3,
1103
+ class: "config-template-hint"
1104
+ }, _toDisplayString(_ctx.t('config.models.unlimited')), 1 /* TEXT */))
1105
+ : _createCommentVNode("v-if", true),
1106
+ (_ctx.modelsSource === 'error')
1107
+ ? (_openBlock(), _createElementBlock("div", {
1108
+ key: 4,
1109
+ class: "config-template-hint"
1110
+ }, _toDisplayString(_ctx.t('config.models.error')), 1 /* TEXT */))
1111
+ : _createCommentVNode("v-if", true),
1112
+ (_ctx.modelsSource === 'remote' && !_ctx.modelsHasCurrent)
1113
+ ? (_openBlock(), _createElementBlock("div", {
1114
+ key: 5,
1115
+ class: "config-template-hint"
1116
+ }, _toDisplayString(_ctx.isCodexConfigMode ? _ctx.t('config.models.notInList.codex') : _ctx.t('config.models.notInList.other')), 1 /* TEXT */))
1117
+ : _createCommentVNode("v-if", true),
1118
+ (_ctx.isCodexConfigMode)
1119
+ ? (_openBlock(), _createElementBlock("div", {
1120
+ key: 6,
1121
+ class: "config-template-hint"
1122
+ }, _toDisplayString(_ctx.t('config.template.editFirst')), 1 /* TEXT */))
1123
+ : (_ctx.activeProviderBridgeHint)
1124
+ ? (_openBlock(), _createElementBlock("div", {
1125
+ key: 7,
1126
+ class: "config-template-hint"
1127
+ }, _toDisplayString(_ctx.t('config.template.bridgeCodexOnly', { hint: _ctx.activeProviderBridgeHint })), 1 /* TEXT */))
1128
+ : _createCommentVNode("v-if", true),
1129
+ (_ctx.isCodexConfigMode)
1130
+ ? (_openBlock(), _createElementBlock("button", {
1131
+ key: 8,
1132
+ class: "btn-tool btn-template-editor",
1133
+ onClick: _ctx.openConfigTemplateEditor,
1134
+ disabled: _ctx.loading || !!_ctx.initError
1135
+ }, _toDisplayString(_ctx.t('config.template.openEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]))
1136
+ : _createCommentVNode("v-if", true)
1137
+ ]),
1138
+ (_ctx.isCodexConfigMode)
1139
+ ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [
1140
+ _createElementVNode("div", { class: "config-row" }, [
1141
+ _createElementVNode("div", {
1142
+ class: "selector-section",
1143
+ style: {"flex":"1"}
1144
+ }, [
1145
+ _createElementVNode("div", { class: "selector-header" }, [
1146
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.serviceTier')), 1 /* TEXT */)
1147
+ ]),
1148
+ _withDirectives(_createElementVNode("select", {
1149
+ class: "model-select",
1150
+ "onUpdate:modelValue": $event => ((_ctx.serviceTier) = $event),
1151
+ onChange: _ctx.onServiceTierChange
1152
+ }, [
1153
+ _createElementVNode("option", { value: "fast" }, _toDisplayString(_ctx.t('config.serviceTier.fast')), 1 /* TEXT */),
1154
+ _createElementVNode("option", { value: "standard" }, _toDisplayString(_ctx.t('config.serviceTier.standard')), 1 /* TEXT */)
1155
+ ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange"]), [
1156
+ [_vModelSelect, _ctx.serviceTier]
1157
+ ]),
1158
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.serviceTier.hint', { field: 'service_tier' })), 1 /* TEXT */)
1159
+ ]),
1160
+ _createElementVNode("div", {
1161
+ class: "selector-section",
1162
+ style: {"flex":"1"}
1163
+ }, [
1164
+ _createElementVNode("div", { class: "selector-header" }, [
1165
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.reasoningEffort')), 1 /* TEXT */)
1166
+ ]),
1167
+ _withDirectives(_createElementVNode("select", {
1168
+ class: "model-select",
1169
+ "onUpdate:modelValue": $event => ((_ctx.modelReasoningEffort) = $event),
1170
+ onChange: _ctx.onReasoningEffortChange
1171
+ }, [
1172
+ _createElementVNode("option", { value: "high" }, "high"),
1173
+ _createElementVNode("option", { value: "medium" }, _toDisplayString(_ctx.t('config.reasoningEffort.medium')), 1 /* TEXT */),
1174
+ _createElementVNode("option", { value: "low" }, "low"),
1175
+ _createElementVNode("option", { value: "xhigh" }, "xhigh")
1176
+ ], 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange"]), [
1177
+ [_vModelSelect, _ctx.modelReasoningEffort]
1178
+ ]),
1179
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.reasoningEffort.hint')), 1 /* TEXT */)
1180
+ ])
1181
+ ]),
1182
+ _createElementVNode("div", { class: "selector-section" }, [
1183
+ _createElementVNode("div", { class: "selector-header" }, [
1184
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.contextBudget')), 1 /* TEXT */),
1185
+ _createElementVNode("div", { class: "selector-actions" }, [
1186
+ _createElementVNode("button", {
1187
+ class: "btn-tool btn-tool-compact",
1188
+ onClick: _ctx.resetCodexContextBudgetDefaults,
1189
+ disabled: _ctx.loading || !!_ctx.initError || _ctx.codexApplying
1190
+ }, _toDisplayString(_ctx.t('config.reset')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1191
+ ])
1186
1192
  ]),
1187
- _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('config.contextWindow.hint')), 1 /* TEXT */)
1193
+ _createElementVNode("div", { class: "codex-config-grid" }, [
1194
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
1195
+ _createElementVNode("label", {
1196
+ class: "form-label",
1197
+ for: "codex-model-context-window"
1198
+ }, "model_context_window"),
1199
+ _withDirectives(_createElementVNode("input", {
1200
+ id: "codex-model-context-window",
1201
+ "onUpdate:modelValue": $event => ((_ctx.modelContextWindowInput) = $event),
1202
+ class: "form-input",
1203
+ inputmode: "numeric",
1204
+ autocomplete: "off",
1205
+ placeholder: _ctx.t('config.example', { value: 190000 }),
1206
+ onFocus: $event => (_ctx.editingCodexBudgetField = 'modelContextWindowInput'),
1207
+ onInput: $event => (_ctx.sanitizePositiveIntegerDraft('modelContextWindowInput')),
1208
+ onBlur: _ctx.onModelContextWindowBlur,
1209
+ onKeydown: _withKeys(_withModifiers(_ctx.onModelContextWindowBlur, ["prevent"]), ["enter"])
1210
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onFocus", "onInput", "onBlur", "onKeydown"]), [
1211
+ [_vModelText, _ctx.modelContextWindowInput]
1212
+ ]),
1213
+ _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('config.contextWindow.hint')), 1 /* TEXT */)
1214
+ ]),
1215
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
1216
+ _createElementVNode("label", {
1217
+ class: "form-label",
1218
+ for: "codex-model-auto-compact-token-limit"
1219
+ }, "model_auto_compact_token_limit"),
1220
+ _withDirectives(_createElementVNode("input", {
1221
+ id: "codex-model-auto-compact-token-limit",
1222
+ "onUpdate:modelValue": $event => ((_ctx.modelAutoCompactTokenLimitInput) = $event),
1223
+ class: "form-input",
1224
+ inputmode: "numeric",
1225
+ autocomplete: "off",
1226
+ placeholder: _ctx.t('config.example', { value: 185000 }),
1227
+ onFocus: $event => (_ctx.editingCodexBudgetField = 'modelAutoCompactTokenLimitInput'),
1228
+ onInput: $event => (_ctx.sanitizePositiveIntegerDraft('modelAutoCompactTokenLimitInput')),
1229
+ onBlur: _ctx.onModelAutoCompactTokenLimitBlur,
1230
+ onKeydown: _withKeys(_withModifiers(_ctx.onModelAutoCompactTokenLimitBlur, ["prevent"]), ["enter"])
1231
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onFocus", "onInput", "onBlur", "onKeydown"]), [
1232
+ [_vModelText, _ctx.modelAutoCompactTokenLimitInput]
1233
+ ]),
1234
+ _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('config.autoCompact.hint')), 1 /* TEXT */)
1235
+ ])
1236
+ ])
1188
1237
  ]),
1189
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
1190
- _createElementVNode("label", {
1191
- class: "form-label",
1192
- for: "codex-model-auto-compact-token-limit"
1193
- }, "model_auto_compact_token_limit"),
1194
- _withDirectives(_createElementVNode("input", {
1195
- id: "codex-model-auto-compact-token-limit",
1196
- "onUpdate:modelValue": $event => ((_ctx.modelAutoCompactTokenLimitInput) = $event),
1197
- class: "form-input",
1198
- inputmode: "numeric",
1199
- autocomplete: "off",
1200
- placeholder: _ctx.t('config.example', { value: 185000 }),
1201
- onFocus: $event => (_ctx.editingCodexBudgetField = 'modelAutoCompactTokenLimitInput'),
1202
- onInput: $event => (_ctx.sanitizePositiveIntegerDraft('modelAutoCompactTokenLimitInput')),
1203
- onBlur: _ctx.onModelAutoCompactTokenLimitBlur,
1204
- onKeydown: _withKeys(_withModifiers(_ctx.onModelAutoCompactTokenLimitBlur, ["prevent"]), ["enter"])
1205
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onFocus", "onInput", "onBlur", "onKeydown"]), [
1206
- [_vModelText, _ctx.modelAutoCompactTokenLimitInput]
1238
+ _createElementVNode("div", { class: "selector-section" }, [
1239
+ _createElementVNode("div", { class: "selector-header" }, [
1240
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */)
1207
1241
  ]),
1208
- _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('config.autoCompact.hint')), 1 /* TEXT */)
1242
+ _createElementVNode("button", {
1243
+ class: "btn-tool",
1244
+ onClick: _ctx.runHealthCheck,
1245
+ disabled: _ctx.healthCheckLoading || _ctx.loading || !!_ctx.initError
1246
+ }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('config.health.running') : _ctx.t('config.health.run')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
1247
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.health.hint')), 1 /* TEXT */)
1209
1248
  ])
1210
- ])
1211
- ]),
1212
- _createElementVNode("div", { class: "selector-section" }, [
1213
- _createElementVNode("div", { class: "selector-header" }, [
1214
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */)
1215
- ]),
1216
- _createElementVNode("button", {
1217
- class: "btn-tool",
1218
- onClick: _ctx.runHealthCheck,
1219
- disabled: _ctx.healthCheckLoading || _ctx.loading || !!_ctx.initError
1220
- }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('config.health.running') : _ctx.t('config.health.run')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
1221
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.health.hint')), 1 /* TEXT */)
1222
- ])
1223
- ], 64 /* STABLE_FRAGMENT */))
1224
- : _createCommentVNode("v-if", true),
1225
- (!_ctx.loading && !_ctx.initError)
1226
- ? (_openBlock(), _createElementBlock("div", {
1227
- key: 3,
1228
- class: "card-list"
1229
- }, [
1230
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.displayProvidersList, (provider) => {
1231
- return (_openBlock(), _createElementBlock("div", {
1232
- key: provider.name,
1233
- class: _normalizeClass(['card', { active: _ctx.displayCurrentProvider === provider.name, disabled: provider.name === 'local' && _ctx.isLocalProviderDisabled }]),
1234
- onClick: $event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)),
1235
- onKeydown: [
1236
- _withKeys(_withModifiers($event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)), ["self","prevent"]), ["enter"]),
1237
- _withKeys(_withModifiers($event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)), ["self","prevent"]), ["space"])
1238
- ],
1239
- tabindex: provider.name === 'local' && _ctx.isLocalProviderDisabled ? -1 : 0,
1240
- role: "button",
1241
- "aria-current": _ctx.displayCurrentProvider === provider.name ? 'true' : null
1249
+ ], 64 /* STABLE_FRAGMENT */))
1250
+ : _createCommentVNode("v-if", true),
1251
+ (!_ctx.loading && !_ctx.initError)
1252
+ ? (_openBlock(), _createElementBlock("div", {
1253
+ key: 3,
1254
+ class: "card-list"
1242
1255
  }, [
1243
- _createElementVNode("div", { class: "card-leading" }, [
1244
- _createElementVNode("div", { class: "card-icon" }, [
1245
- _createTextVNode(_toDisplayString(provider.name.charAt(0).toUpperCase()), 1 /* TEXT */),
1246
- (_ctx.isTransformProvider(provider))
1247
- ? (_openBlock(), _createElementBlock("span", {
1248
- key: 0,
1249
- class: "card-icon-dot",
1250
- title: _ctx.t('config.transformProvider.title')
1251
- }, null, 8 /* PROPS */, ["title"]))
1252
- : _createCommentVNode("v-if", true)
1253
- ]),
1254
- _createElementVNode("div", { class: "card-content" }, [
1255
- (provider.name === 'local')
1256
- ? (_openBlock(), _createElementBlock("div", {
1257
- key: 0,
1258
- class: "bridge-pool-summary"
1256
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.displayProvidersList, (provider) => {
1257
+ return (_openBlock(), _createElementBlock("div", {
1258
+ key: provider.name,
1259
+ class: _normalizeClass(['card', { active: _ctx.displayCurrentProvider === provider.name, disabled: provider.name === 'local' && _ctx.isLocalProviderDisabled }]),
1260
+ onClick: $event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)),
1261
+ onKeydown: [
1262
+ _withKeys(_withModifiers($event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)), ["self","prevent"]), ["enter"]),
1263
+ _withKeys(_withModifiers($event => ((provider.name === 'local' && _ctx.isLocalProviderDisabled) ? null : _ctx.switchProvider(provider.name)), ["self","prevent"]), ["space"])
1264
+ ],
1265
+ tabindex: provider.name === 'local' && _ctx.isLocalProviderDisabled ? -1 : 0,
1266
+ role: "button",
1267
+ "aria-current": _ctx.displayCurrentProvider === provider.name ? 'true' : null
1268
+ }, [
1269
+ _createElementVNode("div", { class: "card-leading" }, [
1270
+ _createElementVNode("div", { class: "card-icon" }, [
1271
+ _createTextVNode(_toDisplayString(provider.name.charAt(0).toUpperCase()), 1 /* TEXT */),
1272
+ (_ctx.isTransformProvider(provider))
1273
+ ? (_openBlock(), _createElementBlock("span", {
1274
+ key: 0,
1275
+ class: "card-icon-dot",
1276
+ title: _ctx.t('config.transformProvider.title')
1277
+ }, null, 8 /* PROPS */, ["title"]))
1278
+ : _createCommentVNode("v-if", true)
1279
+ ]),
1280
+ _createElementVNode("div", { class: "card-content" }, [
1281
+ (provider.name === 'local')
1282
+ ? (_openBlock(), _createElementBlock("div", {
1283
+ key: 0,
1284
+ class: "bridge-pool-summary"
1285
+ }, [
1286
+ (_openBlock(), _createElementBlock("svg", {
1287
+ class: "bridge-pool-summary-icon",
1288
+ viewBox: "0 0 24 24",
1289
+ fill: "none",
1290
+ stroke: "currentColor",
1291
+ "stroke-width": "2",
1292
+ width: "12",
1293
+ height: "12"
1294
+ }, [
1295
+ _createElementVNode("circle", {
1296
+ cx: "6",
1297
+ cy: "6",
1298
+ r: "2"
1299
+ }),
1300
+ _createElementVNode("circle", {
1301
+ cx: "18",
1302
+ cy: "6",
1303
+ r: "2"
1304
+ }),
1305
+ _createElementVNode("circle", {
1306
+ cx: "12",
1307
+ cy: "18",
1308
+ r: "2"
1309
+ }),
1310
+ _createElementVNode("path", { d: "M6 8v4h6v4" }),
1311
+ _createElementVNode("path", { d: "M18 8v4h-6v4" })
1312
+ ])),
1313
+ _createElementVNode("span", { class: "bridge-pool-summary-text" }, _toDisplayString(_ctx.t('config.localBridge.enabledCount', { enabled: _ctx.localBridgeCandidateProviders().filter(cp => !_ctx.isLocalBridgeExcluded(cp.name)).length, total: _ctx.localBridgeCandidateProviders().length })), 1 /* TEXT */)
1314
+ ]))
1315
+ : _createCommentVNode("v-if", true),
1316
+ _createElementVNode("div", { class: "card-title" }, [
1317
+ _createElementVNode("span", null, _toDisplayString(provider.name), 1 /* TEXT */),
1318
+ (provider.readOnly)
1319
+ ? (_openBlock(), _createElementBlock("span", {
1320
+ key: 0,
1321
+ class: "provider-readonly-badge"
1322
+ }, _toDisplayString(_ctx.t('config.badge.system')), 1 /* TEXT */))
1323
+ : _createCommentVNode("v-if", true)
1324
+ ]),
1325
+ (provider.name !== 'local')
1326
+ ? (_openBlock(), _createElementBlock("div", {
1327
+ key: 1,
1328
+ class: "card-subtitle card-subtitle-model"
1329
+ }, _toDisplayString(_ctx.activeProviderModel(provider.name) || _ctx.t('config.model.unset')), 1 /* TEXT */))
1330
+ : _createCommentVNode("v-if", true),
1331
+ (provider.name !== 'local')
1332
+ ? (_openBlock(), _createElementBlock("div", {
1333
+ key: 2,
1334
+ class: "card-subtitle card-subtitle-url"
1335
+ }, _toDisplayString(_ctx.displayProviderUrl(provider) || _ctx.t('config.url.unset')), 1 /* TEXT */))
1336
+ : _createCommentVNode("v-if", true)
1337
+ ])
1338
+ ]),
1339
+ _createElementVNode("div", { class: "card-trailing" }, [
1340
+ (_ctx.speedResults[provider.name])
1341
+ ? (_openBlock(), _createElementBlock("span", {
1342
+ key: 0,
1343
+ class: _normalizeClass(['latency', _ctx.speedResults[provider.name].ok ? 'ok' : 'error'])
1344
+ }, _toDisplayString(_ctx.formatLatency(_ctx.speedResults[provider.name])), 3 /* TEXT, CLASS */))
1345
+ : _createCommentVNode("v-if", true),
1346
+ _createElementVNode("span", {
1347
+ class: _normalizeClass(['pill', _ctx.providerPillConfigured(provider) ? 'configured' : 'empty'])
1348
+ }, _toDisplayString(_ctx.providerPillText(provider)), 3 /* TEXT, CLASS */),
1349
+ _createElementVNode("div", {
1350
+ class: "card-actions",
1351
+ onClick: _withModifiers(() => {}, ["stop"])
1352
+ }, [
1353
+ (provider.name === 'local')
1354
+ ? (_openBlock(), _createElementBlock("button", {
1355
+ key: 0,
1356
+ class: "card-action-btn bridge-pool-trigger",
1357
+ onClick: $event => (_ctx.showCodexBridgePoolModal = true),
1358
+ "aria-label": _ctx.t('config.localBridge.poolSettings'),
1359
+ title: _ctx.t('config.localBridge.poolSettings')
1360
+ }, [
1361
+ (_openBlock(), _createElementBlock("svg", {
1362
+ viewBox: "0 0 24 24",
1363
+ fill: "none",
1364
+ stroke: "currentColor",
1365
+ "stroke-width": "2"
1366
+ }, [
1367
+ _createElementVNode("circle", {
1368
+ cx: "6",
1369
+ cy: "6",
1370
+ r: "2"
1371
+ }),
1372
+ _createElementVNode("circle", {
1373
+ cx: "18",
1374
+ cy: "6",
1375
+ r: "2"
1376
+ }),
1377
+ _createElementVNode("circle", {
1378
+ cx: "12",
1379
+ cy: "18",
1380
+ r: "2"
1381
+ }),
1382
+ _createElementVNode("path", { d: "M6 8v4h6v4" }),
1383
+ _createElementVNode("path", { d: "M18 8v4h-6v4" })
1384
+ ]))
1385
+ ], 8 /* PROPS */, ["onClick", "aria-label", "title"]))
1386
+ : _createCommentVNode("v-if", true),
1387
+ _createElementVNode("button", {
1388
+ class: _normalizeClass(["card-action-btn", { loading: _ctx.speedLoading[provider.name] }]),
1389
+ disabled: !!_ctx.speedLoading[provider.name],
1390
+ onClick: $event => (_ctx.runSpeedTest(provider.name, { silent: true })),
1391
+ "aria-label": _ctx.t('config.availabilityTestAria', { name: provider.name }),
1392
+ title: _ctx.t('config.availabilityTest')
1259
1393
  }, [
1260
1394
  (_openBlock(), _createElementBlock("svg", {
1261
- class: "bridge-pool-summary-icon",
1262
1395
  viewBox: "0 0 24 24",
1263
1396
  fill: "none",
1264
1397
  stroke: "currentColor",
1265
- "stroke-width": "2",
1266
- width: "12",
1267
- height: "12"
1398
+ "stroke-width": "2"
1268
1399
  }, [
1269
- _createElementVNode("circle", {
1270
- cx: "6",
1271
- cy: "6",
1272
- r: "2"
1273
- }),
1274
- _createElementVNode("circle", {
1275
- cx: "18",
1276
- cy: "6",
1277
- r: "2"
1278
- }),
1279
- _createElementVNode("circle", {
1280
- cx: "12",
1281
- cy: "18",
1282
- r: "2"
1283
- }),
1284
- _createElementVNode("path", { d: "M6 8v4h6v4" }),
1285
- _createElementVNode("path", { d: "M18 8v4h-6v4" })
1286
- ])),
1287
- _createElementVNode("span", { class: "bridge-pool-summary-text" }, _toDisplayString(_ctx.t('config.localBridge.enabledCount', { enabled: _ctx.localBridgeCandidateProviders().filter(cp => !_ctx.isLocalBridgeExcluded(cp.name)).length, total: _ctx.localBridgeCandidateProviders().length })), 1 /* TEXT */)
1288
- ]))
1289
- : _createCommentVNode("v-if", true),
1290
- _createElementVNode("div", { class: "card-title" }, [
1291
- _createElementVNode("span", null, _toDisplayString(provider.name), 1 /* TEXT */),
1292
- (provider.readOnly)
1293
- ? (_openBlock(), _createElementBlock("span", {
1294
- key: 0,
1295
- class: "provider-readonly-badge"
1296
- }, _toDisplayString(_ctx.t('config.badge.system')), 1 /* TEXT */))
1297
- : _createCommentVNode("v-if", true)
1298
- ]),
1299
- (provider.name !== 'local')
1300
- ? (_openBlock(), _createElementBlock("div", {
1301
- key: 1,
1302
- class: "card-subtitle card-subtitle-model"
1303
- }, _toDisplayString(_ctx.activeProviderModel(provider.name) || _ctx.t('config.model.unset')), 1 /* TEXT */))
1304
- : _createCommentVNode("v-if", true),
1305
- (provider.name !== 'local')
1306
- ? (_openBlock(), _createElementBlock("div", {
1307
- key: 2,
1308
- class: "card-subtitle card-subtitle-url"
1309
- }, _toDisplayString(_ctx.displayProviderUrl(provider) || _ctx.t('config.url.unset')), 1 /* TEXT */))
1310
- : _createCommentVNode("v-if", true)
1311
- ])
1312
- ]),
1313
- _createElementVNode("div", { class: "card-trailing" }, [
1314
- (_ctx.speedResults[provider.name])
1315
- ? (_openBlock(), _createElementBlock("span", {
1316
- key: 0,
1317
- class: _normalizeClass(['latency', _ctx.speedResults[provider.name].ok ? 'ok' : 'error'])
1318
- }, _toDisplayString(_ctx.formatLatency(_ctx.speedResults[provider.name])), 3 /* TEXT, CLASS */))
1319
- : _createCommentVNode("v-if", true),
1320
- _createElementVNode("span", {
1321
- class: _normalizeClass(['pill', _ctx.providerPillConfigured(provider) ? 'configured' : 'empty'])
1322
- }, _toDisplayString(_ctx.providerPillText(provider)), 3 /* TEXT, CLASS */),
1323
- _createElementVNode("div", {
1324
- class: "card-actions",
1325
- onClick: _withModifiers(() => {}, ["stop"])
1326
- }, [
1327
- (provider.name === 'local')
1328
- ? (_openBlock(), _createElementBlock("button", {
1329
- key: 0,
1330
- class: "card-action-btn bridge-pool-trigger",
1331
- onClick: $event => (_ctx.showCodexBridgePoolModal = true),
1332
- "aria-label": _ctx.t('config.localBridge.poolSettings'),
1333
- title: _ctx.t('config.localBridge.poolSettings')
1334
- }, [
1335
- (_openBlock(), _createElementBlock("svg", {
1336
- viewBox: "0 0 24 24",
1337
- fill: "none",
1338
- stroke: "currentColor",
1339
- "stroke-width": "2"
1340
- }, [
1341
- _createElementVNode("circle", {
1342
- cx: "6",
1343
- cy: "6",
1344
- r: "2"
1345
- }),
1346
- _createElementVNode("circle", {
1347
- cx: "18",
1348
- cy: "6",
1349
- r: "2"
1350
- }),
1351
- _createElementVNode("circle", {
1352
- cx: "12",
1353
- cy: "18",
1354
- r: "2"
1355
- }),
1356
- _createElementVNode("path", { d: "M6 8v4h6v4" }),
1357
- _createElementVNode("path", { d: "M18 8v4h-6v4" })
1400
+ _createElementVNode("path", { d: "M13 2L3 14h9l-1 8 10-12h-9l1-8z" })
1358
1401
  ]))
1359
- ], 8 /* PROPS */, ["onClick", "aria-label", "title"]))
1360
- : _createCommentVNode("v-if", true),
1361
- _createElementVNode("button", {
1362
- class: _normalizeClass(["card-action-btn", { loading: _ctx.speedLoading[provider.name] }]),
1363
- disabled: !!_ctx.speedLoading[provider.name],
1364
- onClick: $event => (_ctx.runSpeedTest(provider.name, { silent: true })),
1365
- "aria-label": _ctx.t('config.availabilityTestAria', { name: provider.name }),
1366
- title: _ctx.t('config.availabilityTest')
1367
- }, [
1368
- (_openBlock(), _createElementBlock("svg", {
1369
- viewBox: "0 0 24 24",
1370
- fill: "none",
1371
- stroke: "currentColor",
1372
- "stroke-width": "2"
1373
- }, [
1374
- _createElementVNode("path", { d: "M13 2L3 14h9l-1 8 10-12h-9l1-8z" })
1375
- ]))
1376
- ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "aria-label", "title"]),
1377
- _createElementVNode("button", {
1378
- class: "card-action-btn",
1379
- disabled: !_ctx.shouldShowProviderEdit(provider),
1380
- onClick: $event => (_ctx.openEditModal(provider)),
1381
- "aria-label": _ctx.t('config.provider.edit.aria', { name: provider.name }),
1382
- title: _ctx.shouldShowProviderEdit(provider) ? _ctx.t('common.edit') : _ctx.t('common.notEditable')
1383
- }, [
1384
- (_openBlock(), _createElementBlock("svg", {
1385
- viewBox: "0 0 24 24",
1386
- fill: "none",
1387
- stroke: "currentColor",
1388
- "stroke-width": "2"
1389
- }, [
1390
- _createElementVNode("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }),
1391
- _createElementVNode("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" })
1392
- ]))
1393
- ], 8 /* PROPS */, ["disabled", "onClick", "aria-label", "title"]),
1394
- (!provider.readOnly)
1395
- ? (_openBlock(), _createElementBlock("button", {
1396
- key: 1,
1402
+ ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "aria-label", "title"]),
1403
+ _createElementVNode("button", {
1397
1404
  class: "card-action-btn",
1398
- onClick: $event => (_ctx.openCloneProviderModal(provider)),
1399
- "aria-label": _ctx.t('config.provider.clone.aria', { name: provider.name }),
1400
- title: _ctx.t('config.provider.clone')
1401
- }, [
1402
- (_openBlock(), _createElementBlock("svg", {
1403
- viewBox: "0 0 24 24",
1404
- fill: "none",
1405
- stroke: "currentColor",
1406
- "stroke-width": "2"
1407
- }, [
1408
- _createElementVNode("rect", {
1409
- x: "9",
1410
- y: "9",
1411
- width: "13",
1412
- height: "13",
1413
- rx: "2"
1414
- }),
1415
- _createElementVNode("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
1416
- ]))
1417
- ], 8 /* PROPS */, ["onClick", "aria-label", "title"]))
1418
- : _createCommentVNode("v-if", true),
1419
- (!provider.readOnly)
1420
- ? (_openBlock(), _createElementBlock("button", {
1421
- key: 2,
1422
- class: _normalizeClass(["card-action-btn", { loading: _ctx.providerShareLoading[provider.name], disabled: !_ctx.shouldAllowProviderShare(provider) }]),
1423
- disabled: _ctx.providerShareLoading[provider.name] || !_ctx.shouldAllowProviderShare(provider),
1424
- onClick: $event => (_ctx.copyProviderShareCommand(provider)),
1425
- title: _ctx.shouldAllowProviderShare(provider) ? _ctx.t('config.shareCommand') : _ctx.t('config.shareDisabled'),
1426
- "aria-label": _ctx.t('config.shareCommand.aria')
1405
+ disabled: !_ctx.shouldShowProviderEdit(provider),
1406
+ onClick: $event => (_ctx.openEditModal(provider)),
1407
+ "aria-label": _ctx.t('config.provider.edit.aria', { name: provider.name }),
1408
+ title: _ctx.shouldShowProviderEdit(provider) ? _ctx.t('common.edit') : _ctx.t('common.notEditable')
1427
1409
  }, [
1428
1410
  (_openBlock(), _createElementBlock("svg", {
1429
1411
  viewBox: "0 0 24 24",
@@ -1431,38 +1413,101 @@ return function render(_ctx, _cache) {
1431
1413
  stroke: "currentColor",
1432
1414
  "stroke-width": "2"
1433
1415
  }, [
1434
- _createElementVNode("path", { d: "M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7" }),
1435
- _createElementVNode("path", { d: "M16 6l-4-4-4 4" }),
1436
- _createElementVNode("path", { d: "M12 2v14" })
1416
+ _createElementVNode("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }),
1417
+ _createElementVNode("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" })
1437
1418
  ]))
1438
- ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "title", "aria-label"]))
1439
- : _createCommentVNode("v-if", true),
1440
- (!provider.readOnly)
1441
- ? (_openBlock(), _createElementBlock("button", {
1442
- key: 3,
1443
- class: _normalizeClass(["card-action-btn delete", { disabled: !_ctx.shouldShowProviderDelete(provider) }]),
1444
- disabled: !_ctx.shouldShowProviderDelete(provider),
1445
- onClick: $event => (_ctx.deleteProvider(provider.name)),
1446
- "aria-label": _ctx.t('config.provider.delete.aria', { name: provider.name }),
1447
- title: _ctx.shouldShowProviderDelete(provider) ? _ctx.t('common.delete') : _ctx.t('common.notDeletable')
1448
- }, [
1449
- (_openBlock(), _createElementBlock("svg", {
1450
- viewBox: "0 0 24 24",
1451
- fill: "none",
1452
- stroke: "currentColor",
1453
- "stroke-width": "2"
1454
- }, [
1455
- _createElementVNode("path", { d: "M3 6h18" }),
1456
- _createElementVNode("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" })
1457
- ]))
1458
- ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "aria-label", "title"]))
1459
- : _createCommentVNode("v-if", true)
1460
- ], 8 /* PROPS */, ["onClick"])
1461
- ])
1462
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "tabindex", "aria-current"]))
1463
- }), 128 /* KEYED_FRAGMENT */))
1464
- ]))
1465
- : _createCommentVNode("v-if", true)
1419
+ ], 8 /* PROPS */, ["disabled", "onClick", "aria-label", "title"]),
1420
+ (!provider.readOnly)
1421
+ ? (_openBlock(), _createElementBlock("button", {
1422
+ key: 1,
1423
+ class: "card-action-btn",
1424
+ onClick: $event => (_ctx.openCloneProviderModal(provider)),
1425
+ "aria-label": _ctx.t('config.provider.clone.aria', { name: provider.name }),
1426
+ title: _ctx.t('config.provider.clone')
1427
+ }, [
1428
+ (_openBlock(), _createElementBlock("svg", {
1429
+ viewBox: "0 0 24 24",
1430
+ fill: "none",
1431
+ stroke: "currentColor",
1432
+ "stroke-width": "2"
1433
+ }, [
1434
+ _createElementVNode("rect", {
1435
+ x: "9",
1436
+ y: "9",
1437
+ width: "13",
1438
+ height: "13",
1439
+ rx: "2"
1440
+ }),
1441
+ _createElementVNode("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
1442
+ ]))
1443
+ ], 8 /* PROPS */, ["onClick", "aria-label", "title"]))
1444
+ : _createCommentVNode("v-if", true),
1445
+ (!provider.readOnly)
1446
+ ? (_openBlock(), _createElementBlock("button", {
1447
+ key: 2,
1448
+ class: _normalizeClass(["card-action-btn", { loading: _ctx.providerShareLoading[provider.name], disabled: !_ctx.shouldAllowProviderShare(provider) }]),
1449
+ disabled: _ctx.providerShareLoading[provider.name] || !_ctx.shouldAllowProviderShare(provider),
1450
+ onClick: $event => (_ctx.copyProviderShareCommand(provider)),
1451
+ title: _ctx.shouldAllowProviderShare(provider) ? _ctx.t('config.shareCommand') : _ctx.t('config.shareDisabled'),
1452
+ "aria-label": _ctx.t('config.shareCommand.aria')
1453
+ }, [
1454
+ (_openBlock(), _createElementBlock("svg", {
1455
+ viewBox: "0 0 24 24",
1456
+ fill: "none",
1457
+ stroke: "currentColor",
1458
+ "stroke-width": "2"
1459
+ }, [
1460
+ _createElementVNode("path", { d: "M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7" }),
1461
+ _createElementVNode("path", { d: "M16 6l-4-4-4 4" }),
1462
+ _createElementVNode("path", { d: "M12 2v14" })
1463
+ ]))
1464
+ ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "title", "aria-label"]))
1465
+ : _createCommentVNode("v-if", true),
1466
+ (!provider.readOnly)
1467
+ ? (_openBlock(), _createElementBlock("button", {
1468
+ key: 3,
1469
+ class: _normalizeClass(["card-action-btn delete", { disabled: !_ctx.shouldShowProviderDelete(provider) }]),
1470
+ disabled: !_ctx.shouldShowProviderDelete(provider),
1471
+ onClick: $event => (_ctx.deleteProvider(provider.name)),
1472
+ "aria-label": _ctx.t('config.provider.delete.aria', { name: provider.name }),
1473
+ title: _ctx.shouldShowProviderDelete(provider) ? _ctx.t('common.delete') : _ctx.t('common.notDeletable')
1474
+ }, [
1475
+ (_openBlock(), _createElementBlock("svg", {
1476
+ viewBox: "0 0 24 24",
1477
+ fill: "none",
1478
+ stroke: "currentColor",
1479
+ "stroke-width": "2"
1480
+ }, [
1481
+ _createElementVNode("path", { d: "M3 6h18" }),
1482
+ _createElementVNode("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" })
1483
+ ]))
1484
+ ], 10 /* CLASS, PROPS */, ["disabled", "onClick", "aria-label", "title"]))
1485
+ : _createCommentVNode("v-if", true)
1486
+ ], 8 /* PROPS */, ["onClick"])
1487
+ ])
1488
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "tabindex", "aria-current"]))
1489
+ }), 128 /* KEYED_FRAGMENT */))
1490
+ ]))
1491
+ : _createCommentVNode("v-if", true)
1492
+ ]),
1493
+ (!_ctx.isToolConfigWriteAllowed('codex'))
1494
+ ? (_openBlock(), _createElementBlock("div", {
1495
+ key: 0,
1496
+ class: "tool-config-write-overlay"
1497
+ }, [
1498
+ _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
1499
+ _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.codex.lockedTitle')), 1 /* TEXT */),
1500
+ _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.codex.lockedDesc')), 1 /* TEXT */),
1501
+ _createElementVNode("button", {
1502
+ type: "button",
1503
+ class: "btn-tool",
1504
+ onClick: $event => (_ctx.setToolConfigPermission('codex', true)),
1505
+ disabled: _ctx.toolConfigPermissionSaving.codex
1506
+ }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1507
+ ])
1508
+ ]))
1509
+ : _createCommentVNode("v-if", true)
1510
+ ], 2 /* CLASS */)
1466
1511
  ], 64 /* STABLE_FRAGMENT */))
1467
1512
  ], 8 /* PROPS */, ["aria-labelledby"]), [
1468
1513
  [_vShow, _ctx.mainTab === 'config' && _ctx.isProviderConfigMode]
@@ -1527,415 +1572,460 @@ return function render(_ctx, _cache) {
1527
1572
  ])
1528
1573
  ]))
1529
1574
  : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [
1530
- (!_ctx.loading && !_ctx.initError)
1531
- ? (_openBlock(), _createElementBlock("button", {
1532
- key: 0,
1533
- class: "btn-add",
1534
- onClick: _ctx.openClaudeConfigModal
1535
- }, [
1536
- (_openBlock(), _createElementBlock("svg", {
1537
- class: "icon",
1538
- viewBox: "0 0 20 20",
1539
- fill: "none",
1540
- stroke: "currentColor",
1541
- "stroke-width": "2"
1542
- }, [
1543
- _createElementVNode("path", { d: "M10 4v12M4 10h12" })
1544
- ])),
1545
- _createTextVNode(" " + _toDisplayString(_ctx.t('claude.addProvider')), 1 /* TEXT */)
1546
- ], 8 /* PROPS */, ["onClick"]))
1547
- : _createCommentVNode("v-if", true),
1548
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.applyDefault')), 1 /* TEXT */),
1549
- _createElementVNode("div", { class: "selector-section" }, [
1550
- _createElementVNode("div", { class: "selector-header" }, [
1551
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('claude.presetProviders')), 1 /* TEXT */)
1575
+ _createElementVNode("section", {
1576
+ class: "tool-config-write-card",
1577
+ "aria-label": _ctx.t('toolConfig.claude.title')
1578
+ }, [
1579
+ _createElementVNode("div", { class: "tool-config-write-copy" }, [
1580
+ _createElementVNode("div", { class: "tool-config-write-title" }, _toDisplayString(_ctx.t('toolConfig.claude.title')), 1 /* TEXT */),
1581
+ _createElementVNode("p", { class: "tool-config-write-desc" }, _toDisplayString(_ctx.t('toolConfig.claude.desc')), 1 /* TEXT */)
1552
1582
  ]),
1553
- _createElementVNode("div", {
1554
- class: "btn-group",
1555
- style: {"flex-wrap":"wrap","gap":"8px","margin-top":"0"}
1556
- }, [
1557
- _createElementVNode("button", {
1558
- type: "button",
1559
- class: "btn-mini",
1560
- onClick: $event => {_ctx.newClaudeConfig.name = 'Claude Official'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.anthropic.com'; _ctx.newClaudeConfig.model = 'claude-sonnet-4'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1561
- }, "Claude Official", 8 /* PROPS */, ["onClick"]),
1562
- _createElementVNode("button", {
1563
- type: "button",
1564
- class: "btn-mini",
1565
- onClick: $event => {_ctx.newClaudeConfig.name = 'DeepSeek'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.deepseek.com/anthropic'; _ctx.newClaudeConfig.model = 'DeepSeek-V3.2'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1566
- }, "DeepSeek", 8 /* PROPS */, ["onClick"]),
1567
- _createElementVNode("button", {
1568
- type: "button",
1569
- class: "btn-mini",
1570
- onClick: $event => {_ctx.newClaudeConfig.name = 'Zhipu GLM'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://open.bigmodel.cn/api/anthropic'; _ctx.newClaudeConfig.model = 'glm-5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1571
- }, "Zhipu GLM", 8 /* PROPS */, ["onClick"]),
1572
- _createElementVNode("button", {
1573
- type: "button",
1574
- class: "btn-mini",
1575
- onClick: $event => {_ctx.newClaudeConfig.name = 'Z.ai GLM'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.z.ai/api/anthropic'; _ctx.newClaudeConfig.model = 'glm-5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1576
- }, "Z.ai GLM", 8 /* PROPS */, ["onClick"]),
1577
- _createElementVNode("button", {
1578
- type: "button",
1579
- class: "btn-mini",
1580
- onClick: $event => {_ctx.newClaudeConfig.name = 'Qwen Coder'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://coding.dashscope.aliyuncs.com/apps/anthropic'; _ctx.newClaudeConfig.model = 'qwen3-coder'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1581
- }, "Qwen Coder", 8 /* PROPS */, ["onClick"]),
1582
- _createElementVNode("button", {
1583
- type: "button",
1584
- class: "btn-mini",
1585
- onClick: $event => {_ctx.newClaudeConfig.name = 'Kimi k2'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.moonshot.cn/anthropic'; _ctx.newClaudeConfig.model = 'kimi-k2.5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1586
- }, "Kimi k2", 8 /* PROPS */, ["onClick"]),
1587
- _createElementVNode("button", {
1588
- type: "button",
1589
- class: "btn-mini",
1590
- onClick: $event => {_ctx.newClaudeConfig.name = 'Kimi For Coding'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.kimi.com/coding/'; _ctx.newClaudeConfig.model = 'kimi-k2.5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1591
- }, "Kimi For Coding", 8 /* PROPS */, ["onClick"]),
1592
- _createElementVNode("button", {
1593
- type: "button",
1594
- class: "btn-mini",
1595
- onClick: $event => {_ctx.newClaudeConfig.name = 'KAT-Coder'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/claude-code-proxy'; _ctx.newClaudeConfig.model = 'KAT-Coder-Pro V1'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1596
- }, "KAT-Coder", 8 /* PROPS */, ["onClick"]),
1597
- _createElementVNode("button", {
1598
- type: "button",
1599
- class: "btn-mini",
1600
- onClick: $event => {_ctx.newClaudeConfig.name = 'Longcat'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.longcat.chat/anthropic'; _ctx.newClaudeConfig.model = 'LongCat-Flash-Chat'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1601
- }, "Longcat", 8 /* PROPS */, ["onClick"]),
1602
- _createElementVNode("button", {
1603
- type: "button",
1604
- class: "btn-mini",
1605
- onClick: $event => {_ctx.newClaudeConfig.name = 'MiniMax'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.minimaxi.com/anthropic'; _ctx.newClaudeConfig.model = 'MiniMax-M2.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1606
- }, "MiniMax", 8 /* PROPS */, ["onClick"]),
1607
- _createElementVNode("button", {
1608
- type: "button",
1609
- class: "btn-mini",
1610
- onClick: $event => {_ctx.newClaudeConfig.name = 'MiniMax en'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.minimax.io/anthropic'; _ctx.newClaudeConfig.model = 'MiniMax-M2.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1611
- }, "MiniMax en", 8 /* PROPS */, ["onClick"]),
1612
- _createElementVNode("button", {
1613
- type: "button",
1614
- class: "btn-mini",
1615
- onClick: $event => {_ctx.newClaudeConfig.name = 'DouBaoSeed'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://ark.cn-beijing.volces.com/api/coding'; _ctx.newClaudeConfig.model = 'doubao-seed-2-0-code-preview-latest'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1616
- }, "DouBaoSeed", 8 /* PROPS */, ["onClick"]),
1617
- _createElementVNode("button", {
1618
- type: "button",
1619
- class: "btn-mini",
1620
- onClick: $event => {_ctx.newClaudeConfig.name = 'BaiLing'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.tbox.cn/api/anthropic'; _ctx.newClaudeConfig.model = 'Ling-2.5-1T'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1621
- }, "BaiLing", 8 /* PROPS */, ["onClick"]),
1622
- _createElementVNode("button", {
1623
- type: "button",
1624
- class: "btn-mini",
1625
- onClick: $event => {_ctx.newClaudeConfig.name = 'ModelScope'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api-inference.modelscope.cn'; _ctx.newClaudeConfig.model = 'ZhipuAI/GLM-5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1626
- }, "ModelScope", 8 /* PROPS */, ["onClick"]),
1627
- _createElementVNode("button", {
1628
- type: "button",
1629
- class: "btn-mini",
1630
- onClick: $event => {_ctx.newClaudeConfig.name = 'AiHubMix'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://aihubmix.com'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1631
- }, "AiHubMix", 8 /* PROPS */, ["onClick"]),
1632
- _createElementVNode("button", {
1633
- type: "button",
1634
- class: "btn-mini",
1635
- onClick: $event => {_ctx.newClaudeConfig.name = 'DMXAPI'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://www.dmxapi.cn'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1636
- }, "DMXAPI", 8 /* PROPS */, ["onClick"]),
1637
- _createElementVNode("button", {
1638
- type: "button",
1639
- class: "btn-mini",
1640
- onClick: $event => {_ctx.newClaudeConfig.name = 'PackyCode'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://www.packyapi.com'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1641
- }, "PackyCode", 8 /* PROPS */, ["onClick"]),
1642
- _createElementVNode("button", {
1643
- type: "button",
1644
- class: "btn-mini",
1645
- onClick: $event => {_ctx.newClaudeConfig.name = 'AnyRouter'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://anyrouter.top'; _ctx.newClaudeConfig.model = 'claude-opus-4-7[1m]'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1646
- }, "AnyRouter", 8 /* PROPS */, ["onClick"]),
1647
- _createElementVNode("button", {
1648
- type: "button",
1649
- class: "btn-mini",
1650
- onClick: $event => {_ctx.newClaudeConfig.name = 'Xiaomi MiMo'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.xiaomimimo.com/anthropic'; _ctx.newClaudeConfig.model = 'mimo-v2.5-pro'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1651
- }, "Xiaomi MiMo", 8 /* PROPS */, ["onClick"]),
1652
- _createElementVNode("button", {
1653
- type: "button",
1654
- class: "btn-mini",
1655
- onClick: $event => {_ctx.newClaudeConfig.name = 'Xiaomi Token Plan'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://token-plan-cn.xiaomimimo.com/anthropic'; _ctx.newClaudeConfig.model = 'mimo-v2.5-pro'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1656
- }, "Xiaomi Token Plan", 8 /* PROPS */, ["onClick"])
1583
+ _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
1584
+ _createElementVNode("input", {
1585
+ type: "checkbox",
1586
+ checked: _ctx.isToolConfigWriteAllowed('claude'),
1587
+ disabled: _ctx.toolConfigPermissionSaving.claude,
1588
+ onChange: $event => (_ctx.setToolConfigPermission('claude', $event.target.checked))
1589
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "disabled", "onChange"]),
1590
+ _createElementVNode("span", { class: "toggle-track" }, [
1591
+ _createElementVNode("span", { class: "toggle-thumb" })
1592
+ ]),
1593
+ _createElementVNode("span", null, _toDisplayString(_ctx.toolConfigPermissionStatusLabel('claude')), 1 /* TEXT */)
1657
1594
  ])
1658
- ]),
1659
- _createElementVNode("div", { class: "selector-section" }, [
1660
- _createElementVNode("div", { class: "selector-header" }, [
1661
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('claude.model')), 1 /* TEXT */)
1662
- ]),
1663
- (_ctx.claudeModelHasList)
1664
- ? _withDirectives((_openBlock(), _createElementBlock("input", {
1665
- key: 0,
1666
- class: "model-input",
1667
- "onUpdate:modelValue": $event => ((_ctx.currentClaudeModel) = $event),
1668
- onChange: _ctx.onClaudeModelChange,
1669
- onBlur: _ctx.onClaudeModelChange,
1670
- onKeyup: _withKeys(_ctx.onClaudeModelChange, ["enter"]),
1671
- placeholder: _ctx.t('claude.model.placeholder'),
1672
- readonly: _ctx.currentClaudeConfig === 'claude-local',
1673
- list: "claude-model-options"
1674
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "onBlur", "onKeyup", "placeholder", "readonly"])), [
1675
- [_vModelText, _ctx.currentClaudeModel]
1676
- ])
1677
- : _createCommentVNode("v-if", true),
1678
- (_ctx.claudeModelHasList)
1679
- ? (_openBlock(), _createElementBlock("datalist", {
1680
- key: 1,
1681
- id: "claude-model-options"
1682
- }, [
1683
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.claudeModelOptions, (model) => {
1684
- return (_openBlock(), _createElementBlock("option", {
1685
- key: model,
1686
- value: model
1687
- }, null, 8 /* PROPS */, ["value"]))
1688
- }), 128 /* KEYED_FRAGMENT */))
1689
- ]))
1690
- : _withDirectives((_openBlock(), _createElementBlock("input", {
1691
- key: 2,
1692
- class: "model-input",
1693
- "onUpdate:modelValue": $event => ((_ctx.currentClaudeModel) = $event),
1694
- onBlur: _ctx.onClaudeModelChange,
1695
- onKeyup: _withKeys(_ctx.onClaudeModelChange, ["enter"]),
1696
- placeholder: _ctx.t('claude.model.placeholder'),
1697
- readonly: _ctx.currentClaudeConfig === 'claude-local'
1698
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur", "onKeyup", "placeholder", "readonly"])), [
1699
- [_vModelText, _ctx.currentClaudeModel]
1700
- ]),
1701
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.model.hint')), 1 /* TEXT */),
1702
- _createElementVNode("button", {
1703
- class: "btn-tool btn-template-editor",
1704
- onClick: _ctx.openClaudeConfigTemplateEditor,
1705
- disabled: _ctx.loading || !!_ctx.initError
1706
- }, _toDisplayString(_ctx.t('config.template.openEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1707
- ]),
1708
- _createElementVNode("div", { class: "selector-section" }, [
1709
- _createElementVNode("div", { class: "selector-header" }, [
1710
- _createElementVNode("span", { class: "selector-title" }, "CLAUDE.md")
1711
- ]),
1712
- _createElementVNode("button", {
1713
- class: "btn-tool",
1714
- onClick: _ctx.openClaudeMdEditor,
1715
- disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
1716
- }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('claude.md.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
1717
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.md.hint')), 1 /* TEXT */)
1718
- ]),
1719
- _createElementVNode("div", { class: "selector-section" }, [
1720
- _createElementVNode("div", { class: "selector-header" }, [
1721
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */)
1722
- ]),
1723
- _createElementVNode("button", {
1724
- class: "btn-tool",
1725
- onClick: _ctx.runHealthCheck,
1726
- disabled: _ctx.healthCheckLoading || _ctx.loading || !!_ctx.initError
1727
- }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('config.health.running') : _ctx.t('config.health.run')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
1728
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.health.hint')), 1 /* TEXT */)
1729
- ]),
1730
- _createElementVNode("div", { class: "card-list" }, [
1731
- _createElementVNode("div", {
1732
- class: _normalizeClass(['card', { active: _ctx.currentClaudeConfig === 'claude-local', disabled: _ctx.isClaudeLocalBridgeDisabled() }]),
1733
- onClick: $event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()),
1734
- onKeydown: [
1735
- _withKeys(_withModifiers($event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()), ["self","prevent"]), ["enter"]),
1736
- _withKeys(_withModifiers($event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()), ["self","prevent"]), ["space"])
1737
- ],
1738
- tabindex: _ctx.isClaudeLocalBridgeDisabled() ? -1 : 0,
1739
- role: "button",
1740
- "aria-current": _ctx.currentClaudeConfig === 'claude-local' ? 'true' : null
1741
- }, [
1742
- _createElementVNode("div", { class: "card-leading" }, [
1743
- _createElementVNode("div", { class: "card-icon" }, "L"),
1744
- _createElementVNode("div", { class: "card-content" }, [
1745
- _createElementVNode("div", { class: "bridge-pool-summary" }, [
1595
+ ], 8 /* PROPS */, ["aria-label"]),
1596
+ _createElementVNode("div", {
1597
+ class: _normalizeClass(["tool-config-write-scope", { locked: !_ctx.isToolConfigWriteAllowed('claude') }])
1598
+ }, [
1599
+ _createElementVNode("div", { class: "tool-config-write-body" }, [
1600
+ (!_ctx.loading && !_ctx.initError)
1601
+ ? (_openBlock(), _createElementBlock("button", {
1602
+ key: 0,
1603
+ class: "btn-add",
1604
+ onClick: _ctx.openClaudeConfigModal,
1605
+ disabled: !_ctx.isToolConfigWriteAllowed('claude')
1606
+ }, [
1746
1607
  (_openBlock(), _createElementBlock("svg", {
1747
- class: "bridge-pool-summary-icon",
1748
- viewBox: "0 0 24 24",
1608
+ class: "icon",
1609
+ viewBox: "0 0 20 20",
1749
1610
  fill: "none",
1750
1611
  stroke: "currentColor",
1751
- "stroke-width": "2",
1752
- width: "12",
1753
- height: "12"
1612
+ "stroke-width": "2"
1754
1613
  }, [
1755
- _createElementVNode("circle", {
1756
- cx: "6",
1757
- cy: "6",
1758
- r: "2"
1759
- }),
1760
- _createElementVNode("circle", {
1761
- cx: "18",
1762
- cy: "6",
1763
- r: "2"
1764
- }),
1765
- _createElementVNode("circle", {
1766
- cx: "12",
1767
- cy: "18",
1768
- r: "2"
1769
- }),
1770
- _createElementVNode("path", { d: "M6 8v4h6v4" }),
1771
- _createElementVNode("path", { d: "M18 8v4h-6v4" })
1614
+ _createElementVNode("path", { d: "M10 4v12M4 10h12" })
1772
1615
  ])),
1773
- _createElementVNode("span", { class: "bridge-pool-summary-text" }, _toDisplayString(_ctx.t('claude.localBridge.enabled')) + " " + _toDisplayString(_ctx.claudeLocalBridgeCandidateProviders().filter(cp => !_ctx.isClaudeLocalBridgeExcluded(cp.name)).length) + " / " + _toDisplayString(_ctx.claudeLocalBridgeCandidateProviders().length), 1 /* TEXT */)
1774
- ]),
1775
- _createElementVNode("div", { class: "card-title" }, [
1776
- _createElementVNode("span", null, "local"),
1777
- _createElementVNode("span", { class: "provider-readonly-badge" }, _toDisplayString(_ctx.t('config.badge.system')), 1 /* TEXT */)
1778
- ])
1779
- ])
1780
- ]),
1781
- _createElementVNode("div", { class: "card-trailing" }, [
1782
- _createElementVNode("span", {
1783
- class: _normalizeClass(['pill', _ctx.claudeLocalBridgeConfigured() ? 'configured' : 'empty'])
1784
- }, _toDisplayString(_ctx.claudeLocalBridgeConfigured() ? _ctx.t('claude.configured') : _ctx.t('claude.notConfigured')), 3 /* TEXT, CLASS */),
1616
+ _createTextVNode(" " + _toDisplayString(_ctx.t('claude.addProvider')), 1 /* TEXT */)
1617
+ ], 8 /* PROPS */, ["onClick", "disabled"]))
1618
+ : _createCommentVNode("v-if", true),
1619
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.applyDefault')), 1 /* TEXT */),
1620
+ _createElementVNode("div", { class: "selector-section" }, [
1621
+ _createElementVNode("div", { class: "selector-header" }, [
1622
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('claude.presetProviders')), 1 /* TEXT */)
1623
+ ]),
1785
1624
  _createElementVNode("div", {
1786
- class: "card-actions",
1787
- onClick: _withModifiers(() => {}, ["stop"])
1625
+ class: "btn-group",
1626
+ style: {"flex-wrap":"wrap","gap":"8px","margin-top":"0"}
1788
1627
  }, [
1789
1628
  _createElementVNode("button", {
1790
- class: "card-action-btn bridge-pool-trigger",
1791
- onClick: $event => (_ctx.showClaudeBridgePoolModal = true),
1792
- "aria-label": _ctx.t('claude.localBridge.poolTitle'),
1793
- title: _ctx.t('claude.localBridge.poolTitle')
1794
- }, [
1795
- (_openBlock(), _createElementBlock("svg", {
1796
- viewBox: "0 0 24 24",
1797
- fill: "none",
1798
- stroke: "currentColor",
1799
- "stroke-width": "2"
1629
+ type: "button",
1630
+ class: "btn-mini",
1631
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Claude Official'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.anthropic.com'; _ctx.newClaudeConfig.model = 'claude-sonnet-4'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1632
+ }, "Claude Official", 8 /* PROPS */, ["onClick"]),
1633
+ _createElementVNode("button", {
1634
+ type: "button",
1635
+ class: "btn-mini",
1636
+ onClick: $event => {_ctx.newClaudeConfig.name = 'DeepSeek'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.deepseek.com/anthropic'; _ctx.newClaudeConfig.model = 'DeepSeek-V3.2'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1637
+ }, "DeepSeek", 8 /* PROPS */, ["onClick"]),
1638
+ _createElementVNode("button", {
1639
+ type: "button",
1640
+ class: "btn-mini",
1641
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Zhipu GLM'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://open.bigmodel.cn/api/anthropic'; _ctx.newClaudeConfig.model = 'glm-5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1642
+ }, "Zhipu GLM", 8 /* PROPS */, ["onClick"]),
1643
+ _createElementVNode("button", {
1644
+ type: "button",
1645
+ class: "btn-mini",
1646
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Z.ai GLM'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.z.ai/api/anthropic'; _ctx.newClaudeConfig.model = 'glm-5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1647
+ }, "Z.ai GLM", 8 /* PROPS */, ["onClick"]),
1648
+ _createElementVNode("button", {
1649
+ type: "button",
1650
+ class: "btn-mini",
1651
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Qwen Coder'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://coding.dashscope.aliyuncs.com/apps/anthropic'; _ctx.newClaudeConfig.model = 'qwen3-coder'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1652
+ }, "Qwen Coder", 8 /* PROPS */, ["onClick"]),
1653
+ _createElementVNode("button", {
1654
+ type: "button",
1655
+ class: "btn-mini",
1656
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Kimi k2'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.moonshot.cn/anthropic'; _ctx.newClaudeConfig.model = 'kimi-k2.5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1657
+ }, "Kimi k2", 8 /* PROPS */, ["onClick"]),
1658
+ _createElementVNode("button", {
1659
+ type: "button",
1660
+ class: "btn-mini",
1661
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Kimi For Coding'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.kimi.com/coding/'; _ctx.newClaudeConfig.model = 'kimi-k2.5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1662
+ }, "Kimi For Coding", 8 /* PROPS */, ["onClick"]),
1663
+ _createElementVNode("button", {
1664
+ type: "button",
1665
+ class: "btn-mini",
1666
+ onClick: $event => {_ctx.newClaudeConfig.name = 'KAT-Coder'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/claude-code-proxy'; _ctx.newClaudeConfig.model = 'KAT-Coder-Pro V1'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1667
+ }, "KAT-Coder", 8 /* PROPS */, ["onClick"]),
1668
+ _createElementVNode("button", {
1669
+ type: "button",
1670
+ class: "btn-mini",
1671
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Longcat'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.longcat.chat/anthropic'; _ctx.newClaudeConfig.model = 'LongCat-Flash-Chat'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1672
+ }, "Longcat", 8 /* PROPS */, ["onClick"]),
1673
+ _createElementVNode("button", {
1674
+ type: "button",
1675
+ class: "btn-mini",
1676
+ onClick: $event => {_ctx.newClaudeConfig.name = 'MiniMax'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.minimaxi.com/anthropic'; _ctx.newClaudeConfig.model = 'MiniMax-M2.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1677
+ }, "MiniMax", 8 /* PROPS */, ["onClick"]),
1678
+ _createElementVNode("button", {
1679
+ type: "button",
1680
+ class: "btn-mini",
1681
+ onClick: $event => {_ctx.newClaudeConfig.name = 'MiniMax en'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.minimax.io/anthropic'; _ctx.newClaudeConfig.model = 'MiniMax-M2.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1682
+ }, "MiniMax en", 8 /* PROPS */, ["onClick"]),
1683
+ _createElementVNode("button", {
1684
+ type: "button",
1685
+ class: "btn-mini",
1686
+ onClick: $event => {_ctx.newClaudeConfig.name = 'DouBaoSeed'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://ark.cn-beijing.volces.com/api/coding'; _ctx.newClaudeConfig.model = 'doubao-seed-2-0-code-preview-latest'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1687
+ }, "DouBaoSeed", 8 /* PROPS */, ["onClick"]),
1688
+ _createElementVNode("button", {
1689
+ type: "button",
1690
+ class: "btn-mini",
1691
+ onClick: $event => {_ctx.newClaudeConfig.name = 'BaiLing'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.tbox.cn/api/anthropic'; _ctx.newClaudeConfig.model = 'Ling-2.5-1T'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1692
+ }, "BaiLing", 8 /* PROPS */, ["onClick"]),
1693
+ _createElementVNode("button", {
1694
+ type: "button",
1695
+ class: "btn-mini",
1696
+ onClick: $event => {_ctx.newClaudeConfig.name = 'ModelScope'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api-inference.modelscope.cn'; _ctx.newClaudeConfig.model = 'ZhipuAI/GLM-5'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1697
+ }, "ModelScope", 8 /* PROPS */, ["onClick"]),
1698
+ _createElementVNode("button", {
1699
+ type: "button",
1700
+ class: "btn-mini",
1701
+ onClick: $event => {_ctx.newClaudeConfig.name = 'AiHubMix'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://aihubmix.com'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1702
+ }, "AiHubMix", 8 /* PROPS */, ["onClick"]),
1703
+ _createElementVNode("button", {
1704
+ type: "button",
1705
+ class: "btn-mini",
1706
+ onClick: $event => {_ctx.newClaudeConfig.name = 'DMXAPI'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://www.dmxapi.cn'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1707
+ }, "DMXAPI", 8 /* PROPS */, ["onClick"]),
1708
+ _createElementVNode("button", {
1709
+ type: "button",
1710
+ class: "btn-mini",
1711
+ onClick: $event => {_ctx.newClaudeConfig.name = 'PackyCode'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://www.packyapi.com'; _ctx.newClaudeConfig.model = 'glm-4.7'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1712
+ }, "PackyCode", 8 /* PROPS */, ["onClick"]),
1713
+ _createElementVNode("button", {
1714
+ type: "button",
1715
+ class: "btn-mini",
1716
+ onClick: $event => {_ctx.newClaudeConfig.name = 'AnyRouter'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://anyrouter.top'; _ctx.newClaudeConfig.model = 'claude-opus-4-7[1m]'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1717
+ }, "AnyRouter", 8 /* PROPS */, ["onClick"]),
1718
+ _createElementVNode("button", {
1719
+ type: "button",
1720
+ class: "btn-mini",
1721
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Xiaomi MiMo'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://api.xiaomimimo.com/anthropic'; _ctx.newClaudeConfig.model = 'mimo-v2.5-pro'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1722
+ }, "Xiaomi MiMo", 8 /* PROPS */, ["onClick"]),
1723
+ _createElementVNode("button", {
1724
+ type: "button",
1725
+ class: "btn-mini",
1726
+ onClick: $event => {_ctx.newClaudeConfig.name = 'Xiaomi Token Plan'; _ctx.newClaudeConfig.apiKey = ''; _ctx.newClaudeConfig.baseUrl = 'https://token-plan-cn.xiaomimimo.com/anthropic'; _ctx.newClaudeConfig.model = 'mimo-v2.5-pro'; _ctx.showAddClaudeConfigKey = false; _ctx.showClaudeConfigModal = true}
1727
+ }, "Xiaomi Token Plan", 8 /* PROPS */, ["onClick"])
1728
+ ])
1729
+ ]),
1730
+ _createElementVNode("div", { class: "selector-section" }, [
1731
+ _createElementVNode("div", { class: "selector-header" }, [
1732
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('claude.model')), 1 /* TEXT */)
1733
+ ]),
1734
+ (_ctx.claudeModelHasList)
1735
+ ? _withDirectives((_openBlock(), _createElementBlock("input", {
1736
+ key: 0,
1737
+ class: "model-input",
1738
+ "onUpdate:modelValue": $event => ((_ctx.currentClaudeModel) = $event),
1739
+ onChange: _ctx.onClaudeModelChange,
1740
+ onBlur: _ctx.onClaudeModelChange,
1741
+ onKeyup: _withKeys(_ctx.onClaudeModelChange, ["enter"]),
1742
+ placeholder: _ctx.t('claude.model.placeholder'),
1743
+ readonly: _ctx.currentClaudeConfig === 'claude-local',
1744
+ list: "claude-model-options"
1745
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange", "onBlur", "onKeyup", "placeholder", "readonly"])), [
1746
+ [_vModelText, _ctx.currentClaudeModel]
1747
+ ])
1748
+ : _createCommentVNode("v-if", true),
1749
+ (_ctx.claudeModelHasList)
1750
+ ? (_openBlock(), _createElementBlock("datalist", {
1751
+ key: 1,
1752
+ id: "claude-model-options"
1800
1753
  }, [
1801
- _createElementVNode("circle", {
1802
- cx: "6",
1803
- cy: "6",
1804
- r: "2"
1805
- }),
1806
- _createElementVNode("circle", {
1807
- cx: "18",
1808
- cy: "6",
1809
- r: "2"
1810
- }),
1811
- _createElementVNode("circle", {
1812
- cx: "12",
1813
- cy: "18",
1814
- r: "2"
1815
- }),
1816
- _createElementVNode("path", { d: "M6 8v4h6v4" }),
1817
- _createElementVNode("path", { d: "M18 8v4h-6v4" })
1754
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.claudeModelOptions, (model) => {
1755
+ return (_openBlock(), _createElementBlock("option", {
1756
+ key: model,
1757
+ value: model
1758
+ }, null, 8 /* PROPS */, ["value"]))
1759
+ }), 128 /* KEYED_FRAGMENT */))
1818
1760
  ]))
1819
- ], 8 /* PROPS */, ["onClick", "aria-label", "title"])
1820
- ], 8 /* PROPS */, ["onClick"])
1821
- ])
1822
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "tabindex", "aria-current"]),
1823
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.claudeConfigs, (config, name) => {
1824
- return (_openBlock(), _createElementBlock("div", {
1825
- key: name,
1826
- class: _normalizeClass(['card', { active: _ctx.currentClaudeConfig === name }]),
1827
- onClick: $event => (_ctx.applyClaudeConfig(name)),
1828
- onKeydown: [
1829
- _withKeys(_withModifiers($event => (_ctx.applyClaudeConfig(name)), ["self","prevent"]), ["enter"]),
1830
- _withKeys(_withModifiers($event => (_ctx.applyClaudeConfig(name)), ["self","prevent"]), ["space"])
1831
- ],
1832
- tabindex: "0",
1833
- role: "button",
1834
- "aria-current": _ctx.currentClaudeConfig === name ? 'true' : null
1835
- }, [
1836
- _createElementVNode("div", { class: "card-leading" }, [
1837
- _createElementVNode("div", { class: "card-icon" }, _toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */),
1838
- _createElementVNode("div", { class: "card-content" }, [
1839
- _createElementVNode("div", { class: "card-title" }, _toDisplayString(name), 1 /* TEXT */),
1840
- _createElementVNode("div", { class: "card-subtitle card-subtitle-model" }, _toDisplayString(config.model || _ctx.t('claude.model.unset')), 1 /* TEXT */),
1841
- (config.baseUrl)
1842
- ? (_openBlock(), _createElementBlock("div", {
1843
- key: 0,
1844
- class: "card-subtitle card-subtitle-url"
1845
- }, _toDisplayString(config.baseUrl), 1 /* TEXT */))
1846
- : _createCommentVNode("v-if", true)
1847
- ])
1761
+ : _withDirectives((_openBlock(), _createElementBlock("input", {
1762
+ key: 2,
1763
+ class: "model-input",
1764
+ "onUpdate:modelValue": $event => ((_ctx.currentClaudeModel) = $event),
1765
+ onBlur: _ctx.onClaudeModelChange,
1766
+ onKeyup: _withKeys(_ctx.onClaudeModelChange, ["enter"]),
1767
+ placeholder: _ctx.t('claude.model.placeholder'),
1768
+ readonly: _ctx.currentClaudeConfig === 'claude-local'
1769
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onBlur", "onKeyup", "placeholder", "readonly"])), [
1770
+ [_vModelText, _ctx.currentClaudeModel]
1771
+ ]),
1772
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.model.hint')), 1 /* TEXT */),
1773
+ _createElementVNode("button", {
1774
+ class: "btn-tool btn-template-editor",
1775
+ onClick: _ctx.openClaudeConfigTemplateEditor,
1776
+ disabled: _ctx.loading || !!_ctx.initError
1777
+ }, _toDisplayString(_ctx.t('config.template.openEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1778
+ ]),
1779
+ _createElementVNode("div", { class: "selector-section" }, [
1780
+ _createElementVNode("div", { class: "selector-header" }, [
1781
+ _createElementVNode("span", { class: "selector-title" }, "CLAUDE.md")
1848
1782
  ]),
1849
- _createElementVNode("div", { class: "card-trailing" }, [
1850
- (_ctx.claudeSpeedResults[name])
1851
- ? (_openBlock(), _createElementBlock("span", {
1852
- key: 0,
1853
- class: _normalizeClass(['latency', _ctx.claudeSpeedResults[name].ok ? 'ok' : 'error'])
1854
- }, _toDisplayString(_ctx.formatLatency(_ctx.claudeSpeedResults[name])), 3 /* TEXT, CLASS */))
1855
- : _createCommentVNode("v-if", true),
1856
- _createElementVNode("span", {
1857
- class: _normalizeClass(['pill', config.hasKey ? 'configured' : 'empty'])
1858
- }, _toDisplayString(config.hasKey ? _ctx.t('claude.configured') : _ctx.t('claude.notConfigured')), 3 /* TEXT, CLASS */),
1859
- _createElementVNode("div", {
1860
- class: "card-actions",
1861
- onClick: _withModifiers(() => {}, ["stop"])
1862
- }, [
1863
- _createElementVNode("button", {
1864
- class: "card-action-btn",
1865
- onClick: $event => (_ctx.openEditConfigModal(name)),
1866
- "aria-label": _ctx.t('claude.action.editAria', { name }),
1867
- title: _ctx.t('claude.action.edit')
1868
- }, [
1869
- (_openBlock(), _createElementBlock("svg", {
1870
- viewBox: "0 0 24 24",
1871
- fill: "none",
1872
- stroke: "currentColor",
1873
- "stroke-width": "2"
1874
- }, [
1875
- _createElementVNode("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }),
1876
- _createElementVNode("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" })
1877
- ]))
1878
- ], 8 /* PROPS */, ["onClick", "aria-label", "title"]),
1879
- _createElementVNode("button", {
1880
- class: "card-action-btn",
1881
- onClick: $event => (_ctx.openCloneClaudeConfigModal(name, config)),
1882
- "aria-label": _ctx.t('claude.action.cloneAria', { name }),
1883
- title: _ctx.t('claude.action.clone')
1783
+ _createElementVNode("button", {
1784
+ class: "btn-tool",
1785
+ onClick: _ctx.openClaudeMdEditor,
1786
+ disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
1787
+ }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('claude.md.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
1788
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.md.hint')), 1 /* TEXT */)
1789
+ ]),
1790
+ _createElementVNode("div", { class: "selector-section" }, [
1791
+ _createElementVNode("div", { class: "selector-header" }, [
1792
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */)
1793
+ ]),
1794
+ _createElementVNode("button", {
1795
+ class: "btn-tool",
1796
+ onClick: _ctx.runHealthCheck,
1797
+ disabled: _ctx.healthCheckLoading || _ctx.loading || !!_ctx.initError
1798
+ }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('config.health.running') : _ctx.t('config.health.run')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
1799
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.health.hint')), 1 /* TEXT */)
1800
+ ]),
1801
+ _createElementVNode("div", { class: "card-list" }, [
1802
+ _createElementVNode("div", {
1803
+ class: _normalizeClass(['card', { active: _ctx.currentClaudeConfig === 'claude-local', disabled: _ctx.isClaudeLocalBridgeDisabled() }]),
1804
+ onClick: $event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()),
1805
+ onKeydown: [
1806
+ _withKeys(_withModifiers($event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()), ["self","prevent"]), ["enter"]),
1807
+ _withKeys(_withModifiers($event => (_ctx.isClaudeLocalBridgeDisabled() ? null : _ctx.applyClaudeLocalBridge()), ["self","prevent"]), ["space"])
1808
+ ],
1809
+ tabindex: _ctx.isClaudeLocalBridgeDisabled() ? -1 : 0,
1810
+ role: "button",
1811
+ "aria-current": _ctx.currentClaudeConfig === 'claude-local' ? 'true' : null
1812
+ }, [
1813
+ _createElementVNode("div", { class: "card-leading" }, [
1814
+ _createElementVNode("div", { class: "card-icon" }, "L"),
1815
+ _createElementVNode("div", { class: "card-content" }, [
1816
+ _createElementVNode("div", { class: "bridge-pool-summary" }, [
1817
+ (_openBlock(), _createElementBlock("svg", {
1818
+ class: "bridge-pool-summary-icon",
1819
+ viewBox: "0 0 24 24",
1820
+ fill: "none",
1821
+ stroke: "currentColor",
1822
+ "stroke-width": "2",
1823
+ width: "12",
1824
+ height: "12"
1825
+ }, [
1826
+ _createElementVNode("circle", {
1827
+ cx: "6",
1828
+ cy: "6",
1829
+ r: "2"
1830
+ }),
1831
+ _createElementVNode("circle", {
1832
+ cx: "18",
1833
+ cy: "6",
1834
+ r: "2"
1835
+ }),
1836
+ _createElementVNode("circle", {
1837
+ cx: "12",
1838
+ cy: "18",
1839
+ r: "2"
1840
+ }),
1841
+ _createElementVNode("path", { d: "M6 8v4h6v4" }),
1842
+ _createElementVNode("path", { d: "M18 8v4h-6v4" })
1843
+ ])),
1844
+ _createElementVNode("span", { class: "bridge-pool-summary-text" }, _toDisplayString(_ctx.t('claude.localBridge.enabled')) + " " + _toDisplayString(_ctx.claudeLocalBridgeCandidateProviders().filter(cp => !_ctx.isClaudeLocalBridgeExcluded(cp.name)).length) + " / " + _toDisplayString(_ctx.claudeLocalBridgeCandidateProviders().length), 1 /* TEXT */)
1845
+ ]),
1846
+ _createElementVNode("div", { class: "card-title" }, [
1847
+ _createElementVNode("span", null, "local"),
1848
+ _createElementVNode("span", { class: "provider-readonly-badge" }, _toDisplayString(_ctx.t('config.badge.system')), 1 /* TEXT */)
1849
+ ])
1850
+ ])
1851
+ ]),
1852
+ _createElementVNode("div", { class: "card-trailing" }, [
1853
+ _createElementVNode("span", {
1854
+ class: _normalizeClass(['pill', _ctx.claudeLocalBridgeConfigured() ? 'configured' : 'empty'])
1855
+ }, _toDisplayString(_ctx.claudeLocalBridgeConfigured() ? _ctx.t('claude.configured') : _ctx.t('claude.notConfigured')), 3 /* TEXT, CLASS */),
1856
+ _createElementVNode("div", {
1857
+ class: "card-actions",
1858
+ onClick: _withModifiers(() => {}, ["stop"])
1884
1859
  }, [
1885
- (_openBlock(), _createElementBlock("svg", {
1886
- viewBox: "0 0 24 24",
1887
- fill: "none",
1888
- stroke: "currentColor",
1889
- "stroke-width": "2"
1860
+ _createElementVNode("button", {
1861
+ class: "card-action-btn bridge-pool-trigger",
1862
+ onClick: $event => (_ctx.showClaudeBridgePoolModal = true),
1863
+ "aria-label": _ctx.t('claude.localBridge.poolTitle'),
1864
+ title: _ctx.t('claude.localBridge.poolTitle')
1890
1865
  }, [
1891
- _createElementVNode("rect", {
1892
- x: "9",
1893
- y: "9",
1894
- width: "13",
1895
- height: "13",
1896
- rx: "2"
1897
- }),
1898
- _createElementVNode("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
1899
- ]))
1900
- ], 8 /* PROPS */, ["onClick", "aria-label", "title"]),
1901
- _createElementVNode("button", {
1902
- class: _normalizeClass(["card-action-btn", { loading: _ctx.claudeShareLoading[name] }]),
1903
- onClick: $event => (_ctx.copyClaudeShareCommand(name)),
1904
- title: _ctx.t('config.shareCommand'),
1905
- "aria-label": _ctx.t('config.shareCommand.aria')
1906
- }, [
1907
- (_openBlock(), _createElementBlock("svg", {
1908
- viewBox: "0 0 24 24",
1909
- fill: "none",
1910
- stroke: "currentColor",
1911
- "stroke-width": "2"
1866
+ (_openBlock(), _createElementBlock("svg", {
1867
+ viewBox: "0 0 24 24",
1868
+ fill: "none",
1869
+ stroke: "currentColor",
1870
+ "stroke-width": "2"
1871
+ }, [
1872
+ _createElementVNode("circle", {
1873
+ cx: "6",
1874
+ cy: "6",
1875
+ r: "2"
1876
+ }),
1877
+ _createElementVNode("circle", {
1878
+ cx: "18",
1879
+ cy: "6",
1880
+ r: "2"
1881
+ }),
1882
+ _createElementVNode("circle", {
1883
+ cx: "12",
1884
+ cy: "18",
1885
+ r: "2"
1886
+ }),
1887
+ _createElementVNode("path", { d: "M6 8v4h6v4" }),
1888
+ _createElementVNode("path", { d: "M18 8v4h-6v4" })
1889
+ ]))
1890
+ ], 8 /* PROPS */, ["onClick", "aria-label", "title"])
1891
+ ], 8 /* PROPS */, ["onClick"])
1892
+ ])
1893
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "tabindex", "aria-current"]),
1894
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.claudeConfigs, (config, name) => {
1895
+ return (_openBlock(), _createElementBlock("div", {
1896
+ key: name,
1897
+ class: _normalizeClass(['card', { active: _ctx.currentClaudeConfig === name }]),
1898
+ onClick: $event => (_ctx.applyClaudeConfig(name)),
1899
+ onKeydown: [
1900
+ _withKeys(_withModifiers($event => (_ctx.applyClaudeConfig(name)), ["self","prevent"]), ["enter"]),
1901
+ _withKeys(_withModifiers($event => (_ctx.applyClaudeConfig(name)), ["self","prevent"]), ["space"])
1902
+ ],
1903
+ tabindex: "0",
1904
+ role: "button",
1905
+ "aria-current": _ctx.currentClaudeConfig === name ? 'true' : null
1906
+ }, [
1907
+ _createElementVNode("div", { class: "card-leading" }, [
1908
+ _createElementVNode("div", { class: "card-icon" }, _toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */),
1909
+ _createElementVNode("div", { class: "card-content" }, [
1910
+ _createElementVNode("div", { class: "card-title" }, _toDisplayString(name), 1 /* TEXT */),
1911
+ _createElementVNode("div", { class: "card-subtitle card-subtitle-model" }, _toDisplayString(config.model || _ctx.t('claude.model.unset')), 1 /* TEXT */),
1912
+ (config.baseUrl)
1913
+ ? (_openBlock(), _createElementBlock("div", {
1914
+ key: 0,
1915
+ class: "card-subtitle card-subtitle-url"
1916
+ }, _toDisplayString(config.baseUrl), 1 /* TEXT */))
1917
+ : _createCommentVNode("v-if", true)
1918
+ ])
1919
+ ]),
1920
+ _createElementVNode("div", { class: "card-trailing" }, [
1921
+ (_ctx.claudeSpeedResults[name])
1922
+ ? (_openBlock(), _createElementBlock("span", {
1923
+ key: 0,
1924
+ class: _normalizeClass(['latency', _ctx.claudeSpeedResults[name].ok ? 'ok' : 'error'])
1925
+ }, _toDisplayString(_ctx.formatLatency(_ctx.claudeSpeedResults[name])), 3 /* TEXT, CLASS */))
1926
+ : _createCommentVNode("v-if", true),
1927
+ _createElementVNode("span", {
1928
+ class: _normalizeClass(['pill', config.hasKey ? 'configured' : 'empty'])
1929
+ }, _toDisplayString(config.hasKey ? _ctx.t('claude.configured') : _ctx.t('claude.notConfigured')), 3 /* TEXT, CLASS */),
1930
+ _createElementVNode("div", {
1931
+ class: "card-actions",
1932
+ onClick: _withModifiers(() => {}, ["stop"])
1912
1933
  }, [
1913
- _createElementVNode("path", { d: "M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7" }),
1914
- _createElementVNode("path", { d: "M16 6l-4-4-4 4" }),
1915
- _createElementVNode("path", { d: "M12 2v14" })
1916
- ]))
1917
- ], 10 /* CLASS, PROPS */, ["onClick", "title", "aria-label"]),
1934
+ _createElementVNode("button", {
1935
+ class: "card-action-btn",
1936
+ onClick: $event => (_ctx.openEditConfigModal(name)),
1937
+ "aria-label": _ctx.t('claude.action.editAria', { name }),
1938
+ title: _ctx.t('claude.action.edit')
1939
+ }, [
1940
+ (_openBlock(), _createElementBlock("svg", {
1941
+ viewBox: "0 0 24 24",
1942
+ fill: "none",
1943
+ stroke: "currentColor",
1944
+ "stroke-width": "2"
1945
+ }, [
1946
+ _createElementVNode("path", { d: "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" }),
1947
+ _createElementVNode("path", { d: "M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" })
1948
+ ]))
1949
+ ], 8 /* PROPS */, ["onClick", "aria-label", "title"]),
1950
+ _createElementVNode("button", {
1951
+ class: "card-action-btn",
1952
+ onClick: $event => (_ctx.openCloneClaudeConfigModal(name, config)),
1953
+ "aria-label": _ctx.t('claude.action.cloneAria', { name }),
1954
+ title: _ctx.t('claude.action.clone')
1955
+ }, [
1956
+ (_openBlock(), _createElementBlock("svg", {
1957
+ viewBox: "0 0 24 24",
1958
+ fill: "none",
1959
+ stroke: "currentColor",
1960
+ "stroke-width": "2"
1961
+ }, [
1962
+ _createElementVNode("rect", {
1963
+ x: "9",
1964
+ y: "9",
1965
+ width: "13",
1966
+ height: "13",
1967
+ rx: "2"
1968
+ }),
1969
+ _createElementVNode("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
1970
+ ]))
1971
+ ], 8 /* PROPS */, ["onClick", "aria-label", "title"]),
1972
+ _createElementVNode("button", {
1973
+ class: _normalizeClass(["card-action-btn", { loading: _ctx.claudeShareLoading[name] }]),
1974
+ onClick: $event => (_ctx.copyClaudeShareCommand(name)),
1975
+ title: _ctx.t('config.shareCommand'),
1976
+ "aria-label": _ctx.t('config.shareCommand.aria')
1977
+ }, [
1978
+ (_openBlock(), _createElementBlock("svg", {
1979
+ viewBox: "0 0 24 24",
1980
+ fill: "none",
1981
+ stroke: "currentColor",
1982
+ "stroke-width": "2"
1983
+ }, [
1984
+ _createElementVNode("path", { d: "M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7" }),
1985
+ _createElementVNode("path", { d: "M16 6l-4-4-4 4" }),
1986
+ _createElementVNode("path", { d: "M12 2v14" })
1987
+ ]))
1988
+ ], 10 /* CLASS, PROPS */, ["onClick", "title", "aria-label"]),
1989
+ _createElementVNode("button", {
1990
+ class: "card-action-btn delete",
1991
+ onClick: $event => (_ctx.deleteClaudeConfig(name)),
1992
+ "aria-label": _ctx.t('claude.action.deleteAria', { name }),
1993
+ title: _ctx.t('claude.action.delete')
1994
+ }, [
1995
+ (_openBlock(), _createElementBlock("svg", {
1996
+ viewBox: "0 0 24 24",
1997
+ fill: "none",
1998
+ stroke: "currentColor",
1999
+ "stroke-width": "2"
2000
+ }, [
2001
+ _createElementVNode("path", { d: "M3 6h18" }),
2002
+ _createElementVNode("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" })
2003
+ ]))
2004
+ ], 8 /* PROPS */, ["onClick", "aria-label", "title"])
2005
+ ], 8 /* PROPS */, ["onClick"])
2006
+ ])
2007
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "aria-current"]))
2008
+ }), 128 /* KEYED_FRAGMENT */))
2009
+ ])
2010
+ ]),
2011
+ (!_ctx.isToolConfigWriteAllowed('claude'))
2012
+ ? (_openBlock(), _createElementBlock("div", {
2013
+ key: 0,
2014
+ class: "tool-config-write-overlay"
2015
+ }, [
2016
+ _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
2017
+ _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.claude.lockedTitle')), 1 /* TEXT */),
2018
+ _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.claude.lockedDesc')), 1 /* TEXT */),
1918
2019
  _createElementVNode("button", {
1919
- class: "card-action-btn delete",
1920
- onClick: $event => (_ctx.deleteClaudeConfig(name)),
1921
- "aria-label": _ctx.t('claude.action.deleteAria', { name }),
1922
- title: _ctx.t('claude.action.delete')
1923
- }, [
1924
- (_openBlock(), _createElementBlock("svg", {
1925
- viewBox: "0 0 24 24",
1926
- fill: "none",
1927
- stroke: "currentColor",
1928
- "stroke-width": "2"
1929
- }, [
1930
- _createElementVNode("path", { d: "M3 6h18" }),
1931
- _createElementVNode("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" })
1932
- ]))
1933
- ], 8 /* PROPS */, ["onClick", "aria-label", "title"])
1934
- ], 8 /* PROPS */, ["onClick"])
1935
- ])
1936
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onClick", "onKeydown", "aria-current"]))
1937
- }), 128 /* KEYED_FRAGMENT */))
1938
- ])
2020
+ type: "button",
2021
+ class: "btn-tool",
2022
+ onClick: $event => (_ctx.setToolConfigPermission('claude', true)),
2023
+ disabled: _ctx.toolConfigPermissionSaving.claude
2024
+ }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2025
+ ])
2026
+ ]))
2027
+ : _createCommentVNode("v-if", true)
2028
+ ], 2 /* CLASS */)
1939
2029
  ], 64 /* STABLE_FRAGMENT */))
1940
2030
  ], 8 /* PROPS */, ["aria-labelledby"]), [
1941
2031
  [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'claude']