codexmate 0.0.43 → 0.0.45

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 +2 -0
  2. package/README.zh.md +2 -0
  3. package/cli/claude-proxy.js +611 -14
  4. package/cli/update.js +77 -7
  5. package/cli.js +188 -21
  6. package/package.json +1 -1
  7. package/web-ui/app.js +36 -3
  8. package/web-ui/index.html +1 -0
  9. package/web-ui/logic.claude.mjs +65 -2
  10. package/web-ui/logic.runtime.mjs +0 -7
  11. package/web-ui/modules/app.computed.index.mjs +3 -1
  12. package/web-ui/modules/app.computed.main-tabs.mjs +3 -0
  13. package/web-ui/modules/app.computed.prompts.mjs +28 -0
  14. package/web-ui/modules/app.computed.session.mjs +23 -1
  15. package/web-ui/modules/app.methods.agents.mjs +50 -4
  16. package/web-ui/modules/app.methods.claude-config.mjs +28 -12
  17. package/web-ui/modules/app.methods.index.mjs +1 -1
  18. package/web-ui/modules/app.methods.install.mjs +129 -1
  19. package/web-ui/modules/app.methods.navigation.mjs +2 -1
  20. package/web-ui/modules/app.methods.session-actions.mjs +17 -2
  21. package/web-ui/modules/app.methods.session-timeline.mjs +0 -1
  22. package/web-ui/modules/app.methods.startup-claude.mjs +26 -3
  23. package/web-ui/modules/i18n/locales/en.mjs +42 -5
  24. package/web-ui/modules/i18n/locales/ja.mjs +42 -5
  25. package/web-ui/modules/i18n/locales/vi.mjs +51 -0
  26. package/web-ui/modules/i18n/locales/zh.mjs +42 -5
  27. package/web-ui/partials/index/layout-footer.html +1 -1
  28. package/web-ui/partials/index/layout-header.html +64 -0
  29. package/web-ui/partials/index/modal-config-template-agents.html +12 -13
  30. package/web-ui/partials/index/modals-basic.html +18 -1
  31. package/web-ui/partials/index/panel-config-claude.html +4 -7
  32. package/web-ui/partials/index/panel-config-codex.html +2 -6
  33. package/web-ui/partials/index/panel-prompts.html +100 -0
  34. package/web-ui/partials/index/panel-sessions.html +30 -10
  35. package/web-ui/partials/index/panel-usage.html +34 -18
  36. package/web-ui/res/web-ui-render.precompiled.js +579 -149
  37. package/web-ui/styles/controls-forms.css +5 -5
  38. package/web-ui/styles/layout-shell.css +145 -0
  39. package/web-ui/styles/modals-core.css +162 -0
  40. package/web-ui/styles/responsive.css +77 -5
  41. package/web-ui/styles/sessions-toolbar-trash.css +45 -10
  42. package/web-ui/styles/sessions-usage.css +31 -2
