codexmate 0.1.6 → 0.1.7
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.
- package/README.md +3 -1
- package/README.vi.md +6 -3
- package/README.zh.md +6 -3
- package/package.json +1 -1
- package/skills/{codexmate-project-context-recovery → context-recovery}/SKILL.md +2 -2
- package/web-ui/modules/app.methods.session-actions.mjs +27 -0
- package/web-ui/modules/app.methods.session-trash.mjs +5 -0
- package/web-ui/modules/i18n/locales/en.mjs +18 -0
- package/web-ui/modules/i18n/locales/ja.mjs +32 -0
- package/web-ui/modules/i18n/locales/vi.mjs +16 -0
- package/web-ui/modules/i18n/locales/zh-tw.mjs +16 -0
- package/web-ui/modules/i18n/locales/zh.mjs +16 -0
- package/web-ui/partials/index/panel-settings.html +0 -23
- package/web-ui/partials/index/panel-trash.html +36 -1
- package/web-ui/res/web-ui-render.precompiled.js +196 -171
- package/web-ui/session-helpers.mjs +9 -0
- package/web-ui/styles/sessions-list.css +5 -0
- package/web-ui/styles/trash-panel.css +9 -0
- /package/skills/{codexmate-project-context-recovery → context-recovery}/scripts/search_sessions.py +0 -0
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# Codex Mate
|
|
6
6
|
|
|
7
|
-
**One dashboard for all your local AI coding agents. Switch providers, manage sessions, and orchestrate tasks across Codex, Claude Code, OpenCode, KiloCode, and OpenClaw. Zero cloud, local-first control plane.**
|
|
7
|
+
**One dashboard for all your local AI coding agents. Switch providers, manage sessions, and orchestrate tasks across Codex, Claude Code, Gemini CLI, CodeBuddy Code, Pi, OpenCode, KiloCode, and OpenClaw. Zero cloud, local-first control plane.**
|
|
8
8
|
|
|
9
9
|
<p>
|
|
10
10
|
<a href="https://sakurabytecore.github.io/codexmate/">[Documentation]</a>
|
|
@@ -132,6 +132,8 @@ curl -fsSL https://raw.githubusercontent.com/SakuraByteCore/codexmate/main/scrip
|
|
|
132
132
|
- **CodeBuddy**: `npm install -g @tencent-ai/codebuddy-code`
|
|
133
133
|
- **KiloCode**: `npm install -g @kilocode/cli` (`kilo` / `kilocode`)
|
|
134
134
|
- **OpenCode**: install from the [official OpenCode docs](https://opencode.ai/)
|
|
135
|
+
- **OpenClaw**: see the [OpenClaw repository](https://github.com/moeru-ai/openclaw)
|
|
136
|
+
- **Pi**: sessions are discovered from `~/.pi/agent/sessions`
|
|
135
137
|
|
|
136
138
|
---
|
|
137
139
|
|
package/README.vi.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# Codex Mate
|
|
6
6
|
|
|
7
|
-
**Một dashboard duy nhất cho tất cả AI coding agent cục bộ của bạn. Chuyển đổi provider, quản lý phiên làm việc và điều phối tác vụ giữa Codex, Claude Code và OpenClaw. Không cloud, trung tâm điều khiển agent hoàn toàn cục bộ.**
|
|
7
|
+
**Một dashboard duy nhất cho tất cả AI coding agent cục bộ của bạn. Chuyển đổi provider, quản lý phiên làm việc và điều phối tác vụ giữa Codex, Claude Code, Gemini CLI, CodeBuddy Code, Pi, OpenCode, KiloCode và OpenClaw. Không cloud, trung tâm điều khiển agent hoàn toàn cục bộ.**
|
|
8
8
|
|
|
9
9
|
<p>
|
|
10
10
|
<a href="https://sakurabytecore.github.io/codexmate/">[Tài liệu]</a>
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
Bạn có bao giờ cảm thấy rối khi phải quản lý nhiều AI agent cục bộ? Mỗi tool lại có định dạng cấu hình, nơi lưu phiên và thư mục skill riêng.
|
|
43
43
|
|
|
44
|
-
**Codex Mate** cung cấp một trung tâm điều khiển thống nhất để giải quyết sự hỗn loạn đó. Đây là CLI + Web UI ưu tiên cục bộ, được thiết kế để quản lý [Codex](https://github.com/openai/codex), [Claude Code](https://github.com/anthropic-ai/claude-code) và [OpenClaw](https://github.com/moeru-ai/openclaw) một cách liền mạch.
|
|
44
|
+
**Codex Mate** cung cấp một trung tâm điều khiển thống nhất để giải quyết sự hỗn loạn đó. Đây là CLI + Web UI ưu tiên cục bộ, được thiết kế để quản lý [Codex](https://github.com/openai/codex), [Claude Code](https://github.com/anthropic-ai/claude-code), [OpenCode](https://opencode.ai/), KiloCode và [OpenClaw](https://github.com/moeru-ai/openclaw) một cách liền mạch.
|
|
45
45
|
|
|
46
46
|
### Điểm nổi bật
|
|
47
47
|
|
|
@@ -58,7 +58,7 @@ Khác với các wrapper đơn giản, Codex Mate hoạt động như một **Ag
|
|
|
58
58
|
|
|
59
59
|
| Tính năng | Trạng thái | Mô tả |
|
|
60
60
|
| --- | --- | --- |
|
|
61
|
-
| **Quản lý Provider** | ✅ | Chuyển đổi provider/model cho Codex, Claude và OpenClaw |
|
|
61
|
+
| **Quản lý Provider** | ✅ | Chuyển đổi provider/model cho Codex, Claude, OpenCode, KiloCode và OpenClaw |
|
|
62
62
|
| **Đồng bộ Agent trực tiếp** | ✅ | Giám sát cấu hình & trạng thái Codex/Claude theo thời gian thực |
|
|
63
63
|
| **Trình duyệt phiên** | ✅ | Liệt kê, xem trước, lọc và xuất phiên (Codex/Claude/Gemini/CodeBuddy/Pi) |
|
|
64
64
|
| **Phân tích sử dụng** | ✅ | Trực quan hóa xu hướng tin nhắn và dự án nổi bật |
|
|
@@ -115,7 +115,10 @@ curl -fsSL https://raw.githubusercontent.com/SakuraByteCore/codexmate/main/scrip
|
|
|
115
115
|
- **Claude Code**: `npm install -g @anthropic-ai/claude-code`
|
|
116
116
|
- **Gemini CLI**: `npm install -g @google/gemini-cli`
|
|
117
117
|
- **CodeBuddy**: `npm install -g @tencent-ai/codebuddy-code`
|
|
118
|
+
- **KiloCode**: `npm install -g @kilocode/cli` (`kilo` / `kilocode`)
|
|
118
119
|
- **OpenCode**: xem [tài liệu chính thức OpenCode](https://opencode.ai/)
|
|
120
|
+
- **OpenClaw**: xem [kho lưu trữ OpenClaw](https://github.com/moeru-ai/openclaw)
|
|
121
|
+
- **Pi**: phiên làm việc được phát hiện từ `~/.pi/agent/sessions`
|
|
119
122
|
|
|
120
123
|
---
|
|
121
124
|
|
package/README.zh.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# Codex Mate
|
|
6
6
|
|
|
7
|
-
**一站式本地 AI 编程智能体管理面板。统一管理 Codex、Claude Code、OpenCode 与 OpenClaw,支持 Provider 切换、会话管理与任务编排。纯本地优先,你的智能体控制中心。**
|
|
7
|
+
**一站式本地 AI 编程智能体管理面板。统一管理 Codex、Claude Code、Gemini CLI、CodeBuddy Code、Pi、OpenCode、KiloCode 与 OpenClaw,支持 Provider 切换、会话管理与任务编排。纯本地优先,你的智能体控制中心。**
|
|
8
8
|
|
|
9
9
|
<p>
|
|
10
10
|
<a href="https://sakurabytecore.github.io/codexmate/">[项目文档]</a>
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
|
|
49
49
|
你是否曾因管理多个本地 AI 智能体而感到疲惫?每个工具都有自己的配置格式、会话存储和 Skills 目录。
|
|
50
50
|
|
|
51
|
-
**Codex Mate** 提供了一个统一的控制平面,让混乱重归有序。这是一个本地优先的 CLI + Web UI,旨在无缝管理 [Codex](https://github.com/openai/codex)、[Claude Code](https://github.com/anthropic-ai/claude-code)、[OpenCode](https://opencode.ai/) 和 [OpenClaw](https://github.com/moeru-ai/openclaw)。
|
|
51
|
+
**Codex Mate** 提供了一个统一的控制平面,让混乱重归有序。这是一个本地优先的 CLI + Web UI,旨在无缝管理 [Codex](https://github.com/openai/codex)、[Claude Code](https://github.com/anthropic-ai/claude-code)、[OpenCode](https://opencode.ai/)、KiloCode 和 [OpenClaw](https://github.com/moeru-ai/openclaw)。
|
|
52
52
|
|
|
53
53
|
### 有什么独特之处?
|
|
54
54
|
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
|
|
69
69
|
| 特性 | 状态 | 描述 |
|
|
70
70
|
| --- | --- | --- |
|
|
71
|
-
| **Provider 管理** | ✅ | 切换 Codex、Claude、OpenCode 和 OpenClaw 的 provider/model |
|
|
71
|
+
| **Provider 管理** | ✅ | 切换 Codex、Claude、OpenCode、KiloCode 和 OpenClaw 的 provider/model |
|
|
72
72
|
| **状态实时同步** | ✅ | 实时感知 Codex/Claude 的配置与运行状态变更 |
|
|
73
73
|
| **会话浏览器** | ✅ | 跨 Codex、Claude Code、Gemini CLI、CodeBuddy Code 与 Pi 的本地会话进行检索、预览、筛选与导出 |
|
|
74
74
|
| **Usage 统计** | ✅ | 可视化消息趋势与热门项目统计 |
|
|
@@ -127,7 +127,10 @@ curl -fsSL https://raw.githubusercontent.com/SakuraByteCore/codexmate/main/scrip
|
|
|
127
127
|
- **Claude Code**: `npm install -g @anthropic-ai/claude-code`
|
|
128
128
|
- **Gemini CLI**: `npm install -g @google/gemini-cli`
|
|
129
129
|
- **CodeBuddy**: `npm install -g @tencent-ai/codebuddy-code`
|
|
130
|
+
- **KiloCode**: `npm install -g @kilocode/cli`(`kilo` / `kilocode`)
|
|
130
131
|
- **OpenCode**: 参照 [OpenCode 官方文档](https://opencode.ai/) 安装
|
|
132
|
+
- **OpenClaw**: 参见 [OpenClaw 仓库](https://github.com/moeru-ai/openclaw)
|
|
133
|
+
- **Pi**: 会话从 `~/.pi/agent/sessions` 自动发现
|
|
131
134
|
|
|
132
135
|
---
|
|
133
136
|
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: context-recovery
|
|
3
3
|
description: Recovers project handoff context from local Codex, Claude Code, Gemini, CodeBuddy, and codexmate-derived sessions. Use when the user asks what happened in prior project/PR/branch/file/error work, needs a handoff brief, wants old decisions or validations recovered, or asks to summarize cross-session project activity with evidence.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -13,7 +13,7 @@ Old sessions are historical evidence. Mutable facts such as PR state, CI, releas
|
|
|
13
13
|
|
|
14
14
|
## Quick Start
|
|
15
15
|
|
|
16
|
-
Generate a context brief first. Resolve `scripts/search_sessions.py` relative to this skill directory; after npm installation the full package path is `node_modules/codexmate/skills/
|
|
16
|
+
Generate a context brief first. Resolve `scripts/search_sessions.py` relative to this skill directory; after npm installation the full package path is `node_modules/codexmate/skills/context-recovery/scripts/search_sessions.py`.
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
python3 scripts/search_sessions.py "SakuraByteCore/codexmate feat/task-orchestration-tab" --mode brief --source all --path-filter codexmate --match all --format text --limit 8
|
|
@@ -308,10 +308,37 @@ export function createSessionActionMethods(options = {}) {
|
|
|
308
308
|
|
|
309
309
|
setSessionTrashEnabled(value) {
|
|
310
310
|
const enabled = this.normalizeSessionTrashEnabled(value);
|
|
311
|
+
const changed = this.sessionTrashEnabled !== enabled;
|
|
311
312
|
this.sessionTrashEnabled = enabled;
|
|
312
313
|
if (typeof this.persistWebUiPreferences === 'function') {
|
|
313
314
|
this.persistWebUiPreferences({ sessionTrashEnabled: enabled });
|
|
314
315
|
}
|
|
316
|
+
// 关闭/开启回收站后立即反映当前状态,无需用户手动刷新
|
|
317
|
+
if (changed && typeof this.applySessionTrashEnabledChange === 'function') {
|
|
318
|
+
this.applySessionTrashEnabledChange(enabled);
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
|
|
322
|
+
applySessionTrashEnabledChange(enabled) {
|
|
323
|
+
if (typeof this.invalidateSessionTrashRequests === 'function') {
|
|
324
|
+
this.invalidateSessionTrashRequests();
|
|
325
|
+
}
|
|
326
|
+
if (enabled) {
|
|
327
|
+
// 重新开启:立即拉取最新回收站内容
|
|
328
|
+
if (typeof this.loadSessionTrash === 'function') {
|
|
329
|
+
void this.loadSessionTrash({ forceRefresh: true });
|
|
330
|
+
}
|
|
331
|
+
} else {
|
|
332
|
+
// 关闭回收站:即时清空已展示的列表与计数,避免残留陈旧数据需手动刷新
|
|
333
|
+
this.sessionTrashItems = [];
|
|
334
|
+
this.sessionTrashVisibleCount = 0;
|
|
335
|
+
this.sessionTrashTotalCount = 0;
|
|
336
|
+
this.sessionTrashCountLoadedOnce = false;
|
|
337
|
+
this.sessionTrashLoadedOnce = false;
|
|
338
|
+
this.sessionTrashLastLoadFailed = false;
|
|
339
|
+
this.sessionTrashRestoring = {};
|
|
340
|
+
this.sessionTrashPurging = {};
|
|
341
|
+
}
|
|
315
342
|
},
|
|
316
343
|
|
|
317
344
|
setSessionTimelineStyle(style) {
|
|
@@ -89,6 +89,11 @@ export function createSessionTrashMethods(options = {}) {
|
|
|
89
89
|
},
|
|
90
90
|
|
|
91
91
|
getSessionTrashViewState() {
|
|
92
|
+
const trashEnabled = this.sessionTrashEnabled !== false;
|
|
93
|
+
// 回收站已关闭:即便残留旧列表也只展示已禁用态,不展示陈旧内容
|
|
94
|
+
if (!trashEnabled) {
|
|
95
|
+
return 'disabled';
|
|
96
|
+
}
|
|
92
97
|
if (this.sessionTrashLoading && !this.sessionTrashLoadedOnce) {
|
|
93
98
|
return 'loading';
|
|
94
99
|
}
|
|
@@ -42,6 +42,8 @@ const en = Object.freeze({
|
|
|
42
42
|
'common.refresh': 'Refresh',
|
|
43
43
|
'common.refreshing': 'Refreshing...',
|
|
44
44
|
'common.loading': 'Loading...',
|
|
45
|
+
'common.menu': 'Menu',
|
|
46
|
+
'common.registry': 'Registry',
|
|
45
47
|
'common.saving': 'Saving...',
|
|
46
48
|
'common.sending': 'Sending...',
|
|
47
49
|
'common.scanning': 'Scanning...',
|
|
@@ -68,6 +70,7 @@ const en = Object.freeze({
|
|
|
68
70
|
'common.notConfigured': 'Not configured',
|
|
69
71
|
'common.enabled': 'Enabled',
|
|
70
72
|
'common.disabled': 'Disabled',
|
|
73
|
+
'common.retry': 'Retry',
|
|
71
74
|
'cli.missing.title': '{name} CLI not installed',
|
|
72
75
|
'cli.missing.subtitle': 'Install {name} CLI before using this page.',
|
|
73
76
|
'cli.missing.openDocs': 'Open install guide',
|
|
@@ -89,6 +92,7 @@ const en = Object.freeze({
|
|
|
89
92
|
'field.apiEndpoint': 'API endpoint',
|
|
90
93
|
'field.apiKey': 'API key',
|
|
91
94
|
'field.baseUrl': 'Base URL',
|
|
95
|
+
'field.url': 'URL',
|
|
92
96
|
'field.provider': 'Provider',
|
|
93
97
|
'field.providerName': 'Provider name',
|
|
94
98
|
'field.modelName': 'Model name',
|
|
@@ -459,6 +463,7 @@ const en = Object.freeze({
|
|
|
459
463
|
'toast.templates.builtinNotDuplicable': 'Built-in templates cannot be duplicated',
|
|
460
464
|
'toast.templates.builtinNotDeletable': 'Built-in templates cannot be deleted',
|
|
461
465
|
'toast.operation.success': 'Operation successful',
|
|
466
|
+
'toast.operation.fail': 'Operation failed',
|
|
462
467
|
'toast.load.fail': 'Failed to load file',
|
|
463
468
|
'toast.apply.success': 'Configuration applied',
|
|
464
469
|
'toast.apply.fail': 'Failed to apply configuration',
|
|
@@ -915,6 +920,11 @@ const en = Object.freeze({
|
|
|
915
920
|
'config.template.editFirst': 'Edit template first, then apply.',
|
|
916
921
|
'config.template.bridgeCodexOnly': '{hint} template is editable in Codex mode only.',
|
|
917
922
|
'config.localBridge.enabledCount': '{enabled}/{total} enabled',
|
|
923
|
+
'config.localBridge.poolSettings': 'Pool settings',
|
|
924
|
+
'config.localBridge.poolHint': 'Select candidate providers to join load balancing.',
|
|
925
|
+
'config.localBridge.noProviders': 'No candidate providers available. Add a direct provider first.',
|
|
926
|
+
'config.transformProvider.title': 'Using transform provider',
|
|
927
|
+
'config.providerBridgeHint': '{label} bridge mode',
|
|
918
928
|
'config.template.openEditor': 'Open template editor',
|
|
919
929
|
'modal.configTemplate.title': 'Config template editor (manual confirm)',
|
|
920
930
|
'modal.configTemplate.placeholder': 'Edit config.toml template here',
|
|
@@ -1319,6 +1329,8 @@ const en = Object.freeze({
|
|
|
1319
1329
|
'settings.claude.meta': 'Backup / import ~/.claude',
|
|
1320
1330
|
'settings.codex.title': 'Codex config',
|
|
1321
1331
|
'settings.codex.meta': 'Backup / import ~/.codex',
|
|
1332
|
+
'settings.backup.title': 'Data backup',
|
|
1333
|
+
'settings.backup.meta': 'Export / import Claude and Codex config',
|
|
1322
1334
|
'settings.backup.progress': 'Backing up {percent}%',
|
|
1323
1335
|
'settings.backup.oneClickClaude': 'Backup ~/.claude',
|
|
1324
1336
|
'settings.backup.importClaude': 'Import ~/.claude backup',
|
|
@@ -1384,6 +1396,12 @@ const en = Object.freeze({
|
|
|
1384
1396
|
'settings.trash.retentionLabel': 'Retention days',
|
|
1385
1397
|
'settings.trash.retentionUnit': 'days',
|
|
1386
1398
|
'settings.trash.retentionHint': 'Range 1-365 days, default 30. Expired entries are purged on each trash load.',
|
|
1399
|
+
'settings.trash.count': '{count} item(s)',
|
|
1400
|
+
'settings.trash.retentionShort': 'Kept {days} days',
|
|
1401
|
+
'settings.trash.disabled': 'Trash is disabled',
|
|
1402
|
+
'settings.trash.disabledHint': 'Deleted sessions are permanently removed and no longer move to trash.',
|
|
1403
|
+
'settings.trash.clearShort': 'Clear',
|
|
1404
|
+
'settings.trash.loadMoreItems': 'Load more (remaining {count})',
|
|
1387
1405
|
|
|
1388
1406
|
'settings.webhook.title': 'Webhook',
|
|
1389
1407
|
'settings.webhook.meta': 'Send event notifications to an external service',
|
|
@@ -43,6 +43,8 @@ const ja = Object.freeze({
|
|
|
43
43
|
'common.refresh': '更新',
|
|
44
44
|
'common.refreshing': '更新中...',
|
|
45
45
|
'common.loading': '読み込み中...',
|
|
46
|
+
'common.menu': 'メニュー',
|
|
47
|
+
'common.registry': 'レジストリ',
|
|
46
48
|
'common.saving': '保存中...',
|
|
47
49
|
'common.sending': '送信中...',
|
|
48
50
|
'common.scanning': 'スキャン中...',
|
|
@@ -69,6 +71,7 @@ const ja = Object.freeze({
|
|
|
69
71
|
'common.notConfigured': '未設定',
|
|
70
72
|
'common.enabled': '有効',
|
|
71
73
|
'common.disabled': '無効',
|
|
74
|
+
'common.retry': '再試行',
|
|
72
75
|
'cli.missing.title': '{name} CLI がインストールされていません',
|
|
73
76
|
'cli.missing.subtitle': '{name} CLI をインストールしてからこのページをご利用ください。',
|
|
74
77
|
'cli.missing.openDocs': 'インストールガイドを開く',
|
|
@@ -90,6 +93,7 @@ const ja = Object.freeze({
|
|
|
90
93
|
'field.apiEndpoint': 'API エンドポイント',
|
|
91
94
|
'field.apiKey': '認証キー',
|
|
92
95
|
'field.baseUrl': 'Base URL',
|
|
96
|
+
'field.url': 'URL',
|
|
93
97
|
'field.provider': 'プロバイダー',
|
|
94
98
|
'field.providerName': 'プロバイダー名',
|
|
95
99
|
'field.modelName': 'モデル名',
|
|
@@ -465,6 +469,7 @@ const ja = Object.freeze({
|
|
|
465
469
|
'toast.templates.deleteConfirm': '削除',
|
|
466
470
|
'toast.templates.deleteCancel': 'キャンセル',
|
|
467
471
|
'toast.operation.success': '操作が成功しました',
|
|
472
|
+
'toast.operation.fail': '操作に失敗しました',
|
|
468
473
|
'toast.load.fail': 'ファイルの読み込みに失敗しました',
|
|
469
474
|
'toast.apply.success': '設定が適用されました',
|
|
470
475
|
'toast.apply.fail': '設定の適用に失敗しました',
|
|
@@ -666,6 +671,20 @@ const ja = Object.freeze({
|
|
|
666
671
|
'sessions.preview.moving': '移動中...',
|
|
667
672
|
'sessions.preview.export': 'エクスポート',
|
|
668
673
|
'sessions.preview.exporting': 'エクスポート中...',
|
|
674
|
+
'sessions.preview.importNative': 'ネイティブディレクトリへインポート',
|
|
675
|
+
'sessions.preview.importingNative': 'インポート中...',
|
|
676
|
+
'sessions.preview.importNative.unsupported': 'この操作はサポートされていません',
|
|
677
|
+
'sessions.preview.importNative.confirmTitle': 'ネイティブセッションファイルを上書きしますか?',
|
|
678
|
+
'sessions.preview.importNative.confirmMessage': 'ネイティブセッションファイルが既に存在します。上書きすると、対象ツールのネイティブディレクトリ内の同名セッションが置き換えられます。',
|
|
679
|
+
'sessions.preview.importNative.confirmText': '上書き',
|
|
680
|
+
'sessions.preview.importNative.cancelled': 'インポートをキャンセルしました',
|
|
681
|
+
'sessions.preview.importNative.conflict': 'ネイティブセッションは既に存在します',
|
|
682
|
+
'sessions.preview.importNative.invalidSource': 'セッションソースが無効です',
|
|
683
|
+
'sessions.preview.importNative.fileNotFound': 'セッションファイルが見つかりません',
|
|
684
|
+
'sessions.preview.importNative.nativePathUnavailable': 'ネイティブセッションパスを解析できません',
|
|
685
|
+
'sessions.preview.importNative.success': 'ネイティブディレクトリへインポートしました',
|
|
686
|
+
'sessions.preview.importNative.failed': 'インポート失敗',
|
|
687
|
+
'sessions.preview.importNative.failedWithReason': 'ネイティブへのインポートに失敗しました:{reason}',
|
|
669
688
|
'sessions.preview.convert': '派生セッションを生成',
|
|
670
689
|
'sessions.preview.converting': '変換中...',
|
|
671
690
|
'sessions.preview.convert.loadedOnly': '読み込み済みのみ変換',
|
|
@@ -904,6 +923,11 @@ const ja = Object.freeze({
|
|
|
904
923
|
'config.template.editFirst': '先にテンプレートを編集してから適用してください。',
|
|
905
924
|
'config.template.bridgeCodexOnly': '{hint} テンプレートは Codex のみ編集可能です。',
|
|
906
925
|
'config.localBridge.enabledCount': '{enabled}/{total} 件有効',
|
|
926
|
+
'config.localBridge.poolSettings': 'プール設定',
|
|
927
|
+
'config.localBridge.poolHint': '負荷分散に参加する候補プロバイダーを選択してください。',
|
|
928
|
+
'config.localBridge.noProviders': '利用可能な候補プロバイダーがありません。先に直接プロバイダーを追加してください。',
|
|
929
|
+
'config.transformProvider.title': '変換プロバイダーを使用',
|
|
930
|
+
'config.providerBridgeHint': '{label} ブリッジモード',
|
|
907
931
|
'config.template.openEditor': 'テンプレートエディタを開く',
|
|
908
932
|
'modal.configTemplate.title': 'Config テンプレートエディタ(手動確認適用)',
|
|
909
933
|
'modal.configTemplate.placeholder': 'ここに config.toml テンプレート内容を編集してください',
|
|
@@ -1374,6 +1398,12 @@ const ja = Object.freeze({
|
|
|
1374
1398
|
'settings.trash.retentionLabel': '保持日数',
|
|
1375
1399
|
'settings.trash.retentionUnit': '日',
|
|
1376
1400
|
'settings.trash.retentionHint': '範囲 1-365 日、デフォルト 30 日。ゴミ箱読み込み時に期限切れレコードを自動クリーンアップします。',
|
|
1401
|
+
'settings.trash.count': '全 {count} 件',
|
|
1402
|
+
'settings.trash.retentionShort': '保持 {days} 日',
|
|
1403
|
+
'settings.trash.disabled': 'ゴミ箱は無効です',
|
|
1404
|
+
'settings.trash.disabledHint': '削除済みセッションは直接完全削除され、ゴミ箱に移動しません。',
|
|
1405
|
+
'settings.trash.clearShort': '空にする',
|
|
1406
|
+
'settings.trash.loadMoreItems': 'さらに読み込む(残り {count} 件)',
|
|
1377
1407
|
|
|
1378
1408
|
'settings.webhook.title': 'Webhook',
|
|
1379
1409
|
'settings.webhook.meta': 'イベント通知を外部サービスへ送信',
|
|
@@ -1499,6 +1529,8 @@ const ja = Object.freeze({
|
|
|
1499
1529
|
|
|
1500
1530
|
// OpenClaw config panel
|
|
1501
1531
|
'openclaw.applyHint': '~/.openclaw/openclaw.json に書き込みます。JSON5 対応。',
|
|
1532
|
+
'openclaw.workspace.title': 'OpenClaw ワークスペース',
|
|
1533
|
+
'openclaw.configs.hint': 'よく使う設定を選択、またはエディタで完全な JSON5 を維持します。',
|
|
1502
1534
|
'openclaw.agents.hint': 'Workspace の AGENTS.md を読み書きします。デフォルトパス ~/.openclaw/workspace/AGENTS.md。',
|
|
1503
1535
|
'openclaw.agents.open': 'AGENTS.md を開く',
|
|
1504
1536
|
'openclaw.workspaceFile': 'ワークスペースファイル',
|
|
@@ -51,6 +51,8 @@ const vi = Object.freeze({
|
|
|
51
51
|
'common.refresh': 'Làm mới',
|
|
52
52
|
'common.refreshing': 'Đang làm mới...',
|
|
53
53
|
'common.loading': 'Đang tải...',
|
|
54
|
+
'common.menu': 'Menu',
|
|
55
|
+
'common.registry': 'Nguồn',
|
|
54
56
|
'common.saving': 'Đang lưu...',
|
|
55
57
|
'common.sending': 'Đang gửi...',
|
|
56
58
|
'common.scanning': 'Đang quét...',
|
|
@@ -78,6 +80,7 @@ const vi = Object.freeze({
|
|
|
78
80
|
'common.notConfigured': 'Chưa cấu hình',
|
|
79
81
|
'common.enabled': 'Đã bật',
|
|
80
82
|
'common.disabled': 'Đã tắt',
|
|
83
|
+
'common.retry': 'Thử lại',
|
|
81
84
|
'common.notSelected': 'Chưa chọn',
|
|
82
85
|
|
|
83
86
|
// Roles / labels
|
|
@@ -152,6 +155,11 @@ const vi = Object.freeze({
|
|
|
152
155
|
'side.system.settings.meta': 'Dữ liệu / Sao lưu',
|
|
153
156
|
'side.newTab': 'Tab mới',
|
|
154
157
|
'config.localBridge.enabledCount': 'Đã bật {enabled}/{total}',
|
|
158
|
+
'config.localBridge.poolSettings': 'Cài đặt pool',
|
|
159
|
+
'config.localBridge.poolHint': 'Chọn nhà cung cấp ứng viên tham gia cân bằng tải.',
|
|
160
|
+
'config.localBridge.noProviders': 'Không có nhà cung cấp ứng viên. Vui lòng thêm nhà cung cấp trực tiếp trước.',
|
|
161
|
+
'config.transformProvider.title': 'Đang dùng nhà cung cấp biến đổi',
|
|
162
|
+
'config.providerBridgeHint': 'Chế độ cầu nối {label}',
|
|
155
163
|
'toolConfig.allow': 'Cho phép ghi',
|
|
156
164
|
'toolConfig.viewOnly': 'Chỉ đọc',
|
|
157
165
|
'toolConfig.enableWrite': 'Bật ghi',
|
|
@@ -434,6 +442,7 @@ const vi = Object.freeze({
|
|
|
434
442
|
'toast.delete.ok': 'Đã xóa',
|
|
435
443
|
'toast.delete.fail': 'Xóa thất bại',
|
|
436
444
|
'toast.operation.success': 'Thao tác thành công',
|
|
445
|
+
'toast.operation.fail': 'Thao tác thất bại',
|
|
437
446
|
'toast.load.fail': 'Tải tệp thất bại',
|
|
438
447
|
'toast.apply.success': 'Đã áp dụng cấu hình',
|
|
439
448
|
'toast.apply.fail': 'Áp dụng cấu hình thất bại',
|
|
@@ -530,6 +539,7 @@ const vi = Object.freeze({
|
|
|
530
539
|
'field.apiEndpoint': 'API endpoint',
|
|
531
540
|
'field.apiKey': 'API key',
|
|
532
541
|
'field.baseUrl': 'Base URL',
|
|
542
|
+
'field.url': 'URL',
|
|
533
543
|
'field.provider': 'Nhà cung cấp',
|
|
534
544
|
'field.providerName': 'Tên nhà cung cấp',
|
|
535
545
|
'field.modelName': 'Tên model',
|
|
@@ -1400,6 +1410,12 @@ const vi = Object.freeze({
|
|
|
1400
1410
|
'settings.trash.retentionMeta': 'Mục trong thùng rác cũ hơn số ngày lưu giữ sẽ tự động bị xóa',
|
|
1401
1411
|
'settings.trash.retentionLabel': 'Số ngày lưu giữ',
|
|
1402
1412
|
'settings.trash.retentionHint': 'Phạm vi 1-365 ngày, mặc định 30. Mục hết hạn bị xóa khi tải thùng rác.',
|
|
1413
|
+
'settings.trash.count': 'Tổng {count} mục',
|
|
1414
|
+
'settings.trash.retentionShort': 'Lưu {days} ngày',
|
|
1415
|
+
'settings.trash.disabled': 'Thùng rác đã tắt',
|
|
1416
|
+
'settings.trash.disabledHint': 'Phiên đã xóa sẽ bị xóa vĩnh viễn, không chuyển vào thùng rác nữa.',
|
|
1417
|
+
'settings.trash.clearShort': 'Làm trống',
|
|
1418
|
+
'settings.trash.loadMoreItems': 'Tải thêm (còn lại {count})',
|
|
1403
1419
|
'settings.templateConfirm.title': 'Xác nhận áp dụng template',
|
|
1404
1420
|
'settings.templateConfirm.meta': 'Giảm ghi nhầm',
|
|
1405
1421
|
'settings.templateConfirm.toggle': 'Xem trước diff trước khi áp dụng (Xác nhận → Áp dụng)',
|
|
@@ -42,6 +42,8 @@ const zhTw = Object.freeze({
|
|
|
42
42
|
'common.refresh': '重新整理',
|
|
43
43
|
'common.refreshing': '重新整理中...',
|
|
44
44
|
'common.loading': '載入中...',
|
|
45
|
+
'common.menu': '選單',
|
|
46
|
+
'common.registry': '鏡像源',
|
|
45
47
|
'common.saving': '保存中...',
|
|
46
48
|
'common.sending': '發送中...',
|
|
47
49
|
'common.scanning': '掃描中...',
|
|
@@ -68,6 +70,7 @@ const zhTw = Object.freeze({
|
|
|
68
70
|
'common.notConfigured': '未設定',
|
|
69
71
|
'common.enabled': '已啟用',
|
|
70
72
|
'common.disabled': '已停用',
|
|
73
|
+
'common.retry': '重試',
|
|
71
74
|
'cli.missing.title': '{name} CLI 未安裝',
|
|
72
75
|
'cli.missing.subtitle': '請先安裝 {name} CLI 後再繼續使用此頁面。',
|
|
73
76
|
'cli.missing.openDocs': '打開安裝指南',
|
|
@@ -89,6 +92,7 @@ const zhTw = Object.freeze({
|
|
|
89
92
|
'field.apiEndpoint': 'API 端點',
|
|
90
93
|
'field.apiKey': '認證密鑰',
|
|
91
94
|
'field.baseUrl': 'Base URL',
|
|
95
|
+
'field.url': 'URL',
|
|
92
96
|
'field.provider': '提供商',
|
|
93
97
|
'field.providerName': 'Provider 名稱',
|
|
94
98
|
'field.modelName': '模型名稱',
|
|
@@ -463,6 +467,7 @@ const zhTw = Object.freeze({
|
|
|
463
467
|
'toast.templates.deleteConfirm': '刪除',
|
|
464
468
|
'toast.templates.deleteCancel': '取消',
|
|
465
469
|
'toast.operation.success': '操作成功',
|
|
470
|
+
'toast.operation.fail': '操作失敗',
|
|
466
471
|
'toast.load.fail': '載入文件失敗',
|
|
467
472
|
'toast.apply.success': '設定已應用',
|
|
468
473
|
'toast.apply.fail': '應用設定失敗',
|
|
@@ -914,6 +919,11 @@ const zhTw = Object.freeze({
|
|
|
914
919
|
'config.template.editFirst': '先改模板,再應用。',
|
|
915
920
|
'config.template.bridgeCodexOnly': '{hint} 模板僅限 Codex 編輯。',
|
|
916
921
|
'config.localBridge.enabledCount': '已啟用 {enabled}/{total}',
|
|
922
|
+
'config.localBridge.poolSettings': '輪詢池設定',
|
|
923
|
+
'config.localBridge.poolHint': '選擇參與負載均衡的候選提供商。',
|
|
924
|
+
'config.localBridge.noProviders': '暫無可用候選提供商,請先新增直連提供商。',
|
|
925
|
+
'config.transformProvider.title': '使用轉換提供商',
|
|
926
|
+
'config.providerBridgeHint': '{label} 橋接模式',
|
|
917
927
|
'config.template.openEditor': '打開模板編輯器',
|
|
918
928
|
'modal.configTemplate.title': 'Config 模板編輯器(手動確認應用)',
|
|
919
929
|
'modal.configTemplate.placeholder': '在這裡編輯 config.toml 模板內容',
|
|
@@ -1384,6 +1394,12 @@ const zhTw = Object.freeze({
|
|
|
1384
1394
|
'settings.trash.retentionLabel': '保留天數',
|
|
1385
1395
|
'settings.trash.retentionUnit': '天',
|
|
1386
1396
|
'settings.trash.retentionHint': '範圍 1-365 天,預設 30 天。每次載入回收站時自動清理過期記錄。',
|
|
1397
|
+
'settings.trash.count': '共 {count} 項',
|
|
1398
|
+
'settings.trash.retentionShort': '保留 {days} 天',
|
|
1399
|
+
'settings.trash.disabled': '回收站已關閉',
|
|
1400
|
+
'settings.trash.disabledHint': '已刪除的工作階段將直接永久刪除,不再進入回收站。',
|
|
1401
|
+
'settings.trash.clearShort': '清空',
|
|
1402
|
+
'settings.trash.loadMoreItems': '載入更多(剩餘 {count} 項)',
|
|
1387
1403
|
|
|
1388
1404
|
'settings.webhook.title': 'Webhook',
|
|
1389
1405
|
'settings.webhook.meta': '發送事件通知到外部服務',
|
|
@@ -42,6 +42,8 @@ const zh = Object.freeze({
|
|
|
42
42
|
'common.refresh': '刷新',
|
|
43
43
|
'common.refreshing': '刷新中...',
|
|
44
44
|
'common.loading': '加载中...',
|
|
45
|
+
'common.menu': '菜单',
|
|
46
|
+
'common.registry': '镜像源',
|
|
45
47
|
'common.saving': '保存中...',
|
|
46
48
|
'common.sending': '发送中...',
|
|
47
49
|
'common.scanning': '扫描中...',
|
|
@@ -68,6 +70,7 @@ const zh = Object.freeze({
|
|
|
68
70
|
'common.notConfigured': '未配置',
|
|
69
71
|
'common.enabled': '已启用',
|
|
70
72
|
'common.disabled': '已禁用',
|
|
73
|
+
'common.retry': '重试',
|
|
71
74
|
'cli.missing.title': '{name} CLI 未安装',
|
|
72
75
|
'cli.missing.subtitle': '请先安装 {name} CLI 后再继续使用此页面。',
|
|
73
76
|
'cli.missing.openDocs': '打开安装指南',
|
|
@@ -89,6 +92,7 @@ const zh = Object.freeze({
|
|
|
89
92
|
'field.apiEndpoint': 'API 端点',
|
|
90
93
|
'field.apiKey': '认证密钥',
|
|
91
94
|
'field.baseUrl': 'Base URL',
|
|
95
|
+
'field.url': 'URL',
|
|
92
96
|
'field.provider': '提供商',
|
|
93
97
|
'field.providerName': 'Provider 名称',
|
|
94
98
|
'field.modelName': '模型名称',
|
|
@@ -463,6 +467,7 @@ const zh = Object.freeze({
|
|
|
463
467
|
'toast.templates.deleteConfirm': '删除',
|
|
464
468
|
'toast.templates.deleteCancel': '取消',
|
|
465
469
|
'toast.operation.success': '操作成功',
|
|
470
|
+
'toast.operation.fail': '操作失败',
|
|
466
471
|
'toast.load.fail': '加载文件失败',
|
|
467
472
|
'toast.apply.success': '配置已应用',
|
|
468
473
|
'toast.apply.fail': '应用配置失败',
|
|
@@ -914,6 +919,11 @@ const zh = Object.freeze({
|
|
|
914
919
|
'config.template.editFirst': '先改模板,再应用。',
|
|
915
920
|
'config.template.bridgeCodexOnly': '{hint} 模板仅限 Codex 编辑。',
|
|
916
921
|
'config.localBridge.enabledCount': '已启用 {enabled}/{total}',
|
|
922
|
+
'config.localBridge.poolSettings': '轮询池设置',
|
|
923
|
+
'config.localBridge.poolHint': '选择参与负载均衡的候选提供商。',
|
|
924
|
+
'config.localBridge.noProviders': '暂无可用候选提供商,请先添加直连提供商。',
|
|
925
|
+
'config.transformProvider.title': '使用转换提供商',
|
|
926
|
+
'config.providerBridgeHint': '{label} 桥接模式',
|
|
917
927
|
'config.template.openEditor': '打开模板编辑器',
|
|
918
928
|
'modal.configTemplate.title': 'Config 模板编辑器(手动确认应用)',
|
|
919
929
|
'modal.configTemplate.placeholder': '在这里编辑 config.toml 模板内容',
|
|
@@ -1384,6 +1394,12 @@ const zh = Object.freeze({
|
|
|
1384
1394
|
'settings.trash.retentionLabel': '保留天数',
|
|
1385
1395
|
'settings.trash.retentionUnit': '天',
|
|
1386
1396
|
'settings.trash.retentionHint': '范围 1-365 天,默认 30 天。每次加载回收站时自动清理过期记录。',
|
|
1397
|
+
'settings.trash.count': '共 {count} 项',
|
|
1398
|
+
'settings.trash.retentionShort': '保留 {days} 天',
|
|
1399
|
+
'settings.trash.disabled': '回收站已关闭',
|
|
1400
|
+
'settings.trash.disabledHint': '已删除的会话将直接永久删除,不再进入回收站。',
|
|
1401
|
+
'settings.trash.clearShort': '清空',
|
|
1402
|
+
'settings.trash.loadMoreItems': '加载更多(剩余 {count} 项)',
|
|
1387
1403
|
|
|
1388
1404
|
'settings.webhook.title': 'Webhook',
|
|
1389
1405
|
'settings.webhook.meta': '发送事件通知到外部服务',
|
|
@@ -185,29 +185,6 @@
|
|
|
185
185
|
</button>
|
|
186
186
|
</div>
|
|
187
187
|
</section>
|
|
188
|
-
|
|
189
|
-
<section class="settings-card" :aria-label="t('settings.trashConfig.title')">
|
|
190
|
-
<div class="settings-card-main">
|
|
191
|
-
<div class="settings-card-content">
|
|
192
|
-
<div class="settings-card-title">{{ t('settings.trashConfig.title') }}</div>
|
|
193
|
-
<p class="settings-card-desc">{{ t('settings.trashConfig.meta') }}</p>
|
|
194
|
-
<label class="settings-toggle-row">
|
|
195
|
-
<input type="checkbox" :checked="sessionTrashEnabled" @change="setSessionTrashEnabled($event.target.checked)">
|
|
196
|
-
<span class="toggle-track">
|
|
197
|
-
<span class="toggle-thumb"></span>
|
|
198
|
-
</span>
|
|
199
|
-
<span>{{ t('settings.deleteBehavior.toggle') }}</span>
|
|
200
|
-
</label>
|
|
201
|
-
<div class="settings-retention">
|
|
202
|
-
<label for="settings-trash-retention-days">{{ t('settings.trash.retentionLabel') }}</label>
|
|
203
|
-
<input id="settings-trash-retention-days" type="number" min="1" max="365" :value="sessionTrashRetentionDays" @change="setSessionTrashRetentionDays(Number($event.target.value))" class="settings-retention-input" />
|
|
204
|
-
<span>{{ t('settings.trash.retentionUnit') }}</span>
|
|
205
|
-
</div>
|
|
206
|
-
<p class="settings-card-hint">{{ t('settings.trash.retentionHint') }}</p>
|
|
207
|
-
</div>
|
|
208
|
-
</div>
|
|
209
|
-
</section>
|
|
210
|
-
|
|
211
188
|
<section class="settings-card settings-card--destructive" :aria-label="t('settings.reset.title')">
|
|
212
189
|
<div class="settings-card-main">
|
|
213
190
|
<div class="settings-card-content">
|
|
@@ -6,8 +6,43 @@
|
|
|
6
6
|
role="tabpanel"
|
|
7
7
|
aria-labelledby="tab-trash">
|
|
8
8
|
<div v-if="!loading" class="trash-panel-shell">
|
|
9
|
+
<!-- Trash configuration -->
|
|
10
|
+
<section class="settings-card trash-config-card" :aria-label="t('settings.trashConfig.title')">
|
|
11
|
+
<div class="settings-card-main">
|
|
12
|
+
<div class="settings-card-content">
|
|
13
|
+
<div class="settings-card-title">{{ t('settings.trashConfig.title') }}</div>
|
|
14
|
+
<p class="settings-card-desc">{{ t('settings.trashConfig.meta') }}</p>
|
|
15
|
+
<label class="settings-toggle-row">
|
|
16
|
+
<input type="checkbox" :checked="sessionTrashEnabled" @change="setSessionTrashEnabled($event.target.checked)">
|
|
17
|
+
<span class="toggle-track">
|
|
18
|
+
<span class="toggle-thumb"></span>
|
|
19
|
+
</span>
|
|
20
|
+
<span>{{ t('settings.deleteBehavior.toggle') }}</span>
|
|
21
|
+
</label>
|
|
22
|
+
<div class="settings-retention">
|
|
23
|
+
<label for="settings-trash-retention-days">{{ t('settings.trash.retentionLabel') }}</label>
|
|
24
|
+
<input id="settings-trash-retention-days" type="number" min="1" max="365" :value="sessionTrashRetentionDays" @change="setSessionTrashRetentionDays(Number($event.target.value))" class="settings-retention-input" />
|
|
25
|
+
<span>{{ t('settings.trash.retentionUnit') }}</span>
|
|
26
|
+
</div>
|
|
27
|
+
<p class="settings-card-hint">{{ t('settings.trash.retentionHint') }}</p>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</section>
|
|
31
|
+
|
|
32
|
+
<!-- Disabled state -->
|
|
33
|
+
<div v-if="getSessionTrashViewState() === 'disabled'" class="trash-empty-state trash-disabled-state">
|
|
34
|
+
<svg class="trash-empty-svg" viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="1.2">
|
|
35
|
+
<path d="M20 22l4 32h16l4-32" />
|
|
36
|
+
<path d="M14 22h36" />
|
|
37
|
+
<path d="M24 22v-4a4 4 0 014-4h8a4 4 0 014 4v4" />
|
|
38
|
+
<path d="M10 10l44 44" stroke-width="2" stroke-linecap="round" />
|
|
39
|
+
</svg>
|
|
40
|
+
<div class="trash-empty-title">{{ t('settings.trash.disabled') }}</div>
|
|
41
|
+
<div class="trash-empty-hint">{{ t('settings.trash.disabledHint') }}</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
9
44
|
<!-- Empty state -->
|
|
10
|
-
<div v-if="getSessionTrashViewState() === 'empty'" class="trash-empty-state">
|
|
45
|
+
<div v-else-if="getSessionTrashViewState() === 'empty'" class="trash-empty-state">
|
|
11
46
|
<svg class="trash-empty-svg" viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="1.2">
|
|
12
47
|
<path d="M20 22l4 32h16l4-32"/>
|
|
13
48
|
<path d="M14 22h36"/>
|
|
@@ -5886,42 +5886,6 @@ return function render(_ctx, _cache) {
|
|
|
5886
5886
|
}, _toDisplayString(_ctx.providerCacheSyncing ? _ctx.t('settings.providerCache.syncing') : _ctx.t('settings.providerCache.sync')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
|
|
5887
5887
|
])
|
|
5888
5888
|
], 8 /* PROPS */, ["aria-label"]),
|
|
5889
|
-
_createElementVNode("section", {
|
|
5890
|
-
class: "settings-card",
|
|
5891
|
-
"aria-label": _ctx.t('settings.trashConfig.title')
|
|
5892
|
-
}, [
|
|
5893
|
-
_createElementVNode("div", { class: "settings-card-main" }, [
|
|
5894
|
-
_createElementVNode("div", { class: "settings-card-content" }, [
|
|
5895
|
-
_createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.trashConfig.title')), 1 /* TEXT */),
|
|
5896
|
-
_createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.trashConfig.meta')), 1 /* TEXT */),
|
|
5897
|
-
_createElementVNode("label", { class: "settings-toggle-row" }, [
|
|
5898
|
-
_createElementVNode("input", {
|
|
5899
|
-
type: "checkbox",
|
|
5900
|
-
checked: _ctx.sessionTrashEnabled,
|
|
5901
|
-
onChange: $event => (_ctx.setSessionTrashEnabled($event.target.checked))
|
|
5902
|
-
}, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
|
|
5903
|
-
_createElementVNode("span", { class: "toggle-track" }, [
|
|
5904
|
-
_createElementVNode("span", { class: "toggle-thumb" })
|
|
5905
|
-
]),
|
|
5906
|
-
_createElementVNode("span", null, _toDisplayString(_ctx.t('settings.deleteBehavior.toggle')), 1 /* TEXT */)
|
|
5907
|
-
]),
|
|
5908
|
-
_createElementVNode("div", { class: "settings-retention" }, [
|
|
5909
|
-
_createElementVNode("label", { for: "settings-trash-retention-days" }, _toDisplayString(_ctx.t('settings.trash.retentionLabel')), 1 /* TEXT */),
|
|
5910
|
-
_createElementVNode("input", {
|
|
5911
|
-
id: "settings-trash-retention-days",
|
|
5912
|
-
type: "number",
|
|
5913
|
-
min: "1",
|
|
5914
|
-
max: "365",
|
|
5915
|
-
value: _ctx.sessionTrashRetentionDays,
|
|
5916
|
-
onChange: $event => (_ctx.setSessionTrashRetentionDays(Number($event.target.value))),
|
|
5917
|
-
class: "settings-retention-input"
|
|
5918
|
-
}, null, 40 /* PROPS, NEED_HYDRATION */, ["value", "onChange"]),
|
|
5919
|
-
_createElementVNode("span", null, _toDisplayString(_ctx.t('settings.trash.retentionUnit')), 1 /* TEXT */)
|
|
5920
|
-
]),
|
|
5921
|
-
_createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.trash.retentionHint')), 1 /* TEXT */)
|
|
5922
|
-
])
|
|
5923
|
-
])
|
|
5924
|
-
], 8 /* PROPS */, ["aria-label"]),
|
|
5925
5889
|
_createElementVNode("section", {
|
|
5926
5890
|
class: "settings-card settings-card--destructive",
|
|
5927
5891
|
"aria-label": _ctx.t('settings.reset.title')
|
|
@@ -5958,11 +5922,48 @@ return function render(_ctx, _cache) {
|
|
|
5958
5922
|
key: 0,
|
|
5959
5923
|
class: "trash-panel-shell"
|
|
5960
5924
|
}, [
|
|
5961
|
-
_createCommentVNode("
|
|
5962
|
-
(
|
|
5925
|
+
_createCommentVNode(" Trash configuration "),
|
|
5926
|
+
_createElementVNode("section", {
|
|
5927
|
+
class: "settings-card trash-config-card",
|
|
5928
|
+
"aria-label": _ctx.t('settings.trashConfig.title')
|
|
5929
|
+
}, [
|
|
5930
|
+
_createElementVNode("div", { class: "settings-card-main" }, [
|
|
5931
|
+
_createElementVNode("div", { class: "settings-card-content" }, [
|
|
5932
|
+
_createElementVNode("div", { class: "settings-card-title" }, _toDisplayString(_ctx.t('settings.trashConfig.title')), 1 /* TEXT */),
|
|
5933
|
+
_createElementVNode("p", { class: "settings-card-desc" }, _toDisplayString(_ctx.t('settings.trashConfig.meta')), 1 /* TEXT */),
|
|
5934
|
+
_createElementVNode("label", { class: "settings-toggle-row" }, [
|
|
5935
|
+
_createElementVNode("input", {
|
|
5936
|
+
type: "checkbox",
|
|
5937
|
+
checked: _ctx.sessionTrashEnabled,
|
|
5938
|
+
onChange: $event => (_ctx.setSessionTrashEnabled($event.target.checked))
|
|
5939
|
+
}, null, 40 /* PROPS, NEED_HYDRATION */, ["checked", "onChange"]),
|
|
5940
|
+
_createElementVNode("span", { class: "toggle-track" }, [
|
|
5941
|
+
_createElementVNode("span", { class: "toggle-thumb" })
|
|
5942
|
+
]),
|
|
5943
|
+
_createElementVNode("span", null, _toDisplayString(_ctx.t('settings.deleteBehavior.toggle')), 1 /* TEXT */)
|
|
5944
|
+
]),
|
|
5945
|
+
_createElementVNode("div", { class: "settings-retention" }, [
|
|
5946
|
+
_createElementVNode("label", { for: "settings-trash-retention-days" }, _toDisplayString(_ctx.t('settings.trash.retentionLabel')), 1 /* TEXT */),
|
|
5947
|
+
_createElementVNode("input", {
|
|
5948
|
+
id: "settings-trash-retention-days",
|
|
5949
|
+
type: "number",
|
|
5950
|
+
min: "1",
|
|
5951
|
+
max: "365",
|
|
5952
|
+
value: _ctx.sessionTrashRetentionDays,
|
|
5953
|
+
onChange: $event => (_ctx.setSessionTrashRetentionDays(Number($event.target.value))),
|
|
5954
|
+
class: "settings-retention-input"
|
|
5955
|
+
}, null, 40 /* PROPS, NEED_HYDRATION */, ["value", "onChange"]),
|
|
5956
|
+
_createElementVNode("span", null, _toDisplayString(_ctx.t('settings.trash.retentionUnit')), 1 /* TEXT */)
|
|
5957
|
+
]),
|
|
5958
|
+
_createElementVNode("p", { class: "settings-card-hint" }, _toDisplayString(_ctx.t('settings.trash.retentionHint')), 1 /* TEXT */)
|
|
5959
|
+
])
|
|
5960
|
+
])
|
|
5961
|
+
], 8 /* PROPS */, ["aria-label"]),
|
|
5962
|
+
_createCommentVNode(" Disabled state "),
|
|
5963
|
+
(_ctx.getSessionTrashViewState() === 'disabled')
|
|
5963
5964
|
? (_openBlock(), _createElementBlock("div", {
|
|
5964
5965
|
key: 0,
|
|
5965
|
-
class: "trash-empty-state"
|
|
5966
|
+
class: "trash-empty-state trash-disabled-state"
|
|
5966
5967
|
}, [
|
|
5967
5968
|
(_openBlock(), _createElementBlock("svg", {
|
|
5968
5969
|
class: "trash-empty-svg",
|
|
@@ -5975,158 +5976,182 @@ return function render(_ctx, _cache) {
|
|
|
5975
5976
|
_createElementVNode("path", { d: "M14 22h36" }),
|
|
5976
5977
|
_createElementVNode("path", { d: "M24 22v-4a4 4 0 014-4h8a4 4 0 014 4v4" }),
|
|
5977
5978
|
_createElementVNode("path", {
|
|
5978
|
-
d: "
|
|
5979
|
-
"stroke-width": "
|
|
5979
|
+
d: "M10 10l44 44",
|
|
5980
|
+
"stroke-width": "2",
|
|
5980
5981
|
"stroke-linecap": "round"
|
|
5981
5982
|
})
|
|
5982
5983
|
])),
|
|
5983
|
-
_createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.
|
|
5984
|
-
_createElementVNode("div", { class: "trash-empty-hint" }, _toDisplayString(_ctx.t('settings.trash.
|
|
5984
|
+
_createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.disabled')), 1 /* TEXT */),
|
|
5985
|
+
_createElementVNode("div", { class: "trash-empty-hint" }, _toDisplayString(_ctx.t('settings.trash.disabledHint')), 1 /* TEXT */)
|
|
5985
5986
|
]))
|
|
5986
|
-
: (_ctx.getSessionTrashViewState() === '
|
|
5987
|
+
: (_ctx.getSessionTrashViewState() === 'empty')
|
|
5987
5988
|
? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [
|
|
5988
|
-
_createCommentVNode("
|
|
5989
|
+
_createCommentVNode(" Empty state "),
|
|
5989
5990
|
_createElementVNode("div", { class: "trash-empty-state" }, [
|
|
5990
|
-
|
|
5991
|
-
|
|
5991
|
+
(_openBlock(), _createElementBlock("svg", {
|
|
5992
|
+
class: "trash-empty-svg",
|
|
5993
|
+
viewBox: "0 0 64 64",
|
|
5994
|
+
fill: "none",
|
|
5995
|
+
stroke: "currentColor",
|
|
5996
|
+
"stroke-width": "1.2"
|
|
5997
|
+
}, [
|
|
5998
|
+
_createElementVNode("path", { d: "M20 22l4 32h16l4-32" }),
|
|
5999
|
+
_createElementVNode("path", { d: "M14 22h36" }),
|
|
6000
|
+
_createElementVNode("path", { d: "M24 22v-4a4 4 0 014-4h8a4 4 0 014 4v4" }),
|
|
6001
|
+
_createElementVNode("path", {
|
|
6002
|
+
d: "M28 30v16M36 30v16",
|
|
6003
|
+
"stroke-width": "1.6",
|
|
6004
|
+
"stroke-linecap": "round"
|
|
6005
|
+
})
|
|
6006
|
+
])),
|
|
6007
|
+
_createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.empty')), 1 /* TEXT */),
|
|
6008
|
+
_createElementVNode("div", { class: "trash-empty-hint" }, _toDisplayString(_ctx.t('settings.trash.emptyHint', { days: _ctx.sessionTrashRetentionDays })), 1 /* TEXT */)
|
|
5992
6009
|
])
|
|
5993
6010
|
], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))
|
|
5994
|
-
: (_ctx.getSessionTrashViewState() === '
|
|
6011
|
+
: (_ctx.getSessionTrashViewState() === 'loading')
|
|
5995
6012
|
? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [
|
|
5996
|
-
_createCommentVNode("
|
|
6013
|
+
_createCommentVNode(" Loading state "),
|
|
5997
6014
|
_createElementVNode("div", { class: "trash-empty-state" }, [
|
|
5998
|
-
(
|
|
5999
|
-
|
|
6000
|
-
viewBox: "0 0 64 64",
|
|
6001
|
-
fill: "none",
|
|
6002
|
-
stroke: "currentColor",
|
|
6003
|
-
"stroke-width": "1.2"
|
|
6004
|
-
}, [
|
|
6005
|
-
_createElementVNode("circle", {
|
|
6006
|
-
cx: "32",
|
|
6007
|
-
cy: "32",
|
|
6008
|
-
r: "22"
|
|
6009
|
-
}),
|
|
6010
|
-
_createElementVNode("path", {
|
|
6011
|
-
d: "M32 20v16M32 44v2",
|
|
6012
|
-
"stroke-width": "2",
|
|
6013
|
-
"stroke-linecap": "round"
|
|
6014
|
-
})
|
|
6015
|
-
])),
|
|
6016
|
-
_createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.retry')), 1 /* TEXT */),
|
|
6017
|
-
_createElementVNode("button", {
|
|
6018
|
-
class: "btn-tool",
|
|
6019
|
-
onClick: $event => (_ctx.loadSessionTrash({ forceRefresh: true }))
|
|
6020
|
-
}, _toDisplayString(_ctx.t('common.retry')), 9 /* TEXT, PROPS */, ["onClick"])
|
|
6015
|
+
_createElementVNode("div", { class: "trash-spinner" }),
|
|
6016
|
+
_createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.loading')), 1 /* TEXT */)
|
|
6021
6017
|
])
|
|
6022
6018
|
], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))
|
|
6023
|
-
: (
|
|
6024
|
-
|
|
6025
|
-
|
|
6026
|
-
_createElementVNode("div", { class: "trash-
|
|
6027
|
-
|
|
6028
|
-
|
|
6029
|
-
|
|
6030
|
-
|
|
6031
|
-
|
|
6032
|
-
|
|
6033
|
-
onClick: $event => (_ctx.loadSessionTrash({ forceRefresh: true })),
|
|
6034
|
-
disabled: _ctx.sessionTrashLoading,
|
|
6035
|
-
"aria-label": _ctx.t('sessions.refresh'),
|
|
6036
|
-
title: _ctx.t('sessions.refresh')
|
|
6019
|
+
: (_ctx.getSessionTrashViewState() === 'retry')
|
|
6020
|
+
? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [
|
|
6021
|
+
_createCommentVNode(" Error state "),
|
|
6022
|
+
_createElementVNode("div", { class: "trash-empty-state" }, [
|
|
6023
|
+
(_openBlock(), _createElementBlock("svg", {
|
|
6024
|
+
class: "trash-empty-svg",
|
|
6025
|
+
viewBox: "0 0 64 64",
|
|
6026
|
+
fill: "none",
|
|
6027
|
+
stroke: "currentColor",
|
|
6028
|
+
"stroke-width": "1.2"
|
|
6037
6029
|
}, [
|
|
6038
|
-
(
|
|
6039
|
-
|
|
6040
|
-
|
|
6041
|
-
|
|
6030
|
+
_createElementVNode("circle", {
|
|
6031
|
+
cx: "32",
|
|
6032
|
+
cy: "32",
|
|
6033
|
+
r: "22"
|
|
6034
|
+
}),
|
|
6035
|
+
_createElementVNode("path", {
|
|
6036
|
+
d: "M32 20v16M32 44v2",
|
|
6042
6037
|
"stroke-width": "2",
|
|
6043
|
-
|
|
6044
|
-
}
|
|
6045
|
-
|
|
6046
|
-
|
|
6047
|
-
], 8 /* PROPS */, ["onClick", "disabled", "aria-label", "title"]),
|
|
6038
|
+
"stroke-linecap": "round"
|
|
6039
|
+
})
|
|
6040
|
+
])),
|
|
6041
|
+
_createElementVNode("div", { class: "trash-empty-title" }, _toDisplayString(_ctx.t('settings.trash.retry')), 1 /* TEXT */),
|
|
6048
6042
|
_createElementVNode("button", {
|
|
6049
|
-
class: "btn-
|
|
6050
|
-
onClick: _ctx.
|
|
6051
|
-
|
|
6052
|
-
}, _toDisplayString(_ctx.sessionTrashClearing ? _ctx.t('settings.trash.clearing') : _ctx.t('settings.trash.clearShort')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
|
|
6043
|
+
class: "btn-tool",
|
|
6044
|
+
onClick: $event => (_ctx.loadSessionTrash({ forceRefresh: true }))
|
|
6045
|
+
}, _toDisplayString(_ctx.t('common.retry')), 9 /* TEXT, PROPS */, ["onClick"])
|
|
6053
6046
|
])
|
|
6054
|
-
])
|
|
6055
|
-
|
|
6056
|
-
(
|
|
6057
|
-
|
|
6058
|
-
|
|
6059
|
-
class: "trash-
|
|
6060
|
-
|
|
6061
|
-
|
|
6062
|
-
|
|
6063
|
-
|
|
6064
|
-
|
|
6065
|
-
|
|
6066
|
-
|
|
6067
|
-
|
|
6068
|
-
|
|
6069
|
-
|
|
6070
|
-
|
|
6071
|
-
|
|
6072
|
-
|
|
6073
|
-
|
|
6074
|
-
|
|
6075
|
-
|
|
6076
|
-
|
|
6077
|
-
|
|
6078
|
-
|
|
6079
|
-
|
|
6080
|
-
|
|
6081
|
-
|
|
6082
|
-
|
|
6083
|
-
|
|
6084
|
-
|
|
6085
|
-
|
|
6086
|
-
|
|
6087
|
-
|
|
6088
|
-
|
|
6089
|
-
|
|
6090
|
-
|
|
6047
|
+
], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))
|
|
6048
|
+
: (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [
|
|
6049
|
+
_createCommentVNode(" List state "),
|
|
6050
|
+
_createElementVNode("div", { class: "trash-toolbar" }, [
|
|
6051
|
+
_createElementVNode("div", { class: "trash-toolbar-left" }, [
|
|
6052
|
+
_createElementVNode("span", { class: "trash-toolbar-count" }, _toDisplayString(_ctx.t('settings.trash.count', { count: _ctx.sessionTrashCount })), 1 /* TEXT */),
|
|
6053
|
+
_createElementVNode("span", { class: "trash-toolbar-retention" }, _toDisplayString(_ctx.t('settings.trash.retentionShort', { days: _ctx.sessionTrashRetentionDays })), 1 /* TEXT */)
|
|
6054
|
+
]),
|
|
6055
|
+
_createElementVNode("div", { class: "trash-toolbar-right" }, [
|
|
6056
|
+
_createElementVNode("button", {
|
|
6057
|
+
class: "btn-mini",
|
|
6058
|
+
onClick: $event => (_ctx.loadSessionTrash({ forceRefresh: true })),
|
|
6059
|
+
disabled: _ctx.sessionTrashLoading,
|
|
6060
|
+
"aria-label": _ctx.t('sessions.refresh'),
|
|
6061
|
+
title: _ctx.t('sessions.refresh')
|
|
6062
|
+
}, [
|
|
6063
|
+
(_openBlock(), _createElementBlock("svg", {
|
|
6064
|
+
viewBox: "0 0 24 24",
|
|
6065
|
+
fill: "none",
|
|
6066
|
+
stroke: "currentColor",
|
|
6067
|
+
"stroke-width": "2",
|
|
6068
|
+
class: "btn-icon-sm"
|
|
6069
|
+
}, [
|
|
6070
|
+
_createElementVNode("path", { d: "M21 2v6h-6M3 12a9 9 0 0115-6.7L21 8M3 22v-6h6M21 12a9 9 0 01-15 6.7L3 16" })
|
|
6071
|
+
]))
|
|
6072
|
+
], 8 /* PROPS */, ["onClick", "disabled", "aria-label", "title"]),
|
|
6073
|
+
_createElementVNode("button", {
|
|
6074
|
+
class: "btn-mini delete",
|
|
6075
|
+
onClick: _ctx.clearSessionTrash,
|
|
6076
|
+
disabled: _ctx.sessionTrashClearing || _ctx.sessionTrashLoading || !(Number(_ctx.sessionTrashCount) > 0)
|
|
6077
|
+
}, _toDisplayString(_ctx.sessionTrashClearing ? _ctx.t('settings.trash.clearing') : _ctx.t('settings.trash.clearShort')), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
|
|
6078
|
+
])
|
|
6079
|
+
]),
|
|
6080
|
+
_createElementVNode("div", { class: "trash-list" }, [
|
|
6081
|
+
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.visibleSessionTrashItems, (item) => {
|
|
6082
|
+
return (_openBlock(), _createElementBlock("div", {
|
|
6083
|
+
key: item.trashId,
|
|
6084
|
+
class: "trash-item"
|
|
6085
|
+
}, [
|
|
6086
|
+
_createElementVNode("div", { class: "trash-item-body" }, [
|
|
6087
|
+
_createElementVNode("div", { class: "trash-item-main" }, [
|
|
6088
|
+
_createElementVNode("div", { class: "trash-item-title" }, _toDisplayString(item.title || item.sessionId), 1 /* TEXT */),
|
|
6089
|
+
_createElementVNode("div", { class: "trash-item-meta" }, [
|
|
6090
|
+
_createElementVNode("span", {
|
|
6091
|
+
class: "session-source",
|
|
6092
|
+
"data-source": item.source
|
|
6093
|
+
}, _toDisplayString(item.sourceLabel), 9 /* TEXT, PROPS */, ["data-source"]),
|
|
6094
|
+
_createElementVNode("span", { class: "trash-item-time" }, _toDisplayString(item.deletedAt || item.updatedAt || _ctx.t('sessions.unknownTime')), 1 /* TEXT */),
|
|
6095
|
+
(item.cwd)
|
|
6096
|
+
? (_openBlock(), _createElementBlock("span", {
|
|
6097
|
+
key: 0,
|
|
6098
|
+
class: "trash-item-cwd"
|
|
6099
|
+
}, _toDisplayString(item.cwd), 1 /* TEXT */))
|
|
6100
|
+
: _createCommentVNode("v-if", true)
|
|
6101
|
+
])
|
|
6102
|
+
]),
|
|
6103
|
+
_createElementVNode("div", { class: "trash-item-actions" }, [
|
|
6104
|
+
_createElementVNode("button", {
|
|
6105
|
+
class: "trash-action-btn restore",
|
|
6106
|
+
onClick: $event => (_ctx.restoreSessionTrash(item)),
|
|
6107
|
+
disabled: _ctx.sessionTrashLoading || _ctx.sessionTrashClearing || _ctx.isSessionTrashActionBusy(item),
|
|
6108
|
+
"aria-label": _ctx.sessionTrashRestoring[_ctx.getSessionTrashActionKey(item)] ? _ctx.t('settings.trash.restoring') : _ctx.t('settings.trash.restore'),
|
|
6109
|
+
title: _ctx.sessionTrashRestoring[_ctx.getSessionTrashActionKey(item)] ? _ctx.t('settings.trash.restoring') : _ctx.t('settings.trash.restore')
|
|
6091
6110
|
}, [
|
|
6092
|
-
|
|
6093
|
-
|
|
6094
|
-
|
|
6095
|
-
|
|
6096
|
-
|
|
6097
|
-
|
|
6098
|
-
|
|
6099
|
-
|
|
6100
|
-
|
|
6101
|
-
|
|
6102
|
-
|
|
6103
|
-
|
|
6104
|
-
|
|
6105
|
-
|
|
6106
|
-
|
|
6107
|
-
|
|
6111
|
+
(_openBlock(), _createElementBlock("svg", {
|
|
6112
|
+
viewBox: "0 0 24 24",
|
|
6113
|
+
fill: "none",
|
|
6114
|
+
stroke: "currentColor",
|
|
6115
|
+
"stroke-width": "2"
|
|
6116
|
+
}, [
|
|
6117
|
+
_createElementVNode("path", { d: "M3 12a9 9 0 119 9" }),
|
|
6118
|
+
_createElementVNode("path", { d: "M3 4v6h6" })
|
|
6119
|
+
]))
|
|
6120
|
+
], 8 /* PROPS */, ["onClick", "disabled", "aria-label", "title"]),
|
|
6121
|
+
_createElementVNode("button", {
|
|
6122
|
+
class: "trash-action-btn delete",
|
|
6123
|
+
onClick: $event => (_ctx.purgeSessionTrash(item)),
|
|
6124
|
+
disabled: _ctx.sessionTrashLoading || _ctx.sessionTrashClearing || _ctx.isSessionTrashActionBusy(item),
|
|
6125
|
+
"aria-label": _ctx.sessionTrashPurging[_ctx.getSessionTrashActionKey(item)] ? _ctx.t('settings.trash.purging') : _ctx.t('settings.trash.purge'),
|
|
6126
|
+
title: _ctx.sessionTrashPurging[_ctx.getSessionTrashActionKey(item)] ? _ctx.t('settings.trash.purging') : _ctx.t('settings.trash.purge')
|
|
6108
6127
|
}, [
|
|
6109
|
-
|
|
6110
|
-
|
|
6111
|
-
|
|
6128
|
+
(_openBlock(), _createElementBlock("svg", {
|
|
6129
|
+
viewBox: "0 0 24 24",
|
|
6130
|
+
fill: "none",
|
|
6131
|
+
stroke: "currentColor",
|
|
6132
|
+
"stroke-width": "2"
|
|
6133
|
+
}, [
|
|
6134
|
+
_createElementVNode("path", { d: "M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2M19 6l-1 14a2 2 0 01-2 2H8a2 2 0 01-2-2L5 6M10 11v6M14 11v6" })
|
|
6135
|
+
]))
|
|
6136
|
+
], 8 /* PROPS */, ["onClick", "disabled", "aria-label", "title"])
|
|
6137
|
+
])
|
|
6112
6138
|
])
|
|
6113
|
-
])
|
|
6114
|
-
]))
|
|
6115
|
-
}), 128 /* KEYED_FRAGMENT */)),
|
|
6116
|
-
(_ctx.sessionTrashHasMoreItems)
|
|
6117
|
-
? (_openBlock(), _createElementBlock("div", {
|
|
6118
|
-
key: 0,
|
|
6119
|
-
class: "trash-list-footer"
|
|
6120
|
-
}, [
|
|
6121
|
-
_createElementVNode("button", {
|
|
6122
|
-
class: "btn-tool btn-tool-compact",
|
|
6123
|
-
onClick: _ctx.loadMoreSessionTrashItems,
|
|
6124
|
-
disabled: _ctx.sessionTrashLoading || _ctx.sessionTrashClearing
|
|
6125
|
-
}, _toDisplayString(_ctx.t('settings.trash.loadMoreItems', { count: _ctx.sessionTrashHiddenCount })), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
|
|
6126
6139
|
]))
|
|
6127
|
-
|
|
6128
|
-
|
|
6129
|
-
|
|
6140
|
+
}), 128 /* KEYED_FRAGMENT */)),
|
|
6141
|
+
(_ctx.sessionTrashHasMoreItems)
|
|
6142
|
+
? (_openBlock(), _createElementBlock("div", {
|
|
6143
|
+
key: 0,
|
|
6144
|
+
class: "trash-list-footer"
|
|
6145
|
+
}, [
|
|
6146
|
+
_createElementVNode("button", {
|
|
6147
|
+
class: "btn-tool btn-tool-compact",
|
|
6148
|
+
onClick: _ctx.loadMoreSessionTrashItems,
|
|
6149
|
+
disabled: _ctx.sessionTrashLoading || _ctx.sessionTrashClearing
|
|
6150
|
+
}, _toDisplayString(_ctx.t('settings.trash.loadMoreItems', { count: _ctx.sessionTrashHiddenCount })), 9 /* TEXT, PROPS */, ["onClick", "disabled"])
|
|
6151
|
+
]))
|
|
6152
|
+
: _createCommentVNode("v-if", true)
|
|
6153
|
+
])
|
|
6154
|
+
], 64 /* STABLE_FRAGMENT */))
|
|
6130
6155
|
]))
|
|
6131
6156
|
: _createCommentVNode("v-if", true)
|
|
6132
6157
|
], 512 /* NEED_PATCH */), [
|
|
@@ -165,6 +165,15 @@ export function switchMainTab(tab) {
|
|
|
165
165
|
) {
|
|
166
166
|
this.prepareSessionTabRender();
|
|
167
167
|
}
|
|
168
|
+
const enteringTrashTab = nextTab === 'trash';
|
|
169
|
+
const shouldLoadTrashListOnTrashEnter = enteringTrashTab
|
|
170
|
+
&& typeof this.loadSessionTrash === 'function'
|
|
171
|
+
&& this.sessionTrashEnabled !== false;
|
|
172
|
+
if (shouldLoadTrashListOnTrashEnter) {
|
|
173
|
+
this.loadSessionTrash({
|
|
174
|
+
forceRefresh: !!this.sessionTrashLoadedOnce
|
|
175
|
+
});
|
|
176
|
+
}
|
|
168
177
|
const shouldLoadTrashListOnSettingsEnter = nextTab === 'settings'
|
|
169
178
|
&& this.settingsTab === 'data'
|
|
170
179
|
&& typeof this.loadSessionTrash === 'function';
|
|
@@ -188,6 +188,7 @@
|
|
|
188
188
|
display: inline-flex;
|
|
189
189
|
align-items: center;
|
|
190
190
|
justify-content: center;
|
|
191
|
+
vertical-align: middle;
|
|
191
192
|
border-radius: var(--radius-sm);
|
|
192
193
|
border: 1px solid var(--color-border-soft);
|
|
193
194
|
background: var(--color-surface);
|
|
@@ -195,9 +196,11 @@
|
|
|
195
196
|
cursor: pointer;
|
|
196
197
|
transition: all 120ms var(--ease-spring);
|
|
197
198
|
padding: 0;
|
|
199
|
+
line-height: 0;
|
|
198
200
|
}
|
|
199
201
|
|
|
200
202
|
.trash-action-btn svg {
|
|
203
|
+
display: block;
|
|
201
204
|
width: 16px;
|
|
202
205
|
height: 16px;
|
|
203
206
|
}
|
|
@@ -329,8 +332,10 @@
|
|
|
329
332
|
display: inline-flex;
|
|
330
333
|
align-items: center;
|
|
331
334
|
justify-content: center;
|
|
335
|
+
vertical-align: middle;
|
|
332
336
|
line-height: 1;
|
|
333
337
|
white-space: nowrap;
|
|
338
|
+
|
|
334
339
|
}
|
|
335
340
|
|
|
336
341
|
.trash-item-time {
|
|
@@ -37,6 +37,15 @@
|
|
|
37
37
|
line-height: 1.5;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
.trash-disabled-state .trash-empty-svg {
|
|
41
|
+
opacity: 0.4;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.trash-disabled-state .trash-empty-title {
|
|
45
|
+
color: var(--color-text-muted);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
40
49
|
/* ---- 工具栏 — 克制·精确 ---- */
|
|
41
50
|
.trash-toolbar {
|
|
42
51
|
display: flex;
|
/package/skills/{codexmate-project-context-recovery → context-recovery}/scripts/search_sessions.py
RENAMED
|
File without changes
|