codexmate 0.1.10 → 0.1.12

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 (32) hide show
  1. package/README.md +0 -4
  2. package/README.vi.md +0 -4
  3. package/README.zh.md +0 -4
  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 +23 -1
  8. package/package.json +1 -1
  9. package/web-ui/app.js +15 -0
  10. package/web-ui/modules/app.methods.agents.mjs +90 -0
  11. package/web-ui/modules/app.methods.navigation.mjs +7 -1
  12. package/web-ui/modules/app.methods.session-actions.mjs +57 -0
  13. package/web-ui/modules/app.methods.system-prompt.mjs +81 -0
  14. package/web-ui/modules/app.methods.web-ui-preferences.mjs +6 -0
  15. package/web-ui/modules/i18n/locales/en.mjs +9 -0
  16. package/web-ui/modules/i18n/locales/ja.mjs +9 -0
  17. package/web-ui/modules/i18n/locales/vi.mjs +9 -0
  18. package/web-ui/modules/i18n/locales/zh-tw.mjs +9 -0
  19. package/web-ui/modules/i18n/locales/zh.mjs +9 -0
  20. package/web-ui/partials/index/layout-header.html +5 -0
  21. package/web-ui/partials/index/panel-config-claude.html +3 -3
  22. package/web-ui/partials/index/panel-config-codex.html +3 -3
  23. package/web-ui/partials/index/panel-config-kilocode.html +5 -5
  24. package/web-ui/partials/index/panel-config-openclaw.html +3 -3
  25. package/web-ui/partials/index/panel-config-opencode.html +5 -5
  26. package/web-ui/partials/index/panel-prompts.html +52 -0
  27. package/web-ui/partials/index/panel-sessions.html +12 -0
  28. package/web-ui/partials/index/panel-settings.html +35 -0
  29. package/web-ui/res/web-ui-render.precompiled.js +517 -186
  30. package/web-ui/styles/modals-core.css +86 -0
  31. package/web-ui/styles/sessions-preview.css +38 -0
  32. package/web-ui/styles/titles-cards.css +2 -2
@@ -264,96 +264,111 @@ 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)
357
372
  ], 8 /* PROPS */, ["aria-label"]),
