codexmate 0.1.17 → 0.1.19

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.
@@ -819,11 +819,11 @@ return function render(_ctx, _cache) {
819
819
  "aria-labelledby": 'tab-dashboard'
820
820
  }, [
821
821
  _createElementVNode("div", { class: "selector-section doctor-hero" }, [
822
- _createElementVNode("div", { class: "selector-header" }, [
822
+ _createElementVNode("div", { class: "selector-header doctor-header" }, [
823
823
  _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('dashboard.doctor.title')), 1 /* TEXT */),
824
824
  _createElementVNode("div", { class: "selector-actions" }, [
825
825
  _createElementVNode("button", {
826
- class: "btn-tool btn-tool-compact",
826
+ class: "btn-tool btn-tool-compact doctor-run-btn",
827
827
  onClick: _ctx.runHealthCheck,
828
828
  disabled: _ctx.loading || !!_ctx.initError || _ctx.healthCheckLoading
829
829
  }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('dashboard.doctor.checking') : _ctx.t('dashboard.doctor.runChecks')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
@@ -845,79 +845,87 @@ return function render(_ctx, _cache) {
845
845
  _createElementVNode("strong", null, _toDisplayString(_ctx.inspectorModelLoadStatus), 1 /* TEXT */)
846
846
  ])
847
847
  ]),
848
- (_ctx.healthCheckResult)
849
- ? (_openBlock(), _createElementBlock("div", {
850
- key: 0,
851
- class: _normalizeClass(["doctor-health-result", _ctx.healthCheckResult.ok ? 'ok' : 'error'])
852
- }, [
853
- _createElementVNode("div", { class: "doctor-health-title" }, [
854
- _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('dashboard.health.ok') : _ctx.t('dashboard.health.fail')) + " ", 1 /* TEXT */),
855
- (_ctx.healthCheckResult.issues && _ctx.healthCheckResult.issues.length)
856
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, "(" + _toDisplayString(_ctx.t('dashboard.health.issues', { count: _ctx.healthCheckResult.issues.length })) + ")", 1 /* TEXT */))
857
- : _createCommentVNode("v-if", true)
858
- ])
859
- ], 2 /* CLASS */))
860
- : _createCommentVNode("v-if", true),
861
- (_ctx.healthCheckResult && _ctx.healthCheckResult.report)
862
- ? (_openBlock(), _createElementBlock("div", {
863
- key: 1,
864
- class: "doctor-action-list"
865
- }, [
866
- (_ctx.healthCheckResult.report.issues && _ctx.healthCheckResult.report.issues.length)
867
- ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList(_ctx.healthCheckResult.report.issues, (issue) => {
868
- return (_openBlock(), _createElementBlock("div", {
869
- key: issue.id,
870
- class: "doctor-action-card"
848
+ _createElementVNode("div", { class: "doctor-result-section" }, [
849
+ (_ctx.healthCheckResult)
850
+ ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [
851
+ _createElementVNode("div", {
852
+ class: _normalizeClass(["doctor-health-result", _ctx.healthCheckResult.ok ? 'ok' : 'error'])
853
+ }, [
854
+ _createElementVNode("div", { class: "doctor-health-title" }, [
855
+ _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('dashboard.health.ok') : _ctx.t('dashboard.health.fail')) + " ", 1 /* TEXT */),
856
+ (_ctx.healthCheckResult.issues && _ctx.healthCheckResult.issues.length)
857
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, "(" + _toDisplayString(_ctx.t('dashboard.health.issues', { count: _ctx.healthCheckResult.issues.length })) + ")", 1 /* TEXT */))
858
+ : _createCommentVNode("v-if", true)
859
+ ])
860
+ ], 2 /* CLASS */),
861
+ (_ctx.healthCheckResult.report)
862
+ ? (_openBlock(), _createElementBlock("div", {
863
+ key: 0,
864
+ class: "doctor-action-list"
871
865
  }, [
872
- _createElementVNode("div", { class: "doctor-action-head" }, [
873
- _createElementVNode("div", { class: "doctor-action-title" }, _toDisplayString(issue.problem || (issue.problemKey ? _ctx.t(issue.problemKey, issue.problemParams) : '')), 1 /* TEXT */),
874
- _createElementVNode("div", {
875
- class: _normalizeClass(['doctor-action-severity', issue.severity])
876
- }, _toDisplayString(issue.severityLabel || issue.severity), 3 /* TEXT, CLASS */)
877
- ]),
878
- _createElementVNode("div", { class: "doctor-action-impact" }, _toDisplayString(issue.impact || (issue.impactKey ? _ctx.t(issue.impactKey, issue.impactParams) : '')), 1 /* TEXT */),
879
- (issue.actions && issue.actions.some(action => action && action.type === 'navigate' && action.target))
880
- ? (_openBlock(), _createElementBlock("div", {
881
- key: 0,
882
- class: "doctor-action-buttons"
883
- }, [
884
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(issue.actions, (action, index) => {
885
- return (_openBlock(), _createElementBlock(_Fragment, {
886
- key: issue.id + '-action-' + index
887
- }, [
888
- (action.type === 'navigate' && action.target)
889
- ? (_openBlock(), _createElementBlock("button", {
890
- key: 0,
891
- type: "button",
892
- class: "btn-tool btn-tool-compact",
893
- onClick: $event => (action.target ? _ctx.switchMainTab(action.target) : null)
894
- }, _toDisplayString(action.label || (action.labelKey ? _ctx.t(action.labelKey, action.labelParams) : _ctx.t('dashboard.doctor.open'))), 9 /* TEXT, PROPS */, ["onClick"]))
895
- : _createCommentVNode("v-if", true)
896
- ], 64 /* STABLE_FRAGMENT */))
897
- }), 128 /* KEYED_FRAGMENT */))
898
- ]))
899
- : _createCommentVNode("v-if", true)
866
+ (_ctx.healthCheckResult.report.issues && _ctx.healthCheckResult.report.issues.length)
867
+ ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList(_ctx.healthCheckResult.report.issues, (issue) => {
868
+ return (_openBlock(), _createElementBlock("div", {
869
+ key: issue.id,
870
+ class: "doctor-action-card"
871
+ }, [
872
+ _createElementVNode("div", { class: "doctor-action-head" }, [
873
+ _createElementVNode("div", { class: "doctor-action-title" }, _toDisplayString(issue.problem || (issue.problemKey ? _ctx.t(issue.problemKey, issue.problemParams) : '')), 1 /* TEXT */),
874
+ _createElementVNode("div", {
875
+ class: _normalizeClass(['doctor-action-severity', issue.severity])
876
+ }, _toDisplayString(issue.severityLabel || issue.severity), 3 /* TEXT, CLASS */)
877
+ ]),
878
+ _createElementVNode("div", { class: "doctor-action-impact" }, _toDisplayString(issue.impact || (issue.impactKey ? _ctx.t(issue.impactKey, issue.impactParams) : '')), 1 /* TEXT */),
879
+ (issue.actions && issue.actions.some(action => action && action.type === 'navigate' && action.target))
880
+ ? (_openBlock(), _createElementBlock("div", {
881
+ key: 0,
882
+ class: "doctor-action-buttons"
883
+ }, [
884
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(issue.actions, (action, index) => {
885
+ return (_openBlock(), _createElementBlock(_Fragment, {
886
+ key: issue.id + '-action-' + index
887
+ }, [
888
+ (action.type === 'navigate' && action.target)
889
+ ? (_openBlock(), _createElementBlock("button", {
890
+ key: 0,
891
+ type: "button",
892
+ class: "btn-tool btn-tool-compact",
893
+ onClick: $event => (action.target ? _ctx.switchMainTab(action.target) : null)
894
+ }, _toDisplayString(action.label || (action.labelKey ? _ctx.t(action.labelKey, action.labelParams) : _ctx.t('dashboard.doctor.open'))), 9 /* TEXT, PROPS */, ["onClick"]))
895
+ : _createCommentVNode("v-if", true)
896
+ ], 64 /* STABLE_FRAGMENT */))
897
+ }), 128 /* KEYED_FRAGMENT */))
898
+ ]))
899
+ : _createCommentVNode("v-if", true)
900
+ ]))
901
+ }), 128 /* KEYED_FRAGMENT */))
902
+ : _createCommentVNode("v-if", true),
903
+ _createElementVNode("div", { class: "doctor-action-footer" }, [
904
+ _createElementVNode("button", {
905
+ type: "button",
906
+ class: "btn-tool btn-tool-compact",
907
+ onClick: $event => {_ctx.healthCheckResult && _ctx.healthCheckResult.report
908
+ ? _ctx.downloadTextFile('codexmate-doctor.json', JSON.stringify(_ctx.healthCheckResult.report, null, 2), 'application/json;charset=utf-8')
909
+ : null}
910
+ }, _toDisplayString(_ctx.t('dashboard.doctor.export.json')), 9 /* TEXT, PROPS */, ["onClick"]),
911
+ _createElementVNode("button", {
912
+ type: "button",
913
+ class: "btn-tool btn-tool-compact",
914
+ onClick: $event => {_ctx.healthCheckResult && _ctx.healthCheckResult.report
915
+ ? _ctx.downloadTextFile('codexmate-doctor.md', String(_ctx.healthCheckResult.markdown || ''), 'text/markdown;charset=utf-8')
916
+ : null}
917
+ }, _toDisplayString(_ctx.t('dashboard.doctor.export.md')), 9 /* TEXT, PROPS */, ["onClick"])
918
+ ])
900
919
  ]))
901
- }), 128 /* KEYED_FRAGMENT */))
902
- : _createCommentVNode("v-if", true),
903
- _createElementVNode("div", { class: "doctor-action-footer" }, [
904
- _createElementVNode("button", {
905
- type: "button",
906
- class: "btn-tool btn-tool-compact",
907
- onClick: $event => {_ctx.healthCheckResult && _ctx.healthCheckResult.report
908
- ? _ctx.downloadTextFile('codexmate-doctor.json', JSON.stringify(_ctx.healthCheckResult.report, null, 2), 'application/json;charset=utf-8')
909
- : null}
910
- }, _toDisplayString(_ctx.t('dashboard.doctor.export.json')), 9 /* TEXT, PROPS */, ["onClick"]),
911
- _createElementVNode("button", {
912
- type: "button",
913
- class: "btn-tool btn-tool-compact",
914
- onClick: $event => {_ctx.healthCheckResult && _ctx.healthCheckResult.report
915
- ? _ctx.downloadTextFile('codexmate-doctor.md', String(_ctx.healthCheckResult.markdown || ''), 'text/markdown;charset=utf-8')
916
- : null}
917
- }, _toDisplayString(_ctx.t('dashboard.doctor.export.md')), 9 /* TEXT, PROPS */, ["onClick"])
918
- ])
919
- ]))
920
- : _createCommentVNode("v-if", true),
920
+ : _createCommentVNode("v-if", true)
921
+ ], 64 /* STABLE_FRAGMENT */))
922
+ : (_openBlock(), _createElementBlock("div", {
923
+ key: 1,
924
+ class: "doctor-result-empty"
925
+ }, [
926
+ _createElementVNode("span", { class: "doctor-result-empty-text" }, _toDisplayString(_ctx.t('dashboard.doctor.empty')), 1 /* TEXT */)
927
+ ]))
928
+ ]),
921
929
  _createElementVNode("div", { class: "doctor-grid" }, [
922
930
  _createElementVNode("button", {
923
931
  type: "button",
@@ -3276,350 +3284,6 @@ return function render(_ctx, _cache) {
3276
3284
  }, _toDisplayString(_ctx.t('pi.providers.empty')), 1 /* TEXT */))
3277
3285
  : _createCommentVNode("v-if", true)
3278
3286
  ]),
