codexmate 0.1.10 → 0.1.13

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 (40) hide show
  1. package/README.md +5 -7
  2. package/README.vi.md +4 -7
  3. package/README.zh.md +5 -7
  4. package/cli/agents-files.js +27 -3
  5. package/cli/prompt-history.js +171 -0
  6. package/cli/system-prompt-files.js +20 -2
  7. package/cli.js +162 -5
  8. package/package.json +1 -1
  9. package/web-ui/app.js +95 -4
  10. package/web-ui/index.html +2 -1
  11. package/web-ui/modules/app.methods.agents.mjs +90 -0
  12. package/web-ui/modules/app.methods.index.mjs +2 -0
  13. package/web-ui/modules/app.methods.navigation.mjs +7 -1
  14. package/web-ui/modules/app.methods.pi-config.mjs +371 -0
  15. package/web-ui/modules/app.methods.session-actions.mjs +57 -0
  16. package/web-ui/modules/app.methods.startup-claude.mjs +2 -1
  17. package/web-ui/modules/app.methods.system-prompt.mjs +81 -0
  18. package/web-ui/modules/app.methods.tool-config-permissions.mjs +3 -2
  19. package/web-ui/modules/app.methods.web-ui-preferences.mjs +8 -1
  20. package/web-ui/modules/config-mode.computed.mjs +2 -1
  21. package/web-ui/modules/i18n/locales/en.mjs +52 -0
  22. package/web-ui/modules/i18n/locales/ja.mjs +52 -0
  23. package/web-ui/modules/i18n/locales/vi.mjs +52 -0
  24. package/web-ui/modules/i18n/locales/zh-tw.mjs +52 -0
  25. package/web-ui/modules/i18n/locales/zh.mjs +52 -0
  26. package/web-ui/partials/index/layout-header.html +20 -0
  27. package/web-ui/partials/index/panel-config-claude.html +3 -3
  28. package/web-ui/partials/index/panel-config-codex.html +3 -3
  29. package/web-ui/partials/index/panel-config-kilocode.html +5 -5
  30. package/web-ui/partials/index/panel-config-openclaw.html +3 -3
  31. package/web-ui/partials/index/panel-config-opencode.html +5 -5
  32. package/web-ui/partials/index/panel-config-pi.html +171 -0
  33. package/web-ui/partials/index/panel-prompts.html +52 -0
  34. package/web-ui/partials/index/panel-sessions.html +12 -0
  35. package/web-ui/partials/index/panel-settings.html +42 -0
  36. package/web-ui/res/web-ui-render.precompiled.js +1101 -252
  37. package/web-ui/styles/modals-core.css +86 -0
  38. package/web-ui/styles/sessions-preview.css +38 -0
  39. package/web-ui/styles/settings-panel.css +7 -0
  40. package/web-ui/styles/titles-cards.css +2 -2
@@ -264,96 +264,132 @@ return function render(_ctx, _cache) {
264
264
  "aria-label": _ctx.t('side.config')
265
265
  }, [
266
266
  _createElementVNode("div", { class: "side-section-title" }, _toDisplayString(_ctx.t('side.config')), 1 /* TEXT */),
267
- _createElementVNode("button", {
268
- id: "side-tab-config-codex",
269
- "data-main-tab": "config",
270
- "data-config-mode": "codex",
271
- "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'codex' ? 'page' : null,
272
- class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('codex') }]),
273
- onPointerdown: $event => (_ctx.onConfigTabPointerDown('codex', $event)),
274
- onClick: $event => (_ctx.onConfigTabClick('codex', $event))
275
- }, [
276
- _createElementVNode("span", {
277
- class: "side-item-icon",
278
- "aria-hidden": "true"
279
- }, "C"),
280
- _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.codex')), 1 /* TEXT */),
281
- _createElementVNode("div", { class: "side-item-meta" }, [
282
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.codex.meta')), 1 /* TEXT */)
283
- ])
284
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
285
- _createElementVNode("button", {
286
- id: "side-tab-config-claude",
287
- "data-main-tab": "config",
288
- "data-config-mode": "claude",
289
- "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'claude' ? 'page' : null,
290
- class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('claude') }]),
291
- onPointerdown: $event => (_ctx.onConfigTabPointerDown('claude', $event)),
292
- onClick: $event => (_ctx.onConfigTabClick('claude', $event))
293
- }, [
294
- _createElementVNode("span", {
295
- class: "side-item-icon",
296
- "aria-hidden": "true"
297
- }, "A"),
298
- _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.claude')), 1 /* TEXT */),
299
- _createElementVNode("div", { class: "side-item-meta" }, [
300
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.claude.meta')), 1 /* TEXT */)
301
- ])
302
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
303
- _createElementVNode("button", {
304
- id: "side-tab-config-openclaw",
305
- "data-main-tab": "config",
306
- "data-config-mode": "openclaw",
307
- "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'openclaw' ? 'page' : null,
308
- class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('openclaw') }]),
309
- onPointerdown: $event => (_ctx.onConfigTabPointerDown('openclaw', $event)),
310
- onClick: $event => (_ctx.onConfigTabClick('openclaw', $event))
311
- }, [
312
- _createElementVNode("span", {
313
- class: "side-item-icon",
314
- "aria-hidden": "true"
315
- }, "O"),
316
- _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.openclaw')), 1 /* TEXT */),
317
- _createElementVNode("div", { class: "side-item-meta" }, [
318
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.openclaw.meta')), 1 /* TEXT */)
319
- ])
320
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
321
- _createElementVNode("button", {
322
- id: "side-tab-config-opencode",
323
- "data-main-tab": "config",
324
- "data-config-mode": "opencode",
325
- "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'opencode' ? 'page' : null,
326
- class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('opencode') }]),
327
- onPointerdown: $event => (_ctx.onConfigTabPointerDown('opencode', $event)),
328
- onClick: $event => (_ctx.onConfigTabClick('opencode', $event))
329
- }, [
330
- _createElementVNode("span", {
331
- class: "side-item-icon",
332
- "aria-hidden": "true"
333
- }, "N"),
334
- _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.opencode')), 1 /* TEXT */),
335
- _createElementVNode("div", { class: "side-item-meta" }, [
336
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.opencode.meta')), 1 /* TEXT */)
337
- ])
338
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]),
339
- _createElementVNode("button", {
340
- id: "side-tab-config-kilocode",
341
- "data-main-tab": "config",
342
- "data-config-mode": "kilocode",
343
- "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'kilocode' ? 'page' : null,
344
- class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('kilocode') }]),
345
- onPointerdown: $event => (_ctx.onConfigTabPointerDown('kilocode', $event)),
346
- onClick: $event => (_ctx.onConfigTabClick('kilocode', $event))
347
- }, [
348
- _createElementVNode("span", {
349
- class: "side-item-icon",
350
- "aria-hidden": "true"
351
- }, "K"),
352
- _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.kilocode')), 1 /* TEXT */),
353
- _createElementVNode("div", { class: "side-item-meta" }, [
354
- _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.kilocode.meta')), 1 /* TEXT */)
355
- ])
356
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"])
267
+ (_ctx.isConfigModeVisible('codex'))
268
+ ? (_openBlock(), _createElementBlock("button", {
269
+ key: 0,
270
+ id: "side-tab-config-codex",
271
+ "data-main-tab": "config",
272
+ "data-config-mode": "codex",
273
+ "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'codex' ? 'page' : null,
274
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('codex') }]),
275
+ onPointerdown: $event => (_ctx.onConfigTabPointerDown('codex', $event)),
276
+ onClick: $event => (_ctx.onConfigTabClick('codex', $event))
277
+ }, [
278
+ _createElementVNode("span", {
279
+ class: "side-item-icon",
280
+ "aria-hidden": "true"
281
+ }, "C"),
282
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.codex')), 1 /* TEXT */),
283
+ _createElementVNode("div", { class: "side-item-meta" }, [
284
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.codex.meta')), 1 /* TEXT */)
285
+ ])
286
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]))
287
+ : _createCommentVNode("v-if", true),
288
+ (_ctx.isConfigModeVisible('claude'))
289
+ ? (_openBlock(), _createElementBlock("button", {
290
+ key: 1,
291
+ id: "side-tab-config-claude",
292
+ "data-main-tab": "config",
293
+ "data-config-mode": "claude",
294
+ "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'claude' ? 'page' : null,
295
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('claude') }]),
296
+ onPointerdown: $event => (_ctx.onConfigTabPointerDown('claude', $event)),
297
+ onClick: $event => (_ctx.onConfigTabClick('claude', $event))
298
+ }, [
299
+ _createElementVNode("span", {
300
+ class: "side-item-icon",
301
+ "aria-hidden": "true"
302
+ }, "A"),
303
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.claude')), 1 /* TEXT */),
304
+ _createElementVNode("div", { class: "side-item-meta" }, [
305
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.claude.meta')), 1 /* TEXT */)
306
+ ])
307
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]))
308
+ : _createCommentVNode("v-if", true),
309
+ (_ctx.isConfigModeVisible('openclaw'))
310
+ ? (_openBlock(), _createElementBlock("button", {
311
+ key: 2,
312
+ id: "side-tab-config-openclaw",
313
+ "data-main-tab": "config",
314
+ "data-config-mode": "openclaw",
315
+ "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'openclaw' ? 'page' : null,
316
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('openclaw') }]),
317
+ onPointerdown: $event => (_ctx.onConfigTabPointerDown('openclaw', $event)),
318
+ onClick: $event => (_ctx.onConfigTabClick('openclaw', $event))
319
+ }, [
320
+ _createElementVNode("span", {
321
+ class: "side-item-icon",
322
+ "aria-hidden": "true"
323
+ }, "O"),
324
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.openclaw')), 1 /* TEXT */),
325
+ _createElementVNode("div", { class: "side-item-meta" }, [
326
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.openclaw.meta')), 1 /* TEXT */)
327
+ ])
328
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]))
329
+ : _createCommentVNode("v-if", true),
330
+ (_ctx.isConfigModeVisible('opencode'))
331
+ ? (_openBlock(), _createElementBlock("button", {
332
+ key: 3,
333
+ id: "side-tab-config-opencode",
334
+ "data-main-tab": "config",
335
+ "data-config-mode": "opencode",
336
+ "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'opencode' ? 'page' : null,
337
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('opencode') }]),
338
+ onPointerdown: $event => (_ctx.onConfigTabPointerDown('opencode', $event)),
339
+ onClick: $event => (_ctx.onConfigTabClick('opencode', $event))
340
+ }, [
341
+ _createElementVNode("span", {
342
+ class: "side-item-icon",
343
+ "aria-hidden": "true"
344
+ }, "N"),
345
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.opencode')), 1 /* TEXT */),
346
+ _createElementVNode("div", { class: "side-item-meta" }, [
347
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.opencode.meta')), 1 /* TEXT */)
348
+ ])
349
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]))
350
+ : _createCommentVNode("v-if", true),
351
+ (_ctx.isConfigModeVisible('kilocode'))
352
+ ? (_openBlock(), _createElementBlock("button", {
353
+ key: 4,
354
+ id: "side-tab-config-kilocode",
355
+ "data-main-tab": "config",
356
+ "data-config-mode": "kilocode",
357
+ "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'kilocode' ? 'page' : null,
358
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('kilocode') }]),
359
+ onPointerdown: $event => (_ctx.onConfigTabPointerDown('kilocode', $event)),
360
+ onClick: $event => (_ctx.onConfigTabClick('kilocode', $event))
361
+ }, [
362
+ _createElementVNode("span", {
363
+ class: "side-item-icon",
364
+ "aria-hidden": "true"
365
+ }, "K"),
366
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.kilocode')), 1 /* TEXT */),
367
+ _createElementVNode("div", { class: "side-item-meta" }, [
368
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.kilocode.meta')), 1 /* TEXT */)
369
+ ])
370
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]))
371
+ : _createCommentVNode("v-if", true),
372
+ (_ctx.isConfigModeVisible('pi'))
373
+ ? (_openBlock(), _createElementBlock("button", {
374
+ key: 5,
375
+ id: "side-tab-config-pi",
376
+ "data-main-tab": "config",
377
+ "data-config-mode": "pi",
378
+ "aria-current": _ctx.mainTab === 'config' && _ctx.configMode === 'pi' ? 'page' : null,
379
+ class: _normalizeClass(['side-item', 'side-item-compact', { active: _ctx.isConfigModeNavActive('pi') }]),
380
+ onPointerdown: $event => (_ctx.onConfigTabPointerDown('pi', $event)),
381
+ onClick: $event => (_ctx.onConfigTabClick('pi', $event))
382
+ }, [
383
+ _createElementVNode("span", {
384
+ class: "side-item-icon",
385
+ "aria-hidden": "true"
386
+ }, "P"),
387
+ _createElementVNode("div", { class: "side-item-title" }, _toDisplayString(_ctx.t('side.config.pi')), 1 /* TEXT */),
388
+ _createElementVNode("div", { class: "side-item-meta" }, [
389
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('side.config.pi.meta')), 1 /* TEXT */)
390
+ ])
391
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["aria-current", "onPointerdown", "onClick"]))
392
+ : _createCommentVNode("v-if", true)
357
393
  ], 8 /* PROPS */, ["aria-label"]),
