feat(maestro): rename a session from the web sidebar
Right-clicking a card opens a custom context menu (rename, spawn similar, kill). Rename swaps the name for an inline field; Enter commits, Escape and blur cancel. The tree stops rebuilding while the field is open, so a catalog delta cannot replace what is being typed into. Refs #125 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
bdeec6eff5
commit
43b90ccf0a
+20
-1
@@ -244,10 +244,29 @@ export interface ApiError {
|
||||
}
|
||||
|
||||
export function sessionName(s: Session): string {
|
||||
return customSessionName(s) ?? s.command;
|
||||
}
|
||||
|
||||
/** The session's own name, without the command fallback (#125): `undefined`
|
||||
* for a session that was never given one. */
|
||||
export function customSessionName(s: Session): string | undefined {
|
||||
const meta = s.metadata as Record<string, unknown>;
|
||||
const name = meta?.name;
|
||||
if (typeof name === "string" && name.length > 0) return name;
|
||||
return s.command;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/** Longest session name the daemon stores (#125), in characters. Mirrors
|
||||
* `maestro_protocol::MAX_SESSION_NAME_LEN`. */
|
||||
export const MAX_SESSION_NAME_LEN = 64;
|
||||
|
||||
/** Trim a requested session name and cap it at {@link MAX_SESSION_NAME_LEN}
|
||||
* characters. Empty means "clear the name", so the card falls back to the
|
||||
* command. Mirrors `maestro_protocol::normalize_session_name` — the daemon
|
||||
* applies the same rule, this only keeps the UI honest about what it will
|
||||
* get back. Uses the spread so the cap counts code points, not UTF-16 units. */
|
||||
export function normalizeSessionName(name: string): string {
|
||||
return [...name.trim()].slice(0, MAX_SESSION_NAME_LEN).join("");
|
||||
}
|
||||
|
||||
/** The directory a session lives in: its live `current_cwd` if the daemon has
|
||||
|
||||
Reference in New Issue
Block a user