codexmate 0.0.54 → 0.0.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +3 -0
  2. package/README.vi.md +172 -0
  3. package/README.zh.md +2 -0
  4. package/cli/local-bridge.js +221 -22
  5. package/cli.js +666 -6
  6. package/package.json +1 -1
  7. package/web-ui/app.js +40 -0
  8. package/web-ui/logic.claude.mjs +8 -0
  9. package/web-ui/modules/app.computed.session.mjs +210 -0
  10. package/web-ui/modules/app.methods.claude-config.mjs +196 -13
  11. package/web-ui/modules/app.methods.codex-config.mjs +294 -65
  12. package/web-ui/modules/app.methods.index.mjs +4 -0
  13. package/web-ui/modules/app.methods.navigation.mjs +7 -1
  14. package/web-ui/modules/app.methods.provider-cache.mjs +223 -0
  15. package/web-ui/modules/app.methods.providers.mjs +15 -1
  16. package/web-ui/modules/app.methods.runtime.mjs +7 -2
  17. package/web-ui/modules/app.methods.session-actions.mjs +36 -0
  18. package/web-ui/modules/app.methods.session-browser.mjs +3 -0
  19. package/web-ui/modules/app.methods.session-trash.mjs +3 -0
  20. package/web-ui/modules/app.methods.startup-claude.mjs +47 -4
  21. package/web-ui/modules/app.methods.web-ui-preferences.mjs +161 -0
  22. package/web-ui/modules/i18n/locales/en.mjs +106 -3
  23. package/web-ui/modules/i18n/locales/ja.mjs +103 -3
  24. package/web-ui/modules/i18n/locales/vi.mjs +950 -0
  25. package/web-ui/modules/i18n/locales/zh-tw.mjs +103 -3
  26. package/web-ui/modules/i18n/locales/zh.mjs +103 -3
  27. package/web-ui/modules/provider-default-names.mjs +25 -0
  28. package/web-ui/partials/index/layout-header.html +18 -5
  29. package/web-ui/partials/index/modal-health-check.html +69 -5
  30. package/web-ui/partials/index/modals-basic.html +182 -0
  31. package/web-ui/partials/index/panel-config-codex.html +2 -2
  32. package/web-ui/partials/index/panel-sessions.html +99 -19
  33. package/web-ui/partials/index/panel-settings.html +20 -0
  34. package/web-ui/res/web-ui-render.precompiled.js +742 -113
  35. package/web-ui/session-helpers.mjs +4 -1
  36. package/web-ui/styles/layout-shell.css +51 -1
  37. package/web-ui/styles/responsive.css +98 -0
  38. package/web-ui/styles/sessions-preview.css +212 -2
  39. package/web-ui/styles/sessions-toolbar-trash.css +61 -18
  40. package/web-ui/styles/settings-panel.css +398 -0
  41. package/web-ui/styles/skills-list.css +122 -0
  42. package/web-ui/styles/titles-cards.css +52 -0
@@ -518,12 +518,36 @@ return function render(_ctx, _cache) {
518
518
  ])
519
519
  ]),
520
520
  _createElementVNode("div", { class: "side-rail-lang" }, [
521
- _createElementVNode("button", {
522
- type: "button",
523
- class: "language-settings-link",
524
- "aria-label": _ctx.t('settings.language.sideLabel', { language: _ctx.currentLanguageLabel() }),
525
- onClick: _ctx.openLanguageSettings
526
- }, _toDisplayString(_ctx.t('settings.language.sideLabel', { language: _ctx.currentLanguageLabel() })), 9 /* TEXT, PROPS */, ["aria-label", "onClick"])
521
+ _createElementVNode("div", { class: "side-rail-lang-actions" }, [
522
+ _createElementVNode("button", {
523
+ type: "button",
524
+ class: "language-settings-link",
525
+ "aria-label": _ctx.t('settings.language.sideLabel', { language: _ctx.currentLanguageLabel() }),
526
+ onClick: _ctx.openLanguageSettings
527
+ }, _toDisplayString(_ctx.t('settings.language.sideLabel', { language: _ctx.currentLanguageLabel() })), 9 /* TEXT, PROPS */, ["aria-label", "onClick"]),
528
+ _createElementVNode("button", {
529
+ type: "button",
530
+ class: "side-announcement-button",
531
+ "aria-label": _ctx.t('announcement.providerCache.open'),
532
+ title: _ctx.t('announcement.providerCache.open'),
533
+ onClick: _ctx.openProviderCacheAnnouncementModal
534
+ }, [
535
+ (_openBlock(), _createElementBlock("svg", {
536
+ viewBox: "0 0 20 20",
537
+ fill: "none",
538
+ stroke: "currentColor",
539
+ "stroke-width": "1.7",
540
+ "stroke-linecap": "round",
541
+ "stroke-linejoin": "round",
542
+ width: "16",
543
+ height: "16",
544
+ "aria-hidden": "true"
545
+ }, [
546
+ _createElementVNode("path", { d: "M15 8.5a5 5 0 0 0-10 0c0 2.75-1 4.25-2 5.5h14c-1-1.25-2-2.75-2-5.5Z" }),
547
+ _createElementVNode("path", { d: "M8 16a2 2 0 0 0 4 0" })
548
+ ]))
549
+ ], 8 /* PROPS */, ["aria-label", "title", "onClick"])
550
+ ])
527
551
  ])
528
552
  ]))
529
553
  : _createCommentVNode("v-if", true),
@@ -1091,7 +1115,7 @@ return function render(_ctx, _cache) {
1091
1115
  ? (_openBlock(), _createElementBlock("button", {
1092
1116
  key: 0,
1093
1117
  class: "btn-add",
1094
- onClick: $event => {_ctx.showAddProviderKey = false; _ctx.showAddModal = true},
1118
+ onClick: _ctx.openAddProviderModal,
1095
1119
  disabled: !_ctx.isToolConfigWriteAllowed('codex')
1096
1120
  }, [
1097
1121
  (_openBlock(), _createElementBlock("svg", {
@@ -1349,7 +1373,7 @@ return function render(_ctx, _cache) {
1349
1373
  onClick: _ctx.runHealthCheck,
1350
1374
  disabled: _ctx.healthCheckLoading || _ctx.loading || !!_ctx.initError
1351
1375
  }, _toDisplayString(_ctx.healthCheckLoading ? _ctx.t('config.health.running') : _ctx.t('config.health.run')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
1352
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.health.hint')), 1 /* TEXT */)
1376
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('config.health.codexHint')), 1 /* TEXT */)
1353
1377
  ])
1354
1378
  ], 64 /* STABLE_FRAGMENT */))
1355
1379
  : _createCommentVNode("v-if", true),
@@ -2725,7 +2749,7 @@ return function render(_ctx, _cache) {
2725
2749
  ]))
2726
2750
  ]))
