feat(app): embed indexer in Electron with file-watching service and UI refinements

Extract schema DDL into scripts/schema.sql shared between CLI and app.
  Add an in-process chokidar-based indexer-service that watches ~/.claude/projects
  for JSONL changes, debounces, and triggers background rebuilds via a worker
  thread. Rename Usage view to Activity, flesh out MemoryDetail and SubagentDetail
  views, and refine App.vue layout/routing. The main process now starts/stops the
  indexer lifecycle and notifies renderer windows on index updates.
This commit is contained in:
tommy0103
2026-06-13 03:42:01 +08:00
parent b524339d85
commit 4eec6b38c9
29 changed files with 1370 additions and 314 deletions
+6 -6
View File
@@ -59,8 +59,8 @@ function isMemoryViewActive(view) {
return state.route === 'memory' && state.view === view && state.projectFilter === 'all';
}
function isUsageActive() {
return state.route === 'usage';
function isActivityActive() {
return state.route === 'activity';
}
function isProjectActive(slug) {
@@ -73,8 +73,8 @@ function handleSidebarRoute(routeName) {
setRoute(routeName);
if (routeName === 'sessions') {
router.push('/sessions');
} else if (routeName === 'usage') {
router.push('/usage');
} else if (routeName === 'activity') {
router.push('/activity');
} else {
router.push('/memory');
}
@@ -175,7 +175,7 @@ function handleProjectSearch(e) {
<button
class="sidebar-item"
:class="{ active: isUsageActive() }"
:class="{ active: isActivityActive() }"
@click="handleSidebarRoute('usage')"
>
<span class="icon">
@@ -183,7 +183,7 @@ function handleProjectSearch(e) {
<path d="M2 13h12M4 9v4M7 6v7M10 8v5M13 4v9"/>
</svg>
</span>
<span class="label">Usage</span>
<span class="label">Activity</span>
</button>
</div>
+2 -2
View File
@@ -44,8 +44,8 @@ const breadcrumbs = computed(() => {
const m = state.memories.find(x => x.id === route.params.id);
const filename = (m?.path || '').split('/').pop();
crumbs.push({ label: filename, terminal: true, filename: true });
} else if (name === 'Usage') {
crumbs.push({ label: 'Usage', terminal: true });
} else if (name === 'Activity') {
crumbs.push({ label: 'Activity', terminal: true });
}
return crumbs;