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.
164 lines
6.2 KiB
JSON
164 lines
6.2 KiB
JSON
{
|
|
"emptyPane": "No session in this pane. Start one from the workspace's prompt box.",
|
|
"actions": {
|
|
"newSession": "New session",
|
|
"send": "Send",
|
|
"sending": "Sending…",
|
|
"start": "Run",
|
|
"starting": "Starting…",
|
|
"stop": "Stop",
|
|
"stopping": "Stopping…"
|
|
},
|
|
"autocomplete": {
|
|
"fileHint": "Type @ to reference a file",
|
|
"groupBuiltin": "Built-in (CLI only - won't run from here)",
|
|
"groupFiles": "Files in cwd",
|
|
"groupProject": "Project commands",
|
|
"groupUser": "User commands",
|
|
"noMatches": "No matches",
|
|
"slashHint": "Type / for slash commands"
|
|
},
|
|
"binary": {
|
|
"found": "Using {{path}}",
|
|
"missing": "The `{{cli}}` CLI isn't on your PATH. Install {{tool}} or set PATH so the dashboard can spawn it."
|
|
},
|
|
"concurrency": {
|
|
"active_one": "{{count}} run already in flight",
|
|
"active_other": "{{count}} runs already in flight",
|
|
"atCap": "Concurrency cap reached ({{max}}). Stop one of the running runs to start a new one.",
|
|
"viewActive": "View active runs"
|
|
},
|
|
"empty": {
|
|
"body": "Type a prompt and click Run. Output streams here as the model thinks, calls tools, and answers.",
|
|
"title": "Nothing yet"
|
|
},
|
|
"errors": {
|
|
"attachFailed": "Couldn't attach to run: {{message}}",
|
|
"cwdRequired": "Working directory required to start a run",
|
|
"laneCreateFailed": "Failed to create workspace: {{message}}",
|
|
"noLaneSelected": "No workspace selected or could not create one",
|
|
"runStartedButNotAttached": "Run is live but couldn't attach to console: {{message}}",
|
|
"sendFailed": "Couldn't send: {{message}}"
|
|
},
|
|
"events": {
|
|
"claude": "Claude",
|
|
"collapse": "Collapse",
|
|
"expand": "Expand",
|
|
"system": "System",
|
|
"thinking": "Thinking",
|
|
"tool": "Tool",
|
|
"toolResult": "Tool result",
|
|
"you": "You"
|
|
},
|
|
"fields": {
|
|
"approval": "Approval",
|
|
"approvalNever": "Never",
|
|
"approvalOnRequest": "On request",
|
|
"cwd": "Working directory",
|
|
"cwdGroups": {
|
|
"dashboard": "Dashboard server",
|
|
"home": "Home",
|
|
"repo": "Source repos",
|
|
"recent": "Recent - used by Claude Code"
|
|
},
|
|
"cwdHint": "Absolute path. Defaults to the dashboard's own cwd.",
|
|
"cwdNoMatches": "No matches. Type an absolute path to use it directly.",
|
|
"cwdPlaceholder": "Type to search or paste an absolute path…",
|
|
"effort": "Thinking effort",
|
|
"model": "Model",
|
|
"moreModels": "More models",
|
|
"effortDefault": "Default",
|
|
"effortFaster": "Faster",
|
|
"effortSmarter": "Smarter",
|
|
"effortReset": "Back to the model's default",
|
|
"effortDefaultHint": "The model decides — no --effort flag",
|
|
"modelCustom": "Custom…",
|
|
"modelCustomPlaceholder": "model id (e.g. claude-opus-5)",
|
|
"modelInheritLabel": "Inherit from settings",
|
|
"permissionAcceptEdits": "acceptEdits (file edits without asking)",
|
|
"permissionAuto": "auto (recommended - asks only for risky actions)",
|
|
"permissionBypass": "bypassPermissions (DANGER - allows everything without asking)",
|
|
"bypass": "Bypass permissions for this run",
|
|
"permissionDefault": "default (interactive prompts - sessions may hang headlessly)",
|
|
"permissionMode": "Permission mode",
|
|
"permissionPlan": "plan (read-only planning)",
|
|
"prompt": "Prompt",
|
|
"promptPlaceholder": "Ask Claude anything…",
|
|
"promptPlaceholderTerminal": "Ask {{tool}} anything…",
|
|
"sandbox": "Sandbox",
|
|
"sandboxFullAccess": "Full access (dangerous)",
|
|
"sandboxReadOnly": "Read only",
|
|
"sandboxWorkspaceWrite": "Workspace write"
|
|
},
|
|
"footer": {
|
|
"cost": "Cost",
|
|
"duration": "Duration",
|
|
"exitCode": "Exit code",
|
|
"sessionId": "Session ID",
|
|
"turns": "Turns"
|
|
},
|
|
"hint": {
|
|
"headlessExplain": "Headless mode is best for scripted tasks where you know exactly what you want. The session can't ask follow-up questions and will hang on permission prompts unless you stay in acceptEdits.",
|
|
"permissionWarning": "bypassPermissions allows ALL tool invocations without confirming. Only use for trusted prompts.",
|
|
"bypassWarning": "{{tool}} will run every command and edit every file without asking. Only for a prompt and a folder you trust.",
|
|
"sandboxWarning": "Codex will run commands with no sandbox.",
|
|
"shortcut": "Enter to send · Shift+Enter for newline"
|
|
},
|
|
"mode": {
|
|
"conversation": "Conversation",
|
|
"conversationHint": "Multi-turn - keep typing follow-ups while the agent works.",
|
|
"headless": "One-shot",
|
|
"headlessHint": "Single prompt, single response. Stdin closes after spawn.",
|
|
"label": "Mode"
|
|
},
|
|
"resume": {
|
|
"clear": "Clear selection",
|
|
"freshHint": "Start a fresh Claude Code session.",
|
|
"freshOption": "New session",
|
|
"label": "Source session",
|
|
"lastOption": "Resume last session",
|
|
"noSessions": "No sessions found.",
|
|
"originalCwd": "Original cwd",
|
|
"pickSession": "Pick a session…",
|
|
"preview": "Last activity",
|
|
"resumeHint": "Pick a session from your history and continue the conversation. Cwd is locked to the original.",
|
|
"search": "Search by ID, cwd, or status…",
|
|
"selectedBadge": "Resuming"
|
|
},
|
|
"statusHeader": {
|
|
"cwd": "Cwd",
|
|
"duration": "Elapsed",
|
|
"effort": "Effort",
|
|
"envelopes": "Events",
|
|
"model": "Model",
|
|
"permissionMode": "Mode",
|
|
"session": "Session"
|
|
},
|
|
"tokens": {
|
|
"cacheRead": "Cache hit",
|
|
"cost": "Cost",
|
|
"input": "Input",
|
|
"label": "Context",
|
|
"output": "Output"
|
|
},
|
|
"drop": {
|
|
"hint": "Drop files or images to attach",
|
|
"uploading": "Uploading…",
|
|
"failed": "Could not attach the file",
|
|
"remove": "Remove attachment",
|
|
"view": "View image"
|
|
},
|
|
"terminal": {
|
|
"ended": "[session ended, exit code {{code}}]",
|
|
"reconnecting": "Reconnecting… keystrokes are not reaching the session until the terminal is back.",
|
|
"keyboardHint": "Terminal. Press Ctrl+M to toggle whether Tab moves focus out of the terminal; Ctrl+Shift+F (Cmd+F on macOS) finds text.",
|
|
"tabMoves": "Tab moves focus — Ctrl+M to give Tab back to the terminal",
|
|
"selectHint": "Shift+drag to select text in the browser; a plain drag selects in tmux and copies on release.",
|
|
"dismissHint": "Dismiss",
|
|
"find": "Find in terminal",
|
|
"findPrev": "Previous match",
|
|
"findNext": "Next match",
|
|
"findClose": "Close find"
|
|
}
|
|
}
|