358
394
  _createElementVNode("div", {
359
395
  class: "side-section",
@@ -987,21 +1023,30 @@ return function render(_ctx, _cache) {
987
1023
  key: 0,
988
1024
  class: "segmented-control"
989
1025
  }, [
990
- _createElementVNode("button", {
991
- type: "button",
992
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
993
- onClick: $event => (_ctx.switchConfigMode('codex'))
994
- }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
995
- _createElementVNode("button", {
996
- type: "button",
997
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
998
- onClick: $event => (_ctx.switchConfigMode('claude'))
999
- }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
1000
- _createElementVNode("button", {
1001
- type: "button",
1002
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
1003
- onClick: $event => (_ctx.switchConfigMode('openclaw'))
1004
- }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
1026
+ (_ctx.isConfigModeVisible('codex'))
1027
+ ? (_openBlock(), _createElementBlock("button", {
1028
+ key: 0,
1029
+ type: "button",
1030
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
1031
+ onClick: $event => (_ctx.switchConfigMode('codex'))
1032
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1033
+ : _createCommentVNode("v-if", true),
1034
+ (_ctx.isConfigModeVisible('claude'))
1035
+ ? (_openBlock(), _createElementBlock("button", {
1036
+ key: 1,
1037
+ type: "button",
1038
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
1039
+ onClick: $event => (_ctx.switchConfigMode('claude'))
1040
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1041
+ : _createCommentVNode("v-if", true),
1042
+ (_ctx.isConfigModeVisible('openclaw'))
1043
+ ? (_openBlock(), _createElementBlock("button", {
1044
+ key: 2,
1045
+ type: "button",
1046
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
1047
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
1048
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1049
+ : _createCommentVNode("v-if", true)
1005
1050
  ]))
1006
1051
  : _createCommentVNode("v-if", true),
1007
1052
  (_ctx.isCodexConfigMode && _ctx.shouldShowCliInstallPlaceholder('codex'))
@@ -1603,21 +1648,30 @@ return function render(_ctx, _cache) {
1603
1648
  key: 0,
1604
1649
  class: "segmented-control"
1605
1650
  }, [
1606
- _createElementVNode("button", {
1607
- type: "button",
1608
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
1609
- onClick: $event => (_ctx.switchConfigMode('codex'))
1610
- }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
1611
- _createElementVNode("button", {
1612
- type: "button",
1613
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
1614
- onClick: $event => (_ctx.switchConfigMode('claude'))
1615
- }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
1616
- _createElementVNode("button", {
1617
- type: "button",
1618
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
1619
- onClick: $event => (_ctx.switchConfigMode('openclaw'))
1620
- }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
1651
+ (_ctx.isConfigModeVisible('codex'))
1652
+ ? (_openBlock(), _createElementBlock("button", {
1653
+ key: 0,
1654
+ type: "button",
1655
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
1656
+ onClick: $event => (_ctx.switchConfigMode('codex'))
1657
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1658
+ : _createCommentVNode("v-if", true),
1659
+ (_ctx.isConfigModeVisible('claude'))
1660
+ ? (_openBlock(), _createElementBlock("button", {
1661
+ key: 1,
1662
+ type: "button",
1663
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
1664
+ onClick: $event => (_ctx.switchConfigMode('claude'))
1665
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1666
+ : _createCommentVNode("v-if", true),
1667
+ (_ctx.isConfigModeVisible('openclaw'))
1668
+ ? (_openBlock(), _createElementBlock("button", {
1669
+ key: 2,
1670
+ type: "button",
1671
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
1672
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
1673
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1674
+ : _createCommentVNode("v-if", true)
1621
1675
  ]))
1622
1676
  : _createCommentVNode("v-if", true),
1623
1677
  (_ctx.shouldShowCliInstallPlaceholder('claude'))
@@ -2131,21 +2185,30 @@ return function render(_ctx, _cache) {
2131
2185
  key: 0,
2132
2186
  class: "segmented-control"
2133
2187
  }, [
2134
- _createElementVNode("button", {
2135
- type: "button",
2136
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2137
- onClick: $event => (_ctx.switchConfigMode('codex'))
2138
- }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2139
- _createElementVNode("button", {
2140
- type: "button",
2141
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2142
- onClick: $event => (_ctx.switchConfigMode('claude'))
2143
- }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2144
- _createElementVNode("button", {
2145
- type: "button",
2146
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2147
- onClick: $event => (_ctx.switchConfigMode('openclaw'))
2148
- }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
2188
+ (_ctx.isConfigModeVisible('codex'))
2189
+ ? (_openBlock(), _createElementBlock("button", {
2190
+ key: 0,
2191
+ type: "button",
2192
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2193
+ onClick: $event => (_ctx.switchConfigMode('codex'))
2194
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2195
+ : _createCommentVNode("v-if", true),
2196
+ (_ctx.isConfigModeVisible('claude'))
2197
+ ? (_openBlock(), _createElementBlock("button", {
2198
+ key: 1,
2199
+ type: "button",
2200
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2201
+ onClick: $event => (_ctx.switchConfigMode('claude'))
2202
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2203
+ : _createCommentVNode("v-if", true),
2204
+ (_ctx.isConfigModeVisible('openclaw'))
2205
+ ? (_openBlock(), _createElementBlock("button", {
2206
+ key: 2,
2207
+ type: "button",
2208
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2209
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
2210
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2211
+ : _createCommentVNode("v-if", true)
2149
2212
  ]))
2150
2213
  : _createCommentVNode("v-if", true),
2151
2214
  _createElementVNode("div", { class: "openclaw-layout" }, [
@@ -2377,31 +2440,46 @@ return function render(_ctx, _cache) {
2377
2440
  key: 0,
2378
2441
  class: "segmented-control"
2379
2442
  }, [
2380
- _createElementVNode("button", {
2381
- type: "button",
2382
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2383
- onClick: $event => (_ctx.switchConfigMode('codex'))
2384
- }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2385
- _createElementVNode("button", {
2386
- type: "button",
2387
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2388
- onClick: $event => (_ctx.switchConfigMode('claude'))
2389
- }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2390
- _createElementVNode("button", {
2391
- type: "button",
2392
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2393
- onClick: $event => (_ctx.switchConfigMode('openclaw'))
2394
- }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2395
- _createElementVNode("button", {
2396
- type: "button",
2397
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2398
- onClick: $event => (_ctx.switchConfigMode('opencode'))
2399
- }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2400
- _createElementVNode("button", {
2401
- type: "button",
2402
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
2403
- onClick: $event => (_ctx.switchConfigMode('kilocode'))
2404
- }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
2443
+ (_ctx.isConfigModeVisible('codex'))
2444
+ ? (_openBlock(), _createElementBlock("button", {
2445
+ key: 0,
2446
+ type: "button",
2447
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2448
+ onClick: $event => (_ctx.switchConfigMode('codex'))
2449
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2450
+ : _createCommentVNode("v-if", true),
2451
+ (_ctx.isConfigModeVisible('claude'))
2452
+ ? (_openBlock(), _createElementBlock("button", {
2453
+ key: 1,
2454
+ type: "button",
2455
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2456
+ onClick: $event => (_ctx.switchConfigMode('claude'))
2457
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2458
+ : _createCommentVNode("v-if", true),
2459
+ (_ctx.isConfigModeVisible('openclaw'))
2460
+ ? (_openBlock(), _createElementBlock("button", {
2461
+ key: 2,
2462
+ type: "button",
2463
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2464
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
2465
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2466
+ : _createCommentVNode("v-if", true),
2467
+ (_ctx.isConfigModeVisible('opencode'))
2468
+ ? (_openBlock(), _createElementBlock("button", {
2469
+ key: 3,
2470
+ type: "button",
2471
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2472
+ onClick: $event => (_ctx.switchConfigMode('opencode'))
2473
+ }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2474
+ : _createCommentVNode("v-if", true),
2475
+ (_ctx.isConfigModeVisible('kilocode'))
2476
+ ? (_openBlock(), _createElementBlock("button", {
2477
+ key: 4,
2478
+ type: "button",
2479
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
2480
+ onClick: $event => (_ctx.switchConfigMode('kilocode'))
2481
+ }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2482
+ : _createCommentVNode("v-if", true)
2405
2483
  ]))
2406
2484
  : _createCommentVNode("v-if", true),
2407
2485
  _createElementVNode("section", {
@@ -2770,31 +2848,46 @@ return function render(_ctx, _cache) {
2770
2848
  key: 0,
2771
2849
  class: "segmented-control"
2772
2850
  }, [
2773
- _createElementVNode("button", {
2774
- type: "button",
2775
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2776
- onClick: $event => (_ctx.switchConfigMode('codex'))
2777
- }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2778
- _createElementVNode("button", {
2779
- type: "button",
2780
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2781
- onClick: $event => (_ctx.switchConfigMode('claude'))
2782
- }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2783
- _createElementVNode("button", {
2784
- type: "button",
2785
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2786
- onClick: $event => (_ctx.switchConfigMode('openclaw'))
2787
- }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2788
- _createElementVNode("button", {
2789
- type: "button",
2790
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2791
- onClick: $event => (_ctx.switchConfigMode('opencode'))
2792
- }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]),
2793
- _createElementVNode("button", {
2794
- type: "button",
2795
- class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
2796
- onClick: $event => (_ctx.switchConfigMode('kilocode'))
2797
- }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"])
2851
+ (_ctx.isConfigModeVisible('codex'))
2852
+ ? (_openBlock(), _createElementBlock("button", {
2853
+ key: 0,
2854
+ type: "button",
2855
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2856
+ onClick: $event => (_ctx.switchConfigMode('codex'))
2857
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2858
+ : _createCommentVNode("v-if", true),
2859
+ (_ctx.isConfigModeVisible('claude'))
2860
+ ? (_openBlock(), _createElementBlock("button", {
2861
+ key: 1,
2862
+ type: "button",
2863
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2864
+ onClick: $event => (_ctx.switchConfigMode('claude'))
2865
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2866
+ : _createCommentVNode("v-if", true),
2867
+ (_ctx.isConfigModeVisible('openclaw'))
2868
+ ? (_openBlock(), _createElementBlock("button", {
2869
+ key: 2,
2870
+ type: "button",
2871
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2872
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
2873
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2874
+ : _createCommentVNode("v-if", true),
2875
+ (_ctx.isConfigModeVisible('opencode'))
2876
+ ? (_openBlock(), _createElementBlock("button", {
2877
+ key: 3,
2878
+ type: "button",
2879
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2880
+ onClick: $event => (_ctx.switchConfigMode('opencode'))
2881
+ }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2882
+ : _createCommentVNode("v-if", true),
2883
+ (_ctx.isConfigModeVisible('kilocode'))
2884
+ ? (_openBlock(), _createElementBlock("button", {
2885
+ key: 4,
2886
+ type: "button",
2887
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
2888
+ onClick: $event => (_ctx.switchConfigMode('kilocode'))
2889
+ }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2890
+ : _createCommentVNode("v-if", true)
2798
2891
  ]))
2799
2892
  : _createCommentVNode("v-if", true),
2800
2893
  _createElementVNode("section", {
@@ -2923,91 +3016,575 @@ return function render(_ctx, _cache) {
2923
3016
  r: "3"
2924
3017
  })
2925
3018
  ]))
2926
- : (_openBlock(), _createElementBlock("svg", {
3019
+ : (_openBlock(), _createElementBlock("svg", {
3020
+ key: 1,
3021
+ viewBox: "0 0 20 20",
3022
+ fill: "none",
3023
+ stroke: "currentColor",
3024
+ "stroke-width": "1.5",
3025
+ width: "16",
3026
+ height: "16"
3027
+ }, [
3028
+ _createElementVNode("path", { d: "M2 2l16 16M8.2 4.2A9.9 9.9 0 0 1 10 4c5 0 8.27 4.11 9 6-.44.94-1.5 2.7-3.2 4.2M14.5 14.5A5.9 5.9 0 0 1 10 16c-5 0-8.27-4.11-9-6 .76-1.66 2.2-3.6 4.3-5" })
3029
+ ]))
3030
+ ], 40 /* PROPS, NEED_HYDRATION */, ["onMousedown", "onClick", "title", "aria-label"])
3031
+ ])
3032
+ ])
3033
+ ]),
3034
+ (_ctx.kilocodeError)
3035
+ ? (_openBlock(), _createElementBlock("div", {
3036
+ key: 0,
3037
+ class: "config-template-hint error-text"
3038
+ }, _toDisplayString(_ctx.kilocodeError), 1 /* TEXT */))
3039
+ : _createCommentVNode("v-if", true)
3040
+ ]),
3041
+ (_ctx.kilocodeProviders.length)
3042
+ ? (_openBlock(), _createElementBlock("section", {
3043
+ key: 0,
3044
+ class: "selector-section"
3045
+ }, [
3046
+ _createElementVNode("div", { class: "selector-header" }, [
3047
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('kilocode.summary.title')), 1 /* TEXT */)
3048
+ ]),
3049
+ _createElementVNode("div", { class: "card-list" }, [
3050
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.kilocodeProviders, (provider) => {
3051
+ return (_openBlock(), _createElementBlock("div", {
3052
+ key: provider.name,
3053
+ class: _normalizeClass(['card', { active: _ctx.normalizeKilocodeProviderNameForUi(provider.name) === _ctx.normalizeKilocodeProviderNameForUi(_ctx.kilocodeProvider) }]),
3054
+ onDblclick: $event => (_ctx.selectKilocodeProvider(provider)),
3055
+ onKeydown: _withKeys(_withModifiers($event => (_ctx.selectKilocodeProvider(provider)), ["self","prevent"]), ["enter"]),
3056
+ tabindex: "0",
3057
+ role: "button",
3058
+ "aria-current": _ctx.normalizeKilocodeProviderNameForUi(provider.name) === _ctx.normalizeKilocodeProviderNameForUi(_ctx.kilocodeProvider) ? 'true' : null
3059
+ }, [
3060
+ _createElementVNode("div", { class: "card-leading" }, [
3061
+ _createElementVNode("div", { class: "card-icon" }, _toDisplayString(provider.name.charAt(0).toUpperCase()), 1 /* TEXT */),
3062
+ _createElementVNode("div", { class: "card-content" }, [
3063
+ _createElementVNode("div", { class: "card-title" }, _toDisplayString(provider.name), 1 /* TEXT */),
3064
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(provider.baseURL || provider.api || _ctx.t('config.url.unset')), 1 /* TEXT */),
3065
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString((provider.models || []).join(', ') || _ctx.t('opencode.summary.noModel')), 1 /* TEXT */)
3066
+ ])
3067
+ ]),
3068
+ _createElementVNode("div", { class: "card-trailing" }, [
3069
+ _createElementVNode("span", {
3070
+ class: _normalizeClass(['pill', provider.hasKey ? 'configured' : 'empty'])
3071
+ }, _toDisplayString(provider.hasKey ? _ctx.t('common.configured') : _ctx.t('common.notConfigured')), 3 /* TEXT, CLASS */)
3072
+ ])
3073
+ ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onDblclick", "onKeydown", "aria-current"]))
3074
+ }), 128 /* KEYED_FRAGMENT */))
3075
+ ])
3076
+ ]))
3077
+ : _createCommentVNode("v-if", true),
3078
+ _createElementVNode("section", { class: "selector-section" }, [
3079
+ _createElementVNode("div", { class: "selector-header" }, [
3080
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('kilocode.configPreview.title')), 1 /* TEXT */)
3081
+ ]),
3082
+ _createElementVNode("textarea", {
3083
+ class: "template-textarea",
3084
+ value: _ctx.kilocodeContent,
3085
+ spellcheck: "false",
3086
+ readonly: "",
3087
+ "aria-readonly": "true"
3088
+ }, null, 8 /* PROPS */, ["value"]),
3089
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('kilocode.configPreview.hint')), 1 /* TEXT */)
3090
+ ]),
3091
+ (!_ctx.isToolConfigWriteAllowed('kilocode'))
3092
+ ? (_openBlock(), _createElementBlock("div", {
3093
+ key: 1,
3094
+ class: "tool-config-write-overlay"
3095
+ }, [
3096
+ _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
3097
+ _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.kilocode.lockedTitle')), 1 /* TEXT */),
3098
+ _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.kilocode.lockedDesc')), 1 /* TEXT */),
3099
+ _createElementVNode("button", {
3100
+ type: "button",
3101
+ class: "btn-tool",
3102
+ onClick: $event => (_ctx.setToolConfigPermission('kilocode', true)),
3103
+ disabled: _ctx.toolConfigPermissionSaving.kilocode
3104
+ }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3105
+ ])
3106
+ ]))
3107
+ : _createCommentVNode("v-if", true)
3108
+ ])
3109
+ ], 2 /* CLASS */)
3110
+ ], 8 /* PROPS */, ["aria-labelledby"]), [
3111
+ [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'kilocode']
3112
+ ]),
3113
+ _createCommentVNode(" Pi 配置 "),
3114
+ _withDirectives(_createElementVNode("div", {
3115
+ class: "mode-content mode-cards",
3116
+ id: "panel-config-pi",
3117
+ role: "tabpanel",
3118
+ "aria-labelledby": _ctx.forceCompactLayout ? 'tab-config' : 'side-tab-config-pi'
3119
+ }, [
3120
+ (_ctx.forceCompactLayout && !_ctx.sessionStandalone)
3121
+ ? (_openBlock(), _createElementBlock("div", {
3122
+ key: 0,
3123
+ class: "segmented-control"
3124
+ }, [
3125
+ (_ctx.isConfigModeVisible('codex'))
3126
+ ? (_openBlock(), _createElementBlock("button", {
3127
+ key: 0,
3128
+ type: "button",
3129
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
3130
+ onClick: $event => (_ctx.switchConfigMode('codex'))
3131
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
3132
+ : _createCommentVNode("v-if", true),
3133
+ (_ctx.isConfigModeVisible('claude'))
3134
+ ? (_openBlock(), _createElementBlock("button", {
3135
+ key: 1,
3136
+ type: "button",
3137
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
3138
+ onClick: $event => (_ctx.switchConfigMode('claude'))
3139
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
3140
+ : _createCommentVNode("v-if", true),
3141
+ (_ctx.isConfigModeVisible('openclaw'))
3142
+ ? (_openBlock(), _createElementBlock("button", {
3143
+ key: 2,
3144
+ type: "button",
3145
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
3146
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
3147
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
3148
+ : _createCommentVNode("v-if", true),
3149
+ (_ctx.isConfigModeVisible('opencode'))
3150
+ ? (_openBlock(), _createElementBlock("button", {
3151
+ key: 3,
3152
+ type: "button",
3153
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
3154
+ onClick: $event => (_ctx.switchConfigMode('opencode'))
3155
+ }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
3156
+ : _createCommentVNode("v-if", true),
3157
+ (_ctx.isConfigModeVisible('kilocode'))
3158
+ ? (_openBlock(), _createElementBlock("button", {
3159
+ key: 4,
3160
+ type: "button",
3161
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
3162
+ onClick: $event => (_ctx.switchConfigMode('kilocode'))
3163
+ }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
3164
+ : _createCommentVNode("v-if", true),
3165
+ (_ctx.isConfigModeVisible('pi'))
3166
+ ? (_openBlock(), _createElementBlock("button", {
3167
+ key: 5,
3168
+ type: "button",
3169
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'pi' }]),
3170
+ onClick: $event => (_ctx.switchConfigMode('pi'))
3171
+ }, _toDisplayString(_ctx.t('tab.config.pi')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
3172
+ : _createCommentVNode("v-if", true)
3173
+ ]))
3174
+ : _createCommentVNode("v-if", true),
3175
+ _createElementVNode("section", {
3176
+ class: "tool-config-write-card",
3177
+ "aria-label": _ctx.t('toolConfig.pi.title')
3178
+ }, [
3179
+ _createElementVNode("div", { class: "tool-config-write-copy" }, [
3180
+ _createElementVNode("div", { class: "tool-config-write-title" }, _toDisplayString(_ctx.t('toolConfig.pi.title')), 1 /* TEXT */),
3181
+ _createElementVNode("p", { class: "tool-config-write-desc" }, _toDisplayString(_ctx.t('toolConfig.pi.desc')), 1 /* TEXT */)
3182
+ ]),
3183
+ _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
3184
+ _createElementVNode("input", {
3185
+ type: "checkbox",
3186
+ autocomplete: "off",
3187
+ checked: _ctx.isToolConfigWriteAllowed('pi'),
3188
+ disabled: _ctx.toolConfigPermissionSaving.pi,
3189
+ onChange: $event => (_ctx.setToolConfigPermission('pi', $event.target.checked))
3190
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "disabled", "onChange"]),
3191
+ _createElementVNode("span", { class: "toggle-track" }, [
3192
+ _createElementVNode("span", { class: "toggle-thumb" })
3193
+ ]),
3194
+ _createElementVNode("span", null, _toDisplayString(_ctx.toolConfigPermissionStatusLabel('pi')), 1 /* TEXT */)
3195
+ ])
3196
+ ], 8 /* PROPS */, ["aria-label"]),
3197
+ _createElementVNode("div", {
3198
+ class: _normalizeClass(["tool-config-write-scope", { locked: !_ctx.isToolConfigWriteAllowed('pi') }])
3199
+ }, [
3200
+ _createElementVNode("div", { class: "tool-config-write-body" }, [
3201
+ _createElementVNode("section", { class: "selector-section" }, [
3202
+ _createElementVNode("div", { class: "selector-header" }, [
3203
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('pi.providers.title')), 1 /* TEXT */),
3204
+ _createElementVNode("button", {
3205
+ type: "button",
3206
+ class: "btn-tool",
3207
+ onClick: _ctx.startAddPiProvider,
3208
+ disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3209
+ }, _toDisplayString(_ctx.t('pi.providers.add')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3210
+ ]),
3211
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.targetFile', { path: '~/.pi/agent/models.json' })), 1 /* TEXT */),
3212
+ (_ctx.piProviderIds.length)
3213
+ ? (_openBlock(), _createElementBlock("div", {
3214
+ key: 0,
3215
+ class: "card-list"
3216
+ }, [
3217
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.piProviderIds, (providerId) => {
3218
+ return (_openBlock(), _createElementBlock("div", {
3219
+ key: providerId,
3220
+ class: "card",
3221
+ role: "button",
3222
+ tabindex: "0",
3223
+ onClick: $event => (_ctx.openEditPiProvider(providerId))
3224
+ }, [
3225
+ _createElementVNode("div", { class: "card-leading" }, [
3226
+ _createElementVNode("div", { class: "card-icon" }, _toDisplayString(_ctx.piProviderName(providerId).charAt(0).toUpperCase()), 1 /* TEXT */),
3227
+ _createElementVNode("div", { class: "card-content" }, [
3228
+ _createElementVNode("div", { class: "card-title" }, _toDisplayString(_ctx.piProviderName(providerId)), 1 /* TEXT */),
3229
+ _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(_ctx.piProviderSummary(providerId)), 1 /* TEXT */)
3230
+ ])
3231
+ ]),
3232
+ _createElementVNode("div", { class: "card-trailing" }, [
3233
+ (_ctx.piActiveProvider === providerId)
3234
+ ? (_openBlock(), _createElementBlock("span", {
3235
+ key: 0,
3236
+ class: "pill configured"
3237
+ }, _toDisplayString(_ctx.t('pi.providers.active')), 1 /* TEXT */))
3238
+ : (_openBlock(), _createElementBlock("button", {
3239
+ key: 1,
3240
+ type: "button",
3241
+ class: "btn-tool",
3242
+ onClick: _withModifiers($event => (_ctx.switchPiActiveProvider(providerId)), ["stop"]),
3243
+ disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3244
+ }, _toDisplayString(_ctx.t('pi.providers.setActive')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]))
3245
+ ])
3246
+ ], 8 /* PROPS */, ["onClick"]))
3247
+ }), 128 /* KEYED_FRAGMENT */))
3248
+ ]))
3249
+ : _createCommentVNode("v-if", true),
3250
+ (!_ctx.piProviderIds.length)
3251
+ ? (_openBlock(), _createElementBlock("div", {
3252
+ key: 1,
3253
+ class: "config-template-hint"
3254
+ }, _toDisplayString(_ctx.t('pi.providers.empty')), 1 /* TEXT */))
3255
+ : _createCommentVNode("v-if", true)
3256
+ ]),
3257
+ (_ctx.editingPiProvider)
3258
+ ? (_openBlock(), _createElementBlock("section", {
3259
+ key: 0,
3260
+ class: "selector-section"
3261
+ }, [
3262
+ _createElementVNode("div", { class: "selector-header" }, [
3263
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('pi.providers.editorTitle')), 1 /* TEXT */),
3264
+ _createElementVNode("div", { class: "settings-tab-actions" }, [
3265
+ _createElementVNode("button", {
3266
+ type: "button",
3267
+ class: "btn-tool",
3268
+ onClick: _ctx.savePiProvider,
3269
+ disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3270
+ }, _toDisplayString(_ctx.t('common.save')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3271
+ ])
3272
+ ]),
3273
+ _createElementVNode("div", { class: "codex-config-grid" }, [
3274
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
3275
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.name')), 1 /* TEXT */),
3276
+ _createElementVNode("input", {
3277
+ class: "form-input",
3278
+ type: "text",
3279
+ value: _ctx.piProviderName(_ctx.editingPiProvider.id),
3280
+ readonly: ""
3281
+ }, null, 8 /* PROPS */, ["value"])
3282
+ ]),
3283
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
3284
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.baseUrl')), 1 /* TEXT */),
3285
+ _withDirectives(_createElementVNode("input", {
3286
+ class: "form-input",
3287
+ type: "url",
3288
+ "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.baseUrl) = $event),
3289
+ autocomplete: "off",
3290
+ spellcheck: "false",
3291
+ placeholder: "https://"
3292
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue"]), [
3293
+ [_vModelText, _ctx.editingPiProvider.form.baseUrl]
3294
+ ])
3295
+ ]),
3296
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
3297
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.api')), 1 /* TEXT */),
3298
+ _withDirectives(_createElementVNode("select", {
3299
+ class: "form-input",
3300
+ "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.api) = $event),
3301
+ disabled: !_ctx.isToolConfigWriteAllowed('pi')
3302
+ }, [
3303
+ _createElementVNode("option", { value: "openai-completions" }, "openai-completions — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiCompletions')), 1 /* TEXT */),
3304
+ _createElementVNode("option", { value: "openai-responses" }, "openai-responses — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiResponses')), 1 /* TEXT */),
3305
+ _createElementVNode("option", { value: "anthropic-messages" }, "anthropic-messages — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.anthropicMessages')), 1 /* TEXT */),
3306
+ _createElementVNode("option", { value: "google-generative-ai" }, "google-generative-ai — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.googleGenerativeAi')), 1 /* TEXT */),
3307
+ (!['openai-completions', 'openai-responses', 'anthropic-messages', 'google-generative-ai'].includes(_ctx.editingPiProvider.form.api))
3308
+ ? (_openBlock(), _createElementBlock("option", {
3309
+ key: 0,
3310
+ value: _ctx.editingPiProvider.form.api
3311
+ }, _toDisplayString(_ctx.editingPiProvider.form.api || '—'), 9 /* TEXT, PROPS */, ["value"]))
3312
+ : _createCommentVNode("v-if", true)
3313
+ ], 8 /* PROPS */, ["onUpdate:modelValue", "disabled"]), [
3314
+ [_vModelSelect, _ctx.editingPiProvider.form.api]
3315
+ ])
3316
+ ]),
3317
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
3318
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.apiKey')), 1 /* TEXT */),
3319
+ _createElementVNode("div", { class: "input-with-toggle" }, [
3320
+ _withDirectives(_createElementVNode("input", {
3321
+ class: "form-input",
3322
+ "onUpdate:modelValue": $event => ((_ctx.editingPiProvider.form.apiKey) = $event),
3323
+ type: _ctx.piShowKey ? 'text' : 'password',
3324
+ autocomplete: "off",
3325
+ spellcheck: "false",
3326
+ placeholder: "sk-..."
3327
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "type"]), [
3328
+ [_vModelDynamic, _ctx.editingPiProvider.form.apiKey]
3329
+ ]),
3330
+ _createElementVNode("button", {
3331
+ type: "button",
3332
+ class: "input-toggle-btn",
3333
+ onMousedown: _withModifiers(() => {}, ["prevent"]),
3334
+ onClick: $event => (_ctx.piShowKey = !_ctx.piShowKey),
3335
+ title: _ctx.piShowKey ? _ctx.t('common.hide') : _ctx.t('common.show'),
3336
+ "aria-label": _ctx.piShowKey ? _ctx.t('common.hide') : _ctx.t('common.show')
3337
+ }, [
3338
+ (!_ctx.piShowKey)
3339
+ ? (_openBlock(), _createElementBlock("svg", {
3340
+ key: 0,
3341
+ viewBox: "0 0 20 20",
3342
+ fill: "none",
3343
+ stroke: "currentColor",
3344
+ "stroke-width": "1.5",
3345
+ width: "16",
3346
+ height: "16"
3347
+ }, [
3348
+ _createElementVNode("path", { d: "M10 4C5 4 1.73 8.11 1 10c.73 1.89 4 6 9 6s8.27-4.11 9-6c-.73-1.89-4-6-9-6z" }),
3349
+ _createElementVNode("circle", {
3350
+ cx: "10",
3351
+ cy: "10",
3352
+ r: "3"
3353
+ })
3354
+ ]))
3355
+ : (_openBlock(), _createElementBlock("svg", {
3356
+ key: 1,
3357
+ viewBox: "0 0 20 20",
3358
+ fill: "none",
3359
+ stroke: "currentColor",
3360
+ "stroke-width": "1.5",
3361
+ width: "16",
3362
+ height: "16"
3363
+ }, [
3364
+ _createElementVNode("path", { d: "M2 2l16 16M8.2 4.2A9.9 9.9 0 0 1 10 4c5 0 8.27 4.11 9 6-.44.94-1.5 2.7-3.2 4.2M14.5 14.5A5.9 5.9 0 0 1 10 16c-5 0-8.27-4.11-9-6 .76-1.66 2.2-3.6 4.3-5" })
3365
+ ]))
3366
+ ], 40 /* PROPS, NEED_HYDRATION */, ["onMousedown", "onClick", "title", "aria-label"])
3367
+ ])
3368
+ ])
3369
+ ]),
3370
+ _createElementVNode("div", { class: "form-group" }, [
3371
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.models')), 1 /* TEXT */),
3372
+ (_ctx.piRemoteModelsLoading)
3373
+ ? (_openBlock(), _createElementBlock("p", {
3374
+ key: 0,
3375
+ class: "config-template-hint"
3376
+ }, _toDisplayString(_ctx.t('pi.providers.models.remoteLoading')), 1 /* TEXT */))
3377
+ : (_ctx.piRemoteModelError)
3378
+ ? (_openBlock(), _createElementBlock("p", {
3379
+ key: 1,
3380
+ class: "config-template-hint"
3381
+ }, _toDisplayString(_ctx.piRemoteModelError) + " · " + _toDisplayString(_ctx.t('pi.providers.models.remoteFailed')), 1 /* TEXT */))
3382
+ : _createCommentVNode("v-if", true),
3383
+ _createElementVNode("div", { class: "card-list" }, [
3384
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.editingPiProvider.form.models, (model, index) => {
3385
+ return (_openBlock(), _createElementBlock("div", {
3386
+ class: "card",
3387
+ key: index
3388
+ }, [
3389
+ _createElementVNode("div", { class: "input-with-toggle" }, [
3390
+ _withDirectives(_createElementVNode("input", {
3391
+ class: "form-input",
3392
+ type: "text",
3393
+ "onUpdate:modelValue": $event => ((model.id) = $event),
3394
+ autocomplete: "off",
3395
+ spellcheck: "false",
3396
+ placeholder: "claude-sonnet-4",
3397
+ disabled: !_ctx.isToolConfigWriteAllowed('pi'),
3398
+ onInput: $event => (_ctx.piModelSearch = model.id)
3399
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "disabled", "onInput"]), [
3400
+ [_vModelText, model.id]
3401
+ ]),
3402
+ _createElementVNode("button", {
3403
+ type: "button",
3404
+ class: "btn-tool input-toggle-btn",
3405
+ onClick: $event => (_ctx.editingPiProvider.form.models.splice(index, 1)),
3406
+ disabled: !_ctx.isToolConfigWriteAllowed('pi')
3407
+ }, _toDisplayString(_ctx.t('pi.providers.models.remove')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3408
+ ])
3409
+ ]))
3410
+ }), 128 /* KEYED_FRAGMENT */)),
3411
+ (_ctx.editingPiProvider.form.models.length === 0)
3412
+ ? (_openBlock(), _createElementBlock("div", {
3413
+ key: 0,
3414
+ class: "card"
3415
+ }, [
3416
+ _withDirectives(_createElementVNode("input", {
3417
+ class: "form-input",
3418
+ type: "text",
3419
+ "onUpdate:modelValue": $event => ((_ctx.piModelSearch) = $event),
3420
+ autocomplete: "off",
3421
+ spellcheck: "false",
3422
+ placeholder: _ctx.t('pi.providers.models.search'),
3423
+ onKeydown: _withKeys(_withModifiers($event => (_ctx.addPiRemoteModel(_ctx.piModelSearch.trim())), ["prevent"]), ["enter"])
3424
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onKeydown"]), [
3425
+ [_vModelText, _ctx.piModelSearch]
3426
+ ])
3427
+ ]))
3428
+ : _createCommentVNode("v-if", true),
3429
+ (!_ctx.piRemoteModelsLoading && !_ctx.piRemoteModelError && _ctx.piModelSearch.trim() && _ctx.piFilteredRemoteModels().length > 0)
3430
+ ? (_openBlock(), _createElementBlock("div", {
2927
3431
  key: 1,
2928
- viewBox: "0 0 20 20",
2929
- fill: "none",
2930
- stroke: "currentColor",
2931
- "stroke-width": "1.5",
2932
- width: "16",
2933
- height: "16"
3432
+ class: "card"
2934
3433
  }, [
2935
- _createElementVNode("path", { d: "M2 2l16 16M8.2 4.2A9.9 9.9 0 0 1 10 4c5 0 8.27 4.11 9 6-.44.94-1.5 2.7-3.2 4.2M14.5 14.5A5.9 5.9 0 0 1 10 16c-5 0-8.27-4.11-9-6 .76-1.66 2.2-3.6 4.3-5" })
3434
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.piFilteredRemoteModels(), (id) => {
3435
+ return (_openBlock(), _createElementBlock("button", {
3436
+ type: "button",
3437
+ class: "btn-tool",
3438
+ style: {"width":"100%","text-align":"left","justify-content":"flex-start"},
3439
+ key: id,
3440
+ onClick: $event => (_ctx.addPiRemoteModel(id))
3441
+ }, _toDisplayString(id), 9 /* TEXT, PROPS */, ["onClick"]))
3442
+ }), 128 /* KEYED_FRAGMENT */)),
3443
+ _createElementVNode("p", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.models.remoteCount', { count: _ctx.piRemoteModels.length })), 1 /* TEXT */)
2936
3444
  ]))
2937
- ], 40 /* PROPS, NEED_HYDRATION */, ["onMousedown", "onClick", "title", "aria-label"])
3445
+ : _createCommentVNode("v-if", true),
3446
+ (!_ctx.piRemoteModelsLoading && !_ctx.piRemoteModelError && _ctx.piModelSearch.trim() && _ctx.piFilteredRemoteModels().length === 0)
3447
+ ? (_openBlock(), _createElementBlock("p", {
3448
+ key: 2,
3449
+ class: "config-template-hint"
3450
+ }, _toDisplayString(_ctx.t('pi.providers.models.noMatch')), 1 /* TEXT */))
3451
+ : _createCommentVNode("v-if", true)
3452
+ ])
3453
+ ]),
3454
+ _createElementVNode("div", { class: "settings-tab-actions" }, [
3455
+ _createElementVNode("button", {
3456
+ type: "button",
3457
+ class: "btn-tool",
3458
+ onClick: _ctx.confirmDeletePiProvider,
3459
+ disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3460
+ }, _toDisplayString(_ctx.t('pi.providers.delete')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
2938
3461
  ])
2939
- ])
2940
- ]),
2941
- (_ctx.kilocodeError)
2942
- ? (_openBlock(), _createElementBlock("div", {
2943
- key: 0,
2944
- class: "config-template-hint error-text"
2945
- }, _toDisplayString(_ctx.kilocodeError), 1 /* TEXT */))
2946
- : _createCommentVNode("v-if", true)
2947
- ]),
2948
- (_ctx.kilocodeProviders.length)
3462
+ ]))
3463
+ : _createCommentVNode("v-if", true),
3464
+ (_ctx.showAddPiProviderModal)
2949
3465
  ? (_openBlock(), _createElementBlock("section", {
2950
- key: 0,
3466
+ key: 1,
2951
3467
  class: "selector-section"
2952
3468
  }, [
2953
3469
  _createElementVNode("div", { class: "selector-header" }, [
2954
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('kilocode.summary.title')), 1 /* TEXT */)
3470
+ _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('pi.providers.addModal.title')), 1 /* TEXT */),
3471
+ _createElementVNode("div", { class: "settings-tab-actions" }, [
3472
+ _createElementVNode("button", {
3473
+ type: "button",
3474
+ class: "btn-tool",
3475
+ onClick: _ctx.addPiProviderFromModal,
3476
+ disabled: !_ctx.isToolConfigWriteAllowed('pi') || _ctx.piSaving
3477
+ }, _toDisplayString(_ctx.t('common.save')), 9 /* TEXT, PROPS */, ["onClick", "disabled"]),
3478
+ _createElementVNode("button", {
3479
+ type: "button",
3480
+ class: "btn-tool",
3481
+ onClick: _ctx.cancelAddPiProviderModal
3482
+ }, _toDisplayString(_ctx.t('common.cancel')), 9 /* TEXT, PROPS */, ["onClick"])
3483
+ ])
2955
3484
  ]),
2956
- _createElementVNode("div", { class: "card-list" }, [
2957
- (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.kilocodeProviders, (provider) => {
2958
- return (_openBlock(), _createElementBlock("div", {
2959
- key: provider.name,
2960
- class: _normalizeClass(['card', { active: _ctx.normalizeKilocodeProviderNameForUi(provider.name) === _ctx.normalizeKilocodeProviderNameForUi(_ctx.kilocodeProvider) }]),
2961
- onDblclick: $event => (_ctx.selectKilocodeProvider(provider)),
2962
- onKeydown: _withKeys(_withModifiers($event => (_ctx.selectKilocodeProvider(provider)), ["self","prevent"]), ["enter"]),
2963
- tabindex: "0",
2964
- role: "button",
2965
- "aria-current": _ctx.normalizeKilocodeProviderNameForUi(provider.name) === _ctx.normalizeKilocodeProviderNameForUi(_ctx.kilocodeProvider) ? 'true' : null
3485
+ _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.addModal.subtitle')), 1 /* TEXT */),
3486
+ _createElementVNode("div", { class: "codex-config-grid" }, [
3487
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
3488
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.addModal.fields.baseUrl')), 1 /* TEXT */),
3489
+ _withDirectives(_createElementVNode("input", {
3490
+ class: "form-input",
3491
+ type: "url",
3492
+ "onUpdate:modelValue": $event => ((_ctx.addingPiProviderBaseUrl) = $event),
3493
+ autocomplete: "off",
3494
+ spellcheck: "false",
3495
+ placeholder: "https://",
3496
+ onInput: _ctx.onAddingPiEndpointChange
3497
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "onInput"]), [
3498
+ [_vModelText, _ctx.addingPiProviderBaseUrl]
3499
+ ])
3500
+ ]),
3501
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
3502
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.addModal.fields.api')), 1 /* TEXT */),
3503
+ _withDirectives(_createElementVNode("select", {
3504
+ class: "form-input",
3505
+ "onUpdate:modelValue": $event => ((_ctx.addingPiProviderApi) = $event)
2966
3506
  }, [
2967
- _createElementVNode("div", { class: "card-leading" }, [
2968
- _createElementVNode("div", { class: "card-icon" }, _toDisplayString(provider.name.charAt(0).toUpperCase()), 1 /* TEXT */),
2969
- _createElementVNode("div", { class: "card-content" }, [
2970
- _createElementVNode("div", { class: "card-title" }, _toDisplayString(provider.name), 1 /* TEXT */),
2971
- _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString(provider.baseURL || provider.api || _ctx.t('config.url.unset')), 1 /* TEXT */),
2972
- _createElementVNode("div", { class: "card-subtitle" }, _toDisplayString((provider.models || []).join(', ') || _ctx.t('opencode.summary.noModel')), 1 /* TEXT */)
2973
- ])
2974
- ]),
2975
- _createElementVNode("div", { class: "card-trailing" }, [
2976
- _createElementVNode("span", {
2977
- class: _normalizeClass(['pill', provider.hasKey ? 'configured' : 'empty'])
2978
- }, _toDisplayString(provider.hasKey ? _ctx.t('common.configured') : _ctx.t('common.notConfigured')), 3 /* TEXT, CLASS */)
2979
- ])
2980
- ], 42 /* CLASS, PROPS, NEED_HYDRATION */, ["onDblclick", "onKeydown", "aria-current"]))
2981
- }), 128 /* KEYED_FRAGMENT */))
3507
+ _createElementVNode("option", { value: "openai-completions" }, "openai-completions — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiCompletions')), 1 /* TEXT */),
3508
+ _createElementVNode("option", { value: "openai-responses" }, "openai-responses — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.openaiResponses')), 1 /* TEXT */),
3509
+ _createElementVNode("option", { value: "anthropic-messages" }, "anthropic-messages — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.anthropicMessages')), 1 /* TEXT */),
3510
+ _createElementVNode("option", { value: "google-generative-ai" }, "google-generative-ai — " + _toDisplayString(_ctx.t('pi.providers.addModal.api.googleGenerativeAi')), 1 /* TEXT */)
3511
+ ], 8 /* PROPS */, ["onUpdate:modelValue"]), [
3512
+ [_vModelSelect, _ctx.addingPiProviderApi]
3513
+ ])
3514
+ ]),
3515
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
3516
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.addModal.fields.apiKey')), 1 /* TEXT */),
3517
+ _withDirectives(_createElementVNode("input", {
3518
+ class: "form-input",
3519
+ type: "password",
3520
+ "onUpdate:modelValue": $event => ((_ctx.addingPiProviderApiKey) = $event),
3521
+ autocomplete: "off",
3522
+ spellcheck: "false",
3523
+ placeholder: _ctx.t('common.optional'),
3524
+ onInput: _ctx.onAddingPiEndpointChange
3525
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["onUpdate:modelValue", "placeholder", "onInput"]), [
3526
+ [_vModelText, _ctx.addingPiProviderApiKey]
3527
+ ])
3528
+ ]),
3529
+ _createElementVNode("div", { class: "form-group codex-config-field" }, [
3530
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('pi.providers.fields.models')), 1 /* TEXT */),
3531
+ (_ctx.addingPiRemoteLoading)
3532
+ ? (_openBlock(), _createElementBlock("p", {
3533
+ key: 0,
3534
+ class: "config-template-hint"
3535
+ }, _toDisplayString(_ctx.t('pi.providers.models.remoteLoading')), 1 /* TEXT */))
3536
+ : (_ctx.addingPiRemoteError)
3537
+ ? (_openBlock(), _createElementBlock("p", {
3538
+ key: 1,
3539
+ class: "config-template-hint"
3540
+ }, _toDisplayString(_ctx.addingPiRemoteError) + " · " + _toDisplayString(_ctx.t('pi.providers.models.remoteFailed')), 1 /* TEXT */))
3541
+ : _createCommentVNode("v-if", true),
3542
+ _withDirectives(_createElementVNode("input", {
3543
+ class: "form-input",
3544
+ type: "text",
3545
+ "onUpdate:modelValue": $event => ((_ctx.addingPiProviderModel) = $event),
3546
+ autocomplete: "off",
3547
+ spellcheck: "false",
3548
+ placeholder: _ctx.addingPiRemoteModels.length ? _ctx.t('pi.providers.models.search') : 'claude-sonnet-4'
3549
+ }, null, 8 /* PROPS */, ["onUpdate:modelValue", "placeholder"]), [
3550
+ [_vModelText, _ctx.addingPiProviderModel]
3551
+ ]),
3552
+ (!_ctx.addingPiRemoteLoading && _ctx.addingPiProviderModel.trim() && _ctx.piFilteredAddingRemoteModels().length > 0)
3553
+ ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [
3554
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.piFilteredAddingRemoteModels(), (id) => {
3555
+ return (_openBlock(), _createElementBlock("button", {
3556
+ type: "button",
3557
+ class: "btn-tool",
3558
+ style: {"width":"100%","text-align":"left","justify-content":"flex-start","margin-top":"8px"},
3559
+ key: id,
3560
+ onClick: $event => (_ctx.addingPiProviderModel = id)
3561
+ }, _toDisplayString(id), 9 /* TEXT, PROPS */, ["onClick"]))
3562
+ }), 128 /* KEYED_FRAGMENT */)),
3563
+ _createElementVNode("p", { class: "config-template-hint" }, _toDisplayString(_ctx.t('pi.providers.models.remoteCount', { count: _ctx.addingPiRemoteModels.length })), 1 /* TEXT */)
3564
+ ], 64 /* STABLE_FRAGMENT */))
3565
+ : (!_ctx.addingPiRemoteLoading && !_ctx.addingPiRemoteError && _ctx.addingPiProviderModel.trim() && _ctx.addingPiRemoteModels.length > 0)
3566
+ ? (_openBlock(), _createElementBlock("p", {
3567
+ key: 3,
3568
+ class: "config-template-hint"
3569
+ }, _toDisplayString(_ctx.t('pi.providers.models.noMatch')), 1 /* TEXT */))
3570
+ : _createCommentVNode("v-if", true)
3571
+ ])
2982
3572
  ])
2983
3573
  ]))
2984
3574
  : _createCommentVNode("v-if", true),
2985
- _createElementVNode("section", { class: "selector-section" }, [
2986
- _createElementVNode("div", { class: "selector-header" }, [
2987
- _createElementVNode("span", { class: "selector-title" }, _toDisplayString(_ctx.t('kilocode.configPreview.title')), 1 /* TEXT */)
2988
- ]),
2989
- _createElementVNode("textarea", {
2990
- class: "template-textarea",
2991
- value: _ctx.kilocodeContent,
2992
- spellcheck: "false",
2993
- readonly: "",
2994
- "aria-readonly": "true"
2995
- }, null, 8 /* PROPS */, ["value"]),
2996
- _createElementVNode("div", { class: "config-template-hint" }, _toDisplayString(_ctx.t('kilocode.configPreview.hint')), 1 /* TEXT */)
2997
- ]),
2998
- (!_ctx.isToolConfigWriteAllowed('kilocode'))
3575
+ (!_ctx.isToolConfigWriteAllowed('pi'))
2999
3576
  ? (_openBlock(), _createElementBlock("div", {
3000
- key: 1,
3577
+ key: 2,
3001
3578
  class: "tool-config-write-overlay"
3002
3579
  }, [
3003
3580
  _createElementVNode("div", { class: "tool-config-write-overlay-card" }, [
3004
- _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.kilocode.lockedTitle')), 1 /* TEXT */),
3005
- _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.kilocode.lockedDesc')), 1 /* TEXT */),
3581
+ _createElementVNode("div", { class: "tool-config-write-overlay-title" }, _toDisplayString(_ctx.t('toolConfig.pi.lockedTitle')), 1 /* TEXT */),
3582
+ _createElementVNode("p", null, _toDisplayString(_ctx.t('toolConfig.pi.lockedDesc')), 1 /* TEXT */),
3006
3583
  _createElementVNode("button", {
3007
3584
  type: "button",
3008
3585
  class: "btn-tool",
3009
- onClick: $event => (_ctx.setToolConfigPermission('kilocode', true)),
3010
- disabled: _ctx.toolConfigPermissionSaving.kilocode
3586
+ onClick: $event => (_ctx.setToolConfigPermission('pi', true)),
3587
+ disabled: _ctx.toolConfigPermissionSaving.pi
3011
3588
  }, _toDisplayString(_ctx.t('toolConfig.enableWrite')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
3012
3589
  ])
3013
3590
  ]))
@@ -3015,7 +3592,7 @@ return function render(_ctx, _cache) {
3015
3592
  ])
3016
3593
  ], 2 /* CLASS */)
3017
3594
  ], 8 /* PROPS */, ["aria-labelledby"]), [
3018
- [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'kilocode']
3595
+ [_vShow, _ctx.mainTab === 'config' && _ctx.configMode === 'pi']
3019
3596
  ]),
3020
3597
  _createCommentVNode(" 会话浏览模式 "),
3021
3598
  _withDirectives(_createElementVNode("div", {
@@ -3812,7 +4389,33 @@ return function render(_ctx, _cache) {
3812
4389
  _createElementVNode("div", {
3813
4390
  class: "session-msg-content",
3814
4391
  innerHTML: _ctx.highlightQueryText(msg.text) || ''
3815
- }, null, 8 /* PROPS */, ["innerHTML"])
4392
+ }, null, 8 /* PROPS */, ["innerHTML"]),
4393
+ (msg.normalizedRole === 'user')
4394
+ ? (_openBlock(), _createElementBlock("button", {
4395
+ key: 0,
4396
+ type: "button",
4397
+ class: "session-msg-copy",
4398
+ onClick: $event => (_ctx.copySessionMessage(msg)),
4399
+ "aria-label": _ctx.t('sessions.preview.copyMessage'),
4400
+ title: _ctx.t('sessions.preview.copyMessage')
4401
+ }, [
4402
+ (_openBlock(), _createElementBlock("svg", {
4403
+ viewBox: "0 0 24 24",
4404
+ fill: "none",
4405
+ stroke: "currentColor",
4406
+ "stroke-width": "2"
4407
+ }, [
4408
+ _createElementVNode("rect", {
4409
+ x: "8",
4410
+ y: "8",
4411
+ width: "12",
4412
+ height: "12",
4413
+ rx: "2"
4414
+ }),
4415
+ _createElementVNode("path", { d: "M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2" })
4416
+ ]))
4417
+ ], 8 /* PROPS */, ["onClick", "aria-label", "title"]))
4418
+ : _createCommentVNode("v-if", true)
3816
4419
  ], 10 /* CLASS, PROPS */, ["data-message-key"]))
3817
4420
  _item.memo = _memo
3818
4421
  return _item
@@ -4710,6 +5313,86 @@ return function render(_ctx, _cache) {
4710
5313
  _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.timeline.style.hint')), 1 /* TEXT */)
4711
5314
  ])
4712
5315
  ])
5316
+ ], 8 /* PROPS */, ["aria-label"]),
5317
+ _createElementVNode("section", {
5318
+ class: "settings-card",
5319
+ "aria-label": _ctx.t('settings.configTabs.title')
5320
+ }, [
5321
+ _createElementVNode("div", { class: "settings-card-main" }, [
5322
+ _createElementVNode("div", { class: "settings-card-content" }, [
5323
+ _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.configTabs.title')), 1 /* TEXT */),
5324
+ _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.configTabs.meta')), 1 /* TEXT */),
5325
+ _createElementVNode("div", { class: "settings-toggle-grid" }, [
5326
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
5327
+ _createElementVNode("input", {
5328
+ type: "checkbox",
5329
+ checked: _ctx.configModeVisibility.codex,
5330
+ onChange: $event => (_ctx.setConfigModeVisibility('codex', $event.target.checked))
5331
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
5332
+ _createElementVNode("span", { class: "toggle-track" }, [
5333
+ _createElementVNode("span", { class: "toggle-thumb" })
5334
+ ]),
5335
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.codex')), 1 /* TEXT */)
5336
+ ]),
5337
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
5338
+ _createElementVNode("input", {
5339
+ type: "checkbox",
5340
+ checked: _ctx.configModeVisibility.claude,
5341
+ onChange: $event => (_ctx.setConfigModeVisibility('claude', $event.target.checked))
5342
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
5343
+ _createElementVNode("span", { class: "toggle-track" }, [
5344
+ _createElementVNode("span", { class: "toggle-thumb" })
5345
+ ]),
5346
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.claude')), 1 /* TEXT */)
5347
+ ]),
5348
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
5349
+ _createElementVNode("input", {
5350
+ type: "checkbox",
5351
+ checked: _ctx.configModeVisibility.openclaw,
5352
+ onChange: $event => (_ctx.setConfigModeVisibility('openclaw', $event.target.checked))
5353
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
5354
+ _createElementVNode("span", { class: "toggle-track" }, [
5355
+ _createElementVNode("span", { class: "toggle-thumb" })
5356
+ ]),
5357
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.openclaw')), 1 /* TEXT */)
5358
+ ]),
5359
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
5360
+ _createElementVNode("input", {
5361
+ type: "checkbox",
5362
+ checked: _ctx.configModeVisibility.opencode,
5363
+ onChange: $event => (_ctx.setConfigModeVisibility('opencode', $event.target.checked))
5364
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
5365
+ _createElementVNode("span", { class: "toggle-track" }, [
5366
+ _createElementVNode("span", { class: "toggle-thumb" })
5367
+ ]),
5368
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.opencode')), 1 /* TEXT */)
5369
+ ]),
5370
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
5371
+ _createElementVNode("input", {
5372
+ type: "checkbox",
5373
+ checked: _ctx.configModeVisibility.kilocode,
5374
+ onChange: $event => (_ctx.setConfigModeVisibility('kilocode', $event.target.checked))
5375
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
5376
+ _createElementVNode("span", { class: "toggle-track" }, [
5377
+ _createElementVNode("span", { class: "toggle-thumb" })
5378
+ ]),
5379
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.kilocode')), 1 /* TEXT */)
5380
+ ]),
5381
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
5382
+ _createElementVNode("input", {
5383
+ type: "checkbox",
5384
+ checked: _ctx.configModeVisibility.pi,
5385
+ onChange: $event => (_ctx.setConfigModeVisibility('pi', $event.target.checked))
5386
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
5387
+ _createElementVNode("span", { class: "toggle-track" }, [
5388
+ _createElementVNode("span", { class: "toggle-thumb" })
5389
+ ]),
5390
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.pi')), 1 /* TEXT */)
5391
+ ])
5392
+ ]),
5393
+ _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.configTabs.hint')), 1 /* TEXT */)
5394
+ ])
5395
+ ])
4713
5396
  ], 8 /* PROPS */, ["aria-label"])
4714
5397
  ])
4715
5398
  ], 512 /* NEED_PATCH */), [
@@ -6035,6 +6718,23 @@ return function render(_ctx, _cache) {
6035
6718
  }),
6036
6719
  _createElementVNode("path", { d: "M16 4h2a2 2 0 012 2v14a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2h2" })
6037
6720
  ]))
6721
+ ], 8 /* PROPS */, ["onClick", "disabled", "title"]),
6722
+ _createElementVNode("button", {
6723
+ class: "btn-mini",
6724
+ onClick: _ctx.openPromptHistory,
6725
+ disabled: _ctx.agentsSaving || _ctx.agentsDiffVisible,
6726
+ title: _ctx.t('common.history')
6727
+ }, [
6728
+ (_openBlock(), _createElementBlock("svg", {
6729
+ class: "btn-icon-sm",
6730
+ viewBox: "0 0 24 24",
6731
+ fill: "none",
6732
+ stroke: "currentColor",
6733
+ "stroke-width": "2"
6734
+ }, [
6735
+ _createElementVNode("path", { d: "M12 8v4l3 2" }),
6736
+ _createElementVNode("path", { d: "M3 12a9 9 0 1 0 9-9 9 9 0 0 0-7.5 4M3 4v4h4" })
6737
+ ]))
6038
6738
  ], 8 /* PROPS */, ["onClick", "disabled", "title"])
6039
6739
  ]),
6040
6740
  _createElementVNode("div", { class: "prompts-editor-group prompts-editor-group--workflow" }, [
@@ -6109,6 +6809,72 @@ return function render(_ctx, _cache) {
6109
6809
  ])
6110
6810
  ])
6111
6811
  ]),
6812
+ (_ctx.promptHistoryVisible)
6813
+ ? (_openBlock(), _createElementBlock("details", {
6814
+ key: 0,
6815
+ class: "prompt-history-panel",
6816
+ open: ""
6817
+ }, [
6818
+ _createElementVNode("summary", { class: "prompt-history-summary" }, [
6819
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('common.history')), 1 /* TEXT */),
6820
+ _createElementVNode("button", {
6821
+ type: "button",
6822
+ class: "btn-mini prompt-history-close",
6823
+ onClick: _ctx.closePromptHistory,
6824
+ title: _ctx.t('common.close')
6825
+ }, "✕", 8 /* PROPS */, ["onClick", "title"])
6826
+ ]),
6827
+ _createElementVNode("div", { class: "prompt-history-body" }, [
6828
+ (!_ctx.promptHistoryLoading && !_ctx.promptHistoryError && _ctx.promptHistoryItems.length)
6829
+ ? (_openBlock(), _createElementBlock("ul", {
6830
+ key: 0,
6831
+ class: "prompt-history-list"
6832
+ }, [
6833
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.promptHistoryItems, (item) => {
6834
+ return (_openBlock(), _createElementBlock("li", {
6835
+ key: item.id,
6836
+ class: _normalizeClass(['prompt-history-item', { active: _ctx.promptHistoryPreviewId === item.id }]),
6837
+ onClick: $event => (_ctx.viewPromptHistoryItem(item))
6838
+ }, [
6839
+ _createElementVNode("span", { class: "prompt-history-time" }, _toDisplayString(item.id), 1 /* TEXT */),
6840
+ _createElementVNode("span", { class: "prompt-history-size" }, _toDisplayString(Math.round(item.size / 1024 * 10) / 10) + " KB", 1 /* TEXT */)
6841
+ ], 10 /* CLASS, PROPS */, ["onClick"]))
6842
+ }), 128 /* KEYED_FRAGMENT */))
6843
+ ]))
6844
+ : _createCommentVNode("v-if", true),
6845
+ (_ctx.promptHistoryLoading)
6846
+ ? (_openBlock(), _createElementBlock("div", {
6847
+ key: 1,
6848
+ class: "state-message"
6849
+ }, _toDisplayString(_ctx.t('diff.generating')), 1 /* TEXT */))
6850
+ : (_ctx.promptHistoryError)
6851
+ ? (_openBlock(), _createElementBlock("div", {
6852
+ key: 2,
6853
+ class: "state-message error"
6854
+ }, _toDisplayString(_ctx.promptHistoryError), 1 /* TEXT */))
6855
+ : (!_ctx.promptHistoryItems.length)
6856
+ ? (_openBlock(), _createElementBlock("div", {
6857
+ key: 3,
6858
+ class: "state-message"
6859
+ }, _toDisplayString(_ctx.t('toast.history.empty')), 1 /* TEXT */))
6860
+ : _createCommentVNode("v-if", true),
6861
+ (_ctx.promptHistoryPreviewContent)
6862
+ ? (_openBlock(), _createElementBlock("div", {
6863
+ key: 4,
6864
+ class: "prompt-history-preview-wrap"
6865
+ }, [
6866
+ _createElementVNode("pre", { class: "prompt-history-preview" }, _toDisplayString(_ctx.promptHistoryPreviewContent), 1 /* TEXT */),
6867
+ _createElementVNode("button", {
6868
+ type: "button",
6869
+ class: "btn-mini btn-confirm-mini",
6870
+ onClick: _ctx.applyPromptHistoryToEditor,
6871
+ disabled: _ctx.agentsSaving || _ctx.agentsDiffVisible
6872
+ }, _toDisplayString(_ctx.t('common.restoreToEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
6873
+ ]))
6874
+ : _createCommentVNode("v-if", true)
6875
+ ])
6876
+ ]))
6877
+ : _createCommentVNode("v-if", true),
6112
6878
  _createElementVNode("div", { class: "prompt-presets-inline-row" }, [
6113
6879
  _createElementVNode("div", { class: "prompt-presets-inline-group" }, [
6114
6880
  _createElementVNode("label", { class: "prompt-presets-inline-label" }, _toDisplayString(_ctx.t('prompts.presets.title')), 1 /* TEXT */),
@@ -6386,6 +7152,23 @@ return function render(_ctx, _cache) {
6386
7152
  }),
6387
7153
  _createElementVNode("path", { d: "M16 4h2a2 2 0 012 2v14a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2h2" })
6388
7154
  ]))
7155
+ ], 8 /* PROPS */, ["onClick", "disabled", "title"]),
7156
+ _createElementVNode("button", {
7157
+ class: "btn-mini",
7158
+ onClick: _ctx.openSysHistory,
7159
+ disabled: _ctx.sysPromptSaving || _ctx.sysPromptDiffVisible,
7160
+ title: _ctx.t('common.history')
7161
+ }, [
7162
+ (_openBlock(), _createElementBlock("svg", {
7163
+ class: "btn-icon-sm",
7164
+ viewBox: "0 0 24 24",
7165
+ fill: "none",
7166
+ stroke: "currentColor",
7167
+ "stroke-width": "2"
7168
+ }, [
7169
+ _createElementVNode("path", { d: "M12 8v4l3 2" }),
7170
+ _createElementVNode("path", { d: "M3 12a9 9 0 1 0 9-9 9 9 0 0 0-7.5 4M3 4v4h4" })
7171
+ ]))
6389
7172
  ], 8 /* PROPS */, ["onClick", "disabled", "title"])
6390
7173
  ]),
