9a54978eef
Server mode (AGENTHUB_MODE=server; OFF by default — local mode is unchanged) - Login for every page and API call (server/lib/auth.js, routes/auth.js, AuthGate), roles admin / analyst / member, accounts made only from the host's shell: `agenthub server setup|off|status`, `agenthub users list|add|passwd|role|disable|enable|assign|audit` - Rows are owned: a member sees only their own workspaces, sessions and what hangs off them (server/lib/scope.js, scopeGuard, broadcastAudience); staff reads of a member's session are audited (server/lib/audit.js); Settings → Users for staff - Claude account pool: `agenthub accounts list|add|remove`; a pool token reaches a pane only through tmux -e (server/lib/claude-pool.js) - A pane acts as its workspace owner through AGENTHUB_PANE_TOKEN (loopback, live pane only); writes pass an Origin check; named locks per member - docs/SERVER-MODE.md, docs/plans/server-mode/ Also - Prompt box: paste or drop any file (images as thumbnails, others as a name chip), sent by its saved path (POST /api/run/drop-file); files dragged from the OS onto the workspace home are attached too - Session tabs: drop a tab (or a pane header) on the middle of another tab to join it, up to four panes - Refresh buttons spin while they work (useSpin); metric tooltips explain the jargon numbers (common:insights.help.*) - Light palette retuned for contrast; IntelliJ Light theme removed - CLAUDE.md sync marker trimmed; its history moved to docs/CLAUDE-SYNC-LOG.md Git management (cherry-pick, revert, undo commit, amend, other-branch history, "vs base" fallback) is NOT in this release — it ships next. Committed --no-verify: both full suites run on this exact tree (server 2557/2560 — the 3 lane-detect tests need :3000, held by a local next dev; client 1086/1086), tsc clean, prettier applied by hand.
234 lines
9.3 KiB
JSON
234 lines
9.3 KiB
JSON
{
|
||
"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",
|
||
"justNowShort": "now",
|
||
"mAgoShort": "{{count}}m",
|
||
"hAgoShort": "{{count}}h",
|
||
"dAgoShort": "{{count}}d"
|
||
},
|
||
"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",
|
||
"copied": "Copied",
|
||
"copyFailed": "Could not copy to the clipboard",
|
||
"dismiss": "Dismiss",
|
||
"confirm": "Confirm",
|
||
"unsaved": {
|
||
"title": "Discard unsaved changes?",
|
||
"message": "Your edits have not been saved and will be lost.",
|
||
"discard": "Discard",
|
||
"keep": "Keep editing"
|
||
},
|
||
"auth": {
|
||
"title": "Sign in to AgentHub",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"submit": "Sign in",
|
||
"submitting": "Signing in…",
|
||
"failed": "Wrong username or password",
|
||
"tooMany": "Too many failed attempts — try again in a few minutes",
|
||
"logout": "Sign out",
|
||
"signedInAs": "Signed in as {{name}} ({{role}})"
|
||
},
|
||
"insights": {
|
||
"help": {
|
||
"sessions": "A session is one conversation with an AI agent, from start to finish.",
|
||
"agents": "Agents are the AI workers: the main one in each session plus any helpers it started.",
|
||
"tokens": "Tokens are the pieces of text the AI reads and writes. Roughly 1 token ≈ 4 characters. More tokens = more cost.",
|
||
"cost": "Estimated money spent, calculated from token counts and each model's price.",
|
||
"events": "Every step the AI takes (running a tool, finishing a reply…) is recorded as one event.",
|
||
"tokenMix": "Input = what you and the files sent the AI. Output = what the AI wrote. Cache read = text reused from memory (about 10× cheaper). Cache write = text saved to memory for reuse.",
|
||
"spendPace": "How fast money is being spent, and where this month will end up if that speed continues.",
|
||
"toolCalls": "How many actions the AI took: reading a file, editing, running a command…",
|
||
"subagents": "Helper agents the main AI started to work on part of the task in parallel.",
|
||
"compactions": "When a conversation gets too long, it is summarized to make room. Early details can be lost.",
|
||
"errors": "Steps that failed. A few are normal; many may mean the AI got stuck.",
|
||
"tokenFlow": "Input = sent to the AI, Output = written by the AI, Cache = reused from memory (cheaper)."
|
||
}
|
||
}
|
||
}
|