2727
2751
  : (_openBlock(), _createElementBlock("div", { key: 1 }, [
2728
- _createElementVNode("div", { class: "selector-section" }, [
2752
+ _createElementVNode("div", { class: "selector-section session-selector-section" }, [
2729
2753
  _createElementVNode("div", {
2730
2754
  class: "selector-header",
2731
2755
  style: {"display":"none"}
@@ -2733,29 +2757,30 @@ return function render(_ctx, _cache) {
2733
2757
  _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('sessions.sourceTitle')), 1 /* TEXT */),
2734
2758
  _createElementVNode("div", { class: "selector-actions sessions-header-actions" })
2735
2759
  ]),
2760
+ _createElementVNode("div", { class: "session-source-tabs-row" }, [
2761
+ _createElementVNode("div", {
2762
+ class: "session-source-pills",
2763
+ role: "group",
2764
+ "aria-label": _ctx.t('sessions.sourceTitle')
2765
+ }, [
2766
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionSourceOptions, (src) => {
2767
+ return (_openBlock(), _createElementBlock("button", {
2768
+ key: src.value,
2769
+ class: _normalizeClass(['session-source-pill', { active: _ctx.sessionFilterSource === src.value }]),
2770
+ "data-source": src.value,
2771
+ onClick: $event => (_ctx.setSessionSource(src.value)),
2772
+ disabled: _ctx.sessionsLoading,
2773
+ "aria-pressed": _ctx.sessionFilterSource === src.value,
2774
+ type: "button"
2775
+ }, [
2776
+ _createElementVNode("span", { class: "session-source-pill-dot" }),
2777
+ _createElementVNode("span", { class: "session-source-pill-label" }, _toDisplayString(src.label), 1 /* TEXT */)
2778
+ ], 10 /* CLASS, PROPS */, ["data-source", "onClick", "disabled", "aria-pressed"]))
2779
+ }), 128 /* KEYED_FRAGMENT */))
2780
+ ], 8 /* PROPS */, ["aria-label"])
2781
+ ]),
2736
2782
  _createElementVNode("div", { class: "session-toolbar" }, [
2737
2783
  _createElementVNode("div", { class: "session-toolbar-group session-toolbar-primary" }, [
2738
- _createElementVNode("div", {
2739
- class: "session-source-pills",
2740
- role: "radiogroup",
2741
- "aria-label": "Session source"
2742
- }, [
2743
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionSourceOptions, (src) => {
2744
- return (_openBlock(), _createElementBlock("button", {
2745
- key: src.value,
2746
- class: _normalizeClass(['session-source-pill', { active: _ctx.sessionFilterSource === src.value }]),
2747
- "data-source": src.value,
2748
- onClick: $event => (_ctx.setSessionSource(src.value)),
2749
- disabled: _ctx.sessionsLoading,
2750
- "aria-pressed": _ctx.sessionFilterSource === src.value,
2751
- role: "radio",
2752
- type: "button"
2753
- }, [
2754
- _createElementVNode("span", { class: "session-source-pill-dot" }),
2755
- _createElementVNode("span", { class: "session-source-pill-label" }, _toDisplayString(src.label), 1 /* TEXT */)
2756
- ], 10 /* CLASS, PROPS */, ["data-source", "onClick", "disabled", "aria-pressed"]))
2757
- }), 128 /* KEYED_FRAGMENT */))
2758
- ]),
2759
2784
  _withDirectives(_createElementVNode("select", {
2760
2785
  class: "session-path-select",
2761
2786
  "onUpdate:modelValue": $event => ((_ctx.sessionPathFilter) = $event),
@@ -2891,12 +2916,12 @@ return function render(_ctx, _cache) {
2891
2916
  ], 8 /* PROPS */, ["aria-label"]))
2892
2917
  : _createCommentVNode("v-if", true)
2893
2918
  ]),
2894
- (_ctx.sessionsLoading)
2919
+ (_ctx.sessionsLoading && _ctx.sessionsList.length === 0)
2895
2920
  ? (_openBlock(), _createElementBlock("div", {
2896
2921
  key: 0,
2897
2922
  class: "state-message"
2898
2923
  }, _toDisplayString(_ctx.t('sessions.loadingList')), 1 /* TEXT */))
2899
- : (_ctx.sessionsList.length === 0)
2924
+ : (!_ctx.sessionsLoading && _ctx.sessionsList.length === 0)
2900
2925
  ? (_openBlock(), _createElementBlock("div", {
2901
2926
  key: 1,
2902
2927
  class: "session-empty"
@@ -3149,6 +3174,27 @@ return function render(_ctx, _cache) {
3149
3174
  _createElementVNode("path", { d: "M2.5 12v1.5a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1V12" })
3150
3175
  ]))
3151
3176
  ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
3177
+ _createElementVNode("button", {
3178
+ class: "btn-session-open session-brief-copy",
3179
+ onClick: _ctx.copySessionWorkspaceBrief,
3180
+ disabled: !_ctx.activeSessionWorkspaceSummary.available,
3181
+ title: _ctx.t('sessions.workspace.copy'),
3182
+ "aria-label": _ctx.t('sessions.workspace.copy')
3183
+ }, [
3184
+ (_openBlock(), _createElementBlock("svg", {
3185
+ viewBox: "0 0 16 16",
3186
+ fill: "none",
3187
+ stroke: "currentColor",
3188
+ "stroke-width": "1.8",
3189
+ "stroke-linecap": "round",
3190
+ "stroke-linejoin": "round"
3191
+ }, [
3192
+ _createElementVNode("path", { d: "M4 2.5h6.5L13 5v8.5H4z" }),
3193
+ _createElementVNode("path", { d: "M10.5 2.5V5H13" }),
3194
+ _createElementVNode("path", { d: "M6 8h5" }),
3195
+ _createElementVNode("path", { d: "M6 10.5h5" })
3196
+ ]))
3197
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
3152
3198
  _createElementVNode("div", { class: "session-link-group" }, [
3153
3199
  _createElementVNode("button", {
3154
3200
  class: "btn-session-open",
@@ -3246,6 +3292,140 @@ return function render(_ctx, _cache) {
3246
3292
  key: 5,
3247
3293
  class: "session-preview-body"
3248
3294
  }, [
3295
+ (_ctx.activeSessionWorkspaceSummary.available)
3296
+ ? (_openBlock(), _createElementBlock("section", {
3297
+ key: 0,
3298
+ class: "session-workspace",
3299
+ "aria-label": _ctx.t('sessions.workspace.title')
3300
+ }, [
3301
+ _createElementVNode("div", { class: "session-workspace-header" }, [
3302
+ _createElementVNode("div", null, [
3303
+ _createElementVNode("div", { class: "session-workspace-kicker" }, _toDisplayString(_ctx.t('sessions.workspace.kicker')), 1 /* TEXT */),
3304
+ _createElementVNode("h3", { class: "session-workspace-title" }, _toDisplayString(_ctx.t('sessions.workspace.title')), 1 /* TEXT */),
3305
+ _createElementVNode("p", { class: "session-workspace-subtitle" }, _toDisplayString(_ctx.t('sessions.workspace.subtitle', { count: _ctx.activeSessionWorkspaceSummary.messageCount })), 1 /* TEXT */)
3306
+ ]),
3307
+ _createElementVNode("button", {
3308
+ class: "btn-mini",
3309
+ type: "button",
3310
+ onClick: _ctx.copySessionWorkspaceBrief
3311
+ }, _toDisplayString(_ctx.t('sessions.workspace.copy')), 9 /* TEXT, PROPS */, ["onClick"])
3312
+ ]),
3313
+ _createElementVNode("div", { class: "session-workspace-metrics" }, [
3314
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionWorkspaceSummary.metrics, (metric) => {
3315
+ return (_openBlock(), _createElementBlock("div", {
3316
+ key: metric.key,
3317
+ class: "session-workspace-metric"
3318
+ }, [
3319
+ _createElementVNode("span", { class: "session-workspace-metric-value" }, _toDisplayString(metric.value), 1 /* TEXT */),
3320
+ _createElementVNode("span", { class: "session-workspace-metric-label" }, _toDisplayString(metric.label), 1 /* TEXT */)
3321
+ ]))
3322
+ }), 128 /* KEYED_FRAGMENT */))
3323
+ ]),
3324
+ _createElementVNode("div", { class: "session-workspace-grid" }, [
3325
+ _createElementVNode("div", { class: "session-workspace-card session-workspace-card-wide" }, [
3326
+ _createElementVNode("div", { class: "session-workspace-card-title" }, _toDisplayString(_ctx.t('sessions.workspace.signals')), 1 /* TEXT */),
3327
+ (_ctx.activeSessionWorkspaceSummary.signals.length)
3328
+ ? (_openBlock(), _createElementBlock("ul", {
3329
+ key: 0,
3330
+ class: "session-workspace-list"
3331
+ }, [
3332
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionWorkspaceSummary.signals, (item, index) => {
3333
+ return (_openBlock(), _createElementBlock("li", {
3334
+ key: 'signal-' + index
3335
+ }, _toDisplayString(item), 1 /* TEXT */))
3336
+ }), 128 /* KEYED_FRAGMENT */))
3337
+ ]))
3338
+ : (_openBlock(), _createElementBlock("div", {
3339
+ key: 1,
3340
+ class: "session-workspace-empty"
3341
+ }, _toDisplayString(_ctx.t('sessions.workspace.empty')), 1 /* TEXT */))
3342
+ ]),
3343
+ _createElementVNode("div", { class: "session-workspace-card" }, [
3344
+ _createElementVNode("div", { class: "session-workspace-card-title" }, _toDisplayString(_ctx.t('sessions.workspace.commands')), 1 /* TEXT */),
3345
+ (_ctx.activeSessionWorkspaceSummary.commands.length)
3346
+ ? (_openBlock(), _createElementBlock("ul", {
3347
+ key: 0,
3348
+ class: "session-workspace-list session-workspace-code-list"
3349
+ }, [
3350
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionWorkspaceSummary.commands, (item, index) => {
3351
+ return (_openBlock(), _createElementBlock("li", {
3352
+ key: 'command-' + index
3353
+ }, [
3354
+ _createElementVNode("code", null, _toDisplayString(item), 1 /* TEXT */)
3355
+ ]))
3356
+ }), 128 /* KEYED_FRAGMENT */))
3357
+ ]))
3358
+ : (_openBlock(), _createElementBlock("div", {
3359
+ key: 1,
3360
+ class: "session-workspace-empty"
3361
+ }, _toDisplayString(_ctx.t('sessions.workspace.noneCommands')), 1 /* TEXT */))
3362
+ ]),
3363
+ _createElementVNode("div", { class: "session-workspace-card" }, [
3364
+ _createElementVNode("div", { class: "session-workspace-card-title" }, _toDisplayString(_ctx.t('sessions.workspace.files')), 1 /* TEXT */),
3365
+ (_ctx.activeSessionWorkspaceSummary.files.length)
3366
+ ? (_openBlock(), _createElementBlock("ul", {
3367
+ key: 0,
3368
+ class: "session-workspace-list session-workspace-code-list"
3369
+ }, [
3370
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionWorkspaceSummary.files, (item, index) => {
3371
+ return (_openBlock(), _createElementBlock("li", {
3372
+ key: 'file-' + index
3373
+ }, [
3374
+ _createElementVNode("code", null, _toDisplayString(item), 1 /* TEXT */)
3375
+ ]))
3376
+ }), 128 /* KEYED_FRAGMENT */))
3377
+ ]))
3378
+ : (_openBlock(), _createElementBlock("div", {
3379
+ key: 1,
3380
+ class: "session-workspace-empty"
3381
+ }, _toDisplayString(_ctx.t('sessions.workspace.noneFiles')), 1 /* TEXT */))
3382
+ ]),
3383
+ _createElementVNode("div", { class: "session-workspace-card" }, [
3384
+ _createElementVNode("div", { class: "session-workspace-card-title" }, _toDisplayString(_ctx.t('sessions.workspace.links')), 1 /* TEXT */),
3385
+ (_ctx.activeSessionWorkspaceSummary.links.length)
3386
+ ? (_openBlock(), _createElementBlock("ul", {
3387
+ key: 0,
3388
+ class: "session-workspace-list"
3389
+ }, [
3390
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionWorkspaceSummary.links, (item, index) => {
3391
+ return (_openBlock(), _createElementBlock("li", {
3392
+ key: 'link-' + index
3393
+ }, _toDisplayString(item), 1 /* TEXT */))
3394
+ }), 128 /* KEYED_FRAGMENT */))
3395
+ ]))
3396
+ : (_openBlock(), _createElementBlock("div", {
3397
+ key: 1,
3398
+ class: "session-workspace-empty"
3399
+ }, _toDisplayString(_ctx.t('sessions.workspace.noneLinks')), 1 /* TEXT */))
3400
+ ]),
3401
+ _createElementVNode("div", {
3402
+ class: _normalizeClass(["session-workspace-card", { 'session-workspace-card-alert': _ctx.activeSessionWorkspaceSummary.risks.length || _ctx.activeSessionWorkspaceSummary.nextSteps.length }])
3403
+ }, [
3404
+ _createElementVNode("div", { class: "session-workspace-card-title" }, _toDisplayString(_ctx.t('sessions.workspace.risks')), 1 /* TEXT */),
3405
+ (_ctx.activeSessionWorkspaceSummary.risks.length || _ctx.activeSessionWorkspaceSummary.nextSteps.length)
3406
+ ? (_openBlock(), _createElementBlock("ul", {
3407
+ key: 0,
3408
+ class: "session-workspace-list"
3409
+ }, [
3410
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionWorkspaceSummary.risks, (item, index) => {
3411
+ return (_openBlock(), _createElementBlock("li", {
3412
+ key: 'risk-' + index
3413
+ }, _toDisplayString(item), 1 /* TEXT */))
3414
+ }), 128 /* KEYED_FRAGMENT */)),
3415
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionWorkspaceSummary.nextSteps, (item, index) => {
3416
+ return (_openBlock(), _createElementBlock("li", {
3417
+ key: 'next-' + index
3418
+ }, _toDisplayString(item), 1 /* TEXT */))
3419
+ }), 128 /* KEYED_FRAGMENT */))
3420
+ ]))
3421
+ : (_openBlock(), _createElementBlock("div", {
3422
+ key: 1,
3423
+ class: "session-workspace-empty"
3424
+ }, _toDisplayString(_ctx.t('sessions.workspace.noneRisks')), 1 /* TEXT */))
3425
+ ], 2 /* CLASS */)
3426
+ ])
3427
+ ], 8 /* PROPS */, ["aria-label"]))
3428
+ : _createCommentVNode("v-if", true),
3249
3429
  _createElementVNode("div", { class: "session-preview-messages" }, [
3250
3430
  (_ctx.activeSessionDetailClipped)
3251
3431
  ? (_openBlock(), _createElementBlock("div", {
@@ -3253,7 +3433,7 @@ return function render(_ctx, _cache) {
3253
3433
  class: "session-item-sub session-item-wrap"
3254
3434
  }, _toDisplayString(_ctx.t('sessions.preview.clipped', { count: _ctx.activeSessionMessages.length })), 1 /* TEXT */))
3255
3435
  : _createCommentVNode("v-if", true),
3256
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionMessages, (msg, idx, ___, _cached) => {
3436
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.activeSessionVisibleMessages, (msg, idx, ___, _cached) => {
3257
3437
  const _memo = ([msg.text, msg.timestamp, msg.roleLabel, msg.normalizedRole])
3258
3438
  if (_cached && _cached.key === _ctx.getRecordRenderKey(msg, idx) && _isMemoSame(_cached, _memo)) return _cached
3259
3439
  const _item = (_openBlock(), _createElementBlock("div", {
@@ -3276,7 +3456,21 @@ return function render(_ctx, _cache) {
3276
3456
  ], 10 /* CLASS, PROPS */, ["data-message-key"]))
3277
3457
  _item.memo = _memo
3278
3458
  return _item
3279
- }, _cache, 2), 128 /* KEYED_FRAGMENT */))
3459
+ }, _cache, 2), 128 /* KEYED_FRAGMENT */)),
3460
+ (_ctx.canLoadMoreSessionMessages)
3461
+ ? (_openBlock(), _createElementBlock("div", {
3462
+ key: 1,
3463
+ class: "session-preview-load-more"
3464
+ }, [
3465
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('sessions.preview.shownCount', { shown: _ctx.activeSessionVisibleMessages.length, total: _ctx.activeSessionMessages.length })), 1 /* TEXT */),
3466
+ _createElementVNode("button", {
3467
+ class: "btn-mini",
3468
+ type: "button",
3469
+ onClick: _ctx.loadMoreSessionMessages,
3470
+ disabled: _ctx.sessionPreviewLoadingMore
3471
+ }, _toDisplayString(_ctx.sessionPreviewLoadingMore ? _ctx.t('sessions.preview.loadingMore') : _ctx.t('sessions.preview.loadMore', { remain: _ctx.sessionPreviewRemainingCount })), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3472
+ ]))
3473
+ : _createCommentVNode("v-if", true)
3280
3474
  ])