6391
7174
  _createElementVNode("div", { class: "prompts-editor-group prompts-editor-group--workflow" }, [
@@ -6460,6 +7243,72 @@ return function render(_ctx, _cache) {
6460
7243
  ])
6461
7244
  ])
6462
7245
  ]),
7246
+ (_ctx.sysHistoryVisible)
7247
+ ? (_openBlock(), _createElementBlock("details", {
7248
+ key: 0,
7249
+ class: "prompt-history-panel",
7250
+ open: ""
7251
+ }, [
7252
+ _createElementVNode("summary", { class: "prompt-history-summary" }, [
7253
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('common.history')), 1 /* TEXT */),
7254
+ _createElementVNode("button", {
7255
+ type: "button",
7256
+ class: "btn-mini prompt-history-close",
7257
+ onClick: _ctx.closeSysHistory,
7258
+ title: _ctx.t('common.close')
7259
+ }, "✕", 8 /* PROPS */, ["onClick", "title"])
7260
+ ]),
7261
+ _createElementVNode("div", { class: "prompt-history-body" }, [
7262
+ (!_ctx.sysHistoryLoading && !_ctx.sysHistoryError && _ctx.sysHistoryItems.length)
7263
+ ? (_openBlock(), _createElementBlock("ul", {
7264
+ key: 0,
7265
+ class: "prompt-history-list"
7266
+ }, [
7267
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sysHistoryItems, (item) => {
7268
+ return (_openBlock(), _createElementBlock("li", {
7269
+ key: item.id,
7270
+ class: _normalizeClass(['prompt-history-item', { active: _ctx.sysHistoryPreviewId === item.id }]),
7271
+ onClick: $event => (_ctx.viewSysHistoryItem(item))
7272
+ }, [
7273
+ _createElementVNode("span", { class: "prompt-history-time" }, _toDisplayString(item.id), 1 /* TEXT */),
7274
+ _createElementVNode("span", { class: "prompt-history-size" }, _toDisplayString(Math.round(item.size / 1024 * 10) / 10) + " KB", 1 /* TEXT */)
7275
+ ], 10 /* CLASS, PROPS */, ["onClick"]))
7276
+ }), 128 /* KEYED_FRAGMENT */))
7277
+ ]))
7278
+ : _createCommentVNode("v-if", true),
7279
+ (_ctx.sysHistoryLoading)
7280
+ ? (_openBlock(), _createElementBlock("div", {
7281
+ key: 1,
7282
+ class: "state-message"
7283
+ }, _toDisplayString(_ctx.t('diff.generating')), 1 /* TEXT */))
7284
+ : (_ctx.sysHistoryError)
7285
+ ? (_openBlock(), _createElementBlock("div", {
7286
+ key: 2,
7287
+ class: "state-message error"
7288
+ }, _toDisplayString(_ctx.sysHistoryError), 1 /* TEXT */))
7289
+ : (!_ctx.sysHistoryItems.length)
7290
+ ? (_openBlock(), _createElementBlock("div", {
7291
+ key: 3,
7292
+ class: "state-message"
7293
+ }, _toDisplayString(_ctx.t('toast.history.empty')), 1 /* TEXT */))
7294
+ : _createCommentVNode("v-if", true),
7295
+ (_ctx.sysHistoryPreviewContent)
7296
+ ? (_openBlock(), _createElementBlock("div", {
7297
+ key: 4,
7298
+ class: "prompt-history-preview-wrap"
7299
+ }, [
7300
+ _createElementVNode("pre", { class: "prompt-history-preview" }, _toDisplayString(_ctx.sysHistoryPreviewContent), 1 /* TEXT */),
7301
+ _createElementVNode("button", {
7302
+ type: "button",
7303
+ class: "btn-mini btn-confirm-mini",
7304
+ onClick: _ctx.applySysHistoryToEditor,
7305
+ disabled: _ctx.sysPromptSaving || _ctx.sysPromptDiffVisible
7306
+ }, _toDisplayString(_ctx.t('common.restoreToEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
7307
+ ]))
7308
+ : _createCommentVNode("v-if", true)
7309
+ ])
7310
+ ]))
7311
+ : _createCommentVNode("v-if", true),
6463
7312
  _createElementVNode("div", { class: "form-group" }, [
6464
7313
  (_ctx.sysPromptDiffVisible)
6465
7314
  ? (_openBlock(), _createElementBlock("div", { key: 0 }, [