feat: right-click menus everywhere, workspace/session cost, long-term DB safety

Right-click menus: one portal shell (components/ContextMenu.tsx) for every
item with actions - sidebar/Recents/archived session rows (SessionMenu),
console tabs, pane headers, the Changes panel's files/tree/commits, the
workspace home, sessions outside a workspace (SessionRowMenu: Sessions
table, Dashboard, Activity, Workflow runs), prompt images, every Settings
list and every Claude Code/Codex config list (FileItemMenu). Buttons stay;
a delete keeps its button's confirm; the shell stops portal clicks from
reaching the card that opened it.

Status bar: Workspace $ and Session $ on the Workspace page, from
?lane= on GET /api/pricing/cost and the focused/replayed session's cost.

Database, no data dropped: synchronous=NORMAL, journal_size_limit 64 MB,
hourly PASSIVE checkpoint + PRAGMA optimize, idx_events_session_created
(replacing the redundant idx_events_session), watchdog reads
sessions.transcript_path, transcript parsed before the hook's write
transaction, GET /api/sessions/:id?events=0 for the web page (reloads only
on its own session, debounced), streamed export, transactional clear-data
and chunked cleanup, subagent import reads tool_use_ids once, runtime logs
rotated past 5 MB.
This commit is contained in:
2026-10-05 09:37:48 +07:00
parent 65fe680d38
commit ad6e80192d
80 changed files with 2914 additions and 489 deletions
+2
View File
@@ -44,6 +44,7 @@
"viewSource": "Xem nguồn",
"close": "Đóng",
"copyPath": "Sao chép đường dẫn",
"copyName": "Sao chép tên",
"copied": "Đã sao chép",
"truncated": "(đã cắt bớt để xem trước)",
"size": "Kích thước",
@@ -261,6 +262,7 @@
"saving": "Đang lưu…",
"renameLabel": "Tên profile",
"renameHint": "Bấm để đổi tên",
"rename": "Đổi tên",
"renameSuccess": "Đã đổi tên thành \"{{name}}\"."
},
"explain": {
+3 -1
View File
@@ -38,7 +38,9 @@
"newButton": "Mới",
"viewButton": "Xem nguồn",
"editButton": "Sửa",
"deleteButton": "Xóa"
"deleteButton": "Xóa",
"copyPath": "Sao chép đường dẫn",
"copyName": "Sao chép tên"
},
"edit": {
"saveSuccess": "Đã lưu · {{path}}",
+14 -1
View File
@@ -402,5 +402,18 @@
"panes.newTerminal": "Terminal mới",
"panes.close": "Đóng pane (session vẫn chạy dưới dạng tab)",
"panes.resize": "Đổi kích thước pane",
"tabs.home": "Trang chủ workspace"
"tabs.home": "Trang chủ workspace",
"sessionMenu.open": "Mở",
"sessionMenu.openSplit": "Mở ở pane chia đôi",
"sessionMenu.details": "Chi tiết session",
"sessionMenu.copyId": "Sao chép ID session",
"sessionMenu.archive": "Lưu trữ",
"panes.show": "Hiện {{name}} ở đây",
"panes.splitNew.right": "Chia sang phải với terminal mới",
"panes.splitNew.bottom": "Chia xuống dưới với terminal mới",
"panes.closeShort": "Đóng pane",
"changes.copyPath": "Sao chép đường dẫn tương đối",
"changes.viewCommit": "Xem commit",
"changes.copySha": "Sao chép SHA của commit",
"changes.copySubject": "Sao chép commit message"
}
+3 -1
View File
@@ -64,7 +64,9 @@
"statusBar": {
"running": "{{count}} đang chạy",
"needYou": "{{count}} cần bạn",
"today": "Hôm nay {{cost}}"
"today": "Hôm nay {{cost}}",
"workspace": "Workspace {{cost}}",
"session": "Session {{cost}}"
},
"version": "Phiên bản"
}
+2 -1
View File
@@ -145,6 +145,7 @@
"uploading": "Đang tải ảnh lên…",
"failed": "Không đính kèm được ảnh",
"imagesOnly": "Chỉ thả được ảnh vào đây",
"remove": "Bỏ ảnh"
"remove": "Bỏ ảnh",
"view": "Xem ảnh"
}
}
+7 -1
View File
@@ -39,5 +39,11 @@
"timeline": "Dòng thời gian ({{shown}}/{{total}})",
"transcriptNotFound": "Không tìm thấy bản ghi hội thoại cho agent này. Tệp transcript có thể bị thiếu hoặc chưa được liên kết."
},
"toolBadgeTitle": "Ghi lại bởi {{tool}}"
"toolBadgeTitle": "Ghi lại bởi {{tool}}",
"menu": {
"details": "Mở chi tiết session",
"inWorkspace": "Mở trong workspace của nó",
"copyId": "Sao chép ID session",
"copyFolder": "Sao chép đường dẫn thư mục"
}
}
+8
View File
@@ -735,5 +735,13 @@
"en": "English",
"vi": "Tiếng Việt"
}
},
"rowMenu": {
"copyHost": "Sao chép host",
"copyUrl": "Sao chép endpoint",
"copyPattern": "Sao chép mẫu mô hình",
"copyPath": "Sao chép đường dẫn",
"enable": "Bật",
"disable": "Tắt"
}
}