3281
3475
  ]))
3282
3476
  ], 40 /* PROPS, NEED_HYDRATION */, ["onScroll"]),
@@ -4913,6 +5107,42 @@ return function render(_ctx, _cache) {
4913
5107
  onChange: _ctx.handleCodexImportChange
4914
5108
  }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"])
4915
5109
  ], 8 /* PROPS */, ["aria-label"]),
5110
+ _createElementVNode("section", {
5111
+ class: "settings-card",
5112
+ "aria-label": _ctx.t('settings.providerCache.title')
5113
+ }, [
5114
+ _createElementVNode("div", { class: "settings-card-main" }, [
5115
+ _createElementVNode("div", { class: "settings-card-content" }, [
5116
+ _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.providerCache.title')), 1 /* TEXT */),
5117
+ _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.providerCache.meta')), 1 /* TEXT */),
5118
+ _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.providerCache.hint')), 1 /* TEXT */),
5119
+ (_ctx.providerCacheSyncMessage)
5120
+ ? (_openBlock(), _createElementBlock("p", {
5121
+ key: 0,
5122
+ class: "settings-card-hint provider-cache-sync-message"
5123
+ }, _toDisplayString(_ctx.providerCacheSyncMessage), 1 /* TEXT */))
5124
+ : _createCommentVNode("v-if", true),
5125
+ (_ctx.providerCacheError)
5126
+ ? (_openBlock(), _createElementBlock("p", {
5127
+ key: 1,
5128
+ class: "settings-card-hint form-error"
5129
+ }, _toDisplayString(_ctx.providerCacheError), 1 /* TEXT */))
5130
+ : _createCommentVNode("v-if", true)
5131
+ ])
5132
+ ]),
5133
+ _createElementVNode("div", { class: "settings-card-actions" }, [
5134
+ _createElementVNode("button", {
5135
+ class: "settings-card-action",
5136
+ onClick: $event => (_ctx.openProviderCacheModal({ forceRefresh: true })),
5137
+ disabled: _ctx.providerCacheLoading || _ctx.providerCacheSyncing
5138
+ }, _toDisplayString(_ctx.providerCacheLoading ? _ctx.t('settings.providerCache.loading') : _ctx.t('settings.providerCache.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
5139
+ _createElementVNode("button", {
5140
+ class: "settings-card-action",
5141
+ onClick: _ctx.syncProviderCacheRecords,
5142
+ disabled: _ctx.providerCacheLoading || _ctx.providerCacheSyncing
5143
+ }, _toDisplayString(_ctx.providerCacheSyncing ? _ctx.t('settings.providerCache.syncing') : _ctx.t('settings.providerCache.sync')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
5144
+ ])
5145
+ ], 8 /* PROPS */, ["aria-label"]),
4916
5146
  _createElementVNode("section", {
4917
5147
  class: "settings-card",
4918
5148
  "aria-label": _ctx.t('settings.trashConfig.title')
@@ -6633,10 +6863,327 @@ return function render(_ctx, _cache) {
6633
6863
  ])
6634
6864
  ], 8 /* PROPS */, ["onClick"]))
6635
6865
  : _createCommentVNode("v-if", true),
6866
+ _createCommentVNode(" 项目功能公告模态框 "),
6867
+ (_ctx.showProviderCacheAnnouncementModal)
6868
+ ? (_openBlock(), _createElementBlock("div", {
6869
+ key: 7,
6870
+ class: "modal-overlay project-announcement-overlay",
6871
+ onClick: _withModifiers(_ctx.closeProviderCacheAnnouncementModal, ["self"])
6872
+ }, [
6873
+ _createElementVNode("div", {
6874
+ class: "modal provider-cache-announcement-modal project-announcement-modal",
6875
+ role: "dialog",
6876
+ "aria-modal": "true",
6877
+ "aria-labelledby": "provider-cache-announcement-title"
6878
+ }, [
6879
+ _createElementVNode("button", {
6880
+ type: "button",
6881
+ class: "project-announcement-close",
6882
+ "aria-label": _ctx.t('announcement.project.closeAria'),
6883
+ onClick: _ctx.closeProviderCacheAnnouncementModal
6884
+ }, "×", 8 /* PROPS */, ["aria-label", "onClick"]),
6885
+ _createElementVNode("div", { class: "project-announcement-header" }, [
6886
+ _createElementVNode("div", { class: "project-announcement-eyebrow" }, _toDisplayString(_ctx.t('announcement.project.eyebrow')), 1 /* TEXT */),
6887
+ _createElementVNode("div", {
6888
+ class: "modal-title project-announcement-title",
6889
+ id: "provider-cache-announcement-title"
6890
+ }, _toDisplayString(_ctx.t('announcement.project.title')), 1 /* TEXT */),
6891
+ _createElementVNode("p", { class: "provider-cache-announcement-copy provider-cache-announcement-lede" }, _toDisplayString(_ctx.t('announcement.project.subtitle')), 1 /* TEXT */)
6892
+ ]),
6893
+ _createElementVNode("div", {
6894
+ class: "project-announcement-feature-grid",
6895
+ "aria-label": _ctx.t('announcement.project.features.aria')
6896
+ }, [
6897
+ _createElementVNode("article", { class: "project-announcement-feature-card" }, [
6898
+ _createElementVNode("div", { class: "project-announcement-feature-title" }, _toDisplayString(_ctx.t('announcement.project.feature.config.title')), 1 /* TEXT */),
6899
+ _createElementVNode("div", { class: "project-announcement-feature-meta" }, _toDisplayString(_ctx.t('announcement.project.feature.config.meta')), 1 /* TEXT */)
6900
+ ]),
6901
+ _createElementVNode("article", { class: "project-announcement-feature-card" }, [
6902
+ _createElementVNode("div", { class: "project-announcement-feature-title" }, _toDisplayString(_ctx.t('announcement.project.feature.sessions.title')), 1 /* TEXT */),
6903
+ _createElementVNode("div", { class: "project-announcement-feature-meta" }, _toDisplayString(_ctx.t('announcement.project.feature.sessions.meta')), 1 /* TEXT */)
6904
+ ]),
6905
+ _createElementVNode("article", { class: "project-announcement-feature-card" }, [
6906
+ _createElementVNode("div", { class: "project-announcement-feature-title" }, _toDisplayString(_ctx.t('announcement.project.feature.usage.title')), 1 /* TEXT */),
6907
+ _createElementVNode("div", { class: "project-announcement-feature-meta" }, _toDisplayString(_ctx.t('announcement.project.feature.usage.meta')), 1 /* TEXT */)
6908
+ ]),
6909
+ _createElementVNode("article", { class: "project-announcement-feature-card" }, [
6910
+ _createElementVNode("div", { class: "project-announcement-feature-title" }, _toDisplayString(_ctx.t('announcement.project.feature.tasks.title')), 1 /* TEXT */),
6911
+ _createElementVNode("div", { class: "project-announcement-feature-meta" }, _toDisplayString(_ctx.t('announcement.project.feature.tasks.meta')), 1 /* TEXT */)
6912
+ ]),
6913
+ _createElementVNode("article", { class: "project-announcement-feature-card" }, [
6914
+ _createElementVNode("div", { class: "project-announcement-feature-title" }, _toDisplayString(_ctx.t('announcement.project.feature.skills.title')), 1 /* TEXT */),
6915
+ _createElementVNode("div", { class: "project-announcement-feature-meta" }, _toDisplayString(_ctx.t('announcement.project.feature.skills.meta')), 1 /* TEXT */)
6916
+ ]),
6917
+ _createElementVNode("article", { class: "project-announcement-feature-card" }, [
6918
+ _createElementVNode("div", { class: "project-announcement-feature-title" }, _toDisplayString(_ctx.t('announcement.project.feature.data.title')), 1 /* TEXT */),
6919
+ _createElementVNode("div", { class: "project-announcement-feature-meta" }, _toDisplayString(_ctx.t('announcement.project.feature.data.meta')), 1 /* TEXT */)
6920
+ ])
6921
+ ], 8 /* PROPS */, ["aria-label"]),
6922
+ _createElementVNode("details", {
6923
+ class: "project-announcement-cache-section",
6924
+ "aria-labelledby": "project-announcement-cache-title"
6925
+ }, [
6926
+ _createElementVNode("summary", { class: "project-announcement-section-head" }, [
6927
+ _createElementVNode("span", null, [
6928
+ _createElementVNode("span", {
6929
+ class: "project-announcement-section-title",
6930
+ id: "project-announcement-cache-title"
6931
+ }, _toDisplayString(_ctx.t('announcement.project.cache.title')), 1 /* TEXT */),
6932
+ _createElementVNode("span", { class: "project-announcement-section-meta" }, _toDisplayString(_ctx.t('announcement.project.cache.meta')), 1 /* TEXT */)
6933
+ ]),
6934
+ (_ctx.getProviderCacheAnnouncementSummary().loadedAt)
6935
+ ? (_openBlock(), _createElementBlock("span", {
6936
+ key: 0,
6937
+ class: "provider-cache-loaded-at"
6938
+ }, _toDisplayString(_ctx.t('modal.providerCache.loadedAt')) + ": " + _toDisplayString(_ctx.getProviderCacheAnnouncementSummary().loadedAt), 1 /* TEXT */))
6939
+ : _createCommentVNode("v-if", true)
6940
+ ]),
6941
+ (_ctx.providerCacheError)
6942
+ ? (_openBlock(), _createElementBlock("div", {
6943
+ key: 0,
6944
+ class: "state-message error provider-cache-error"
6945
+ }, _toDisplayString(_ctx.providerCacheError), 1 /* TEXT */))
6946
+ : _createCommentVNode("v-if", true),
6947
+ (_ctx.providerCacheSyncMessage)
6948
+ ? (_openBlock(), _createElementBlock("div", {
6949
+ key: 1,
6950
+ class: "state-message provider-cache-sync-message"
6951
+ }, _toDisplayString(_ctx.providerCacheSyncMessage), 1 /* TEXT */))
6952
+ : _createCommentVNode("v-if", true),
6953
+ (_ctx.providerCacheLoading && !_ctx.providerCacheLoadedOnce)
6954
+ ? (_openBlock(), _createElementBlock("div", {
6955
+ key: 2,
6956
+ class: "state-message"
6957
+ }, _toDisplayString(_ctx.t('modal.providerCache.loading')), 1 /* TEXT */))
6958
+ : _createCommentVNode("v-if", true),
6959
+ _createElementVNode("div", { class: "provider-cache-announcement-body" }, [
6960
+ _createElementVNode("div", {
6961
+ class: "project-announcement-mini-status",
6962
+ "aria-label": _ctx.t('announcement.project.status.aria')
6963
+ }, [
6964
+ _createElementVNode("span", null, [
6965
+ _createTextVNode(_toDisplayString(_ctx.t('announcement.project.status.provider')) + ": ", 1 /* TEXT */),
6966
+ _createElementVNode("strong", null, _toDisplayString(_ctx.currentProvider || _ctx.t('common.notSelected')), 1 /* TEXT */)
6967
+ ]),
6968
+ _createElementVNode("span", null, [
6969
+ _createTextVNode(_toDisplayString(_ctx.t('announcement.project.status.model')) + ": ", 1 /* TEXT */),
6970
+ _createElementVNode("strong", null, _toDisplayString(_ctx.currentModel || _ctx.t('common.notSelected')), 1 /* TEXT */)
6971
+ ]),
6972
+ _createElementVNode("span", null, [
6973
+ _createTextVNode(_toDisplayString(_ctx.t('announcement.project.status.cacheFiles')) + ": ", 1 /* TEXT */),
6974
+ _createElementVNode("strong", null, _toDisplayString(_ctx.getProviderCacheAnnouncementSummary().fileCount), 1 /* TEXT */)
6975
+ ])
6976
+ ], 8 /* PROPS */, ["aria-label"]),
6977
+ _createElementVNode("div", { class: "provider-cache-summary-grid" }, [
6978
+ _createElementVNode("div", { class: "provider-cache-summary-card" }, [
6979
+ _createElementVNode("span", { class: "provider-cache-summary-label" }, _toDisplayString(_ctx.t('announcement.project.cache.files')), 1 /* TEXT */),
6980
+ _createElementVNode("strong", null, _toDisplayString(_ctx.getProviderCacheAnnouncementSummary().fileCount), 1 /* TEXT */)
6981
+ ]),
6982
+ _createElementVNode("div", { class: "provider-cache-summary-card" }, [
6983
+ _createElementVNode("span", { class: "provider-cache-summary-label" }, _toDisplayString(_ctx.t('announcement.project.cache.providers')), 1 /* TEXT */),
6984
+ _createElementVNode("strong", null, _toDisplayString(_ctx.getProviderCacheAnnouncementSummary().providerCount), 1 /* TEXT */)
6985
+ ]),
6986
+ _createElementVNode("div", { class: "provider-cache-summary-card" }, [
6987
+ _createElementVNode("span", { class: "provider-cache-summary-label" }, _toDisplayString(_ctx.t('announcement.project.cache.groups')), 1 /* TEXT */),
6988
+ _createElementVNode("strong", null, _toDisplayString(_ctx.getProviderCacheAnnouncementSummary().groupCount), 1 /* TEXT */)
6989
+ ])
6990
+ ]),
6991
+ _createElementVNode("div", {
6992
+ class: "provider-cache-announcement-list",
6993
+ "aria-label": _ctx.t('announcement.project.cache.groupList')
6994
+ }, [
6995
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getProviderCacheAnnouncementGroups(), (group) => {
6996
+ return (_openBlock(), _createElementBlock("div", {
6997
+ key: group.key,
6998
+ class: "provider-cache-announcement-row"
6999
+ }, [
7000
+ _createElementVNode("span", null, _toDisplayString(group.label), 1 /* TEXT */),
7001
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('announcement.project.cache.groupSummary', { files: group.existingCount, providers: group.providerCount })), 1 /* TEXT */)
7002
+ ]))
7003
+ }), 128 /* KEYED_FRAGMENT */))
7004
+ ], 8 /* PROPS */, ["aria-label"]),
7005
+ _createElementVNode("div", { class: "project-announcement-cache-actions" }, [
7006
+ _createElementVNode("button", {
7007
+ type: "button",
7008
+ class: "btn-tool btn-tool-compact",
7009
+ onClick: _ctx.syncProviderCacheRecords,
7010
+ disabled: _ctx.providerCacheLoading || _ctx.providerCacheSyncing
7011
+ }, _toDisplayString(_ctx.providerCacheSyncing ? _ctx.t('modal.providerCache.syncing') : _ctx.t('announcement.project.cache.sync')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
7012
+ _createElementVNode("button", {
7013
+ type: "button",
7014
+ class: "btn-tool btn-tool-compact",
7015
+ onClick: _ctx.loadProviderCacheRecords,
7016
+ disabled: _ctx.providerCacheLoading
7017
+ }, _toDisplayString(_ctx.providerCacheLoading ? _ctx.t('modal.providerCache.refreshing') : _ctx.t('announcement.project.cache.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
7018
+ _createElementVNode("button", {
7019
+ type: "button",
7020
+ class: "btn-tool btn-tool-compact",
7021
+ onClick: _ctx.openProviderCacheDetailsFromAnnouncement
7022
+ }, _toDisplayString(_ctx.t('announcement.project.cache.details')), 9 /* TEXT, PROPS */, ["onClick"])
7023
+ ])
7024
+ ])
7025
+ ]),
7026
+ _createElementVNode("div", { class: "btn-group provider-cache-footer project-announcement-footer" }, [
7027
+ _createElementVNode("button", {
7028
+ class: "btn btn-confirm",
7029
+ onClick: _ctx.closeProviderCacheAnnouncementModal
7030
+ }, _toDisplayString(_ctx.t('announcement.project.primaryAction')), 9 /* TEXT, PROPS */, ["onClick"])
7031
+ ])
7032
+ ])
7033
+ ], 8 /* PROPS */, ["onClick"]))
7034
+ : _createCommentVNode("v-if", true),
7035
+ _createCommentVNode(" Provider 缓存记录模态框 "),
7036
+ (_ctx.showProviderCacheModal)
7037
+ ? (_openBlock(), _createElementBlock("div", {
7038
+ key: 8,
7039
+ class: "modal-overlay",
7040
+ onClick: _withModifiers(_ctx.closeProviderCacheModal, ["self"])
7041
+ }, [
7042
+ _createElementVNode("div", {
7043
+ class: "modal modal-wide provider-cache-modal",
7044
+ role: "dialog",
7045
+ "aria-modal": "true",
7046
+ "aria-labelledby": "provider-cache-modal-title"
7047
+ }, [
7048
+ _createElementVNode("div", {
7049
+ class: "modal-title",
7050
+ id: "provider-cache-modal-title"
7051
+ }, _toDisplayString(_ctx.t('modal.providerCache.title')), 1 /* TEXT */),
7052
+ _createElementVNode("div", { class: "form-hint provider-cache-root" }, _toDisplayString(_ctx.t('modal.providerCache.root')) + ": " + _toDisplayString((_ctx.providerCacheRecords && _ctx.providerCacheRecords.root) || '~/.codexmate'), 1 /* TEXT */),
7053
+ _createElementVNode("div", { class: "provider-cache-toolbar" }, [
7054
+ _createElementVNode("button", {
7055
+ type: "button",
7056
+ class: "btn-tool btn-tool-compact",
7057
+ onClick: _ctx.loadProviderCacheRecords,
7058
+ disabled: _ctx.providerCacheLoading
7059
+ }, _toDisplayString(_ctx.providerCacheLoading ? _ctx.t('modal.providerCache.refreshing') : _ctx.t('modal.providerCache.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
7060
+ _createElementVNode("button", {
7061
+ type: "button",
7062
+ class: "btn-tool btn-tool-compact",
7063
+ onClick: _ctx.syncProviderCacheRecords,
7064
+ disabled: _ctx.providerCacheLoading || _ctx.providerCacheSyncing
7065
+ }, _toDisplayString(_ctx.providerCacheSyncing ? _ctx.t('modal.providerCache.syncing') : _ctx.t('modal.providerCache.sync')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
7066
+ (_ctx.providerCacheLoadedAt)
7067
+ ? (_openBlock(), _createElementBlock("span", {
7068
+ key: 0,
7069
+ class: "provider-cache-loaded-at"
7070
+ }, _toDisplayString(_ctx.t('modal.providerCache.loadedAt')) + ": " + _toDisplayString(_ctx.providerCacheLoadedAt), 1 /* TEXT */))
7071
+ : _createCommentVNode("v-if", true)
7072
+ ]),
7073
+ (_ctx.providerCacheError)
7074
+ ? (_openBlock(), _createElementBlock("div", {
7075
+ key: 0,
7076
+ class: "state-message error provider-cache-error"
7077
+ }, _toDisplayString(_ctx.providerCacheError), 1 /* TEXT */))
7078
+ : _createCommentVNode("v-if", true),
7079
+ (_ctx.providerCacheSyncMessage)
7080
+ ? (_openBlock(), _createElementBlock("div", {
7081
+ key: 1,
7082
+ class: "state-message provider-cache-sync-message"
7083
+ }, _toDisplayString(_ctx.providerCacheSyncMessage), 1 /* TEXT */))
7084
+ : _createCommentVNode("v-if", true),
7085
+ (_ctx.providerCacheLoading && !_ctx.providerCacheLoadedOnce)
7086
+ ? (_openBlock(), _createElementBlock("div", {
7087
+ key: 2,
7088
+ class: "state-message"
7089
+ }, _toDisplayString(_ctx.t('modal.providerCache.loading')), 1 /* TEXT */))
7090
+ : (_openBlock(), _createElementBlock("div", {
7091
+ key: 3,
7092
+ class: "provider-cache-body"
7093
+ }, [
7094
+ _createElementVNode("div", { class: "provider-cache-groups" }, [
7095
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getProviderCacheGroups(), (group) => {
7096
+ return (_openBlock(), _createElementBlock("section", {
7097
+ key: group.key,
7098
+ class: "provider-cache-group"
7099
+ }, [
7100
+ _createElementVNode("div", { class: "provider-cache-group-header" }, [
7101
+ _createElementVNode("div", { class: "provider-cache-group-title" }, _toDisplayString(group.label), 1 /* TEXT */),
7102
+ _createElementVNode("div", { class: "provider-cache-group-meta" }, _toDisplayString(_ctx.t('modal.providerCache.groupMeta', { count: group.existingCount || 0 })), 1 /* TEXT */)
7103
+ ]),
7104
+ (!_ctx.hasProviderCacheExistingFiles(group))
7105
+ ? (_openBlock(), _createElementBlock("div", {
7106
+ key: 0,
7107
+ class: "provider-cache-empty"
7108
+ }, _toDisplayString(_ctx.t('modal.providerCache.empty')), 1 /* TEXT */))
7109
+ : (_openBlock(), _createElementBlock("div", {
7110
+ key: 1,
7111
+ class: "provider-cache-file-list"
7112
+ }, [
7113
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getProviderCacheExistingFiles(group), (file) => {
7114
+ return (_openBlock(), _createElementBlock("article", {
7115
+ key: _ctx.getProviderCacheFileKey(file),
7116
+ class: "provider-cache-file"
7117
+ }, [
7118
+ _createElementVNode("div", { class: "provider-cache-file-header" }, [
7119
+ _createElementVNode("div", null, [
7120
+ _createElementVNode("div", { class: "provider-cache-file-name" }, _toDisplayString(file.name), 1 /* TEXT */),
7121
+ _createElementVNode("div", { class: "provider-cache-file-summary" }, _toDisplayString(_ctx.getProviderCacheFileSummary(file)), 1 /* TEXT */)
7122
+ ]),
7123
+ _createElementVNode("div", { class: "provider-cache-file-meta" }, [
7124
+ _createElementVNode("span", null, _toDisplayString(_ctx.formatProviderCacheFileSize(file.size)), 1 /* TEXT */),
7125
+ (file.mtime)
7126
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, _toDisplayString(file.mtime), 1 /* TEXT */))
7127
+ : _createCommentVNode("v-if", true)
7128
+ ])
7129
+ ]),
7130
+ _createElementVNode("div", { class: "provider-cache-file-path" }, _toDisplayString(_ctx.getProviderCacheFilePath(file)), 1 /* TEXT */),
7131
+ (_ctx.hasProviderCacheProviders(file))
7132
+ ? (_openBlock(), _createElementBlock("div", {
7133
+ key: 0,
7134
+ class: "provider-cache-provider-list"
7135
+ }, [
7136
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getProviderCacheFileProviders(file), (provider, providerIndex) => {
7137
+ return (_openBlock(), _createElementBlock("details", {
7138
+ key: provider.name || (_ctx.getProviderCacheFileKey(file) + ':' + providerIndex),
7139
+ class: "provider-cache-provider",
7140
+ open: ""
7141
+ }, [
7142
+ _createElementVNode("summary", { class: "provider-cache-provider-summary" }, [
7143
+ _createElementVNode("span", { class: "provider-cache-provider-name" }, _toDisplayString(provider.name || 'provider'), 1 /* TEXT */),
7144
+ _createElementVNode("span", { class: "provider-cache-provider-badges" }, [
7145
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getProviderCacheProviderMeta(provider), (item) => {
7146
+ return (_openBlock(), _createElementBlock("span", {
7147
+ key: item.label,
7148
+ class: "provider-cache-provider-badge"
7149
+ }, _toDisplayString(item.label) + ": " + _toDisplayString(item.value), 1 /* TEXT */))
7150
+ }), 128 /* KEYED_FRAGMENT */))
7151
+ ])
7152
+ ]),
7153
+ _createElementVNode("pre", { class: "provider-cache-json provider-cache-json-compact" }, _toDisplayString(_ctx.getProviderCacheProviderText(provider)), 1 /* TEXT */)
7154
+ ]))
7155
+ }), 128 /* KEYED_FRAGMENT */))
7156
+ ]))
7157
+ : _createCommentVNode("v-if", true),
7158
+ _createElementVNode("details", {
7159
+ class: "provider-cache-raw",
7160
+ open: !_ctx.hasProviderCacheProviders(file) || file.ok === false
7161
+ }, [
7162
+ _createElementVNode("summary", null, _toDisplayString(file.ok === false ? _ctx.t('modal.providerCache.errorDetails') : _ctx.t('modal.providerCache.rawJson')), 1 /* TEXT */),
7163
+ _createElementVNode("pre", {
7164
+ class: _normalizeClass(['provider-cache-json', { error: file.ok === false }])
7165
+ }, _toDisplayString(_ctx.getProviderCacheRecordText(file)), 3 /* TEXT, CLASS */)
7166
+ ], 8 /* PROPS */, ["open"])
7167
+ ]))
7168
+ }), 128 /* KEYED_FRAGMENT */))
7169
+ ]))
7170
+ ]))
7171
+ }), 128 /* KEYED_FRAGMENT */))
7172
+ ])
7173
+ ])),
7174
+ _createElementVNode("div", { class: "btn-group provider-cache-footer" }, [
7175
+ _createElementVNode("button", {
7176
+ class: "btn btn-confirm",
7177
+ onClick: _ctx.closeProviderCacheModal
7178
+ }, _toDisplayString(_ctx.t('common.close')), 9 /* TEXT, PROPS */, ["onClick"])
7179
+ ])
7180
+ ])
7181
+ ], 8 /* PROPS */, ["onClick"]))
7182
+ : _createCommentVNode("v-if", true),
6636
7183
  _createCommentVNode(" 添加Claude配置模态框 "),