358
373
  _createElementVNode("div", {
359
374
  class: "side-section",
@@ -987,21 +1002,30 @@ return function render(_ctx, _cache) {
987
1002
  key: 0,
988
1003
  class: "segmented-control"
989
1004
  }, [
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"])
1005
+ (_ctx.isConfigModeVisible('codex'))
1006
+ ? (_openBlock(), _createElementBlock("button", {
1007
+ key: 0,
1008
+ type: "button",
1009
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
1010
+ onClick: $event => (_ctx.switchConfigMode('codex'))
1011
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1012
+ : _createCommentVNode("v-if", true),
1013
+ (_ctx.isConfigModeVisible('claude'))
1014
+ ? (_openBlock(), _createElementBlock("button", {
1015
+ key: 1,
1016
+ type: "button",
1017
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
1018
+ onClick: $event => (_ctx.switchConfigMode('claude'))
1019
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1020
+ : _createCommentVNode("v-if", true),
1021
+ (_ctx.isConfigModeVisible('openclaw'))
1022
+ ? (_openBlock(), _createElementBlock("button", {
1023
+ key: 2,
1024
+ type: "button",
1025
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
1026
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
1027
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1028
+ : _createCommentVNode("v-if", true)
1005
1029
  ]))
1006
1030
  : _createCommentVNode("v-if", true),
1007
1031
  (_ctx.isCodexConfigMode && _ctx.shouldShowCliInstallPlaceholder('codex'))
@@ -1603,21 +1627,30 @@ return function render(_ctx, _cache) {
1603
1627
  key: 0,
1604
1628
  class: "segmented-control"
1605
1629
  }, [
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"])
1630
+ (_ctx.isConfigModeVisible('codex'))
1631
+ ? (_openBlock(), _createElementBlock("button", {
1632
+ key: 0,
1633
+ type: "button",
1634
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
1635
+ onClick: $event => (_ctx.switchConfigMode('codex'))
1636
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1637
+ : _createCommentVNode("v-if", true),
1638
+ (_ctx.isConfigModeVisible('claude'))
1639
+ ? (_openBlock(), _createElementBlock("button", {
1640
+ key: 1,
1641
+ type: "button",
1642
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
1643
+ onClick: $event => (_ctx.switchConfigMode('claude'))
1644
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1645
+ : _createCommentVNode("v-if", true),
1646
+ (_ctx.isConfigModeVisible('openclaw'))
1647
+ ? (_openBlock(), _createElementBlock("button", {
1648
+ key: 2,
1649
+ type: "button",
1650
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
1651
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
1652
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
1653
+ : _createCommentVNode("v-if", true)
1621
1654
  ]))
1622
1655
  : _createCommentVNode("v-if", true),
1623
1656
  (_ctx.shouldShowCliInstallPlaceholder('claude'))
@@ -2131,21 +2164,30 @@ return function render(_ctx, _cache) {
2131
2164
  key: 0,
2132
2165
  class: "segmented-control"
2133
2166
  }, [
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"])
2167
+ (_ctx.isConfigModeVisible('codex'))
2168
+ ? (_openBlock(), _createElementBlock("button", {
2169
+ key: 0,
2170
+ type: "button",
2171
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2172
+ onClick: $event => (_ctx.switchConfigMode('codex'))
2173
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2174
+ : _createCommentVNode("v-if", true),
2175
+ (_ctx.isConfigModeVisible('claude'))
2176
+ ? (_openBlock(), _createElementBlock("button", {
2177
+ key: 1,
2178
+ type: "button",
2179
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2180
+ onClick: $event => (_ctx.switchConfigMode('claude'))
2181
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2182
+ : _createCommentVNode("v-if", true),
2183
+ (_ctx.isConfigModeVisible('openclaw'))
2184
+ ? (_openBlock(), _createElementBlock("button", {
2185
+ key: 2,
2186
+ type: "button",
2187
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2188
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
2189
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2190
+ : _createCommentVNode("v-if", true)
2149
2191
  ]))
2150
2192
  : _createCommentVNode("v-if", true),
2151
2193
  _createElementVNode("div", { class: "openclaw-layout" }, [
@@ -2377,31 +2419,46 @@ return function render(_ctx, _cache) {
2377
2419
  key: 0,
2378
2420
  class: "segmented-control"
2379
2421
  }, [
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"])
2422
+ (_ctx.isConfigModeVisible('codex'))
2423
+ ? (_openBlock(), _createElementBlock("button", {
2424
+ key: 0,
2425
+ type: "button",
2426
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2427
+ onClick: $event => (_ctx.switchConfigMode('codex'))
2428
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2429
+ : _createCommentVNode("v-if", true),
2430
+ (_ctx.isConfigModeVisible('claude'))
2431
+ ? (_openBlock(), _createElementBlock("button", {
2432
+ key: 1,
2433
+ type: "button",
2434
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2435
+ onClick: $event => (_ctx.switchConfigMode('claude'))
2436
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2437
+ : _createCommentVNode("v-if", true),
2438
+ (_ctx.isConfigModeVisible('openclaw'))
2439
+ ? (_openBlock(), _createElementBlock("button", {
2440
+ key: 2,
2441
+ type: "button",
2442
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2443
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
2444
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2445
+ : _createCommentVNode("v-if", true),
2446
+ (_ctx.isConfigModeVisible('opencode'))
2447
+ ? (_openBlock(), _createElementBlock("button", {
2448
+ key: 3,
2449
+ type: "button",
2450
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2451
+ onClick: $event => (_ctx.switchConfigMode('opencode'))
2452
+ }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2453
+ : _createCommentVNode("v-if", true),
2454
+ (_ctx.isConfigModeVisible('kilocode'))
2455
+ ? (_openBlock(), _createElementBlock("button", {
2456
+ key: 4,
2457
+ type: "button",
2458
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
2459
+ onClick: $event => (_ctx.switchConfigMode('kilocode'))
2460
+ }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2461
+ : _createCommentVNode("v-if", true)
2405
2462
  ]))
2406
2463
  : _createCommentVNode("v-if", true),
2407
2464
  _createElementVNode("section", {
@@ -2770,31 +2827,46 @@ return function render(_ctx, _cache) {
2770
2827
  key: 0,
2771
2828
  class: "segmented-control"
2772
2829
  }, [
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"])
2830
+ (_ctx.isConfigModeVisible('codex'))
2831
+ ? (_openBlock(), _createElementBlock("button", {
2832
+ key: 0,
2833
+ type: "button",
2834
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'codex' }]),
2835
+ onClick: $event => (_ctx.switchConfigMode('codex'))
2836
+ }, _toDisplayString(_ctx.t('tab.config.codex')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2837
+ : _createCommentVNode("v-if", true),
2838
+ (_ctx.isConfigModeVisible('claude'))
2839
+ ? (_openBlock(), _createElementBlock("button", {
2840
+ key: 1,
2841
+ type: "button",
2842
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'claude' }]),
2843
+ onClick: $event => (_ctx.switchConfigMode('claude'))
2844
+ }, _toDisplayString(_ctx.t('tab.config.claude')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2845
+ : _createCommentVNode("v-if", true),
2846
+ (_ctx.isConfigModeVisible('openclaw'))
2847
+ ? (_openBlock(), _createElementBlock("button", {
2848
+ key: 2,
2849
+ type: "button",
2850
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'openclaw' }]),
2851
+ onClick: $event => (_ctx.switchConfigMode('openclaw'))
2852
+ }, _toDisplayString(_ctx.t('tab.config.openclaw')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2853
+ : _createCommentVNode("v-if", true),
2854
+ (_ctx.isConfigModeVisible('opencode'))
2855
+ ? (_openBlock(), _createElementBlock("button", {
2856
+ key: 3,
2857
+ type: "button",
2858
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'opencode' }]),
2859
+ onClick: $event => (_ctx.switchConfigMode('opencode'))
2860
+ }, _toDisplayString(_ctx.t('tab.config.opencode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2861
+ : _createCommentVNode("v-if", true),
2862
+ (_ctx.isConfigModeVisible('kilocode'))
2863
+ ? (_openBlock(), _createElementBlock("button", {
2864
+ key: 4,
2865
+ type: "button",
2866
+ class: _normalizeClass(['segment', { active: _ctx.configMode === 'kilocode' }]),
2867
+ onClick: $event => (_ctx.switchConfigMode('kilocode'))
2868
+ }, _toDisplayString(_ctx.t('tab.config.kilocode')), 11 /* TEXT, CLASS, PROPS */, ["onClick"]))
2869
+ : _createCommentVNode("v-if", true)
2798
2870
  ]))
2799
2871
  : _createCommentVNode("v-if", true),
2800
2872
  _createElementVNode("section", {
@@ -3812,7 +3884,33 @@ return function render(_ctx, _cache) {
3812
3884
  _createElementVNode("div", {
3813
3885
  class: "session-msg-content",
3814
3886
  innerHTML: _ctx.highlightQueryText(msg.text) || ''
3815
- }, null, 8 /* PROPS */, ["innerHTML"])
3887
+ }, null, 8 /* PROPS */, ["innerHTML"]),
3888
+ (msg.normalizedRole === 'user')
3889
+ ? (_openBlock(), _createElementBlock("button", {
3890
+ key: 0,
3891
+ type: "button",
3892
+ class: "session-msg-copy",
3893
+ onClick: $event => (_ctx.copySessionMessage(msg)),
3894
+ "aria-label": _ctx.t('sessions.preview.copyMessage'),
3895
+ title: _ctx.t('sessions.preview.copyMessage')
3896
+ }, [
3897
+ (_openBlock(), _createElementBlock("svg", {
3898
+ viewBox: "0 0 24 24",
3899
+ fill: "none",
3900
+ stroke: "currentColor",
3901
+ "stroke-width": "2"
3902
+ }, [
3903
+ _createElementVNode("rect", {
3904
+ x: "8",
3905
+ y: "8",
3906
+ width: "12",
3907
+ height: "12",
3908
+ rx: "2"
3909
+ }),
3910
+ _createElementVNode("path", { d: "M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2" })
3911
+ ]))
3912
+ ], 8 /* PROPS */, ["onClick", "aria-label", "title"]))
3913
+ : _createCommentVNode("v-if", true)
3816
3914
  ], 10 /* CLASS, PROPS */, ["data-message-key"]))
3817
3915
  _item.memo = _memo
3818
3916
  return _item
@@ -4710,6 +4808,73 @@ return function render(_ctx, _cache) {
4710
4808
  _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.timeline.style.hint')), 1 /* TEXT */)
4711
4809
  ])
4712
4810
  ])
4811
+ ], 8 /* PROPS */, ["aria-label"]),
4812
+ _createElementVNode("section", {
4813
+ class: "settings-card",
4814
+ "aria-label": _ctx.t('settings.configTabs.title')
4815
+ }, [
4816
+ _createElementVNode("div", { class: "settings-card-main" }, [
4817
+ _createElementVNode("div", { class: "settings-card-content" }, [
4818
+ _createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.configTabs.title')), 1 /* TEXT */),
4819
+ _createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.configTabs.meta')), 1 /* TEXT */),
4820
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
4821
+ _createElementVNode("input", {
4822
+ type: "checkbox",
4823
+ checked: _ctx.configModeVisibility.codex,
4824
+ onChange: $event => (_ctx.setConfigModeVisibility('codex', $event.target.checked))
4825
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
4826
+ _createElementVNode("span", { class: "toggle-track" }, [
4827
+ _createElementVNode("span", { class: "toggle-thumb" })
4828
+ ]),
4829
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.codex')), 1 /* TEXT */)
4830
+ ]),
4831
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
4832
+ _createElementVNode("input", {
4833
+ type: "checkbox",
4834
+ checked: _ctx.configModeVisibility.claude,
4835
+ onChange: $event => (_ctx.setConfigModeVisibility('claude', $event.target.checked))
4836
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
4837
+ _createElementVNode("span", { class: "toggle-track" }, [
4838
+ _createElementVNode("span", { class: "toggle-thumb" })
4839
+ ]),
4840
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.claude')), 1 /* TEXT */)
4841
+ ]),
4842
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
4843
+ _createElementVNode("input", {
4844
+ type: "checkbox",
4845
+ checked: _ctx.configModeVisibility.openclaw,
4846
+ onChange: $event => (_ctx.setConfigModeVisibility('openclaw', $event.target.checked))
4847
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
4848
+ _createElementVNode("span", { class: "toggle-track" }, [
4849
+ _createElementVNode("span", { class: "toggle-thumb" })
4850
+ ]),
4851
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.openclaw')), 1 /* TEXT */)
4852
+ ]),
4853
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
4854
+ _createElementVNode("input", {
4855
+ type: "checkbox",
4856
+ checked: _ctx.configModeVisibility.opencode,
4857
+ onChange: $event => (_ctx.setConfigModeVisibility('opencode', $event.target.checked))
4858
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
4859
+ _createElementVNode("span", { class: "toggle-track" }, [
4860
+ _createElementVNode("span", { class: "toggle-thumb" })
4861
+ ]),
4862
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.opencode')), 1 /* TEXT */)
4863
+ ]),
4864
+ _createElementVNode("label", { class: "settings-toggle-row" }, [
4865
+ _createElementVNode("input", {
4866
+ type: "checkbox",
4867
+ checked: _ctx.configModeVisibility.kilocode,
4868
+ onChange: $event => (_ctx.setConfigModeVisibility('kilocode', $event.target.checked))
4869
+ }, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
4870
+ _createElementVNode("span", { class: "toggle-track" }, [
4871
+ _createElementVNode("span", { class: "toggle-thumb" })
4872
+ ]),
4873
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('tab.config.kilocode')), 1 /* TEXT */)
4874
+ ]),
4875
+ _createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.configTabs.hint')), 1 /* TEXT */)
4876
+ ])
4877
+ ])
4713
4878
  ], 8 /* PROPS */, ["aria-label"])
4714
4879
  ])
4715
4880
  ], 512 /* NEED_PATCH */), [
@@ -6035,6 +6200,23 @@ return function render(_ctx, _cache) {
6035
6200
  }),
6036
6201
  _createElementVNode("path", { d: "M16 4h2a2 2 0 012 2v14a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2h2" })
6037
6202
  ]))
6203
+ ], 8 /* PROPS */, ["onClick", "disabled", "title"]),
6204
+ _createElementVNode("button", {
6205
+ class: "btn-mini",
6206
+ onClick: _ctx.openPromptHistory,
6207
+ disabled: _ctx.agentsSaving || _ctx.agentsDiffVisible,
6208
+ title: _ctx.t('common.history')
6209
+ }, [
6210
+ (_openBlock(), _createElementBlock("svg", {
6211
+ class: "btn-icon-sm",
6212
+ viewBox: "0 0 24 24",
6213
+ fill: "none",
6214
+ stroke: "currentColor",
6215
+ "stroke-width": "2"
6216
+ }, [
6217
+ _createElementVNode("path", { d: "M12 8v4l3 2" }),
6218
+ _createElementVNode("path", { d: "M3 12a9 9 0 1 0 9-9 9 9 0 0 0-7.5 4M3 4v4h4" })
6219
+ ]))
6038
6220
  ], 8 /* PROPS */, ["onClick", "disabled", "title"])
6039
6221
  ]),
6040
6222
  _createElementVNode("div", { class: "prompts-editor-group prompts-editor-group--workflow" }, [
@@ -6109,6 +6291,72 @@ return function render(_ctx, _cache) {
6109
6291
  ])
6110
6292
  ])
6111
6293
  ]),
6294
+ (_ctx.promptHistoryVisible)
6295
+ ? (_openBlock(), _createElementBlock("details", {
6296
+ key: 0,
6297
+ class: "prompt-history-panel",
6298
+ open: ""
6299
+ }, [
6300
+ _createElementVNode("summary", { class: "prompt-history-summary" }, [
6301
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('common.history')), 1 /* TEXT */),
6302
+ _createElementVNode("button", {
6303
+ type: "button",
6304
+ class: "btn-mini prompt-history-close",
6305
+ onClick: _ctx.closePromptHistory,
6306
+ title: _ctx.t('common.close')
6307
+ }, "✕", 8 /* PROPS */, ["onClick", "title"])
6308
+ ]),
6309
+ _createElementVNode("div", { class: "prompt-history-body" }, [
6310
+ (!_ctx.promptHistoryLoading && !_ctx.promptHistoryError && _ctx.promptHistoryItems.length)
6311
+ ? (_openBlock(), _createElementBlock("ul", {
6312
+ key: 0,
6313
+ class: "prompt-history-list"
6314
+ }, [
6315
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.promptHistoryItems, (item) => {
6316
+ return (_openBlock(), _createElementBlock("li", {
6317
+ key: item.id,
6318
+ class: _normalizeClass(['prompt-history-item', { active: _ctx.promptHistoryPreviewId === item.id }]),
6319
+ onClick: $event => (_ctx.viewPromptHistoryItem(item))
6320
+ }, [
6321
+ _createElementVNode("span", { class: "prompt-history-time" }, _toDisplayString(item.id), 1 /* TEXT */),
6322
+ _createElementVNode("span", { class: "prompt-history-size" }, _toDisplayString(Math.round(item.size / 1024 * 10) / 10) + " KB", 1 /* TEXT */)
6323
+ ], 10 /* CLASS, PROPS */, ["onClick"]))
6324
+ }), 128 /* KEYED_FRAGMENT */))
6325
+ ]))
6326
+ : _createCommentVNode("v-if", true),
6327
+ (_ctx.promptHistoryLoading)
6328
+ ? (_openBlock(), _createElementBlock("div", {
6329
+ key: 1,
6330
+ class: "state-message"
6331
+ }, _toDisplayString(_ctx.t('diff.generating')), 1 /* TEXT */))
6332
+ : (_ctx.promptHistoryError)
6333
+ ? (_openBlock(), _createElementBlock("div", {
6334
+ key: 2,
6335
+ class: "state-message error"
6336
+ }, _toDisplayString(_ctx.promptHistoryError), 1 /* TEXT */))
6337
+ : (!_ctx.promptHistoryItems.length)
6338
+ ? (_openBlock(), _createElementBlock("div", {
6339
+ key: 3,
6340
+ class: "state-message"
6341
+ }, _toDisplayString(_ctx.t('toast.history.empty')), 1 /* TEXT */))
6342
+ : _createCommentVNode("v-if", true),
6343
+ (_ctx.promptHistoryPreviewContent)
6344
+ ? (_openBlock(), _createElementBlock("div", {
6345
+ key: 4,
6346
+ class: "prompt-history-preview-wrap"
6347
+ }, [
6348
+ _createElementVNode("pre", { class: "prompt-history-preview" }, _toDisplayString(_ctx.promptHistoryPreviewContent), 1 /* TEXT */),
6349
+ _createElementVNode("button", {
6350
+ type: "button",
6351
+ class: "btn-mini btn-confirm-mini",
6352
+ onClick: _ctx.applyPromptHistoryToEditor,
6353
+ disabled: _ctx.agentsSaving || _ctx.agentsDiffVisible
6354
+ }, _toDisplayString(_ctx.t('common.restoreToEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
6355
+ ]))
6356
+ : _createCommentVNode("v-if", true)
6357
+ ])
6358
+ ]))
6359
+ : _createCommentVNode("v-if", true),
6112
6360
  _createElementVNode("div", { class: "prompt-presets-inline-row" }, [
6113
6361
  _createElementVNode("div", { class: "prompt-presets-inline-group" }, [
6114
6362
  _createElementVNode("label", { class: "prompt-presets-inline-label" }, _toDisplayString(_ctx.t('prompts.presets.title')), 1 /* TEXT */),
@@ -6386,6 +6634,23 @@ return function render(_ctx, _cache) {
6386
6634
  }),
6387
6635
  _createElementVNode("path", { d: "M16 4h2a2 2 0 012 2v14a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2h2" })
6388
6636
  ]))
6637
+ ], 8 /* PROPS */, ["onClick", "disabled", "title"]),
6638
+ _createElementVNode("button", {
6639
+ class: "btn-mini",
6640
+ onClick: _ctx.openSysHistory,
6641
+ disabled: _ctx.sysPromptSaving || _ctx.sysPromptDiffVisible,
6642
+ title: _ctx.t('common.history')
6643
+ }, [
6644
+ (_openBlock(), _createElementBlock("svg", {
6645
+ class: "btn-icon-sm",
6646
+ viewBox: "0 0 24 24",
6647
+ fill: "none",
6648
+ stroke: "currentColor",
6649
+ "stroke-width": "2"
6650
+ }, [
6651
+ _createElementVNode("path", { d: "M12 8v4l3 2" }),
6652
+ _createElementVNode("path", { d: "M3 12a9 9 0 1 0 9-9 9 9 0 0 0-7.5 4M3 4v4h4" })
6653
+ ]))
6389
6654
  ], 8 /* PROPS */, ["onClick", "disabled", "title"])
6390
6655
  ]),
6391
6656
  _createElementVNode("div", { class: "prompts-editor-group prompts-editor-group--workflow" }, [
@@ -6460,6 +6725,72 @@ return function render(_ctx, _cache) {
6460
6725
  ])
6461
6726
  ])
6462
6727
  ]),
6728
+ (_ctx.sysHistoryVisible)
6729
+ ? (_openBlock(), _createElementBlock("details", {
6730
+ key: 0,
6731
+ class: "prompt-history-panel",
6732
+ open: ""
6733
+ }, [
6734
+ _createElementVNode("summary", { class: "prompt-history-summary" }, [
6735
+ _createElementVNode("span", null, _toDisplayString(_ctx.t('common.history')), 1 /* TEXT */),
6736
+ _createElementVNode("button", {
6737
+ type: "button",
6738
+ class: "btn-mini prompt-history-close",
6739
+ onClick: _ctx.closeSysHistory,
6740
+ title: _ctx.t('common.close')
6741
+ }, "✕", 8 /* PROPS */, ["onClick", "title"])
6742
+ ]),
6743
+ _createElementVNode("div", { class: "prompt-history-body" }, [
6744
+ (!_ctx.sysHistoryLoading && !_ctx.sysHistoryError && _ctx.sysHistoryItems.length)
6745
+ ? (_openBlock(), _createElementBlock("ul", {
6746
+ key: 0,
6747
+ class: "prompt-history-list"
6748
+ }, [
6749
+ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.sysHistoryItems, (item) => {
6750
+ return (_openBlock(), _createElementBlock("li", {
6751
+ key: item.id,
6752
+ class: _normalizeClass(['prompt-history-item', { active: _ctx.sysHistoryPreviewId === item.id }]),
6753
+ onClick: $event => (_ctx.viewSysHistoryItem(item))
6754
+ }, [
6755
+ _createElementVNode("span", { class: "prompt-history-time" }, _toDisplayString(item.id), 1 /* TEXT */),
6756
+ _createElementVNode("span", { class: "prompt-history-size" }, _toDisplayString(Math.round(item.size / 1024 * 10) / 10) + " KB", 1 /* TEXT */)
6757
+ ], 10 /* CLASS, PROPS */, ["onClick"]))
6758
+ }), 128 /* KEYED_FRAGMENT */))
6759
+ ]))
6760
+ : _createCommentVNode("v-if", true),
6761
+ (_ctx.sysHistoryLoading)
6762
+ ? (_openBlock(), _createElementBlock("div", {
6763
+ key: 1,
6764
+ class: "state-message"
6765
+ }, _toDisplayString(_ctx.t('diff.generating')), 1 /* TEXT */))
6766
+ : (_ctx.sysHistoryError)
6767
+ ? (_openBlock(), _createElementBlock("div", {
6768
+ key: 2,
6769
+ class: "state-message error"
6770
+ }, _toDisplayString(_ctx.sysHistoryError), 1 /* TEXT */))
6771
+ : (!_ctx.sysHistoryItems.length)
6772
+ ? (_openBlock(), _createElementBlock("div", {
6773
+ key: 3,
6774
+ class: "state-message"
6775
+ }, _toDisplayString(_ctx.t('toast.history.empty')), 1 /* TEXT */))
6776
+ : _createCommentVNode("v-if", true),
6777
+ (_ctx.sysHistoryPreviewContent)
6778
+ ? (_openBlock(), _createElementBlock("div", {
6779
+ key: 4,
6780
+ class: "prompt-history-preview-wrap"
6781
+ }, [
6782
+ _createElementVNode("pre", { class: "prompt-history-preview" }, _toDisplayString(_ctx.sysHistoryPreviewContent), 1 /* TEXT */),
6783
+ _createElementVNode("button", {
6784
+ type: "button",
6785
+ class: "btn-mini btn-confirm-mini",
6786
+ onClick: _ctx.applySysHistoryToEditor,
6787
+ disabled: _ctx.sysPromptSaving || _ctx.sysPromptDiffVisible
6788
+ }, _toDisplayString(_ctx.t('common.restoreToEditor')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
6789
+ ]))
6790
+ : _createCommentVNode("v-if", true)
6791
+ ])
6792
+ ]))
6793
+ : _createCommentVNode("v-if", true),
6463
6794
  _createElementVNode("div", { class: "form-group" }, [
6464
6795
  (_ctx.sysPromptDiffVisible)
6465
6796
  ? (_openBlock(), _createElementBlock("div", { key: 0 }, [