3279
- (_ctx.editingPiProvider)
3280
- ? (_openBlock(), _createElementBlock("section", {
3281
- key: 0,
3282
- class: "selector-section"
3283
- }, [
3284
- _createElementVNode("div", { class: "selector-header" }, [
3285
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('pi.providers.editorTitle')), 1 /* TEXT */),
3286
- _createElementVNode("div", { class: "settings-tab-actions" }, [
3287
- _createElementVNode("button", {
3288
- type: "button",
3289
- class: "btn-tool",
3290
- onClick: _ctx.savePiProvider,
3291
- disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3292
- }, _toDisplayString(_ctx.t('common.save')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3293
- ])
3294
- ]),
3295
- _createElementVNode("div", { class: "codex-config-grid" }, [
3296
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
3297
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.name')), 1 /* TEXT */),
3298
- _createElementVNode("input", {
3299
- class: "form-input",
3300
- type: "text",
3301
- value: _ctx.piProviderName(_ctx.editingPiProvider.id),
3302
- readonly: ""
3303
- }, null, 8 /* PROPS */, ["value"])
3304
- ]),
3305
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
3306
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.baseUrl')), 1 /* TEXT */),
3307
- _withDirectives(_createElementVNode("input", {
3308
- class: "form-input",
3309
- type: "url",
3310
- "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.baseUrl) = $event),
3311
- autocomplete: "off",
3312
- spellcheck: "false",
3313
- placeholder: "https://"
3314
- }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
3315
- [_vModelText, _ctx.editingPiProvider.form.baseUrl]
3316
- ])
3317
- ]),
3318
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
3319
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.api')), 1 /* TEXT */),
3320
- _withDirectives(_createElementVNode("select", {
3321
- class: "form-input",
3322
- "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.api) = $event),
3323
- disabled: !_ctx.isToolConfigWriteAllowed('pi')
3324
- }, [
3325
- _createElementVNode("option", { value: "openai-completions" }, "openai-completions — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiCompletions')), 1 /* TEXT */),
3326
- _createElementVNode("option", { value: "openai-responses" }, "openai-responses — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiResponses')), 1 /* TEXT */),
3327
- _createElementVNode("option", { value: "anthropic-messages" }, "anthropic-messages — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.anthropicMessages')), 1 /* TEXT */),
3328
- _createElementVNode("option", { value: "google-generative-ai" }, "google-generative-ai — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.googleGenerativeAi')), 1 /* TEXT */),
3329
- (!['openai-completions', 'openai-responses', 'anthropic-messages', 'google-generative-ai'].includes(_ctx.editingPiProvider.form.api))
3330
- ? (_openBlock(), _createElementBlock("option", {
3331
- key: 0,
3332
- value: _ctx.editingPiProvider.form.api
3333
- }, _toDisplayString(_ctx.editingPiProvider.form.api || '—'), 9 /* TEXT, PROPS */, ["value"]))
3334
- : _createCommentVNode("v-if", true)
3335
- ], 8 /* PROPS */, ["onUpdate:modelValue", "disabled"]), [
3336
- [_vModelSelect, _ctx.editingPiProvider.form.api]
3337
- ])
3338
- ]),
3339
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
3340
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.apiKey')), 1 /* TEXT */),
3341
- _createElementVNode("div", { class: "input-with-toggle" }, [
3342
- _withDirectives(_createElementVNode("input", {
3343
- class: "form-input",
3344
- "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.apiKey) = $event),
3345
- type: _ctx.piShowKey ? 'text' : 'password',
3346
- autocomplete: "off",
3347
- spellcheck: "false",
3348
- placeholder: "sk-..."
3349
- }, null, 8 /* PROPS */, ["onUpdate:modelValue", "type"]), [
3350
- [_vModelDynamic, _ctx.editingPiProvider.form.apiKey]
3351
- ]),
3352
- _createElementVNode("button", {
3353
- type: "button",
3354
- class: "input-toggle-btn",
3355
- onMousedown: _withModifiers(() => {}, ["prevent"]),
3356
- onClick: $event => (_ctx.piShowKey = !_ctx.piShowKey),
3357
- title: _ctx.piShowKey ? _ctx.t('common.hide') : _ctx.t('common.show'),
3358
- "aria-label": _ctx.piShowKey ? _ctx.t('common.hide') : _ctx.t('common.show')
3359
- }, [
3360
- (!_ctx.piShowKey)
3361
- ? (_openBlock(), _createElementBlock("svg", {
3362
- key: 0,
3363
- viewBox: "0 0 20 20",
3364
- fill: "none",
3365
- stroke: "currentColor",
3366
- "stroke-width": "1.5",
3367
- width: "16",
3368
- height: "16"
3369
- }, [
3370
- _createElementVNode("path", { d: "M10 4C5 4 1.73 8.11 1 10c.73 1.89 4 6 9 6s8.27-4.11 9-6c-.73-1.89-4-6-9-6z" }),
3371
- _createElementVNode("circle", {
3372
- cx: "10",
3373
- cy: "10",
3374
- r: "3"
3375
- })
3376
- ]))
3377
- : (_openBlock(), _createElementBlock("svg", {
3378
- key: 1,
3379
- viewBox: "0 0 20 20",
3380
- fill: "none",
3381
- stroke: "currentColor",
3382
- "stroke-width": "1.5",
3383
- width: "16",
3384
- height: "16"
3385
- }, [
3386
- _createElementVNode("path", { d: "M2 2l16 16M8.2 4.2A9.9 9.9 0 0 1 10 4c5 0 8.27 4.11 9 6-.44.94-1.5 2.7-3.2 4.2M14.5 14.5A5.9 5.9 0 0 1 10 16c-5 0-8.27-4.11-9-6 .76-1.66 2.2-3.6 4.3-5" })
3387
- ]))
3388
- ], 40 /* PROPS, NEED_HYDRATION */, ["onMousedown", "onClick", "title", "aria-label"])
3389
- ])
3390
- ])
3391
- ]),
3392
- _createElementVNode("div", { class: "form-group" }, [
3393
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.models')), 1 /* TEXT */),
3394
- (_ctx.piRemoteModelsLoading)
3395
- ? (_openBlock(), _createElementBlock("p", {
3396
- key: 0,
3397
- class: "config-template-hint"
3398
- }, _toDisplayString(_ctx.t('pi.providers.models.remoteLoading')), 1 /* TEXT */))
3399
- : (_ctx.piRemoteModelError)
3400
- ? (_openBlock(), _createElementBlock("p", {
3401
- key: 1,
3402
- class: "config-template-hint"
3403
- }, _toDisplayString(_ctx.piRemoteModelError) + " · " + _toDisplayString(_ctx.t('pi.providers.models.remoteFailed')), 1 /* TEXT */))
3404
- : _createCommentVNode("v-if", true),
3405
- _createElementVNode("div", { class: "card-list" }, [
3406
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.editingPiProvider.form.models, (model, index) => {
3407
- return (_openBlock(), _createElementBlock("div", {
3408
- class: "card",
3409
- key: index
3410
- }, [
3411
- _createElementVNode("div", { class: "input-with-toggle" }, [
3412
- _withDirectives(_createElementVNode("input", {
3413
- class: "form-input",
3414
- type: "text",
3415
- "onUpdate:modelValue": $event => ((model.id) = $event),
3416
- autocomplete: "off",
3417
- spellcheck: "false",
3418
- placeholder: "claude-sonnet-4",
3419
- disabled: !_ctx.isToolConfigWriteAllowed('pi'),
3420
- onInput: $event => (_ctx.piModelSearch = model.id)
3421
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "disabled", "onInput"]), [
3422
- [_vModelText, model.id]
3423
- ]),
3424
- _createElementVNode("button", {
3425
- type: "button",
3426
- class: "btn-tool input-toggle-btn",
3427
- onClick: $event => (_ctx.editingPiProvider.form.models.splice(index, 1)),
3428
- disabled: !_ctx.isToolConfigWriteAllowed('pi')
3429
- }, _toDisplayString(_ctx.t('pi.providers.models.remove')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3430
- ])
3431
- ]))
3432
- }), 128 /* KEYED_FRAGMENT */)),
3433
- (_ctx.editingPiProvider.form.models.length === 0)
3434
- ? (_openBlock(), _createElementBlock("div", {
3435
- key: 0,
3436
- class: "card"
3437
- }, [
3438
- _withDirectives(_createElementVNode("input", {
3439
- class: "form-input",
3440
- type: "text",
3441
- "onUpdate:modelValue": $event => ((_ctx.piModelSearch) = $event),
3442
- autocomplete: "off",
3443
- spellcheck: "false",
3444
- placeholder: _ctx.t('pi.providers.models.search'),
3445
- onKeydown: _withKeys(_withModifiers($event => (_ctx.addPiRemoteModel(_ctx.piModelSearch.trim())), ["prevent"]), ["enter"])
3446
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onKeydown"]), [
3447
- [_vModelText, _ctx.piModelSearch]
3448
- ])
3449
- ]))
3450
- : _createCommentVNode("v-if", true),
3451
- (!_ctx.piRemoteModelsLoading && !_ctx.piRemoteModelError && _ctx.piModelSearch.trim() && _ctx.piFilteredRemoteModels().length > 0)
3452
- ? (_openBlock(), _createElementBlock("div", {
3453
- key: 1,
3454
- class: "card"
3455
- }, [
3456
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.piFilteredRemoteModels(), (id) => {
3457
- return (_openBlock(), _createElementBlock("button", {
3458
- type: "button",
3459
- class: "btn-tool",
3460
- style: {"width":"100%","text-align":"left","justify-content":"flex-start"},
3461
- key: id,
3462
- onClick: $event => (_ctx.addPiRemoteModel(id))
3463
- }, _toDisplayString(id), 9 /* TEXT, PROPS */, ["onClick"]))
3464
- }), 128 /* KEYED_FRAGMENT */)),
3465
- _createElementVNode("p", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.models.remoteCount', { count: _ctx.piRemoteModels.length })), 1 /* TEXT */)
3466
- ]))
3467
- : _createCommentVNode("v-if", true),
3468
- (!_ctx.piRemoteModelsLoading && !_ctx.piRemoteModelError && _ctx.piModelSearch.trim() && _ctx.piFilteredRemoteModels().length === 0)
3469
- ? (_openBlock(), _createElementBlock("p", {
3470
- key: 2,
3471
- class: "config-template-hint"
3472
- }, _toDisplayString(_ctx.t('pi.providers.models.noMatch')), 1 /* TEXT */))
3473
- : _createCommentVNode("v-if", true)
3474
- ])
3475
- ]),
3476
- _createElementVNode("div", { class: "settings-tab-actions" }, [
3477
- _createElementVNode("button", {
3478
- type: "button",
3479
- class: "btn-tool",
3480
- onClick: _ctx.confirmDeletePiProvider,
3481
- disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3482
- }, _toDisplayString(_ctx.t('pi.providers.delete')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3483
- ]),
3484
- _createElementVNode("section", { class: "selector-section" }, [
3485
- _createElementVNode("div", { class: "selector-header" }, [
3486
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('pi.providers.json.title')), 1 /* TEXT */)
3487
- ]),
3488
- _createElementVNode("p", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.json.desc')), 1 /* TEXT */),
3489
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.json.previewTitle')), 1 /* TEXT */),
3490
- _createElementVNode("pre", { class: "config-json-preview" }, _toDisplayString(_ctx.piProviderPreviewJson()), 1 /* TEXT */),
3491
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.json.editTitle')), 1 /* TEXT */),
3492
- _withDirectives(_createElementVNode("textarea", {
3493
- class: "template-textarea config-json-editor",
3494
- "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.configJsonDraft) = $event),
3495
- spellcheck: "false",
3496
- autocomplete: "off",
3497
- disabled: !_ctx.isToolConfigWriteAllowed('pi'),
3498
- onInput: _ctx.piEditorJsonDraftInput,
3499
- placeholder: "{}"
3500
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "disabled", "onInput"]), [
3501
- [_vModelText, _ctx.editingPiProvider.form.configJsonDraft]
3502
- ]),
3503
- (_ctx.piEditorJsonError)
3504
- ? (_openBlock(), _createElementBlock("p", {
3505
- key: 0,
3506
- class: "config-template-hint error-text"
3507
- }, _toDisplayString(_ctx.piEditorJsonError), 1 /* TEXT */))
3508
- : _createCommentVNode("v-if", true)
3509
- ])
3510
- ]))
3511
- : _createCommentVNode("v-if", true),
3512
- (_ctx.showAddPiProviderModal)
3513
- ? (_openBlock(), _createElementBlock("section", {
3514
- key: 1,
3515
- class: "selector-section"
3516
- }, [
3517
- _createElementVNode("div", { class: "selector-header" }, [
3518
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('pi.providers.addModal.title')), 1 /* TEXT */),
3519
- _createElementVNode("div", { class: "settings-tab-actions" }, [
3520
- _createElementVNode("button", {
3521
- type: "button",
3522
- class: "btn-tool",
3523
- onClick: _ctx.addPiProviderFromModal,
3524
- disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3525
- }, _toDisplayString(_ctx.t('common.save')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
3526
- _createElementVNode("button", {
3527
- type: "button",
3528
- class: "btn-tool",
3529
- onClick: _ctx.cancelAddPiProviderModal
3530
- }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"])
3531
- ])
3532
- ]),
3533
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.addModal.subtitle')), 1 /* TEXT */),
3534
- _createElementVNode("div", { class: "codex-config-grid" }, [
3535
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
3536
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.addModal.fields.baseUrl')), 1 /* TEXT */),
3537
- _withDirectives(_createElementVNode("input", {
3538
- class: "form-input",
3539
- type: "url",
3540
- "onUpdate:modelValue": $event => ((_ctx.addingPiProviderBaseUrl) = $event),
3541
- autocomplete: "off",
3542
- spellcheck: "false",
3543
- placeholder: "https://",
3544
- onInput: _ctx.onAddingPiEndpointChange
3545
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onInput"]), [
3546
- [_vModelText, _ctx.addingPiProviderBaseUrl]
3547
- ])
3548
- ]),
3549
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
3550
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.addModal.fields.api')), 1 /* TEXT */),
3551
- _withDirectives(_createElementVNode("select", {
3552
- class: "form-input",
3553
- "onUpdate:modelValue": $event => ((_ctx.addingPiProviderApi) = $event)
3554
- }, [
3555
- _createElementVNode("option", { value: "openai-completions" }, "openai-completions — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiCompletions')), 1 /* TEXT */),
3556
- _createElementVNode("option", { value: "openai-responses" }, "openai-responses — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiResponses')), 1 /* TEXT */),
3557
- _createElementVNode("option", { value: "anthropic-messages" }, "anthropic-messages — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.anthropicMessages')), 1 /* TEXT */),
3558
- _createElementVNode("option", { value: "google-generative-ai" }, "google-generative-ai — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.googleGenerativeAi')), 1 /* TEXT */)
3559
- ], 8 /* PROPS */, ["onUpdate:modelValue"]), [
3560
- [_vModelSelect, _ctx.addingPiProviderApi]
3561
- ])
3562
- ]),
3563
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
3564
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.addModal.fields.apiKey')), 1 /* TEXT */),
3565
- _withDirectives(_createElementVNode("input", {
3566
- class: "form-input",
3567
- type: "password",
3568
- "onUpdate:modelValue": $event => ((_ctx.addingPiProviderApiKey) = $event),
3569
- autocomplete: "off",
3570
- spellcheck: "false",
3571
- placeholder: _ctx.t('common.optional'),
3572
- onInput: _ctx.onAddingPiEndpointChange
3573
- }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onInput"]), [
3574
- [_vModelText, _ctx.addingPiProviderApiKey]
3575
- ])
3576
- ]),
3577
- _createElementVNode("div", { class: "form-group codex-config-field" }, [
3578
- _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.models')), 1 /* TEXT */),
3579
- (_ctx.addingPiRemoteLoading)
3580
- ? (_openBlock(), _createElementBlock("p", {
3581
- key: 0,
3582
- class: "config-template-hint"
3583
- }, _toDisplayString(_ctx.t('pi.providers.models.remoteLoading')), 1 /* TEXT */))
3584
- : (_ctx.addingPiRemoteError)
3585
- ? (_openBlock(), _createElementBlock("p", {
3586
- key: 1,
3587
- class: "config-template-hint"
3588
- }, _toDisplayString(_ctx.addingPiRemoteError) + " · " + _toDisplayString(_ctx.t('pi.providers.models.remoteFailed')), 1 /* TEXT */))
3589
- : _createCommentVNode("v-if", true),
3590
- _withDirectives(_createElementVNode("input", {
3591
- class: "form-input",
3592
- type: "text",
3593
- "onUpdate:modelValue": $event => ((_ctx.addingPiProviderModel) = $event),
3594
- autocomplete: "off",
3595
- spellcheck: "false",
3596
- placeholder: _ctx.addingPiRemoteModels.length ? _ctx.t('pi.providers.models.search') : 'claude-sonnet-4'
3597
- }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
3598
- [_vModelText, _ctx.addingPiProviderModel]
3599
- ]),
3600
- (!_ctx.addingPiRemoteLoading && _ctx.addingPiProviderModel.trim() && _ctx.piFilteredAddingRemoteModels().length > 0)
3601
- ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [
3602
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.piFilteredAddingRemoteModels(), (id) => {
3603
- return (_openBlock(), _createElementBlock("button", {
3604
- type: "button",
3605
- class: "btn-tool",
3606
- style: {"width":"100%","text-align":"left","justify-content":"flex-start","margin-top":"8px"},
3607
- key: id,
3608
- onClick: $event => (_ctx.addingPiProviderModel = id)
3609
- }, _toDisplayString(id), 9 /* TEXT, PROPS */, ["onClick"]))
3610
- }), 128 /* KEYED_FRAGMENT */)),
3611
- _createElementVNode("p", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.models.remoteCount', { count: _ctx.addingPiRemoteModels.length })), 1 /* TEXT */)
3612
- ], 64 /* STABLE_FRAGMENT */))
3613
- : (!_ctx.addingPiRemoteLoading && !_ctx.addingPiRemoteError && _ctx.addingPiProviderModel.trim() && _ctx.addingPiRemoteModels.length > 0)
3614
- ? (_openBlock(), _createElementBlock("p", {
3615
- key: 3,
3616
- class: "config-template-hint"
3617
- }, _toDisplayString(_ctx.t('pi.providers.models.noMatch')), 1 /* TEXT */))
3618
- : _createCommentVNode("v-if", true)
3619
- ])
3620
- ])
3621
- ]))
3622
- : _createCommentVNode("v-if", true),
3623
3287
  _createElementVNode("section", { class: "selector-section" }, [
3624
3288
  _createElementVNode("div", { class: "selector-header" }, [
3625
3289
  _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('pi.files.title')), 1 /* TEXT */)
@@ -3824,7 +3488,7 @@ return function render(_ctx, _cache) {
3824
3488
  ]),
3825
3489
  (!_ctx.isToolConfigWriteAllowed('pi'))
3826
3490
  ? (_openBlock(), _createElementBlock("div", {
3827
- key: 2,
3491
+ key: 0,
3828
3492
  class: "tool-config-write-overlay"
3829
3493
  }, [
3830
3494
  _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
@@ -3844,6 +3508,325 @@ return function render(_ctx, _cache) {
3844
3508
  ], 8 /* PROPS */, ["aria-labelledby"]), [
3845
3509
  [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'pi']
3846
3510
  ]),
3511
+ _createCommentVNode(" Pi 新增供应商模板选择模态框 "),
3512
+ (_ctx.showAddPiProviderModal && !_ctx.editingPiProvider)
3513
+ ? (_openBlock(), _createElementBlock("div", {
3514
+ key: 0,
3515
+ class: "modal-overlay",
3516
+ onClick: _withModifiers(_ctx.cancelAddPiProviderModal, ["self"])
3517
+ }, [
3518
+ _createElementVNode("div", {
3519
+ class: "modal modal-wide",
3520
+ role: "dialog",
3521
+ "aria-modal": "true",
3522
+ "aria-labelledby": "pi-provider-picker-modal-title"
3523
+ }, [
3524
+ _createElementVNode("div", {
3525
+ class: "modal-title",
3526
+ id: "pi-provider-picker-modal-title"
3527
+ }, _toDisplayString(_ctx.t('pi.providers.addModal.title')), 1 /* TEXT */),
3528
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.addModal.subtitle')), 1 /* TEXT */),
3529
+ _createElementVNode("div", { class: "pi-picker" }, [
3530
+ _withDirectives(_createElementVNode("input", {
3531
+ class: "form-input",
3532
+ type: "text",
3533
+ "onUpdate:modelValue": $event => ((_ctx.piProviderPickerQuery) = $event),
3534
+ autocomplete: "off",
3535
+ spellcheck: "false",
3536
+ placeholder: _ctx.t('pi.picker.searchPlaceholder')
3537
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
3538
+ [_vModelText, _ctx.piProviderPickerQuery]
3539
+ ]),
3540
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.piProviderTemplateGroups(), (group) => {
3541
+ return (_openBlock(), _createElementBlock("div", {
3542
+ class: "pi-picker-group",
3543
+ key: group.id
3544
+ }, [
3545
+ _createElementVNode("div", { class: "pi-picker-group-title" }, _toDisplayString(_ctx.t(group.i18nKey)), 1 /* TEXT */),
3546
+ _createElementVNode("div", { class: "pi-picker-grid" }, [
3547
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.templates, (tpl) => {
3548
+ return (_openBlock(), _createElementBlock("button", {
3549
+ type: "button",
3550
+ class: "card pi-picker-card",
3551
+ key: tpl.id,
3552
+ onClick: $event => (_ctx.selectPiProviderTemplate(tpl.id))
3553
+ }, [
3554
+ _createElementVNode("span", { class: "card-icon" }, _toDisplayString(tpl.name.charAt(0).toUpperCase()), 1 /* TEXT */),
3555
+ _createElementVNode("span", { class: "pi-picker-card-name" }, _toDisplayString(tpl.name), 1 /* TEXT */),
3556
+ (tpl.baseUrl)
3557
+ ? (_openBlock(), _createElementBlock("span", {
3558
+ key: 0,
3559
+ class: "pi-picker-card-url"
3560
+ }, _toDisplayString(tpl.baseUrl), 1 /* TEXT */))
3561
+ : _createCommentVNode("v-if", true)
3562
+ ], 8 /* PROPS */, ["onClick"]))
3563
+ }), 128 /* KEYED_FRAGMENT */))
3564
+ ])
3565
+ ]))
3566
+ }), 128 /* KEYED_FRAGMENT */)),
3567
+ (_ctx.piProviderPickerQuery.trim() && !_ctx.piProviderTemplateGroups().length)
3568
+ ? (_openBlock(), _createElementBlock("p", {
3569
+ key: 0,
3570
+ class: "config-template-hint"
3571
+ }, _toDisplayString(_ctx.t('pi.picker.empty')), 1 /* TEXT */))
3572
+ : _createCommentVNode("v-if", true)
3573
+ ]),
3574
+ _createElementVNode("div", { class: "btn-group" }, [
3575
+ _createElementVNode("button", {
3576
+ class: "btn btn-cancel",
3577
+ onClick: _ctx.cancelAddPiProviderModal
3578
+ }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"])
3579
+ ])
3580
+ ])
3581
+ ], 8 /* PROPS */, ["onClick"]))
3582
+ : _createCommentVNode("v-if", true),
3583
+ _createCommentVNode(" Pi 供应商编辑器模态框 "),
3584
+ (_ctx.editingPiProvider)
3585
+ ? (_openBlock(), _createElementBlock("div", {
3586
+ key: 1,
3587
+ class: "modal-overlay",
3588
+ onClick: _withModifiers(_ctx.closePiProviderEditor, ["self"])
3589
+ }, [
3590
+ _createElementVNode("div", {
3591
+ class: "modal modal-wide",
3592
+ role: "dialog",
3593
+ "aria-modal": "true",
3594
+ "aria-labelledby": "pi-provider-editor-modal-title"
3595
+ }, [
3596
+ _createElementVNode("div", {
3597
+ class: "modal-title",
3598
+ id: "pi-provider-editor-modal-title"
3599
+ }, _toDisplayString(_ctx.editingPiProvider.isNew ? _ctx.t('pi.providers.addModal.title') : _ctx.t('pi.providers.editorTitle')), 1 /* TEXT */),
3600
+ (!_ctx.editingPiProvider.isNew)
3601
+ ? (_openBlock(), _createElementBlock("div", {
3602
+ key: 0,
3603
+ class: "form-group"
3604
+ }, [
3605
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.name')), 1 /* TEXT */),
3606
+ _createElementVNode("input", {
3607
+ class: "form-input",
3608
+ type: "text",
3609
+ value: _ctx.piProviderName(_ctx.editingPiProvider.id),
3610
+ readonly: ""
3611
+ }, null, 8 /* PROPS */, ["value"])
3612
+ ]))
3613
+ : _createCommentVNode("v-if", true),
3614
+ _createElementVNode("div", { class: "form-group" }, [
3615
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.baseUrl')), 1 /* TEXT */),
3616
+ _withDirectives(_createElementVNode("input", {
3617
+ class: "form-input",
3618
+ type: "url",
3619
+ "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.baseUrl) = $event),
3620
+ autocomplete: "off",
3621
+ spellcheck: "false",
3622
+ placeholder: "https://",
3623
+ onChange: _ctx.fetchPiRemoteModels
3624
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onChange"]), [
3625
+ [_vModelText, _ctx.editingPiProvider.form.baseUrl]
3626
+ ])
3627
+ ]),
3628
+ _createElementVNode("div", { class: "form-group" }, [
3629
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.api')), 1 /* TEXT */),
3630
+ _withDirectives(_createElementVNode("select", {
3631
+ class: "form-input",
3632
+ "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.api) = $event),
3633
+ disabled: !_ctx.isToolConfigWriteAllowed('pi')
3634
+ }, [
3635
+ _createElementVNode("option", { value: "openai-completions" }, "openai-completions — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiCompletions')), 1 /* TEXT */),
3636
+ _createElementVNode("option", { value: "openai-responses" }, "openai-responses — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiResponses')), 1 /* TEXT */),
3637
+ _createElementVNode("option", { value: "anthropic-messages" }, "anthropic-messages — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.anthropicMessages')), 1 /* TEXT */),
3638
+ _createElementVNode("option", { value: "google-generative-ai" }, "google-generative-ai — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.googleGenerativeAi')), 1 /* TEXT */),
3639
+ (!['openai-completions', 'openai-responses', 'anthropic-messages', 'google-generative-ai'].includes(_ctx.editingPiProvider.form.api))
3640
+ ? (_openBlock(), _createElementBlock("option", {
3641
+ key: 0,
3642
+ value: _ctx.editingPiProvider.form.api
3643
+ }, _toDisplayString(_ctx.editingPiProvider.form.api || '—'), 9 /* TEXT, PROPS */, ["value"]))
3644
+ : _createCommentVNode("v-if", true)
3645
+ ], 8 /* PROPS */, ["onUpdate:modelValue", "disabled"]), [
3646
+ [_vModelSelect, _ctx.editingPiProvider.form.api]
3647
+ ])
3648
+ ]),
3649
+ _createElementVNode("div", { class: "form-group" }, [
3650
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.apiKey')), 1 /* TEXT */),
3651
+ _createElementVNode("div", { class: "input-with-toggle" }, [
3652
+ _withDirectives(_createElementVNode("input", {
3653
+ class: "form-input",
3654
+ "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.apiKey) = $event),
3655
+ type: _ctx.piShowKey ? 'text' : 'password',
3656
+ autocomplete: "off",
3657
+ spellcheck: "false",
3658
+ placeholder: "sk-...",
3659
+ onChange: _ctx.fetchPiRemoteModels
3660
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "type", "onChange"]), [
3661
+ [_vModelDynamic, _ctx.editingPiProvider.form.apiKey]
3662
+ ]),
3663
+ _createElementVNode("button", {
3664
+ type: "button",
3665
+ class: "input-toggle-btn",
3666
+ onMousedown: _withModifiers(() => {}, ["prevent"]),
3667
+ onClick: $event => (_ctx.piShowKey = !_ctx.piShowKey),
3668
+ title: _ctx.piShowKey ? _ctx.t('common.hide') : _ctx.t('common.show'),
3669
+ "aria-label": _ctx.piShowKey ? _ctx.t('common.hide') : _ctx.t('common.show')
3670
+ }, [
3671
+ (!_ctx.piShowKey)
3672
+ ? (_openBlock(), _createElementBlock("svg", {
3673
+ key: 0,
3674
+ viewBox: "0 0 20 20",
3675
+ fill: "none",
3676
+ stroke: "currentColor",
3677
+ "stroke-width": "1.5",
3678
+ width: "16",
3679
+ height: "16"
3680
+ }, [
3681
+ _createElementVNode("path", { d: "M10 4C5 4 1.73 8.11 1 10c.73 1.89 4 6 9 6s8.27-4.11 9-6c-.73-1.89-4-6-9-6z" }),
3682
+ _createElementVNode("circle", {
3683
+ cx: "10",
3684
+ cy: "10",
3685
+ r: "3"
3686
+ })
3687
+ ]))
3688
+ : (_openBlock(), _createElementBlock("svg", {
3689
+ key: 1,
3690
+ viewBox: "0 0 20 20",
3691
+ fill: "none",
3692
+ stroke: "currentColor",
3693
+ "stroke-width": "1.5",
3694
+ width: "16",
3695
+ height: "16"
3696
+ }, [
3697
+ _createElementVNode("path", { d: "M2 2l16 16M8.2 4.2A9.9 9.9 0 0 1 10 4c5 0 8.27 4.11 9 6-.44.94-1.5 2.7-3.2 4.2M14.5 14.5A5.9 5.9 0 0 1 10 16c-5 0-8.27-4.11-9-6 .76-1.66 2.2-3.6 4.3-5" })
3698
+ ]))
3699
+ ], 40 /* PROPS, NEED_HYDRATION */, ["onMousedown", "onClick", "title", "aria-label"])
3700
+ ])
3701
+ ]),
3702
+ _createElementVNode("div", { class: "form-group" }, [
3703
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.models')), 1 /* TEXT */),
3704
+ (_ctx.piRemoteModelsLoading)
3705
+ ? (_openBlock(), _createElementBlock("p", {
3706
+ key: 0,
3707
+ class: "config-template-hint"
3708
+ }, _toDisplayString(_ctx.t('pi.providers.models.remoteLoading')), 1 /* TEXT */))
3709
+ : (_ctx.piRemoteModelError)
3710
+ ? (_openBlock(), _createElementBlock("p", {
3711
+ key: 1,
3712
+ class: "config-template-hint"
3713
+ }, _toDisplayString(_ctx.piRemoteModelError) + " · " + _toDisplayString(_ctx.t('pi.providers.models.remoteFailed')), 1 /* TEXT */))
3714
+ : _createCommentVNode("v-if", true),
3715
+ _createElementVNode("div", { class: "card-list" }, [
3716
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.editingPiProvider.form.models, (model, index) => {
3717
+ return (_openBlock(), _createElementBlock("div", {
3718
+ class: "card",
3719
+ key: index
3720
+ }, [
3721
+ _createElementVNode("div", { class: "input-with-toggle" }, [
3722
+ _withDirectives(_createElementVNode("input", {
3723
+ class: "form-input",
3724
+ type: "text",
3725
+ "onUpdate:modelValue": $event => ((model.id) = $event),
3726
+ autocomplete: "off",
3727
+ spellcheck: "false",
3728
+ placeholder: "claude-sonnet-4",
3729
+ disabled: !_ctx.isToolConfigWriteAllowed('pi')
3730
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "disabled"]), [
3731
+ [_vModelText, model.id]
3732
+ ]),
3733
+ _createElementVNode("button", {
3734
+ type: "button",
3735
+ class: "btn-tool input-toggle-btn",
3736
+ onClick: $event => (_ctx.editingPiProvider.form.models.splice(index, 1)),
3737
+ disabled: !_ctx.isToolConfigWriteAllowed('pi')
3738
+ }, _toDisplayString(_ctx.t('pi.providers.models.remove')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3739
+ ])
3740
+ ]))
3741
+ }), 128 /* KEYED_FRAGMENT */)),
3742
+ _createElementVNode("div", { class: "card" }, [
3743
+ _createElementVNode("div", { class: "input-with-toggle" }, [
3744
+ _withDirectives(_createElementVNode("input", {
3745
+ class: "form-input",
3746
+ type: "text",
3747
+ "onUpdate:modelValue": $event => ((_ctx.piModelSearch) = $event),
3748
+ autocomplete: "off",
3749
+ spellcheck: "false",
3750
+ placeholder: _ctx.t('pi.providers.models.search'),
3751
+ onKeydown: _withKeys(_withModifiers($event => (_ctx.addPiRemoteModel(_ctx.piModelSearch.trim())), ["prevent"]), ["enter"])
3752
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onKeydown"]), [
3753
+ [_vModelText, _ctx.piModelSearch]
3754
+ ])
3755
+ ])
3756
+ ]),
3757
+ _createElementVNode("div", { class: "pi-model-import-section" }, [
3758
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('pi.providers.models.importTitle')), 1 /* TEXT */),
3759
+ (!_ctx.piRemoteModelsLoading && _ctx.piRemoteSelectableModels().length > 0)
3760
+ ? (_openBlock(), _createElementBlock("div", {
3761
+ key: 0,
3762
+ class: "pi-model-import-list"
3763
+ }, [
3764
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.piRemoteSelectableModels(), (id) => {
3765
+ return (_openBlock(), _createElementBlock("label", {
3766
+ class: "pi-model-import-item",
3767
+ key: id
3768
+ }, [
3769
+ _createElementVNode("input", {
3770
+ type: "checkbox",
3771
+ checked: _ctx.isPiRemoteChecked(id),
3772
+ onChange: $event => (_ctx.togglePiRemoteChecked(id)),
3773
+ disabled: !_ctx.isToolConfigWriteAllowed('pi')
3774
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange", "disabled"]),
3775
+ _createElementVNode("span", { class: "pi-model-import-id" }, _toDisplayString(id), 1 /* TEXT */)
3776
+ ]))
3777
+ }), 128 /* KEYED_FRAGMENT */))
3778
+ ]))
3779
+ : _createCommentVNode("v-if", true),
3780
+ (!_ctx.piRemoteModelsLoading && _ctx.piRemoteSelectableModels().length > 0)
3781
+ ? (_openBlock(), _createElementBlock("div", {
3782
+ key: 1,
3783
+ class: "settings-tab-actions"
3784
+ }, [
3785
+ _createElementVNode("button", {
3786
+ type: "button",
3787
+ class: "btn-tool",
3788
+ disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piCheckedRemoteCount() === 0,
3789
+ onClick: _ctx.addSelectedPiRemoteModels
3790
+ }, _toDisplayString(_ctx.t('pi.providers.models.addSelected', { count: _ctx.piCheckedRemoteCount() })), 9 /* TEXT, PROPS */, ["disabled", "onClick"])
3791
+ ]))
3792
+ : _createCommentVNode("v-if", true),
3793
+ (!_ctx.piRemoteModelsLoading && !_ctx.piRemoteModelError && _ctx.piRemoteModels.length)
3794
+ ? (_openBlock(), _createElementBlock("p", {
3795
+ key: 2,
3796
+ class: "config-template-hint"
3797
+ }, _toDisplayString(_ctx.t('pi.providers.models.remoteCount', { count: _ctx.piRemoteModels.length })), 1 /* TEXT */))
3798
+ : _createCommentVNode("v-if", true),
3799
+ (!_ctx.piRemoteModelsLoading && !_ctx.piRemoteModelError && _ctx.piModelSearch.trim() && _ctx.piRemoteSelectableModels().length === 0)
3800
+ ? (_openBlock(), _createElementBlock("p", {
3801
+ key: 3,
3802
+ class: "config-template-hint"
3803
+ }, _toDisplayString(_ctx.t('pi.providers.models.noMatch')), 1 /* TEXT */))
3804
+ : _createCommentVNode("v-if", true)
3805
+ ])
3806
+ ])
3807
+ ]),
3808
+ _createElementVNode("div", { class: "btn-group" }, [
3809
+ _createElementVNode("button", {
3810
+ class: "btn btn-cancel",
3811
+ onClick: _ctx.closePiProviderEditor
3812
+ }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"]),
3813
+ (!_ctx.editingPiProvider.isNew)
3814
+ ? (_openBlock(), _createElementBlock("button", {
3815
+ key: 0,
3816
+ class: "btn btn-confirm btn-danger",
3817
+ onClick: _ctx.confirmDeletePiProvider,
3818
+ disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3819
+ }, _toDisplayString(_ctx.t('pi.providers.delete')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]))
3820
+ : _createCommentVNode("v-if", true),
3821
+ _createElementVNode("button", {
3822
+ class: "btn btn-confirm",
3823
+ onClick: _ctx.savePiProvider,
3824
+ disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3825
+ }, _toDisplayString(_ctx.t(_ctx.piSaving ? 'common.saving' : 'common.save')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3826
+ ])
3827
+ ])
3828
+ ], 8 /* PROPS */, ["onClick"]))
3829
+ : _createCommentVNode("v-if", true),
3847
3830
  _createCommentVNode(" 会话浏览模式 "),
3848
3831
  _withDirectives(_createElementVNode("div", {
3849
3832
  class: "mode-content",
@@ -6874,7 +6857,7 @@ return function render(_ctx, _cache) {
6874
6857
  _createCommentVNode(" Prompts editor "),
6875
6858
  (_ctx.mainTab === 'prompts')
6876
6859
  ? (_openBlock(), _createElementBlock("div", {
6877
- key: 0,
6860
+ key: 2,
6878
6861
  class: "mode-content mode-cards",
6879
6862
  id: "panel-prompts",
6880
6863
  role: "tabpanel",
@@ -7698,12 +7681,12 @@ return function render(_ctx, _cache) {
7698
7681
  _createCommentVNode(" 加载状态 "),
7699
7682
  (_ctx.loading && _ctx.mainTab !== 'usage')
7700
7683
  ? (_openBlock(), _createElementBlock("div", {
7701
- key: 1,
7684
+ key: 3,
7702
7685
  class: "state-message"
7703
7686
  }, _toDisplayString(_ctx.t('app.loadingConfig')), 1 /* TEXT */))
7704
7687
  : (_ctx.initError)
7705
7688
  ? (_openBlock(), _createElementBlock("div", {
7706
- key: 2,
7689
+ key: 4,
7707
7690
  class: "state-message error"
7708
7691
  }, [
7709
7692
  _createCommentVNode(" 错误状态 "),