feat: Claude Code Monitor — lanes, pipelines and a merged workspace

Internal SmartGift build of a Claude Code monitoring dashboard.

Lanes: a durable unit of parallel agent work, one per working directory,
tracked across session restarts. Managed lanes are git worktrees the
dashboard provisions and can reset or remove behind a three-check destroy
guard and a counted preflight; adopted lanes are directories you already
own and are never destroyable.

Pipelines: a lane moves through pipeline stages. A stage the agent declares
with evidence renders green; a stage inferred from the tool-event stream
renders dashed amber and never counts as done. Detection is forward-only
within a 30-minute window, and never writes the declared stage.

Workspace: one page at /run with a lane grid, the selected lane's pipeline,
and a full Claude console behind a disclosure.
This commit is contained in:
2026-07-29 17:07:45 +07:00
commit 57dc91585d
783 changed files with 221743 additions and 0 deletions
+192
View File
@@ -0,0 +1,192 @@
{
"refresh": "Refresh",
"retry": "Retry",
"cancel": "Cancel",
"export": "Export",
"loading": "Loading...",
"noData": "No data",
"total": "Total",
"active": "active",
"total_lower": "total",
"subagent": "subagent",
"subagents": "subagents",
"subagent_label_one": "{{count}} subagent",
"subagent_label_other": "{{count}} subagents",
"events": "events",
"event": "event",
"sessions": "sessions",
"session": "session",
"agents": "agents",
"agent": "agent",
"live": "Live",
"offline": "Offline",
"running": "running",
"dashboardRun": "Run",
"days": "days",
"hours": "hours",
"updated": "Updated ",
"lastUpdated": "Last updated: ",
"showMore": "Show more ({{count}} remaining)",
"plusMore": "+{{count}} more",
"ofSessions": "% of sessions",
"save": "Save",
"edit": "Edit",
"delete": "Delete",
"actions": "Actions",
"close": "Close",
"unexpectedError": "Unexpected error",
"depth": "Depth",
"type": "Type",
"statusLabel": "Status",
"status": {
"working": "Working",
"waiting": "Waiting",
"completed": "Completed",
"error": "Error",
"active": "Active",
"abandoned": "Abandoned"
},
"awaitingReason": {
"notification": {
"label": "Needs input",
"desc": "Blocked on a permission prompt or an input request — Claude can't continue until you respond."
},
"stop": {
"label": "Turn done",
"desc": "Claude finished its reply; the session is idle until you send the next prompt."
},
"session_start": {
"label": "At prompt",
"desc": "The session just started or resumed and is sitting at an empty prompt — nothing has been asked yet."
},
"interrupted": {
"label": "Interrupted",
"desc": "The last turn was interrupted (Esc or a recovered hook) — Claude is waiting for direction."
}
},
"time": {
"justNow": "just now",
"mAgo": "{{count}}m ago",
"hAgo": "{{count}}h ago",
"dAgo": "{{count}}d ago"
},
"pagination": {
"previous": "Previous",
"next": "Next",
"showing": "Showing {{from}}-{{to}} of {{total}}"
},
"token": {
"input": "Input",
"output": "Output",
"cacheRead": "Cache Read",
"cacheWrite": "Cache Write",
"totalTokens": "Total tokens"
},
"cost": {
"model": "Model",
"cost": "Cost",
"totalCost": "Total Cost",
"totalEstimatedCost": "Total Estimated Cost"
},
"duration": {
"h_m": "{{h}}h {{m}}m",
"m_s": "{{m}}m {{s}}s",
"s": "{{s}}s"
},
"eventDetail": {
"summary": "Summary",
"seeDetailsBelow": "Check below for full details in {{fields}}",
"eventId": "Event ID",
"recordedAt": "Recorded at",
"session": "Session",
"sessionId": "Session ID",
"agentId": "Agent ID",
"agent": "Agent",
"cwd": "Working directory",
"permissionMode": "Permission mode",
"toolUseId": "Tool Use ID",
"toolName": "Tool",
"toolInput": "Tool Input",
"toolResponse": "Tool Response",
"isError": "Error",
"transcriptPath": "Transcript Path",
"agentTranscriptPath": "Subagent Transcript Path",
"hookEventName": "Hook Event Name",
"stopReason": "Stop Reason",
"stopHookActive": "Stop Hook Active",
"subagentType": "Subagent Type",
"agentType": "Agent Type",
"notificationType": "Notification Type",
"message": "Message",
"prompt": "Prompt",
"model": "Model",
"reason": "Reason",
"source": "Source",
"imported": "Imported",
"type": "Type",
"timestamp": "Timestamp",
"uuid": "UUID",
"durationMs": "Duration (ms)",
"compactionNumber": "Compaction Number",
"totalCompactions": "Total Compactions",
"lastAssistantMessage": "Last Assistant Message",
"rawPayload": "Raw Payload",
"copy": "Copy",
"copied": "Copied",
"noPayload": "No payload captured for this event.",
"viewDetails": "View details",
"expand": "Expand event",
"collapse": "Collapse event"
},
"eventFilters": {
"searchPlaceholder": "Search summary, tool, payload...",
"status": "Status",
"eventType": "Event type",
"toolName": "Tool",
"agentId": "Agent",
"sessionId": "Session",
"from": "From",
"to": "To",
"clearAll": "Clear filters",
"noOptions": "No options",
"showing": "Showing {{shown}} of {{total}}",
"loadMore": "Load more",
"loading": "Loading...",
"noResults": "No events match the current filters",
"grouped": "Group by tool call",
"flat": "Flat list",
"groupEventCount_one": "{{count}} event",
"groupEventCount_other": "{{count}} events",
"help": {
"toggle": "Help",
"title": "About events, filters, and grouping",
"subtitle": "Unlock deeper insights: badges, lifecycles, and filter mechanics explained.",
"valuesTitle": "What each filter accepts",
"valueStatusDesc": "Preset shortcut that expands to event_type values (Working → PreToolUse, Completed → Stop/SubagentStop/Compaction, ...).",
"valueEventTypeDesc": "Raw event_type strings from the DB. Pulled from /api/events/facets.",
"valueToolNameDesc": "tool_name values currently in the DB (Bash, Edit, Read, Grep, mcp__... tools). Pulled from /api/events/facets.",
"valueAgentIdDesc": "Full agent UUIDs (main + subagents). Select one or more to scope to specific agents.",
"valueSessionIdDesc": "Session UUIDs. Typically you'd navigate to /sessions/:id instead, but this lets you intersect multiple sessions.",
"valueSearchDesc": "Substring match on summary, tool_name, and the raw JSON payload. Debounced 300ms.",
"valueDateRangeDesc": "ISO datetime lower/upper bounds on the event's created_at.",
"statusesTitle": "Status badges",
"statusesIntro": "Status is derived from event_type. It's what you see on each row.",
"statusWorkingDesc": "Agent started a tool call (PreToolUse). The tool is about to run.",
"statusConnectedDesc": "Tool call completed and returned a result (PostToolUse).",
"statusCompletedDesc": "Turn or lifecycle boundary (Stop, SubagentStop, Compaction).",
"statusErrorDesc": "An error was recorded (error, APIError).",
"statusIdleDesc": "Lifecycle or metadata (Notification, TurnDuration, SessionStart, SessionEnd).",
"lifecycleTitle": "Event lifecycle",
"lifecycleDesc": "A typical tool call emits two events sharing the same tool_use_id:",
"lifecycleFlow": "PreToolUse (Working) → PostToolUse (Connected) → ... → Stop (Completed)",
"filtersTitle": "How filters work",
"filterTip1": "Filters compose with AND across categories. Within one category, multi-select is OR.",
"filterTip2": "Status is a shortcut that expands to event_type values (Working → PreToolUse, Completed → Stop/SubagentStop/Compaction, ...). Status + Event type compose as OR on event_type.",
"filterTipGrouping": "Grouping tip: a grouped row needs both Pre and Post events. If you filter by Status, pick Working + Connected together to keep pairs intact - otherwise a group will only show half of the call.",
"filterTip3": "Text search matches summary, tool_name, and the raw payload (data column).",
"filterTip4": "Date range applies to each event's created_at."
}
},
"examples": "Examples",
"help": "Help"
}