@@ -1,11 +1,39 @@
1
1
  window.__CODEXMATE_WEB_UI_RENDER__ = (() => {
2
- const { toDisplayString: _toDisplayString, normalizeClass: _normalizeClass, createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, createTextVNode: _createTextVNode, Fragment: _Fragment, renderList: _renderList, vShow: _vShow, withDirectives: _withDirectives, vModelSelect: _vModelSelect, vModelText: _vModelText, withKeys: _withKeys, withModifiers: _withModifiers, isMemoSame: _isMemoSame, withMemo: _withMemo, normalizeStyle: _normalizeStyle, vModelDynamic: _vModelDynamic, vModelCheckbox: _vModelCheckbox } = Vue
2
+ const { toDisplayString: _toDisplayString, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, createTextVNode: _createTextVNode, createElementVNode: _createElementVNode, normalizeClass: _normalizeClass, Fragment: _Fragment, renderList: _renderList, vShow: _vShow, withDirectives: _withDirectives, vModelSelect: _vModelSelect, vModelText: _vModelText, withKeys: _withKeys, withModifiers: _withModifiers, isMemoSame: _isMemoSame, withMemo: _withMemo, normalizeStyle: _normalizeStyle, vModelDynamic: _vModelDynamic, vModelCheckbox: _vModelCheckbox } = Vue
3
3
 
4
4
  return function render(_ctx, _cache) {
5
5
  return (_openBlock(), _createElementBlock(_Fragment, null, [
6
6
  (!_ctx.sessionStandalone)
7
7
  ? (_openBlock(), _createElementBlock("div", {
8
8
  key: 0,
9
+ class: "mobile-brand-bar"
10
+ }, [
11
+ _createElementVNode("div", { class: "mobile-brand-title" }, [
12
+ _createTextVNode("Codex Mate"),
13
+ (_ctx.appVersion)
14
+ ? (_openBlock(), _createElementBlock("span", {
15
+ key: 0,
16
+ class: "brand-version"
17
+ }, " v" + _toDisplayString(_ctx.appVersion), 1 /* TEXT */))
18
+ : _createCommentVNode("v-if", true)
19
+ ]),
20
+ (_ctx.isAppVersionStatusVisible())
21
+ ? (_openBlock(), _createElementBlock("button", {
22
+ key: 0,
23
+ type: "button",
24
+ class: _normalizeClass(['mobile-update-chip', 'mobile-update-chip--' + _ctx.appVersionStatusKind()]),
25
+ title: _ctx.appVersionStatusTitle(),
26
+ onClick: _ctx.handleAppVersionStatusClick
27
+ }, [
28
+ _createElementVNode("span", { class: "side-update-dot" }),
29
+ _createElementVNode("span", { class: "mobile-update-text" }, _toDisplayString(_ctx.appUpdateNoticeText()), 1 /* TEXT */)
30
+ ], 10 /* CLASS, PROPS */, ["title", "onClick"]))
31
+ : _createCommentVNode("v-if", true)
32
+ ]))
33
+ : _createCommentVNode("v-if", true),
34
+ (!_ctx.sessionStandalone)
35
+ ? (_openBlock(), _createElementBlock("div", {
36
+ key: 1,
9
37
  class: "top-tabs",
10
38
  role: "tablist",
11
39
  "aria-label": _ctx.t('nav.topTabs.aria')
@@ -110,6 +138,18 @@ return function render(_ctx, _cache) {
110
138
  onPointerdown: $event => (_ctx.onMainTabPointerDown('plugins', $event)),
111
139
  onClick: $event => (_ctx.onMainTabClick('plugins', $event))
112
140
  }, _toDisplayString(_ctx.t('tab.plugins')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]),
141
+ _createElementVNode("button", {
142
+ type: "button",
143
+ class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('prompts') }]),
144
+ id: "tab-prompts",
145
+ role: "tab",
146
+ "data-main-tab": "prompts",
147
+ tabindex: _ctx.mainTab === 'prompts' ? 0 : -1,
148
+ "aria-selected": _ctx.mainTab === 'prompts',
149
+ "aria-controls": "panel-prompts",
150
+ onPointerdown: $event => (_ctx.onMainTabPointerDown('prompts', $event)),
151
+ onClick: $event => (_ctx.onMainTabClick('prompts', $event))
152
+ }, _toDisplayString(_ctx.t('tab.prompts')), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, ["tabindex", "aria-selected", "onPointerdown", "onClick"]),
113
153
  _createElementVNode("button", {
114
154
  type: "button",
115
155
  class: _normalizeClass(["top-tab", { active: _ctx.isMainTabNavActive('settings') }]),
@@ -126,7 +166,7 @@ return function render(_ctx, _cache) {
126
166
  : _createCommentVNode("v-if", true),
127
167
  (!_ctx.sessionStandalone)
128
168
  ? (_openBlock(), _createElementBlock("div", {
129
- key: 1,
169
+ key: 2,
130
170
  class: "lang-fab"
131
171
  }, [
132
172
  _createElementVNode("button", {
@@ -163,7 +203,22 @@ return function render(_ctx, _cache) {
163
203
  : _createCommentVNode("v-if", true)
164
204
  ])
165
205
  ])
166
- ])
206
+ ]),
207
+ (_ctx.isAppVersionStatusVisible())
208
+ ? (_openBlock(), _createElementBlock("button", {
209
+ key: 0,
210
+ type: "button",
211
+ class: _normalizeClass(['side-update-notice', 'side-update-notice--' + _ctx.appVersionStatusKind()]),
212
+ title: _ctx.appVersionStatusTitle(),
213
+ onClick: _ctx.handleAppVersionStatusClick
214
+ }, [
215
+ _createElementVNode("span", { class: "side-update-dot" }),
216
+ _createElementVNode("span", { class: "side-update-copy" }, [
217
+ _createElementVNode("span", { class: "side-update-title" }, _toDisplayString(_ctx.appUpdateNoticeText()), 1 /* TEXT */),
218
+ _createElementVNode("span", { class: "side-update-meta" }, _toDisplayString(_ctx.appUpdateNoticeMeta()), 1 /* TEXT */)
219
+ ])
220
+ ], 10 /* CLASS, PROPS */, ["title", "onClick"]))
221
+ : _createCommentVNode("v-if", true)
167
222
  ]),
168
223
  _createElementVNode("div", { class: "side-rail-nav" }, [
169
224
  _createElementVNode("div", {
@@ -266,6 +321,41 @@ return function render(_ctx, _cache) {
266
321
  ])
267
322
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"])
268
323
  ], 8 /* PROPS */, ["aria-label"]),
324
+ _createElementVNode("div", {
325
+ class: "side-section",
326
+ role: "navigation",
327
+ "aria-label": _ctx.t('side.prompts')
328
+ }, [
329
+ _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.prompts')), 1 /* TEXT */),
330
+ _createElementVNode("button", {
331
+ id: "side-tab-prompts-agents",
332
+ "data-main-tab": "prompts",
333
+ "data-prompts-sub-tab": "codex",
334
+ "aria-current": _ctx.mainTab === 'prompts' && _ctx.promptsSubTab === 'codex' ? 'page' : null,
335
+ class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('prompts') && _ctx.promptsSubTab === 'codex' }]),
336
+ onPointerdown: $event => (_ctx.onMainTabPointerDown('prompts', $event)),
337
+ onClick: $event => {_ctx.switchPromptsSubTab('codex'); _ctx.onMainTabClick('prompts')}
338
+ }, [
339
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.prompts.agents')), 1 /* TEXT */),
340
+ _createElementVNode("div", { class: "side-item-meta" }, [
341
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.prompts.agents.meta')), 1 /* TEXT */)
342
+ ])
343
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
344
+ _createElementVNode("button", {
345
+ id: "side-tab-prompts-claude",
346
+ "data-main-tab": "prompts",
347
+ "data-prompts-sub-tab": "claude-md",
348
+ "aria-current": _ctx.mainTab === 'prompts' && _ctx.promptsSubTab === 'claude-md' ? 'page' : null,
349
+ class: _normalizeClass(['side-item', { active: _ctx.isMainTabNavActive('prompts') && _ctx.promptsSubTab === 'claude-md' }]),
350
+ onPointerdown: $event => (_ctx.onMainTabPointerDown('prompts', $event)),
351
+ onClick: $event => {_ctx.switchPromptsSubTab('claude-md'); _ctx.onMainTabClick('prompts')}
352
+ }, [
353
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.prompts.claude')), 1 /* TEXT */),
354
+ _createElementVNode("div", { class: "side-item-meta" }, [
355
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.prompts.claude.meta')), 1 /* TEXT */)
356
+ ])
357
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"])
358
+ ], 8 /* PROPS */, ["aria-label"]),
269
359
  _createElementVNode("div", {
270
360
  class: "side-section",
271
361
  role: "navigation",
@@ -958,6 +1048,7 @@ return function render(_ctx, _cache) {
958
1048
  _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
959
1049
  _createElementVNode("input", {
960
1050
  type: "checkbox",
1051
+ autocomplete: "off",
961
1052
  checked: _ctx.isToolConfigWriteAllowed('codex'),
962
1053
  disabled: _ctx.toolConfigPermissionSaving.codex,
963
1054
  onChange: $event => (_ctx.setToolConfigPermission('codex', $event.target.checked))
@@ -1014,16 +1105,6 @@ return function render(_ctx, _cache) {
1014
1105
  ])
1015
1106
  ]))
1016
1107
  : _createCommentVNode("v-if", true),
1017
- _createElementVNode("div", { class: "selector-section" }, [
1018
- _createElementVNode("div", { class: "selector-header" }, [
1019
- _createElementVNode("span", { class: "selector-title" }, "AGENTS.md")
1020
- ]),
1021
- _createElementVNode("button", {
1022
- class: "btn-tool",
1023
- onClick: _ctx.openAgentsEditor,
1024
- disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
1025
- }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('config.agents.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1026
- ]),
1027
1108
  _createElementVNode("div", { class: "selector-section" }, [
1028
1109
  _createElementVNode("div", { class: "selector-header" }, [
1029
1110
  _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.models')), 1 /* TEXT */),
@@ -1583,6 +1664,7 @@ return function render(_ctx, _cache) {
1583
1664
  _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
1584
1665
  _createElementVNode("input", {
1585
1666
  type: "checkbox",
1667
+ autocomplete: "off",
1586
1668
  checked: _ctx.isToolConfigWriteAllowed('claude'),
1587
1669
  disabled: _ctx.toolConfigPermissionSaving.claude,
1588
1670
  onChange: $event => (_ctx.setToolConfigPermission('claude', $event.target.checked))
@@ -1776,17 +1858,6 @@ return function render(_ctx, _cache) {
1776
1858
  disabled: _ctx.loading || !!_ctx.initError
1777
1859
  }, _toDisplayString(_ctx.t('config.template.openEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
1778
1860
  ]),
1779
- _createElementVNode("div", { class: "selector-section" }, [
1780
- _createElementVNode("div", { class: "selector-header" }, [
1781
- _createElementVNode("span", { class: "selector-title" }, "CLAUDE.md")
1782
- ]),
1783
- _createElementVNode("button", {
1784
- class: "btn-tool",
1785
- onClick: _ctx.openClaudeMdEditor,
1786
- disabled: _ctx.loading || !!_ctx.initError || _ctx.agentsLoading
1787
- }, _toDisplayString(_ctx.agentsLoading ? _ctx.t('config.modelLoading') : _ctx.t('claude.md.open')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
1788
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('claude.md.hint')), 1 /* TEXT */)
1789
- ]),
1790
1861
  _createElementVNode("div", { class: "selector-section" }, [
1791
1862
  _createElementVNode("div", { class: "selector-header" }, [
1792
1863
  _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('config.health.title')), 1 /* TEXT */)
@@ -1905,13 +1976,33 @@ return function render(_ctx, _cache) {
1905
1976
  "aria-current": _ctx.currentClaudeConfig === name ? 'true' : null
1906
1977
  }, [
1907
1978
  _createElementVNode("div", { class: "card-leading" }, [
1908
- _createElementVNode("div", { class: "card-icon" }, _toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */),
1979
+ _createElementVNode("div", { class: "card-icon" }, [
1980
+ _createTextVNode(_toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */),
1981
+ (config.targetApi === 'chat_completions' || config.targetApi === 'ollama')
1982
+ ? (_openBlock(), _createElementBlock("span", {
1983
+ key: 0,
1984
+ class: "card-icon-dot",
1985
+ title: _ctx.t('config.transformProvider.title')
1986
+ }, null, 8 /* PROPS */, ["title"]))
1987
+ : _createCommentVNode("v-if", true)
1988
+ ]),
1909
1989
  _createElementVNode("div", { class: "card-content" }, [
1910
1990
  _createElementVNode("div", { class: "card-title" }, _toDisplayString(name), 1 /* TEXT */),
1911
1991
  _createElementVNode("div", { class: "card-subtitle card-subtitle-model" }, _toDisplayString(config.model || _ctx.t('claude.model.unset')), 1 /* TEXT */),
1912
- (config.baseUrl)
1992
+ (config.targetApi === 'chat_completions')
1913
1993
  ? (_openBlock(), _createElementBlock("div", {
1914
1994
  key: 0,
1995
+ class: "card-subtitle"
1996
+ }, _toDisplayString(_ctx.t('claude.targetApi.chatCompletionsBadge')), 1 /* TEXT */))
1997
+ : (config.targetApi === 'ollama')
1998
+ ? (_openBlock(), _createElementBlock("div", {
1999
+ key: 1,
2000
+ class: "card-subtitle"
2001
+ }, _toDisplayString(_ctx.t('claude.targetApi.ollamaBadge')), 1 /* TEXT */))
2002
+ : _createCommentVNode("v-if", true),
2003
+ (config.baseUrl)
2004
+ ? (_openBlock(), _createElementBlock("div", {
2005
+ key: 2,
1915
2006
  class: "card-subtitle card-subtitle-url"
1916
2007
  }, _toDisplayString(config.baseUrl), 1 /* TEXT */))
1917
2008
  : _createCommentVNode("v-if", true)
@@ -2585,31 +2676,163 @@ return function render(_ctx, _cache) {
2585
2676
  _createElementVNode("button", {
2586
2677
  class: "btn-session-refresh",
2587
2678
  onClick: _ctx.loadActiveSessionDetail,
2588
- disabled: _ctx.sessionDetailLoading || !_ctx.activeSession
2589
- }, _toDisplayString(_ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
2679
+ disabled: _ctx.sessionDetailLoading || !_ctx.activeSession,
2680
+ title: _ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh'),
2681
+ "aria-label": _ctx.sessionDetailLoading ? _ctx.t('sessions.preview.loading') : _ctx.t('sessions.preview.refresh')
2682
+ }, [
2683
+ (_openBlock(), _createElementBlock("svg", {
2684
+ viewBox: "0 0 16 16",
2685
+ fill: "none",
2686
+ stroke: "currentColor",
2687
+ "stroke-width": "1.8",
2688
+ "stroke-linecap": "round",
2689
+ "stroke-linejoin": "round"
2690
+ }, [
2691
+ _createElementVNode("path", { d: "M2.5 8a5.5 5.5 0 0 1 9.4-3.8" }),
2692
+ _createElementVNode("path", { d: "M13.5 8a5.5 5.5 0 0 1-9.4 3.8" }),
2693
+ _createElementVNode("polyline", { points: "2.5 2 2.5 5 5.5 5" }),
2694
+ _createElementVNode("polyline", { points: "13.5 14 13.5 11 10.5 11" })
2695
+ ]))
2696
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
2590
2697
  (_ctx.isDeleteAvailable(_ctx.activeSession))
2591
2698
  ? (_openBlock(), _createElementBlock("button", {
2592
2699
  key: 0,
2593
2700
  class: "btn-session-delete",
2594
2701
  onClick: $event => (_ctx.deleteSession(_ctx.activeSession)),
2595
- disabled: !_ctx.activeSession || _ctx.sessionsLoading || _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]
2596
- }, _toDisplayString((_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"]))
2702
+ disabled: !_ctx.activeSession || _ctx.sessionsLoading || _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)],
2703
+ title: (_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash')),
2704
+ "aria-label": (_ctx.activeSession && _ctx.sessionDeleting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleting') : _ctx.t('sessions.preview.moving')) : (_ctx.sessionTrashEnabled === false ? _ctx.t('sessions.preview.deleteHard') : _ctx.t('sessions.preview.moveToTrash'))
2705
+ }, [
2706
+ (_openBlock(), _createElementBlock("svg", {
2707
+ viewBox: "0 0 16 16",
2708
+ fill: "none",
2709
+ stroke: "currentColor",
2710
+ "stroke-width": "1.8",
2711
+ "stroke-linecap": "round",
2712
+ "stroke-linejoin": "round"
2713
+ }, [
2714
+ _createElementVNode("polyline", { points: "3 4 4 4 13 4" }),
2715
+ _createElementVNode("path", { d: "M5.5 4V2.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4" }),
2716
+ _createElementVNode("path", { d: "M12 4v9.5a1.5 1.5 0 0 1-1.5 1.5h-5A1.5 1.5 0 0 1 4 13.5V4" })
2717
+ ]))
2718
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]))
2597
2719
  : _createCommentVNode("v-if", true),
2598
2720
  _createElementVNode("button", {
2599
2721
  class: "btn-session-export",
2600
2722
  onClick: $event => (_ctx.exportSession(_ctx.activeSession)),
2601
- disabled: !_ctx.activeSession || _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)]
2602
- }, _toDisplayString((_ctx.activeSession && _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? _ctx.t('sessions.preview.exporting') : _ctx.t('sessions.preview.export')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
2603
- _createElementVNode("button", {
2604
- class: "btn-session-open",
2605
- onClick: $event => (_ctx.copySessionLink(_ctx.activeSession)),
2606
- disabled: !_ctx.activeSession
2607
- }, _toDisplayString(_ctx.t('sessions.preview.copyLink')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
2723
+ disabled: !_ctx.activeSession || _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)],
2724
+ title: (_ctx.activeSession && _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? _ctx.t('sessions.preview.exporting') : _ctx.t('sessions.preview.export'),
2725
+ "aria-label": (_ctx.activeSession && _ctx.sessionExporting[_ctx.getSessionExportKey(_ctx.activeSession)]) ? _ctx.t('sessions.preview.exporting') : _ctx.t('sessions.preview.export')
2726
+ }, [
2727
+ (_openBlock(), _createElementBlock("svg", {
2728
+ viewBox: "0 0 16 16",
2729
+ fill: "none",
2730
+ stroke: "currentColor",
2731
+ "stroke-width": "1.8",
2732
+ "stroke-linecap": "round",
2733
+ "stroke-linejoin": "round"
2734
+ }, [
2735
+ _createElementVNode("path", { d: "M8 2v8" }),
2736
+ _createElementVNode("polyline", { points: "4 7 8 10.5 12 7" }),
2737
+ _createElementVNode("path", { d: "M2.5 12v1.5a1 1 0 0 0 1 1h9a1 1 0 0 0 1-1V12" })
2738
+ ]))
2739
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
2740
+ _createElementVNode("div", { class: "session-link-group" }, [
2741
+ _createElementVNode("button", {
2742
+ class: "btn-session-open",
2743
+ onClick: $event => (_ctx.copySessionLink(_ctx.activeSession)),
2744
+ disabled: !_ctx.activeSession || !_ctx.canBuildStandaloneUrl(_ctx.activeSession),
2745
+ title: _ctx.t('sessions.preview.copyLink'),
2746
+ "aria-label": _ctx.t('sessions.preview.copyLink')
2747
+ }, [
2748
+ (_openBlock(), _createElementBlock("svg", {
2749
+ viewBox: "0 0 16 16",
2750
+ fill: "none",
2751
+ stroke: "currentColor",
2752
+ "stroke-width": "1.8",
2753
+ "stroke-linecap": "round",
2754
+ "stroke-linejoin": "round"
2755
+ }, [
2756
+ _createElementVNode("rect", {
2757
+ x: "6",
2758
+ y: "2.5",
2759
+ width: "4",
2760
+ height: "2",
2761
+ rx: "1"
2762
+ }),
2763
+ _createElementVNode("path", { d: "M4.5 4h7a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5" }),
2764
+ _createElementVNode("line", {
2765
+ x1: "6",
2766
+ y1: "7.5",
2767
+ x2: "10",
2768
+ y2: "7.5"
2769
+ }),
2770
+ _createElementVNode("line", {
2771
+ x1: "6",
2772
+ y1: "10",
2773
+ x2: "10",
2774
+ y2: "10"
2775
+ })
2776
+ ]))
2777
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"]),
2778
+ _createElementVNode("button", {
2779
+ class: "btn-session-open",
2780
+ onClick: $event => (_ctx.openSessionLink(_ctx.activeSession)),
2781
+ disabled: !_ctx.activeSession || !_ctx.canBuildStandaloneUrl(_ctx.activeSession),
2782
+ title: _ctx.t('sessions.preview.openLink'),
2783
+ "aria-label": _ctx.t('sessions.preview.openLink')
2784
+ }, [
2785
+ (_openBlock(), _createElementBlock("svg", {
2786
+ viewBox: "0 0 16 16",
2787
+ fill: "none",
2788
+ stroke: "currentColor",
2789
+ "stroke-width": "1.8",
2790
+ "stroke-linecap": "round",
2791
+ "stroke-linejoin": "round"
2792
+ }, [
2793
+ _createElementVNode("path", { d: "M12 2h-8.5A1.5 1.5 0 0 0 2 3.5v8A1.5 1.5 0 0 0 3.5 13h8a1.5 1.5 0 0 0 1.5-1.5v-3" }),
2794
+ _createElementVNode("path", { d: "M13 2v4h-4" }),
2795
+ _createElementVNode("path", { d: "M13 2L7 8" })
2796
+ ]))
2797
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"])
2798
+ ]),
2608
2799
  _createElementVNode("button", {
2609
2800
  class: "btn-session-open",
2610
2801
  onClick: $event => (_ctx.copySessionPath(_ctx.activeSession)),
2611
- disabled: !_ctx.activeSession || !_ctx.getSessionFilePath(_ctx.activeSession)
2612
- }, _toDisplayString(_ctx.t('sessions.preview.copyPath')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2802
+ disabled: !_ctx.activeSession || !_ctx.getSessionFilePath(_ctx.activeSession),
2803
+ title: _ctx.t('sessions.preview.copyPath'),
2804
+ "aria-label": _ctx.t('sessions.preview.copyPath')
2805
+ }, [
2806
+ (_openBlock(), _createElementBlock("svg", {
2807
+ viewBox: "0 0 16 16",
2808
+ fill: "none",
2809
+ stroke: "currentColor",
2810
+ "stroke-width": "1.8",
2811
+ "stroke-linecap": "round",
2812
+ "stroke-linejoin": "round"
2813
+ }, [
2814
+ _createElementVNode("rect", {
2815
+ x: "6",
2816
+ y: "2.5",
2817
+ width: "4",
2818
+ height: "2",
2819
+ rx: "1"
2820
+ }),
2821
+ _createElementVNode("path", { d: "M4.5 4h7a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5" }),
2822
+ _createElementVNode("line", {
2823
+ x1: "6",
2824
+ y1: "7.5",
2825
+ x2: "10",
2826
+ y2: "7.5"
2827
+ }),
2828
+ _createElementVNode("line", {
2829
+ x1: "6",
2830
+ y1: "10",
2831
+ x2: "10",
2832
+ y2: "10"
2833
+ })
2834
+ ]))
2835
+ ], 8 /* PROPS */, ["onClick", "disabled", "title", "aria-label"])
2613
2836
  ])
2614
2837
  ], 512 /* NEED_PATCH */),
2615
2838
  (_ctx.sessionDetailLoading && !_ctx.sessionPreviewLoadingMore)
@@ -2915,80 +3138,106 @@ return function render(_ctx, _cache) {
2915
3138
  }, [
2916
3139
  _createElementVNode("div", { class: "usage-card-title" }, _toDisplayString(_ctx.t('usage.daily.title')), 1 /* TEXT */),
2917
3140
  _createElementVNode("div", { class: "usage-wave-container" }, [
2918
- (_openBlock(), _createElementBlock("svg", {
2919
- class: "usage-wave-chart",
2920
- viewBox: "0 0 800 140",
2921
- preserveAspectRatio: "none"
2922
- }, [
2923
- _createElementVNode("defs", null, [
2924
- _createElementVNode("linearGradient", {
2925
- id: 'wave-gradient-' + _ctx.sessionsUsageTimeRange,
2926
- x1: "0",
2927
- y1: "0",
2928
- x2: "0",
2929
- y2: "1"
2930
- }, [
2931
- _createElementVNode("stop", {
2932
- offset: "0%",
2933
- "stop-color": 'var(--color-brand)',
2934
- "stop-opacity": "0.35"
2935
- }),
2936
- _createElementVNode("stop", {
2937
- offset: "100%",
2938
- "stop-color": 'var(--color-brand)',
2939
- "stop-opacity": "0"
2940
- })
2941
- ], 8 /* PROPS */, ["id"])
2942
- ]),
2943
- _createElementVNode("path", {
2944
- d: _ctx.sessionUsageWave.areaPath,
2945
- fill: 'url(#wave-gradient-' + _ctx.sessionsUsageTimeRange + ')',
2946
- class: "usage-wave-area"
2947
- }, null, 8 /* PROPS */, ["d", "fill"]),
2948
- _createElementVNode("path", {
2949
- d: _ctx.sessionUsageWave.linePath,
2950
- fill: "none",
2951
- stroke: 'var(--color-brand)',
2952
- "stroke-width": "2.5",
2953
- "stroke-linecap": "round",
2954
- "stroke-linejoin": "round",
2955
- class: "usage-wave-line"
2956
- }, null, 8 /* PROPS */, ["d"]),
2957
- (_ctx.sessionsUsageSelectedDay)
2958
- ? (_openBlock(), _createElementBlock("line", {
2959
- key: 0,
3141
+ _createElementVNode("div", { class: "usage-wave-yaxis" }, [
3142
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageWave.yTicks, (tick) => {
3143
+ return (_openBlock(), _createElementBlock("span", {
3144
+ key: tick.value,
3145
+ class: "usage-wave-ytick",
3146
+ style: _normalizeStyle({ bottom: tick.percent + '%' })
3147
+ }, _toDisplayString(tick.label), 5 /* TEXT, STYLE */))
3148
+ }), 128 /* KEYED_FRAGMENT */))
3149
+ ]),
3150
+ _createElementVNode("div", { class: "usage-wave-chart-area" }, [
3151
+ (_openBlock(), _createElementBlock("svg", {
3152
+ class: "usage-wave-chart",
3153
+ viewBox: "0 0 800 140",
3154
+ preserveAspectRatio: "none"
3155
+ }, [
3156
+ _createElementVNode("defs", null, [
3157
+ _createElementVNode("linearGradient", {
3158
+ id: 'wave-gradient-' + _ctx.sessionsUsageTimeRange,
3159
+ x1: "0",
3160
+ y1: "0",
3161
+ x2: "0",
3162
+ y2: "1"
3163
+ }, [
3164
+ _createElementVNode("stop", {
3165
+ offset: "0%",
3166
+ "stop-color": 'var(--color-brand)',
3167
+ "stop-opacity": "0.35"
3168
+ }),
3169
+ _createElementVNode("stop", {
3170
+ offset: "100%",
3171
+ "stop-color": 'var(--color-brand)',
3172
+ "stop-opacity": "0"
3173
+ })
3174
+ ], 8 /* PROPS */, ["id"])
3175
+ ]),
3176
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageWave.yTicks, (tick) => {
3177
+ return (_openBlock(), _createElementBlock("line", {
3178
+ key: 'g-' + tick.value,
2960
3179
  x1: "0",
2961
3180
  x2: _ctx.sessionUsageWave.width,
2962
- y1: _ctx.sessionUsageWave.hoverY,
2963
- y2: _ctx.sessionUsageWave.hoverY,
3181
+ y1: tick.y,
3182
+ y2: tick.y,
2964
3183
  stroke: "currentColor",
2965
- "stroke-width": "1",
2966
- "stroke-dasharray": "4 4",
2967
- opacity: "0.5",
2968
- class: "usage-wave-hover-line"
3184
+ "stroke-width": "0.5",
3185
+ opacity: "0.12",
3186
+ class: "usage-wave-gridline"
2969
3187
  }, null, 8 /* PROPS */, ["x2", "y1", "y2"]))
2970
- : _createCommentVNode("v-if", true),
2971
- (_ctx.sessionsUsageSelectedDay)
2972
- ? (_openBlock(), _createElementBlock("circle", {
2973
- key: 1,
2974
- cx: _ctx.sessionUsageWave.hoverX,
2975
- cy: _ctx.sessionUsageWave.hoverY,
2976
- r: "5",
2977
- fill: 'var(--color-surface)',
2978
- stroke: 'var(--color-brand)',
2979
- "stroke-width": "2.5",
2980
- class: "usage-wave-hover-point"
2981
- }, null, 8 /* PROPS */, ["cx", "cy"]))
2982
- : _createCommentVNode("v-if", true)
2983
- ])),
2984
- _createElementVNode("div", { class: "usage-wave-labels" }, [
2985
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageWave.labels, (label) => {
2986
- return (_openBlock(), _createElementBlock("span", {
2987
- key: label.key,
2988
- class: _normalizeClass(["usage-wave-label", { active: _ctx.sessionsUsageSelectedDay === label.key }]),
2989
- onClick: $event => (_ctx.selectSessionsUsageDay(label.key))
2990
- }, _toDisplayString(label.text), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2991
- }), 128 /* KEYED_FRAGMENT */))
3188
+ }), 128 /* KEYED_FRAGMENT */)),
3189
+ _createElementVNode("path", {
3190
+ d: _ctx.sessionUsageWave.areaPath,
3191
+ fill: 'url(#wave-gradient-' + _ctx.sessionsUsageTimeRange + ')',
3192
+ class: "usage-wave-area"
3193
+ }, null, 8 /* PROPS */, ["d", "fill"]),
3194
+ _createElementVNode("path", {
3195
+ d: _ctx.sessionUsageWave.linePath,
3196
+ fill: "none",
3197
+ stroke: 'var(--color-brand)',
3198
+ "stroke-width": "2.5",
3199
+ "stroke-linecap": "round",
3200
+ "stroke-linejoin": "round",
3201
+ class: "usage-wave-line"
3202
+ }, null, 8 /* PROPS */, ["d"]),
3203
+ (_ctx.sessionsUsageSelectedDay)
3204
+ ? (_openBlock(), _createElementBlock("line", {
3205
+ key: 0,
3206
+ x1: "0",
3207
+ x2: _ctx.sessionUsageWave.width,
3208
+ y1: _ctx.sessionUsageWave.hoverY,
3209
+ y2: _ctx.sessionUsageWave.hoverY,
3210
+ stroke: "currentColor",
3211
+ "stroke-width": "1",
3212
+ "stroke-dasharray": "4 4",
3213
+ opacity: "0.5",
3214
+ class: "usage-wave-hover-line"
3215
+ }, null, 8 /* PROPS */, ["x2", "y1", "y2"]))
3216
+ : _createCommentVNode("v-if", true),
3217
+ (_ctx.sessionsUsageSelectedDay)
3218
+ ? (_openBlock(), _createElementBlock("circle", {
3219
+ key: 1,
3220
+ cx: _ctx.sessionUsageWave.hoverX,
3221
+ cy: _ctx.sessionUsageWave.hoverY,
3222
+ r: "5",
3223
+ fill: 'var(--color-surface)',
3224
+ stroke: 'var(--color-brand)',
3225
+ "stroke-width": "2.5",
3226
+ class: "usage-wave-hover-point"
3227
+ }, null, 8 /* PROPS */, ["cx", "cy"]))
3228
+ : _createCommentVNode("v-if", true)
3229
+ ])),
3230
+ _createElementVNode("div", { class: "usage-wave-labels" }, [
3231
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sessionUsageWave.labels, (label) => {
3232
+ return (_openBlock(), _createElementBlock("button", {
3233
+ key: label.key,
3234
+ type: "button",
3235
+ class: _normalizeClass(["usage-wave-label", { active: _ctx.sessionsUsageSelectedDay === label.key }]),
3236
+ "aria-pressed": _ctx.sessionsUsageSelectedDay === label.key,
3237
+ onClick: $event => (_ctx.selectSessionsUsageDay(label.key))
3238
+ }, _toDisplayString(label.text), 11 /* TEXT, CLASS, PROPS */, ["aria-pressed", "onClick"]))
3239
+ }), 128 /* KEYED_FRAGMENT */))
3240
+ ])
2992
3241
  ])
2993
3242
  ]),
2994
3243
  (_ctx.sessionsUsageSelectedDaySummary)
@@ -5299,15 +5548,169 @@ return function render(_ctx, _cache) {
5299
5548
  style: {"display":"none"},
5300
5549
  onChange: _ctx.handlePromptTemplatesImportChange
5301
5550
  }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]),
5302
- _createCommentVNode(" 加载状态 "),
5303
- (_ctx.loading)
5551
+ _createCommentVNode(" Prompts editor "),
5552
+ (_ctx.mainTab === 'prompts')
5304
5553
  ? (_openBlock(), _createElementBlock("div", {
5305
5554
  key: 1,
5555
+ class: "mode-content mode-cards",
5556
+ id: "panel-prompts",
5557
+ role: "tabpanel",
5558
+ "aria-labelledby": "tab-prompts"
5559
+ }, [
5560
+ _createElementVNode("div", { class: "segmented-control" }, [
5561
+ _createElementVNode("button", {
5562
+ type: "button",
5563
+ class: _normalizeClass(['segment', { active: _ctx.promptsSubTab === 'codex' }]),
5564
+ onClick: $event => (_ctx.switchPromptsSubTab('codex'))
5565
+ }, _toDisplayString(_ctx.t('prompts.subTab.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
5566
+ _createElementVNode("button", {
5567
+ type: "button",
5568
+ class: _normalizeClass(['segment', { active: _ctx.promptsSubTab === 'claude-md' }]),
5569
+ onClick: $event => (_ctx.switchPromptsSubTab('claude-md'))
5570
+ }, _toDisplayString(_ctx.t('prompts.subTab.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
5571
+ ]),
5572
+ _createElementVNode("div", { class: "prompts-editor" }, [
5573
+ _createElementVNode("div", { class: "prompts-editor-toolbar" }, [
5574
+ _createElementVNode("div", { class: "form-hint" }, [
5575
+ _createTextVNode(_toDisplayString(_ctx.agentsPath || _ctx.t('common.notLoaded')) + " ", 1 /* TEXT */),
5576
+ (_ctx.agentsPath)
5577
+ ? (_openBlock(), _createElementBlock("span", { key: 0 }, " (" + _toDisplayString(_ctx.agentsExists ? _ctx.t('common.exists') : _ctx.t('common.notExistsWillCreateOnSave')) + ") ", 1 /* TEXT */))
5578
+ : _createCommentVNode("v-if", true)
5579
+ ]),
5580
+ _createElementVNode("div", { class: "prompts-editor-actions" }, [
5581
+ _createElementVNode("div", { class: "prompts-editor-group prompts-editor-group--secondary" }, [
5582
+ _createElementVNode("button", {
5583
+ class: "btn-mini",
5584
+ onClick: _ctx.exportAgentsContent,
5585
+ disabled: _ctx.agentsLoading
5586
+ }, _toDisplayString(_ctx.t('modal.agents.export')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
5587
+ _createElementVNode("button", {
5588
+ class: "btn-mini",
5589
+ onClick: _ctx.copyAgentsContent,
5590
+ disabled: _ctx.agentsLoading
5591
+ }, _toDisplayString(_ctx.t('modal.agents.copy')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
5592
+ _createElementVNode("button", {
5593
+ class: "btn-mini",
5594
+ onClick: _ctx.pasteAgentsContent,
5595
+ disabled: _ctx.agentsLoading || _ctx.agentsSaving || _ctx.agentsDiffVisible
5596
+ }, _toDisplayString(_ctx.t('common.paste')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
5597
+ ]),
5598
+ _createElementVNode("div", { class: "prompts-editor-group prompts-editor-group--workflow" }, [
5599
+ _createElementVNode("button", {
5600
+ class: "btn-mini",
5601
+ onClick: _ctx.loadPromptsContent,
5602
+ disabled: _ctx.agentsSaving || _ctx.agentsDiffLoading
5603
+ }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
5604
+ (_ctx.agentsDiffVisible)
5605
+ ? (_openBlock(), _createElementBlock("button", {
5606
+ key: 0,
5607
+ class: "btn-mini",
5608
+ onClick: _ctx.resetAgentsDiffState,
5609
+ disabled: _ctx.agentsSaving || _ctx.agentsDiffLoading
5610
+ }, _toDisplayString(_ctx.t('common.backToEdit')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]))
5611
+ : _createCommentVNode("v-if", true),
5612
+ _createElementVNode("button", {
5613
+ class: "btn-mini btn-confirm-mini",
5614
+ onClick: _ctx.applyAgentsContent,
5615
+ disabled: _ctx.agentsSaving || _ctx.agentsLoading || _ctx.agentsDiffLoading || (!_ctx.agentsDiffVisible && !_ctx.hasAgentsContentChanged()) || (_ctx.agentsDiffVisible && !_ctx.agentsDiffHasChanges)
5616
+ }, _toDisplayString(_ctx.agentsSaving ? (_ctx.agentsDiffVisible ? _ctx.t('common.saving') : _ctx.t('common.previewing')) : (_ctx.agentsDiffVisible ? _ctx.t('common.save') : _ctx.t('common.preview'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
5617
+ ])
5618
+ ])
5619
+ ]),
5620
+ _createElementVNode("div", { class: "form-group" }, [
5621
+ (_ctx.agentsDiffVisible)
5622
+ ? (_openBlock(), _createElementBlock("div", { key: 0 }, [
5623
+ (!_ctx.agentsDiffLoading && !_ctx.agentsDiffError && !_ctx.agentsDiffTruncated && (_ctx.agentsDiffStats.added || _ctx.agentsDiffStats.removed))
5624
+ ? (_openBlock(), _createElementBlock("div", {
5625
+ key: 0,
5626
+ class: "agents-diff-summary"
5627
+ }, [
5628
+ _createElementVNode("span", { class: "agents-diff-stat add" }, "+" + _toDisplayString(_ctx.agentsDiffStats.added), 1 /* TEXT */),
5629
+ _createElementVNode("span", { class: "agents-diff-stat del" }, "-" + _toDisplayString(_ctx.agentsDiffStats.removed), 1 /* TEXT */)
5630
+ ]))
5631
+ : _createCommentVNode("v-if", true),
5632
+ (_ctx.agentsDiffLoading)
5633
+ ? (_openBlock(), _createElementBlock("div", {
5634
+ key: 1,
5635
+ class: "state-message"
5636
+ }, _toDisplayString(_ctx.t('diff.generating')), 1 /* TEXT */))
5637
+ : (_ctx.agentsDiffError)
5638
+ ? (_openBlock(), _createElementBlock("div", {
5639
+ key: 2,
5640
+ class: "state-message error"
5641
+ }, _toDisplayString(_ctx.agentsDiffError), 1 /* TEXT */))
5642
+ : (_ctx.agentsDiffTruncated)
5643
+ ? (_openBlock(), _createElementBlock("div", {
5644
+ key: 3,
5645
+ class: "agents-diff-empty"
5646
+ }, _toDisplayString(_ctx.t('diff.tooLargeSkip')), 1 /* TEXT */))
5647
+ : (!_ctx.agentsDiffHasChanges)
5648
+ ? (_openBlock(), _createElementBlock("div", {
5649
+ key: 4,
5650
+ class: "agents-diff-empty"
5651
+ }, _toDisplayString(_ctx.t('diff.noChanges')), 1 /* TEXT */))
5652
+ : (_openBlock(), _createElementBlock("div", {
5653
+ key: 5,
5654
+ class: "agents-diff-view agents-diff-editor"
5655
+ }, [
5656
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.agentsDiffLines, (line, index) => {
5657
+ return (_openBlock(), _createElementBlock("div", {
5658
+ key: line.key || (line.type + '-' + index),
5659
+ class: _normalizeClass(['agents-diff-line', line.type])
5660
+ }, [
5661
+ _createElementVNode("span", { class: "agents-diff-line-sign" }, _toDisplayString(line.type === 'add' ? '+' : (line.type === 'del' ? '-' : ' ')), 1 /* TEXT */),
5662
+ _createElementVNode("span", { class: "agents-diff-line-text" }, _toDisplayString(line.value), 1 /* TEXT */)
5663
+ ], 2 /* CLASS */))
5664
+ }), 128 /* KEYED_FRAGMENT */))
5665
+ ]))
5666
+ ]))
5667
+ : _createCommentVNode("v-if", true),
5668
+ _createElementVNode("div", {
5669
+ class: _normalizeClass(['editor-frame', { 'editor-frame--loading': _ctx.agentsLoading }])
5670
+ }, [
5671
+ (_ctx.agentsLoading)
5672
+ ? (_openBlock(), _createElementBlock("div", {
5673
+ key: 0,
5674
+ class: "editor-skeleton"
5675
+ }, [
5676
+ (_openBlock(), _createElementBlock(_Fragment, null, _renderList(6, (i) => {
5677
+ return _createElementVNode("div", {
5678
+ class: "skeleton-line",
5679
+ key: i
5680
+ })
5681
+ }), 64 /* STABLE_FRAGMENT */))
5682
+ ]))
5683
+ : _createCommentVNode("v-if", true),
5684
+ _withDirectives(_createElementVNode("textarea", {
5685
+ "onUpdate:modelValue": $event => ((_ctx.agentsContent) = $event),
5686
+ class: "form-input template-editor",
5687
+ spellcheck: "false",
5688
+ readonly: _ctx.agentsLoading || _ctx.agentsSaving || _ctx.agentsDiffVisible,
5689
+ onInput: _ctx.onAgentsContentInput,
5690
+ placeholder: _ctx.t(_ctx.promptsSubTab === 'claude-md' ? 'modal.agents.placeholder.claudeMd' : 'modal.agents.placeholder')
5691
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "readonly", "onInput", "placeholder"]), [
5692
+ [_vModelText, _ctx.agentsContent]
5693
+ ])
5694
+ ], 2 /* CLASS */),
5695
+ (_ctx.promptsContextHint)
5696
+ ? (_openBlock(), _createElementBlock("div", {
5697
+ key: 1,
5698
+ class: _normalizeClass(['prompts-context-hint', { 'prompts-context-hint--warn': _ctx.promptsContextHint.warn }])
5699
+ }, _toDisplayString(_ctx.promptsContextHint.text), 3 /* TEXT, CLASS */))
5700
+ : _createCommentVNode("v-if", true)
5701
+ ])
5702
+ ])
5703
+ ]))
5704
+ : _createCommentVNode("v-if", true),
5705
+ _createCommentVNode(" 加载状态 "),
5706
+ (_ctx.loading && _ctx.mainTab !== 'usage')
5707
+ ? (_openBlock(), _createElementBlock("div", {
5708
+ key: 2,
5306
5709
  class: "state-message"
5307
5710
  }, _toDisplayString(_ctx.t('app.loadingConfig')), 1 /* TEXT */))
5308
5711
  : (_ctx.initError)
5309
5712
  ? (_openBlock(), _createElementBlock("div", {
5310
- key: 2,
5713
+ key: 3,
5311
5714
  class: "state-message error"
5312
5715
  }, [
5313
5716
  _createCommentVNode(" 错误状态 "),
@@ -5320,7 +5723,7 @@ return function render(_ctx, _cache) {
5320
5723
  _createCommentVNode(" 添加提供商模态框 "),
5321
5724
  (_ctx.showAddModal)
5322
5725
  ? (_openBlock(), _createElementBlock("div", {
5323
- key: 2,
5726
+ key: 3,
5324
5727
  class: "modal-overlay",
5325
5728
  onClick: _withModifiers(_ctx.closeAddModal, ["self"])
5326
5729
  }, [
@@ -5477,7 +5880,7 @@ return function render(_ctx, _cache) {
5477
5880
  _createCommentVNode(" 编辑提供商模态框 "),
5478
5881
  (_ctx.showEditModal)
5479
5882
  ? (_openBlock(), _createElementBlock("div", {
5480
- key: 3,
5883
+ key: 4,
5481
5884
  class: "modal-overlay",
5482
5885
  onClick: _withModifiers(_ctx.closeEditModal, ["self"])
5483
5886
  }, [
@@ -5589,7 +5992,7 @@ return function render(_ctx, _cache) {
5589
5992
  _createCommentVNode(" 添加模型模态框 "),
5590
5993
  (_ctx.showModelModal)
5591
5994
  ? (_openBlock(), _createElementBlock("div", {
5592
- key: 4,
5995
+ key: 5,
5593
5996
  class: "modal-overlay",
5594
5997
  onClick: _withModifiers(_ctx.closeModelModal, ["self"])
5595
5998
  }, [
@@ -5629,7 +6032,7 @@ return function render(_ctx, _cache) {
5629
6032
  _createCommentVNode(" 模型列表模态框 "),
5630
6033
  (_ctx.showModelListModal)
5631
6034
  ? (_openBlock(), _createElementBlock("div", {
5632
- key: 5,
6035
+ key: 6,
5633
6036
  class: "modal-overlay",
5634
6037
  onClick: _withModifiers($event => (_ctx.showModelListModal = false), ["self"])
5635
6038
  }, [
@@ -5670,7 +6073,7 @@ return function render(_ctx, _cache) {
5670
6073
  _createCommentVNode(" 添加Claude配置模态框 "),
5671
6074
  (_ctx.showClaudeConfigModal)
5672
6075
  ? (_openBlock(), _createElementBlock("div", {
5673
- key: 6,
6076
+ key: 7,
5674
6077
  class: "modal-overlay",
5675
6078
  onClick: _withModifiers(_ctx.closeClaudeConfigModal, ["self"])
5676
6079
  }, [
@@ -5791,6 +6194,20 @@ return function render(_ctx, _cache) {
5791
6194
  }, _toDisplayString(_ctx.claudeConfigFieldError('add', 'model')), 1 /* TEXT */))
5792
6195
  : _createCommentVNode("v-if", true)
5793
6196
  ]),
6197
+ _createElementVNode("div", { class: "form-group" }, [
6198
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('claude.targetApi.label')), 1 /* TEXT */),
6199
+ _withDirectives(_createElementVNode("select", {
6200
+ "onUpdate:modelValue": $event => ((_ctx.newClaudeConfig.targetApi) = $event),
6201
+ class: "form-input"
6202
+ }, [
6203
+ _createElementVNode("option", { value: "responses" }, _toDisplayString(_ctx.t('claude.targetApi.responses')), 1 /* TEXT */),
6204
+ _createElementVNode("option", { value: "chat_completions" }, _toDisplayString(_ctx.t('claude.targetApi.chatCompletions')), 1 /* TEXT */),
6205
+ _createElementVNode("option", { value: "ollama" }, _toDisplayString(_ctx.t('claude.targetApi.ollama')), 1 /* TEXT */)
6206
+ ], 8 /* PROPS */, ["onUpdate:modelValue"]), [
6207
+ [_vModelSelect, _ctx.newClaudeConfig.targetApi]
6208
+ ]),
6209
+ _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('claude.targetApi.hint')), 1 /* TEXT */)
6210
+ ]),
5794
6211
  _createElementVNode("div", { class: "btn-group" }, [
5795
6212
  _createElementVNode("button", {
5796
6213
  class: "btn btn-cancel",
@@ -5808,7 +6225,7 @@ return function render(_ctx, _cache) {
5808
6225
  _createCommentVNode(" 编辑Claude配置模态框 "),
5809
6226
  (_ctx.showEditConfigModal)
5810
6227
  ? (_openBlock(), _createElementBlock("div", {
5811
- key: 7,
6228
+ key: 8,
5812
6229
  class: "modal-overlay",
5813
6230
  onClick: _withModifiers(_ctx.closeEditConfigModal, ["self"])
5814
6231
  }, [
@@ -5930,6 +6347,20 @@ return function render(_ctx, _cache) {
5930
6347
  }, _toDisplayString(_ctx.claudeConfigFieldError('edit', 'model')), 1 /* TEXT */))
5931
6348
  : _createCommentVNode("v-if", true)
5932
6349
  ]),
6350
+ _createElementVNode("div", { class: "form-group" }, [
6351
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('claude.targetApi.label')), 1 /* TEXT */),
6352
+ _withDirectives(_createElementVNode("select", {
6353
+ "onUpdate:modelValue": $event => ((_ctx.editingConfig.targetApi) = $event),
6354
+ class: "form-input"
6355
+ }, [
6356
+ _createElementVNode("option", { value: "responses" }, _toDisplayString(_ctx.t('claude.targetApi.responses')), 1 /* TEXT */),
6357
+ _createElementVNode("option", { value: "chat_completions" }, _toDisplayString(_ctx.t('claude.targetApi.chatCompletions')), 1 /* TEXT */),
6358
+ _createElementVNode("option", { value: "ollama" }, _toDisplayString(_ctx.t('claude.targetApi.ollama')), 1 /* TEXT */)
6359
+ ], 8 /* PROPS */, ["onUpdate:modelValue"]), [
6360
+ [_vModelSelect, _ctx.editingConfig.targetApi]
6361
+ ]),
6362
+ _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('claude.targetApi.hint')), 1 /* TEXT */)
6363
+ ]),
5933
6364
  _createElementVNode("div", { class: "btn-group" }, [
5934
6365
  _createElementVNode("button", {
5935
6366
  class: "btn btn-cancel",
@@ -5947,7 +6378,7 @@ return function render(_ctx, _cache) {
5947
6378
  _createCommentVNode(" Codex bridge pool modal "),
5948
6379
  (_ctx.showCodexBridgePoolModal)
5949
6380
  ? (_openBlock(), _createElementBlock("div", {
5950
- key: 8,
6381
+ key: 9,
5951
6382
  class: "modal-overlay",
5952
6383
  onClick: _withModifiers($event => (_ctx.showCodexBridgePoolModal = false), ["self"])
5953
6384
  }, [
@@ -6040,7 +6471,7 @@ return function render(_ctx, _cache) {
6040
6471
  : _createCommentVNode("v-if", true),
6041
6472
  (_ctx.showClaudeBridgePoolModal)
6042
6473
  ? (_openBlock(), _createElementBlock("div", {
6043
- key: 9,
6474
+ key: 10,
6044
6475
  class: "modal-overlay",
6045
6476
  onClick: _withModifiers($event => (_ctx.showClaudeBridgePoolModal = false), ["self"])
6046
6477
  }, [
@@ -6134,7 +6565,7 @@ return function render(_ctx, _cache) {
6134
6565
  _createCommentVNode(" Webhook settings modal "),
6135
6566
  (_ctx.showWebhookModal)
6136
6567
  ? (_openBlock(), _createElementBlock("div", {
6137
- key: 10,
6568
+ key: 11,
6138
6569
  class: "modal-overlay",
6139
6570
  onClick: _withModifiers(_ctx.closeWebhookModal, ["self"])
6140
6571
  }, [
@@ -6207,7 +6638,7 @@ return function render(_ctx, _cache) {
6207
6638
  : _createCommentVNode("v-if", true),
6208
6639
  (_ctx.showOpenclawConfigModal)
6209
6640
  ? (_openBlock(), _createElementBlock("div", {
6210
- key: 11,
6641
+ key: 12,
6211
6642
  class: "modal-overlay",
6212
6643
  onClick: _withModifiers($event => (!(_ctx.openclawSaving || _ctx.openclawApplying) && _ctx.closeOpenclawConfigModal()), ["self"])
6213
6644
  }, [
@@ -6919,7 +7350,7 @@ return function render(_ctx, _cache) {
6919
7350
  : _createCommentVNode("v-if", true),
6920
7351
  (_ctx.showConfigTemplateModal)
6921
7352
  ? (_openBlock(), _createElementBlock("div", {
6922
- key: 12,
7353
+ key: 13,
6923
7354
  class: "modal-overlay",
6924
7355
  onClick: _withModifiers($event => (!_ctx.configTemplateApplying && _ctx.closeConfigTemplateModal()), ["self"])
6925
7356
  }, [
@@ -7064,7 +7495,7 @@ return function render(_ctx, _cache) {
7064
7495
  : _createCommentVNode("v-if", true),
7065
7496
  (_ctx.showAgentsModal)
7066
7497
  ? (_openBlock(), _createElementBlock("div", {
7067
- key: 13,
7498
+ key: 14,
7068
7499
  class: "modal-overlay",
7069
7500
  onClick: _withModifiers(_ctx.closeAgentsModal, ["self"])
7070
7501
  }, [
@@ -7094,7 +7525,26 @@ return function render(_ctx, _cache) {
7094
7525
  class: "btn-mini btn-modal-copy",
7095
7526
  onClick: _ctx.pasteAgentsContent,
7096
7527
  disabled: _ctx.agentsLoading || _ctx.agentsSaving || _ctx.agentsDiffVisible
7097
- }, _toDisplayString(_ctx.t('common.paste')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
7528
+ }, _toDisplayString(_ctx.t('common.paste')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
7529
+ _createElementVNode("span", { class: "prompts-editor-actions-sep" }),
7530
+ _createElementVNode("button", {
7531
+ class: "btn-mini",
7532
+ onClick: _ctx.closeAgentsModal,
7533
+ disabled: _ctx.agentsSaving || _ctx.agentsDiffLoading
7534
+ }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
7535
+ (_ctx.agentsDiffVisible)
7536
+ ? (_openBlock(), _createElementBlock("button", {
7537
+ key: 0,
7538
+ class: "btn-mini",
7539
+ onClick: _ctx.resetAgentsDiffState,
7540
+ disabled: _ctx.agentsSaving || _ctx.agentsDiffLoading
7541
+ }, _toDisplayString(_ctx.t('common.backToEdit')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]))
7542
+ : _createCommentVNode("v-if", true),
7543
+ _createElementVNode("button", {
7544
+ class: "btn-mini btn-confirm-mini",
7545
+ onClick: _ctx.applyAgentsContent,
7546
+ disabled: _ctx.agentsSaving || _ctx.agentsLoading || _ctx.agentsDiffLoading || (_ctx.agentsDiffVisible && !_ctx.agentsDiffHasChanges)
7547
+ }, _toDisplayString(_ctx.agentsSaving ? (_ctx.agentsDiffVisible ? _ctx.t('common.saving') : _ctx.t('common.previewing')) : (_ctx.agentsDiffVisible ? _ctx.t('common.save') : _ctx.t('common.preview'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
7098
7548
  ])
7099
7549
  ]),
7100
7550
  _createElementVNode("div", { class: "modal-editor-body" }, [
@@ -7206,33 +7656,13 @@ return function render(_ctx, _cache) {
7206
7656
  }, _toDisplayString(_ctx.t('diff.viewHint.preview')), 1 /* TEXT */))
7207
7657
  ])
7208
7658
  ])
7209
- ]),
7210
- _createElementVNode("div", { class: "btn-group modal-editor-footer" }, [
7211
- _createElementVNode("button", {
7212
- class: "btn btn-cancel",
7213
- onClick: _ctx.closeAgentsModal,
7214
- disabled: _ctx.agentsSaving || _ctx.agentsDiffLoading
7215
- }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
7216
- (_ctx.agentsDiffVisible)
7217
- ? (_openBlock(), _createElementBlock("button", {
7218
- key: 0,
7219
- class: "btn",
7220
- onClick: _ctx.resetAgentsDiffState,
7221
- disabled: _ctx.agentsSaving || _ctx.agentsDiffLoading
7222
- }, _toDisplayString(_ctx.t('common.backToEdit')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]))
7223
- : _createCommentVNode("v-if", true),
7224
- _createElementVNode("button", {
7225
- class: "btn btn-confirm",
7226
- onClick: _ctx.applyAgentsContent,
7227
- disabled: _ctx.agentsSaving || _ctx.agentsLoading || _ctx.agentsDiffLoading || (_ctx.agentsDiffVisible && !_ctx.agentsDiffHasChanges)
7228
- }, _toDisplayString(_ctx.agentsSaving ? (_ctx.agentsDiffVisible ? _ctx.t('common.applying') : _ctx.t('common.confirming')) : (_ctx.agentsDiffVisible ? _ctx.t('common.apply') : _ctx.t('common.confirm'))), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
7229
7659
  ])
7230
7660
  ])
7231
7661
  ], 8 /* PROPS */, ["onClick"]))
7232
7662
  : _createCommentVNode("v-if", true),
7233
7663
  (_ctx.showSkillsModal)
7234
7664
  ? (_openBlock(), _createElementBlock("div", {
7235
- key: 14,
7665
+ key: 15,
7236
7666
  class: "modal-overlay",
7237
7667
  onClick: _withModifiers(_ctx.closeSkillsModal, ["self"])
7238
7668
  }, [
@@ -7530,7 +7960,7 @@ return function render(_ctx, _cache) {
7530
7960
  }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]),
7531
7961
  (_ctx.showHealthCheckModal)
7532
7962
  ? (_openBlock(), _createElementBlock("div", {
7533
- key: 15,
7963
+ key: 16,
7534
7964
  class: "modal-overlay",
7535
7965
  onClick: _withModifiers($event => (_ctx.showHealthCheckModal = false), ["self"])
7536
7966
  }, [
@@ -7621,7 +8051,7 @@ return function render(_ctx, _cache) {
7621
8051
  : _createCommentVNode("v-if", true),
7622
8052
  (_ctx.showConfirmDialog)
7623
8053
  ? (_openBlock(), _createElementBlock("div", {
7624
- key: 16,
8054
+ key: 17,
7625
8055
  class: "modal-overlay",
7626
8056
  onClick: _withModifiers(_ctx.closeConfirmDialog, ["self"])
7627
8057
  }, [
@@ -7659,7 +8089,7 @@ return function render(_ctx, _cache) {
7659
8089
  _createCommentVNode(" Toast "),
7660
8090
  (_ctx.message)
7661
8091
  ? (_openBlock(), _createElementBlock("div", {
7662
- key: 17,
8092
+ key: 18,
7663
8093
  class: _normalizeClass(['toast', _ctx.messageType]),
7664
8094
  role: "status",
7665
8095
  "aria-live": "polite",