6637
7184
  (_ctx.showClaudeConfigModal)
6638
7185
  ? (_openBlock(), _createElementBlock("div", {
6639
- key: 7,
7186
+ key: 9,
6640
7187
  class: "modal-overlay",
6641
7188
  onClick: _withModifiers(_ctx.closeClaudeConfigModal, ["self"])
6642
7189
  }, [
@@ -6788,7 +7335,7 @@ return function render(_ctx, _cache) {
6788
7335
  _createCommentVNode(" 编辑Claude配置模态框 "),
6789
7336
  (_ctx.showEditConfigModal)
6790
7337
  ? (_openBlock(), _createElementBlock("div", {
6791
- key: 8,
7338
+ key: 10,
6792
7339
  class: "modal-overlay",
6793
7340
  onClick: _withModifiers(_ctx.closeEditConfigModal, ["self"])
6794
7341
  }, [
@@ -6941,7 +7488,7 @@ return function render(_ctx, _cache) {
6941
7488
  _createCommentVNode(" Codex bridge pool modal "),
6942
7489
  (_ctx.showCodexBridgePoolModal)
6943
7490
  ? (_openBlock(), _createElementBlock("div", {
6944
- key: 9,
7491
+ key: 11,
6945
7492
  class: "modal-overlay",
6946
7493
  onClick: _withModifiers($event => (_ctx.showCodexBridgePoolModal = false), ["self"])
6947
7494
  }, [
@@ -7034,7 +7581,7 @@ return function render(_ctx, _cache) {
7034
7581
  : _createCommentVNode("v-if", true),
7035
7582
  (_ctx.showClaudeBridgePoolModal)
7036
7583
  ? (_openBlock(), _createElementBlock("div", {
7037
- key: 10,
7584
+ key: 12,
7038
7585
  class: "modal-overlay",
7039
7586
  onClick: _withModifiers($event => (_ctx.showClaudeBridgePoolModal = false), ["self"])
7040
7587
  }, [
@@ -7128,7 +7675,7 @@ return function render(_ctx, _cache) {
7128
7675
  _createCommentVNode(" Webhook settings modal "),
7129
7676
  (_ctx.showWebhookModal)
7130
7677
  ? (_openBlock(), _createElementBlock("div", {
7131
- key: 11,
7678
+ key: 13,
7132
7679
  class: "modal-overlay",
7133
7680
  onClick: _withModifiers(_ctx.closeWebhookModal, ["self"])
7134
7681
  }, [
@@ -7201,7 +7748,7 @@ return function render(_ctx, _cache) {
7201
7748
  : _createCommentVNode("v-if", true),
7202
7749
  (_ctx.showOpenclawConfigModal)
7203
7750
  ? (_openBlock(), _createElementBlock("div", {
7204
- key: 12,
7751
+ key: 14,
7205
7752
  class: "modal-overlay",
7206
7753
  onClick: _withModifiers($event => (!(_ctx.openclawSaving || _ctx.openclawApplying) && _ctx.closeOpenclawConfigModal()), ["self"])
7207
7754
  }, [
@@ -7913,7 +8460,7 @@ return function render(_ctx, _cache) {
7913
8460
  : _createCommentVNode("v-if", true),
7914
8461
  (_ctx.showConfigTemplateModal)
7915
8462
  ? (_openBlock(), _createElementBlock("div", {
7916
- key: 13,
8463
+ key: 15,
7917
8464
  class: "modal-overlay",
7918
8465
  onClick: _withModifiers($event => (!_ctx.configTemplateApplying && _ctx.closeConfigTemplateModal()), ["self"])
7919
8466
  }, [
@@ -8058,7 +8605,7 @@ return function render(_ctx, _cache) {
8058
8605
  : _createCommentVNode("v-if", true),
8059
8606
  (_ctx.showAgentsModal)
8060
8607
  ? (_openBlock(), _createElementBlock("div", {
8061
- key: 14,
8608
+ key: 16,
8062
8609
  class: "modal-overlay",
8063
8610
  onClick: _withModifiers(_ctx.closeAgentsModal, ["self"])
8064
8611
  }, [
@@ -8225,7 +8772,7 @@ return function render(_ctx, _cache) {
8225
8772
  : _createCommentVNode("v-if", true),
8226
8773
  (_ctx.showSkillsModal)
8227
8774
  ? (_openBlock(), _createElementBlock("div", {
8228
- key: 15,
8775
+ key: 17,
8229
8776
  class: "modal-overlay",
8230
8777
  onClick: _withModifiers(_ctx.closeSkillsModal, ["self"])
8231
8778
  }, [
@@ -8523,12 +9070,12 @@ return function render(_ctx, _cache) {
8523
9070
  }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]),
8524
9071
  (_ctx.showHealthCheckModal)
8525
9072
  ? (_openBlock(), _createElementBlock("div", {
8526
- key: 16,
9073
+ key: 18,
8527
9074
  class: "modal-overlay",
8528
9075
  onClick: _withModifiers($event => (_ctx.showHealthCheckModal = false), ["self"])
8529
9076
  }, [
8530
9077
  _createElementVNode("div", {
8531
- class: "modal",
9078
+ class: "modal modal-health-check",
8532
9079
  role: "dialog",
8533
9080
  "aria-modal": "true",
8534
9081
  "aria-labelledby": "health-check-modal-title"
@@ -8537,73 +9084,155 @@ return function render(_ctx, _cache) {
8537
9084
  class: "modal-title",
8538
9085
  id: "health-check-modal-title"
8539
9086
  }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */),
8540
- (!_ctx.healthCheckResult)
8541
- ? (_openBlock(), _createElementBlock("div", {
8542
- key: 0,
8543
- class: "state-message"
8544
- }, _toDisplayString(_ctx.t('common.notLoaded')), 1 /* TEXT */))
8545
- : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [
8546
- _createElementVNode("div", { class: "form-hint" }, [
8547
- _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('config.health.ok') : _ctx.t('config.health.fail')) + " ", 1 /* TEXT */),
8548
- (_ctx.healthCheckResult.issues)
8549
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, "(" + _toDisplayString(_ctx.t('config.health.issues', { count: _ctx.healthCheckResult.issues.length })) + ")", 1 /* TEXT */))
9087
+ _createElementVNode("div", { class: "health-check-modal-body" }, [
9088
+ (!_ctx.healthCheckResult)
9089
+ ? (_openBlock(), _createElementBlock("div", {
9090
+ key: 0,
9091
+ class: "state-message"
9092
+ }, _toDisplayString(_ctx.t('common.notLoaded')), 1 /* TEXT */))
9093
+ : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [
9094
+ _createElementVNode("div", { class: "form-hint" }, [
9095
+ _createTextVNode(_toDisplayString(_ctx.healthCheckResult.ok ? _ctx.t('config.health.ok') : _ctx.t('config.health.fail')) + " ", 1 /* TEXT */),
9096
+ (_ctx.healthCheckResult.issues)
9097
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, "(" + _toDisplayString(_ctx.t('config.health.issues', { count: _ctx.healthCheckResult.issues.length })) + ")", 1 /* TEXT */))
9098
+ : _createCommentVNode("v-if", true)
9099
+ ]),
9100
+ (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.type === 'remote-health-check')
9101
+ ? (_openBlock(), _createElementBlock("div", {
9102
+ key: 0,
9103
+ class: "form-hint"
9104
+ }, [
9105
+ _createTextVNode(_toDisplayString(_ctx.healthCheckResult.remote.endpoint || '') + " ", 1 /* TEXT */),
9106
+ (_ctx.healthCheckResult.remote.statusCode)
9107
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, " · " + _toDisplayString(_ctx.healthCheckResult.remote.statusCode), 1 /* TEXT */))
9108
+ : _createCommentVNode("v-if", true),
9109
+ (_ctx.healthCheckResult.remote.message)
9110
+ ? (_openBlock(), _createElementBlock("span", { key: 1 }, " · " + _toDisplayString(_ctx.healthCheckResult.remote.message), 1 /* TEXT */))
9111
+ : _createCommentVNode("v-if", true)
9112
+ ]))
9113
+ : _createCommentVNode("v-if", true),
9114
+ (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.type === 'providers-health')
9115
+ ? (_openBlock(), _createElementBlock("div", {
9116
+ key: 1,
9117
+ class: "form-hint"
9118
+ }, _toDisplayString(_ctx.t('config.health.providersSummary', _ctx.healthCheckResult.remote.summary || { total: 0, green: 0, yellow: 0, red: 0 })), 1 /* TEXT */))
9119
+ : _createCommentVNode("v-if", true),
9120
+ (_ctx.getHealthCheckFailedProviderItems().length)
9121
+ ? (_openBlock(), _createElementBlock("div", {
9122
+ key: 2,
9123
+ class: "model-list health-failed-provider-list"
9124
+ }, [
9125
+ _createElementVNode("div", { class: "model-item health-failed-provider-header" }, [
9126
+ _createElementVNode("span", { class: "health-failed-provider-main" }, [
9127
+ _createElementVNode("input", {
9128
+ type: "checkbox",
9129
+ checked: _ctx.areAllHealthCheckFailedProvidersSelected(),
9130
+ disabled: !_ctx.getSelectableHealthCheckFailedProviderItems().length || _ctx.healthCheckFailedProviderDeleting,
9131
+ onChange: $event => (_ctx.setAllHealthCheckFailedProviderSelections($event.target.checked)),
9132
+ "aria-label": _ctx.t('config.health.failedProviders.selectAllAria')
9133
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "disabled", "onChange", "aria-label"]),
9134
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('config.health.failedProviders.title')), 1 /* TEXT */)
9135
+ ]),
9136
+ _createElementVNode("span", { class: "health-failed-provider-actions" }, [
9137
+ _createElementVNode("button", {
9138
+ type: "button",
9139
+ class: "btn-link",
9140
+ disabled: !_ctx.getSelectableHealthCheckFailedProviderItems().length || _ctx.healthCheckFailedProviderDeleting,
9141
+ onClick: $event => (_ctx.setAllHealthCheckFailedProviderSelections(true))
9142
+ }, _toDisplayString(_ctx.t('config.health.failedProviders.selectAll')), 9 /* TEXT, PROPS */, ["disabled", "onClick"]),
9143
+ _createElementVNode("button", {
9144
+ type: "button",
9145
+ class: "btn-link",
9146
+ disabled: !_ctx.hasHealthCheckFailedProviderSelection() || _ctx.healthCheckFailedProviderDeleting,
9147
+ onClick: $event => (_ctx.setAllHealthCheckFailedProviderSelections(false))
9148
+ }, _toDisplayString(_ctx.t('config.health.failedProviders.clearSelection')), 9 /* TEXT, PROPS */, ["disabled", "onClick"]),
9149
+ _createElementVNode("span", { class: "latency error" }, _toDisplayString(_ctx.getHealthCheckFailedProviderItems().length), 1 /* TEXT */)
9150
+ ])
9151
+ ]),
9152
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.getHealthCheckFailedProviderItems(), (item) => {
9153
+ return (_openBlock(), _createElementBlock("label", {
9154
+ key: item.key,
9155
+ class: _normalizeClass(["model-item health-failed-provider-item", { disabled: !item.deletable }])
9156
+ }, [
9157
+ _createElementVNode("span", { class: "health-failed-provider-main" }, [
9158
+ _createElementVNode("input", {
9159
+ type: "checkbox",
9160
+ checked: item.selected,
9161
+ disabled: !item.deletable || _ctx.healthCheckFailedProviderDeleting,
9162
+ onChange: $event => (_ctx.toggleHealthCheckFailedProviderSelection(item, $event.target.checked)),
9163
+ "aria-label": _ctx.t('config.health.failedProviders.selectAria', { name: item.name })
9164
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "disabled", "onChange", "aria-label"]),
9165
+ _createElementVNode("span", null, [
9166
+ _createElementVNode("strong", null, _toDisplayString(item.name), 1 /* TEXT */),
9167
+ (item.detail)
9168
+ ? (_openBlock(), _createElementBlock("span", {
9169
+ key: 0,
9170
+ class: "form-hint"
9171
+ }, _toDisplayString(item.detail), 1 /* TEXT */))
9172
+ : _createCommentVNode("v-if", true),
9173
+ (!item.deletable)
9174
+ ? (_openBlock(), _createElementBlock("span", {
9175
+ key: 1,
9176
+ class: "form-hint"
9177
+ }, _toDisplayString(item.blockedReason === 'readonly' ? _ctx.t('config.health.failedProviders.writeRequired') : _ctx.t('config.health.failedProviders.notDeletable')), 1 /* TEXT */))
9178
+ : _createCommentVNode("v-if", true)
9179
+ ])
9180
+ ]),
9181
+ _createElementVNode("span", { class: "latency error" }, _toDisplayString(item.status), 1 /* TEXT */)
9182
+ ], 2 /* CLASS */))
9183
+ }), 128 /* KEYED_FRAGMENT */))
9184
+ ]))
9185
+ : _createCommentVNode("v-if", true),
9186
+ (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.speedTests)
9187
+ ? (_openBlock(), _createElementBlock("div", {
9188
+ key: 3,
9189
+ class: "model-list"
9190
+ }, [
9191
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.healthCheckResult.remote.speedTests, (result, name) => {
9192
+ return (_openBlock(), _createElementBlock("div", {
9193
+ key: 'health-speed-' + name,
9194
+ class: "model-item"
9195
+ }, [
9196
+ _createElementVNode("span", null, _toDisplayString(name), 1 /* TEXT */),
9197
+ (result && result.ok)
9198
+ ? (_openBlock(), _createElementBlock("span", {
9199
+ key: 0,
9200
+ class: "latency ok"
9201
+ }, _toDisplayString(_ctx.formatLatency(result)), 1 /* TEXT */))
9202
+ : (_openBlock(), _createElementBlock("span", {
9203
+ key: 1,
9204
+ class: "latency error"
9205
+ }, _toDisplayString((result && result.error) ? result.error : _ctx.t('config.health.fail')), 1 /* TEXT */))
9206
+ ]))
9207
+ }), 128 /* KEYED_FRAGMENT */))
9208
+ ]))
9209
+ : _createCommentVNode("v-if", true),
9210
+ (_ctx.healthCheckResult.issues && _ctx.healthCheckResult.issues.length)
9211
+ ? (_openBlock(), _createElementBlock("div", {
9212
+ key: 4,
9213
+ class: "model-list"
9214
+ }, [
9215
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.healthCheckResult.issues, (issue, index) => {
9216
+ return (_openBlock(), _createElementBlock("div", {
9217
+ key: issue.code || ('health-issue-' + index),
9218
+ class: "model-item"
9219
+ }, [
9220
+ _createElementVNode("span", null, _toDisplayString(issue.message || issue.code || ''), 1 /* TEXT */)
9221
+ ]))
9222
+ }), 128 /* KEYED_FRAGMENT */))
9223
+ ]))
8550
9224
  : _createCommentVNode("v-if", true)
8551
- ]),
8552
- (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.type === 'remote-health-check')
8553
- ? (_openBlock(), _createElementBlock("div", {
8554
- key: 0,
8555
- class: "form-hint"
8556
- }, [
8557
- _createTextVNode(_toDisplayString(_ctx.healthCheckResult.remote.endpoint || '') + " ", 1 /* TEXT */),
8558
- (_ctx.healthCheckResult.remote.statusCode)
8559
- ? (_openBlock(), _createElementBlock("span", { key: 0 }, " · " + _toDisplayString(_ctx.healthCheckResult.remote.statusCode), 1 /* TEXT */))
8560
- : _createCommentVNode("v-if", true),
8561
- (_ctx.healthCheckResult.remote.message)
8562
- ? (_openBlock(), _createElementBlock("span", { key: 1 }, " · " + _toDisplayString(_ctx.healthCheckResult.remote.message), 1 /* TEXT */))
8563
- : _createCommentVNode("v-if", true)
8564
- ]))
8565
- : _createCommentVNode("v-if", true),
8566
- (_ctx.healthCheckResult.remote && _ctx.healthCheckResult.remote.speedTests)
8567
- ? (_openBlock(), _createElementBlock("div", {
8568
- key: 1,
8569
- class: "model-list"
8570
- }, [
8571
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.healthCheckResult.remote.speedTests, (result, name) => {
8572
- return (_openBlock(), _createElementBlock("div", {
8573
- key: 'health-speed-' + name,
8574
- class: "model-item"
8575
- }, [
8576
- _createElementVNode("span", null, _toDisplayString(name), 1 /* TEXT */),
8577
- (result && result.ok)
8578
- ? (_openBlock(), _createElementBlock("span", {
8579
- key: 0,
8580
- class: "latency ok"
8581
- }, _toDisplayString(_ctx.formatLatency(result)), 1 /* TEXT */))
8582
- : (_openBlock(), _createElementBlock("span", {
8583
- key: 1,
8584
- class: "latency error"
8585
- }, _toDisplayString((result && result.error) ? result.error : _ctx.t('config.health.fail')), 1 /* TEXT */))
8586
- ]))
8587
- }), 128 /* KEYED_FRAGMENT */))
8588
- ]))
8589
- : _createCommentVNode("v-if", true),
8590
- (_ctx.healthCheckResult.issues && _ctx.healthCheckResult.issues.length)
8591
- ? (_openBlock(), _createElementBlock("div", {
8592
- key: 2,
8593
- class: "model-list"
8594
- }, [
8595
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.healthCheckResult.issues, (issue, index) => {
8596
- return (_openBlock(), _createElementBlock("div", {
8597
- key: issue.code || ('health-issue-' + index),
8598
- class: "model-item"
8599
- }, [
8600
- _createElementVNode("span", null, _toDisplayString(issue.message || issue.code || ''), 1 /* TEXT */)
8601
- ]))
8602
- }), 128 /* KEYED_FRAGMENT */))
8603
- ]))
8604
- : _createCommentVNode("v-if", true)
8605
- ], 64 /* STABLE_FRAGMENT */)),
8606
- _createElementVNode("div", { class: "btn-group" }, [
9225
+ ], 64 /* STABLE_FRAGMENT */))
9226
+ ]),
9227
+ _createElementVNode("div", { class: "btn-group health-check-modal-actions" }, [
9228
+ (_ctx.getHealthCheckFailedProviderItems().length)
9229
+ ? (_openBlock(), _createElementBlock("button", {
9230
+ key: 0,
9231
+ class: "btn btn-confirm btn-danger",
9232
+ disabled: _ctx.healthCheckFailedProviderDeleting || !_ctx.hasHealthCheckFailedProviderSelection(),
9233
+ onClick: $event => (_ctx.deleteSelectedHealthCheckFailedProviders())
9234
+ }, _toDisplayString(_ctx.healthCheckFailedProviderDeleting ? _ctx.t('config.health.failedProviders.deleting') : _ctx.t('config.health.failedProviders.deleteSelected')), 9 /* TEXT, PROPS */, ["disabled", "onClick"]))
9235
+ : _createCommentVNode("v-if", true),
8607
9236
  _createElementVNode("button", {
8608
9237
  class: "btn btn-confirm",
8609
9238
  onClick: $event => (_ctx.showHealthCheckModal = false)
@@ -8614,7 +9243,7 @@ return function render(_ctx, _cache) {
8614
9243
  : _createCommentVNode("v-if", true),
8615
9244
  (_ctx.showConfirmDialog)
8616
9245
  ? (_openBlock(), _createElementBlock("div", {
8617
- key: 17,
9246
+ key: 19,
8618
9247
  class: "modal-overlay",
8619
9248
  onClick: _withModifiers(_ctx.closeConfirmDialog, ["self"])
8620
9249
  }, [
@@ -8652,7 +9281,7 @@ return function render(_ctx, _cache) {
8652
9281
  _createCommentVNode(" Toast "),
8653
9282
  (_ctx.message)
8654
9283
  ? (_openBlock(), _createElementBlock("div", {
8655
- key: 18,
9284
+ key: 20,
8656
9285
  class: _normalizeClass(['toast', _ctx.messageType]),
8657
9286
  role: "status",
8658
9287
  "aria-live": "polite",