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": "View source",
"close": "Close",
"copyPath": "Copy path",
"copyName": "Copy name",
"copied": "Copied",
"truncated": "(truncated for preview)",
"size": "Size",
@@ -266,6 +267,7 @@
"saving": "Saving…",
"renameLabel": "Profile name",
"renameHint": "Click to rename",
"rename": "Rename",
"renameSuccess": "Renamed to \"{{name}}\"."
},
"explain": {
+3 -1
View File
@@ -38,7 +38,9 @@
"newButton": "New",
"viewButton": "View source",
"editButton": "Edit",
"deleteButton": "Delete"
"deleteButton": "Delete",
"copyPath": "Copy path",
"copyName": "Copy name"
},
"edit": {
"saveSuccess": "Saved · {{path}}",
+14 -1
View File
@@ -402,5 +402,18 @@
"panes.newTerminal": "New terminal",
"panes.close": "Close pane (its session keeps running as a tab)",
"panes.resize": "Resize panes",
"tabs.home": "Workspace home"
"tabs.home": "Workspace home",
"sessionMenu.open": "Open",
"sessionMenu.openSplit": "Open in split",
"sessionMenu.details": "Session details",
"sessionMenu.copyId": "Copy session ID",
"sessionMenu.archive": "Archive",
"panes.show": "Show {{name}} here",
"panes.splitNew.right": "Split right with a new terminal",
"panes.splitNew.bottom": "Split down with a new terminal",
"panes.closeShort": "Close pane",
"changes.copyPath": "Copy relative path",
"changes.viewCommit": "View commit",
"changes.copySha": "Copy commit SHA",
"changes.copySubject": "Copy commit message"
}
+3 -1
View File
@@ -64,7 +64,9 @@
"statusBar": {
"running": "{{count}} running",
"needYou": "{{count}} need you",
"today": "Today {{cost}}"
"today": "Today {{cost}}",
"workspace": "Workspace {{cost}}",
"session": "Session {{cost}}"
},
"version": "Version"
}
+2 -1
View File
@@ -146,6 +146,7 @@
"uploading": "Uploading image…",
"failed": "Could not attach the image",
"imagesOnly": "Only images can be dropped here",
"remove": "Remove image"
"remove": "Remove image",
"view": "View image"
}
}
+7 -1
View File
@@ -40,5 +40,11 @@
"transcriptNotFound": "Conversation transcript not found for this agent. The transcript file may be missing or not yet linked."
},
"remoteSourceBadgeTitle": "Collected from a remote machine",
"toolBadgeTitle": "Recorded by {{tool}}"
"toolBadgeTitle": "Recorded by {{tool}}",
"menu": {
"details": "Open session details",
"inWorkspace": "Open in its workspace",
"copyId": "Copy session ID",
"copyFolder": "Copy folder path"
}
}
+8
View File
@@ -735,5 +735,13 @@
"en": "English",
"vi": "Tiếng Việt"
}
},
"rowMenu": {
"copyHost": "Copy host",
"copyUrl": "Copy endpoint",
"copyPattern": "Copy model pattern",
"copyPath": "Copy path",
"enable": "Enable",
"disable": "Disable"
}
}