From 243311d2d806be1a37ed22aa9012099707b52b97 Mon Sep 17 00:00:00 2001 From: Comradery64 Date: Fri, 30 Oct 2026 20:18:42 -0700 Subject: [PATCH] Add durable agent runs and cross-provider Runs screen --- docs/agent-runs.md | 15 + frontend/src/App.tsx | 3 +- frontend/src/api/client.ts | 2 + frontend/src/api/types.ts | 22 ++ frontend/src/components/Runs.css | 26 ++ frontend/src/components/Runs.tsx | 97 +++++++ frontend/src/components/Sidebar/Sidebar.tsx | 5 + .../src/components/__tests__/Runs.test.tsx | 50 ++++ frontend/src/router.ts | 3 +- src/agent_decoder/agent_runs.py | 266 +++++++++++++++++ src/agent_decoder/db.py | 20 ++ src/agent_decoder/driver_manager.py | 3 + src/agent_decoder/execution_manager.py | 252 +++++++++++++++- src/agent_decoder/pty_runner.py | 3 + src/agent_decoder/server.py | 27 ++ ...CIwhZsnY.js => ArtifactsPanel-D-CqWycU.js} | 2 +- ...tView-D7j0LMdO.js => ChatView-CFunVM15.js} | 2 +- .../static/assets/Dashboard-CBe8ZXJ-.js | 1 + .../static/assets/Dashboard-CNB-enER.js | 1 - ...wer-Cl35TR1y.js => FileViewer-CVtveC8R.js} | 2 +- ...opup-sd9kGRO6.js => HelpPopup-BYhBIvA6.js} | 2 +- .../static/assets/Runs-DvLUpR9O.js | 1 + .../static/assets/Runs-Y8oF-gxW.css | 1 + .../static/assets/SearchOverlay-CF4dXG6x.js | 1 + .../static/assets/SearchOverlay-DUxwGmGf.js | 1 - ...em-CYxoPLdi.js => SessionItem-BUejVuL5.js} | 2 +- ...-EAS0zTjU.js => SettingsModal-DWSMRQmn.js} | 2 +- ...B7lbUh3m.js => ShortcutsPopup-Df9bhfs6.js} | 2 +- .../static/assets/Sidebar-CJcwJziw.js | 1 + .../static/assets/Sidebar-mcMKZmEW.js | 1 - .../static/assets/index-Egnd1H3-.js | 5 - .../static/assets/index-XPrlVfCr.js | 5 + .../static/assets/renderSnippet-B37VxZaL.js | 1 - .../static/assets/renderSnippet-CcNMfZRd.js | 1 + .../static/assets/useDebounce-CRtjXm0i.js | 1 + ...yJI-iv.js => useSessionDetail-D4HneaxZ.js} | 2 +- src/agent_decoder/static/index.html | 2 +- tests/test_agent_runs.py | 272 ++++++++++++++++++ tests/test_execution_manager.py | 117 ++++++++ tests/test_server_capabilities.py | 6 +- 40 files changed, 1201 insertions(+), 27 deletions(-) create mode 100644 docs/agent-runs.md create mode 100644 frontend/src/components/Runs.css create mode 100644 frontend/src/components/Runs.tsx create mode 100644 frontend/src/components/__tests__/Runs.test.tsx create mode 100644 src/agent_decoder/agent_runs.py rename src/agent_decoder/static/assets/{ArtifactsPanel-CIwhZsnY.js => ArtifactsPanel-D-CqWycU.js} (97%) rename src/agent_decoder/static/assets/{ChatView-D7j0LMdO.js => ChatView-CFunVM15.js} (99%) create mode 100644 src/agent_decoder/static/assets/Dashboard-CBe8ZXJ-.js delete mode 100644 src/agent_decoder/static/assets/Dashboard-CNB-enER.js rename src/agent_decoder/static/assets/{FileViewer-Cl35TR1y.js => FileViewer-CVtveC8R.js} (99%) rename src/agent_decoder/static/assets/{HelpPopup-sd9kGRO6.js => HelpPopup-BYhBIvA6.js} (97%) create mode 100644 src/agent_decoder/static/assets/Runs-DvLUpR9O.js create mode 100644 src/agent_decoder/static/assets/Runs-Y8oF-gxW.css create mode 100644 src/agent_decoder/static/assets/SearchOverlay-CF4dXG6x.js delete mode 100644 src/agent_decoder/static/assets/SearchOverlay-DUxwGmGf.js rename src/agent_decoder/static/assets/{SessionItem-CYxoPLdi.js => SessionItem-BUejVuL5.js} (99%) rename src/agent_decoder/static/assets/{SettingsModal-EAS0zTjU.js => SettingsModal-DWSMRQmn.js} (99%) rename src/agent_decoder/static/assets/{ShortcutsPopup-B7lbUh3m.js => ShortcutsPopup-Df9bhfs6.js} (97%) create mode 100644 src/agent_decoder/static/assets/Sidebar-CJcwJziw.js delete mode 100644 src/agent_decoder/static/assets/Sidebar-mcMKZmEW.js delete mode 100644 src/agent_decoder/static/assets/index-Egnd1H3-.js create mode 100644 src/agent_decoder/static/assets/index-XPrlVfCr.js delete mode 100644 src/agent_decoder/static/assets/renderSnippet-B37VxZaL.js create mode 100644 src/agent_decoder/static/assets/renderSnippet-CcNMfZRd.js create mode 100644 src/agent_decoder/static/assets/useDebounce-CRtjXm0i.js rename src/agent_decoder/static/assets/{useSessionDetail-BayJI-iv.js => useSessionDetail-D4HneaxZ.js} (92%) create mode 100644 tests/test_agent_runs.py diff --git a/docs/agent-runs.md b/docs/agent-runs.md new file mode 100644 index 00000000..4760ac7d --- /dev/null +++ b/docs/agent-runs.md @@ -0,0 +1,15 @@ +# Managed runs + +Open **Runs** in the sidebar (`#/runs`) to inspect managed Claude and Codex execution attempts. Search across session ID, directory, project, model and branch; filter by provider, state or exact project ID. Results use pages of 50. A run detail URL loads independently of the current page. Source links open the existing chat with its Decoded / Native controls; missing indexed chats retain their run history and show an unavailable-source explanation. + +A run represents **one managed process attempt**, spanning multiple prompts. It is not a task or an individual conversation turn. Historical indexed sessions do not become runs until managed execution is requested. Native rollout adoption changes the session ID while keeping the attempt ID. Reattaching to a verified surviving tmux process also keeps the attempt ID. A replaced or confirmed-absent process closes the old attempt with an unknown outcome (`blocked`, with `ended_at`) and creates a fresh attempt. Terminal records cannot be updated by later observations. + +States are `queued`, `starting`, `running`, `awaiting_input`, `blocked`, `completed`, `failed`, and `canceled`. Launch begins at `starting`; an attached transport remains `blocked` pending screen evidence. Successful decoded submission or native Enter records `running` with explicit input provenance. Native Enter does not prove what command was entered. Provider screen observations may indicate `awaiting_input`, `running`, or `blocked`, but are advisory: Claude's classifier defaults to idle, and native prompts are not reliable completion signals. Last-observed timestamps reflect real attach, input or screen observations, not a fabricated heartbeat. Old observations can be stale even if a transport remains attached. + +Explicit termination records `canceled` after the termination operation returns. Confirmed launch failure records `failed`. A capture/attach failure with a verified surviving pane leaves an active, recoverable `blocked` attempt. Disconnect or server restart marks an attempt `blocked` with an unobserved/detached explanation. Shutdown detaches tmux attempts; direct PTY shutdown closes an unknown-outcome attempt because its process is terminated. No prompt, idle screen, process exit (including exit 0), or disconnect records successful completion. There is deliberately no “finish” operation: this slice does not infer or automate task outcomes. `completed` and `queued` are contract foundations for later explicit outcome/queue features. + +The `agent_runs` SQLite table is independent of the rebuildable session index and has no cascading foreign key. Source indexing fills missing metadata while preserving recorded execution model/context. `task_id` and `parent_run_id` are explicitly nullable foundations; no task management, queue launch, or approval automation is implemented. + +`GET /api/runs` returns typed `AgentRun[]`; optional `provider`, `state`, `project`, and `q` filters apply before `limit` (1–500, default 200) and `offset`. `GET /api/runs/{run_id}` returns one record or 404. Both endpoints only inspect durable records and indexed metadata; they never start providers or claim execution locks. + +The execution manager writes lifecycle records before publishing `runs_changed` SSE notifications. Screen observations enter a manager-owned buffer directly from provider policy, rather than through a lossy SSE subscriber; the latest advisory observation is persisted every two seconds. The UI refreshes on confirmed-write notifications/reconnect and every 15 seconds to recover missed notifications. This is current-state history, not a complete event audit log. A partial unique index and immediate SQLite transaction prevent duplicate active attempts for a provider/session across independent store instances. Execution lifecycle operations and observation writes are serialized by the shared manager. diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 0ed006f3..862b7140 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -34,6 +34,7 @@ const settingsModalImport = () => import("./components/Settings/SettingsModal"); // render a reload prompt in-place instead of crashing the whole ErrorBoundary. const Sidebar = lazyWithRetry(() => import("./components/Sidebar/Sidebar")); const ChatView = lazyWithRetry(chatViewImport); +const Runs = lazyWithRetry(() => import("./components/Runs")); const Dashboard = lazyWithRetry(() => import("./components/Dashboard/Dashboard")); const SettingsModal = lazyWithRetry(settingsModalImport); const SearchOverlay = lazyWithRetry(searchOverlayImport); @@ -332,7 +333,7 @@ export default function App() {
- {chatIdFromUrl ? : } + {route.startsWith("/runs") ? : chatIdFromUrl ? : }
{chatIdFromUrl && ( diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index e7a84b96..2ffc3447 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -137,6 +137,8 @@ function patch(path: string, body: unknown): Promise { } export const api = { + getRuns: (params = "") => get(`/api/runs${params}`), + getRun: (id: string) => get(`/api/runs/${encodeURIComponent(id)}`), getProjects: () => get("/api/projects"), getProjectSessions: (projectId: string) => get(`/api/projects/${encodeURIComponent(projectId)}/sessions`), diff --git a/frontend/src/api/types.ts b/frontend/src/api/types.ts index ce7e8966..eed12317 100644 --- a/frontend/src/api/types.ts +++ b/frontend/src/api/types.ts @@ -591,3 +591,25 @@ export interface DashboardData { total_messages: number; tips: DashboardTip[]; } + +/** A managed execution attempt; independent of indexed session lifetime. */ +export interface AgentRun { + id: string; + provider: string; + native_session_id: string; + model: string | null; + project_id: string | null; + cwd: string | null; + git_branch: string | null; + is_worktree: boolean; + task_id: string | null; + parent_run_id: string | null; + state: "queued" | "starting" | "running" | "awaiting_input" | "blocked" | "completed" | "failed" | "canceled"; + reason: string; + provenance: string; + created_at: string; + updated_at: string; + last_observed_at: string | null; + ended_at: string | null; + source_available: boolean; +} diff --git a/frontend/src/components/Runs.css b/frontend/src/components/Runs.css new file mode 100644 index 00000000..355cc26c --- /dev/null +++ b/frontend/src/components/Runs.css @@ -0,0 +1,26 @@ +.runs-page { padding: 28px; overflow: auto; flex: 1; min-width: 0; color: var(--text-primary); font-family: var(--font-ui); } +.runs-page header, .runs-filters, .runs-list, .runs-pagination, .run-detail { max-width: 1100px; margin-inline: auto; } +.runs-page header p, .run-muted, .runs-page small, .run-detail dt { color: var(--text-secondary); } +.runs-page h1 { font-size: 26px; margin-top: 0; } +.runs-page h2 { font-size: 18px; margin: 0; } +.runs-page p { line-height: 1.5; } +.runs-page a { color: var(--text-accent); text-underline-offset: 3px; } +.runs-filters { display: flex; align-items: end; gap: 12px; flex-wrap: wrap; margin-block: 24px; } +.runs-filters label { display: grid; gap: 6px; flex: 1 1 140px; font-size: 12px; } +.runs-page input, .runs-page select, .runs-page button { font: inherit; color: var(--text-primary); background: var(--bg-input); border: 1px solid var(--border-default); border-radius: var(--radius-sm); padding: 8px 10px; min-height: 36px; min-width: 0; } +.runs-page input, .runs-page select { width: 100%; box-sizing: border-box; } +.runs-page button { cursor: pointer; } +.runs-page button:hover:not(:disabled) { background: var(--bg-sidebar-hover); } +.runs-page button:disabled { opacity: .45; cursor: default; } +.runs-page :focus-visible { outline: 2px solid var(--border-accent); outline-offset: 2px; } +.runs-list { display: grid; gap: 12px; } +.run-card { border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 18px; overflow-wrap: anywhere; background: var(--bg-base); } +.run-card-title { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; } +.run-state { font-size: 12px; border: 1px solid var(--border-default); padding: 3px 8px; border-radius: 20px; } +.run-state-blocked, .run-state-failed { color: var(--tool-error-text); } +.run-detail { box-sizing: border-box; margin-bottom: 20px; } +.run-detail dl { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px 24px; } +.run-detail dt { font-size: 12px; margin-bottom: 4px; } +.run-detail dd { margin: 0; font-size: 13px; } +.runs-pagination { display: flex; align-items: center; justify-content: center; gap: 16px; padding-block: 20px; } +@media (max-width: 600px) { .runs-page { padding: 16px; } .run-card { padding: 14px; } .run-detail dl { grid-template-columns: 1fr; } } diff --git a/frontend/src/components/Runs.tsx b/frontend/src/components/Runs.tsx new file mode 100644 index 00000000..397ed8a7 --- /dev/null +++ b/frontend/src/components/Runs.tsx @@ -0,0 +1,97 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { api } from "../api/client"; +import type { AgentRun } from "../api/types"; +import { navigateTo, useRoute } from "../router"; +import { useDebounce } from "../utils/useDebounce"; +import "./Runs.css"; + +const states = ["queued", "starting", "running", "awaiting_input", "blocked", "completed", "failed", "canceled"]; +const time = (value: string | null) => value ? new Date(value).toLocaleString() : "Not yet observed"; +const label = (value: string) => value.replace(/_/g, " "); +const observation = (run: AgentRun) => !run.last_observed_at ? "—" : `${time(run.last_observed_at)}${!run.ended_at && Date.now() - Date.parse(run.last_observed_at) > 30000 ? " (stale)" : ""}`; + +export default function Runs() { + const route = useRoute(); + const runId = route.startsWith("/runs/") ? route.slice(6) : null; + const [detail, setDetail] = useState(null); + const [detailMissing, setDetailMissing] = useState(false); + const [page, setPage] = useState(0); + const [runs, setRuns] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(""); + const [search, setSearch] = useState(""); + const query = useDebounce(search, 200); + const [provider, setProvider] = useState(""); + const [state, setState] = useState(""); + const [project, setProject] = useState(""); + const projectQuery = useDebounce(project, 200); + const generation = useRef(0); + const refresh = useCallback(async () => { + const request = ++generation.current; + const params = new URLSearchParams({ provider, state, project: projectQuery, q: query, limit: "50", offset: String(page * 50) }); + try { + const rows = await api.getRuns(`?${params}`); + let selected: AgentRun | null = null; + let missing = false; + if (runId) { + try { selected = await api.getRun(runId); } + catch (e) { if (e instanceof Error && e.message.includes("404")) missing = true; else throw e; } + } + if (request !== generation.current) return; + setRuns(rows); setDetail(selected); setDetailMissing(missing); setError(""); + } catch (e) { + if (request === generation.current) setError(e instanceof Error ? e.message : "Could not load runs"); + } finally { if (request === generation.current) setLoading(false); } + }, [provider, state, projectQuery, query, page, runId]); + useEffect(() => { + setLoading(true); + void refresh(); + const events = new EventSource("/api/events"); + events.onmessage = (event) => { + try { if (["runs_changed", "refresh"].includes(JSON.parse(event.data).type)) void refresh(); } catch { /* ignore malformed event */ } + }; + events.onopen = () => void refresh(); + const timer = window.setInterval(() => void refresh(), 15000); + return () => { ++generation.current; events.close(); window.clearInterval(timer); }; + }, [refresh]); + const filtered = !!(provider || state || project || search || page); + return
+

Runs

Execution history across Claude and Codex.

+
+ + + + + +
+ {error &&

{error}

} + {loading ?

Loading runs…

: <> + {runId && (detail ? : detailMissing ?

Run not found. View all runs

: null)} + {!error && !runs.length &&

{filtered ? "No runs match these filters." : "No managed runs yet. Open a session and attach its managed terminal to create a run. Historical chats are not automatically live runs."}

} +
{runs.map((run) =>
+ +

{run.project_id || run.cwd || "Project unknown"} · {run.git_branch || "Branch unknown"}{run.is_worktree ? " · Worktree" : ""}

+

{run.reason}

+ Started {time(run.created_at)} · Last observed {observation(run)} +

+
)}
+ + } +
; +} + +function SourceLink({ run }: { run: AgentRun }) { + return run.source_available ? Open decoded chat / native terminal : Source chat unavailable; run history retained; +} + +function RunDetail({ run }: { run: AgentRun }) { + const values = { "Run ID": run.id, "Native session": run.native_session_id, State: label(run.state), Reason: run.reason, + "State evidence": run.provenance, Provider: run.provider, Model: run.model || "Unknown", Project: run.project_id || "Unknown", Directory: run.cwd || "Unknown", Branch: run.git_branch || "Unknown", + Worktree: run.is_worktree ? "Yes" : "No", Created: time(run.created_at), Updated: time(run.updated_at), "Last observed": observation(run), Ended: run.ended_at ? time(run.ended_at) : "No ending recorded", Task: run.task_id || "Not linked", "Parent run": run.parent_run_id || "Not linked" }; + return
+

Run details

+
{Object.entries(values).map(([key, value]) =>
{key}
{value}
)}
+

+ {!run.ended_at &&

An idle prompt or process exit does not establish task success. Live state is best-effort. Check the last observation time; restart or transport loss may leave this attempt detached or unobserved.

} +
; +} diff --git a/frontend/src/components/Sidebar/Sidebar.tsx b/frontend/src/components/Sidebar/Sidebar.tsx index bb06df7a..094252d0 100644 --- a/frontend/src/components/Sidebar/Sidebar.tsx +++ b/frontend/src/components/Sidebar/Sidebar.tsx @@ -33,6 +33,10 @@ function IconSearch() { ); } +function IconRuns() { + return ; +} + function IconChats() { return ( @@ -931,6 +935,7 @@ export default function Sidebar() { {/* Nav items */}
+ } label="Runs" onClick={() => navigateTo("/runs")} /> } label="Search" shortcut="⌘K" onClick={openSearch} /> {/* Starred section — only shown when there are starred sessions */} diff --git a/frontend/src/components/__tests__/Runs.test.tsx b/frontend/src/components/__tests__/Runs.test.tsx new file mode 100644 index 00000000..b95f32c5 --- /dev/null +++ b/frontend/src/components/__tests__/Runs.test.tsx @@ -0,0 +1,50 @@ +import { beforeEach, afterEach, describe, it, expect, vi } from "vitest"; +import { render, screen, waitFor, fireEvent, cleanup, act } from "@testing-library/react"; +import Runs from "../Runs"; +import { api } from "../../api/client"; +import type { AgentRun } from "../../api/types"; +vi.mock("../../api/client", () => ({ api: { getRuns: vi.fn(), getRun: vi.fn() } })); +const row: AgentRun = { id: "run-1", native_session_id: "session-1", provider: "codex", model: "test-model", project_id: "project-1", cwd: "/tmp/project", git_branch: "feature", is_worktree: true, task_id: null, parent_run_id: null, state: "blocked", reason: "Transport detached; outcome unknown", provenance: "transport_unobserved", created_at: "2026-10-30T12:00:00Z", updated_at: "2026-10-30T12:00:00Z", last_observed_at: null, ended_at: null, source_available: false }; +class Events { static latest: Events; onmessage: ((e: { data: string }) => void) | null = null; onopen: (() => void) | null = null; close = vi.fn(); constructor() { Events.latest = this; } } +beforeEach(() => { vi.stubGlobal("EventSource", Events); vi.mocked(api.getRuns).mockReset().mockResolvedValue([row]); vi.mocked(api.getRun).mockReset().mockResolvedValue(row); window.location.hash = "#/runs"; }); +afterEach(() => { cleanup(); vi.unstubAllGlobals(); }); +describe("Runs", () => { + it("shows loading, retained missing-source history and explicit uncertainty", async () => { + render(); + expect(screen.getByRole("status")).toHaveTextContent("Loading runs"); + expect(await screen.findByText("codex · test-model")).toBeInTheDocument(); + expect(screen.getByText(/Source chat unavailable/)).toBeInTheDocument(); + expect(screen.queryByRole("link", { name: /Open decoded/ })).not.toBeInTheDocument(); + expect(screen.getByText(row.reason)).toBeInTheDocument(); + }); + it("loads deep-link detail outside the current page and follows browser navigation", async () => { + window.location.hash = "#/runs/run-1"; + vi.mocked(api.getRuns).mockResolvedValue([]); + render(); + expect(await screen.findByRole("region", { name: "Run details" })).toBeInTheDocument(); + expect(api.getRun).toHaveBeenCalledWith("run-1"); + act(() => { window.location.hash = "#/runs"; window.dispatchEvent(new HashChangeEvent("hashchange")); }); + await waitFor(() => expect(screen.queryByRole("region", { name: "Run details" })).not.toBeInTheDocument()); + }); + it("recovers from an API error using Retry and shows empty history", async () => { + vi.mocked(api.getRuns).mockRejectedValueOnce(new Error("offline")); + render(); + expect(await screen.findByRole("alert")).toHaveTextContent("offline"); + vi.mocked(api.getRuns).mockResolvedValue([]); + fireEvent.click(screen.getByRole("button", { name: "Retry" })); + expect(await screen.findByText(/No managed runs yet/)).toBeInTheDocument(); + }); + it("uses server filters, paging and confirmed-write SSE refresh", async () => { + vi.mocked(api.getRuns).mockResolvedValue(Array.from({ length: 50 }, (_, i) => ({ ...row, id: `run-${i}` }))); + render(); + await screen.findByText("Page 1"); + fireEvent.click(screen.getByRole("button", { name: "Next" })); + await waitFor(() => expect(vi.mocked(api.getRuns).mock.lastCall?.[0]).toContain("offset=50")); + fireEvent.change(screen.getByLabelText("Provider"), { target: { value: "claude" } }); + await waitFor(() => expect(vi.mocked(api.getRuns).mock.lastCall?.[0]).toContain("provider=claude")); + expect(vi.mocked(api.getRuns).mock.lastCall?.[0]).toContain("offset=0"); + const count = vi.mocked(api.getRuns).mock.calls.length; + act(() => Events.latest.onmessage?.({ data: JSON.stringify({ type: "runs_changed" }) })); + await waitFor(() => expect(api.getRuns).toHaveBeenCalledTimes(count + 1)); + }); +}); diff --git a/frontend/src/router.ts b/frontend/src/router.ts index 2adfd54b..2f227acc 100644 --- a/frontend/src/router.ts +++ b/frontend/src/router.ts @@ -1,9 +1,10 @@ import { useEffect, useState } from "react"; -export type AppRoute = "/" | `/chat/${string}`; +export type AppRoute = "/" | "/runs" | `/runs/${string}` | `/chat/${string}`; function parseHash(): AppRoute { const h = window.location.hash.replace(/^#/, "") || "/"; + if (h === "/runs" || h.startsWith("/runs/")) return h as AppRoute; if (h.startsWith("/chat/")) { const id = h.slice("/chat/".length); if (id) return `/chat/${id}`; diff --git a/src/agent_decoder/agent_runs.py b/src/agent_decoder/agent_runs.py new file mode 100644 index 00000000..09c11acf --- /dev/null +++ b/src/agent_decoder/agent_runs.py @@ -0,0 +1,266 @@ +"""Durable managed execution attempts, independent of the session index. + +A run is one managed process attempt, not a turn or a task. No screen or exit +code establishes successful completion. Detached attempts retain their identity. +""" + +from __future__ import annotations + +import asyncio +from datetime import datetime, timezone +from pathlib import Path +from typing import Literal +from uuid import uuid4 + +import aiosqlite +from pydantic import BaseModel + +RunState = Literal[ + "queued", + "starting", + "running", + "awaiting_input", + "blocked", + "completed", + "failed", + "canceled", +] +TERMINAL = ("completed", "failed", "canceled") + + +RUN_SCHEMA = """ + CREATE TABLE IF NOT EXISTS agent_runs ( + id TEXT PRIMARY KEY, provider TEXT NOT NULL, + native_session_id TEXT NOT NULL, model TEXT, project_id TEXT, + cwd TEXT, git_branch TEXT, is_worktree INTEGER NOT NULL DEFAULT 0, + task_id TEXT, parent_run_id TEXT, state TEXT NOT NULL CHECK(state IN ('queued','starting','running','awaiting_input','blocked','completed','failed','canceled')), + reason TEXT NOT NULL, provenance TEXT NOT NULL, + created_at TEXT NOT NULL, updated_at TEXT NOT NULL, + last_observed_at TEXT, ended_at TEXT); + CREATE UNIQUE INDEX IF NOT EXISTS agent_runs_active + ON agent_runs(provider, native_session_id) + WHERE ended_at IS NULL; + """ + + +def now() -> str: + return datetime.now(timezone.utc).isoformat() + + +class AgentRun(BaseModel): + id: str + provider: str + native_session_id: str + model: str | None = None + project_id: str | None = None + cwd: str | None = None + git_branch: str | None = None + is_worktree: bool = False + task_id: str | None = None + parent_run_id: str | None = None + state: RunState + reason: str + provenance: str + created_at: str + updated_at: str + last_observed_at: str | None = None + ended_at: str | None = None + source_available: bool = False + + +class RunStore: + def __init__(self, path: Path | None, bus=None): + self.path, self.bus = path, bus + self.lock = asyncio.Lock() + + async def initialize(self): + if self.path is None: + return + async with aiosqlite.connect(self.path) as db: + await db.executescript(RUN_SCHEMA) + await db.execute( + "UPDATE agent_runs SET state='blocked', reason='Server restarted; process not yet reobserved', provenance='server_restart', updated_at=? WHERE ended_at IS NULL", + (now(),), + ) + await db.commit() + + async def list( + self, + *, + limit: int = 200, + offset: int = 0, + active_only: bool = False, + session_id: str | None = None, + run_id: str | None = None, + provider: str | None = None, + state: str | None = None, + project: str | None = None, + q: str = "", + ) -> list[AgentRun]: + if self.path is None: + return [] + async with aiosqlite.connect(self.path) as db: + db.row_factory = aiosqlite.Row + clauses, params = [], [] + if active_only: + clauses.append("r.ended_at IS NULL") + if session_id is not None: + clauses.append("r.native_session_id=?") + params.append(session_id) + if run_id is not None: + clauses.append("r.id=?") + params.append(run_id) + for column, value in ( + ("provider", provider), + ("state", state), + ("project_id", project), + ): + if value: + clauses.append(f"r.{column}=?") + params.append(value) + if q: + clauses.append( + "lower(coalesce(r.cwd,'') || ' ' || coalesce(r.project_id,'') || ' ' || coalesce(r.model,'') || ' ' || coalesce(r.git_branch,'') || ' ' || r.native_session_id || ' ' || r.id) LIKE ?" + ) + params.append("%" + q.lower() + "%") + where = (" WHERE " + " AND ".join(clauses)) if clauses else "" + rows = await db.execute( + """SELECT r.id, r.provider, r.native_session_id, + coalesce(r.model,s.model) AS model, coalesce(r.project_id,s.project_id) AS project_id, + coalesce(r.cwd,s.cwd) AS cwd, coalesce(r.git_branch,s.git_branch) AS git_branch, + CASE WHEN r.project_id IS NULL THEN coalesce(s.is_worktree,r.is_worktree) ELSE r.is_worktree END AS is_worktree, + r.task_id,r.parent_run_id,r.state,r.reason,r.provenance,r.created_at,r.updated_at, + r.last_observed_at,r.ended_at,(s.id IS NOT NULL) AS source_available + FROM agent_runs r LEFT JOIN sessions s ON s.id=r.native_session_id""" + + where + + " ORDER BY created_at DESC LIMIT ? OFFSET ?", + (*params, limit, offset), + ) + return [AgentRun(**dict(row)) for row in await rows.fetchall()] + + async def active(self, session_id: str, provider: str | None = None): + return next( + iter( + await self.list( + active_only=True, session_id=session_id, provider=provider, limit=1 + ) + ), + None, + ) + + async def begin(self, session_id: str, provider: str, **metadata): + if self.path is None: + return None + async with self.lock: + stamp = now() + async with aiosqlite.connect(self.path) as db: + await db.execute("BEGIN IMMEDIATE") + cursor = await db.execute( + "SELECT id FROM agent_runs WHERE provider=? AND native_session_id=? AND ended_at IS NULL", + (provider, session_id), + ) + if await cursor.fetchone(): + await db.rollback() + return await self.active(session_id, provider) + db.row_factory = aiosqlite.Row + cursor = await db.execute( + "SELECT model, project_id, cwd, git_branch, is_worktree FROM sessions WHERE id=?", + (session_id,), + ) + row = await cursor.fetchone() + values = dict(row) if row else {} + for key in ("model", "cwd"): + if metadata.get(key) is not None: + values[key] = metadata[key] + run = AgentRun( + id=str(uuid4()), + provider=provider, + native_session_id=session_id, + state="starting", + reason="Managed launch or attachment requested", + provenance="execution_manager", + created_at=stamp, + updated_at=stamp, + **values, + ) + data = run.model_dump(exclude={"source_available"}) + await db.execute( + f"INSERT INTO agent_runs ({','.join(data)}) VALUES ({','.join('?' for _ in data)})", + tuple(data.values()), + ) + await db.commit() + self.changed() + return run + + def changed(self): + if self.bus: + self.bus.publish({"type": "runs_changed"}) + + async def update( + self, + session_id: str, + state: RunState, + reason: str, + provenance: str, + *, + observed=False, + close_unknown=False, + observation_at: str | None = None, + ): + async with self.lock: + run = await self.active(session_id) + if not run: + return + stamp = now() + async with aiosqlite.connect(self.path) as db: + await db.execute( + "UPDATE agent_runs SET model=?,project_id=?,cwd=?,git_branch=?,is_worktree=? WHERE id=?", + ( + run.model, + run.project_id, + run.cwd, + run.git_branch, + run.is_worktree, + run.id, + ), + ) + await db.execute( + """UPDATE agent_runs SET state=?,reason=?,provenance=?,updated_at=?, + last_observed_at=?,ended_at=? WHERE id=? AND ended_at IS NULL""", + ( + state, + reason, + provenance, + stamp, + (observation_at or stamp) if observed else run.last_observed_at, + stamp if state in TERMINAL or close_unknown else None, + run.id, + ), + ) + await db.commit() + self.changed() + + async def rekey(self, old: str, new: str): + if self.path is None: + return + async with self.lock: + async with aiosqlite.connect(self.path) as db: + await db.execute( + "UPDATE agent_runs SET native_session_id=?,updated_at=? WHERE native_session_id=? AND ended_at IS NULL", + (new, now(), old), + ) + cursor = await db.execute( + "SELECT model,project_id,cwd,git_branch,is_worktree FROM sessions WHERE id=?", + (new,), + ) + source = await cursor.fetchone() + if source: + await db.execute( + """UPDATE agent_runs SET model=coalesce(model,?),project_id=coalesce(project_id,?), + cwd=coalesce(cwd,?),git_branch=coalesce(git_branch,?), + is_worktree=CASE WHEN project_id IS NULL THEN ? ELSE is_worktree END + WHERE native_session_id=? AND ended_at IS NULL""", + (*source, new), + ) + await db.commit() + self.changed() diff --git a/src/agent_decoder/db.py b/src/agent_decoder/db.py index dbc7cc6b..48cc2064 100644 --- a/src/agent_decoder/db.py +++ b/src/agent_decoder/db.py @@ -314,6 +314,9 @@ async def checkpoint(self) -> None: async def init_schema(self) -> None: """Create all tables and FTS5 virtual table if they don't exist.""" assert self._conn is not None + from .agent_runs import RUN_SCHEMA + + await self._conn.executescript(RUN_SCHEMA) await self._conn.executescript(""" CREATE TABLE IF NOT EXISTS projects ( id TEXT PRIMARY KEY, @@ -854,6 +857,23 @@ async def upsert_session( file_mtime, ), ) + # Preserve context in durable run history when a pending/native session + # is indexed. No foreign key: deleting/rebuilding the index retains runs. + await self._conn.execute( + """UPDATE agent_runs SET model=coalesce(model,?),project_id=coalesce(project_id,?), + cwd=coalesce(cwd,?),git_branch=coalesce(git_branch,?), + is_worktree=CASE WHEN project_id IS NULL THEN ? ELSE is_worktree END + WHERE native_session_id=? AND provider=?""", + ( + session.model, + session.project_id, + session.cwd, + session.git_branch, + int(session.is_worktree), + session.id, + session.provider, + ), + ) await self._conn.commit() async def get_sessions( diff --git a/src/agent_decoder/driver_manager.py b/src/agent_decoder/driver_manager.py index 9ac9dc54..b1a7982d 100644 --- a/src/agent_decoder/driver_manager.py +++ b/src/agent_decoder/driver_manager.py @@ -105,6 +105,9 @@ async def _state_poll_loop(self) -> None: async with self._state_poll_lock: state = await driver.capture_state() native_state = _STATE_TO_NATIVE.get(state, "idle_chat_input") + observer = getattr(self, "_record_run_observation", None) + if observer is not None: + observer(sid, native_state) key = (native_state, state == DriverState.IDLE) if self._last_driver_state.get(sid) == key: continue diff --git a/src/agent_decoder/execution_manager.py b/src/agent_decoder/execution_manager.py index 32d723d8..2b927d75 100644 --- a/src/agent_decoder/execution_manager.py +++ b/src/agent_decoder/execution_manager.py @@ -8,6 +8,10 @@ from __future__ import annotations import os +import asyncio +import logging + +from .agent_runs import RunStore, now from .driver_manager import DriverSessionPolicy from .pty_runner import ( @@ -29,6 +33,10 @@ def __init__(self, db, bus, *, terminal_backend="tmux", **kwargs): ) super().__init__(db, bus, terminal_backend=terminal_backend, **kwargs) self._init_driver_sessions() + self.runs = RunStore(db._db_path if db is not None else None, bus) + self._run_lock = asyncio.Lock() + self._run_monitor = None + self._run_observations = {} def has(self, session_id): return session_id in self._channels or session_id in self._drivers @@ -36,7 +44,122 @@ def has(self, session_id): def is_alive(self, session_id): return bool(self.status(session_id).get("alive")) + async def initialize_runs(self): + await self.runs.initialize() + self._run_monitor = asyncio.create_task(self._observe_runs()) + + def _record_run_observation(self, session_id, state): + self._run_observations[session_id] = (state, now()) + + async def _observe_runs(self): + while True: + await asyncio.sleep(2) + try: + async with self._run_lock: + await self._flush_run_observations() + except Exception: + logging.getLogger(__name__).exception( + "Run observation failed; retrying next poll" + ) + + async def _flush_run_observations(self): + for run in await self.runs.list(active_only=True, limit=10000): + sid = run.native_session_id + if run.provenance in ("server_restart", "server_shutdown") and not self.has( + sid + ): + continue + if not self.is_alive(sid): + if run.provenance != "transport_unobserved": + await self.runs.update( + sid, + "blocked", + "Terminal transport disconnected; process outcome unknown", + "transport_unobserved", + ) + continue + observation = self._run_observations.pop(sid, None) + if observation: + native, stamp = observation + state = ( + "awaiting_input" + if native == "idle_chat_input" + else "running" + if native == "running" + else "blocked" + ) + await self.runs.update( + sid, + state, + f"Advisory native screen: {native}; task outcome unknown", + "screen_classifier", + observed=True, + observation_at=stamp, + ) + async def focus(self, session_id, *, provider="claude", **kwargs): + async with self._run_lock: + existing = await self.runs.active(session_id) + if existing and existing.provider != provider: + raise RuntimeError("session already belongs to another provider") + alive = self.has(session_id) and self.is_alive(session_id) + if existing and not alive: + # Verify persistent process identity before reusing an attempt. + if provider == "claude": + persistent = await self.managed_pane_pid( + session_id, kwargs.get("cwd") + ) + else: + probe = build_driver( + provider, + session_id, + kwargs["cwd"], + socket_name=self._tmux_socket, + ) + persistent = await probe.has_session() + if not persistent: + await self.runs.update( + session_id, + "blocked", + "Prior managed process no longer exists; outcome unknown", + "process_absent", + close_unknown=True, + ) + existing = None + await self.runs.begin(session_id, provider, **kwargs) + try: + await self._focus_execution(session_id, provider=provider, **kwargs) + except BaseException: + surviving = None + if provider == "claude": + surviving = await self.managed_pane_pid( + session_id, kwargs.get("cwd") + ) + elif provider == "codex": + probe = build_driver( + provider, + session_id, + kwargs["cwd"], + socket_name=self._tmux_socket, + ) + surviving = await probe.has_session() + await self.runs.update( + session_id, + "blocked" if existing or surviving else "failed", + "Launch or attachment rejected; no successful start observed", + "launch_error", + ) + raise + if not alive: + await self.runs.update( + session_id, + "blocked", + "Managed terminal attached; waiting for a screen observation", + "managed_attach", + observed=True, + ) + + async def _focus_execution(self, session_id, *, provider="claude", **kwargs): if self._shutdown_started: raise RuntimeError("ExecutionManager is shutting down") if provider != "claude": @@ -71,15 +194,97 @@ async def focus(self, session_id, *, provider="claude", **kwargs): _OWN_CLAUDE_PIDS.discard(admitted_pid) raise + async def _ensure_channel_locked(self, session_id, params): + channel = self._channels.get(session_id) + persistent = None + run = await self.runs.active(session_id) + if channel is None or not channel.channel.is_alive(): + persistent = ( + await self.managed_pane_pid(session_id, params.cwd) + if run and run.state != "starting" + else None + ) + if run and run.state != "starting" and not persistent: + await self.runs.update( + session_id, + "blocked", + "Managed process replaced; prior outcome unknown", + "process_replaced", + close_unknown=True, + ) + await self.runs.begin( + session_id, "claude", cwd=params.cwd, model=params.model + ) + try: + managed = await super()._ensure_channel_locked(session_id, params) + if ( + persistent + and run + and run.state != "starting" + and managed.channel._harness_pid != persistent + ): + await self.runs.update( + session_id, + "blocked", + "Launch configuration replaced persistent process; prior outcome unknown", + "process_replaced", + close_unknown=True, + ) + await self.runs.begin( + session_id, "claude", cwd=params.cwd, model=params.model + ) + return managed + except BaseException: + persistent = await self.managed_pane_pid(session_id, params.cwd) + await self.runs.update( + session_id, + "blocked" if persistent else "failed", + "Attachment failed; managed process survives" + if persistent + else "Managed process launch failed", + "attach_error" if persistent else "launch_error", + ) + raise + async def submit(self, session_id, content): + async with self._run_lock: + return await self._submit_execution(session_id, content) + + async def _submit_execution(self, session_id, content): + self._run_observations.pop(session_id, None) if session_id in self._drivers: - return await self._driver_submit(session_id, content) - return await super().submit(session_id, content) + result = await self._driver_submit(session_id, content) + else: + result = await super().submit(session_id, content) + await self.runs.update( + session_id, + "running", + "Decoded input submitted; completion not yet established", + "decoded_submit", + observed=True, + ) + return result async def write_raw_input(self, session_id, data): + async with self._run_lock: + return await self._write_execution_input(session_id, data) + + async def _write_execution_input(self, session_id, data): + if b"\r" in data or b"\n" in data: + self._run_observations.pop(session_id, None) if session_id in self._drivers: - return await self._driver_write_raw_input(session_id, data) - return await super().write_raw_input(session_id, data) + result = await self._driver_write_raw_input(session_id, data) + else: + result = await super().write_raw_input(session_id, data) + if b"\r" in data or b"\n" in data: + await self.runs.update( + session_id, + "running", + "Native Enter sent; command and outcome unverified", + "native_input", + observed=True, + ) + return result async def resize(self, session_id, rows, cols): if session_id in self._drivers: @@ -122,7 +327,32 @@ async def ownership(self, session_id, jsonl_path, *, cwd=None): result["status"] = "ours" return result + async def rekey(self, old_session_id, new_session_id): + async with self._run_lock: + if old_session_id != new_session_id and await self.runs.active( + new_session_id + ): + raise RuntimeError("cannot adopt a session with an active run") + result = await super().rekey(old_session_id, new_session_id) + if result: + await self.runs.rekey(old_session_id, new_session_id) + return result + async def kill(self, session_id, *, provider=None, cwd=None, jsonl_path=None): + async with self._run_lock: + await self._kill_execution( + session_id, provider=provider, cwd=cwd, jsonl_path=jsonl_path + ) + await self.runs.update( + session_id, + "canceled", + "User explicitly terminated managed execution", + "explicit_kill", + ) + + async def _kill_execution( + self, session_id, *, provider=None, cwd=None, jsonl_path=None + ): """Terminate tracked or verified persistent sessions; never spawn one.""" if session_id in self._drivers: return await self._driver_kill(session_id) @@ -164,6 +394,20 @@ async def kill(self, session_id, *, provider=None, cwd=None, jsonl_path=None): async def shutdown(self): if self._shutdown_started: return + if self._run_monitor: + self._run_monitor.cancel() + await asyncio.gather(self._run_monitor, return_exceptions=True) + for run in await self.runs.list(active_only=True, limit=10000): + if not run.ended_at: + await self.runs.update( + run.native_session_id, + "blocked", + "Server detached; process outcome unobserved", + "server_shutdown", + close_unknown=self.status(run.native_session_id).get("backend") + == "direct" + and self.has(run.native_session_id), + ) try: await super().shutdown() finally: diff --git a/src/agent_decoder/pty_runner.py b/src/agent_decoder/pty_runner.py index feefe8cc..8b2c607d 100644 --- a/src/agent_decoder/pty_runner.py +++ b/src/agent_decoder/pty_runner.py @@ -1923,6 +1923,9 @@ def _flush_output(self, channel: PtyChannel) -> None: classification = classify_screen( bytes(tail).decode("utf-8", errors="replace") ) + observer = getattr(self, "_record_run_observation", None) + if observer is not None: + observer(session_id, classification.state) key = (classification.state, classification.decoded_input_safe) if self._last_native_state.get(session_id) != key: self._last_native_state[session_id] = key diff --git a/src/agent_decoder/server.py b/src/agent_decoder/server.py index 21974ac4..1de3ac65 100644 --- a/src/agent_decoder/server.py +++ b/src/agent_decoder/server.py @@ -61,6 +61,7 @@ ) from .pty_native import decode_terminal_input from .execution_manager import ExecutionManager +from .agent_runs import AgentRun, RunStore from .drivers import availability_for as _driver_availability from .drivers import supports_driving as _driver_supports from .analytics import fast as analytics_fast @@ -783,6 +784,7 @@ async def _refresh_pricing() -> None: _bus, ui_endpoint=f"http://{_ui_host}:{config.port}", ) + await _pty_manager.initialize_runs() app.state.pty_manager = _pty_manager _pty_manager.set_native_cols(_state["config"].native_pty_cols) try: @@ -934,6 +936,31 @@ async def delete_profile(profile_id: str): save_config(cfg) return {"ok": True} + @app.get("/api/runs", response_model=list[AgentRun]) + async def get_runs( + provider: str | None = None, + state: str | None = None, + project: str | None = None, + q: str = "", + limit: int = Query(200, ge=1, le=500), + offset: int = Query(0, ge=0), + ): + return await RunStore(db_path).list( + limit=limit, + offset=offset, + provider=provider, + state=state, + project=project, + q=q, + ) + + @app.get("/api/runs/{run_id}", response_model=AgentRun) + async def get_run(run_id: str): + for run in await RunStore(db_path).list(run_id=run_id, limit=1): + if run.id == run_id: + return run + raise HTTPException(status_code=404, detail="Run not found") + @app.get("/api/projects") async def get_projects(): data_sources = _state["config"].get_active_data_sources() diff --git a/src/agent_decoder/static/assets/ArtifactsPanel-CIwhZsnY.js b/src/agent_decoder/static/assets/ArtifactsPanel-D-CqWycU.js similarity index 97% rename from src/agent_decoder/static/assets/ArtifactsPanel-CIwhZsnY.js rename to src/agent_decoder/static/assets/ArtifactsPanel-D-CqWycU.js index 1cde1ee0..a53e1231 100644 --- a/src/agent_decoder/static/assets/ArtifactsPanel-CIwhZsnY.js +++ b/src/agent_decoder/static/assets/ArtifactsPanel-D-CqWycU.js @@ -1 +1 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{p as r}from"./index-Egnd1H3-.js";import{n as i}from"./useSessionDetail-BayJI-iv.js";import{i as a}from"./ScrollContainer-CA7-aYqv.js";import{n as o,t as s}from"./fileType-BHvAriyJ.js";var c=e(t(),1),l=new Set([`Write`,`Edit`,`MultiEdit`,`NotebookEdit`]),u=new Set([`.md`,`.mdx`,`.markdown`,`.txt`,`.rst`,`.html`,`.htm`,`.csv`,`.docx`,`.rtf`]);function d(e){let t=e;return t?.type===`base64`?`data:${t.media_type};base64,${t.data}`:t?.type===`url`?t.url:null}function f(e,t){if(t===`image`)return`images`;if(t===`pdf`)return`docs`;if(t===`audio`||t===`video`)return`media`;let n=e.lastIndexOf(`.`);return n!==-1&&u.has(e.slice(n).toLowerCase())?`docs`:`code`}function p(e){let t=[],n=new Map;return e.forEach((e,r)=>{let i={messageId:e.id,order:r};e.content_blocks.forEach((r,a)=>{if(r.type===`image`){let n=d(r.source);n&&t.push({...i,kind:`image`,key:`${e.id}:${a}`,group:`images`,src:n})}else if(r.type===`tool_result`&&Array.isArray(r.content))r.content.forEach((n,r)=>{let o=n.type===`image`?d(n.source):null;o&&t.push({...i,kind:`image`,key:`${e.id}:${a}:${r}`,group:`images`,src:o})});else if(r.type===`tool_use`&&l.has(r.name)){let e=r.input.file_path??r.input.notebook_path;if(typeof e!=`string`||!e)return;let t=o(e);n.set(e,{...i,kind:`file`,key:e,group:f(e,t),path:e,category:t})}})}),[...t,...n.values()].sort((e,t)=>t.order-e.order)}var m=n(),h=320,g=[{id:`all`,label:`All`},{id:`images`,label:`Images`},{id:`docs`,label:`Docs`},{id:`media`,label:`Media`},{id:`code`,label:`Code`}];function _(e){return e.slice(e.lastIndexOf(`/`)+1)||e}function v(){return(0,m.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,m.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,m.jsx)(`polyline`,{points:`14 2 14 8 20 8`})]})}function y({artifact:e}){let t=r(e=>e.setViewingFilePath),n=r(e=>e.setPendingScrollMessageId),i=()=>n(e.messageId),a=e.kind===`file`?()=>t(e.path):i,o=e.kind===`image`?e.src:e.category===`image`?s(e.path):null,c=e.kind===`file`?_(e.path):`Image`;return(0,m.jsxs)(`div`,{style:{border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,overflow:`hidden`,background:`var(--bg-tool-block)`},children:[(0,m.jsx)(`button`,{type:`button`,onClick:a,title:e.kind===`file`?e.path:`Jump to message`,style:{display:`flex`,alignItems:`center`,gap:`8px`,width:`100%`,padding:o?0:`10px 12px`,background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-secondary)`,textAlign:`left`},children:o?(0,m.jsx)(`img`,{src:o,alt:c,loading:`lazy`,style:{display:`block`,width:`100%`,maxHeight:360,objectFit:`contain`,background:`var(--bg-base)`}}):(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(v,{}),(0,m.jsx)(`span`,{style:{fontFamily:`var(--font-mono)`,fontSize:`12px`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:c})]})}),(0,m.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,gap:`8px`,padding:`4px 8px 4px 12px`,borderTop:`1px solid var(--border-subtle)`,fontSize:`11px`,color:`var(--text-tertiary)`},children:[(0,m.jsx)(`span`,{style:{overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:o?c:e.group}),(0,m.jsx)(`button`,{type:`button`,onClick:i,title:`Jump to message`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`inherit`,fontSize:`11px`,padding:`2px 4px`,flexShrink:0},children:`Show in chat ↗`})]})]})}function b(){let e=r(e=>e.artifactsOpen),t=r(e=>e.selectedSessionId);return e&&t?(0,m.jsx)(x,{sessionId:t},t):null}function x({sessionId:e}){let{detail:t}=i(e),n=r(e=>e.toggleArtifacts),[o,s]=(0,c.useState)(`all`),l=(0,c.useMemo)(()=>p(t?.messages??[]),[t?.messages]),u=new Set(l.map(e=>e.group)),d=o===`all`?l:l.filter(e=>e.group===o);return(0,m.jsxs)(`aside`,{"aria-label":`Artifacts`,style:{width:h,flexShrink:0,display:`flex`,flexDirection:`column`,borderLeft:`1px solid var(--border-subtle)`,background:`var(--bg-base)`,minHeight:0},children:[(0,m.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`12px 12px 8px 16px`},children:[(0,m.jsxs)(`span`,{style:{fontSize:`13px`,fontWeight:600,color:`var(--text-primary)`},children:[`Artifacts `,(0,m.jsx)(`span`,{style:{color:`var(--text-tertiary)`,fontWeight:400},children:l.length})]}),(0,m.jsx)(`button`,{type:`button`,onClick:n,"aria-label":`Close artifacts`,title:`Close artifacts`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`16px`,padding:`0 4px`},children:`×`})]}),(0,m.jsx)(`div`,{style:{display:`flex`,flexWrap:`wrap`,gap:`4px`,padding:`0 12px 8px 16px`},children:g.filter(e=>e.id===`all`||u.has(e.id)).map(e=>(0,m.jsx)(`button`,{type:`button`,onClick:()=>s(e.id),"aria-pressed":o===e.id,style:{fontSize:`11px`,padding:`3px 8px`,borderRadius:`999px`,border:`1px solid var(--border-subtle)`,cursor:`pointer`,background:o===e.id?`var(--bg-sidebar-hover)`:`none`,color:o===e.id?`var(--text-primary)`:`var(--text-tertiary)`},children:e.label},e.id))}),(0,m.jsx)(a,{style:{flex:1,minHeight:0},children:(0,m.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`,padding:`4px 12px 16px 16px`},children:d.length===0?(0,m.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,padding:`24px 0`,textAlign:`center`},children:t?`No artifacts in this session yet.`:`Loading…`}):d.map(e=>(0,m.jsx)(y,{artifact:e},e.key))})})]})}export{b as default}; \ No newline at end of file +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{p as r}from"./index-XPrlVfCr.js";import{n as i}from"./useSessionDetail-D4HneaxZ.js";import{i as a}from"./ScrollContainer-CA7-aYqv.js";import{n as o,t as s}from"./fileType-BHvAriyJ.js";var c=e(t(),1),l=new Set([`Write`,`Edit`,`MultiEdit`,`NotebookEdit`]),u=new Set([`.md`,`.mdx`,`.markdown`,`.txt`,`.rst`,`.html`,`.htm`,`.csv`,`.docx`,`.rtf`]);function d(e){let t=e;return t?.type===`base64`?`data:${t.media_type};base64,${t.data}`:t?.type===`url`?t.url:null}function f(e,t){if(t===`image`)return`images`;if(t===`pdf`)return`docs`;if(t===`audio`||t===`video`)return`media`;let n=e.lastIndexOf(`.`);return n!==-1&&u.has(e.slice(n).toLowerCase())?`docs`:`code`}function p(e){let t=[],n=new Map;return e.forEach((e,r)=>{let i={messageId:e.id,order:r};e.content_blocks.forEach((r,a)=>{if(r.type===`image`){let n=d(r.source);n&&t.push({...i,kind:`image`,key:`${e.id}:${a}`,group:`images`,src:n})}else if(r.type===`tool_result`&&Array.isArray(r.content))r.content.forEach((n,r)=>{let o=n.type===`image`?d(n.source):null;o&&t.push({...i,kind:`image`,key:`${e.id}:${a}:${r}`,group:`images`,src:o})});else if(r.type===`tool_use`&&l.has(r.name)){let e=r.input.file_path??r.input.notebook_path;if(typeof e!=`string`||!e)return;let t=o(e);n.set(e,{...i,kind:`file`,key:e,group:f(e,t),path:e,category:t})}})}),[...t,...n.values()].sort((e,t)=>t.order-e.order)}var m=n(),h=320,g=[{id:`all`,label:`All`},{id:`images`,label:`Images`},{id:`docs`,label:`Docs`},{id:`media`,label:`Media`},{id:`code`,label:`Code`}];function _(e){return e.slice(e.lastIndexOf(`/`)+1)||e}function v(){return(0,m.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,m.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,m.jsx)(`polyline`,{points:`14 2 14 8 20 8`})]})}function y({artifact:e}){let t=r(e=>e.setViewingFilePath),n=r(e=>e.setPendingScrollMessageId),i=()=>n(e.messageId),a=e.kind===`file`?()=>t(e.path):i,o=e.kind===`image`?e.src:e.category===`image`?s(e.path):null,c=e.kind===`file`?_(e.path):`Image`;return(0,m.jsxs)(`div`,{style:{border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,overflow:`hidden`,background:`var(--bg-tool-block)`},children:[(0,m.jsx)(`button`,{type:`button`,onClick:a,title:e.kind===`file`?e.path:`Jump to message`,style:{display:`flex`,alignItems:`center`,gap:`8px`,width:`100%`,padding:o?0:`10px 12px`,background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-secondary)`,textAlign:`left`},children:o?(0,m.jsx)(`img`,{src:o,alt:c,loading:`lazy`,style:{display:`block`,width:`100%`,maxHeight:360,objectFit:`contain`,background:`var(--bg-base)`}}):(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(v,{}),(0,m.jsx)(`span`,{style:{fontFamily:`var(--font-mono)`,fontSize:`12px`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:c})]})}),(0,m.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,gap:`8px`,padding:`4px 8px 4px 12px`,borderTop:`1px solid var(--border-subtle)`,fontSize:`11px`,color:`var(--text-tertiary)`},children:[(0,m.jsx)(`span`,{style:{overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:o?c:e.group}),(0,m.jsx)(`button`,{type:`button`,onClick:i,title:`Jump to message`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`inherit`,fontSize:`11px`,padding:`2px 4px`,flexShrink:0},children:`Show in chat ↗`})]})]})}function b(){let e=r(e=>e.artifactsOpen),t=r(e=>e.selectedSessionId);return e&&t?(0,m.jsx)(x,{sessionId:t},t):null}function x({sessionId:e}){let{detail:t}=i(e),n=r(e=>e.toggleArtifacts),[o,s]=(0,c.useState)(`all`),l=(0,c.useMemo)(()=>p(t?.messages??[]),[t?.messages]),u=new Set(l.map(e=>e.group)),d=o===`all`?l:l.filter(e=>e.group===o);return(0,m.jsxs)(`aside`,{"aria-label":`Artifacts`,style:{width:h,flexShrink:0,display:`flex`,flexDirection:`column`,borderLeft:`1px solid var(--border-subtle)`,background:`var(--bg-base)`,minHeight:0},children:[(0,m.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`12px 12px 8px 16px`},children:[(0,m.jsxs)(`span`,{style:{fontSize:`13px`,fontWeight:600,color:`var(--text-primary)`},children:[`Artifacts `,(0,m.jsx)(`span`,{style:{color:`var(--text-tertiary)`,fontWeight:400},children:l.length})]}),(0,m.jsx)(`button`,{type:`button`,onClick:n,"aria-label":`Close artifacts`,title:`Close artifacts`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`16px`,padding:`0 4px`},children:`×`})]}),(0,m.jsx)(`div`,{style:{display:`flex`,flexWrap:`wrap`,gap:`4px`,padding:`0 12px 8px 16px`},children:g.filter(e=>e.id===`all`||u.has(e.id)).map(e=>(0,m.jsx)(`button`,{type:`button`,onClick:()=>s(e.id),"aria-pressed":o===e.id,style:{fontSize:`11px`,padding:`3px 8px`,borderRadius:`999px`,border:`1px solid var(--border-subtle)`,cursor:`pointer`,background:o===e.id?`var(--bg-sidebar-hover)`:`none`,color:o===e.id?`var(--text-primary)`:`var(--text-tertiary)`},children:e.label},e.id))}),(0,m.jsx)(a,{style:{flex:1,minHeight:0},children:(0,m.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`,padding:`4px 12px 16px 16px`},children:d.length===0?(0,m.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,padding:`24px 0`,textAlign:`center`},children:t?`No artifacts in this session yet.`:`Loading…`}):d.map(e=>(0,m.jsx)(y,{artifact:e},e.key))})})]})}export{b as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/ChatView-D7j0LMdO.js b/src/agent_decoder/static/assets/ChatView-CFunVM15.js similarity index 99% rename from src/agent_decoder/static/assets/ChatView-D7j0LMdO.js rename to src/agent_decoder/static/assets/ChatView-CFunVM15.js index ae6e99d1..bbe95332 100644 --- a/src/agent_decoder/static/assets/ChatView-D7j0LMdO.js +++ b/src/agent_decoder/static/assets/ChatView-CFunVM15.js @@ -1,4 +1,4 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{b as r,c as i,d as a,f as o,h as s,l as c,m as l,n as u,p as d,r as f,t as p,u as m,y as h}from"./index-Egnd1H3-.js";import{n as g,t as _}from"./sessionCache-Cj3FsbQ4.js";import{n as v,t as y}from"./useSessionDetail-BayJI-iv.js";import{a as b,n as x,r as S,t as C}from"./ScrollContainer-CA7-aYqv.js";import{a as w,d as T,m as E,r as D,t as ee}from"./ui-BVMZ0uWi.js";import{n as O,t as k}from"./hljs-CvdnYs1C.js";import{t as te}from"./formatRelative-CavTjOcy.js";import{r as ne}from"./nativePtyFonts-BxhRYj2G.js";var A=e(t(),1),j=n();function re(){return(0,j.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,height:`100%`,gap:`12px`,color:`var(--text-tertiary)`,userSelect:`none`,padding:`24px`},children:[(0,j.jsxs)(`svg`,{viewBox:`0 0 40 40`,width:`56`,height:`56`,"aria-hidden":`true`,style:{opacity:.6},children:[(0,j.jsx)(`circle`,{cx:`20`,cy:`20`,r:`20`,fill:`var(--accent-orange)`,opacity:`0.12`}),(0,j.jsx)(`text`,{x:`20`,y:`26`,textAnchor:`middle`,fontSize:`20`,fill:`var(--accent-orange)`,fontFamily:`-apple-system, BlinkMacSystemFont, sans-serif`,children:`C`})]}),(0,j.jsx)(`p`,{style:{margin:0,fontSize:`15px`,color:`var(--text-secondary)`,letterSpacing:`0.01em`,fontWeight:500},children:`Select a conversation to view`}),(0,j.jsx)(`p`,{style:{margin:0,fontSize:`13px`,color:`var(--text-tertiary)`,letterSpacing:`0.01em`},children:`Browse sessions in the sidebar or use keyboard shortcuts`})]})}function ie({ownership:e}){if(!e)return null;let t=e.foreign_owner,n={ours:{color:`var(--accent-green, #6aaa64)`,label:`Attached here (agent-decoder)`},terminal:{color:`var(--accent-amber, #c9b870)`,label:t?`Open in ${t.kind} @ ${t.hostname} (pid ${t.pid})`+(t.ui_endpoint?` — ${t.ui_endpoint}`:``):e.foreign_pids.length>0?`Open in another terminal (pid ${e.foreign_pids.join(`, `)})`:`Open in another terminal`},idle:{color:`var(--text-tertiary)`,label:`Idle — no claude attached`}}[e.status];return(0,j.jsx)(`span`,{title:n.label,"aria-label":n.label,style:{display:`inline-block`,width:`8px`,height:`8px`,borderRadius:`50%`,background:n.color,flexShrink:0}})}function ae(e){return e.replace(/^claude-/i,``).replace(/-(\d+)(?:-(\d+))?$/,(e,t,n)=>n===void 0?` ${t}`:` ${t}.${n}`).replace(/^(\w)/,e=>e.toUpperCase())}function oe(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,j.jsx)(`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}),(0,j.jsx)(`polyline`,{points:`7 10 12 15 17 10`}),(0,j.jsx)(`line`,{x1:`12`,y1:`15`,x2:`12`,y2:`3`})]})}function M({session:e,ownership:t,viewMode:n=`decoded`,onViewModeChange:r,canDriveLive:o=!0,nativeStateLabel:s=null,nativeNeedsAction:c=!1}){let l=e===null?`Loading…`:e.title??`Untitled`,u=e?.model?ae(e.model):null,[f,p]=(0,A.useState)(!1),[m,h]=(0,A.useState)(!1),g=(0,A.useRef)(null),_=d(e=>e.hostInfo?.is_remote_client===!0),v=!e||e.is_fork||_,y=d(e=>e.artifactsOpen),b=d(e=>e.toggleArtifacts),x=e?.is_fork?`Open in terminal (fork — not resumable)`:_?`Open in terminal (host-only)`:`Open in terminal`,S=(0,A.useCallback)(e=>{g.current&&!g.current.contains(e.target)&&p(!1)},[]);(0,A.useEffect)(()=>{if(f)return document.addEventListener(`mousedown`,S),()=>document.removeEventListener(`mousedown`,S)},[f,S]);let C=async t=>{if(e){h(!0),p(!1);try{let{blob:n,filename:r}=await i.exportSession(e.id,t),a=URL.createObjectURL(n),o=document.createElement(`a`);o.href=a,o.download=r,o.click(),URL.revokeObjectURL(a)}catch(e){console.error(`Export failed:`,e)}finally{h(!1)}}},w={background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,padding:`6px`,borderRadius:`var(--radius-sm)`,display:`flex`,transition:`color var(--transition-fast), background var(--transition-fast)`};return(0,j.jsxs)(`div`,{style:{position:`relative`,flexShrink:0},children:[(0,j.jsxs)(`div`,{style:{height:`var(--header-height)`,display:`flex`,alignItems:`center`,padding:`0 20px`,background:`var(--bg-base)`,gap:`12px`},children:[(0,j.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,flex:1,minWidth:0},children:(0,j.jsx)(`h1`,{style:{margin:0,fontSize:`14px`,fontWeight:500,color:`var(--text-primary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:l})}),(0,j.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,flexShrink:0},children:[o&&(0,j.jsx)(`div`,{role:`group`,"aria-label":`Conversation view`,style:{display:`flex`,alignItems:`center`,padding:`2px`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,background:`var(--bg-subtle)`},children:[`decoded`,`native`,`sbs`].map(e=>{let t=n===e;return(0,j.jsx)(`button`,{type:`button`,"aria-pressed":t,title:`${e===`decoded`?`Decoded`:e===`native`?`Native`:`Split`} view · ⇧⌘\\ cycles`,onClick:()=>r?.(e),style:{border:`none`,borderRadius:`calc(var(--radius-sm) - 2px)`,background:t?`var(--bg-base)`:`transparent`,color:t?`var(--text-primary)`:`var(--text-secondary)`,boxShadow:t?`0 1px 2px rgba(0, 0, 0, 0.08)`:`none`,cursor:`pointer`,fontSize:`12px`,lineHeight:1,padding:`5px 8px`,transition:`background var(--transition-fast), color var(--transition-fast)`},children:e===`decoded`?`Decoded`:e===`native`?`Native`:`Split`},e)})}),(0,j.jsx)(ie,{ownership:t}),s&&(c?(0,j.jsx)(`button`,{type:`button`,onClick:()=>r?.(`native`),title:`Native input required — switch to Native`,style:{fontSize:`12px`,fontWeight:600,color:`var(--text-primary)`,padding:`4px 7px`,border:`1px solid var(--accent-amber, #c9b870)`,borderRadius:`var(--radius-sm)`,background:`rgba(201, 184, 112, 0.12)`,cursor:`pointer`,fontFamily:`var(--font-ui)`},children:s}):(0,j.jsx)(`span`,{style:{fontSize:`12px`,color:`var(--text-secondary)`,padding:`4px 7px`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,background:`var(--bg-subtle)`},children:s})),u&&(0,j.jsx)(`span`,{style:{fontSize:`12px`,color:`var(--text-secondary)`},children:u}),(0,j.jsx)(`button`,{onClick:b,title:`Artifacts (⇧⌘A)`,"aria-label":`Toggle artifacts panel`,"aria-pressed":y,style:{...w,color:y?`var(--text-primary)`:`var(--text-tertiary)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=y?`var(--text-primary)`:`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:(0,j.jsx)(T,{})}),e&&(0,j.jsxs)(`div`,{ref:g,style:{position:`relative`},children:[(0,j.jsx)(`button`,{onClick:()=>p(!f),disabled:m,title:`Export session`,"aria-label":`Export session`,style:w,onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:(0,j.jsx)(oe,{})}),f&&(0,j.jsxs)(`div`,{style:{position:`absolute`,right:0,top:`100%`,zIndex:100,background:`var(--bg-elevated)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-md)`,boxShadow:`var(--shadow-lg)`,minWidth:`140px`,overflow:`hidden`},children:[(0,j.jsx)(`button`,{onClick:()=>C(`json`),style:{display:`block`,width:`100%`,padding:`8px 12px`,background:`none`,border:`none`,cursor:`pointer`,textAlign:`left`,fontSize:`13px`,color:`var(--text-primary)`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:`Export as JSON`}),(0,j.jsx)(`button`,{onClick:()=>C(`md`),style:{display:`block`,width:`100%`,padding:`8px 12px`,background:`none`,border:`none`,cursor:`pointer`,textAlign:`left`,fontSize:`13px`,color:`var(--text-primary)`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:`Export as Markdown`})]})]}),(0,j.jsx)(`button`,{onClick:()=>{e&&i.openTerminal(e.id).catch(e=>{a(`toast`,{message:e instanceof Error?e.message:`Couldn't open a terminal`,kind:`error`})})},disabled:v,title:x,"aria-label":x,style:{...w,cursor:v?`default`:`pointer`,opacity:v?.4:1},onMouseEnter:e=>{v||(e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`)},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:(0,j.jsx)(E,{})})]})]}),(0,j.jsx)(`div`,{style:{position:`absolute`,left:0,right:0,bottom:`-19px`,height:`20px`,background:`linear-gradient(to bottom, var(--bg-base), transparent)`,pointerEvents:`none`,zIndex:1}})]})}function se(e){let t=e===`claude`;return{can_send:t,can_resume:t,can_fork:t,can_edit:t}}function ce(e,t){return e?.[t]?.effective??se(t)}var le=(0,A.createContext)({provider:`claude`,caps:se(`claude`)});function ue({value:e,children:t}){return(0,j.jsx)(le.Provider,{value:e,children:t})}function N(){return(0,A.useContext)(le)}var de=/<([a-z][a-z0-9-]*)>([\s\S]*?)<\/\1>/g,fe=new Set([`local-command-stdout`]),pe=new Set([`local-command-stderr`]);function me(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,``)}function he(e){let t=[],n=0;for(let r of e.matchAll(de)){let i=r.index,a=r[1],o=me(r[2].trim()),s=e.slice(n,i).trim();s&&t.push({kind:`text`,content:s}),fe.has(a)&&o?t.push({kind:`stdout`,content:o}):pe.has(a)&&o&&t.push({kind:`stderr`,content:o}),n=i+r[0].length}let r=e.slice(n).trim();return r&&t.push({kind:`text`,content:r}),t}function ge({content:e,isError:t}){return(0,j.jsx)(`div`,{style:{fontFamily:`var(--font-mono)`,fontSize:`12px`,lineHeight:1.5,background:t?`var(--tool-error-bg)`:`var(--bg-code)`,border:`1px solid ${t?`var(--tool-error-border)`:`var(--border-subtle)`}`,borderRadius:`var(--radius-md)`,padding:`8px 12px`,color:t?`var(--tool-error-text)`:`var(--text-code)`,whiteSpace:`pre-wrap`,wordBreak:`break-all`,margin:`4px 0`},children:e})}function _e({block:e}){let t=e.source,n=t.type===`base64`?`data:${t.media_type};base64,${t.data}`:t.type===`url`?t.url:null;return n?(0,j.jsx)(`img`,{src:n,alt:`Attached image`,style:{maxWidth:`100%`,borderRadius:`var(--radius-md)`,display:`block`,marginBottom:`6px`}}):null}function ve(e){return e?new Date(e).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`,hour12:!0}):``}function ye(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M1.5 7a5.5 5.5 0 1 0 1.3-3.5M1.5 1v4h4`,stroke:`currentColor`,strokeWidth:`1.3`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function be(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:[(0,j.jsx)(`rect`,{x:`4.5`,y:`4.5`,width:`8.5`,height:`8.5`,rx:`1.5`,stroke:`currentColor`,strokeWidth:`1.25`}),(0,j.jsx)(`path`,{d:`M9.5 4.5V3A1.5 1.5 0 0 0 8 1.5H3A1.5 1.5 0 0 0 1.5 3v5A1.5 1.5 0 0 0 3 9.5h1.5`,stroke:`currentColor`,strokeWidth:`1.25`,strokeLinecap:`round`})]})}function xe(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M2 7.5l3.5 3.5L12 3`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function Se(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M9.5 2.5l2 2L4 12H2v-2L9.5 2.5z`,stroke:`currentColor`,strokeWidth:`1.25`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function Ce(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M2 4h10M5 4V2.5h4V4M5.5 6v5M8.5 6v5M3 4l.8 7.5A1 1 0 0 0 4.8 12.5h4.4a1 1 0 0 0 1-.9L11 4`,stroke:`currentColor`,strokeWidth:`1.25`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function we({onClick:e,title:t,disabled:n,danger:r,children:i}){return(0,j.jsx)(`button`,{onClick:e,"aria-label":t,title:t,disabled:n,style:{background:`none`,border:`none`,cursor:n?`default`:`pointer`,color:n?`var(--text-tertiary)`:`var(--text-secondary)`,padding:`3px`,display:`flex`,alignItems:`center`,justifyContent:`center`,borderRadius:`var(--radius-sm)`,opacity:n?.4:1,transition:`color var(--transition-fast)`},onMouseEnter:e=>{n||(e.currentTarget.style.color=r?`#ef4444`:`var(--text-primary)`)},onMouseLeave:e=>{n||(e.currentTarget.style.color=`var(--text-secondary)`)},children:i})}function Te({initialText:e,onSave:t,onCancel:n}){let[r,i]=(0,A.useState)(e),[a,o]=(0,A.useState)(!1);return(0,j.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`8px`,padding:`2px 0`},children:[(0,j.jsx)(`textarea`,{value:r,onChange:e=>i(e.target.value),rows:Math.max(3,r.split(` +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{b as r,c as i,d as a,f as o,h as s,l as c,m as l,n as u,p as d,r as f,t as p,u as m,y as h}from"./index-XPrlVfCr.js";import{n as g,t as _}from"./sessionCache-Cj3FsbQ4.js";import{n as v,t as y}from"./useSessionDetail-D4HneaxZ.js";import{a as b,n as x,r as S,t as C}from"./ScrollContainer-CA7-aYqv.js";import{a as w,d as T,m as E,r as D,t as ee}from"./ui-BVMZ0uWi.js";import{n as O,t as k}from"./hljs-CvdnYs1C.js";import{t as te}from"./formatRelative-CavTjOcy.js";import{r as ne}from"./nativePtyFonts-BxhRYj2G.js";var A=e(t(),1),j=n();function re(){return(0,j.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,height:`100%`,gap:`12px`,color:`var(--text-tertiary)`,userSelect:`none`,padding:`24px`},children:[(0,j.jsxs)(`svg`,{viewBox:`0 0 40 40`,width:`56`,height:`56`,"aria-hidden":`true`,style:{opacity:.6},children:[(0,j.jsx)(`circle`,{cx:`20`,cy:`20`,r:`20`,fill:`var(--accent-orange)`,opacity:`0.12`}),(0,j.jsx)(`text`,{x:`20`,y:`26`,textAnchor:`middle`,fontSize:`20`,fill:`var(--accent-orange)`,fontFamily:`-apple-system, BlinkMacSystemFont, sans-serif`,children:`C`})]}),(0,j.jsx)(`p`,{style:{margin:0,fontSize:`15px`,color:`var(--text-secondary)`,letterSpacing:`0.01em`,fontWeight:500},children:`Select a conversation to view`}),(0,j.jsx)(`p`,{style:{margin:0,fontSize:`13px`,color:`var(--text-tertiary)`,letterSpacing:`0.01em`},children:`Browse sessions in the sidebar or use keyboard shortcuts`})]})}function ie({ownership:e}){if(!e)return null;let t=e.foreign_owner,n={ours:{color:`var(--accent-green, #6aaa64)`,label:`Attached here (agent-decoder)`},terminal:{color:`var(--accent-amber, #c9b870)`,label:t?`Open in ${t.kind} @ ${t.hostname} (pid ${t.pid})`+(t.ui_endpoint?` — ${t.ui_endpoint}`:``):e.foreign_pids.length>0?`Open in another terminal (pid ${e.foreign_pids.join(`, `)})`:`Open in another terminal`},idle:{color:`var(--text-tertiary)`,label:`Idle — no claude attached`}}[e.status];return(0,j.jsx)(`span`,{title:n.label,"aria-label":n.label,style:{display:`inline-block`,width:`8px`,height:`8px`,borderRadius:`50%`,background:n.color,flexShrink:0}})}function ae(e){return e.replace(/^claude-/i,``).replace(/-(\d+)(?:-(\d+))?$/,(e,t,n)=>n===void 0?` ${t}`:` ${t}.${n}`).replace(/^(\w)/,e=>e.toUpperCase())}function oe(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,j.jsx)(`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}),(0,j.jsx)(`polyline`,{points:`7 10 12 15 17 10`}),(0,j.jsx)(`line`,{x1:`12`,y1:`15`,x2:`12`,y2:`3`})]})}function M({session:e,ownership:t,viewMode:n=`decoded`,onViewModeChange:r,canDriveLive:o=!0,nativeStateLabel:s=null,nativeNeedsAction:c=!1}){let l=e===null?`Loading…`:e.title??`Untitled`,u=e?.model?ae(e.model):null,[f,p]=(0,A.useState)(!1),[m,h]=(0,A.useState)(!1),g=(0,A.useRef)(null),_=d(e=>e.hostInfo?.is_remote_client===!0),v=!e||e.is_fork||_,y=d(e=>e.artifactsOpen),b=d(e=>e.toggleArtifacts),x=e?.is_fork?`Open in terminal (fork — not resumable)`:_?`Open in terminal (host-only)`:`Open in terminal`,S=(0,A.useCallback)(e=>{g.current&&!g.current.contains(e.target)&&p(!1)},[]);(0,A.useEffect)(()=>{if(f)return document.addEventListener(`mousedown`,S),()=>document.removeEventListener(`mousedown`,S)},[f,S]);let C=async t=>{if(e){h(!0),p(!1);try{let{blob:n,filename:r}=await i.exportSession(e.id,t),a=URL.createObjectURL(n),o=document.createElement(`a`);o.href=a,o.download=r,o.click(),URL.revokeObjectURL(a)}catch(e){console.error(`Export failed:`,e)}finally{h(!1)}}},w={background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,padding:`6px`,borderRadius:`var(--radius-sm)`,display:`flex`,transition:`color var(--transition-fast), background var(--transition-fast)`};return(0,j.jsxs)(`div`,{style:{position:`relative`,flexShrink:0},children:[(0,j.jsxs)(`div`,{style:{height:`var(--header-height)`,display:`flex`,alignItems:`center`,padding:`0 20px`,background:`var(--bg-base)`,gap:`12px`},children:[(0,j.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,flex:1,minWidth:0},children:(0,j.jsx)(`h1`,{style:{margin:0,fontSize:`14px`,fontWeight:500,color:`var(--text-primary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:l})}),(0,j.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,flexShrink:0},children:[o&&(0,j.jsx)(`div`,{role:`group`,"aria-label":`Conversation view`,style:{display:`flex`,alignItems:`center`,padding:`2px`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,background:`var(--bg-subtle)`},children:[`decoded`,`native`,`sbs`].map(e=>{let t=n===e;return(0,j.jsx)(`button`,{type:`button`,"aria-pressed":t,title:`${e===`decoded`?`Decoded`:e===`native`?`Native`:`Split`} view · ⇧⌘\\ cycles`,onClick:()=>r?.(e),style:{border:`none`,borderRadius:`calc(var(--radius-sm) - 2px)`,background:t?`var(--bg-base)`:`transparent`,color:t?`var(--text-primary)`:`var(--text-secondary)`,boxShadow:t?`0 1px 2px rgba(0, 0, 0, 0.08)`:`none`,cursor:`pointer`,fontSize:`12px`,lineHeight:1,padding:`5px 8px`,transition:`background var(--transition-fast), color var(--transition-fast)`},children:e===`decoded`?`Decoded`:e===`native`?`Native`:`Split`},e)})}),(0,j.jsx)(ie,{ownership:t}),s&&(c?(0,j.jsx)(`button`,{type:`button`,onClick:()=>r?.(`native`),title:`Native input required — switch to Native`,style:{fontSize:`12px`,fontWeight:600,color:`var(--text-primary)`,padding:`4px 7px`,border:`1px solid var(--accent-amber, #c9b870)`,borderRadius:`var(--radius-sm)`,background:`rgba(201, 184, 112, 0.12)`,cursor:`pointer`,fontFamily:`var(--font-ui)`},children:s}):(0,j.jsx)(`span`,{style:{fontSize:`12px`,color:`var(--text-secondary)`,padding:`4px 7px`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,background:`var(--bg-subtle)`},children:s})),u&&(0,j.jsx)(`span`,{style:{fontSize:`12px`,color:`var(--text-secondary)`},children:u}),(0,j.jsx)(`button`,{onClick:b,title:`Artifacts (⇧⌘A)`,"aria-label":`Toggle artifacts panel`,"aria-pressed":y,style:{...w,color:y?`var(--text-primary)`:`var(--text-tertiary)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=y?`var(--text-primary)`:`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:(0,j.jsx)(T,{})}),e&&(0,j.jsxs)(`div`,{ref:g,style:{position:`relative`},children:[(0,j.jsx)(`button`,{onClick:()=>p(!f),disabled:m,title:`Export session`,"aria-label":`Export session`,style:w,onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:(0,j.jsx)(oe,{})}),f&&(0,j.jsxs)(`div`,{style:{position:`absolute`,right:0,top:`100%`,zIndex:100,background:`var(--bg-elevated)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-md)`,boxShadow:`var(--shadow-lg)`,minWidth:`140px`,overflow:`hidden`},children:[(0,j.jsx)(`button`,{onClick:()=>C(`json`),style:{display:`block`,width:`100%`,padding:`8px 12px`,background:`none`,border:`none`,cursor:`pointer`,textAlign:`left`,fontSize:`13px`,color:`var(--text-primary)`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:`Export as JSON`}),(0,j.jsx)(`button`,{onClick:()=>C(`md`),style:{display:`block`,width:`100%`,padding:`8px 12px`,background:`none`,border:`none`,cursor:`pointer`,textAlign:`left`,fontSize:`13px`,color:`var(--text-primary)`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:`Export as Markdown`})]})]}),(0,j.jsx)(`button`,{onClick:()=>{e&&i.openTerminal(e.id).catch(e=>{a(`toast`,{message:e instanceof Error?e.message:`Couldn't open a terminal`,kind:`error`})})},disabled:v,title:x,"aria-label":x,style:{...w,cursor:v?`default`:`pointer`,opacity:v?.4:1},onMouseEnter:e=>{v||(e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`)},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:(0,j.jsx)(E,{})})]})]}),(0,j.jsx)(`div`,{style:{position:`absolute`,left:0,right:0,bottom:`-19px`,height:`20px`,background:`linear-gradient(to bottom, var(--bg-base), transparent)`,pointerEvents:`none`,zIndex:1}})]})}function se(e){let t=e===`claude`;return{can_send:t,can_resume:t,can_fork:t,can_edit:t}}function ce(e,t){return e?.[t]?.effective??se(t)}var le=(0,A.createContext)({provider:`claude`,caps:se(`claude`)});function ue({value:e,children:t}){return(0,j.jsx)(le.Provider,{value:e,children:t})}function N(){return(0,A.useContext)(le)}var de=/<([a-z][a-z0-9-]*)>([\s\S]*?)<\/\1>/g,fe=new Set([`local-command-stdout`]),pe=new Set([`local-command-stderr`]);function me(e){return e.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,``)}function he(e){let t=[],n=0;for(let r of e.matchAll(de)){let i=r.index,a=r[1],o=me(r[2].trim()),s=e.slice(n,i).trim();s&&t.push({kind:`text`,content:s}),fe.has(a)&&o?t.push({kind:`stdout`,content:o}):pe.has(a)&&o&&t.push({kind:`stderr`,content:o}),n=i+r[0].length}let r=e.slice(n).trim();return r&&t.push({kind:`text`,content:r}),t}function ge({content:e,isError:t}){return(0,j.jsx)(`div`,{style:{fontFamily:`var(--font-mono)`,fontSize:`12px`,lineHeight:1.5,background:t?`var(--tool-error-bg)`:`var(--bg-code)`,border:`1px solid ${t?`var(--tool-error-border)`:`var(--border-subtle)`}`,borderRadius:`var(--radius-md)`,padding:`8px 12px`,color:t?`var(--tool-error-text)`:`var(--text-code)`,whiteSpace:`pre-wrap`,wordBreak:`break-all`,margin:`4px 0`},children:e})}function _e({block:e}){let t=e.source,n=t.type===`base64`?`data:${t.media_type};base64,${t.data}`:t.type===`url`?t.url:null;return n?(0,j.jsx)(`img`,{src:n,alt:`Attached image`,style:{maxWidth:`100%`,borderRadius:`var(--radius-md)`,display:`block`,marginBottom:`6px`}}):null}function ve(e){return e?new Date(e).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`,hour12:!0}):``}function ye(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M1.5 7a5.5 5.5 0 1 0 1.3-3.5M1.5 1v4h4`,stroke:`currentColor`,strokeWidth:`1.3`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function be(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:[(0,j.jsx)(`rect`,{x:`4.5`,y:`4.5`,width:`8.5`,height:`8.5`,rx:`1.5`,stroke:`currentColor`,strokeWidth:`1.25`}),(0,j.jsx)(`path`,{d:`M9.5 4.5V3A1.5 1.5 0 0 0 8 1.5H3A1.5 1.5 0 0 0 1.5 3v5A1.5 1.5 0 0 0 3 9.5h1.5`,stroke:`currentColor`,strokeWidth:`1.25`,strokeLinecap:`round`})]})}function xe(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M2 7.5l3.5 3.5L12 3`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function Se(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M9.5 2.5l2 2L4 12H2v-2L9.5 2.5z`,stroke:`currentColor`,strokeWidth:`1.25`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function Ce(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M2 4h10M5 4V2.5h4V4M5.5 6v5M8.5 6v5M3 4l.8 7.5A1 1 0 0 0 4.8 12.5h4.4a1 1 0 0 0 1-.9L11 4`,stroke:`currentColor`,strokeWidth:`1.25`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function we({onClick:e,title:t,disabled:n,danger:r,children:i}){return(0,j.jsx)(`button`,{onClick:e,"aria-label":t,title:t,disabled:n,style:{background:`none`,border:`none`,cursor:n?`default`:`pointer`,color:n?`var(--text-tertiary)`:`var(--text-secondary)`,padding:`3px`,display:`flex`,alignItems:`center`,justifyContent:`center`,borderRadius:`var(--radius-sm)`,opacity:n?.4:1,transition:`color var(--transition-fast)`},onMouseEnter:e=>{n||(e.currentTarget.style.color=r?`#ef4444`:`var(--text-primary)`)},onMouseLeave:e=>{n||(e.currentTarget.style.color=`var(--text-secondary)`)},children:i})}function Te({initialText:e,onSave:t,onCancel:n}){let[r,i]=(0,A.useState)(e),[a,o]=(0,A.useState)(!1);return(0,j.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`8px`,padding:`2px 0`},children:[(0,j.jsx)(`textarea`,{value:r,onChange:e=>i(e.target.value),rows:Math.max(3,r.split(` `).length+1),autoFocus:!0,style:{width:`100%`,fontFamily:`var(--font-content)`,fontSize:`14px`,lineHeight:1.6,padding:`10px 12px`,borderRadius:`var(--radius-md)`,background:`var(--bg-input)`,color:`var(--text-primary)`,border:`1px solid var(--border-default)`,resize:`vertical`,boxSizing:`border-box`,outline:`none`},onFocus:e=>{e.currentTarget.style.borderColor=`var(--accent-orange)`},onBlur:e=>{e.currentTarget.style.borderColor=`var(--border-default)`}}),(0,j.jsxs)(`div`,{style:{display:`flex`,gap:`6px`,justifyContent:`flex-end`},children:[(0,j.jsx)(`button`,{onClick:n,style:{fontSize:`13px`,padding:`5px 12px`,borderRadius:`var(--radius-sm)`,background:`none`,color:`var(--text-secondary)`,border:`1px solid var(--border-default)`,cursor:`pointer`,fontFamily:`var(--font-ui)`},children:`Cancel`}),(0,j.jsx)(`button`,{onClick:async()=>{o(!0);try{await t(r)}finally{o(!1)}},disabled:a,style:{fontSize:`13px`,padding:`5px 12px`,borderRadius:`var(--radius-sm)`,background:`var(--accent-orange)`,color:`var(--text-on-accent)`,border:`none`,cursor:a?`default`:`pointer`,opacity:a?.7:1,fontFamily:`var(--font-ui)`,fontWeight:500},children:a?`Saving…`:`Save`})]})]})}function Ee({message:e}){let[t,n]=(0,A.useState)(!1),[r,o]=(0,A.useState)(!1),[s,c]=(0,A.useState)(!1),[l,u]=(0,A.useState)(!1),[d,f]=(0,A.useState)(null);if(e.is_meta)return null;let p=e.content_blocks.filter(e=>e.type===`image`),m=[];for(let t of e.content_blocks)t.type===`text`&&m.push(...he(t.text));let h=m.some(e=>e.kind===`text`),g=m.some(e=>e.kind===`stdout`||e.kind===`stderr`),_=p.length>0,v=e.content_blocks.some(e=>e.type===`text`),{caps:y}=N(),b=y.can_edit;if(m.length===0&&!_)return null;let x=async()=>{let t=e.content_blocks.filter(e=>e.type===`text`).map(e=>e.text).join(` `);try{await navigator.clipboard.writeText(t),o(!0),setTimeout(()=>o(!1),2e3)}catch{}},S=e.content_blocks.filter(e=>e.type===`text`).map(e=>e.text).join(` `);async function C(t){await i.patchMessage(e.id,[{type:`text`,text:t}]),c(!1),a(`refresh`,void 0)}async function T(){f(null);try{await i.deleteMessage(e.id),u(!1),a(`refresh`,void 0)}catch(e){let t=e.message||`Delete failed`;f(t.includes(`403`)?`Editing is disabled. Set edit_enabled in Settings.`:t)}}return!h&&!_&&g?(0,j.jsx)(`div`,{style:{padding:`4px 24px`},children:m.map((e,t)=>e.kind===`stdout`?(0,j.jsx)(ge,{content:e.content},t):e.kind===`stderr`?(0,j.jsx)(ge,{content:e.content,isError:!0},t):null)}):(0,j.jsxs)(`div`,{onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),style:{padding:`6px 24px`},children:[s?(0,j.jsx)(Te,{initialText:S,onSave:C,onCancel:()=>c(!1)}):(0,j.jsx)(`div`,{style:{display:`flex`,justifyContent:`flex-end`},children:(0,j.jsxs)(`div`,{className:`user-msg-bubble`,style:{background:`var(--bg-user-msg)`,borderRadius:`18px 4px 18px 18px`,padding:`10px 16px`,maxWidth:`88%`},children:[p.map((e,t)=>(0,j.jsx)(_e,{block:e},`img-${t}`)),m.map((e,t)=>e.kind===`text`?(0,j.jsx)(O,{text:e.content,isUser:!0},t):e.kind===`stdout`?(0,j.jsx)(ge,{content:e.content},t):e.kind===`stderr`?(0,j.jsx)(ge,{content:e.content,isError:!0},t):null)]})}),!s&&(0,j.jsxs)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,alignItems:`center`,gap:`2px`,marginTop:`4px`,height:`22px`,opacity:+!!t,transition:`opacity var(--transition-fast)`,pointerEvents:t?`auto`:`none`},children:[e.timestamp&&(0,j.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,marginRight:`4px`,fontFamily:`var(--font-ui)`},children:ve(e.timestamp)}),(0,j.jsx)(we,{title:`Regenerate (coming soon)`,disabled:!0,children:(0,j.jsx)(ye,{})}),e.role===`user`&&v&&b&&(0,j.jsx)(we,{title:`Edit message`,onClick:()=>c(!0),children:(0,j.jsx)(Se,{})}),(0,j.jsx)(we,{title:r?`Copied!`:`Copy message`,onClick:x,children:r?(0,j.jsx)(xe,{}):(0,j.jsx)(be,{})}),b&&(0,j.jsx)(we,{title:`Delete message`,danger:!0,onClick:()=>u(!0),children:(0,j.jsx)(Ce,{})})]}),l&&(0,j.jsx)(w,{title:`Delete message?`,body:d?(0,j.jsx)(`span`,{style:{color:`var(--tool-error-text)`},children:d}):`This removes the message from the session file. A backup is created automatically before the write.`,onConfirm:T,onCancel:()=>{u(!1),f(null)}})]})}function De({open:e}){return(0,j.jsx)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 11 11`,fill:`none`,style:{transform:e?`rotate(90deg)`:`rotate(0deg)`,transition:`transform 150ms ease`,flexShrink:0},children:(0,j.jsx)(`path`,{d:`M4 2.5l3 3-3 3`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`})})}function Oe(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:[(0,j.jsx)(`circle`,{cx:`7`,cy:`7`,r:`5.5`,stroke:`currentColor`,strokeWidth:`1.2`}),(0,j.jsx)(`path`,{d:`M7 3.5V7l2.5 1.5`,stroke:`currentColor`,strokeWidth:`1.2`,strokeLinecap:`round`,strokeLinejoin:`round`})]})}function ke(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:[(0,j.jsx)(`path`,{d:`M2.5 1.5h6l3 3V12a.5.5 0 0 1-.5.5H3a.5.5 0 0 1-.5-.5V2a.5.5 0 0 1 .5-.5z`,stroke:`currentColor`,strokeWidth:`1.2`,strokeLinejoin:`round`}),(0,j.jsx)(`path`,{d:`M8.5 1.5V4.5H11.5`,stroke:`currentColor`,strokeWidth:`1.2`,strokeLinecap:`round`,strokeLinejoin:`round`})]})}function Ae(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:[(0,j.jsx)(`rect`,{x:`1.5`,y:`2`,width:`11`,height:`10`,rx:`1.5`,stroke:`currentColor`,strokeWidth:`1.2`}),(0,j.jsx)(`path`,{d:`M4 5.5l2.5 1.5L4 8.5M7.5 9H10`,stroke:`currentColor`,strokeWidth:`1.2`,strokeLinecap:`round`,strokeLinejoin:`round`})]})}function je(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:[(0,j.jsx)(`path`,{d:`M1.5 7s2-4 5.5-4 5.5 4 5.5 4-2 4-5.5 4S1.5 7 1.5 7z`,stroke:`currentColor`,strokeWidth:`1.2`}),(0,j.jsx)(`circle`,{cx:`7`,cy:`7`,r:`1.5`,stroke:`currentColor`,strokeWidth:`1.2`})]})}function Me(){return(0,j.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:(0,j.jsx)(`path`,{d:`M9.5 2l2.5 2.5-7.5 7.5H2V9.5L9.5 2z`,stroke:`currentColor`,strokeWidth:`1.2`,strokeLinejoin:`round`})})}function Ne(){return(0,j.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 14 14`,fill:`none`,children:[(0,j.jsx)(`circle`,{cx:`7`,cy:`7`,r:`5.5`,stroke:`currentColor`,strokeWidth:`1.2`}),(0,j.jsx)(`path`,{d:`M4.5 7l2 2L9.5 5`,stroke:`currentColor`,strokeWidth:`1.2`,strokeLinecap:`round`,strokeLinejoin:`round`})]})}function Pe(e){let t=e.toLowerCase();return t.includes(`write`)||t.includes(`create`)||t.includes(`notebook`)?(0,j.jsx)(ke,{}):t.includes(`bash`)||t.includes(`execute`)||t.includes(`run`)||t.includes(`command`)?(0,j.jsx)(Ae,{}):t.includes(`read`)||t.includes(`view`)||t.includes(`glob`)||t.includes(`ls`)||t.includes(`search`)||t.includes(`grep`)||t.includes(`find`)?(0,j.jsx)(je,{}):t.includes(`edit`)||t.includes(`patch`)||t.includes(`replace`)||t.includes(`str_replace`)?(0,j.jsx)(Me,{}):(0,j.jsx)(ke,{})}function Fe(e){let t=e.input,n=e.name.toLowerCase(),r=t.file_path||t.path||``,i=r?r.split(`/`).pop()??r:``;if(n===`todowrite`)return{description:`Update Todos`,badge:null};if(n.includes(`write`)||n.includes(`create`))return{description:`Created`,badge:i||null};if(n.includes(`edit`)||n.includes(`patch`)||n.includes(`str_replace`))return{description:`Edited`,badge:i||null};if(n.includes(`read`)||n.includes(`view`))return{description:`Read`,badge:i||null};if(n.includes(`bash`)||n.includes(`execute`)){let n=t.command||t.cmd||``;return{description:n?n.slice(0,72)+(n.length>72?`…`:``):e.name,badge:null}}if(n.includes(`glob`)||n.includes(`grep`)||n.includes(`find`)||n.includes(`search`)){let n=t.pattern||t.query||``;return{description:n?`Search: ${n}`:e.name,badge:null}}let a=Object.values(t)[0];return{description:typeof a==`string`&&a.length<80?a:e.name,badge:null}}function Ie(e){let t=e.name.toLowerCase();return t===`todowrite`?{verb:`Updated`,noun:`todos`}:t.includes(`write`)||t.includes(`create`)?{verb:`Created`,noun:`files`}:t.includes(`edit`)||t.includes(`patch`)||t.includes(`str_replace`)?{verb:`Edited`,noun:`files`}:t.includes(`read`)||t.includes(`view`)?{verb:`Read`,noun:`files`}:t.includes(`bash`)||t.includes(`execute`)?{verb:`Ran`,noun:`commands`}:t.includes(`glob`)||t.includes(`grep`)||t.includes(`find`)||t.includes(`search`)?{verb:`Searched`,noun:`files`}:{verb:e.name,noun:`tools`}}function Le(e,t){return t===1&&e.endsWith(`s`)?e.slice(0,-1):e}function Re(e){let t=e.filter(e=>e.type===`tool_use_pair`),n=e.some(e=>e.type===`thinking`);if(t.length===0)return`Thought for a moment`;if(t.length===1)return Ie(t[0].toolUse).verb;let r=new Map;for(let e of t){let{verb:t,noun:n}=Ie(e.toolUse),i=r.get(t);i?i.count+=1:r.set(t,{verb:t,noun:n,count:1})}let i=[...r.values()].map(({verb:e,noun:t,count:n})=>n>1?`${e} ${n} ${t}`:`${e} 1 ${Le(t,1)}`);return n&&i.unshift(`Thought`),i.join(` · `)}var ze={display:`flex`,flexDirection:`column`,alignItems:`center`,width:`18px`,flexShrink:0},Be={flex:1,width:1,background:`var(--border-subtle)`,margin:`3px 0`,minHeight:`10px`},Ve={background:`var(--bg-code)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,fontFamily:`var(--font-mono)`,fontSize:`12px`,padding:`8px 10px`,overflowX:`hidden`,margin:`6px 0 0`,lineHeight:1.5,color:`var(--text-code)`,whiteSpace:`pre-wrap`,wordBreak:`break-all`};function He({value:e}){return(0,j.jsx)(b,{className:`code-block-wrap`,options:S,style:{overflow:`hidden`},children:(0,j.jsx)(`pre`,{dangerouslySetInnerHTML:{__html:(0,A.useMemo)(()=>k.highlight(e,{language:`json`}).value,[e])},style:Ve})})}function Ue({command:e}){return(0,j.jsx)(`pre`,{dangerouslySetInnerHTML:{__html:(0,A.useMemo)(()=>{try{return k.highlight(e,{language:`bash`}).value}catch{return e.replace(/&/g,`&`).replace(/e.setViewingFilePath),i=t?t.split(` diff --git a/src/agent_decoder/static/assets/Dashboard-CBe8ZXJ-.js b/src/agent_decoder/static/assets/Dashboard-CBe8ZXJ-.js new file mode 100644 index 00000000..b9cf2d95 --- /dev/null +++ b/src/agent_decoder/static/assets/Dashboard-CBe8ZXJ-.js @@ -0,0 +1 @@ +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{a as r,c as i,f as a,p as o,t as s,x as c}from"./index-XPrlVfCr.js";import{a as l,n as u}from"./sessionCache-Cj3FsbQ4.js";import{i as d}from"./ScrollContainer-CA7-aYqv.js";import{t as f}from"./formatRelative-CavTjOcy.js";import{t as p}from"./useDebounce-CRtjXm0i.js";import{t as m}from"./renderSnippet-CcNMfZRd.js";var h=e(t(),1);function g(e){return e>=1?`$${e.toFixed(2)}`:e>0?`$${e.toFixed(4)}`:`$0`}function _(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e4?`${(e/1e3).toFixed(0)}k`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function v(e){return e.replace(/^claude-/,``).replace(/-\d{8}$/,``)}var y={sonnet:`#b8956a`,opus:`#9b8ec4`,haiku:`#6bb5a6`,fable:`#c079b0`};function b(e){let t=e.toLowerCase();for(let[e,n]of Object.entries(y))if(t.includes(e))return n;return`var(--text-tertiary)`}function x(){let e=new Date().getHours();return e<5?`Working late`:e<12?`Good morning`:e<18?`Good afternoon`:`Good evening`}function S(e){let t=e.lastIndexOf(`/`);return t===-1?{name:e,dir:``}:{name:e.slice(t+1),dir:e.slice(0,t)}}var C=n(),w=50;function T(){let e=o(e=>e.setPendingScrollMessageId),t=r(),[n,a]=(0,h.useState)(``),[s,g]=(0,h.useState)([]),[_,v]=(0,h.useState)(!1),[y,b]=(0,h.useState)(!1),[x,S]=(0,h.useState)(!1),[T,E]=(0,h.useState)(0),[D,O]=(0,h.useState)(!1),k=p(n,300),A=(0,h.useRef)(null),j=(0,h.useRef)(null),M=(0,h.useRef)(null);(0,h.useEffect)(()=>{let e=e=>{A.current?.contains(e.target)||O(!1)};return window.addEventListener(`mousedown`,e),()=>window.removeEventListener(`mousedown`,e)},[]),(0,h.useEffect)(()=>{if(k.length<2){g([]),S(!1);return}let e=!1;return v(!0),i.search(k,void 0,w).then(t=>{e||(g(t),S(t.length===w),E(0))}).catch(()=>{e||(g([]),S(!1))}).finally(()=>{e||v(!1)}),()=>{e=!0}},[k]);let N=(0,h.useCallback)(()=>{y||(b(!0),i.search(k,void 0,w,s.length).then(e=>{g(t=>[...t,...e]),S(e.length===w)}).catch(()=>S(!1)).finally(()=>b(!1)))},[k,s.length,y]);(0,h.useEffect)(()=>{let e=M.current;e&&e.children[T]?.scrollIntoView({block:`nearest`})},[T]);let P=(0,h.useCallback)(n=>{t.has(n.session_id)&&t.remove(n.session_id),e(n.message_id);let r=()=>c(`/chat/${n.session_id}`);u(n.session_id)?r():i.getSession(n.session_id).then(e=>{l(n.session_id,e),r()}).catch(r)},[e,t]),F=e=>{e.key===`ArrowDown`?(e.preventDefault(),E(e=>Math.min(e+1,Math.max(s.length-1,0)))):e.key===`ArrowUp`?(e.preventDefault(),E(e=>Math.max(e-1,0))):e.key===`Enter`&&s[T]?P(s[T]):e.key===`Escape`&&(n?a(``):(j.current?.blur(),O(!1)))},I=D&&n.length>0;return(0,C.jsxs)(`div`,{ref:A,style:{position:`relative`,width:`100%`,maxWidth:`520px`,alignSelf:`center`},children:[(0,C.jsxs)(`div`,{onClick:()=>j.current?.focus(),style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`11px 14px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,transition:`border-color 0.15s`,cursor:`text`},onMouseEnter:e=>{e.currentTarget.style.borderColor=`var(--border-default)`},onMouseLeave:e=>{e.currentTarget.style.borderColor=`var(--border-subtle)`},children:[(0,C.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{flexShrink:0,opacity:.6,color:`var(--text-secondary)`},children:[(0,C.jsx)(`circle`,{cx:`11`,cy:`11`,r:`7`}),(0,C.jsx)(`path`,{d:`m20 20-3.5-3.5`})]}),(0,C.jsx)(`input`,{ref:j,type:`text`,value:n,onChange:e=>{a(e.target.value),O(!0)},onFocus:()=>O(!0),onKeyDown:F,placeholder:`Search sessions, messages, code… "phrase" -exclude`,style:{flex:1,border:`none`,outline:`none`,background:`transparent`,fontSize:`13.5px`,color:`var(--text-primary)`,fontFamily:`inherit`,minWidth:0}}),_&&(0,C.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:`Searching…`})]}),I&&(0,C.jsxs)(`div`,{style:{position:`absolute`,top:`calc(100% + 6px)`,left:0,right:0,background:`var(--bg-modal)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,boxShadow:`var(--shadow-lg)`,overflow:`hidden`,zIndex:50},children:[s.length>0&&(0,C.jsxs)(d,{style:{maxHeight:`360px`},children:[(0,C.jsx)(`ul`,{ref:M,role:`listbox`,style:{listStyle:`none`,margin:0,padding:`6px 0`},children:s.map((e,t)=>(0,C.jsxs)(`li`,{role:`option`,"aria-selected":t===T,onMouseDown:t=>{t.preventDefault(),P(e)},onMouseEnter:()=>E(t),style:{padding:`10px 14px`,cursor:`pointer`,background:t===T?`var(--bg-sidebar-hover)`:`transparent`,transition:`background var(--transition-fast)`},children:[(0,C.jsx)(`div`,{style:{fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,marginBottom:`3px`},children:e.session_title??`Untitled`}),(0,C.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-secondary)`,display:`-webkit-box`,WebkitLineClamp:2,WebkitBoxOrient:`vertical`,overflow:`hidden`,lineHeight:1.4,marginBottom:e.timestamp?`4px`:0},children:m(e.snippet)}),e.timestamp&&(0,C.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:f(e.timestamp)})]},e.message_id))}),x&&(0,C.jsx)(`button`,{onClick:N,disabled:y,style:{display:`block`,width:`100%`,padding:`10px 14px`,border:`none`,background:`transparent`,color:`var(--text-tertiary)`,fontSize:`12px`,fontFamily:`inherit`,cursor:y?`default`:`pointer`},children:y?`Loading…`:`Load more`})]}),!_&&n.length>=2&&s.length===0&&(0,C.jsxs)(`div`,{style:{padding:`20px 14px`,textAlign:`center`,fontSize:`13px`,color:`var(--text-tertiary)`},children:[`No results for "`,n,`"`]}),n.length>0&&n.length<2&&(0,C.jsx)(`div`,{style:{padding:`14px`,textAlign:`center`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`Type at least 2 characters…`})]})]})}function E({totalSessions:e}){return(0,C.jsxs)(`section`,{style:{display:`flex`,flexDirection:`column`,gap:`30px`,paddingTop:`8px`},children:[(0,C.jsxs)(`div`,{children:[(0,C.jsxs)(`div`,{style:{fontSize:`13px`,color:`var(--text-tertiary)`,marginBottom:`6px`,letterSpacing:`0.02em`},children:[x(),` —`]}),(0,C.jsxs)(`h1`,{style:{fontFamily:`var(--font-content)`,fontSize:`34px`,fontWeight:600,margin:0,lineHeight:1.15,color:`var(--text-primary)`,letterSpacing:`-0.01em`},children:[`Agent `,(0,C.jsx)(`span`,{style:{color:`var(--accent-orange)`},children:`Decoder`})]}),(0,C.jsx)(`div`,{style:{fontSize:`14px`,color:`var(--text-secondary)`,marginTop:`6px`},children:e>0?(0,C.jsx)(C.Fragment,{children:`Browse, search, and analyze your sessions.`}):(0,C.jsx)(C.Fragment,{children:`Your local browser for session history.`})})]}),(0,C.jsx)(T,{})]})}function D({title:e,hint:t}){return(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`baseline`,justifyContent:`space-between`,margin:`0 0 14px`},children:[(0,C.jsx)(`h3`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.09em`,fontWeight:600,margin:0},children:e}),t&&(0,C.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,opacity:.7},children:t})]})}function O(e,t,n){let r=e=>`${Math.round(e)}%`;if(e&&e.length>=14){let t=[...e].sort((e,t)=>e.day.localeCompare(t.day)),n=t.slice(-7),r=t.slice(-14,-7),i=n.reduce((e,t)=>e+t.prompt_count,0),a=r.reduce((e,t)=>e+t.prompt_count,0);if(a>=20){if(i>=a*1.5){let e=Math.round((i-a)/a*100);return{ruleId:`big-week`,body:(0,C.jsxs)(C.Fragment,{children:[`Active week — `,(0,C.jsxs)(`b`,{children:[i,` messages`]}),`, up `,e,`% from last week.`]})}}if(i<=a*.5)return{ruleId:`cooling-off`,body:(0,C.jsxs)(C.Fragment,{children:[`Quieter week — `,(0,C.jsxs)(`b`,{children:[i,` messages`]}),`, down from `,a,`.`]})}}}if(e&&e.length>=14&&n&&n.length>0){let e=n[0],t=n.reduce((e,t)=>e+t.total_tokens,0);if(t>0){let n=e.total_tokens/t*100;if(n>=60)return{ruleId:`model-share`,body:(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`b`,{children:v(e.model)}),` is your go-to — `,r(n),` of recent tokens.`]})}}}if(t&&t.length>0){let e=t[0];if(e.count>=50)return{ruleId:`top-tool`,body:(0,C.jsxs)(C.Fragment,{children:[`Your most-used tool is `,(0,C.jsx)(`b`,{children:e.tool}),` (`,e.count.toLocaleString(),` calls).`]})}}return null}function k({insight:e}){return(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`10px 14px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,fontSize:`13px`,color:`var(--text-secondary)`,lineHeight:1.5},children:[(0,C.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`var(--accent-orange)`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{flexShrink:0,opacity:.85},"aria-hidden":`true`,children:(0,C.jsx)(`path`,{d:`M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83`})}),(0,C.jsx)(`span`,{style:{minWidth:0},children:e.body})]})}function A({session:e,onClick:t}){let n=e.last_message_role===`assistant`;return(0,C.jsxs)(`button`,{onClick:t,style:{display:`flex`,flexDirection:`column`,gap:`14px`,padding:`20px 22px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,cursor:`pointer`,textAlign:`left`,width:`100%`,fontFamily:`inherit`,color:`inherit`,transition:`border-color 0.15s, background 0.15s`},onMouseEnter:e=>{e.currentTarget.style.borderColor=`var(--border-default)`},onMouseLeave:e=>{e.currentTarget.style.borderColor=`var(--border-subtle)`},children:[(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`},children:[(0,C.jsx)(`span`,{style:{fontSize:`10.5px`,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.09em`,fontWeight:600},children:`Pick up where you left off`}),n&&(0,C.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:`5px`,fontSize:`10.5px`,color:`var(--accent-orange)`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`},children:[(0,C.jsx)(`span`,{style:{width:`6px`,height:`6px`,borderRadius:`50%`,background:`var(--accent-orange)`}}),`awaiting you`]})]}),(0,C.jsx)(`div`,{style:{fontSize:`18px`,fontWeight:500,color:`var(--text-primary)`,lineHeight:1.35,overflow:`hidden`,display:`-webkit-box`,WebkitLineClamp:2,WebkitBoxOrient:`vertical`},children:e.title||`Untitled session`}),(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`14px`,flexWrap:`wrap`,fontSize:`12px`,color:`var(--text-tertiary)`},children:[(0,C.jsxs)(`span`,{children:[e.message_count,` message`,e.message_count===1?``:`s`]}),(0,C.jsx)(`span`,{style:{opacity:.4},children:`·`}),(0,C.jsx)(`span`,{children:f(e.updated_at)}),e.models.length>0&&(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`span`,{style:{opacity:.4},children:`·`}),(0,C.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:`6px`},children:[(0,C.jsx)(`span`,{style:{width:`8px`,height:`8px`,borderRadius:`2px`,background:b(e.models[0])}}),e.models.map(v).join(`, `)]})]}),(0,C.jsx)(`span`,{style:{opacity:.4},children:`·`}),(0,C.jsx)(`span`,{style:{fontFamily:`var(--font-mono)`,color:`var(--accent-orange)`},children:g(e.total_usd)}),(0,C.jsx)(`span`,{style:{marginLeft:`auto`,color:`var(--accent-orange)`,fontWeight:500},children:`Continue →`})]})]})}function j({session:e,onClick:t}){let n=e.last_message_role===`assistant`;return(0,C.jsxs)(`div`,{onClick:t,style:{display:`flex`,alignItems:`center`,gap:`12px`,padding:`10px 12px`,background:`transparent`,borderRadius:`var(--radius-md)`,cursor:`pointer`,transition:`background 0.12s`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-tool-block)`},onMouseLeave:e=>{e.currentTarget.style.background=`transparent`},children:[e.models[0]&&(0,C.jsx)(`span`,{style:{width:`8px`,height:`8px`,borderRadius:`2px`,background:b(e.models[0]),flexShrink:0},title:e.models.map(v).join(`, `)}),(0,C.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,C.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-primary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.title||`Untitled session`}),(0,C.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,marginTop:`3px`,fontSize:`11px`,color:`var(--text-tertiary)`},children:[(0,C.jsxs)(`span`,{children:[e.message_count,` msgs`]}),(0,C.jsx)(`span`,{style:{opacity:.4},children:`·`}),(0,C.jsx)(`span`,{children:f(e.updated_at)})]})]}),n&&(0,C.jsx)(`div`,{style:{width:`7px`,height:`7px`,borderRadius:`50%`,background:`var(--accent-orange)`,flexShrink:0},title:`Awaiting your reply`}),(0,C.jsx)(`div`,{style:{fontSize:`12px`,fontFamily:`var(--font-mono)`,color:`var(--accent-orange)`,flexShrink:0,minWidth:`52px`,textAlign:`right`},children:g(e.total_usd)})]})}function M({daily:e}){let t=new Date;t.setHours(0,0,0,0);let n=new Map;for(let t of e)n.set(t.day,t);let r=[];for(let e=29;e>=0;e--){let i=new Date(t);i.setDate(t.getDate()-e);let a=i.toISOString().slice(0,10),o=n.get(a);r.push({key:a,date:i,count:o?o.prompt_count:0})}let i=Math.max(1,...r.map(e=>e.count)),a=[`var(--bg-tool-block)`,`color-mix(in srgb, var(--accent-orange) 20%, transparent)`,`color-mix(in srgb, var(--accent-orange) 40%, transparent)`,`color-mix(in srgb, var(--accent-orange) 65%, transparent)`,`var(--accent-orange)`];function o(e){if(e===0)return a[0];let t=e/i;return t<.25?a[1]:t<.5?a[2]:t<.75?a[3]:a[4]}let s=r.reduce((e,t)=>e+t.count,0),c=r.filter(e=>e.count>0).length;return(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Activity`,hint:`${c}/30 active days · ${s} prompts`}),(0,C.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`8px`},children:[(0,C.jsx)(`div`,{style:{display:`flex`,gap:`4px`},children:r.map(e=>(0,C.jsx)(`div`,{title:`${e.date.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})} · ${e.count} prompt${e.count===1?``:`s`}`,style:{flex:1,aspectRatio:`1 / 1`,maxHeight:`22px`,borderRadius:`3px`,background:o(e.count),transition:`background 0.15s`}},e.key))}),(0,C.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,fontSize:`11px`,color:`var(--text-tertiary)`},children:[(0,C.jsx)(`span`,{children:`30 days ago`}),(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`4px`},children:[(0,C.jsx)(`span`,{children:`less`}),a.map((e,t)=>(0,C.jsx)(`div`,{style:{width:`10px`,height:`10px`,borderRadius:`2px`,background:e}},t)),(0,C.jsx)(`span`,{children:`more`})]}),(0,C.jsx)(`span`,{children:`today`})]})]})]})}function N({values:e,width:t=96,height:n=28}){if(e.length<2)return null;let r=Math.max(...e),i=Math.min(...e),a=r-i||1,o=t/(e.length-1),s=n-6,c=e.map((e,t)=>{let n=t*o,r=3+s-(e-i)/a*s;return`${n.toFixed(1)},${r.toFixed(1)}`}).join(` `),l=(e.length-1)*o,u=3+s-(e[e.length-1]-i)/a*s,d=`0,${n} ${c} ${t},${n}`;return(0,C.jsxs)(`svg`,{width:t,height:n,viewBox:`0 0 ${t} ${n}`,style:{display:`block`,overflow:`visible`,flexShrink:0},"aria-hidden":`true`,children:[(0,C.jsx)(`polyline`,{points:d,fill:`var(--accent-orange)`,fillOpacity:`0.10`,stroke:`none`}),(0,C.jsx)(`polyline`,{points:c,fill:`none`,stroke:`var(--accent-orange)`,strokeWidth:`1.75`,strokeLinejoin:`round`,strokeLinecap:`round`}),(0,C.jsx)(`circle`,{cx:l,cy:u,r:`2.5`,fill:`var(--accent-orange)`})]})}function P({data:e,daily:t}){let n=(t||[]).slice(-7),r=n.map(e=>e.session_count),i=n.map(e=>e.prompt_count);return(0,C.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(3, 1fr)`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,overflow:`hidden`},children:[{label:`Sessions`,value:_(e.total_sessions),spark:r,sub:`7-day trend`},{label:`Messages`,value:_(e.total_messages),spark:i,sub:`7-day trend`},{label:`Recent cost`,value:g(e.total_cost_usd),sub:`last 10 sessions`}].map((e,t)=>(0,C.jsxs)(`div`,{style:{padding:`16px 20px`,display:`flex`,flexDirection:`column`,gap:`4px`,borderLeft:t===0?`none`:`1px solid var(--border-subtle)`},children:[(0,C.jsx)(`div`,{style:{fontSize:`10.5px`,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.09em`,fontWeight:600},children:e.label}),(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`flex-end`,justifyContent:`space-between`,gap:`8px`},children:[(0,C.jsx)(`div`,{style:{fontSize:`26px`,fontWeight:600,color:`var(--text-primary)`,fontFamily:`var(--font-mono)`,lineHeight:1.1,letterSpacing:`-0.02em`},children:e.value}),e.spark&&e.spark.length>=2&&(0,C.jsx)(N,{values:e.spark})]}),e.sub&&(0,C.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,marginTop:`1px`},children:e.sub})]},e.label))})}function F({models:e}){if(e.length===0)return null;let t=e.reduce((e,t)=>e+t.total_tokens,0);return t===0?null:(0,C.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`},children:[(0,C.jsx)(`div`,{style:{display:`flex`,height:`8px`,borderRadius:`var(--radius-pill)`,overflow:`hidden`,background:`var(--bg-tool-block)`},children:e.map(e=>{let n=e.total_tokens/t*100;return(0,C.jsx)(`div`,{title:`${v(e.model)} — ${n.toFixed(1)}%`,style:{width:`${n}%`,background:b(e.model)}},e.model)})}),(0,C.jsx)(`div`,{style:{display:`flex`,gap:`16px`,flexWrap:`wrap`},children:e.map(e=>{let n=(e.total_tokens/t*100).toFixed(1);return(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`7px`},children:[(0,C.jsx)(`div`,{style:{width:`8px`,height:`8px`,borderRadius:`2px`,background:b(e.model),flexShrink:0}}),(0,C.jsx)(`span`,{style:{fontSize:`12px`,color:`var(--text-secondary)`},children:v(e.model)}),(0,C.jsxs)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-mono)`},children:[n,`%`]})]},e.model)})})]})}function I({entries:e,onOpen:t}){return(0,C.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`4px`},children:e.map(e=>{let{name:n,dir:r}=S(e.file);return(0,C.jsxs)(`button`,{onClick:()=>t(e.file),style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`9px 12px`,background:`transparent`,border:`none`,borderRadius:`var(--radius-md)`,cursor:`pointer`,textAlign:`left`,fontFamily:`inherit`,color:`inherit`,transition:`background 0.12s`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-tool-block)`},onMouseLeave:e=>{e.currentTarget.style.background=`transparent`},children:[(0,C.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{color:`var(--text-tertiary)`,flexShrink:0},"aria-hidden":`true`,children:[(0,C.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,C.jsx)(`polyline`,{points:`14 2 14 8 20 8`})]}),(0,C.jsxs)(`div`,{style:{flex:1,minWidth:0,display:`flex`,alignItems:`baseline`,gap:`8px`,overflow:`hidden`},children:[(0,C.jsx)(`span`,{style:{fontFamily:`var(--font-mono)`,fontSize:`12.5px`,color:`var(--text-primary)`,whiteSpace:`nowrap`,flexShrink:0},children:n}),r&&(0,C.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`,direction:`rtl`,textAlign:`left`},children:r})]}),(0,C.jsxs)(`span`,{style:{fontSize:`11px`,fontFamily:`var(--font-mono)`,color:`var(--text-tertiary)`,flexShrink:0},children:[e.count,`× edits`]})]},e.file)})})}function L({project:e,onClick:t}){return(0,C.jsxs)(`button`,{onClick:t,style:{flex:`0 0 auto`,width:`180px`,padding:`11px 14px`,background:`var(--bg-tool-block)`,borderRadius:`var(--radius-md)`,border:`1px solid var(--border-subtle)`,cursor:`pointer`,textAlign:`left`,fontFamily:`inherit`,color:`inherit`,transition:`background 0.12s, border-color 0.12s`},onMouseEnter:e=>{e.currentTarget.style.borderColor=`var(--border-default)`},onMouseLeave:e=>{e.currentTarget.style.borderColor=`var(--border-subtle)`},children:[(0,C.jsx)(`div`,{style:{fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.display_name}),(0,C.jsxs)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,marginTop:`4px`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:[e.session_count,` session`,e.session_count===1?``:`s`,e.last_activity_at&&` · ${f(e.last_activity_at)}`]})]})}function R({projects:e,onSelect:t}){let n=[...e].sort((e,t)=>{let n=e.last_activity_at?Date.parse(e.last_activity_at):0;return(t.last_activity_at?Date.parse(t.last_activity_at):0)-n}),r=n.slice(0,20),i=n.length-r.length;return(0,C.jsxs)(`div`,{className:`dashboard-project-strip`,style:{display:`flex`,gap:`8px`,overflowX:`auto`,paddingBottom:`4px`,margin:`0 -32px`,padding:`0 32px 4px`},children:[r.map(e=>(0,C.jsx)(L,{project:e,onClick:()=>t(e.id)},e.id)),i>0&&(0,C.jsxs)(`div`,{style:{flex:`0 0 auto`,width:`120px`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`11px 14px`,fontSize:`12px`,color:`var(--text-tertiary)`,fontStyle:`italic`,border:`1px dashed var(--border-subtle)`,borderRadius:`var(--radius-md)`},children:[`+`,i,` more`]})]})}function z({tip:e}){let t={info:`#7eb6c4`,warning:`#c9a96e`,error:`#c47a7a`};return(0,C.jsxs)(`div`,{style:{padding:`11px 14px`,background:`var(--bg-tool-block)`,borderRadius:`var(--radius-md)`,borderLeft:`3px solid ${t[e.severity]||t.info}`},children:[(0,C.jsx)(`div`,{style:{fontSize:`12.5px`,fontWeight:500,color:`var(--text-primary)`},children:e.title}),(0,C.jsx)(`div`,{style:{fontSize:`11.5px`,color:`var(--text-tertiary)`,marginTop:`3px`,lineHeight:1.5},children:e.detail})]})}var B=e=>`$${e.toFixed(2)}`,V={textAlign:`left`,padding:`6px 10px`,color:`var(--text-tertiary)`,fontWeight:500,fontSize:`11px`},H={padding:`8px 10px`,fontFamily:`var(--font-mono)`,color:`var(--text-secondary)`};function U({pricing:e}){return e.models.length===0?null:(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Model rates`,hint:`USD / 1M tokens · ${e.source}`}),(0,C.jsx)(`div`,{style:{borderRadius:`var(--radius-md)`,border:`1px solid var(--border-subtle)`,overflow:`hidden`},children:(0,C.jsxs)(`table`,{style:{width:`100%`,borderCollapse:`separate`,borderSpacing:0,fontSize:`13px`},children:[(0,C.jsx)(`thead`,{children:(0,C.jsx)(`tr`,{style:{borderBottom:`1px solid var(--border-subtle)`},children:[`Model`,`Input`,`Output`,`Cache Write`,`Cache Read`].map(e=>(0,C.jsx)(`th`,{style:V,children:e},e))})}),(0,C.jsx)(`tbody`,{children:e.models.map((t,n)=>(0,C.jsxs)(`tr`,{style:{borderBottom:ne.selectProject),b=o(e=>e.openSearch),x=o(e=>e.setViewingFilePath),S=e=>c(`/chat/${e}`),w=(0,h.useRef)(()=>{});w.current=()=>{G.data===null&&v(!0),i.getDashboard().then(e=>{G.data=e,t(e)}).finally(()=>v(!1)),i.getDailyAnalytics().then(e=>{G.daily=e,r(e)}).catch(()=>{}),i.getFileTouches().then(e=>{G.touchedFiles=e,u(e)}).catch(()=>{}),i.getToolUsage().then(e=>{G.toolUsage=e,p(e)}).catch(()=>{}),i.getPricingTable().then(e=>{G.pricing=e,g(e)}).catch(()=>{})};let T=(0,h.useMemo)(()=>O(n,f,e?.model_usage??null),[n,f,e?.model_usage]);if((0,h.useEffect)(()=>{w.current()},[]),(0,h.useEffect)(()=>a(`refresh`,()=>{w.current()}),[]),_&&!e)return(0,C.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,C.jsx)(s,{width:`102px`,label:`Loading dashboard`})});if(!e)return null;let N=e.total_sessions===0&&e.recent_sessions.length===0,[L,...B]=e.recent_sessions;return(0,C.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,overflow:`hidden`,background:`var(--bg-base)`},children:(0,C.jsx)(d,{style:{flex:1,padding:`36px 32px 48px`},children:(0,C.jsxs)(`div`,{style:{maxWidth:`820px`,margin:`0 auto`,display:`flex`,flexDirection:`column`,gap:`36px`},children:[(0,C.jsx)(E,{totalSessions:e.total_sessions}),T&&(0,C.jsx)(k,{insight:T}),N?(0,C.jsx)(W,{onSearch:b}):(0,C.jsxs)(C.Fragment,{children:[L&&(0,C.jsx)(A,{session:L,onClick:()=>S(L.id)}),n&&n.length>0&&(0,C.jsx)(M,{daily:n}),(0,C.jsx)(P,{data:e,daily:n}),e.model_usage.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Model distribution`,hint:`by tokens, recent`}),(0,C.jsx)(F,{models:e.model_usage})]}),m&&(0,C.jsx)(U,{pricing:m}),B.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Recent activity`,hint:`${B.length} more`}),(0,C.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`6px`},children:B.map(e=>(0,C.jsx)(j,{session:e,onClick:()=>S(e.id)},e.id))})]}),l&&l.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Most touched files`,hint:`recent sessions`}),(0,C.jsx)(I,{entries:l.slice(0,8),onOpen:x})]}),e.projects.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Projects`,hint:`${e.projects.length} total`}),(0,C.jsx)(R,{projects:e.projects,onSelect:y})]}),e.tips.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Optimization tips`}),(0,C.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`8px`},children:e.tips.map(e=>(0,C.jsx)(z,{tip:e},e.rule_id))})]})]})]})})})}export{K as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/Dashboard-CNB-enER.js b/src/agent_decoder/static/assets/Dashboard-CNB-enER.js deleted file mode 100644 index 04f79db8..00000000 --- a/src/agent_decoder/static/assets/Dashboard-CNB-enER.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{a as r,c as i,f as a,p as o,t as s,x as c}from"./index-Egnd1H3-.js";import{a as l,n as u}from"./sessionCache-Cj3FsbQ4.js";import{i as d}from"./ScrollContainer-CA7-aYqv.js";import{t as f}from"./formatRelative-CavTjOcy.js";import{n as p,t as m}from"./renderSnippet-B37VxZaL.js";var h=e(t(),1);function g(e){return e>=1?`$${e.toFixed(2)}`:e>0?`$${e.toFixed(4)}`:`$0`}function _(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e4?`${(e/1e3).toFixed(0)}k`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function v(e){return e.replace(/^claude-/,``).replace(/-\d{8}$/,``)}var y={sonnet:`#b8956a`,opus:`#9b8ec4`,haiku:`#6bb5a6`,fable:`#c079b0`};function b(e){let t=e.toLowerCase();for(let[e,n]of Object.entries(y))if(t.includes(e))return n;return`var(--text-tertiary)`}function x(){let e=new Date().getHours();return e<5?`Working late`:e<12?`Good morning`:e<18?`Good afternoon`:`Good evening`}function S(e){let t=e.lastIndexOf(`/`);return t===-1?{name:e,dir:``}:{name:e.slice(t+1),dir:e.slice(0,t)}}var C=n(),w=50;function T(){let e=o(e=>e.setPendingScrollMessageId),t=r(),[n,a]=(0,h.useState)(``),[s,g]=(0,h.useState)([]),[_,v]=(0,h.useState)(!1),[y,b]=(0,h.useState)(!1),[x,S]=(0,h.useState)(!1),[T,E]=(0,h.useState)(0),[D,O]=(0,h.useState)(!1),k=p(n,300),A=(0,h.useRef)(null),j=(0,h.useRef)(null),M=(0,h.useRef)(null);(0,h.useEffect)(()=>{let e=e=>{A.current?.contains(e.target)||O(!1)};return window.addEventListener(`mousedown`,e),()=>window.removeEventListener(`mousedown`,e)},[]),(0,h.useEffect)(()=>{if(k.length<2){g([]),S(!1);return}let e=!1;return v(!0),i.search(k,void 0,w).then(t=>{e||(g(t),S(t.length===w),E(0))}).catch(()=>{e||(g([]),S(!1))}).finally(()=>{e||v(!1)}),()=>{e=!0}},[k]);let N=(0,h.useCallback)(()=>{y||(b(!0),i.search(k,void 0,w,s.length).then(e=>{g(t=>[...t,...e]),S(e.length===w)}).catch(()=>S(!1)).finally(()=>b(!1)))},[k,s.length,y]);(0,h.useEffect)(()=>{let e=M.current;e&&e.children[T]?.scrollIntoView({block:`nearest`})},[T]);let P=(0,h.useCallback)(n=>{t.has(n.session_id)&&t.remove(n.session_id),e(n.message_id);let r=()=>c(`/chat/${n.session_id}`);u(n.session_id)?r():i.getSession(n.session_id).then(e=>{l(n.session_id,e),r()}).catch(r)},[e,t]),F=e=>{e.key===`ArrowDown`?(e.preventDefault(),E(e=>Math.min(e+1,Math.max(s.length-1,0)))):e.key===`ArrowUp`?(e.preventDefault(),E(e=>Math.max(e-1,0))):e.key===`Enter`&&s[T]?P(s[T]):e.key===`Escape`&&(n?a(``):(j.current?.blur(),O(!1)))},I=D&&n.length>0;return(0,C.jsxs)(`div`,{ref:A,style:{position:`relative`,width:`100%`,maxWidth:`520px`,alignSelf:`center`},children:[(0,C.jsxs)(`div`,{onClick:()=>j.current?.focus(),style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`11px 14px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,transition:`border-color 0.15s`,cursor:`text`},onMouseEnter:e=>{e.currentTarget.style.borderColor=`var(--border-default)`},onMouseLeave:e=>{e.currentTarget.style.borderColor=`var(--border-subtle)`},children:[(0,C.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{flexShrink:0,opacity:.6,color:`var(--text-secondary)`},children:[(0,C.jsx)(`circle`,{cx:`11`,cy:`11`,r:`7`}),(0,C.jsx)(`path`,{d:`m20 20-3.5-3.5`})]}),(0,C.jsx)(`input`,{ref:j,type:`text`,value:n,onChange:e=>{a(e.target.value),O(!0)},onFocus:()=>O(!0),onKeyDown:F,placeholder:`Search sessions, messages, code… "phrase" -exclude`,style:{flex:1,border:`none`,outline:`none`,background:`transparent`,fontSize:`13.5px`,color:`var(--text-primary)`,fontFamily:`inherit`,minWidth:0}}),_&&(0,C.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:`Searching…`})]}),I&&(0,C.jsxs)(`div`,{style:{position:`absolute`,top:`calc(100% + 6px)`,left:0,right:0,background:`var(--bg-modal)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,boxShadow:`var(--shadow-lg)`,overflow:`hidden`,zIndex:50},children:[s.length>0&&(0,C.jsxs)(d,{style:{maxHeight:`360px`},children:[(0,C.jsx)(`ul`,{ref:M,role:`listbox`,style:{listStyle:`none`,margin:0,padding:`6px 0`},children:s.map((e,t)=>(0,C.jsxs)(`li`,{role:`option`,"aria-selected":t===T,onMouseDown:t=>{t.preventDefault(),P(e)},onMouseEnter:()=>E(t),style:{padding:`10px 14px`,cursor:`pointer`,background:t===T?`var(--bg-sidebar-hover)`:`transparent`,transition:`background var(--transition-fast)`},children:[(0,C.jsx)(`div`,{style:{fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,marginBottom:`3px`},children:e.session_title??`Untitled`}),(0,C.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-secondary)`,display:`-webkit-box`,WebkitLineClamp:2,WebkitBoxOrient:`vertical`,overflow:`hidden`,lineHeight:1.4,marginBottom:e.timestamp?`4px`:0},children:m(e.snippet)}),e.timestamp&&(0,C.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:f(e.timestamp)})]},e.message_id))}),x&&(0,C.jsx)(`button`,{onClick:N,disabled:y,style:{display:`block`,width:`100%`,padding:`10px 14px`,border:`none`,background:`transparent`,color:`var(--text-tertiary)`,fontSize:`12px`,fontFamily:`inherit`,cursor:y?`default`:`pointer`},children:y?`Loading…`:`Load more`})]}),!_&&n.length>=2&&s.length===0&&(0,C.jsxs)(`div`,{style:{padding:`20px 14px`,textAlign:`center`,fontSize:`13px`,color:`var(--text-tertiary)`},children:[`No results for "`,n,`"`]}),n.length>0&&n.length<2&&(0,C.jsx)(`div`,{style:{padding:`14px`,textAlign:`center`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`Type at least 2 characters…`})]})]})}function E({totalSessions:e}){return(0,C.jsxs)(`section`,{style:{display:`flex`,flexDirection:`column`,gap:`30px`,paddingTop:`8px`},children:[(0,C.jsxs)(`div`,{children:[(0,C.jsxs)(`div`,{style:{fontSize:`13px`,color:`var(--text-tertiary)`,marginBottom:`6px`,letterSpacing:`0.02em`},children:[x(),` —`]}),(0,C.jsxs)(`h1`,{style:{fontFamily:`var(--font-content)`,fontSize:`34px`,fontWeight:600,margin:0,lineHeight:1.15,color:`var(--text-primary)`,letterSpacing:`-0.01em`},children:[`Agent `,(0,C.jsx)(`span`,{style:{color:`var(--accent-orange)`},children:`Decoder`})]}),(0,C.jsx)(`div`,{style:{fontSize:`14px`,color:`var(--text-secondary)`,marginTop:`6px`},children:e>0?(0,C.jsx)(C.Fragment,{children:`Browse, search, and analyze your sessions.`}):(0,C.jsx)(C.Fragment,{children:`Your local browser for session history.`})})]}),(0,C.jsx)(T,{})]})}function D({title:e,hint:t}){return(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`baseline`,justifyContent:`space-between`,margin:`0 0 14px`},children:[(0,C.jsx)(`h3`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.09em`,fontWeight:600,margin:0},children:e}),t&&(0,C.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,opacity:.7},children:t})]})}function O(e,t,n){let r=e=>`${Math.round(e)}%`;if(e&&e.length>=14){let t=[...e].sort((e,t)=>e.day.localeCompare(t.day)),n=t.slice(-7),r=t.slice(-14,-7),i=n.reduce((e,t)=>e+t.prompt_count,0),a=r.reduce((e,t)=>e+t.prompt_count,0);if(a>=20){if(i>=a*1.5){let e=Math.round((i-a)/a*100);return{ruleId:`big-week`,body:(0,C.jsxs)(C.Fragment,{children:[`Active week — `,(0,C.jsxs)(`b`,{children:[i,` messages`]}),`, up `,e,`% from last week.`]})}}if(i<=a*.5)return{ruleId:`cooling-off`,body:(0,C.jsxs)(C.Fragment,{children:[`Quieter week — `,(0,C.jsxs)(`b`,{children:[i,` messages`]}),`, down from `,a,`.`]})}}}if(e&&e.length>=14&&n&&n.length>0){let e=n[0],t=n.reduce((e,t)=>e+t.total_tokens,0);if(t>0){let n=e.total_tokens/t*100;if(n>=60)return{ruleId:`model-share`,body:(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`b`,{children:v(e.model)}),` is your go-to — `,r(n),` of recent tokens.`]})}}}if(t&&t.length>0){let e=t[0];if(e.count>=50)return{ruleId:`top-tool`,body:(0,C.jsxs)(C.Fragment,{children:[`Your most-used tool is `,(0,C.jsx)(`b`,{children:e.tool}),` (`,e.count.toLocaleString(),` calls).`]})}}return null}function k({insight:e}){return(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`10px 14px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,fontSize:`13px`,color:`var(--text-secondary)`,lineHeight:1.5},children:[(0,C.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`var(--accent-orange)`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{flexShrink:0,opacity:.85},"aria-hidden":`true`,children:(0,C.jsx)(`path`,{d:`M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83`})}),(0,C.jsx)(`span`,{style:{minWidth:0},children:e.body})]})}function A({session:e,onClick:t}){let n=e.last_message_role===`assistant`;return(0,C.jsxs)(`button`,{onClick:t,style:{display:`flex`,flexDirection:`column`,gap:`14px`,padding:`20px 22px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,cursor:`pointer`,textAlign:`left`,width:`100%`,fontFamily:`inherit`,color:`inherit`,transition:`border-color 0.15s, background 0.15s`},onMouseEnter:e=>{e.currentTarget.style.borderColor=`var(--border-default)`},onMouseLeave:e=>{e.currentTarget.style.borderColor=`var(--border-subtle)`},children:[(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`},children:[(0,C.jsx)(`span`,{style:{fontSize:`10.5px`,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.09em`,fontWeight:600},children:`Pick up where you left off`}),n&&(0,C.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:`5px`,fontSize:`10.5px`,color:`var(--accent-orange)`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`},children:[(0,C.jsx)(`span`,{style:{width:`6px`,height:`6px`,borderRadius:`50%`,background:`var(--accent-orange)`}}),`awaiting you`]})]}),(0,C.jsx)(`div`,{style:{fontSize:`18px`,fontWeight:500,color:`var(--text-primary)`,lineHeight:1.35,overflow:`hidden`,display:`-webkit-box`,WebkitLineClamp:2,WebkitBoxOrient:`vertical`},children:e.title||`Untitled session`}),(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`14px`,flexWrap:`wrap`,fontSize:`12px`,color:`var(--text-tertiary)`},children:[(0,C.jsxs)(`span`,{children:[e.message_count,` message`,e.message_count===1?``:`s`]}),(0,C.jsx)(`span`,{style:{opacity:.4},children:`·`}),(0,C.jsx)(`span`,{children:f(e.updated_at)}),e.models.length>0&&(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`span`,{style:{opacity:.4},children:`·`}),(0,C.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:`6px`},children:[(0,C.jsx)(`span`,{style:{width:`8px`,height:`8px`,borderRadius:`2px`,background:b(e.models[0])}}),e.models.map(v).join(`, `)]})]}),(0,C.jsx)(`span`,{style:{opacity:.4},children:`·`}),(0,C.jsx)(`span`,{style:{fontFamily:`var(--font-mono)`,color:`var(--accent-orange)`},children:g(e.total_usd)}),(0,C.jsx)(`span`,{style:{marginLeft:`auto`,color:`var(--accent-orange)`,fontWeight:500},children:`Continue →`})]})]})}function j({session:e,onClick:t}){let n=e.last_message_role===`assistant`;return(0,C.jsxs)(`div`,{onClick:t,style:{display:`flex`,alignItems:`center`,gap:`12px`,padding:`10px 12px`,background:`transparent`,borderRadius:`var(--radius-md)`,cursor:`pointer`,transition:`background 0.12s`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-tool-block)`},onMouseLeave:e=>{e.currentTarget.style.background=`transparent`},children:[e.models[0]&&(0,C.jsx)(`span`,{style:{width:`8px`,height:`8px`,borderRadius:`2px`,background:b(e.models[0]),flexShrink:0},title:e.models.map(v).join(`, `)}),(0,C.jsxs)(`div`,{style:{flex:1,minWidth:0},children:[(0,C.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-primary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.title||`Untitled session`}),(0,C.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,marginTop:`3px`,fontSize:`11px`,color:`var(--text-tertiary)`},children:[(0,C.jsxs)(`span`,{children:[e.message_count,` msgs`]}),(0,C.jsx)(`span`,{style:{opacity:.4},children:`·`}),(0,C.jsx)(`span`,{children:f(e.updated_at)})]})]}),n&&(0,C.jsx)(`div`,{style:{width:`7px`,height:`7px`,borderRadius:`50%`,background:`var(--accent-orange)`,flexShrink:0},title:`Awaiting your reply`}),(0,C.jsx)(`div`,{style:{fontSize:`12px`,fontFamily:`var(--font-mono)`,color:`var(--accent-orange)`,flexShrink:0,minWidth:`52px`,textAlign:`right`},children:g(e.total_usd)})]})}function M({daily:e}){let t=new Date;t.setHours(0,0,0,0);let n=new Map;for(let t of e)n.set(t.day,t);let r=[];for(let e=29;e>=0;e--){let i=new Date(t);i.setDate(t.getDate()-e);let a=i.toISOString().slice(0,10),o=n.get(a);r.push({key:a,date:i,count:o?o.prompt_count:0})}let i=Math.max(1,...r.map(e=>e.count)),a=[`var(--bg-tool-block)`,`color-mix(in srgb, var(--accent-orange) 20%, transparent)`,`color-mix(in srgb, var(--accent-orange) 40%, transparent)`,`color-mix(in srgb, var(--accent-orange) 65%, transparent)`,`var(--accent-orange)`];function o(e){if(e===0)return a[0];let t=e/i;return t<.25?a[1]:t<.5?a[2]:t<.75?a[3]:a[4]}let s=r.reduce((e,t)=>e+t.count,0),c=r.filter(e=>e.count>0).length;return(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Activity`,hint:`${c}/30 active days · ${s} prompts`}),(0,C.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`8px`},children:[(0,C.jsx)(`div`,{style:{display:`flex`,gap:`4px`},children:r.map(e=>(0,C.jsx)(`div`,{title:`${e.date.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})} · ${e.count} prompt${e.count===1?``:`s`}`,style:{flex:1,aspectRatio:`1 / 1`,maxHeight:`22px`,borderRadius:`3px`,background:o(e.count),transition:`background 0.15s`}},e.key))}),(0,C.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,fontSize:`11px`,color:`var(--text-tertiary)`},children:[(0,C.jsx)(`span`,{children:`30 days ago`}),(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`4px`},children:[(0,C.jsx)(`span`,{children:`less`}),a.map((e,t)=>(0,C.jsx)(`div`,{style:{width:`10px`,height:`10px`,borderRadius:`2px`,background:e}},t)),(0,C.jsx)(`span`,{children:`more`})]}),(0,C.jsx)(`span`,{children:`today`})]})]})]})}function N({values:e,width:t=96,height:n=28}){if(e.length<2)return null;let r=Math.max(...e),i=Math.min(...e),a=r-i||1,o=t/(e.length-1),s=n-6,c=e.map((e,t)=>{let n=t*o,r=3+s-(e-i)/a*s;return`${n.toFixed(1)},${r.toFixed(1)}`}).join(` `),l=(e.length-1)*o,u=3+s-(e[e.length-1]-i)/a*s,d=`0,${n} ${c} ${t},${n}`;return(0,C.jsxs)(`svg`,{width:t,height:n,viewBox:`0 0 ${t} ${n}`,style:{display:`block`,overflow:`visible`,flexShrink:0},"aria-hidden":`true`,children:[(0,C.jsx)(`polyline`,{points:d,fill:`var(--accent-orange)`,fillOpacity:`0.10`,stroke:`none`}),(0,C.jsx)(`polyline`,{points:c,fill:`none`,stroke:`var(--accent-orange)`,strokeWidth:`1.75`,strokeLinejoin:`round`,strokeLinecap:`round`}),(0,C.jsx)(`circle`,{cx:l,cy:u,r:`2.5`,fill:`var(--accent-orange)`})]})}function P({data:e,daily:t}){let n=(t||[]).slice(-7),r=n.map(e=>e.session_count),i=n.map(e=>e.prompt_count);return(0,C.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(3, 1fr)`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,overflow:`hidden`},children:[{label:`Sessions`,value:_(e.total_sessions),spark:r,sub:`7-day trend`},{label:`Messages`,value:_(e.total_messages),spark:i,sub:`7-day trend`},{label:`Recent cost`,value:g(e.total_cost_usd),sub:`last 10 sessions`}].map((e,t)=>(0,C.jsxs)(`div`,{style:{padding:`16px 20px`,display:`flex`,flexDirection:`column`,gap:`4px`,borderLeft:t===0?`none`:`1px solid var(--border-subtle)`},children:[(0,C.jsx)(`div`,{style:{fontSize:`10.5px`,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.09em`,fontWeight:600},children:e.label}),(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`flex-end`,justifyContent:`space-between`,gap:`8px`},children:[(0,C.jsx)(`div`,{style:{fontSize:`26px`,fontWeight:600,color:`var(--text-primary)`,fontFamily:`var(--font-mono)`,lineHeight:1.1,letterSpacing:`-0.02em`},children:e.value}),e.spark&&e.spark.length>=2&&(0,C.jsx)(N,{values:e.spark})]}),e.sub&&(0,C.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,marginTop:`1px`},children:e.sub})]},e.label))})}function F({models:e}){if(e.length===0)return null;let t=e.reduce((e,t)=>e+t.total_tokens,0);return t===0?null:(0,C.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`},children:[(0,C.jsx)(`div`,{style:{display:`flex`,height:`8px`,borderRadius:`var(--radius-pill)`,overflow:`hidden`,background:`var(--bg-tool-block)`},children:e.map(e=>{let n=e.total_tokens/t*100;return(0,C.jsx)(`div`,{title:`${v(e.model)} — ${n.toFixed(1)}%`,style:{width:`${n}%`,background:b(e.model)}},e.model)})}),(0,C.jsx)(`div`,{style:{display:`flex`,gap:`16px`,flexWrap:`wrap`},children:e.map(e=>{let n=(e.total_tokens/t*100).toFixed(1);return(0,C.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`7px`},children:[(0,C.jsx)(`div`,{style:{width:`8px`,height:`8px`,borderRadius:`2px`,background:b(e.model),flexShrink:0}}),(0,C.jsx)(`span`,{style:{fontSize:`12px`,color:`var(--text-secondary)`},children:v(e.model)}),(0,C.jsxs)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-mono)`},children:[n,`%`]})]},e.model)})})]})}function I({entries:e,onOpen:t}){return(0,C.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`4px`},children:e.map(e=>{let{name:n,dir:r}=S(e.file);return(0,C.jsxs)(`button`,{onClick:()=>t(e.file),style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`9px 12px`,background:`transparent`,border:`none`,borderRadius:`var(--radius-md)`,cursor:`pointer`,textAlign:`left`,fontFamily:`inherit`,color:`inherit`,transition:`background 0.12s`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-tool-block)`},onMouseLeave:e=>{e.currentTarget.style.background=`transparent`},children:[(0,C.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{color:`var(--text-tertiary)`,flexShrink:0},"aria-hidden":`true`,children:[(0,C.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,C.jsx)(`polyline`,{points:`14 2 14 8 20 8`})]}),(0,C.jsxs)(`div`,{style:{flex:1,minWidth:0,display:`flex`,alignItems:`baseline`,gap:`8px`,overflow:`hidden`},children:[(0,C.jsx)(`span`,{style:{fontFamily:`var(--font-mono)`,fontSize:`12.5px`,color:`var(--text-primary)`,whiteSpace:`nowrap`,flexShrink:0},children:n}),r&&(0,C.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`,direction:`rtl`,textAlign:`left`},children:r})]}),(0,C.jsxs)(`span`,{style:{fontSize:`11px`,fontFamily:`var(--font-mono)`,color:`var(--text-tertiary)`,flexShrink:0},children:[e.count,`× edits`]})]},e.file)})})}function L({project:e,onClick:t}){return(0,C.jsxs)(`button`,{onClick:t,style:{flex:`0 0 auto`,width:`180px`,padding:`11px 14px`,background:`var(--bg-tool-block)`,borderRadius:`var(--radius-md)`,border:`1px solid var(--border-subtle)`,cursor:`pointer`,textAlign:`left`,fontFamily:`inherit`,color:`inherit`,transition:`background 0.12s, border-color 0.12s`},onMouseEnter:e=>{e.currentTarget.style.borderColor=`var(--border-default)`},onMouseLeave:e=>{e.currentTarget.style.borderColor=`var(--border-subtle)`},children:[(0,C.jsx)(`div`,{style:{fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.display_name}),(0,C.jsxs)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,marginTop:`4px`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:[e.session_count,` session`,e.session_count===1?``:`s`,e.last_activity_at&&` · ${f(e.last_activity_at)}`]})]})}function R({projects:e,onSelect:t}){let n=[...e].sort((e,t)=>{let n=e.last_activity_at?Date.parse(e.last_activity_at):0;return(t.last_activity_at?Date.parse(t.last_activity_at):0)-n}),r=n.slice(0,20),i=n.length-r.length;return(0,C.jsxs)(`div`,{className:`dashboard-project-strip`,style:{display:`flex`,gap:`8px`,overflowX:`auto`,paddingBottom:`4px`,margin:`0 -32px`,padding:`0 32px 4px`},children:[r.map(e=>(0,C.jsx)(L,{project:e,onClick:()=>t(e.id)},e.id)),i>0&&(0,C.jsxs)(`div`,{style:{flex:`0 0 auto`,width:`120px`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`11px 14px`,fontSize:`12px`,color:`var(--text-tertiary)`,fontStyle:`italic`,border:`1px dashed var(--border-subtle)`,borderRadius:`var(--radius-md)`},children:[`+`,i,` more`]})]})}function z({tip:e}){let t={info:`#7eb6c4`,warning:`#c9a96e`,error:`#c47a7a`};return(0,C.jsxs)(`div`,{style:{padding:`11px 14px`,background:`var(--bg-tool-block)`,borderRadius:`var(--radius-md)`,borderLeft:`3px solid ${t[e.severity]||t.info}`},children:[(0,C.jsx)(`div`,{style:{fontSize:`12.5px`,fontWeight:500,color:`var(--text-primary)`},children:e.title}),(0,C.jsx)(`div`,{style:{fontSize:`11.5px`,color:`var(--text-tertiary)`,marginTop:`3px`,lineHeight:1.5},children:e.detail})]})}var B=e=>`$${e.toFixed(2)}`,V={textAlign:`left`,padding:`6px 10px`,color:`var(--text-tertiary)`,fontWeight:500,fontSize:`11px`},H={padding:`8px 10px`,fontFamily:`var(--font-mono)`,color:`var(--text-secondary)`};function U({pricing:e}){return e.models.length===0?null:(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Model rates`,hint:`USD / 1M tokens · ${e.source}`}),(0,C.jsx)(`div`,{style:{borderRadius:`var(--radius-md)`,border:`1px solid var(--border-subtle)`,overflow:`hidden`},children:(0,C.jsxs)(`table`,{style:{width:`100%`,borderCollapse:`separate`,borderSpacing:0,fontSize:`13px`},children:[(0,C.jsx)(`thead`,{children:(0,C.jsx)(`tr`,{style:{borderBottom:`1px solid var(--border-subtle)`},children:[`Model`,`Input`,`Output`,`Cache Write`,`Cache Read`].map(e=>(0,C.jsx)(`th`,{style:V,children:e},e))})}),(0,C.jsx)(`tbody`,{children:e.models.map((t,n)=>(0,C.jsxs)(`tr`,{style:{borderBottom:ne.selectProject),b=o(e=>e.openSearch),x=o(e=>e.setViewingFilePath),S=e=>c(`/chat/${e}`),w=(0,h.useRef)(()=>{});w.current=()=>{G.data===null&&v(!0),i.getDashboard().then(e=>{G.data=e,t(e)}).finally(()=>v(!1)),i.getDailyAnalytics().then(e=>{G.daily=e,r(e)}).catch(()=>{}),i.getFileTouches().then(e=>{G.touchedFiles=e,u(e)}).catch(()=>{}),i.getToolUsage().then(e=>{G.toolUsage=e,p(e)}).catch(()=>{}),i.getPricingTable().then(e=>{G.pricing=e,g(e)}).catch(()=>{})};let T=(0,h.useMemo)(()=>O(n,f,e?.model_usage??null),[n,f,e?.model_usage]);if((0,h.useEffect)(()=>{w.current()},[]),(0,h.useEffect)(()=>a(`refresh`,()=>{w.current()}),[]),_&&!e)return(0,C.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,C.jsx)(s,{width:`102px`,label:`Loading dashboard`})});if(!e)return null;let N=e.total_sessions===0&&e.recent_sessions.length===0,[L,...B]=e.recent_sessions;return(0,C.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,overflow:`hidden`,background:`var(--bg-base)`},children:(0,C.jsx)(d,{style:{flex:1,padding:`36px 32px 48px`},children:(0,C.jsxs)(`div`,{style:{maxWidth:`820px`,margin:`0 auto`,display:`flex`,flexDirection:`column`,gap:`36px`},children:[(0,C.jsx)(E,{totalSessions:e.total_sessions}),T&&(0,C.jsx)(k,{insight:T}),N?(0,C.jsx)(W,{onSearch:b}):(0,C.jsxs)(C.Fragment,{children:[L&&(0,C.jsx)(A,{session:L,onClick:()=>S(L.id)}),n&&n.length>0&&(0,C.jsx)(M,{daily:n}),(0,C.jsx)(P,{data:e,daily:n}),e.model_usage.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Model distribution`,hint:`by tokens, recent`}),(0,C.jsx)(F,{models:e.model_usage})]}),m&&(0,C.jsx)(U,{pricing:m}),B.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Recent activity`,hint:`${B.length} more`}),(0,C.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`6px`},children:B.map(e=>(0,C.jsx)(j,{session:e,onClick:()=>S(e.id)},e.id))})]}),l&&l.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Most touched files`,hint:`recent sessions`}),(0,C.jsx)(I,{entries:l.slice(0,8),onOpen:x})]}),e.projects.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Projects`,hint:`${e.projects.length} total`}),(0,C.jsx)(R,{projects:e.projects,onSelect:y})]}),e.tips.length>0&&(0,C.jsxs)(`section`,{children:[(0,C.jsx)(D,{title:`Optimization tips`}),(0,C.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`8px`},children:e.tips.map(e=>(0,C.jsx)(z,{tip:e},e.rule_id))})]})]})]})})})}export{K as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/FileViewer-Cl35TR1y.js b/src/agent_decoder/static/assets/FileViewer-CVtveC8R.js similarity index 99% rename from src/agent_decoder/static/assets/FileViewer-Cl35TR1y.js rename to src/agent_decoder/static/assets/FileViewer-CVtveC8R.js index 75f383f7..9dd59cab 100644 --- a/src/agent_decoder/static/assets/FileViewer-Cl35TR1y.js +++ b/src/agent_decoder/static/assets/FileViewer-CVtveC8R.js @@ -1 +1 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{c as r,g as i,m as a,p as o,v as ee}from"./index-Egnd1H3-.js";import{i as s}from"./ScrollContainer-CA7-aYqv.js";import{n as c,t as l}from"./fileType-BHvAriyJ.js";import{n as u,t as d}from"./hljs-CvdnYs1C.js";var f=e(t(),1),p=n(),m=360,h=360;function te(){if(typeof window>`u`)return 720;let e=i(a.FILE_VIEWER_WIDTH),t=e?Number(e):NaN;return Number.isFinite(t)?t:720}function g(e){if(!e)return!1;if(e.language===`markdown`)return!0;let t=e.name.toLowerCase();return t.endsWith(`.md`)||t.endsWith(`.markdown`)||t.endsWith(`.mdx`)}function _(){return(0,p.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,p.jsx)(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),(0,p.jsx)(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})]})}function v(){return(0,p.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,p.jsx)(`rect`,{x:`9`,y:`9`,width:`13`,height:`13`,rx:`2`,ry:`2`}),(0,p.jsx)(`path`,{d:`M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1`})]})}function y(){return(0,p.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,p.jsx)(`path`,{d:`M12 20h9`}),(0,p.jsx)(`path`,{d:`M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z`})]})}var ne={margin:0,padding:`16px 20px`,fontFamily:`var(--font-mono)`,fontSize:`13px`,lineHeight:1.6,background:`var(--bg-code-block)`,minHeight:`100%`,whiteSpace:`pre-wrap`,wordBreak:`break-word`,overflowWrap:`anywhere`};function re({category:e,url:t}){return e===`image`?(0,p.jsx)(`div`,{style:{padding:`20px`,display:`flex`,justifyContent:`center`,alignItems:`flex-start`,minHeight:`100%`},children:(0,p.jsx)(`img`,{src:t,alt:`Preview`,loading:`lazy`,style:{maxWidth:`100%`,maxHeight:`80vh`,borderRadius:`var(--radius-sm)`},onError:e=>{e.target.style.display=`none`;let t=e.target.parentElement;t&&(t.innerHTML=`
Failed to load image
`)}})}):e===`pdf`?(0,p.jsx)(`iframe`,{src:t,title:`PDF Preview`,style:{width:`100%`,height:`100%`,border:`none`,minHeight:`80vh`}}):e===`audio`?(0,p.jsx)(`div`,{style:{padding:`40px 20px`,display:`flex`,justifyContent:`center`,alignItems:`center`,minHeight:`100%`},children:(0,p.jsx)(`audio`,{controls:!0,src:t,style:{width:`100%`,maxWidth:`500px`},children:`Your browser does not support audio playback.`})}):e===`video`?(0,p.jsx)(`div`,{style:{padding:`20px`,display:`flex`,justifyContent:`center`,alignItems:`center`,minHeight:`100%`},children:(0,p.jsx)(`video`,{controls:!0,src:t,style:{maxWidth:`100%`,maxHeight:`80vh`,borderRadius:`var(--radius-sm)`},children:`Your browser does not support video playback.`})}):(0,p.jsxs)(`div`,{style:{padding:`40px 24px`,textAlign:`center`,color:`var(--text-tertiary)`,fontSize:`13px`},children:[(0,p.jsx)(`div`,{style:{fontWeight:500,color:`var(--text-secondary)`,marginBottom:`6px`},children:e===`archive`?`Archive file`:`Binary file`}),(0,p.jsx)(`div`,{children:`Preview is not available for this file type.`})]})}function b(){let e=o(e=>e.viewingFilePath),t=o(e=>e.setViewingFilePath),[n,i]=(0,f.useState)(null),[b,x]=(0,f.useState)(!1),[S,C]=(0,f.useState)(null),[w,T]=(0,f.useState)(!1),[E,D]=(0,f.useState)(null),[ie,O]=(0,f.useState)(!1),[k,A]=(0,f.useState)(!1),[j,M]=(0,f.useState)(!1),[N,P]=(0,f.useState)(``),[F,I]=(0,f.useState)(!1),[L,R]=(0,f.useState)(null),z=(0,f.useRef)(null),[B,V]=(0,f.useState)(te),H=(0,f.useRef)(B);H.current=B;let[U,W]=(0,f.useState)(!1),[G,K]=(0,f.useState)(!1),q=(0,f.useMemo)(()=>e?c(e):`text`,[e]),J=q!==`text`;(0,f.useEffect)(()=>{let e=()=>{let e=Math.max(m,window.innerWidth-h);V(t=>Math.max(m,Math.min(t,e)))};return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let ae=(0,f.useCallback)(e=>{e.preventDefault();let t=e.clientX,n=H.current;W(!0);let r=e=>{let r=t-e.clientX,i=Math.max(m,window.innerWidth-h);V(Math.max(m,Math.min(n+r,i)))},i=()=>{W(!1),ee(a.FILE_VIEWER_WIDTH,String(H.current)),document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[]);(0,f.useEffect)(()=>{if(!e){i(null),D(null),C(null),O(!1),A(!1),M(!1),P(``),R(null);return}if(J){x(!1),i(null),D(null),C(null);return}let t=!1;return x(!0),C(null),M(!1),D(null),r.readFile(e).then(e=>{if(t)return;i(e),P(e.content);let n=g(e),r=e.content.length>1e5;!e.language||n||r||(e=>{let t=window;t.requestIdleCallback?t.requestIdleCallback(e):setTimeout(e,0)})(()=>{if(!t)try{let n=d.highlight(e.content,{language:e.language});t||D(n.value)}catch{}})}).catch(e=>{t||C(e instanceof Error?e.message:`Failed to read file`)}).finally(()=>{t||x(!1)}),()=>{t=!0}},[e,J]),(0,f.useEffect)(()=>{e&&requestAnimationFrame(()=>O(!0))},[e]),(0,f.useEffect)(()=>{j&&z.current?.focus()},[j]);let Y=j&&N!==(n?.content??``),oe=()=>{Y&&!window.confirm(`Discard unsaved changes?`)||(A(!0),setTimeout(()=>t(null),180))},X=async()=>{n&&(await navigator.clipboard.writeText(j?N:n.content).catch(()=>{}),T(!0),setTimeout(()=>T(!1),2e3))},se=()=>{n&&(P(n.content),R(null),M(!0))},ce=()=>{Y&&!window.confirm(`Discard unsaved changes?`)||(P(n?.content??``),R(null),M(!1))},Z=async()=>{if(!(!n||!e)){I(!0),R(null);try{if(await r.writeFile(e,N),i({...n,content:N,size:new Blob([N]).size}),n.language)try{D(d.highlight(N,{language:n.language}).value)}catch{D(null)}M(!1)}catch(e){R(e instanceof Error?e.message:`Save failed`)}finally{I(!1)}}};if((0,f.useEffect)(()=>{if(!j)return;let e=e=>{(e.metaKey||e.ctrlKey)&&e.key===`s`&&(e.preventDefault(),Z())};return document.addEventListener(`keydown`,e,{capture:!0}),()=>document.removeEventListener(`keydown`,e,{capture:!0})},[j,N,n,e]),!e)return null;let le=e.split(`/`).pop()||e,Q=ie&&!k,$={background:`none`,border:`none`,cursor:`pointer`,padding:`5px 9px`,borderRadius:`var(--radius-sm)`,display:`inline-flex`,alignItems:`center`,gap:`5px`,fontSize:`12px`,fontFamily:`var(--font-ui)`,color:`var(--text-tertiary)`,transition:`background 0.12s, color 0.12s`},ue=g(n)&&!j&&!G;return(0,p.jsx)(`div`,{"aria-hidden":!Q,style:{flex:`0 0 auto`,width:Q?`${B}px`:0,minWidth:0,overflow:`hidden`,transition:U?`none`:`width 180ms ease-out`},children:(0,p.jsxs)(`div`,{style:{width:`${B}px`,height:`100%`,display:`flex`,flexDirection:`column`,background:`var(--bg-base)`,borderLeft:`1px solid var(--border-subtle)`,position:`relative`,opacity:+!!Q,transition:U?`none`:`opacity 180ms ease-out`},children:[(0,p.jsx)(`div`,{onMouseDown:ae,title:`Drag to resize`,style:{position:`absolute`,top:0,bottom:0,left:0,width:`4px`,cursor:`col-resize`,zIndex:2,background:U?`var(--border-default)`:`transparent`,transition:`background 0.12s`},onMouseEnter:e=>{U||(e.currentTarget.style.background=`var(--border-default)`)},onMouseLeave:e=>{U||(e.currentTarget.style.background=`transparent`)}}),(0,p.jsxs)(`div`,{style:{height:`var(--header-height)`,display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`0 10px 0 18px`,borderBottom:`1px solid var(--border-subtle)`,flexShrink:0},children:[(0,p.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,overflow:`hidden`,flex:1,minWidth:0},children:[(0,p.jsx)(`span`,{style:{fontSize:`14px`,fontWeight:500,color:`var(--text-primary)`,fontFamily:`var(--font-ui)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:le}),n?.language&&(0,p.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-mono)`,flexShrink:0},children:n.language}),J&&(0,p.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-mono)`,flexShrink:0,textTransform:`uppercase`},children:q}),Y&&(0,p.jsx)(`span`,{title:`Unsaved changes`,style:{width:`6px`,height:`6px`,borderRadius:`50%`,background:`var(--accent-orange)`,flexShrink:0}})]}),(0,p.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`2px`,flexShrink:0},children:[n&&!j&&!J&&g(n)&&(0,p.jsx)(`button`,{onClick:()=>K(e=>!e),title:G?`Show rendered markdown`:`Show raw source`,style:{...$,color:G?`var(--text-primary)`:`var(--text-tertiary)`,background:G?`var(--bg-sidebar-hover)`:`none`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,G||(e.currentTarget.style.background=`var(--bg-sidebar-hover)`)},onMouseLeave:e=>{G||(e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`)},children:G?`Preview`:`Raw`}),n&&!j&&!J&&(0,p.jsxs)(`button`,{onClick:se,title:`Edit`,style:$,onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:[(0,p.jsx)(y,{}),` Edit`]}),j&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`button`,{onClick:Z,disabled:!Y||F,title:`Save (⌘S)`,style:{...$,color:Y&&!F?`var(--accent-orange)`:`var(--text-tertiary)`,cursor:Y&&!F?`pointer`:`default`,fontWeight:500},children:F?`Saving…`:`Save`}),(0,p.jsx)(`button`,{onClick:ce,title:`Cancel`,style:$,onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:`Cancel`})]}),n&&!J&&(0,p.jsx)(`button`,{onClick:X,title:w?`Copied!`:`Copy`,style:{...$,color:w?`var(--accent-orange)`:`var(--text-tertiary)`},onMouseEnter:e=>{w||(e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`)},onMouseLeave:e=>{w||(e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`)},children:(0,p.jsx)(v,{})}),(0,p.jsx)(`button`,{onClick:oe,"aria-label":`Close file viewer`,style:$,onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:(0,p.jsx)(_,{})})]})]}),L&&(0,p.jsx)(`div`,{style:{padding:`8px 18px`,fontSize:`12px`,background:`var(--tool-error-bg)`,color:`var(--tool-error-text)`,borderBottom:`1px solid var(--tool-error-border)`},children:L}),j?(0,p.jsx)(`textarea`,{ref:z,value:N,onChange:e=>P(e.target.value),spellCheck:!1,style:{flex:1,width:`100%`,margin:0,padding:`16px 20px`,fontFamily:`var(--font-mono)`,fontSize:`13px`,lineHeight:1.6,background:`var(--bg-code-block)`,color:`var(--text-code)`,border:`none`,outline:`none`,resize:`none`,whiteSpace:`pre-wrap`,wordBreak:`break-word`,overflowWrap:`anywhere`,overflowY:`auto`,tabSize:2}}):(0,p.jsxs)(s,{style:{flex:1},children:[b&&(0,p.jsx)(`div`,{style:{padding:`24px`,textAlign:`center`,color:`var(--text-tertiary)`,fontSize:`13px`},children:`Loading…`}),S&&(0,p.jsx)(`div`,{style:{padding:`24px`,color:`var(--tool-error-text)`,fontSize:`13px`},children:S}),!b&&!S&&J&&e&&(0,p.jsx)(re,{category:q,url:l(e)}),n&&!b&&!J&&(ue?(0,p.jsx)(`div`,{style:{padding:`20px 24px`},children:(0,p.jsx)(u,{text:n.content})}):(0,p.jsx)(`pre`,{style:ne,children:E?(0,p.jsx)(`code`,{dangerouslySetInnerHTML:{__html:E}}):(0,p.jsx)(`code`,{children:n.content})}))]})]})})}export{b as FileViewer,b as default}; \ No newline at end of file +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{c as r,g as i,m as a,p as o,v as ee}from"./index-XPrlVfCr.js";import{i as s}from"./ScrollContainer-CA7-aYqv.js";import{n as c,t as l}from"./fileType-BHvAriyJ.js";import{n as u,t as d}from"./hljs-CvdnYs1C.js";var f=e(t(),1),p=n(),m=360,h=360;function te(){if(typeof window>`u`)return 720;let e=i(a.FILE_VIEWER_WIDTH),t=e?Number(e):NaN;return Number.isFinite(t)?t:720}function g(e){if(!e)return!1;if(e.language===`markdown`)return!0;let t=e.name.toLowerCase();return t.endsWith(`.md`)||t.endsWith(`.markdown`)||t.endsWith(`.mdx`)}function _(){return(0,p.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,p.jsx)(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),(0,p.jsx)(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})]})}function v(){return(0,p.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,p.jsx)(`rect`,{x:`9`,y:`9`,width:`13`,height:`13`,rx:`2`,ry:`2`}),(0,p.jsx)(`path`,{d:`M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1`})]})}function y(){return(0,p.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,p.jsx)(`path`,{d:`M12 20h9`}),(0,p.jsx)(`path`,{d:`M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z`})]})}var ne={margin:0,padding:`16px 20px`,fontFamily:`var(--font-mono)`,fontSize:`13px`,lineHeight:1.6,background:`var(--bg-code-block)`,minHeight:`100%`,whiteSpace:`pre-wrap`,wordBreak:`break-word`,overflowWrap:`anywhere`};function re({category:e,url:t}){return e===`image`?(0,p.jsx)(`div`,{style:{padding:`20px`,display:`flex`,justifyContent:`center`,alignItems:`flex-start`,minHeight:`100%`},children:(0,p.jsx)(`img`,{src:t,alt:`Preview`,loading:`lazy`,style:{maxWidth:`100%`,maxHeight:`80vh`,borderRadius:`var(--radius-sm)`},onError:e=>{e.target.style.display=`none`;let t=e.target.parentElement;t&&(t.innerHTML=`
Failed to load image
`)}})}):e===`pdf`?(0,p.jsx)(`iframe`,{src:t,title:`PDF Preview`,style:{width:`100%`,height:`100%`,border:`none`,minHeight:`80vh`}}):e===`audio`?(0,p.jsx)(`div`,{style:{padding:`40px 20px`,display:`flex`,justifyContent:`center`,alignItems:`center`,minHeight:`100%`},children:(0,p.jsx)(`audio`,{controls:!0,src:t,style:{width:`100%`,maxWidth:`500px`},children:`Your browser does not support audio playback.`})}):e===`video`?(0,p.jsx)(`div`,{style:{padding:`20px`,display:`flex`,justifyContent:`center`,alignItems:`center`,minHeight:`100%`},children:(0,p.jsx)(`video`,{controls:!0,src:t,style:{maxWidth:`100%`,maxHeight:`80vh`,borderRadius:`var(--radius-sm)`},children:`Your browser does not support video playback.`})}):(0,p.jsxs)(`div`,{style:{padding:`40px 24px`,textAlign:`center`,color:`var(--text-tertiary)`,fontSize:`13px`},children:[(0,p.jsx)(`div`,{style:{fontWeight:500,color:`var(--text-secondary)`,marginBottom:`6px`},children:e===`archive`?`Archive file`:`Binary file`}),(0,p.jsx)(`div`,{children:`Preview is not available for this file type.`})]})}function b(){let e=o(e=>e.viewingFilePath),t=o(e=>e.setViewingFilePath),[n,i]=(0,f.useState)(null),[b,x]=(0,f.useState)(!1),[S,C]=(0,f.useState)(null),[w,T]=(0,f.useState)(!1),[E,D]=(0,f.useState)(null),[ie,O]=(0,f.useState)(!1),[k,A]=(0,f.useState)(!1),[j,M]=(0,f.useState)(!1),[N,P]=(0,f.useState)(``),[F,I]=(0,f.useState)(!1),[L,R]=(0,f.useState)(null),z=(0,f.useRef)(null),[B,V]=(0,f.useState)(te),H=(0,f.useRef)(B);H.current=B;let[U,W]=(0,f.useState)(!1),[G,K]=(0,f.useState)(!1),q=(0,f.useMemo)(()=>e?c(e):`text`,[e]),J=q!==`text`;(0,f.useEffect)(()=>{let e=()=>{let e=Math.max(m,window.innerWidth-h);V(t=>Math.max(m,Math.min(t,e)))};return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let ae=(0,f.useCallback)(e=>{e.preventDefault();let t=e.clientX,n=H.current;W(!0);let r=e=>{let r=t-e.clientX,i=Math.max(m,window.innerWidth-h);V(Math.max(m,Math.min(n+r,i)))},i=()=>{W(!1),ee(a.FILE_VIEWER_WIDTH,String(H.current)),document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[]);(0,f.useEffect)(()=>{if(!e){i(null),D(null),C(null),O(!1),A(!1),M(!1),P(``),R(null);return}if(J){x(!1),i(null),D(null),C(null);return}let t=!1;return x(!0),C(null),M(!1),D(null),r.readFile(e).then(e=>{if(t)return;i(e),P(e.content);let n=g(e),r=e.content.length>1e5;!e.language||n||r||(e=>{let t=window;t.requestIdleCallback?t.requestIdleCallback(e):setTimeout(e,0)})(()=>{if(!t)try{let n=d.highlight(e.content,{language:e.language});t||D(n.value)}catch{}})}).catch(e=>{t||C(e instanceof Error?e.message:`Failed to read file`)}).finally(()=>{t||x(!1)}),()=>{t=!0}},[e,J]),(0,f.useEffect)(()=>{e&&requestAnimationFrame(()=>O(!0))},[e]),(0,f.useEffect)(()=>{j&&z.current?.focus()},[j]);let Y=j&&N!==(n?.content??``),oe=()=>{Y&&!window.confirm(`Discard unsaved changes?`)||(A(!0),setTimeout(()=>t(null),180))},X=async()=>{n&&(await navigator.clipboard.writeText(j?N:n.content).catch(()=>{}),T(!0),setTimeout(()=>T(!1),2e3))},se=()=>{n&&(P(n.content),R(null),M(!0))},ce=()=>{Y&&!window.confirm(`Discard unsaved changes?`)||(P(n?.content??``),R(null),M(!1))},Z=async()=>{if(!(!n||!e)){I(!0),R(null);try{if(await r.writeFile(e,N),i({...n,content:N,size:new Blob([N]).size}),n.language)try{D(d.highlight(N,{language:n.language}).value)}catch{D(null)}M(!1)}catch(e){R(e instanceof Error?e.message:`Save failed`)}finally{I(!1)}}};if((0,f.useEffect)(()=>{if(!j)return;let e=e=>{(e.metaKey||e.ctrlKey)&&e.key===`s`&&(e.preventDefault(),Z())};return document.addEventListener(`keydown`,e,{capture:!0}),()=>document.removeEventListener(`keydown`,e,{capture:!0})},[j,N,n,e]),!e)return null;let le=e.split(`/`).pop()||e,Q=ie&&!k,$={background:`none`,border:`none`,cursor:`pointer`,padding:`5px 9px`,borderRadius:`var(--radius-sm)`,display:`inline-flex`,alignItems:`center`,gap:`5px`,fontSize:`12px`,fontFamily:`var(--font-ui)`,color:`var(--text-tertiary)`,transition:`background 0.12s, color 0.12s`},ue=g(n)&&!j&&!G;return(0,p.jsx)(`div`,{"aria-hidden":!Q,style:{flex:`0 0 auto`,width:Q?`${B}px`:0,minWidth:0,overflow:`hidden`,transition:U?`none`:`width 180ms ease-out`},children:(0,p.jsxs)(`div`,{style:{width:`${B}px`,height:`100%`,display:`flex`,flexDirection:`column`,background:`var(--bg-base)`,borderLeft:`1px solid var(--border-subtle)`,position:`relative`,opacity:+!!Q,transition:U?`none`:`opacity 180ms ease-out`},children:[(0,p.jsx)(`div`,{onMouseDown:ae,title:`Drag to resize`,style:{position:`absolute`,top:0,bottom:0,left:0,width:`4px`,cursor:`col-resize`,zIndex:2,background:U?`var(--border-default)`:`transparent`,transition:`background 0.12s`},onMouseEnter:e=>{U||(e.currentTarget.style.background=`var(--border-default)`)},onMouseLeave:e=>{U||(e.currentTarget.style.background=`transparent`)}}),(0,p.jsxs)(`div`,{style:{height:`var(--header-height)`,display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`0 10px 0 18px`,borderBottom:`1px solid var(--border-subtle)`,flexShrink:0},children:[(0,p.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,overflow:`hidden`,flex:1,minWidth:0},children:[(0,p.jsx)(`span`,{style:{fontSize:`14px`,fontWeight:500,color:`var(--text-primary)`,fontFamily:`var(--font-ui)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:le}),n?.language&&(0,p.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-mono)`,flexShrink:0},children:n.language}),J&&(0,p.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-mono)`,flexShrink:0,textTransform:`uppercase`},children:q}),Y&&(0,p.jsx)(`span`,{title:`Unsaved changes`,style:{width:`6px`,height:`6px`,borderRadius:`50%`,background:`var(--accent-orange)`,flexShrink:0}})]}),(0,p.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`2px`,flexShrink:0},children:[n&&!j&&!J&&g(n)&&(0,p.jsx)(`button`,{onClick:()=>K(e=>!e),title:G?`Show rendered markdown`:`Show raw source`,style:{...$,color:G?`var(--text-primary)`:`var(--text-tertiary)`,background:G?`var(--bg-sidebar-hover)`:`none`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,G||(e.currentTarget.style.background=`var(--bg-sidebar-hover)`)},onMouseLeave:e=>{G||(e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`)},children:G?`Preview`:`Raw`}),n&&!j&&!J&&(0,p.jsxs)(`button`,{onClick:se,title:`Edit`,style:$,onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:[(0,p.jsx)(y,{}),` Edit`]}),j&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`button`,{onClick:Z,disabled:!Y||F,title:`Save (⌘S)`,style:{...$,color:Y&&!F?`var(--accent-orange)`:`var(--text-tertiary)`,cursor:Y&&!F?`pointer`:`default`,fontWeight:500},children:F?`Saving…`:`Save`}),(0,p.jsx)(`button`,{onClick:ce,title:`Cancel`,style:$,onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:`Cancel`})]}),n&&!J&&(0,p.jsx)(`button`,{onClick:X,title:w?`Copied!`:`Copy`,style:{...$,color:w?`var(--accent-orange)`:`var(--text-tertiary)`},onMouseEnter:e=>{w||(e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`)},onMouseLeave:e=>{w||(e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`)},children:(0,p.jsx)(v,{})}),(0,p.jsx)(`button`,{onClick:oe,"aria-label":`Close file viewer`,style:$,onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:(0,p.jsx)(_,{})})]})]}),L&&(0,p.jsx)(`div`,{style:{padding:`8px 18px`,fontSize:`12px`,background:`var(--tool-error-bg)`,color:`var(--tool-error-text)`,borderBottom:`1px solid var(--tool-error-border)`},children:L}),j?(0,p.jsx)(`textarea`,{ref:z,value:N,onChange:e=>P(e.target.value),spellCheck:!1,style:{flex:1,width:`100%`,margin:0,padding:`16px 20px`,fontFamily:`var(--font-mono)`,fontSize:`13px`,lineHeight:1.6,background:`var(--bg-code-block)`,color:`var(--text-code)`,border:`none`,outline:`none`,resize:`none`,whiteSpace:`pre-wrap`,wordBreak:`break-word`,overflowWrap:`anywhere`,overflowY:`auto`,tabSize:2}}):(0,p.jsxs)(s,{style:{flex:1},children:[b&&(0,p.jsx)(`div`,{style:{padding:`24px`,textAlign:`center`,color:`var(--text-tertiary)`,fontSize:`13px`},children:`Loading…`}),S&&(0,p.jsx)(`div`,{style:{padding:`24px`,color:`var(--tool-error-text)`,fontSize:`13px`},children:S}),!b&&!S&&J&&e&&(0,p.jsx)(re,{category:q,url:l(e)}),n&&!b&&!J&&(ue?(0,p.jsx)(`div`,{style:{padding:`20px 24px`},children:(0,p.jsx)(u,{text:n.content})}):(0,p.jsx)(`pre`,{style:ne,children:E?(0,p.jsx)(`code`,{dangerouslySetInnerHTML:{__html:E}}):(0,p.jsx)(`code`,{children:n.content})}))]})]})})}export{b as FileViewer,b as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/HelpPopup-sd9kGRO6.js b/src/agent_decoder/static/assets/HelpPopup-BYhBIvA6.js similarity index 97% rename from src/agent_decoder/static/assets/HelpPopup-sd9kGRO6.js rename to src/agent_decoder/static/assets/HelpPopup-BYhBIvA6.js index bfc9673d..19fbc5e2 100644 --- a/src/agent_decoder/static/assets/HelpPopup-sd9kGRO6.js +++ b/src/agent_decoder/static/assets/HelpPopup-BYhBIvA6.js @@ -1 +1 @@ -import{t as e}from"./react-CCIEwYL0.js";import{p as t}from"./index-Egnd1H3-.js";import{i as n}from"./ScrollContainer-CA7-aYqv.js";var r=e(),i=[{title:`Browsing Sessions`,items:[`The sidebar shows all your conversation sessions grouped by project.`,`Click a session to open it. Use the sort buttons to switch between recent, oldest, or project order.`,`Star frequently used sessions for quick access. Archive sessions you no longer need.`]},{title:`Search`,items:[`Press ⌘K to open search. Search across all session content including tool use, file paths, and thinking blocks.`]},{title:`Profiles`,items:[`Switch between profiles to view sessions from different config directories.`,`Click the avatar in the bottom-left to open the profile switcher.`,`Manage profiles and their data paths in Settings.`]},{title:`Reading Conversations`,items:[`Tool use blocks show files read, commands run, and edits made.`,`Thinking blocks reveal the AI's reasoning process.`,`Press ⌘O to expand or collapse all tool and thinking blocks at once.`,`Press ⌘E to toggle full tool output without truncation.`]}];function a(){let e=t(e=>e.closeHelp);return(0,r.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Help`,onClick:t=>{t.target===t.currentTarget&&e()},style:{position:`fixed`,inset:0,zIndex:1e3,background:`var(--bg-modal-overlay)`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`16px`},children:(0,r.jsxs)(`div`,{style:{width:`100%`,maxWidth:`520px`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,boxShadow:`var(--shadow-lg)`,maxHeight:`calc(100vh - 64px)`,overflow:`hidden`,display:`flex`,flexDirection:`column`},onClick:e=>e.stopPropagation(),children:[(0,r.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`20px 24px 16px`,borderBottom:`1px solid var(--border-subtle)`},children:[(0,r.jsx)(`h2`,{style:{margin:0,fontSize:`16px`,fontWeight:600,color:`var(--text-primary)`},children:`Help`}),(0,r.jsx)(`button`,{onClick:e,"aria-label":`Close help`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`20px`,lineHeight:1,padding:`4px`},children:`×`})]}),(0,r.jsx)(n,{style:{flex:1,padding:`20px 24px`},children:i.map(e=>(0,r.jsxs)(`div`,{style:{marginBottom:`20px`},children:[(0,r.jsx)(`div`,{style:{fontSize:`13px`,fontWeight:600,color:`var(--text-primary)`,marginBottom:`6px`},children:e.title}),(0,r.jsx)(`ul`,{style:{margin:0,paddingLeft:`18px`,display:`flex`,flexDirection:`column`,gap:`4px`},children:e.items.map((e,t)=>(0,r.jsx)(`li`,{style:{fontSize:`13px`,color:`var(--text-secondary)`,lineHeight:1.5},children:e},t))})]},e.title))})]})})}export{a as default}; \ No newline at end of file +import{t as e}from"./react-CCIEwYL0.js";import{p as t}from"./index-XPrlVfCr.js";import{i as n}from"./ScrollContainer-CA7-aYqv.js";var r=e(),i=[{title:`Browsing Sessions`,items:[`The sidebar shows all your conversation sessions grouped by project.`,`Click a session to open it. Use the sort buttons to switch between recent, oldest, or project order.`,`Star frequently used sessions for quick access. Archive sessions you no longer need.`]},{title:`Search`,items:[`Press ⌘K to open search. Search across all session content including tool use, file paths, and thinking blocks.`]},{title:`Profiles`,items:[`Switch between profiles to view sessions from different config directories.`,`Click the avatar in the bottom-left to open the profile switcher.`,`Manage profiles and their data paths in Settings.`]},{title:`Reading Conversations`,items:[`Tool use blocks show files read, commands run, and edits made.`,`Thinking blocks reveal the AI's reasoning process.`,`Press ⌘O to expand or collapse all tool and thinking blocks at once.`,`Press ⌘E to toggle full tool output without truncation.`]}];function a(){let e=t(e=>e.closeHelp);return(0,r.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Help`,onClick:t=>{t.target===t.currentTarget&&e()},style:{position:`fixed`,inset:0,zIndex:1e3,background:`var(--bg-modal-overlay)`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`16px`},children:(0,r.jsxs)(`div`,{style:{width:`100%`,maxWidth:`520px`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,boxShadow:`var(--shadow-lg)`,maxHeight:`calc(100vh - 64px)`,overflow:`hidden`,display:`flex`,flexDirection:`column`},onClick:e=>e.stopPropagation(),children:[(0,r.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`20px 24px 16px`,borderBottom:`1px solid var(--border-subtle)`},children:[(0,r.jsx)(`h2`,{style:{margin:0,fontSize:`16px`,fontWeight:600,color:`var(--text-primary)`},children:`Help`}),(0,r.jsx)(`button`,{onClick:e,"aria-label":`Close help`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`20px`,lineHeight:1,padding:`4px`},children:`×`})]}),(0,r.jsx)(n,{style:{flex:1,padding:`20px 24px`},children:i.map(e=>(0,r.jsxs)(`div`,{style:{marginBottom:`20px`},children:[(0,r.jsx)(`div`,{style:{fontSize:`13px`,fontWeight:600,color:`var(--text-primary)`,marginBottom:`6px`},children:e.title}),(0,r.jsx)(`ul`,{style:{margin:0,paddingLeft:`18px`,display:`flex`,flexDirection:`column`,gap:`4px`},children:e.items.map((e,t)=>(0,r.jsx)(`li`,{style:{fontSize:`13px`,color:`var(--text-secondary)`,lineHeight:1.5},children:e},t))})]},e.title))})]})})}export{a as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/Runs-DvLUpR9O.js b/src/agent_decoder/static/assets/Runs-DvLUpR9O.js new file mode 100644 index 00000000..42a6f63f --- /dev/null +++ b/src/agent_decoder/static/assets/Runs-DvLUpR9O.js @@ -0,0 +1 @@ +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{S as r,c as i,x as a}from"./index-XPrlVfCr.js";import{t as o}from"./useDebounce-CRtjXm0i.js";var s=e(t(),1),c=n(),l=[`queued`,`starting`,`running`,`awaiting_input`,`blocked`,`completed`,`failed`,`canceled`],u=e=>e?new Date(e).toLocaleString():`Not yet observed`,d=e=>e.replace(/_/g,` `),f=e=>e.last_observed_at?`${u(e.last_observed_at)}${!e.ended_at&&Date.now()-Date.parse(e.last_observed_at)>3e4?` (stale)`:``}`:`—`;function p(){let e=r(),t=e.startsWith(`/runs/`)?e.slice(6):null,[n,a]=(0,s.useState)(null),[p,g]=(0,s.useState)(!1),[_,v]=(0,s.useState)(0),[y,b]=(0,s.useState)([]),[x,S]=(0,s.useState)(!0),[C,w]=(0,s.useState)(``),[T,E]=(0,s.useState)(``),D=o(T,200),[O,k]=(0,s.useState)(``),[A,j]=(0,s.useState)(``),[M,N]=(0,s.useState)(``),P=o(M,200),F=(0,s.useRef)(0),I=(0,s.useCallback)(async()=>{let e=++F.current,n=new URLSearchParams({provider:O,state:A,project:P,q:D,limit:`50`,offset:String(_*50)});try{let r=await i.getRuns(`?${n}`),o=null,s=!1;if(t)try{o=await i.getRun(t)}catch(e){if(e instanceof Error&&e.message.includes(`404`))s=!0;else throw e}if(e!==F.current)return;b(r),a(o),g(s),w(``)}catch(t){e===F.current&&w(t instanceof Error?t.message:`Could not load runs`)}finally{e===F.current&&S(!1)}},[O,A,P,D,_,t]);(0,s.useEffect)(()=>{S(!0),I();let e=new EventSource(`/api/events`);e.onmessage=e=>{try{[`runs_changed`,`refresh`].includes(JSON.parse(e.data).type)&&I()}catch{}},e.onopen=()=>void I();let t=window.setInterval(()=>void I(),15e3);return()=>{++F.current,e.close(),window.clearInterval(t)}},[I]);let L=!!(O||A||M||T||_);return(0,c.jsxs)(`main`,{className:`runs-page`,children:[(0,c.jsxs)(`header`,{children:[(0,c.jsx)(`h1`,{children:`Runs`}),(0,c.jsx)(`p`,{children:`Execution history across Claude and Codex.`})]}),(0,c.jsxs)(`div`,{className:`runs-filters`,children:[(0,c.jsxs)(`label`,{children:[`Search`,(0,c.jsx)(`input`,{value:T,onChange:e=>{v(0),E(e.target.value)},placeholder:`Branch, model, session…`})]}),(0,c.jsxs)(`label`,{children:[`Provider`,(0,c.jsxs)(`select`,{value:O,onChange:e=>{v(0),k(e.target.value)},children:[(0,c.jsx)(`option`,{value:``,children:`All providers`}),(0,c.jsx)(`option`,{children:`claude`}),(0,c.jsx)(`option`,{children:`codex`})]})]}),(0,c.jsxs)(`label`,{children:[`State`,(0,c.jsxs)(`select`,{value:A,onChange:e=>{v(0),j(e.target.value)},children:[(0,c.jsx)(`option`,{value:``,children:`All states`}),l.map(e=>(0,c.jsx)(`option`,{value:e,children:d(e)},e))]})]}),(0,c.jsxs)(`label`,{children:[`Project`,(0,c.jsx)(`input`,{value:M,onChange:e=>{v(0),N(e.target.value)},placeholder:`Project ID (exact)`})]}),(0,c.jsx)(`button`,{onClick:()=>void I(),children:`Refresh`})]}),C&&(0,c.jsxs)(`p`,{role:`alert`,children:[C,` `,(0,c.jsx)(`button`,{onClick:()=>void I(),children:`Retry`})]}),x?(0,c.jsx)(`p`,{role:`status`,children:`Loading runs…`}):(0,c.jsxs)(c.Fragment,{children:[t&&(n?(0,c.jsx)(h,{run:n}):p?(0,c.jsxs)(`p`,{role:`status`,children:[`Run not found. `,(0,c.jsx)(`a`,{href:`#/runs`,children:`View all runs`})]}):null),!C&&!y.length&&(0,c.jsx)(`p`,{role:`status`,children:L?`No runs match these filters.`:`No managed runs yet. Open a session and attach its managed terminal to create a run. Historical chats are not automatically live runs.`}),(0,c.jsx)(`div`,{className:`runs-list`,children:y.map(e=>(0,c.jsxs)(`article`,{className:`run-card`,children:[(0,c.jsxs)(`div`,{className:`run-card-title`,children:[(0,c.jsx)(`a`,{href:`#/runs/${e.id}`,children:(0,c.jsxs)(`strong`,{children:[e.provider,` · `,e.model||`Model unknown`]})}),(0,c.jsx)(`span`,{className:`run-state run-state-${e.state}`,children:d(e.state)})]}),(0,c.jsxs)(`p`,{children:[e.project_id||e.cwd||`Project unknown`,` · `,e.git_branch||`Branch unknown`,e.is_worktree?` · Worktree`:``]}),(0,c.jsx)(`p`,{children:e.reason}),(0,c.jsxs)(`small`,{children:[`Started `,u(e.created_at),` · Last observed `,f(e)]}),(0,c.jsx)(`p`,{children:(0,c.jsx)(m,{run:e})})]},e.id))}),(0,c.jsxs)(`nav`,{className:`runs-pagination`,"aria-label":`Run pages`,children:[(0,c.jsx)(`button`,{disabled:!_||x,onClick:()=>v(_-1),children:`Previous`}),(0,c.jsxs)(`span`,{children:[`Page `,_+1]}),(0,c.jsx)(`button`,{disabled:y.length<50||x,onClick:()=>v(_+1),children:`Next`})]})]})]})}function m({run:e}){return e.source_available?(0,c.jsx)(`a`,{href:`#/chat/${e.native_session_id}`,children:`Open decoded chat / native terminal`}):(0,c.jsx)(`span`,{className:`run-muted`,children:`Source chat unavailable; run history retained`})}function h({run:e}){let t={"Run ID":e.id,"Native session":e.native_session_id,State:d(e.state),Reason:e.reason,"State evidence":e.provenance,Provider:e.provider,Model:e.model||`Unknown`,Project:e.project_id||`Unknown`,Directory:e.cwd||`Unknown`,Branch:e.git_branch||`Unknown`,Worktree:e.is_worktree?`Yes`:`No`,Created:u(e.created_at),Updated:u(e.updated_at),"Last observed":f(e),Ended:e.ended_at?u(e.ended_at):`No ending recorded`,Task:e.task_id||`Not linked`,"Parent run":e.parent_run_id||`Not linked`};return(0,c.jsxs)(`section`,{"aria-label":`Run details`,className:`run-card run-detail`,children:[(0,c.jsxs)(`div`,{className:`run-card-title`,children:[(0,c.jsx)(`h2`,{children:`Run details`}),(0,c.jsx)(`button`,{onClick:()=>a(`/runs`),children:`Close details`})]}),(0,c.jsx)(`dl`,{children:Object.entries(t).map(([e,t])=>(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`dt`,{children:e}),(0,c.jsx)(`dd`,{children:t})]},e))}),(0,c.jsx)(`p`,{children:(0,c.jsx)(m,{run:e})}),!e.ended_at&&(0,c.jsx)(`p`,{className:`run-muted`,children:`An idle prompt or process exit does not establish task success. Live state is best-effort. Check the last observation time; restart or transport loss may leave this attempt detached or unobserved.`})]})}export{p as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/Runs-Y8oF-gxW.css b/src/agent_decoder/static/assets/Runs-Y8oF-gxW.css new file mode 100644 index 00000000..c14a9564 --- /dev/null +++ b/src/agent_decoder/static/assets/Runs-Y8oF-gxW.css @@ -0,0 +1 @@ +.runs-page{min-width:0;color:var(--text-primary);font-family:var(--font-ui);flex:1;padding:28px;overflow:auto}.runs-page header,.runs-filters,.runs-list,.runs-pagination,.run-detail{max-width:1100px;margin-inline:auto}.runs-page header p,.run-muted,.runs-page small,.run-detail dt{color:var(--text-secondary)}.runs-page h1{margin-top:0;font-size:26px}.runs-page h2{margin:0;font-size:18px}.runs-page p{line-height:1.5}.runs-page a{color:var(--text-accent);text-underline-offset:3px}.runs-filters{flex-wrap:wrap;align-items:end;gap:12px;margin-block:24px;display:flex}.runs-filters label{flex:140px;gap:6px;font-size:12px;display:grid}.runs-page input,.runs-page select,.runs-page button{font:inherit;color:var(--text-primary);background:var(--bg-input);border:1px solid var(--border-default);border-radius:var(--radius-sm);min-width:0;min-height:36px;padding:8px 10px}.runs-page input,.runs-page select{box-sizing:border-box;width:100%}.runs-page button{cursor:pointer}.runs-page button:hover:not(:disabled){background:var(--bg-sidebar-hover)}.runs-page button:disabled{opacity:.45;cursor:default}.runs-page :focus-visible{outline:2px solid var(--border-accent);outline-offset:2px}.runs-list{gap:12px;display:grid}.run-card{border:1px solid var(--border-default);border-radius:var(--radius-md);overflow-wrap:anywhere;background:var(--bg-base);padding:18px}.run-card-title{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}.run-state{border:1px solid var(--border-default);border-radius:20px;padding:3px 8px;font-size:12px}.run-state-blocked,.run-state-failed{color:var(--tool-error-text)}.run-detail{box-sizing:border-box;margin-bottom:20px}.run-detail dl{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px 24px;display:grid}.run-detail dt{margin-bottom:4px;font-size:12px}.run-detail dd{margin:0;font-size:13px}.runs-pagination{justify-content:center;align-items:center;gap:16px;padding-block:20px;display:flex}@media (width<=600px){.runs-page{padding:16px}.run-card{padding:14px}.run-detail dl{grid-template-columns:1fr}} diff --git a/src/agent_decoder/static/assets/SearchOverlay-CF4dXG6x.js b/src/agent_decoder/static/assets/SearchOverlay-CF4dXG6x.js new file mode 100644 index 00000000..84e8faf1 --- /dev/null +++ b/src/agent_decoder/static/assets/SearchOverlay-CF4dXG6x.js @@ -0,0 +1 @@ +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{a as r,c as i,p as a,x as o}from"./index-XPrlVfCr.js";import{n as s,t as c}from"./sessionCache-Cj3FsbQ4.js";import{i as l}from"./ScrollContainer-CA7-aYqv.js";import{t as u}from"./useDebounce-CRtjXm0i.js";import{t as d}from"./renderSnippet-CcNMfZRd.js";import{n as f}from"./SessionItem-BUejVuL5.js";var p=e(t(),1),m=n(),h=50;function g(){let e=a(e=>e.closeSearch),t=a(e=>e.setPendingScrollMessageId),[n,g]=(0,p.useState)(``),[_,v]=(0,p.useState)([]),[y,b]=(0,p.useState)(!1),[x,S]=(0,p.useState)(!1),[C,w]=(0,p.useState)(!1),[T,E]=(0,p.useState)(0),D=r(),O=(0,p.useRef)(null),k=(0,p.useRef)(null),A=(0,p.useRef)(null),j=u(n,300);(0,p.useEffect)(()=>{let e=k.current;e&&e.children[T]?.scrollIntoView({block:`nearest`})},[T]),(0,p.useEffect)(()=>{O.current?.focus()},[]),(0,p.useEffect)(()=>{let t=t=>{if(t.key===`Escape`){e();return}if(t.key!==`Tab`||!A.current)return;let n=A.current.querySelectorAll(`input, button, [tabindex]:not([tabindex="-1"])`);if(n.length===0)return;let r=n[0],i=n[n.length-1];t.shiftKey&&document.activeElement===r?(t.preventDefault(),i.focus()):!t.shiftKey&&document.activeElement===i&&(t.preventDefault(),r.focus())};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]),(0,p.useEffect)(()=>{if(j.length<2){v([]),w(!1);return}let e=!1;return b(!0),i.search(j,void 0,h).then(t=>{e||(v(t),w(t.length===h),E(0))}).catch(()=>{e||(v([]),w(!1))}).finally(()=>{e||b(!1)}),()=>{e=!0}},[j]);let M=(0,p.useCallback)(()=>{x||(S(!0),i.search(j,void 0,h,_.length).then(e=>{v(t=>[...t,...e]),w(e.length===h)}).catch(()=>w(!1)).finally(()=>S(!1)))},[j,_.length,x]),N=(0,p.useCallback)(n=>{D.has(n.session_id)&&D.remove(n.session_id),t(n.message_id);let r=()=>{o(`/chat/${n.session_id}`),e()};s(n.session_id)?r():c(n.session_id,i.getSession).then(r).catch(r)},[e,t,D]);return(0,m.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Search conversations`,style:{position:`fixed`,inset:0,zIndex:1e3,background:`var(--bg-modal-overlay)`,display:`flex`,alignItems:`flex-start`,justifyContent:`center`,paddingTop:`180px`},onClick:t=>{t.target===t.currentTarget&&e()},children:(0,m.jsxs)(`div`,{ref:A,style:{width:`100%`,maxWidth:`600px`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,boxShadow:`var(--shadow-lg)`,overflow:`hidden`,margin:`0 16px`},onClick:e=>e.stopPropagation(),children:[(0,m.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,padding:`16px`,borderBottom:_.length>0||y?`1px solid var(--border-subtle)`:`none`,gap:`12px`},children:[(0,m.jsx)(`span`,{style:{fontSize:`16px`,color:`var(--text-tertiary)`},children:`⌕`}),(0,m.jsx)(`input`,{ref:O,type:`text`,value:n,onChange:e=>g(e.target.value),onKeyDown:e=>{e.key===`ArrowDown`?(e.preventDefault(),E(e=>Math.min(e+1,_.length-1))):e.key===`ArrowUp`?(e.preventDefault(),E(e=>Math.max(e-1,0))):e.key===`Enter`&&_[T]&&N(_[T])},placeholder:`Search conversations… "phrase" -exclude role:user`,style:{flex:1,border:`none`,outline:`none`,background:`transparent`,fontSize:`15px`,color:`var(--text-primary)`,fontFamily:`var(--font-ui)`}}),y&&(0,m.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:`Searching…`}),(0,m.jsx)(`kbd`,{onClick:e,style:{fontSize:`11px`,color:`var(--text-tertiary)`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-default)`,borderRadius:`4px`,padding:`2px 6px`,cursor:`pointer`,fontFamily:`var(--font-ui)`},children:`Esc`})]}),_.length>0&&(0,m.jsxs)(l,{style:{maxHeight:`400px`},children:[(0,m.jsx)(`ul`,{ref:k,role:`listbox`,style:{listStyle:`none`,margin:0,padding:`8px 0`},children:_.map((e,t)=>(0,m.jsxs)(`li`,{role:`option`,"aria-selected":t===T,onClick:()=>N(e),onMouseEnter:()=>E(t),style:{padding:`10px 16px`,cursor:`pointer`,background:t===T?`var(--bg-sidebar-hover)`:`transparent`,transition:`background var(--transition-fast)`},children:[(0,m.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,marginBottom:`3px`,minWidth:0},children:[(0,m.jsx)(`span`,{style:{fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,flex:1},children:e.session_title??`Untitled`}),D.has(e.session_id)&&(0,m.jsx)(`span`,{style:{fontSize:`10px`,color:`var(--text-tertiary)`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-pill)`,padding:`1px 6px`,flexShrink:0,fontFamily:`var(--font-ui)`},children:`archived`}),e.source===`ephemeral`&&(0,m.jsx)(`span`,{"aria-label":`Ephemeral ${e.kind??`message`}`,style:{fontSize:`10px`,color:`var(--accent-orange)`,background:`var(--accent-orange-subtle)`,border:`1px solid var(--border-accent)`,borderRadius:`var(--radius-pill)`,padding:`1px 6px`,flexShrink:0,fontFamily:`var(--font-ui)`,fontWeight:600,letterSpacing:0},children:e.kind?.toUpperCase()??`EPHEMERAL`})]}),(0,m.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-secondary)`,display:`-webkit-box`,WebkitLineClamp:2,WebkitBoxOrient:`vertical`,overflow:`hidden`,lineHeight:1.4,marginBottom:`4px`},children:d(e.snippet)}),e.timestamp&&(0,m.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:f(e.timestamp)})]},e.message_id))}),C&&(0,m.jsx)(`button`,{onClick:M,disabled:x,style:{display:`block`,width:`100%`,padding:`10px 16px`,border:`none`,background:`transparent`,color:`var(--text-tertiary)`,fontSize:`12px`,fontFamily:`var(--font-ui)`,cursor:x?`default`:`pointer`},children:x?`Loading…`:`Load more`})]}),!y&&n.length>=2&&_.length===0&&(0,m.jsxs)(`div`,{style:{padding:`24px 16px`,textAlign:`center`,fontSize:`13px`,color:`var(--text-tertiary)`},children:[`No results for "`,n,`"`]}),n.length>0&&n.length<2&&(0,m.jsx)(`div`,{style:{padding:`16px`,textAlign:`center`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`Type at least 2 characters…`})]})})}export{g as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/SearchOverlay-DUxwGmGf.js b/src/agent_decoder/static/assets/SearchOverlay-DUxwGmGf.js deleted file mode 100644 index cd4a7b64..00000000 --- a/src/agent_decoder/static/assets/SearchOverlay-DUxwGmGf.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{a as r,c as i,p as a,x as o}from"./index-Egnd1H3-.js";import{n as s,t as c}from"./sessionCache-Cj3FsbQ4.js";import{i as l}from"./ScrollContainer-CA7-aYqv.js";import{n as u,t as d}from"./renderSnippet-B37VxZaL.js";import{n as f}from"./SessionItem-CYxoPLdi.js";var p=e(t(),1),m=n(),h=50;function g(){let e=a(e=>e.closeSearch),t=a(e=>e.setPendingScrollMessageId),[n,g]=(0,p.useState)(``),[_,v]=(0,p.useState)([]),[y,b]=(0,p.useState)(!1),[x,S]=(0,p.useState)(!1),[C,w]=(0,p.useState)(!1),[T,E]=(0,p.useState)(0),D=r(),O=(0,p.useRef)(null),k=(0,p.useRef)(null),A=(0,p.useRef)(null),j=u(n,300);(0,p.useEffect)(()=>{let e=k.current;e&&e.children[T]?.scrollIntoView({block:`nearest`})},[T]),(0,p.useEffect)(()=>{O.current?.focus()},[]),(0,p.useEffect)(()=>{let t=t=>{if(t.key===`Escape`){e();return}if(t.key!==`Tab`||!A.current)return;let n=A.current.querySelectorAll(`input, button, [tabindex]:not([tabindex="-1"])`);if(n.length===0)return;let r=n[0],i=n[n.length-1];t.shiftKey&&document.activeElement===r?(t.preventDefault(),i.focus()):!t.shiftKey&&document.activeElement===i&&(t.preventDefault(),r.focus())};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]),(0,p.useEffect)(()=>{if(j.length<2){v([]),w(!1);return}let e=!1;return b(!0),i.search(j,void 0,h).then(t=>{e||(v(t),w(t.length===h),E(0))}).catch(()=>{e||(v([]),w(!1))}).finally(()=>{e||b(!1)}),()=>{e=!0}},[j]);let M=(0,p.useCallback)(()=>{x||(S(!0),i.search(j,void 0,h,_.length).then(e=>{v(t=>[...t,...e]),w(e.length===h)}).catch(()=>w(!1)).finally(()=>S(!1)))},[j,_.length,x]),N=(0,p.useCallback)(n=>{D.has(n.session_id)&&D.remove(n.session_id),t(n.message_id);let r=()=>{o(`/chat/${n.session_id}`),e()};s(n.session_id)?r():c(n.session_id,i.getSession).then(r).catch(r)},[e,t,D]);return(0,m.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Search conversations`,style:{position:`fixed`,inset:0,zIndex:1e3,background:`var(--bg-modal-overlay)`,display:`flex`,alignItems:`flex-start`,justifyContent:`center`,paddingTop:`180px`},onClick:t=>{t.target===t.currentTarget&&e()},children:(0,m.jsxs)(`div`,{ref:A,style:{width:`100%`,maxWidth:`600px`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,boxShadow:`var(--shadow-lg)`,overflow:`hidden`,margin:`0 16px`},onClick:e=>e.stopPropagation(),children:[(0,m.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,padding:`16px`,borderBottom:_.length>0||y?`1px solid var(--border-subtle)`:`none`,gap:`12px`},children:[(0,m.jsx)(`span`,{style:{fontSize:`16px`,color:`var(--text-tertiary)`},children:`⌕`}),(0,m.jsx)(`input`,{ref:O,type:`text`,value:n,onChange:e=>g(e.target.value),onKeyDown:e=>{e.key===`ArrowDown`?(e.preventDefault(),E(e=>Math.min(e+1,_.length-1))):e.key===`ArrowUp`?(e.preventDefault(),E(e=>Math.max(e-1,0))):e.key===`Enter`&&_[T]&&N(_[T])},placeholder:`Search conversations… "phrase" -exclude role:user`,style:{flex:1,border:`none`,outline:`none`,background:`transparent`,fontSize:`15px`,color:`var(--text-primary)`,fontFamily:`var(--font-ui)`}}),y&&(0,m.jsx)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:`Searching…`}),(0,m.jsx)(`kbd`,{onClick:e,style:{fontSize:`11px`,color:`var(--text-tertiary)`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-default)`,borderRadius:`4px`,padding:`2px 6px`,cursor:`pointer`,fontFamily:`var(--font-ui)`},children:`Esc`})]}),_.length>0&&(0,m.jsxs)(l,{style:{maxHeight:`400px`},children:[(0,m.jsx)(`ul`,{ref:k,role:`listbox`,style:{listStyle:`none`,margin:0,padding:`8px 0`},children:_.map((e,t)=>(0,m.jsxs)(`li`,{role:`option`,"aria-selected":t===T,onClick:()=>N(e),onMouseEnter:()=>E(t),style:{padding:`10px 16px`,cursor:`pointer`,background:t===T?`var(--bg-sidebar-hover)`:`transparent`,transition:`background var(--transition-fast)`},children:[(0,m.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,marginBottom:`3px`,minWidth:0},children:[(0,m.jsx)(`span`,{style:{fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`,flex:1},children:e.session_title??`Untitled`}),D.has(e.session_id)&&(0,m.jsx)(`span`,{style:{fontSize:`10px`,color:`var(--text-tertiary)`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-pill)`,padding:`1px 6px`,flexShrink:0,fontFamily:`var(--font-ui)`},children:`archived`}),e.source===`ephemeral`&&(0,m.jsx)(`span`,{"aria-label":`Ephemeral ${e.kind??`message`}`,style:{fontSize:`10px`,color:`var(--accent-orange)`,background:`var(--accent-orange-subtle)`,border:`1px solid var(--border-accent)`,borderRadius:`var(--radius-pill)`,padding:`1px 6px`,flexShrink:0,fontFamily:`var(--font-ui)`,fontWeight:600,letterSpacing:0},children:e.kind?.toUpperCase()??`EPHEMERAL`})]}),(0,m.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-secondary)`,display:`-webkit-box`,WebkitLineClamp:2,WebkitBoxOrient:`vertical`,overflow:`hidden`,lineHeight:1.4,marginBottom:`4px`},children:d(e.snippet)}),e.timestamp&&(0,m.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:f(e.timestamp)})]},e.message_id))}),C&&(0,m.jsx)(`button`,{onClick:M,disabled:x,style:{display:`block`,width:`100%`,padding:`10px 16px`,border:`none`,background:`transparent`,color:`var(--text-tertiary)`,fontSize:`12px`,fontFamily:`var(--font-ui)`,cursor:x?`default`:`pointer`},children:x?`Loading…`:`Load more`})]}),!y&&n.length>=2&&_.length===0&&(0,m.jsxs)(`div`,{style:{padding:`24px 16px`,textAlign:`center`,fontSize:`13px`,color:`var(--text-tertiary)`},children:[`No results for "`,n,`"`]}),n.length>0&&n.length<2&&(0,m.jsx)(`div`,{style:{padding:`16px`,textAlign:`center`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`Type at least 2 characters…`})]})})}export{g as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/SessionItem-CYxoPLdi.js b/src/agent_decoder/static/assets/SessionItem-BUejVuL5.js similarity index 99% rename from src/agent_decoder/static/assets/SessionItem-CYxoPLdi.js rename to src/agent_decoder/static/assets/SessionItem-BUejVuL5.js index a5e7b2bb..6754a085 100644 --- a/src/agent_decoder/static/assets/SessionItem-CYxoPLdi.js +++ b/src/agent_decoder/static/assets/SessionItem-BUejVuL5.js @@ -1 +1 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,r as n,t as r}from"./react-CCIEwYL0.js";import{_ as i,a,c as o,d as s,f as c,h as l,m as u,o as d,p as f,s as p}from"./index-Egnd1H3-.js";import{i as m}from"./sessionCache-Cj3FsbQ4.js";import{a as h,c as g,f as _,i as v,l as y,m as b,o as x,p as S,s as C,u as w}from"./ui-BVMZ0uWi.js";import{n as T}from"./formatRelative-CavTjOcy.js";import{t as ee}from"./shared-CAVcrZag.js";var E=e(t(),1),D=n(),O=r(),k={display:`flex`,alignItems:`center`,gap:`9px`,width:`100%`,padding:`7px 10px`,background:`none`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,textAlign:`left`,fontSize:`13px`,fontFamily:`var(--font-ui)`,whiteSpace:`nowrap`},A=210;function te({items:e,anchorRect:t,onClose:n}){let r=(0,E.useRef)(null),i=(0,E.useRef)(null),a=(0,E.useRef)(null),[o,s]=(0,E.useState)(null),c=(0,E.useRef)(null),[l,u]=(0,E.useState)(null),[d,f]=(0,E.useState)(null),p=t.bottom+4+180>window.innerHeight,m=t.right{if(o===null||!i.current||!r.current||!d){u(null);return}let e=i.current.getBoundingClientRect(),t=r.current.getBoundingClientRect(),n=window.innerWidth,a=window.innerHeight,s=d.top,c=d.right-4;s+e.height>a-8&&(s=a-8-e.height),s<8&&(s=8),c+e.width>n-8&&(c=n-8-e.width),c<8&&(c=8);let l=t.right-t.left;cn-8&&(c=n-8-e.width),c<8&&(c=8),u({top:s,left:c})},[o,d]),(0,E.useEffect)(()=>{let e=e=>{let t=e.target,a=r.current?.contains(t),o=i.current?.contains(t);!a&&!o&&n()},t=e=>{e.key===`Escape`&&n()};return document.addEventListener(`pointerdown`,e,!0),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e,!0),document.removeEventListener(`keydown`,t)}},[n]);let h=window.innerWidth-t.right,_=e=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{a.current&&f(a.current.getBoundingClientRect()),s(e)},100)},v=()=>{c.current=setTimeout(()=>{s(null)},500)},y=o!==null&&e[o]?.kind===`submenu`?e[o]:null,b=l??(d?{top:d.top,left:d.right-4}:null);return(0,D.createPortal)((0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`div`,{ref:r,style:{position:`fixed`,...p||m?{bottom:window.innerHeight-t.top+4}:{top:t.bottom+4},...m?{left:t.left}:{right:h},minWidth:`${A}px`,background:`var(--bg-modal)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,boxShadow:`0 2px 12px rgba(0,0,0,0.08)`,padding:`4px`,zIndex:1e3,fontFamily:`var(--font-ui)`},children:e.map((e,t)=>{if(e.kind===`separator`)return(0,O.jsx)(`div`,{style:{height:`1px`,background:`var(--border-subtle)`,margin:`4px 0`}},t);if(e.kind===`submenu`){let n=o===t;return(0,O.jsx)(`div`,{ref:a,onMouseEnter:()=>_(t),onMouseLeave:v,children:(0,O.jsxs)(`button`,{style:{...k,color:`var(--text-primary)`,background:n?`var(--bg-sidebar-hover)`:`none`},children:[(0,O.jsx)(`span`,{style:{flex:1},children:e.label}),(0,O.jsx)(`span`,{style:{color:`var(--text-tertiary)`,display:`flex`,transition:`transform 150ms ease`,transform:n?`rotate(90deg)`:`rotate(0deg)`},children:(0,O.jsx)(g,{})})]})},t)}return(0,O.jsxs)(`button`,{onClick:()=>{e.disabled||(e.action(),n())},disabled:e.disabled,style:{...k,color:e.disabled?`var(--text-tertiary)`:e.danger?`var(--tool-error-text)`:`var(--text-primary)`,cursor:e.disabled?`default`:`pointer`,opacity:e.disabled?.5:1},onMouseEnter:t=>{e.disabled||(t.currentTarget.style.background=`var(--bg-sidebar-hover)`)},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[e.icon&&(0,O.jsx)(`span`,{style:{flexShrink:0,color:e.disabled?`var(--text-tertiary)`:e.danger?`var(--tool-error-text)`:`var(--text-tertiary)`,display:`flex`},children:e.icon}),e.label]},t)})}),y&&b&&(0,O.jsx)(`div`,{ref:i,style:{position:`fixed`,top:b.top,left:b.left,minWidth:`${A}px`,background:`var(--bg-modal)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,boxShadow:`0 2px 12px rgba(0,0,0,0.08)`,padding:`4px`,zIndex:1001,fontFamily:`var(--font-ui)`},onMouseEnter:()=>{o!==null&&_(o)},onMouseLeave:v,children:y.items.map((e,t)=>e.kind===`separator`?(0,O.jsx)(`div`,{style:{height:`1px`,background:`var(--border-subtle)`,margin:`4px 0`}},t):(0,O.jsxs)(`button`,{onClick:()=>{e.action(),n()},style:{...k,color:e.danger?`var(--tool-error-text)`:`var(--text-primary)`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[e.icon&&(0,O.jsx)(`span`,{style:{flexShrink:0,color:`var(--text-tertiary)`,display:`flex`},children:e.icon}),e.label]},t))})]}),document.body)}function ne({initialValue:e,onCommit:t,onCancel:n}){let[r,i]=(0,E.useState)(e),a=(0,E.useRef)(null);(0,E.useEffect)(()=>{a.current?.focus(),a.current?.select()},[]);let o=()=>{let e=r.trim();e?t(e):n()};return(0,O.jsx)(`input`,{ref:a,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),o()),e.key===`Escape`&&(e.preventDefault(),n())},onBlur:()=>{r.trim()&&r.trim()!==e?o():n()},onClick:e=>e.stopPropagation(),style:{flex:1,border:`1px solid var(--border-accent)`,borderRadius:`var(--radius-sm)`,background:`var(--bg-input)`,color:`var(--text-primary)`,fontSize:`14px`,fontFamily:`var(--font-ui)`,padding:`1px 6px`,outline:`none`,minWidth:0}})}var j=T;function M(e){return e.last_message_role===`assistant`&&!!e.updated_at}function N(e,t){return e?t?e>t:!0:!1}function P({session:e,isActive:t,onClick:n,runnerStatus:r,onToggleSelect:g}){let[T,D]=(0,E.useState)(!1),[k,A]=(0,E.useState)(!1),[j,P]=(0,E.useState)(null),[F,I]=(0,E.useState)(!1),[L,R]=(0,E.useState)(!1),z=d(),B=a(),V=p(),H=f(e=>e.selectionMode),U=f(e=>e.showProviderTag),W=f(e=>e.selectedSessionIds),re=f(e=>e.toggleSessionSelected),G=W.has(e.id),K=z.has(e.id),ie=B.has(e.id),[ae,q]=(0,E.useState)(()=>e.custom_title??l(u.RENAMED)[e.id]??null);(0,E.useEffect)(()=>{if(e.custom_title){q(e.custom_title);let t=l(u.RENAMED);t[e.id]!==e.custom_title&&(t[e.id]=e.custom_title,i(u.RENAMED,t))}},[e.id,e.custom_title]),(0,E.useEffect)(()=>c(`rename`,({id:t,title:n})=>{if(t!==e.id)return;let r=n.trim()===``?null:n;q(r);let a=l(u.RENAMED);r===null?delete a[e.id]:a[e.id]=r,i(u.RENAMED,a)}),[e.id]);let J=(0,E.useRef)(null),Y=ae??e.title??`Untitled`,X=f(e=>e.hostInfo)?.is_remote_client===!0,[Z,Q]=(0,E.useState)(()=>M(e)&&N(e.updated_at,V.get(e.id))?`visible`:`hidden`);(0,E.useEffect)(()=>{if(!M(e)){Q(`hidden`);return}N(e.updated_at,V.get(e.id))&&Q(`visible`)},[e.id,e.updated_at,e.last_message_role,V.map]),(0,E.useEffect)(()=>{if(Z!==`fading`)return;let e=setTimeout(()=>Q(`hidden`),v.BELL_FADE_MS);return()=>clearTimeout(e)},[Z]),(0,E.useEffect)(()=>{if(!t)return;let n=()=>{Q(t=>t===`visible`?(e.updated_at&&V.set(e.id,e.updated_at),`fading`):t)};return window.addEventListener(`focus`,n),()=>window.removeEventListener(`focus`,n)},[t,e.id,e.updated_at,V]);let oe=(0,E.useCallback)(()=>{I(!0)},[]),se=(0,E.useCallback)(t=>{let n=t.trim(),r=n===``?null:n,a=l(u.RENAMED);r===null?delete a[e.id]:a[e.id]=r,i(u.RENAMED,a),q(r),I(!1),s(`rename`,{id:e.id,title:r??``}),o.setSessionTitle(e.id,r).then(t=>{s(`rename`,{id:e.id,title:t.custom_title??``})}).catch(()=>{})},[e.id]),ce=(0,E.useCallback)(()=>{I(!1)},[]),le=(0,E.useCallback)(()=>{R(!1),s(`sessions-removed`,[e.id]),o.deleteSessions([e.id]).then(e=>{e.failed.length>0&&(console.error(`[delete] Some sessions failed to delete:`,e.failed),s(`toast`,{message:`Couldn't delete session — see console for details.`,kind:`error`})),s(`refresh`,void 0)}).catch(e=>{console.error(`[delete] deleteSessions error:`,e),s(`toast`,{message:`Couldn't delete session — see console for details.`,kind:`error`}),s(`refresh`,void 0)})},[e.id]),ue=[{label:K?`Unstar`:`Star`,icon:(0,O.jsx)(S,{filled:K}),action:()=>z.toggle(e.id)},{label:`Rename`,icon:(0,O.jsx)(_,{}),action:oe},{label:ie?`Unarchive`:`Archive`,icon:(0,O.jsx)(x,{}),action:()=>B.toggle(e.id)},{label:`Delete`,icon:(0,O.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,O.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,O.jsx)(`path`,{d:`M19 6l-1 14H6L5 6`}),(0,O.jsx)(`path`,{d:`M10 11v6`}),(0,O.jsx)(`path`,{d:`M14 11v6`}),(0,O.jsx)(`path`,{d:`M9 6V4h6v2`})]}),action:()=>R(!0),danger:!0},{kind:`separator`},{kind:`submenu`,label:`More`,items:[{label:`Copy title`,icon:(0,O.jsx)(y,{}),action:()=>navigator.clipboard.writeText(Y).catch(()=>{})},{label:`Copy project path`,icon:(0,O.jsx)(w,{}),action:()=>navigator.clipboard.writeText(e.cwd??``).catch(()=>{})},{label:`Copy file path`,icon:(0,O.jsx)(y,{}),action:()=>navigator.clipboard.writeText(e.file_path).catch(()=>{})},{label:`Copy session ID`,icon:(0,O.jsx)(y,{}),action:()=>navigator.clipboard.writeText(e.id).catch(()=>{})},{label:`Copy resume command`,icon:(0,O.jsx)(b,{}),action:()=>{let t=e.file_path.split(`/`),n=`claude`,r=t.indexOf(`projects`);if(r>0){let e=r-1;for(;e>=0&&t[e]===`config`;)e--;e>=0&&(n=t[e].replace(/^\./,``))}let i=``;if(e.is_worktree){if(e.cwd){let t=e.cwd.indexOf(`/.claude/worktrees/`);t>=0&&(i=e.cwd.slice(t+19))}if(!i&&r>=0&&t[r+1]){let e=t[r+1],n=e.indexOf(`worktrees-`);n>=0&&(i=e.slice(n+10))}}let a=i?`${n} -w ${i} -r ${e.id}`:`${n} -r ${e.id}`;navigator.clipboard.writeText(a).catch(()=>{})}},{kind:`separator`},{label:X?`Reveal in Finder (host-only)`:`Reveal in Finder`,icon:(0,O.jsx)(w,{}),action:X?()=>{}:()=>o.revealSession(e.id).catch(()=>{}),disabled:X},{label:e.is_fork?`Open in terminal (fork — not resumable)`:X?`Open in terminal (host-only)`:`Open in terminal`,icon:(0,O.jsx)(b,{}),action:e.is_fork||X?()=>{}:()=>o.openTerminal(e.id).catch(e=>{s(`toast`,{message:e instanceof Error?e.message:`Couldn't open a terminal`,kind:`error`})}),disabled:e.is_fork||X}]}],de=e=>{e.stopPropagation(),J.current&&(P(J.current.getBoundingClientRect()),A(!0))},$=t=>{g?g(e.id,t):re(e.id)};return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`div`,{className:`hover-actions-parent sidebar-session-item${t&&!H?` sidebar-session-item--active`:``}`,onMouseEnter:()=>{D(!0),m(e.id,o.getSession)},onMouseLeave:()=>D(!1),style:{position:`relative`,display:`flex`,alignItems:`center`,padding:0,background:t&&!H||G?`var(--bg-sidebar-active)`:T?`var(--bg-sidebar-hover)`:`transparent`,borderRadius:`var(--radius-sm)`,margin:`1px 6px`,transition:`background var(--transition-fast)`,minHeight:`30px`,gap:`4px`},children:F?(0,O.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,flex:1,padding:`5px 8px 5px 12px`,gap:`4px`,minWidth:0},children:(0,O.jsx)(ne,{initialValue:Y,onCommit:se,onCancel:ce})}):(0,O.jsxs)(O.Fragment,{children:[H&&(0,O.jsx)(`span`,{style:{flexShrink:0,display:`flex`,paddingLeft:`12px`},children:(0,O.jsx)(ee,{checked:G,onChange:(e,t)=>$(t.shiftKey)})}),(0,O.jsxs)(`button`,{type:`button`,onClick:t=>{if(H){$(t.shiftKey);return}Z===`visible`&&(e.updated_at&&V.set(e.id,e.updated_at),Q(`fading`)),n()},onMouseDown:e=>{H&&e.shiftKey&&e.preventDefault()},"aria-label":Y,style:{display:`flex`,alignItems:`center`,flex:1,minWidth:0,padding:`5px 8px 5px 12px`,gap:`4px`,background:`none`,border:`none`,cursor:`pointer`,font:`inherit`,color:`inherit`,textAlign:`left`,userSelect:`none`,outline:`none`},children:[!H&&K&&(0,O.jsx)(`span`,{style:{color:`var(--accent-orange)`,flexShrink:0,fontSize:`11px`,display:`flex`},children:(0,O.jsx)(S,{filled:!0})}),(0,O.jsx)(`span`,{"data-testid":`session-title`,title:Y,style:{flex:1,minWidth:0,fontSize:`14px`,color:`var(--text-primary)`,fontWeight:t?500:400,lineHeight:`1.35`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:Y}),U&&!H&&e.provider&&e.provider!==`claude`&&(0,O.jsx)(`span`,{"aria-label":`Provider: ${e.provider}`,title:e.provider,style:{flexShrink:0,fontSize:`8.5px`,fontFamily:`var(--font-ui)`,fontWeight:600,letterSpacing:`0.06em`,color:`var(--text-tertiary)`,opacity:.7,lineHeight:`14px`,userSelect:`none`},children:e.provider===`codex`?`GPT`:e.provider.toUpperCase()}),!H&&Z!==`hidden`&&(0,O.jsx)(`span`,{"aria-label":`Awaiting your reply`,style:{flexShrink:0,display:`flex`,color:`var(--accent-orange)`,opacity:Z===`fading`||T||t||k?0:1,transition:`opacity var(--transition-fast)`},children:(0,O.jsx)(C,{})}),!H&&r?.busy&&(0,O.jsx)(`span`,{"data-testid":`runner-busy-marker`,"aria-label":`Running`,title:`Running`,style:{flexShrink:0,width:`8px`,height:`8px`,borderRadius:`50%`,background:`var(--accent-green)`,boxShadow:`0 0 0 0 var(--accent-green)`,animation:`ring-runner-pulse 1.6s ease-out infinite`,marginRight:`2px`}})]}),!H&&(0,O.jsx)(`button`,{ref:J,type:`button`,onClick:de,className:t||k?``:`hover-actions`,style:{position:`absolute`,right:`0`,top:0,bottom:0,borderRadius:`0 var(--radius-sm) var(--radius-sm) 0`,color:k?`var(--text-primary)`:`var(--text-tertiary)`,fontSize:`14px`,lineHeight:`30px`,padding:`0 8px`,letterSpacing:`1px`,background:t?`var(--bg-sidebar-active)`:T||k?`var(--bg-sidebar-hover)`:`var(--bg-sidebar)`,border:`none`,cursor:`pointer`,outline:`none`,fontFamily:`var(--font-ui)`,transition:`background var(--transition-fast)`},"aria-label":`Session options`,children:`•••`})]})}),k&&j&&(0,O.jsx)(te,{items:ue,anchorRect:j,onClose:()=>A(!1)}),L&&(0,O.jsx)(h,{title:`Delete session?`,body:`This permanently deletes the session transcript file from disk and cannot be undone.`,confirmLabel:`Delete`,onConfirm:le,onCancel:()=>R(!1)})]})}export{j as n,P as t}; \ No newline at end of file +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,r as n,t as r}from"./react-CCIEwYL0.js";import{_ as i,a,c as o,d as s,f as c,h as l,m as u,o as d,p as f,s as p}from"./index-XPrlVfCr.js";import{i as m}from"./sessionCache-Cj3FsbQ4.js";import{a as h,c as g,f as _,i as v,l as y,m as b,o as x,p as S,s as C,u as w}from"./ui-BVMZ0uWi.js";import{n as T}from"./formatRelative-CavTjOcy.js";import{t as ee}from"./shared-CAVcrZag.js";var E=e(t(),1),D=n(),O=r(),k={display:`flex`,alignItems:`center`,gap:`9px`,width:`100%`,padding:`7px 10px`,background:`none`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,textAlign:`left`,fontSize:`13px`,fontFamily:`var(--font-ui)`,whiteSpace:`nowrap`},A=210;function te({items:e,anchorRect:t,onClose:n}){let r=(0,E.useRef)(null),i=(0,E.useRef)(null),a=(0,E.useRef)(null),[o,s]=(0,E.useState)(null),c=(0,E.useRef)(null),[l,u]=(0,E.useState)(null),[d,f]=(0,E.useState)(null),p=t.bottom+4+180>window.innerHeight,m=t.right{if(o===null||!i.current||!r.current||!d){u(null);return}let e=i.current.getBoundingClientRect(),t=r.current.getBoundingClientRect(),n=window.innerWidth,a=window.innerHeight,s=d.top,c=d.right-4;s+e.height>a-8&&(s=a-8-e.height),s<8&&(s=8),c+e.width>n-8&&(c=n-8-e.width),c<8&&(c=8);let l=t.right-t.left;cn-8&&(c=n-8-e.width),c<8&&(c=8),u({top:s,left:c})},[o,d]),(0,E.useEffect)(()=>{let e=e=>{let t=e.target,a=r.current?.contains(t),o=i.current?.contains(t);!a&&!o&&n()},t=e=>{e.key===`Escape`&&n()};return document.addEventListener(`pointerdown`,e,!0),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e,!0),document.removeEventListener(`keydown`,t)}},[n]);let h=window.innerWidth-t.right,_=e=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{a.current&&f(a.current.getBoundingClientRect()),s(e)},100)},v=()=>{c.current=setTimeout(()=>{s(null)},500)},y=o!==null&&e[o]?.kind===`submenu`?e[o]:null,b=l??(d?{top:d.top,left:d.right-4}:null);return(0,D.createPortal)((0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`div`,{ref:r,style:{position:`fixed`,...p||m?{bottom:window.innerHeight-t.top+4}:{top:t.bottom+4},...m?{left:t.left}:{right:h},minWidth:`${A}px`,background:`var(--bg-modal)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,boxShadow:`0 2px 12px rgba(0,0,0,0.08)`,padding:`4px`,zIndex:1e3,fontFamily:`var(--font-ui)`},children:e.map((e,t)=>{if(e.kind===`separator`)return(0,O.jsx)(`div`,{style:{height:`1px`,background:`var(--border-subtle)`,margin:`4px 0`}},t);if(e.kind===`submenu`){let n=o===t;return(0,O.jsx)(`div`,{ref:a,onMouseEnter:()=>_(t),onMouseLeave:v,children:(0,O.jsxs)(`button`,{style:{...k,color:`var(--text-primary)`,background:n?`var(--bg-sidebar-hover)`:`none`},children:[(0,O.jsx)(`span`,{style:{flex:1},children:e.label}),(0,O.jsx)(`span`,{style:{color:`var(--text-tertiary)`,display:`flex`,transition:`transform 150ms ease`,transform:n?`rotate(90deg)`:`rotate(0deg)`},children:(0,O.jsx)(g,{})})]})},t)}return(0,O.jsxs)(`button`,{onClick:()=>{e.disabled||(e.action(),n())},disabled:e.disabled,style:{...k,color:e.disabled?`var(--text-tertiary)`:e.danger?`var(--tool-error-text)`:`var(--text-primary)`,cursor:e.disabled?`default`:`pointer`,opacity:e.disabled?.5:1},onMouseEnter:t=>{e.disabled||(t.currentTarget.style.background=`var(--bg-sidebar-hover)`)},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[e.icon&&(0,O.jsx)(`span`,{style:{flexShrink:0,color:e.disabled?`var(--text-tertiary)`:e.danger?`var(--tool-error-text)`:`var(--text-tertiary)`,display:`flex`},children:e.icon}),e.label]},t)})}),y&&b&&(0,O.jsx)(`div`,{ref:i,style:{position:`fixed`,top:b.top,left:b.left,minWidth:`${A}px`,background:`var(--bg-modal)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-md)`,boxShadow:`0 2px 12px rgba(0,0,0,0.08)`,padding:`4px`,zIndex:1001,fontFamily:`var(--font-ui)`},onMouseEnter:()=>{o!==null&&_(o)},onMouseLeave:v,children:y.items.map((e,t)=>e.kind===`separator`?(0,O.jsx)(`div`,{style:{height:`1px`,background:`var(--border-subtle)`,margin:`4px 0`}},t):(0,O.jsxs)(`button`,{onClick:()=>{e.action(),n()},style:{...k,color:e.danger?`var(--tool-error-text)`:`var(--text-primary)`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[e.icon&&(0,O.jsx)(`span`,{style:{flexShrink:0,color:`var(--text-tertiary)`,display:`flex`},children:e.icon}),e.label]},t))})]}),document.body)}function ne({initialValue:e,onCommit:t,onCancel:n}){let[r,i]=(0,E.useState)(e),a=(0,E.useRef)(null);(0,E.useEffect)(()=>{a.current?.focus(),a.current?.select()},[]);let o=()=>{let e=r.trim();e?t(e):n()};return(0,O.jsx)(`input`,{ref:a,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),o()),e.key===`Escape`&&(e.preventDefault(),n())},onBlur:()=>{r.trim()&&r.trim()!==e?o():n()},onClick:e=>e.stopPropagation(),style:{flex:1,border:`1px solid var(--border-accent)`,borderRadius:`var(--radius-sm)`,background:`var(--bg-input)`,color:`var(--text-primary)`,fontSize:`14px`,fontFamily:`var(--font-ui)`,padding:`1px 6px`,outline:`none`,minWidth:0}})}var j=T;function M(e){return e.last_message_role===`assistant`&&!!e.updated_at}function N(e,t){return e?t?e>t:!0:!1}function P({session:e,isActive:t,onClick:n,runnerStatus:r,onToggleSelect:g}){let[T,D]=(0,E.useState)(!1),[k,A]=(0,E.useState)(!1),[j,P]=(0,E.useState)(null),[F,I]=(0,E.useState)(!1),[L,R]=(0,E.useState)(!1),z=d(),B=a(),V=p(),H=f(e=>e.selectionMode),U=f(e=>e.showProviderTag),W=f(e=>e.selectedSessionIds),re=f(e=>e.toggleSessionSelected),G=W.has(e.id),K=z.has(e.id),ie=B.has(e.id),[ae,q]=(0,E.useState)(()=>e.custom_title??l(u.RENAMED)[e.id]??null);(0,E.useEffect)(()=>{if(e.custom_title){q(e.custom_title);let t=l(u.RENAMED);t[e.id]!==e.custom_title&&(t[e.id]=e.custom_title,i(u.RENAMED,t))}},[e.id,e.custom_title]),(0,E.useEffect)(()=>c(`rename`,({id:t,title:n})=>{if(t!==e.id)return;let r=n.trim()===``?null:n;q(r);let a=l(u.RENAMED);r===null?delete a[e.id]:a[e.id]=r,i(u.RENAMED,a)}),[e.id]);let J=(0,E.useRef)(null),Y=ae??e.title??`Untitled`,X=f(e=>e.hostInfo)?.is_remote_client===!0,[Z,Q]=(0,E.useState)(()=>M(e)&&N(e.updated_at,V.get(e.id))?`visible`:`hidden`);(0,E.useEffect)(()=>{if(!M(e)){Q(`hidden`);return}N(e.updated_at,V.get(e.id))&&Q(`visible`)},[e.id,e.updated_at,e.last_message_role,V.map]),(0,E.useEffect)(()=>{if(Z!==`fading`)return;let e=setTimeout(()=>Q(`hidden`),v.BELL_FADE_MS);return()=>clearTimeout(e)},[Z]),(0,E.useEffect)(()=>{if(!t)return;let n=()=>{Q(t=>t===`visible`?(e.updated_at&&V.set(e.id,e.updated_at),`fading`):t)};return window.addEventListener(`focus`,n),()=>window.removeEventListener(`focus`,n)},[t,e.id,e.updated_at,V]);let oe=(0,E.useCallback)(()=>{I(!0)},[]),se=(0,E.useCallback)(t=>{let n=t.trim(),r=n===``?null:n,a=l(u.RENAMED);r===null?delete a[e.id]:a[e.id]=r,i(u.RENAMED,a),q(r),I(!1),s(`rename`,{id:e.id,title:r??``}),o.setSessionTitle(e.id,r).then(t=>{s(`rename`,{id:e.id,title:t.custom_title??``})}).catch(()=>{})},[e.id]),ce=(0,E.useCallback)(()=>{I(!1)},[]),le=(0,E.useCallback)(()=>{R(!1),s(`sessions-removed`,[e.id]),o.deleteSessions([e.id]).then(e=>{e.failed.length>0&&(console.error(`[delete] Some sessions failed to delete:`,e.failed),s(`toast`,{message:`Couldn't delete session — see console for details.`,kind:`error`})),s(`refresh`,void 0)}).catch(e=>{console.error(`[delete] deleteSessions error:`,e),s(`toast`,{message:`Couldn't delete session — see console for details.`,kind:`error`}),s(`refresh`,void 0)})},[e.id]),ue=[{label:K?`Unstar`:`Star`,icon:(0,O.jsx)(S,{filled:K}),action:()=>z.toggle(e.id)},{label:`Rename`,icon:(0,O.jsx)(_,{}),action:oe},{label:ie?`Unarchive`:`Archive`,icon:(0,O.jsx)(x,{}),action:()=>B.toggle(e.id)},{label:`Delete`,icon:(0,O.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,O.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,O.jsx)(`path`,{d:`M19 6l-1 14H6L5 6`}),(0,O.jsx)(`path`,{d:`M10 11v6`}),(0,O.jsx)(`path`,{d:`M14 11v6`}),(0,O.jsx)(`path`,{d:`M9 6V4h6v2`})]}),action:()=>R(!0),danger:!0},{kind:`separator`},{kind:`submenu`,label:`More`,items:[{label:`Copy title`,icon:(0,O.jsx)(y,{}),action:()=>navigator.clipboard.writeText(Y).catch(()=>{})},{label:`Copy project path`,icon:(0,O.jsx)(w,{}),action:()=>navigator.clipboard.writeText(e.cwd??``).catch(()=>{})},{label:`Copy file path`,icon:(0,O.jsx)(y,{}),action:()=>navigator.clipboard.writeText(e.file_path).catch(()=>{})},{label:`Copy session ID`,icon:(0,O.jsx)(y,{}),action:()=>navigator.clipboard.writeText(e.id).catch(()=>{})},{label:`Copy resume command`,icon:(0,O.jsx)(b,{}),action:()=>{let t=e.file_path.split(`/`),n=`claude`,r=t.indexOf(`projects`);if(r>0){let e=r-1;for(;e>=0&&t[e]===`config`;)e--;e>=0&&(n=t[e].replace(/^\./,``))}let i=``;if(e.is_worktree){if(e.cwd){let t=e.cwd.indexOf(`/.claude/worktrees/`);t>=0&&(i=e.cwd.slice(t+19))}if(!i&&r>=0&&t[r+1]){let e=t[r+1],n=e.indexOf(`worktrees-`);n>=0&&(i=e.slice(n+10))}}let a=i?`${n} -w ${i} -r ${e.id}`:`${n} -r ${e.id}`;navigator.clipboard.writeText(a).catch(()=>{})}},{kind:`separator`},{label:X?`Reveal in Finder (host-only)`:`Reveal in Finder`,icon:(0,O.jsx)(w,{}),action:X?()=>{}:()=>o.revealSession(e.id).catch(()=>{}),disabled:X},{label:e.is_fork?`Open in terminal (fork — not resumable)`:X?`Open in terminal (host-only)`:`Open in terminal`,icon:(0,O.jsx)(b,{}),action:e.is_fork||X?()=>{}:()=>o.openTerminal(e.id).catch(e=>{s(`toast`,{message:e instanceof Error?e.message:`Couldn't open a terminal`,kind:`error`})}),disabled:e.is_fork||X}]}],de=e=>{e.stopPropagation(),J.current&&(P(J.current.getBoundingClientRect()),A(!0))},$=t=>{g?g(e.id,t):re(e.id)};return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`div`,{className:`hover-actions-parent sidebar-session-item${t&&!H?` sidebar-session-item--active`:``}`,onMouseEnter:()=>{D(!0),m(e.id,o.getSession)},onMouseLeave:()=>D(!1),style:{position:`relative`,display:`flex`,alignItems:`center`,padding:0,background:t&&!H||G?`var(--bg-sidebar-active)`:T?`var(--bg-sidebar-hover)`:`transparent`,borderRadius:`var(--radius-sm)`,margin:`1px 6px`,transition:`background var(--transition-fast)`,minHeight:`30px`,gap:`4px`},children:F?(0,O.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,flex:1,padding:`5px 8px 5px 12px`,gap:`4px`,minWidth:0},children:(0,O.jsx)(ne,{initialValue:Y,onCommit:se,onCancel:ce})}):(0,O.jsxs)(O.Fragment,{children:[H&&(0,O.jsx)(`span`,{style:{flexShrink:0,display:`flex`,paddingLeft:`12px`},children:(0,O.jsx)(ee,{checked:G,onChange:(e,t)=>$(t.shiftKey)})}),(0,O.jsxs)(`button`,{type:`button`,onClick:t=>{if(H){$(t.shiftKey);return}Z===`visible`&&(e.updated_at&&V.set(e.id,e.updated_at),Q(`fading`)),n()},onMouseDown:e=>{H&&e.shiftKey&&e.preventDefault()},"aria-label":Y,style:{display:`flex`,alignItems:`center`,flex:1,minWidth:0,padding:`5px 8px 5px 12px`,gap:`4px`,background:`none`,border:`none`,cursor:`pointer`,font:`inherit`,color:`inherit`,textAlign:`left`,userSelect:`none`,outline:`none`},children:[!H&&K&&(0,O.jsx)(`span`,{style:{color:`var(--accent-orange)`,flexShrink:0,fontSize:`11px`,display:`flex`},children:(0,O.jsx)(S,{filled:!0})}),(0,O.jsx)(`span`,{"data-testid":`session-title`,title:Y,style:{flex:1,minWidth:0,fontSize:`14px`,color:`var(--text-primary)`,fontWeight:t?500:400,lineHeight:`1.35`,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:Y}),U&&!H&&e.provider&&e.provider!==`claude`&&(0,O.jsx)(`span`,{"aria-label":`Provider: ${e.provider}`,title:e.provider,style:{flexShrink:0,fontSize:`8.5px`,fontFamily:`var(--font-ui)`,fontWeight:600,letterSpacing:`0.06em`,color:`var(--text-tertiary)`,opacity:.7,lineHeight:`14px`,userSelect:`none`},children:e.provider===`codex`?`GPT`:e.provider.toUpperCase()}),!H&&Z!==`hidden`&&(0,O.jsx)(`span`,{"aria-label":`Awaiting your reply`,style:{flexShrink:0,display:`flex`,color:`var(--accent-orange)`,opacity:Z===`fading`||T||t||k?0:1,transition:`opacity var(--transition-fast)`},children:(0,O.jsx)(C,{})}),!H&&r?.busy&&(0,O.jsx)(`span`,{"data-testid":`runner-busy-marker`,"aria-label":`Running`,title:`Running`,style:{flexShrink:0,width:`8px`,height:`8px`,borderRadius:`50%`,background:`var(--accent-green)`,boxShadow:`0 0 0 0 var(--accent-green)`,animation:`ring-runner-pulse 1.6s ease-out infinite`,marginRight:`2px`}})]}),!H&&(0,O.jsx)(`button`,{ref:J,type:`button`,onClick:de,className:t||k?``:`hover-actions`,style:{position:`absolute`,right:`0`,top:0,bottom:0,borderRadius:`0 var(--radius-sm) var(--radius-sm) 0`,color:k?`var(--text-primary)`:`var(--text-tertiary)`,fontSize:`14px`,lineHeight:`30px`,padding:`0 8px`,letterSpacing:`1px`,background:t?`var(--bg-sidebar-active)`:T||k?`var(--bg-sidebar-hover)`:`var(--bg-sidebar)`,border:`none`,cursor:`pointer`,outline:`none`,fontFamily:`var(--font-ui)`,transition:`background var(--transition-fast)`},"aria-label":`Session options`,children:`•••`})]})}),k&&j&&(0,O.jsx)(te,{items:ue,anchorRect:j,onClose:()=>A(!1)}),L&&(0,O.jsx)(h,{title:`Delete session?`,body:`This permanently deletes the session transcript file from disk and cannot be undone.`,confirmLabel:`Delete`,onConfirm:le,onCancel:()=>R(!1)})]})}export{j as n,P as t}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/SettingsModal-EAS0zTjU.js b/src/agent_decoder/static/assets/SettingsModal-DWSMRQmn.js similarity index 99% rename from src/agent_decoder/static/assets/SettingsModal-EAS0zTjU.js rename to src/agent_decoder/static/assets/SettingsModal-DWSMRQmn.js index 8aba4a00..5557ff0e 100644 --- a/src/agent_decoder/static/assets/SettingsModal-EAS0zTjU.js +++ b/src/agent_decoder/static/assets/SettingsModal-DWSMRQmn.js @@ -1 +1 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{c as r,l as i,p as a,u as o}from"./index-Egnd1H3-.js";import{i as s}from"./ScrollContainer-CA7-aYqv.js";import{n as c}from"./nativePtyFonts-BxhRYj2G.js";import{a as l,i as u,n as d,o as f,r as p}from"./shared-CAVcrZag.js";var m=e(t(),1),h=n();function g({config:e,onConfigChange:t}){let[n,i]=(0,m.useState)(``),[a,o]=(0,m.useState)(!1),[s,c]=(0,m.useState)(null),l=async e=>{o(!0),c(null);try{let n=await r.updateConfig(e);await r.refresh(),t(n)}catch(e){c(e instanceof Error?e.message:`Failed to save`)}finally{o(!1)}},u=t=>{l({...e,data_paths:e.data_paths.filter(e=>e!==t)})},d=()=>{let t=n.trim();!t||e.data_paths.includes(t)||l({...e,data_paths:[...e.data_paths,t]}).then(()=>i(``))};return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:{fontSize:`12px`,fontWeight:600,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.05em`,marginBottom:`10px`},children:`Data Paths`}),(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`6px`,marginBottom:`12px`},children:[e.data_paths.length===0&&(0,h.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-tertiary)`,padding:`8px 0`},children:`No paths configured`}),e.data_paths.map(e=>(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,padding:`6px 10px`},children:[(0,h.jsx)(`code`,{style:{flex:1,fontSize:`12px`,fontFamily:`var(--font-mono)`,color:`var(--text-primary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e}),(0,h.jsx)(`button`,{onClick:()=>u(e),disabled:a,"aria-label":`Remove ${e}`,style:{background:`none`,border:`none`,cursor:a?`not-allowed`:`pointer`,color:`var(--text-tertiary)`,fontSize:`14px`,lineHeight:1,padding:`2px 4px`,borderRadius:`var(--radius-sm)`,flexShrink:0,transition:`color var(--transition-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--tool-error-border)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`},children:`×`})]},e))]}),(0,h.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,h.jsx)(`input`,{type:`text`,value:n,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&d()},placeholder:`/path/to/claude/sessions`,style:{flex:1,padding:`7px 10px`,fontSize:`13px`,fontFamily:`var(--font-mono)`,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,color:`var(--text-primary)`,outline:`none`}}),(0,h.jsx)(`button`,{onClick:d,disabled:a||!n.trim(),style:{padding:`7px 14px`,fontSize:`13px`,background:n.trim()?`var(--accent-orange)`:`var(--bg-tool-block)`,color:n.trim()?`var(--text-on-accent)`:`var(--text-tertiary)`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:n.trim()&&!a?`pointer`:`not-allowed`,fontFamily:`var(--font-ui)`,transition:`background var(--transition-fast)`,flexShrink:0},children:`Add`})]}),s&&(0,h.jsx)(`div`,{style:{marginTop:`8px`,fontSize:`12px`,color:`var(--tool-error-border)`},children:s})]})}var _=[`#b8956a`,`#3b82f6`,`#10b981`,`#9b8ec4`,`#c47a7a`,`#c9a96e`,`#7eb6c4`,`#d4758a`],v=3e3,y={...d,color:p,marginTop:`6px`};function b({profile:e,isExpanded:t,onToggleExpand:n,onDelete:r,onRename:i,onColorChange:a,onAddPath:o,onRemovePath:s}){let[c,l]=(0,m.useState)(!1),[u,d]=(0,m.useState)(e.name),[f,g]=(0,m.useState)(!1),[b,x]=(0,m.useState)(null),[S,C]=(0,m.useState)(``),[w,T]=(0,m.useState)(!1),[E,D]=(0,m.useState)(null),[O,k]=(0,m.useState)(!1),[A,j]=(0,m.useState)(null),[M,N]=(0,m.useState)(!1),[P,F]=(0,m.useState)(!1),[I,L]=(0,m.useState)(null),R=(0,m.useRef)(null),z=(0,m.useRef)(null);(0,m.useEffect)(()=>{t&&z.current?.focus()},[t]),(0,m.useEffect)(()=>()=>{R.current&&clearTimeout(R.current)},[]);let B=async()=>{if(!M){N(!0),L(null),R.current=setTimeout(()=>N(!1),v);return}R.current&&clearTimeout(R.current),F(!0),L(null);try{await r(e.id)}catch(e){L(e instanceof Error?e.message:`Failed to delete profile`),N(!1),F(!1)}},V=()=>{d(e.name),x(null),l(!0)},H=async()=>{let t=u.trim();if(!t||t===e.name){l(!1);return}g(!0),x(null);try{await i(e.id,t),l(!1)}catch(e){x(e instanceof Error?e.message:`Failed to rename`)}finally{g(!1)}},U=async t=>{if(!(t===e.color||O)){k(!0),j(null);try{await a(e.id,t)}catch(e){j(e instanceof Error?e.message:`Failed to update color`)}finally{k(!1)}}},W=async()=>{let t=S.trim();if(!(!t||w)){if(e.data_paths.includes(t)){j(`That path is already in this profile`);return}T(!0),j(null);try{await o(e.id,t),C(``)}catch(e){j(e instanceof Error?e.message:`Failed to add path`)}finally{T(!1)}}},G=async t=>{D(t),j(null);try{await s(e.id,t)}catch(e){j(e instanceof Error?e.message:`Failed to remove path`)}finally{D(null)}};return(0,h.jsxs)(`div`,{style:{background:`var(--bg-tool-block)`,borderRadius:`var(--radius-sm)`,border:`1px solid var(--border-subtle)`,overflow:`hidden`},children:[(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`8px 10px`,cursor:`pointer`},onClick:n,children:[(0,h.jsx)(`span`,{style:{width:`14px`,height:`14px`,borderRadius:`50%`,background:e.color,flexShrink:0}}),c?(0,h.jsx)(`input`,{value:u,onChange:e=>d(e.target.value),onClick:e=>e.stopPropagation(),onBlur:H,onKeyDown:e=>{e.key===`Enter`&&H(),e.key===`Escape`&&l(!1)},disabled:f,autoFocus:!0,style:{flex:1,fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`,background:`var(--bg-sidebar)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,padding:`1px 6px`,fontFamily:`var(--font-ui)`,outline:`none`}}):(0,h.jsxs)(`span`,{style:{flex:1,display:`flex`,alignItems:`center`,gap:`4px`,minWidth:0},children:[(0,h.jsx)(`span`,{style:{fontSize:`13px`,color:`var(--text-primary)`,fontWeight:500,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.name}),(0,h.jsx)(`button`,{onClick:e=>{e.stopPropagation(),V()},"aria-label":`Rename ${e.name}`,title:`Rename`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`11px`,padding:`2px`,lineHeight:1,flexShrink:0,opacity:.6},children:`✎`})]}),(0,h.jsxs)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:[e.data_paths.length,` path`,e.data_paths.length===1?``:`s`]}),(0,h.jsx)(`span`,{style:{fontSize:`9px`,color:`var(--text-tertiary)`,transition:`transform var(--transition-fast)`,transform:t?`rotate(180deg)`:`rotate(0deg)`,display:`inline-block`},children:`▾`}),(0,h.jsx)(`button`,{onClick:e=>{e.stopPropagation(),B()},disabled:P,"aria-label":M?`Confirm delete of profile ${e.name}`:`Delete profile ${e.name}`,title:M?`Click again to confirm`:`Delete profile`,style:{background:M?p:`none`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:P?`not-allowed`:`pointer`,color:M?`var(--text-on-accent)`:`var(--text-tertiary)`,fontSize:M?`10px`:`16px`,fontWeight:M?600:400,padding:M?`3px 7px`:`2px 4px`,lineHeight:1.4,transition:`background var(--transition-fast), color var(--transition-fast)`},children:P?`…`:M?`Confirm?`:`×`})]}),b&&(0,h.jsx)(`div`,{style:{...y,padding:`0 10px 8px`,marginTop:0},children:b}),I&&(0,h.jsx)(`div`,{style:{...y,padding:`0 10px 8px`,marginTop:0},children:I}),t&&(0,h.jsxs)(`div`,{style:{padding:`0 10px 10px`,borderTop:`1px solid var(--border-subtle)`},children:[(0,h.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,margin:`8px 0`},children:_.map(t=>(0,h.jsx)(`button`,{onClick:()=>U(t),disabled:O,style:{width:`22px`,height:`22px`,borderRadius:`50%`,background:t,border:e.color===t?`2px solid var(--text-primary)`:`2px solid transparent`,cursor:O?`not-allowed`:`pointer`,padding:0,transition:`border-color var(--transition-fast), transform var(--transition-fast)`,transform:e.color===t?`scale(1.15)`:`scale(1)`}},t))}),(0,h.jsx)(`div`,{style:{fontSize:`11px`,fontWeight:600,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.04em`,margin:`8px 0 6px`},children:`Data paths`}),e.data_paths.length===0&&(0,h.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,padding:`4px 0 8px`},children:`No paths yet — sessions for this profile won't show until you add one.`}),e.data_paths.map((e,t)=>(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,marginBottom:`4px`},children:[(0,h.jsx)(`code`,{style:{flex:1,fontSize:`12px`,color:`var(--text-secondary)`,background:`var(--bg-sidebar)`,padding:`4px 8px`,borderRadius:`var(--radius-sm)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e}),(0,h.jsx)(`button`,{onClick:()=>G(t),disabled:E!==null,"aria-label":`Remove ${e}`,style:{background:`none`,border:`none`,cursor:E===null?`pointer`:`not-allowed`,color:`var(--text-tertiary)`,fontSize:`14px`,padding:`2px 4px`},children:E===t?`…`:`×`})]},e)),(0,h.jsxs)(`div`,{style:{display:`flex`,gap:`6px`,marginTop:`6px`},children:[(0,h.jsx)(`input`,{ref:z,value:S,onChange:e=>C(e.target.value),onKeyDown:e=>{e.key===`Enter`&&W()},disabled:w,placeholder:`~/.claude`,style:{flex:1,padding:`4px 8px`,fontSize:`12px`,background:`var(--bg-sidebar)`,color:`var(--text-primary)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,fontFamily:`var(--font-ui)`,outline:`none`}}),(0,h.jsx)(`button`,{onClick:W,disabled:!S.trim()||w,style:{padding:`4px 10px`,fontSize:`12px`,background:S.trim()?`var(--accent-orange)`:`var(--bg-tool-block)`,color:S.trim()?`var(--text-on-accent)`:`var(--text-tertiary)`,border:`1px solid`,borderColor:S.trim()?`var(--accent-orange)`:`var(--border-subtle)`,borderRadius:`var(--radius-sm)`,cursor:S.trim()&&!w?`pointer`:`default`,fontFamily:`var(--font-ui)`},children:w?`…`:`Add`})]}),A&&(0,h.jsx)(`div`,{style:y,children:A})]})]})}function x({config:e,onConfigChange:t}){let[n,i]=(0,m.useState)(``),[o,s]=(0,m.useState)(!1),[c,u]=(0,m.useState)(null),[f,p]=(0,m.useState)(null),g=a(e=>e.setProfiles),_=a(e=>e.setActiveProfileId),v=async()=>{let e=await r.getProfiles();g(e.profiles),_(e.active_profile_id)},x=async()=>{let a=n.trim();if(a){s(!0),u(null);try{let n=await r.createProfile(a);i(``),t({...e,profiles:[...e.profiles,n]}),await v(),p(n.id)}catch(e){u(e instanceof Error?e.message:`Failed to create profile`)}finally{s(!1)}}},S=async n=>{await r.deleteProfile(n),t({...e,profiles:e.profiles.filter(e=>e.id!==n)}),await v(),p(e=>e===n?null:e)},C=async(n,i)=>{await r.updateProfile(n,{name:i});let a={...e,profiles:e.profiles.map(e=>e.id===n?{...e,name:i}:e)};t(a),g(a.profiles)},w=async(n,i)=>{await r.updateProfile(n,{color:i});let a={...e,profiles:e.profiles.map(e=>e.id===n?{...e,color:i}:e)};t(a),g(a.profiles)},T=async(n,i)=>{let a=e.profiles.find(e=>e.id===n);if(!a)return;let o=[...a.data_paths,i];await r.updateProfile(n,{data_paths:o});let s={...e,profiles:e.profiles.map(e=>e.id===n?{...e,data_paths:o}:e)};t(s),g(s.profiles)},E=async(n,i)=>{let a=e.profiles.find(e=>e.id===n);if(!a)return;let o=a.data_paths.filter((e,t)=>t!==i);await r.updateProfile(n,{data_paths:o});let s={...e,profiles:e.profiles.map(e=>e.id===n?{...e,data_paths:o}:e)};t(s),g(s.profiles)};return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:l,children:`Profiles`}),e.profiles.length===0&&(0,h.jsx)(`div`,{style:{...d,marginTop:0,marginBottom:`12px`},children:`Split sessions into separate scopes (e.g. personal vs. work) by data path. Without a profile, every configured path is shown together.`}),e.profiles.length>0&&(0,h.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`6px`,marginBottom:`12px`},children:e.profiles.map(e=>(0,h.jsx)(b,{profile:e,isExpanded:f===e.id,onToggleExpand:()=>p(f===e.id?null:e.id),onDelete:S,onRename:C,onColorChange:w,onAddPath:T,onRemovePath:E},e.id))}),(0,h.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,h.jsx)(`input`,{value:n,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&x()},disabled:o,placeholder:`New profile name…`,style:{flex:1,padding:`6px 10px`,fontSize:`13px`,background:`var(--bg-tool-block)`,color:`var(--text-primary)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,fontFamily:`var(--font-ui)`,outline:`none`}}),(0,h.jsx)(`button`,{onClick:x,disabled:!n.trim()||o,style:{padding:`6px 14px`,fontSize:`13px`,background:n.trim()?`var(--accent-orange)`:`var(--bg-tool-block)`,color:n.trim()?`var(--text-on-accent)`:`var(--text-tertiary)`,border:`1px solid`,borderColor:n.trim()?`var(--accent-orange)`:`var(--border-subtle)`,borderRadius:`var(--radius-sm)`,cursor:n.trim()&&!o?`pointer`:`default`,fontFamily:`var(--font-ui)`},children:o?`…`:`Add`})]}),c&&(0,h.jsx)(`div`,{style:y,children:c})]})}function S(){let e=a(e=>e.sessionSortOrder),t=a(e=>e.setSessionSortOrder);return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:l,children:`Session order`}),(0,h.jsx)(`div`,{style:{display:`flex`,gap:`8px`},children:[[`recent`,`Most recent`],[`oldest`,`Oldest first`],[`alpha`,`Project A–Z`]].map(([n,r])=>(0,h.jsx)(`button`,{onClick:()=>t(n),style:{padding:`6px 14px`,fontSize:`13px`,background:e===n?`var(--accent-orange)`:`var(--bg-tool-block)`,color:e===n?`var(--text-on-accent)`:`var(--text-secondary)`,border:`1px solid`,borderColor:e===n?`var(--accent-orange)`:`var(--border-subtle)`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,fontFamily:`var(--font-ui)`,transition:`all var(--transition-fast)`,whiteSpace:`nowrap`},children:r},n))})]})}function C({config:e,onChange:t}){let n=e.claude_recap_enabled,r=e.claude_recap_idle_minutes;return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:l,children:`Auto-recap`}),(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`},children:[(0,h.jsx)(u,{label:`Enable auto-recap`,checked:n,onChange:n=>t({...e,claude_recap_enabled:n})}),(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,opacity:n?1:.5},children:[(0,h.jsx)(`label`,{style:{fontSize:`13px`,color:`var(--text-secondary)`,minWidth:`100px`},children:`Idle minutes`}),(0,h.jsx)(`input`,{type:`number`,min:1,max:60,value:r,disabled:!n,onChange:n=>{let r=parseInt(n.target.value,10);r>=1&&r<=60&&t({...e,claude_recap_idle_minutes:r})},style:{width:`80px`,padding:`5px 8px`,fontSize:`13px`,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,color:`var(--text-primary)`,fontFamily:`var(--font-mono)`}})]}),(0,h.jsx)(`div`,{style:d,children:`Generate a short Haiku-backed summary when you return to a session after being away. Recaps are stored in agent-decoder only — they never modify your conversation file.`})]})]})}function w(){let[e,t]=(0,m.useState)(`idle`);return(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`6px`,marginTop:`2px`},children:[(0,h.jsx)(`button`,{onClick:async()=>{t(`scanning`);try{await r.refresh()}catch{}t(`done`),setTimeout(()=>t(`idle`),2e3)},disabled:e===`scanning`,style:{alignSelf:`flex-start`,padding:`6px 14px`,fontSize:`13px`,background:`var(--bg-tool-block)`,color:e===`done`?`var(--accent-orange)`:`var(--text-secondary)`,border:`1px solid`,borderColor:e===`done`?`var(--accent-orange)`:`var(--border-subtle)`,borderRadius:`var(--radius-sm)`,cursor:e===`scanning`?`default`:`pointer`,fontFamily:`var(--font-ui)`,transition:`all var(--transition-fast)`},children:e===`scanning`?`Scanning…`:e===`done`?`Done ✓`:`Force rescan`}),(0,h.jsx)(`div`,{style:d,children:`Re-reads every configured data path for new or changed sessions. Use this if you edited a session JSONL outside agent-decoder, or if a session you expect to see isn't appearing.`})]})}var T=[{value:`default`,label:`default`,description:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`em`,{children:`Recommended.`}),` Claude prompts appear in Native View when needed.`]})},{value:`dontAsk`,label:`dontAsk`,description:(0,h.jsx)(h.Fragment,{children:`Run without prompting for permission.`})},{value:`acceptEdits`,label:`acceptEdits`,description:(0,h.jsx)(h.Fragment,{children:`Auto-accept file edits; prompt for other tools.`})},{value:`auto`,label:`auto`,description:(0,h.jsx)(h.Fragment,{children:`Heuristic auto-approval.`})},{value:`bypassPermissions`,label:`bypassPermissions`,description:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`em`,{children:`Dangerous.`}),` Skip all checks.`]})},{value:`plan`,label:`plan`,description:(0,h.jsx)(h.Fragment,{children:`Plan only, do not execute tools.`})}];function E({config:e,onChange:t}){let n=e.claude_default_permission_mode??`default`,r=n===`bypassPermissions`,i=T.find(e=>e.value===n);return(0,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{style:l,children:[`Default permission mode`,r&&(0,h.jsx)(`span`,{style:{marginLeft:`8px`,fontSize:`10px`,fontWeight:600,letterSpacing:`0.04em`,color:`#c47a7a`,background:`color-mix(in srgb, #c47a7a 16%, transparent)`,border:`1px solid color-mix(in srgb, #c47a7a 40%, transparent)`,borderRadius:`var(--radius-pill)`,padding:`1px 7px`,textTransform:`uppercase`},children:`Dangerous`})]}),(0,h.jsx)(`select`,{value:n,onChange:n=>t({...e,claude_default_permission_mode:n.target.value}),style:{width:`100%`,padding:`8px 10px`,fontSize:`13px`,fontFamily:`var(--font-mono)`,color:`var(--text-primary)`,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,cursor:`pointer`},children:T.map(e=>(0,h.jsx)(`option`,{value:e.value,children:e.label},e.value))}),i&&(0,h.jsx)(`div`,{style:d,children:i.description})]})}function D({value:e,onChange:t}){let n=c.filter(e=>e.bundled===!1);return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{role:`listbox`,"aria-label":`PTY font`,style:{maxHeight:`240px`,overflowY:`auto`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,background:`var(--bg-input)`},children:c.map(n=>{let r=n.value===e;return(0,h.jsxs)(`button`,{type:`button`,role:`option`,"aria-selected":r,"aria-label":n.label,onClick:()=>t(n.value),style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,gap:`10px`,width:`100%`,padding:`8px 11px`,border:`none`,borderBottom:`1px solid var(--border-subtle)`,textAlign:`left`,cursor:`pointer`,background:r?`var(--accent-orange-subtle)`:`transparent`,color:`var(--text-primary)`},children:[(0,h.jsx)(`span`,{style:{fontFamily:n.stack,fontSize:`13px`,lineHeight:1.3},children:n.label}),n.bundled===!1&&(0,h.jsx)(`span`,{style:{flexShrink:0,fontSize:`10px`,textTransform:`uppercase`,letterSpacing:`0.04em`,color:`var(--text-tertiary)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,padding:`1px 6px`,fontFamily:`var(--font-ui)`},children:`install`})]},n.value)})}),(0,h.jsxs)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,marginTop:`8px`,lineHeight:1.5},children:[`Each name is shown in its own font. Bundled fonts render everywhere.`,n.length>0&&(0,h.jsxs)(h.Fragment,{children:[` `,`Fonts tagged `,(0,h.jsx)(`strong`,{children:`install`}),` aren't shipped (their licenses don't allow redistribution) — install them on your Mac to use them:`,` `,n.map((e,t)=>(0,h.jsxs)(`span`,{children:[t>0?` · `:``,(0,h.jsx)(`a`,{href:e.acquireUrl,target:`_blank`,rel:`noreferrer`,style:{color:`var(--text-accent)`},children:e.label})]},e.value)),`.`]}),` `,`To add any other font, install it system-wide (it renders if its name matches) or, for local builds, drop a `,(0,h.jsx)(`code`,{style:{fontFamily:`var(--font-mono)`},children:`.woff2`}),` into`,` `,(0,h.jsx)(`code`,{style:{fontFamily:`var(--font-mono)`},children:`frontend/src/assets/fonts/`}),` with an`,` `,(0,h.jsx)(`code`,{style:{fontFamily:`var(--font-mono)`},children:`@font-face`}),`.`]})]})}var O=20,k=400,A=10,j=[{id:`general`,label:`General`},{id:`appearance`,label:`Appearance`},{id:`chat`,label:`Chat`},{id:`terminal`,label:`Terminal`},{id:`server`,label:`Server`},{id:`about`,label:`About`}],M={darwin:`macOS`,linux:`Linux`,win32:`Windows`};function N(){let e=a(e=>e.closeSettings),t=a(e=>e.showParentFolder),n=a(e=>e.setShowParentFolder),c=a(e=>e.setShowProviderTag),[d,p]=(0,m.useState)(i),[_,v]=(0,m.useState)(null),[y,b]=(0,m.useState)(`general`),[T,M]=(0,m.useState)(null),[N,P]=(0,m.useState)(null);(0,m.useEffect)(()=>{d||o().then(p).catch(e=>{v(e instanceof Error?e.message:`Failed to load config`)})},[d]),(0,m.useEffect)(()=>{y!==`about`||T||(r.getHostInfo().then(M).catch(()=>{}),r.getUpdateCheck().then(P).catch(()=>{}))},[y,T]);function F(e){p(e),r.updateConfig(e).catch(()=>{})}return(0,m.useEffect)(()=>{let t=t=>{t.key===`Escape`&&e()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]),(0,h.jsx)(`div`,{role:`dialog`,"aria-label":`Settings`,style:{position:`fixed`,inset:0,zIndex:1e3,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`16px`,pointerEvents:`none`},children:(0,h.jsxs)(`div`,{style:{pointerEvents:`auto`,width:`100%`,maxWidth:`760px`,height:`min(600px, calc(100vh - 96px))`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,border:`1px solid var(--border-default)`,boxShadow:`var(--shadow-lg)`,display:`flex`,flexDirection:`column`,overflow:`hidden`},children:[(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`14px 16px`,borderBottom:`1px solid var(--border-subtle)`,flexShrink:0},children:[(0,h.jsx)(`h2`,{style:{margin:0,fontSize:`15px`,fontWeight:600,color:`var(--text-primary)`,letterSpacing:`-0.005em`},children:`Settings`}),(0,h.jsx)(`button`,{onClick:e,"aria-label":`Close settings`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`20px`,lineHeight:1,padding:`4px`,borderRadius:`var(--radius-sm)`,transition:`color var(--transition-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`},children:`×`})]}),(0,h.jsxs)(`div`,{style:{display:`flex`,flex:1,minHeight:0},children:[(0,h.jsx)(`nav`,{"aria-label":`Settings categories`,style:{flexShrink:0,width:`168px`,borderRight:`1px solid var(--border-subtle)`,padding:`8px`,display:`flex`,flexDirection:`column`,gap:`2px`,background:`var(--bg-subtle)`,overflowY:`auto`},children:j.map(e=>{let t=e.id===y;return(0,h.jsx)(`button`,{type:`button`,"aria-pressed":t,onClick:()=>b(e.id),style:{textAlign:`left`,padding:`7px 10px`,fontSize:`13px`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,fontFamily:`var(--font-ui)`,background:t?`var(--bg-base)`:`transparent`,color:t?`var(--text-primary)`:`var(--text-secondary)`,fontWeight:t?600:400},children:e.label},e.id)})}),(0,h.jsxs)(s,{style:{flex:1,padding:`18px 22px`},children:[_&&(0,h.jsx)(`div`,{style:{padding:`12px`,background:`var(--tool-error-bg)`,border:`1px solid var(--tool-error-border)`,borderRadius:`var(--radius-sm)`,fontSize:`13px`,color:`var(--tool-error-border)`,marginBottom:`16px`},children:_}),!d&&!_&&(0,h.jsx)(`div`,{style:{textAlign:`center`,padding:`24px`,fontSize:`13px`,color:`var(--text-tertiary)`},children:`Loading…`}),d&&(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`22px`},children:[y===`general`&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(x,{config:d,onConfigChange:p}),d.profiles.length===0&&(0,h.jsx)(g,{config:d,onConfigChange:p}),(0,h.jsx)(w,{}),(0,h.jsx)(u,{label:`Open browser on startup`,checked:d.auto_open_browser,onChange:e=>F({...d,auto_open_browser:e})})]}),y===`appearance`&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:l,children:`Theme`}),(0,h.jsx)(`div`,{style:{display:`flex`,gap:`8px`},children:[`light`,`dark`,`system`].map(e=>(0,h.jsx)(`button`,{onClick:()=>{let t={...d,theme:e};p(t),r.updateConfig(t).catch(()=>{});let n=window.__agentDecoderApplyTheme;n&&n(e)},style:f(d.theme===e),children:e},e))})]}),(0,h.jsx)(S,{}),(0,h.jsx)(u,{label:`Show parent folder in project names`,checked:t,onChange:n}),(0,h.jsx)(u,{label:`Show provider tag on chats`,hint:`Adds a small label (e.g. GPT) to non-Claude sessions in the sidebar`,checked:d?.show_provider_tag??!1,onChange:e=>{c(e),d&&F({...d,show_provider_tag:e})}})]}),y===`chat`&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(u,{label:`Allow editing & deleting messages`,hint:`Creates a backup before every write`,checked:d.edit_enabled,onChange:e=>F({...d,edit_enabled:e})}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-primary)`,marginBottom:`6px`},children:`Send shortcut`}),(0,h.jsx)(`div`,{style:{display:`flex`,gap:`8px`,flexWrap:`wrap`},children:[{value:`enter`,label:`Enter`},{value:`modEnter`,label:`Cmd/Ctrl+Enter`}].map(e=>(0,h.jsx)(`button`,{type:`button`,onClick:()=>F({...d,chat_send_shortcut:e.value}),style:{...f((d.chat_send_shortcut??`enter`)===e.value),textTransform:`none`},children:e.label},e.value))}),(0,h.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,marginTop:`6px`,lineHeight:1.4},children:`Applies to Decoded View. Native View keeps terminal keyboard behavior.`})]}),(0,h.jsx)(E,{config:d,onChange:F}),(0,h.jsx)(C,{config:d,onChange:F})]}),y===`terminal`&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-primary)`,marginBottom:`6px`},children:`PTY font`}),(0,h.jsx)(D,{value:d.native_pty_font_family??`monaspace-argon`,onChange:e=>F({...d,native_pty_font_family:e})})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-primary)`,marginBottom:`6px`},children:`Terminal width`}),(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,h.jsx)(`button`,{type:`button`,"aria-label":`Narrower terminal`,disabled:d.native_pty_cols<=O,onClick:()=>F({...d,native_pty_cols:Math.max(O,d.native_pty_cols-A)}),style:{...f(!1),width:`34px`,padding:`6px 0`,textTransform:`none`,opacity:d.native_pty_cols<=O?.45:1},children:`−`}),(0,h.jsxs)(`div`,{"aria-label":`Terminal width columns`,style:{minWidth:`86px`,textAlign:`center`,fontSize:`13px`,color:`var(--text-secondary)`,fontFamily:`var(--font-mono)`},children:[d.native_pty_cols,` cols`]}),(0,h.jsx)(`button`,{type:`button`,"aria-label":`Wider terminal`,disabled:d.native_pty_cols>=k,onClick:()=>F({...d,native_pty_cols:Math.min(k,d.native_pty_cols+A)}),style:{...f(!1),width:`34px`,padding:`6px 0`,textTransform:`none`,opacity:d.native_pty_cols>=k?.45:1},children:`+`})]}),(0,h.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,marginTop:`6px`,lineHeight:1.4},children:`Column width Claude wraps to in Native View. Applies to new sessions; the view renders at this width and never reflows.`})]})]}),y===`server`&&(0,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{style:l,children:[`Server`,(0,h.jsx)(`span`,{style:{fontSize:`10px`,color:`var(--text-tertiary)`,fontWeight:400,marginLeft:`6px`,textTransform:`none`,letterSpacing:0},children:`requires restart`})]}),(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`},children:[(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`},children:[(0,h.jsx)(`label`,{style:{fontSize:`13px`,color:`var(--text-secondary)`,minWidth:`80px`},children:`Port`}),(0,h.jsx)(`input`,{type:`number`,min:1024,max:65535,value:d.port,onChange:e=>{let t=parseInt(e.target.value,10);t>=1024&&t<=65535&&F({...d,port:t})},style:{width:`90px`,padding:`5px 8px`,fontSize:`13px`,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,color:`var(--text-primary)`,fontFamily:`var(--font-mono)`}})]}),(0,h.jsx)(u,{label:`Expose on local network`,hint:`Binds to 0.0.0.0 — anyone on your network can view your data`,checked:d.host===`0.0.0.0`,onChange:e=>F({...d,host:e?`0.0.0.0`:`127.0.0.1`}),danger:d.host===`0.0.0.0`})]})]}),y===`about`&&(0,h.jsx)(I,{hostInfo:T,updateCheck:N})]})]})]})]})})}var P=`https://github.com/Comradery64/Agent-Decoder`;function F({href:e,children:t}){return(0,h.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer`,style:{color:`var(--text-secondary)`,textDecoration:`none`,transition:`color var(--transition-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-accent)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-secondary)`},children:t})}function I({hostInfo:e,updateCheck:t}){let n=e?M[e.platform]??e.platform:null,r=(0,h.jsx)(`span`,{style:{color:`var(--border-default)`},children:`·`});return(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,textAlign:`center`,padding:`20px 16px 8px`},children:[(0,h.jsx)(`img`,{src:`/app-icon.png`,alt:`Agent Decoder`,width:72,height:72,style:{display:`block`,marginBottom:`14px`}}),(0,h.jsx)(`div`,{style:{fontSize:`26px`,fontWeight:600,letterSpacing:`-0.02em`,color:`var(--text-primary)`,lineHeight:1.1},children:`Agent Decoder`}),(0,h.jsxs)(`div`,{style:{fontSize:`13px`,color:`var(--text-secondary)`,marginTop:`8px`},children:[`Version `,e?.version??`…`]}),n&&(0,h.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,marginTop:`2px`},children:n}),t?.update_available&&(0,h.jsxs)(`a`,{href:`${P}/blob/main/CHANGELOG.md`,target:`_blank`,rel:`noreferrer`,style:{display:`block`,marginTop:`12px`,padding:`6px 12px`,borderRadius:`6px`,background:`var(--accent-orange-subtle)`,color:`var(--accent-orange)`,fontSize:`12px`,fontWeight:500,textDecoration:`none`},children:[`v`,t.latest_version,` available — run`,` `,(0,h.jsx)(`code`,{style:{fontFamily:`var(--font-mono)`},children:`pipx install --force agent-decoder`}),` to update`]}),(0,h.jsx)(`p`,{style:{fontSize:`12.5px`,color:`var(--text-tertiary)`,lineHeight:1.55,maxWidth:`340px`,margin:`18px 0 0`},children:`Browse, search, and analyze your AI coding assistant chat history — entirely local, entirely private.`}),(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,marginTop:`16px`,fontSize:`12px`},children:[(0,h.jsx)(F,{href:P,children:`GitHub`}),r,(0,h.jsx)(F,{href:`${P}/blob/main/CHANGELOG.md`,children:`Changelog`}),r,(0,h.jsx)(F,{href:`${P}/blob/main/LICENSE`,children:`License`})]}),(0,h.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,marginTop:`20px`,letterSpacing:`0.01em`},children:`FSL-1.1-Apache-2.0`})]})}export{N as default}; \ No newline at end of file +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{c as r,l as i,p as a,u as o}from"./index-XPrlVfCr.js";import{i as s}from"./ScrollContainer-CA7-aYqv.js";import{n as c}from"./nativePtyFonts-BxhRYj2G.js";import{a as l,i as u,n as d,o as f,r as p}from"./shared-CAVcrZag.js";var m=e(t(),1),h=n();function g({config:e,onConfigChange:t}){let[n,i]=(0,m.useState)(``),[a,o]=(0,m.useState)(!1),[s,c]=(0,m.useState)(null),l=async e=>{o(!0),c(null);try{let n=await r.updateConfig(e);await r.refresh(),t(n)}catch(e){c(e instanceof Error?e.message:`Failed to save`)}finally{o(!1)}},u=t=>{l({...e,data_paths:e.data_paths.filter(e=>e!==t)})},d=()=>{let t=n.trim();!t||e.data_paths.includes(t)||l({...e,data_paths:[...e.data_paths,t]}).then(()=>i(``))};return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:{fontSize:`12px`,fontWeight:600,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.05em`,marginBottom:`10px`},children:`Data Paths`}),(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`6px`,marginBottom:`12px`},children:[e.data_paths.length===0&&(0,h.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-tertiary)`,padding:`8px 0`},children:`No paths configured`}),e.data_paths.map(e=>(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,padding:`6px 10px`},children:[(0,h.jsx)(`code`,{style:{flex:1,fontSize:`12px`,fontFamily:`var(--font-mono)`,color:`var(--text-primary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e}),(0,h.jsx)(`button`,{onClick:()=>u(e),disabled:a,"aria-label":`Remove ${e}`,style:{background:`none`,border:`none`,cursor:a?`not-allowed`:`pointer`,color:`var(--text-tertiary)`,fontSize:`14px`,lineHeight:1,padding:`2px 4px`,borderRadius:`var(--radius-sm)`,flexShrink:0,transition:`color var(--transition-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--tool-error-border)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`},children:`×`})]},e))]}),(0,h.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,h.jsx)(`input`,{type:`text`,value:n,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&d()},placeholder:`/path/to/claude/sessions`,style:{flex:1,padding:`7px 10px`,fontSize:`13px`,fontFamily:`var(--font-mono)`,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,color:`var(--text-primary)`,outline:`none`}}),(0,h.jsx)(`button`,{onClick:d,disabled:a||!n.trim(),style:{padding:`7px 14px`,fontSize:`13px`,background:n.trim()?`var(--accent-orange)`:`var(--bg-tool-block)`,color:n.trim()?`var(--text-on-accent)`:`var(--text-tertiary)`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:n.trim()&&!a?`pointer`:`not-allowed`,fontFamily:`var(--font-ui)`,transition:`background var(--transition-fast)`,flexShrink:0},children:`Add`})]}),s&&(0,h.jsx)(`div`,{style:{marginTop:`8px`,fontSize:`12px`,color:`var(--tool-error-border)`},children:s})]})}var _=[`#b8956a`,`#3b82f6`,`#10b981`,`#9b8ec4`,`#c47a7a`,`#c9a96e`,`#7eb6c4`,`#d4758a`],v=3e3,y={...d,color:p,marginTop:`6px`};function b({profile:e,isExpanded:t,onToggleExpand:n,onDelete:r,onRename:i,onColorChange:a,onAddPath:o,onRemovePath:s}){let[c,l]=(0,m.useState)(!1),[u,d]=(0,m.useState)(e.name),[f,g]=(0,m.useState)(!1),[b,x]=(0,m.useState)(null),[S,C]=(0,m.useState)(``),[w,T]=(0,m.useState)(!1),[E,D]=(0,m.useState)(null),[O,k]=(0,m.useState)(!1),[A,j]=(0,m.useState)(null),[M,N]=(0,m.useState)(!1),[P,F]=(0,m.useState)(!1),[I,L]=(0,m.useState)(null),R=(0,m.useRef)(null),z=(0,m.useRef)(null);(0,m.useEffect)(()=>{t&&z.current?.focus()},[t]),(0,m.useEffect)(()=>()=>{R.current&&clearTimeout(R.current)},[]);let B=async()=>{if(!M){N(!0),L(null),R.current=setTimeout(()=>N(!1),v);return}R.current&&clearTimeout(R.current),F(!0),L(null);try{await r(e.id)}catch(e){L(e instanceof Error?e.message:`Failed to delete profile`),N(!1),F(!1)}},V=()=>{d(e.name),x(null),l(!0)},H=async()=>{let t=u.trim();if(!t||t===e.name){l(!1);return}g(!0),x(null);try{await i(e.id,t),l(!1)}catch(e){x(e instanceof Error?e.message:`Failed to rename`)}finally{g(!1)}},U=async t=>{if(!(t===e.color||O)){k(!0),j(null);try{await a(e.id,t)}catch(e){j(e instanceof Error?e.message:`Failed to update color`)}finally{k(!1)}}},W=async()=>{let t=S.trim();if(!(!t||w)){if(e.data_paths.includes(t)){j(`That path is already in this profile`);return}T(!0),j(null);try{await o(e.id,t),C(``)}catch(e){j(e instanceof Error?e.message:`Failed to add path`)}finally{T(!1)}}},G=async t=>{D(t),j(null);try{await s(e.id,t)}catch(e){j(e instanceof Error?e.message:`Failed to remove path`)}finally{D(null)}};return(0,h.jsxs)(`div`,{style:{background:`var(--bg-tool-block)`,borderRadius:`var(--radius-sm)`,border:`1px solid var(--border-subtle)`,overflow:`hidden`},children:[(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`8px 10px`,cursor:`pointer`},onClick:n,children:[(0,h.jsx)(`span`,{style:{width:`14px`,height:`14px`,borderRadius:`50%`,background:e.color,flexShrink:0}}),c?(0,h.jsx)(`input`,{value:u,onChange:e=>d(e.target.value),onClick:e=>e.stopPropagation(),onBlur:H,onKeyDown:e=>{e.key===`Enter`&&H(),e.key===`Escape`&&l(!1)},disabled:f,autoFocus:!0,style:{flex:1,fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`,background:`var(--bg-sidebar)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,padding:`1px 6px`,fontFamily:`var(--font-ui)`,outline:`none`}}):(0,h.jsxs)(`span`,{style:{flex:1,display:`flex`,alignItems:`center`,gap:`4px`,minWidth:0},children:[(0,h.jsx)(`span`,{style:{fontSize:`13px`,color:`var(--text-primary)`,fontWeight:500,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.name}),(0,h.jsx)(`button`,{onClick:e=>{e.stopPropagation(),V()},"aria-label":`Rename ${e.name}`,title:`Rename`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`11px`,padding:`2px`,lineHeight:1,flexShrink:0,opacity:.6},children:`✎`})]}),(0,h.jsxs)(`span`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:[e.data_paths.length,` path`,e.data_paths.length===1?``:`s`]}),(0,h.jsx)(`span`,{style:{fontSize:`9px`,color:`var(--text-tertiary)`,transition:`transform var(--transition-fast)`,transform:t?`rotate(180deg)`:`rotate(0deg)`,display:`inline-block`},children:`▾`}),(0,h.jsx)(`button`,{onClick:e=>{e.stopPropagation(),B()},disabled:P,"aria-label":M?`Confirm delete of profile ${e.name}`:`Delete profile ${e.name}`,title:M?`Click again to confirm`:`Delete profile`,style:{background:M?p:`none`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:P?`not-allowed`:`pointer`,color:M?`var(--text-on-accent)`:`var(--text-tertiary)`,fontSize:M?`10px`:`16px`,fontWeight:M?600:400,padding:M?`3px 7px`:`2px 4px`,lineHeight:1.4,transition:`background var(--transition-fast), color var(--transition-fast)`},children:P?`…`:M?`Confirm?`:`×`})]}),b&&(0,h.jsx)(`div`,{style:{...y,padding:`0 10px 8px`,marginTop:0},children:b}),I&&(0,h.jsx)(`div`,{style:{...y,padding:`0 10px 8px`,marginTop:0},children:I}),t&&(0,h.jsxs)(`div`,{style:{padding:`0 10px 10px`,borderTop:`1px solid var(--border-subtle)`},children:[(0,h.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,margin:`8px 0`},children:_.map(t=>(0,h.jsx)(`button`,{onClick:()=>U(t),disabled:O,style:{width:`22px`,height:`22px`,borderRadius:`50%`,background:t,border:e.color===t?`2px solid var(--text-primary)`:`2px solid transparent`,cursor:O?`not-allowed`:`pointer`,padding:0,transition:`border-color var(--transition-fast), transform var(--transition-fast)`,transform:e.color===t?`scale(1.15)`:`scale(1)`}},t))}),(0,h.jsx)(`div`,{style:{fontSize:`11px`,fontWeight:600,color:`var(--text-tertiary)`,textTransform:`uppercase`,letterSpacing:`0.04em`,margin:`8px 0 6px`},children:`Data paths`}),e.data_paths.length===0&&(0,h.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,padding:`4px 0 8px`},children:`No paths yet — sessions for this profile won't show until you add one.`}),e.data_paths.map((e,t)=>(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,marginBottom:`4px`},children:[(0,h.jsx)(`code`,{style:{flex:1,fontSize:`12px`,color:`var(--text-secondary)`,background:`var(--bg-sidebar)`,padding:`4px 8px`,borderRadius:`var(--radius-sm)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e}),(0,h.jsx)(`button`,{onClick:()=>G(t),disabled:E!==null,"aria-label":`Remove ${e}`,style:{background:`none`,border:`none`,cursor:E===null?`pointer`:`not-allowed`,color:`var(--text-tertiary)`,fontSize:`14px`,padding:`2px 4px`},children:E===t?`…`:`×`})]},e)),(0,h.jsxs)(`div`,{style:{display:`flex`,gap:`6px`,marginTop:`6px`},children:[(0,h.jsx)(`input`,{ref:z,value:S,onChange:e=>C(e.target.value),onKeyDown:e=>{e.key===`Enter`&&W()},disabled:w,placeholder:`~/.claude`,style:{flex:1,padding:`4px 8px`,fontSize:`12px`,background:`var(--bg-sidebar)`,color:`var(--text-primary)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,fontFamily:`var(--font-ui)`,outline:`none`}}),(0,h.jsx)(`button`,{onClick:W,disabled:!S.trim()||w,style:{padding:`4px 10px`,fontSize:`12px`,background:S.trim()?`var(--accent-orange)`:`var(--bg-tool-block)`,color:S.trim()?`var(--text-on-accent)`:`var(--text-tertiary)`,border:`1px solid`,borderColor:S.trim()?`var(--accent-orange)`:`var(--border-subtle)`,borderRadius:`var(--radius-sm)`,cursor:S.trim()&&!w?`pointer`:`default`,fontFamily:`var(--font-ui)`},children:w?`…`:`Add`})]}),A&&(0,h.jsx)(`div`,{style:y,children:A})]})]})}function x({config:e,onConfigChange:t}){let[n,i]=(0,m.useState)(``),[o,s]=(0,m.useState)(!1),[c,u]=(0,m.useState)(null),[f,p]=(0,m.useState)(null),g=a(e=>e.setProfiles),_=a(e=>e.setActiveProfileId),v=async()=>{let e=await r.getProfiles();g(e.profiles),_(e.active_profile_id)},x=async()=>{let a=n.trim();if(a){s(!0),u(null);try{let n=await r.createProfile(a);i(``),t({...e,profiles:[...e.profiles,n]}),await v(),p(n.id)}catch(e){u(e instanceof Error?e.message:`Failed to create profile`)}finally{s(!1)}}},S=async n=>{await r.deleteProfile(n),t({...e,profiles:e.profiles.filter(e=>e.id!==n)}),await v(),p(e=>e===n?null:e)},C=async(n,i)=>{await r.updateProfile(n,{name:i});let a={...e,profiles:e.profiles.map(e=>e.id===n?{...e,name:i}:e)};t(a),g(a.profiles)},w=async(n,i)=>{await r.updateProfile(n,{color:i});let a={...e,profiles:e.profiles.map(e=>e.id===n?{...e,color:i}:e)};t(a),g(a.profiles)},T=async(n,i)=>{let a=e.profiles.find(e=>e.id===n);if(!a)return;let o=[...a.data_paths,i];await r.updateProfile(n,{data_paths:o});let s={...e,profiles:e.profiles.map(e=>e.id===n?{...e,data_paths:o}:e)};t(s),g(s.profiles)},E=async(n,i)=>{let a=e.profiles.find(e=>e.id===n);if(!a)return;let o=a.data_paths.filter((e,t)=>t!==i);await r.updateProfile(n,{data_paths:o});let s={...e,profiles:e.profiles.map(e=>e.id===n?{...e,data_paths:o}:e)};t(s),g(s.profiles)};return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:l,children:`Profiles`}),e.profiles.length===0&&(0,h.jsx)(`div`,{style:{...d,marginTop:0,marginBottom:`12px`},children:`Split sessions into separate scopes (e.g. personal vs. work) by data path. Without a profile, every configured path is shown together.`}),e.profiles.length>0&&(0,h.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`6px`,marginBottom:`12px`},children:e.profiles.map(e=>(0,h.jsx)(b,{profile:e,isExpanded:f===e.id,onToggleExpand:()=>p(f===e.id?null:e.id),onDelete:S,onRename:C,onColorChange:w,onAddPath:T,onRemovePath:E},e.id))}),(0,h.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,h.jsx)(`input`,{value:n,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&x()},disabled:o,placeholder:`New profile name…`,style:{flex:1,padding:`6px 10px`,fontSize:`13px`,background:`var(--bg-tool-block)`,color:`var(--text-primary)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,fontFamily:`var(--font-ui)`,outline:`none`}}),(0,h.jsx)(`button`,{onClick:x,disabled:!n.trim()||o,style:{padding:`6px 14px`,fontSize:`13px`,background:n.trim()?`var(--accent-orange)`:`var(--bg-tool-block)`,color:n.trim()?`var(--text-on-accent)`:`var(--text-tertiary)`,border:`1px solid`,borderColor:n.trim()?`var(--accent-orange)`:`var(--border-subtle)`,borderRadius:`var(--radius-sm)`,cursor:n.trim()&&!o?`pointer`:`default`,fontFamily:`var(--font-ui)`},children:o?`…`:`Add`})]}),c&&(0,h.jsx)(`div`,{style:y,children:c})]})}function S(){let e=a(e=>e.sessionSortOrder),t=a(e=>e.setSessionSortOrder);return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:l,children:`Session order`}),(0,h.jsx)(`div`,{style:{display:`flex`,gap:`8px`},children:[[`recent`,`Most recent`],[`oldest`,`Oldest first`],[`alpha`,`Project A–Z`]].map(([n,r])=>(0,h.jsx)(`button`,{onClick:()=>t(n),style:{padding:`6px 14px`,fontSize:`13px`,background:e===n?`var(--accent-orange)`:`var(--bg-tool-block)`,color:e===n?`var(--text-on-accent)`:`var(--text-secondary)`,border:`1px solid`,borderColor:e===n?`var(--accent-orange)`:`var(--border-subtle)`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,fontFamily:`var(--font-ui)`,transition:`all var(--transition-fast)`,whiteSpace:`nowrap`},children:r},n))})]})}function C({config:e,onChange:t}){let n=e.claude_recap_enabled,r=e.claude_recap_idle_minutes;return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:l,children:`Auto-recap`}),(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`},children:[(0,h.jsx)(u,{label:`Enable auto-recap`,checked:n,onChange:n=>t({...e,claude_recap_enabled:n})}),(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,opacity:n?1:.5},children:[(0,h.jsx)(`label`,{style:{fontSize:`13px`,color:`var(--text-secondary)`,minWidth:`100px`},children:`Idle minutes`}),(0,h.jsx)(`input`,{type:`number`,min:1,max:60,value:r,disabled:!n,onChange:n=>{let r=parseInt(n.target.value,10);r>=1&&r<=60&&t({...e,claude_recap_idle_minutes:r})},style:{width:`80px`,padding:`5px 8px`,fontSize:`13px`,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,color:`var(--text-primary)`,fontFamily:`var(--font-mono)`}})]}),(0,h.jsx)(`div`,{style:d,children:`Generate a short Haiku-backed summary when you return to a session after being away. Recaps are stored in agent-decoder only — they never modify your conversation file.`})]})]})}function w(){let[e,t]=(0,m.useState)(`idle`);return(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`6px`,marginTop:`2px`},children:[(0,h.jsx)(`button`,{onClick:async()=>{t(`scanning`);try{await r.refresh()}catch{}t(`done`),setTimeout(()=>t(`idle`),2e3)},disabled:e===`scanning`,style:{alignSelf:`flex-start`,padding:`6px 14px`,fontSize:`13px`,background:`var(--bg-tool-block)`,color:e===`done`?`var(--accent-orange)`:`var(--text-secondary)`,border:`1px solid`,borderColor:e===`done`?`var(--accent-orange)`:`var(--border-subtle)`,borderRadius:`var(--radius-sm)`,cursor:e===`scanning`?`default`:`pointer`,fontFamily:`var(--font-ui)`,transition:`all var(--transition-fast)`},children:e===`scanning`?`Scanning…`:e===`done`?`Done ✓`:`Force rescan`}),(0,h.jsx)(`div`,{style:d,children:`Re-reads every configured data path for new or changed sessions. Use this if you edited a session JSONL outside agent-decoder, or if a session you expect to see isn't appearing.`})]})}var T=[{value:`default`,label:`default`,description:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`em`,{children:`Recommended.`}),` Claude prompts appear in Native View when needed.`]})},{value:`dontAsk`,label:`dontAsk`,description:(0,h.jsx)(h.Fragment,{children:`Run without prompting for permission.`})},{value:`acceptEdits`,label:`acceptEdits`,description:(0,h.jsx)(h.Fragment,{children:`Auto-accept file edits; prompt for other tools.`})},{value:`auto`,label:`auto`,description:(0,h.jsx)(h.Fragment,{children:`Heuristic auto-approval.`})},{value:`bypassPermissions`,label:`bypassPermissions`,description:(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`em`,{children:`Dangerous.`}),` Skip all checks.`]})},{value:`plan`,label:`plan`,description:(0,h.jsx)(h.Fragment,{children:`Plan only, do not execute tools.`})}];function E({config:e,onChange:t}){let n=e.claude_default_permission_mode??`default`,r=n===`bypassPermissions`,i=T.find(e=>e.value===n);return(0,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{style:l,children:[`Default permission mode`,r&&(0,h.jsx)(`span`,{style:{marginLeft:`8px`,fontSize:`10px`,fontWeight:600,letterSpacing:`0.04em`,color:`#c47a7a`,background:`color-mix(in srgb, #c47a7a 16%, transparent)`,border:`1px solid color-mix(in srgb, #c47a7a 40%, transparent)`,borderRadius:`var(--radius-pill)`,padding:`1px 7px`,textTransform:`uppercase`},children:`Dangerous`})]}),(0,h.jsx)(`select`,{value:n,onChange:n=>t({...e,claude_default_permission_mode:n.target.value}),style:{width:`100%`,padding:`8px 10px`,fontSize:`13px`,fontFamily:`var(--font-mono)`,color:`var(--text-primary)`,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,cursor:`pointer`},children:T.map(e=>(0,h.jsx)(`option`,{value:e.value,children:e.label},e.value))}),i&&(0,h.jsx)(`div`,{style:d,children:i.description})]})}function D({value:e,onChange:t}){let n=c.filter(e=>e.bundled===!1);return(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{role:`listbox`,"aria-label":`PTY font`,style:{maxHeight:`240px`,overflowY:`auto`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,background:`var(--bg-input)`},children:c.map(n=>{let r=n.value===e;return(0,h.jsxs)(`button`,{type:`button`,role:`option`,"aria-selected":r,"aria-label":n.label,onClick:()=>t(n.value),style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,gap:`10px`,width:`100%`,padding:`8px 11px`,border:`none`,borderBottom:`1px solid var(--border-subtle)`,textAlign:`left`,cursor:`pointer`,background:r?`var(--accent-orange-subtle)`:`transparent`,color:`var(--text-primary)`},children:[(0,h.jsx)(`span`,{style:{fontFamily:n.stack,fontSize:`13px`,lineHeight:1.3},children:n.label}),n.bundled===!1&&(0,h.jsx)(`span`,{style:{flexShrink:0,fontSize:`10px`,textTransform:`uppercase`,letterSpacing:`0.04em`,color:`var(--text-tertiary)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,padding:`1px 6px`,fontFamily:`var(--font-ui)`},children:`install`})]},n.value)})}),(0,h.jsxs)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,marginTop:`8px`,lineHeight:1.5},children:[`Each name is shown in its own font. Bundled fonts render everywhere.`,n.length>0&&(0,h.jsxs)(h.Fragment,{children:[` `,`Fonts tagged `,(0,h.jsx)(`strong`,{children:`install`}),` aren't shipped (their licenses don't allow redistribution) — install them on your Mac to use them:`,` `,n.map((e,t)=>(0,h.jsxs)(`span`,{children:[t>0?` · `:``,(0,h.jsx)(`a`,{href:e.acquireUrl,target:`_blank`,rel:`noreferrer`,style:{color:`var(--text-accent)`},children:e.label})]},e.value)),`.`]}),` `,`To add any other font, install it system-wide (it renders if its name matches) or, for local builds, drop a `,(0,h.jsx)(`code`,{style:{fontFamily:`var(--font-mono)`},children:`.woff2`}),` into`,` `,(0,h.jsx)(`code`,{style:{fontFamily:`var(--font-mono)`},children:`frontend/src/assets/fonts/`}),` with an`,` `,(0,h.jsx)(`code`,{style:{fontFamily:`var(--font-mono)`},children:`@font-face`}),`.`]})]})}var O=20,k=400,A=10,j=[{id:`general`,label:`General`},{id:`appearance`,label:`Appearance`},{id:`chat`,label:`Chat`},{id:`terminal`,label:`Terminal`},{id:`server`,label:`Server`},{id:`about`,label:`About`}],M={darwin:`macOS`,linux:`Linux`,win32:`Windows`};function N(){let e=a(e=>e.closeSettings),t=a(e=>e.showParentFolder),n=a(e=>e.setShowParentFolder),c=a(e=>e.setShowProviderTag),[d,p]=(0,m.useState)(i),[_,v]=(0,m.useState)(null),[y,b]=(0,m.useState)(`general`),[T,M]=(0,m.useState)(null),[N,P]=(0,m.useState)(null);(0,m.useEffect)(()=>{d||o().then(p).catch(e=>{v(e instanceof Error?e.message:`Failed to load config`)})},[d]),(0,m.useEffect)(()=>{y!==`about`||T||(r.getHostInfo().then(M).catch(()=>{}),r.getUpdateCheck().then(P).catch(()=>{}))},[y,T]);function F(e){p(e),r.updateConfig(e).catch(()=>{})}return(0,m.useEffect)(()=>{let t=t=>{t.key===`Escape`&&e()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]),(0,h.jsx)(`div`,{role:`dialog`,"aria-label":`Settings`,style:{position:`fixed`,inset:0,zIndex:1e3,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`16px`,pointerEvents:`none`},children:(0,h.jsxs)(`div`,{style:{pointerEvents:`auto`,width:`100%`,maxWidth:`760px`,height:`min(600px, calc(100vh - 96px))`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,border:`1px solid var(--border-default)`,boxShadow:`var(--shadow-lg)`,display:`flex`,flexDirection:`column`,overflow:`hidden`},children:[(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`14px 16px`,borderBottom:`1px solid var(--border-subtle)`,flexShrink:0},children:[(0,h.jsx)(`h2`,{style:{margin:0,fontSize:`15px`,fontWeight:600,color:`var(--text-primary)`,letterSpacing:`-0.005em`},children:`Settings`}),(0,h.jsx)(`button`,{onClick:e,"aria-label":`Close settings`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`20px`,lineHeight:1,padding:`4px`,borderRadius:`var(--radius-sm)`,transition:`color var(--transition-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`},children:`×`})]}),(0,h.jsxs)(`div`,{style:{display:`flex`,flex:1,minHeight:0},children:[(0,h.jsx)(`nav`,{"aria-label":`Settings categories`,style:{flexShrink:0,width:`168px`,borderRight:`1px solid var(--border-subtle)`,padding:`8px`,display:`flex`,flexDirection:`column`,gap:`2px`,background:`var(--bg-subtle)`,overflowY:`auto`},children:j.map(e=>{let t=e.id===y;return(0,h.jsx)(`button`,{type:`button`,"aria-pressed":t,onClick:()=>b(e.id),style:{textAlign:`left`,padding:`7px 10px`,fontSize:`13px`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,fontFamily:`var(--font-ui)`,background:t?`var(--bg-base)`:`transparent`,color:t?`var(--text-primary)`:`var(--text-secondary)`,fontWeight:t?600:400},children:e.label},e.id)})}),(0,h.jsxs)(s,{style:{flex:1,padding:`18px 22px`},children:[_&&(0,h.jsx)(`div`,{style:{padding:`12px`,background:`var(--tool-error-bg)`,border:`1px solid var(--tool-error-border)`,borderRadius:`var(--radius-sm)`,fontSize:`13px`,color:`var(--tool-error-border)`,marginBottom:`16px`},children:_}),!d&&!_&&(0,h.jsx)(`div`,{style:{textAlign:`center`,padding:`24px`,fontSize:`13px`,color:`var(--text-tertiary)`},children:`Loading…`}),d&&(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`22px`},children:[y===`general`&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(x,{config:d,onConfigChange:p}),d.profiles.length===0&&(0,h.jsx)(g,{config:d,onConfigChange:p}),(0,h.jsx)(w,{}),(0,h.jsx)(u,{label:`Open browser on startup`,checked:d.auto_open_browser,onChange:e=>F({...d,auto_open_browser:e})})]}),y===`appearance`&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:l,children:`Theme`}),(0,h.jsx)(`div`,{style:{display:`flex`,gap:`8px`},children:[`light`,`dark`,`system`].map(e=>(0,h.jsx)(`button`,{onClick:()=>{let t={...d,theme:e};p(t),r.updateConfig(t).catch(()=>{});let n=window.__agentDecoderApplyTheme;n&&n(e)},style:f(d.theme===e),children:e},e))})]}),(0,h.jsx)(S,{}),(0,h.jsx)(u,{label:`Show parent folder in project names`,checked:t,onChange:n}),(0,h.jsx)(u,{label:`Show provider tag on chats`,hint:`Adds a small label (e.g. GPT) to non-Claude sessions in the sidebar`,checked:d?.show_provider_tag??!1,onChange:e=>{c(e),d&&F({...d,show_provider_tag:e})}})]}),y===`chat`&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(u,{label:`Allow editing & deleting messages`,hint:`Creates a backup before every write`,checked:d.edit_enabled,onChange:e=>F({...d,edit_enabled:e})}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-primary)`,marginBottom:`6px`},children:`Send shortcut`}),(0,h.jsx)(`div`,{style:{display:`flex`,gap:`8px`,flexWrap:`wrap`},children:[{value:`enter`,label:`Enter`},{value:`modEnter`,label:`Cmd/Ctrl+Enter`}].map(e=>(0,h.jsx)(`button`,{type:`button`,onClick:()=>F({...d,chat_send_shortcut:e.value}),style:{...f((d.chat_send_shortcut??`enter`)===e.value),textTransform:`none`},children:e.label},e.value))}),(0,h.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,marginTop:`6px`,lineHeight:1.4},children:`Applies to Decoded View. Native View keeps terminal keyboard behavior.`})]}),(0,h.jsx)(E,{config:d,onChange:F}),(0,h.jsx)(C,{config:d,onChange:F})]}),y===`terminal`&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-primary)`,marginBottom:`6px`},children:`PTY font`}),(0,h.jsx)(D,{value:d.native_pty_font_family??`monaspace-argon`,onChange:e=>F({...d,native_pty_font_family:e})})]}),(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-primary)`,marginBottom:`6px`},children:`Terminal width`}),(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,h.jsx)(`button`,{type:`button`,"aria-label":`Narrower terminal`,disabled:d.native_pty_cols<=O,onClick:()=>F({...d,native_pty_cols:Math.max(O,d.native_pty_cols-A)}),style:{...f(!1),width:`34px`,padding:`6px 0`,textTransform:`none`,opacity:d.native_pty_cols<=O?.45:1},children:`−`}),(0,h.jsxs)(`div`,{"aria-label":`Terminal width columns`,style:{minWidth:`86px`,textAlign:`center`,fontSize:`13px`,color:`var(--text-secondary)`,fontFamily:`var(--font-mono)`},children:[d.native_pty_cols,` cols`]}),(0,h.jsx)(`button`,{type:`button`,"aria-label":`Wider terminal`,disabled:d.native_pty_cols>=k,onClick:()=>F({...d,native_pty_cols:Math.min(k,d.native_pty_cols+A)}),style:{...f(!1),width:`34px`,padding:`6px 0`,textTransform:`none`,opacity:d.native_pty_cols>=k?.45:1},children:`+`})]}),(0,h.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,marginTop:`6px`,lineHeight:1.4},children:`Column width Claude wraps to in Native View. Applies to new sessions; the view renders at this width and never reflows.`})]})]}),y===`server`&&(0,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{style:l,children:[`Server`,(0,h.jsx)(`span`,{style:{fontSize:`10px`,color:`var(--text-tertiary)`,fontWeight:400,marginLeft:`6px`,textTransform:`none`,letterSpacing:0},children:`requires restart`})]}),(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`},children:[(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`},children:[(0,h.jsx)(`label`,{style:{fontSize:`13px`,color:`var(--text-secondary)`,minWidth:`80px`},children:`Port`}),(0,h.jsx)(`input`,{type:`number`,min:1024,max:65535,value:d.port,onChange:e=>{let t=parseInt(e.target.value,10);t>=1024&&t<=65535&&F({...d,port:t})},style:{width:`90px`,padding:`5px 8px`,fontSize:`13px`,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,color:`var(--text-primary)`,fontFamily:`var(--font-mono)`}})]}),(0,h.jsx)(u,{label:`Expose on local network`,hint:`Binds to 0.0.0.0 — anyone on your network can view your data`,checked:d.host===`0.0.0.0`,onChange:e=>F({...d,host:e?`0.0.0.0`:`127.0.0.1`}),danger:d.host===`0.0.0.0`})]})]}),y===`about`&&(0,h.jsx)(I,{hostInfo:T,updateCheck:N})]})]})]})]})})}var P=`https://github.com/Comradery64/Agent-Decoder`;function F({href:e,children:t}){return(0,h.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer`,style:{color:`var(--text-secondary)`,textDecoration:`none`,transition:`color var(--transition-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-accent)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-secondary)`},children:t})}function I({hostInfo:e,updateCheck:t}){let n=e?M[e.platform]??e.platform:null,r=(0,h.jsx)(`span`,{style:{color:`var(--border-default)`},children:`·`});return(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,textAlign:`center`,padding:`20px 16px 8px`},children:[(0,h.jsx)(`img`,{src:`/app-icon.png`,alt:`Agent Decoder`,width:72,height:72,style:{display:`block`,marginBottom:`14px`}}),(0,h.jsx)(`div`,{style:{fontSize:`26px`,fontWeight:600,letterSpacing:`-0.02em`,color:`var(--text-primary)`,lineHeight:1.1},children:`Agent Decoder`}),(0,h.jsxs)(`div`,{style:{fontSize:`13px`,color:`var(--text-secondary)`,marginTop:`8px`},children:[`Version `,e?.version??`…`]}),n&&(0,h.jsx)(`div`,{style:{fontSize:`12px`,color:`var(--text-tertiary)`,marginTop:`2px`},children:n}),t?.update_available&&(0,h.jsxs)(`a`,{href:`${P}/blob/main/CHANGELOG.md`,target:`_blank`,rel:`noreferrer`,style:{display:`block`,marginTop:`12px`,padding:`6px 12px`,borderRadius:`6px`,background:`var(--accent-orange-subtle)`,color:`var(--accent-orange)`,fontSize:`12px`,fontWeight:500,textDecoration:`none`},children:[`v`,t.latest_version,` available — run`,` `,(0,h.jsx)(`code`,{style:{fontFamily:`var(--font-mono)`},children:`pipx install --force agent-decoder`}),` to update`]}),(0,h.jsx)(`p`,{style:{fontSize:`12.5px`,color:`var(--text-tertiary)`,lineHeight:1.55,maxWidth:`340px`,margin:`18px 0 0`},children:`Browse, search, and analyze your AI coding assistant chat history — entirely local, entirely private.`}),(0,h.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,marginTop:`16px`,fontSize:`12px`},children:[(0,h.jsx)(F,{href:P,children:`GitHub`}),r,(0,h.jsx)(F,{href:`${P}/blob/main/CHANGELOG.md`,children:`Changelog`}),r,(0,h.jsx)(F,{href:`${P}/blob/main/LICENSE`,children:`License`})]}),(0,h.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,marginTop:`20px`,letterSpacing:`0.01em`},children:`FSL-1.1-Apache-2.0`})]})}export{N as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/ShortcutsPopup-B7lbUh3m.js b/src/agent_decoder/static/assets/ShortcutsPopup-Df9bhfs6.js similarity index 97% rename from src/agent_decoder/static/assets/ShortcutsPopup-B7lbUh3m.js rename to src/agent_decoder/static/assets/ShortcutsPopup-Df9bhfs6.js index 8e87379b..f2086101 100644 --- a/src/agent_decoder/static/assets/ShortcutsPopup-B7lbUh3m.js +++ b/src/agent_decoder/static/assets/ShortcutsPopup-Df9bhfs6.js @@ -1 +1 @@ -import{t as e}from"./react-CCIEwYL0.js";import{p as t}from"./index-Egnd1H3-.js";var n=e(),r=[{keys:`⌘K`,action:`Open search`},{keys:`⇧⌘\\`,action:`Cycle view: Decoded → Native → Split`},{keys:`⇧⌘,`,action:`Open settings`},{keys:`⇧⌘O`,action:`Start new task (new Claude session)`},{keys:`⌘O`,action:`Expand / collapse all tool blocks`},{keys:`⌘E`,action:`Toggle full tool results`},{keys:`⇧⌘E`,action:`Toggle file explorer`},{keys:`⇧⌘A`,action:`Toggle artifacts panel`},{keys:`⌘I`,action:`Toggle chat panel`},{keys:`⌘B`,action:`Toggle sidebar`},{keys:`Ctrl+E`,action:`Cursor to end of line (chat)`},{keys:`Ctrl+K`,action:`Delete to end of line (chat)`},{keys:`⌘S`,action:`Stash draft / save file edit`},{keys:`⌘/`,action:`Show / hide this shortcuts menu`},{keys:`Esc`,action:`Close dialog / search / chat`}];function i(){let e=t(e=>e.closeShortcuts);return(0,n.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Keyboard Shortcuts`,onClick:t=>{t.target===t.currentTarget&&e()},style:{position:`fixed`,inset:0,zIndex:1e3,background:`var(--bg-modal-overlay)`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`16px`},children:(0,n.jsxs)(`div`,{style:{width:`100%`,maxWidth:`400px`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,boxShadow:`var(--shadow-lg)`,overflow:`hidden`},onClick:e=>e.stopPropagation(),children:[(0,n.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`20px 24px 16px`,borderBottom:`1px solid var(--border-subtle)`},children:[(0,n.jsx)(`h2`,{style:{margin:0,fontSize:`16px`,fontWeight:600,color:`var(--text-primary)`},children:`Keyboard Shortcuts`}),(0,n.jsx)(`button`,{onClick:e,"aria-label":`Close keyboard shortcuts`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`20px`,lineHeight:1,padding:`4px`},children:`×`})]}),(0,n.jsx)(`div`,{style:{padding:`16px 24px 20px`},children:r.map(e=>(0,n.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`8px 0`,borderBottom:`1px solid var(--border-subtle)`},children:[(0,n.jsx)(`span`,{style:{fontSize:`13px`,color:`var(--text-secondary)`},children:e.action}),(0,n.jsx)(`kbd`,{style:{fontSize:`12px`,fontFamily:`var(--font-ui)`,padding:`2px 8px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,color:`var(--text-primary)`},children:e.keys})]},e.keys))})]})})}export{i as default}; \ No newline at end of file +import{t as e}from"./react-CCIEwYL0.js";import{p as t}from"./index-XPrlVfCr.js";var n=e(),r=[{keys:`⌘K`,action:`Open search`},{keys:`⇧⌘\\`,action:`Cycle view: Decoded → Native → Split`},{keys:`⇧⌘,`,action:`Open settings`},{keys:`⇧⌘O`,action:`Start new task (new Claude session)`},{keys:`⌘O`,action:`Expand / collapse all tool blocks`},{keys:`⌘E`,action:`Toggle full tool results`},{keys:`⇧⌘E`,action:`Toggle file explorer`},{keys:`⇧⌘A`,action:`Toggle artifacts panel`},{keys:`⌘I`,action:`Toggle chat panel`},{keys:`⌘B`,action:`Toggle sidebar`},{keys:`Ctrl+E`,action:`Cursor to end of line (chat)`},{keys:`Ctrl+K`,action:`Delete to end of line (chat)`},{keys:`⌘S`,action:`Stash draft / save file edit`},{keys:`⌘/`,action:`Show / hide this shortcuts menu`},{keys:`Esc`,action:`Close dialog / search / chat`}];function i(){let e=t(e=>e.closeShortcuts);return(0,n.jsx)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-label":`Keyboard Shortcuts`,onClick:t=>{t.target===t.currentTarget&&e()},style:{position:`fixed`,inset:0,zIndex:1e3,background:`var(--bg-modal-overlay)`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`16px`},children:(0,n.jsxs)(`div`,{style:{width:`100%`,maxWidth:`400px`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,boxShadow:`var(--shadow-lg)`,overflow:`hidden`},onClick:e=>e.stopPropagation(),children:[(0,n.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`20px 24px 16px`,borderBottom:`1px solid var(--border-subtle)`},children:[(0,n.jsx)(`h2`,{style:{margin:0,fontSize:`16px`,fontWeight:600,color:`var(--text-primary)`},children:`Keyboard Shortcuts`}),(0,n.jsx)(`button`,{onClick:e,"aria-label":`Close keyboard shortcuts`,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`20px`,lineHeight:1,padding:`4px`},children:`×`})]}),(0,n.jsx)(`div`,{style:{padding:`16px 24px 20px`},children:r.map(e=>(0,n.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`8px 0`,borderBottom:`1px solid var(--border-subtle)`},children:[(0,n.jsx)(`span`,{style:{fontSize:`13px`,color:`var(--text-secondary)`},children:e.action}),(0,n.jsx)(`kbd`,{style:{fontSize:`12px`,fontFamily:`var(--font-ui)`,padding:`2px 8px`,background:`var(--bg-tool-block)`,border:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,color:`var(--text-primary)`},children:e.keys})]},e.keys))})]})})}export{i as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/Sidebar-CJcwJziw.js b/src/agent_decoder/static/assets/Sidebar-CJcwJziw.js new file mode 100644 index 00000000..c80afe1d --- /dev/null +++ b/src/agent_decoder/static/assets/Sidebar-CJcwJziw.js @@ -0,0 +1 @@ +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{a as r,c as i,d as a,f as o,g as s,i as c,m as l,o as u,p as d,v as f,x as p}from"./index-XPrlVfCr.js";import{a as m,t as h}from"./ScrollContainer-CA7-aYqv.js";import{a as g,n as _}from"./ui-BVMZ0uWi.js";import{t as v}from"./SessionItem-BUejVuL5.js";var y=e(t(),1),b=n();async function x(){try{let e,t,n=d.getState().selectedSessionId;if(n)try{let r=await i.getSession(n);e=r.cwd??void 0,t=r.provider??void 0}catch{}let r={};e&&(r.cwd=e),t&&t!==`claude`&&(r.provider=t);let a=await i.newSession(Object.keys(r).length?r:void 0);return p(`/chat/${a.session_id}`),a.session_id}catch{return null}}function S(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`line`,{x1:`12`,y1:`5`,x2:`12`,y2:`19`}),(0,b.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`})]})}function C(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,style:{animation:`ntb-spin 0.7s linear infinite`},children:[(0,b.jsx)(`style`,{children:`@keyframes ntb-spin { to { transform: rotate(360deg); } }`}),(0,b.jsx)(`path`,{d:`M12 3 a 9 9 0 0 1 9 9`})]})}var w={background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,padding:`6px`,borderRadius:`var(--radius-sm)`,display:`flex`,alignItems:`center`,justifyContent:`center`,flexShrink:0,transition:`color var(--transition-fast), background var(--transition-fast)`};function T(){let[e,t]=y.useState(!1),n=y.useCallback(async()=>{if(!e){t(!0);try{await x()}finally{t(!1)}}},[e]);return y.useEffect(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&(c()||e.shiftKey&&e.key.toLowerCase()===`o`&&(e.preventDefault(),n()))};return document.addEventListener(`keydown`,e,{capture:!0}),()=>document.removeEventListener(`keydown`,e,{capture:!0})},[n]),(0,b.jsx)(`button`,{onClick:()=>void n(),disabled:e,"aria-label":`New task (Cmd+Shift+O)`,"aria-busy":e,title:`New task — Cmd+Shift+O`,style:{...w,cursor:e?`wait`:`pointer`,opacity:e?.7:1},onMouseEnter:t=>{e||(t.currentTarget.style.background=`var(--bg-sidebar-hover)`,t.currentTarget.style.color=`var(--text-primary)`)},onMouseLeave:e=>{e.currentTarget.style.background=`none`,e.currentTarget.style.color=`var(--text-tertiary)`},children:e?(0,b.jsx)(C,{}):(0,b.jsx)(S,{})})}function E(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`}),(0,b.jsx)(`path`,{d:`M9 3v18`})]})}function D(){return(0,b.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`})})}function ee(){return(0,b.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z`})})}var te={background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,padding:`6px`,borderRadius:`var(--radius-sm)`,display:`flex`,alignItems:`center`,justifyContent:`center`,flexShrink:0,transition:`color var(--transition-fast), background var(--transition-fast)`};function O({children:e,label:t,onClick:n,active:r,collapsedStyle:i}){return(0,b.jsx)(`button`,{onClick:n,"aria-label":t,title:t,style:{...te,...i?{width:`calc(100% - 12px)`,margin:`1px 6px`,padding:`7px 12px`}:{},color:r?`var(--text-primary)`:`var(--text-tertiary)`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:e})}function ne({collapsed:e}){let t=d(e=>e.toggleSidebar),n=d(e=>e.sidebarMode),r=d(e=>e.setSidebarMode);return(0,b.jsxs)(`div`,{style:{flexShrink:0,height:`var(--header-height)`,display:`flex`,alignItems:`center`,padding:`0 12px`,overflow:`hidden`},children:[(0,b.jsx)(`button`,{onClick:()=>{p(`/`)},style:{flex:1,minWidth:0,overflow:`hidden`,fontFamily:`var(--font-ui)`,fontSize:`18px`,fontWeight:600,color:`var(--text-primary)`,letterSpacing:`-0.02em`,userSelect:`none`,whiteSpace:`nowrap`,opacity:+!e,transition:`opacity var(--transition-medium)`,background:`none`,border:`none`,cursor:`pointer`,padding:0,textAlign:`left`},children:`Agent Decoder`}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,flexShrink:0,overflow:`hidden`,maxWidth:e?0:80,opacity:+!e,transition:`opacity var(--transition-medium), max-width var(--transition-medium)`,pointerEvents:e?`none`:`auto`},children:[(0,b.jsx)(T,{}),(0,b.jsx)(O,{label:n===`chat`?`File explorer`:`Session list`,onClick:()=>{r(n===`chat`?`folder`:`chat`)},active:n===`folder`,children:n===`chat`?(0,b.jsx)(D,{}):(0,b.jsx)(ee,{})})]}),(0,b.jsx)(O,{label:e?`Expand sidebar`:`Collapse sidebar`,onClick:t,active:e,children:(0,b.jsx)(E,{})})]})}var re=4e3;function ie(e,t={}){let{intervalMs:n=re,fetcher:r=i.getRunnerStatuses}=t,[a,o]=(0,y.useState)(()=>new Map),s=e.join(`␟`),c=(0,y.useRef)(e);c.current=e;let l=(0,y.useRef)(r);return l.current=r,(0,y.useEffect)(()=>{o(t=>{let n=new Map;for(let r of e){let e=t.get(r);e&&n.set(r,e)}return t.size===n.size&&[...t.keys()].every(e=>n.has(e))?t:n})},[s]),(0,y.useEffect)(()=>{if(e.length===0)return;let t=!1,r=async()=>{if(typeof document<`u`&&document.visibilityState===`hidden`)return;let e=c.current;if(e.length===0)return;let n;try{n=await l.current([...e])}catch{return}t||o(e=>{let t=new Map(e),r=!1;for(let[e,i]of Object.entries(n)){if(!c.current.includes(e))continue;let n=t.get(e);(!n||n.busy!==i.busy||n.last_error!==i.last_error||n.permission_mode!==i.permission_mode)&&(t.set(e,i),r=!0)}return r?t:e})};r();let i=setInterval(r,n),a=()=>{document.visibilityState===`visible`&&r()};return typeof document<`u`&&document.addEventListener(`visibilitychange`,a),()=>{t=!0,clearInterval(i),typeof document<`u`&&document.removeEventListener(`visibilitychange`,a)}},[s,n]),a}function ae({project:e,displayName:t,isExpanded:n,onToggle:r,archivedIds:a}){let[s,c]=(0,y.useState)([]),[l,u]=(0,y.useState)(!1),[f,p]=(0,y.useState)(null),m=d(e=>e.selectedSessionId),h=d(e=>e.selectSession),g=d(e=>e.selectProject),_=d(e=>e.sessionSortOrder),x=(0,y.useMemo)(()=>{let e=s.filter(e=>!a.has(e.id));return _===`recent`?e.sort((e,t)=>(t.updated_at??``).localeCompare(e.updated_at??``)):_===`oldest`?e.sort((e,t)=>(e.updated_at??``).localeCompare(t.updated_at??``)):e.sort((e,t)=>(e.title??`Untitled`).localeCompare(t.title??`Untitled`)),e},[s,_,a]);(0,y.useEffect)(()=>{if(!n)return;let t=!1;return u(!0),p(null),i.getProjectSessions(e.id).then(e=>{t||c(e)}).catch(e=>{t||p(e instanceof Error?e.message:`Failed to load sessions`)}).finally(()=>{t||u(!1)}),()=>{t=!0}},[n,e.id]),(0,y.useEffect)(()=>o(`sessions-removed`,e=>{let t=new Set(e);c(e=>e.filter(e=>!t.has(e.id)))}),[]);let S=ie((0,y.useMemo)(()=>n?x.map(e=>e.id):[],[n,x])),C=t=>{g(e.id),h(t)};return(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`button`,{onClick:r,"aria-expanded":n,style:{display:`flex`,alignItems:`center`,gap:`4px`,width:`100%`,padding:`6px 12px 4px 16px`,background:`none`,border:`none`,cursor:`pointer`,textAlign:`left`,color:`var(--text-tertiary)`,fontSize:`11px`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`,fontFamily:`var(--font-ui)`,transition:`color var(--transition-fast)`,marginTop:`10px`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-secondary)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`},children:[(0,b.jsx)(`span`,{style:{flex:1,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:t}),(0,b.jsx)(`span`,{style:{fontSize:`9px`,fontWeight:400,textTransform:`none`,letterSpacing:0,transition:`transform var(--transition-fast)`,transform:n?`rotate(0deg)`:`rotate(-90deg)`,display:`inline-block`},children:`▾`})]}),n&&(0,b.jsxs)(`div`,{children:[l&&(0,b.jsx)(`div`,{style:{padding:`6px 16px 6px 32px`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`Loading…`}),f&&(0,b.jsx)(`div`,{style:{padding:`6px 16px 6px 32px`,fontSize:`12px`,color:`var(--tool-error-border)`},children:f}),!l&&!f&&x.map(e=>(0,b.jsx)(v,{session:e,isActive:m===e.id,onClick:()=>C(e.id),runnerStatus:S.get(e.id)},e.id)),!l&&!f&&s.length===0&&(0,b.jsx)(`div`,{style:{padding:`6px 16px 6px 32px`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`No sessions`})]})]})}var k=new Map,A=50;function j(e){let t=k.get(e);return t!==void 0&&(k.delete(e),k.set(e,t)),t}function M(e,t){k.delete(e),k.set(e,t),k.size>A&&k.delete(k.keys().next().value)}function N(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`path`,{d:`M5 19a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h4l2 2h4a2 2 0 0 1 2 2v1`}),(0,b.jsx)(`path`,{d:`M20.5 12H3.5a1 1 0 0 0-1 1.1l1 8a1 1 0 0 0 1 .9h15a1 1 0 0 0 1-.9l1-8a1 1 0 0 0-1-1.1z`})]})}function oe(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,b.jsx)(`polyline`,{points:`14 2 14 8 20 8`})]})}function P(){return(0,b.jsx)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`polyline`,{points:`9 18 15 12 9 6`})})}function F(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function se(){let e=d(e=>e.fileExplorerRoot),t=d(e=>e.setViewingFilePath),[n,r]=(0,y.useState)(e),[a,o]=(0,y.useState)(()=>e?j(e)??[]:[]),[s,c]=(0,y.useState)(!1),[l,u]=(0,y.useState)(null),f=(0,y.useRef)(null),p=(0,y.useRef)(null);(0,y.useEffect)(()=>{let e=f.current?.osInstance();e&&(p.current=e.elements().viewport)}),(0,y.useEffect)(()=>{e&&r(e)},[e]),(0,y.useEffect)(()=>{if(!n)return;let e=!1,t=j(n);return t?(o(t),c(!1)):(o([]),c(!0)),u(null),i.listDir(n).then(t=>{e||(M(n,t.entries),o(t.entries))}).catch(t=>{if(e)return;let i=t instanceof Error?t.message:String(t);if(i.includes(`404`)||i.includes(`Not a directory`)){let e=n.split(`/`).slice(0,-1).join(`/`)||`/`;if(e!==n){r(e);return}}u(i)}).finally(()=>{e||c(!1)}),()=>{e=!0}},[n]),(0,y.useEffect)(()=>{p.current&&(p.current.scrollTop=0)},[n]);let g=e=>r(e),_=n?n.split(`/`).filter(Boolean):[],v=_.map((e,t)=>({label:e,path:`/`+_.slice(0,t+1).join(`/`),isLast:t===_.length-1})),x=v.length>3,S=v[0],C=S&&S.label.length>4?S.label.slice(0,4)+`…`:S?.label;return n?(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,b.jsx)(`div`,{style:{padding:`6px 12px 8px`,flexShrink:0,background:`linear-gradient(to bottom, var(--bg-sidebar) 60%, transparent)`},children:(0,b.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,flexWrap:`nowrap`,columnGap:`2px`,fontSize:`12px`,fontFamily:`var(--font-ui)`,color:`var(--text-tertiary)`,overflow:`hidden`,whiteSpace:`nowrap`},children:x&&S&&C?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(I,{label:C,path:S.path,onClick:g,title:C===S.label?void 0:S.label}),(0,b.jsx)(`span`,{style:{opacity:.4,padding:`0 2px`},children:`/`}),(0,b.jsx)(`span`,{title:v.slice(1,-2).map(e=>e.label).join(` / `),style:{opacity:.5,cursor:`help`},children:`…`}),(0,b.jsx)(`span`,{style:{opacity:.4,padding:`0 2px`},children:`/`}),v.slice(-2).map((e,t)=>(0,b.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`},children:[t>0&&(0,b.jsx)(`span`,{style:{opacity:.4,padding:`0 2px`},children:`/`}),(0,b.jsx)(L,{bc:e,onClick:g})]},e.path))]}):v.map((e,t)=>(0,b.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`},children:[t>0&&(0,b.jsx)(`span`,{style:{opacity:.4,padding:`0 2px`},children:`/`}),(0,b.jsx)(L,{bc:e,onClick:g})]},e.path))})}),(0,b.jsxs)(m,{ref:f,options:h,style:{flex:1,padding:`4px 0`},children:[s&&(0,b.jsx)(`div`,{style:{padding:`20px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`},children:`Loading…`}),l&&(0,b.jsx)(`div`,{style:{padding:`20px`,fontSize:`13px`,color:`var(--tool-error-border)`,textAlign:`center`},children:l}),!s&&!l&&a.map(e=>(0,b.jsx)(ce,{entry:e,currentPath:n,onNavigate:g,onViewFile:t},e.name)),!s&&!l&&a.length===0&&(0,b.jsx)(`div`,{style:{padding:`24px 20px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`},children:`Empty directory.`})]})]}):(0,b.jsx)(`div`,{style:{padding:`32px 20px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`,lineHeight:1.6},children:`Select a session first, then switch to folder view to browse its directory.`})}function I({label:e,path:t,onClick:n,title:r}){return(0,b.jsx)(`button`,{onClick:()=>n(t),title:r??t,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`12px`,fontFamily:`var(--font-ui)`,padding:`1px 3px`,borderRadius:`3px`,transition:`color var(--transition-fast), background var(--transition-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:e})}function L({bc:e,onClick:t}){return e.isLast?(0,b.jsx)(`span`,{style:{color:`var(--text-secondary)`,fontWeight:500},children:e.label}):(0,b.jsx)(I,{label:e.label,path:e.path,onClick:t})}function ce({entry:e,currentPath:t,onNavigate:n,onViewFile:r}){let[i,a]=(0,y.useState)(!1);return(0,b.jsxs)(`div`,{role:`button`,tabIndex:0,onClick:()=>{e.type===`dir`?n(`${t}/${e.name}`):r(`${t}/${e.name}`)},onKeyDown:i=>{(i.key===`Enter`||i.key===` `)&&(e.type===`dir`?n(`${t}/${e.name}`):r(`${t}/${e.name}`))},onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`7px 12px`,cursor:`pointer`,background:i?`var(--bg-sidebar-hover)`:`transparent`,borderRadius:`var(--radius-sm)`,margin:`1px 6px`,transition:`background var(--transition-fast)`,userSelect:`none`,outline:`none`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`,color:`var(--text-tertiary)`},children:e.type===`dir`?(0,b.jsx)(N,{}):(0,b.jsx)(oe,{})}),(0,b.jsx)(`span`,{style:{flex:1,fontSize:`15px`,color:`var(--text-primary)`,fontFamily:`var(--font-ui)`,fontWeight:e.type===`dir`?500:400,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:e.name}),e.type===`dir`&&(0,b.jsx)(`span`,{style:{flexShrink:0,color:`var(--text-tertiary)`,display:`flex`,marginLeft:`4px`},children:(0,b.jsx)(P,{})}),e.type===`file`&&e.size!==null&&(0,b.jsx)(`span`,{style:{flexShrink:0,fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`,marginLeft:`6px`},children:F(e.size)})]})}function le(){if(typeof window>`u`)return _.DEFAULT_WIDTH;let e=s(l.SIDEBAR_WIDTH),t=e?Number(e):NaN;return Number.isFinite(t)?Math.max(_.MIN_WIDTH,t):_.DEFAULT_WIDTH}function ue(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]})}function de(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,b.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`3`}),(0,b.jsx)(`path`,{d:`m9 7 7 5-7 5z`})]})}function fe(){return(0,b.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z`})})}function pe(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`}),(0,b.jsx)(`path`,{d:`M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z`})]})}function R(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`}),(0,b.jsx)(`line`,{x1:`12`,y1:`17`,x2:`12.01`,y2:`17`})]})}function z(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`}),(0,b.jsx)(`line`,{x1:`6`,y1:`8`,x2:`6.01`,y2:`8`}),(0,b.jsx)(`line`,{x1:`10`,y1:`8`,x2:`10.01`,y2:`8`}),(0,b.jsx)(`line`,{x1:`14`,y1:`8`,x2:`14.01`,y2:`8`}),(0,b.jsx)(`line`,{x1:`18`,y1:`8`,x2:`18.01`,y2:`8`}),(0,b.jsx)(`line`,{x1:`8`,y1:`12`,x2:`8.01`,y2:`12`}),(0,b.jsx)(`line`,{x1:`12`,y1:`12`,x2:`12.01`,y2:`12`}),(0,b.jsx)(`line`,{x1:`16`,y1:`12`,x2:`16.01`,y2:`12`}),(0,b.jsx)(`line`,{x1:`7`,y1:`16`,x2:`17`,y2:`16`})]})}function me({label:e,onSelect:t,selectionMode:n}){let[r,i]=(0,y.useState)(!1);return(0,b.jsxs)(`div`,{onMouseEnter:()=>i(!0),onMouseLeave:()=>i(!1),style:{display:`flex`,alignItems:`center`,width:`100%`,padding:`6px 18px 4px`,fontSize:`11px`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`,color:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`,gap:`4px`,minHeight:`22px`},children:[(0,b.jsx)(`span`,{style:{flex:1,textAlign:`left`},children:e}),!n&&(0,b.jsxs)(`button`,{type:`button`,onClick:t,"aria-label":`Select sessions`,style:{display:`flex`,alignItems:`center`,gap:`4px`,background:`none`,border:`none`,cursor:`pointer`,padding:`2px 4px`,margin:`-2px -4px -2px 0`,borderRadius:`var(--radius-sm)`,color:r?`var(--accent-orange)`:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`,fontSize:`10px`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`,opacity:+!!r,pointerEvents:r?`auto`:`none`,transition:`opacity var(--transition-fast), color var(--transition-fast)`},children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`rect`,{x:`3`,y:`5`,width:`4`,height:`4`,rx:`1`}),(0,b.jsx)(`line`,{x1:`10`,y1:`7`,x2:`21`,y2:`7`}),(0,b.jsx)(`rect`,{x:`3`,y:`13`,width:`4`,height:`4`,rx:`1`}),(0,b.jsx)(`line`,{x1:`10`,y1:`15`,x2:`21`,y2:`15`})]}),`Select`]})]})}function he({selectedCount:e,onSelectAll:t,onArchive:n,onDelete:r,onCancel:i}){let a=e===0;return(0,b.jsxs)(`div`,{style:{padding:`8px 10px`,background:`var(--bg-sidebar-active)`,borderBottom:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,margin:`0 6px 4px`,display:`flex`,flexDirection:`column`,gap:`6px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,fontSize:`12px`,color:`var(--text-secondary)`,fontFamily:`var(--font-ui)`},children:[(0,b.jsxs)(`span`,{style:{fontWeight:500},children:[e,` selected`]}),(0,b.jsx)(`button`,{onClick:t,style:{background:`none`,border:`none`,cursor:`pointer`,fontSize:`12px`,color:`var(--accent-orange)`,fontFamily:`var(--font-ui)`,padding:`0`},children:`Select all`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`6px`},children:[(0,b.jsx)(B,{label:`Archive`,disabled:a,onClick:n}),(0,b.jsx)(B,{label:`Delete`,disabled:a,danger:!0,onClick:r}),(0,b.jsx)(B,{label:`Cancel`,disabled:!1,onClick:i})]})]})}function B({label:e,disabled:t,danger:n,onClick:r}){let[i,a]=(0,y.useState)(!1);return(0,b.jsx)(`button`,{onClick:r,disabled:t,onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),style:{flex:1,padding:`4px 6px`,fontSize:`12px`,fontFamily:`var(--font-ui)`,background:t?`none`:n?i?`#b85c5c`:`#c47a7a`:i?`var(--bg-sidebar-hover)`:`var(--bg-tool-block)`,color:t?`var(--text-tertiary)`:n?`#fff`:`var(--text-primary)`,border:t?`1px solid var(--border-subtle)`:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,cursor:t?`default`:`pointer`,transition:`background var(--transition-fast), color var(--transition-fast)`,opacity:t?.5:1},children:e})}function V({icon:e,label:t,shortcut:n,active:r,onClick:i,collapsed:a,fade:o}){let[s,c]=(0,y.useState)(!1);return(0,b.jsxs)(`button`,{onClick:i,onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),title:a?t:void 0,style:{display:`flex`,alignItems:`center`,gap:`10px`,width:`calc(100% - 12px)`,padding:`7px 12px`,background:r?`var(--bg-sidebar-active)`:s?`var(--bg-sidebar-hover)`:`none`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,color:`var(--text-primary)`,fontSize:`15px`,fontFamily:`var(--font-ui)`,fontWeight:r?500:400,textAlign:`left`,transition:`background var(--transition-fast), color var(--transition-fast), opacity var(--transition-medium)`,margin:`1px 6px`,opacity:o?0:void 0,overflow:`hidden`,whiteSpace:`nowrap`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`},children:e}),(0,b.jsx)(`span`,{style:{flex:1,overflow:`hidden`,whiteSpace:`nowrap`,opacity:+!a,transition:`opacity var(--transition-medium)`},children:t}),n&&(0,b.jsx)(`kbd`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`,opacity:+!a,transition:`opacity var(--transition-medium)`},children:n})]})}function ge({collapsed:e}){let t=d(e=>e.openSettings),n=d(e=>e.openHelp),r=d(e=>e.openShortcuts),a=d(e=>e.profiles),o=d(e=>e.activeProfileId),s=d(e=>e.setActiveProfileId),[c,l]=(0,y.useState)(!1),u=(0,y.useRef)(null);(0,y.useEffect)(()=>{if(!c)return;let e=e=>{u.current&&!u.current.contains(e.target)&&l(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[c]),(0,y.useEffect)(()=>{if(!c)return;let e=e=>{e.key===`Escape`&&l(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[c]),(0,y.useEffect)(()=>{e&&l(!1)},[e]);let f=async e=>{try{await i.setActiveProfile(e),s(e),l(!1)}catch{}},p=a.find(e=>e.id===o),m=p?p.name:a.length>0?`All Profiles`:`Agent Decoder`,h=p?p.color:`var(--accent-orange)`,g=p?(p.name?.[0]??`?`).toUpperCase():`C`,_=e=>({display:`flex`,alignItems:`center`,gap:`10px`,width:`100%`,padding:`7px 12px`,background:e?`var(--bg-sidebar-hover)`:`none`,border:`none`,cursor:`pointer`,fontFamily:`var(--font-ui)`,fontSize:`15px`,textAlign:`left`,color:`var(--text-primary)`,transition:`background var(--transition-fast)`});return(0,b.jsxs)(`div`,{style:{borderTop:`1px solid var(--border-subtle)`,padding:`8px 4px`,flexShrink:0,position:`relative`},ref:u,children:[(0,b.jsxs)(`button`,{onClick:e?()=>{t()}:()=>l(!c),"aria-label":`Open menu`,title:e?`Settings`:void 0,style:{display:`flex`,alignItems:`center`,gap:`10px`,width:`100%`,padding:`8px 8px`,background:`none`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,outline:`none`,fontFamily:`var(--font-ui)`,overflow:`hidden`},children:[(0,b.jsx)(`span`,{style:{width:`28px`,height:`28px`,borderRadius:`50%`,background:h,display:`flex`,alignItems:`center`,justifyContent:`center`,flexShrink:0,color:`var(--text-on-accent)`,fontSize:`12px`,fontWeight:700},children:g}),(0,b.jsxs)(`div`,{style:{flex:1,textAlign:`left`,overflow:`hidden`,opacity:+!e,transition:`opacity var(--transition-medium)`,whiteSpace:`nowrap`},children:[(0,b.jsx)(`div`,{style:{fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`},children:m}),(0,b.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:`Menu`})]})]}),c&&(0,b.jsxs)(`div`,{style:{position:`absolute`,bottom:`100%`,left:`4px`,right:`4px`,background:`var(--bg-modal)`,borderRadius:`12px`,boxShadow:`0 -2px 12px rgba(0,0,0,0.08)`,marginBottom:`-1px`,overflow:`hidden`},children:[(0,b.jsxs)(`button`,{onClick:()=>{t(),l(!1)},style:_(),onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`,color:`var(--text-tertiary)`},children:(0,b.jsx)(pe,{})}),(0,b.jsx)(`div`,{style:{flex:1},children:(0,b.jsx)(`div`,{style:{fontWeight:500},children:`Settings`})})]}),(0,b.jsxs)(`button`,{onClick:()=>{n(),l(!1)},style:_(),onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`,color:`var(--text-tertiary)`},children:(0,b.jsx)(R,{})}),(0,b.jsx)(`div`,{style:{flex:1},children:(0,b.jsx)(`div`,{style:{fontWeight:500},children:`Get Help`})})]}),(0,b.jsxs)(`button`,{onClick:()=>{r(),l(!1)},style:_(),onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`,color:`var(--text-tertiary)`},children:(0,b.jsx)(z,{})}),(0,b.jsx)(`div`,{style:{flex:1},children:(0,b.jsx)(`div`,{style:{fontWeight:500},children:`Keyboard Shortcuts`})})]}),a.length>0&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`div`,{style:{borderTop:`1px solid var(--border-subtle)`,margin:`4px 0`}}),(0,b.jsxs)(`button`,{onClick:()=>{f(null)},style:_(!o),children:[(0,b.jsx)(`span`,{style:{width:22,height:22,borderRadius:`50%`,background:`var(--accent-orange)`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`var(--text-on-accent)`,fontSize:`10px`,fontWeight:700,flexShrink:0},children:`C`}),(0,b.jsx)(`span`,{style:{fontWeight:o?400:500},children:`All Profiles`})]}),a.map(e=>(0,b.jsxs)(`button`,{onClick:()=>{f(e.id)},style:_(o===e.id),children:[(0,b.jsx)(`span`,{style:{width:22,height:22,borderRadius:`50%`,background:e.color,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`var(--text-on-accent)`,fontSize:`10px`,fontWeight:700,flexShrink:0},children:(e.name?.[0]??`?`).toUpperCase()}),(0,b.jsx)(`span`,{style:{fontWeight:o===e.id?500:400},children:e.name})]},e.id))]})]})]})}function H(){let[e,t]=(0,y.useState)([]),[n,s]=(0,y.useState)(!0),[c,x]=(0,y.useState)(null),[S,C]=(0,y.useState)(new Set),[w,T]=(0,y.useState)([]),[E,D]=(0,y.useState)(!1),ee=(0,y.useRef)(!1),te=(0,y.useRef)(null),[O,re]=(0,y.useState)(!1),k=r(),A=u(),j=d(e=>e.openSearch),M=d(e=>e.sessionSortOrder),N=d(e=>e.selectedSessionId),oe=d(e=>e.selectProject),P=d(e=>e.sidebarCollapsed),F=d(e=>e.sidebarMode),I=d(e=>e.setFileExplorerRoot),L=d(e=>e.activeProfileId),ce=d(e=>e.setProfiles),pe=d(e=>e.setActiveProfileId),R=d(e=>e.selectionMode),z=d(e=>e.selectedSessionIds),B=d(e=>e.selectionAnchorId),H=d(e=>e.setSelectionAnchorId),_e=d(e=>e.toggleSessionSelected),ve=d(e=>e.enterSelectionMode),U=d(e=>e.exitSelectionMode),W=d(e=>e.clearSelection),G=d(e=>e.setSelectedSessionIds),[ye,K]=(0,y.useState)(!1),be=d(e=>e.showParentFolder),xe=M!==`alpha`,[q,J]=(0,y.useState)(le),Se=(0,y.useRef)(q);Se.current=q;let[Y,Ce]=(0,y.useState)(!1),X=(0,y.useRef)(!1);Y&&q<_.FADE_TEXT_MIN_PX&&(X.current=!0),Y&&q>_.FADE_TEXT_MAX_PX&&(X.current=!1),Y||(X.current=!1);let we=X.current,Z=P||we;(0,y.useEffect)(()=>{let e=()=>{let e=window.innerWidth;if(e<_.COLLAPSED_WIDTH+_.MIN_MAIN_PANE){d.getState().setSidebarCollapsed(!0);return}let t=Math.max(_.MIN_WIDTH,e-_.MIN_MAIN_PANE);J(e=>Math.max(_.MIN_WIDTH,Math.min(e,t)))};return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),(0,y.useEffect)(()=>{Y||q<_.SNAP_THRESHOLD||f(l.SIDEBAR_WIDTH,String(q))},[q,Y]);let Te=(0,y.useCallback)(e=>{e.preventDefault();let t=e.clientX,n=P,r=n?_.COLLAPSED_WIDTH:Se.current,i=le();Ce(!0),n&&J(_.COLLAPSED_WIDTH),document.body.style.userSelect=`none`;let a=e=>{let i=e.clientX-t,a=Math.max(_.MIN_WIDTH,window.innerWidth-_.MIN_MAIN_PANE),o=n?_.COLLAPSED_WIDTH:r,s=Math.max(_.COLLAPSED_WIDTH,Math.min(o+i,a));J(s),n&&s>=_.SNAP_THRESHOLD&&d.getState().setSidebarCollapsed(!1)},o=()=>{let e=Se.current;e<_.SNAP_THRESHOLD?(d.getState().setSidebarCollapsed(!0),Ce(!1),J(i)):(d.getState().setSidebarCollapsed(!1),J(e),Ce(!1)),document.body.style.userSelect=``,document.removeEventListener(`mousemove`,a),document.removeEventListener(`mouseup`,o)};document.addEventListener(`mousemove`,a),document.addEventListener(`mouseup`,o)},[P]),Ee=(0,y.useCallback)(()=>{for(let e of z)k.add(e);W(),U()},[z,k,W,U]),De=(0,y.useCallback)(()=>{K(!0)},[]),Oe=(0,y.useCallback)(()=>{let e=[...z];K(!1),W(),U(),a(`sessions-removed`,e),i.deleteSessions(e).then(e=>{e.failed.length>0&&(console.error(`[bulk-delete] Some sessions failed to delete:`,e.failed),a(`toast`,{message:`Couldn't delete ${e.failed.length} session${e.failed.length===1?``:`s`}.`,kind:`error`})),a(`refresh`,void 0)}).catch(e=>{console.error(`[bulk-delete] deleteSessions error:`,e),a(`toast`,{message:`Couldn't delete sessions — see console for details.`,kind:`error`}),a(`refresh`,void 0)})},[z,W,U]),ke=e=>{oe(e.project_id),I(e.cwd),p(`/chat/${e.id}`)};(0,y.useEffect)(()=>{if(F!==`folder`||d.getState().fileExplorerRoot)return;let e=N;if(!e)return;let t=w.find(t=>t.id===e);t?.cwd&&I(t.cwd)},[F]);let Ae=e=>{if(be)return e.display_name;let t=e.display_name.lastIndexOf(`/`);return t>=0?e.display_name.slice(t+1):e.display_name},je=(0,y.useMemo)(()=>M===`alpha`?[...e].sort((e,t)=>Ae(e).localeCompare(Ae(t))):e,[e,M,be]);(0,y.useEffect)(()=>{i.getProfiles().then(e=>{ce(e.profiles),pe(e.active_profile_id)}).catch(()=>{})},[]),(0,y.useEffect)(()=>{if(L===void 0)return;let e=!1;return s(!0),i.getProjects().then(n=>{e||(t(n),n.length>0&&C(new Set([n[0].id])))}).catch(()=>{}).finally(()=>{e||s(!1)}),i.getAllSessions().then(t=>{e||T(t)}).catch(()=>{}),()=>{e=!0}},[L]),(0,y.useEffect)(()=>{let e=!1;return i.getProjects().then(n=>{e||(t(n),n.length>0&&C(new Set([n[0].id])))}).catch(t=>{e||x(t instanceof Error?t.message:`Failed to load projects`)}).finally(()=>{e||s(!1)}),()=>{e=!0}},[]),(0,y.useEffect)(()=>{if(e.length===0)return;let t=!1;return ee.current||D(!0),i.getAllSessions().then(e=>{t||(ee.current=!0,T(e))}).catch(()=>{}).finally(()=>{t||D(!1)}),()=>{t=!0}},[e]),(0,y.useEffect)(()=>o(`refresh`,()=>{i.getProjects().then(t).catch(()=>{}),i.getAllSessions().then(T).catch(()=>{})}),[]),(0,y.useEffect)(()=>o(`sessions-removed`,e=>{let t=new Set(e);T(e=>e.filter(e=>!t.has(e.id)))}),[]);let Q=(0,y.useMemo)(()=>w.filter(e=>A.has(e.id)&&!k.has(e.id)),[w,A,k]),$=(0,y.useMemo)(()=>{let e=w.filter(e=>O?k.has(e.id):!k.has(e.id));return M===`recent`?e.sort((e,t)=>(t.updated_at??t.started_at??``).localeCompare(e.updated_at??e.started_at??``)):M===`oldest`&&e.sort((e,t)=>(e.updated_at??e.started_at??``).localeCompare(t.updated_at??t.started_at??``)),e},[w,M,O,k]),Me=ie((0,y.useMemo)(()=>{let e=new Set;for(let t of $)e.add(t.id);for(let t of Q)e.add(t.id);return[...e]},[$,Q])),Ne=(0,y.useCallback)(()=>{G($.map(e=>e.id))},[$,G]),Pe=(0,y.useCallback)((e,t)=>{if(t&&B){let t=$.map(e=>e.id),n=t.indexOf(B),r=t.indexOf(e);if(n!==-1&&r!==-1){let[e,i]=n{C(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};return(0,b.jsxs)(`aside`,{"aria-label":`Navigation`,style:{width:P&&!Y?`${_.COLLAPSED_WIDTH}px`:`${Math.max(_.COLLAPSED_WIDTH,q)}px`,height:`100vh`,display:`flex`,flexDirection:`column`,background:`var(--bg-sidebar)`,borderRight:`1px solid var(--border-subtle)`,flexShrink:0,overflow:`hidden`,position:`relative`,transition:Y?`none`:`width var(--transition-medium)`},children:[(0,b.jsx)(`div`,{onMouseDown:Te,title:`Drag to resize`,"aria-label":`Resize sidebar`,role:`separator`,"aria-orientation":`vertical`,style:{position:`absolute`,top:0,bottom:0,right:0,width:`4px`,cursor:`col-resize`,zIndex:10,background:Y?`var(--border-default)`:`transparent`,transition:`background 0.12s`},onMouseEnter:e=>{Y||(e.currentTarget.style.background=`var(--border-default)`)},onMouseLeave:e=>{Y||(e.currentTarget.style.background=`transparent`)}}),(0,b.jsx)(ne,{collapsed:Z}),(0,b.jsxs)(`div`,{style:{padding:`6px 0 4px`,flexShrink:0},children:[(0,b.jsx)(V,{collapsed:Z,icon:(0,b.jsx)(de,{}),label:`Runs`,onClick:()=>p(`/runs`)}),(0,b.jsx)(V,{collapsed:Z,icon:(0,b.jsx)(ue,{}),label:`Search`,shortcut:`⌘K`,onClick:j}),!P&&Q.length>0&&(0,b.jsxs)(`div`,{style:{margin:`4px 0`},children:[(0,b.jsx)(`div`,{style:{padding:`4px 18px 2px`,fontSize:`11px`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`,color:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`},children:`Starred`}),Q.map(e=>(0,b.jsx)(v,{session:e,isActive:N===e.id,onClick:()=>ke(e),runnerStatus:Me.get(e.id)},e.id))]}),(0,b.jsx)(V,{collapsed:Z,icon:(0,b.jsx)(fe,{}),label:`Archive`,active:O,onClick:()=>re(e=>!e),fade:Z})]}),!P&&(0,b.jsx)(`div`,{style:{marginTop:`2px`}}),(0,b.jsx)(m,{ref:te,options:h,role:F===`chat`?`list`:void 0,"aria-label":F===`chat`?`Sessions`:void 0,style:{flex:1,padding:F===`folder`?`0`:`8px 0`,display:P?`none`:void 0,opacity:+!Z,transition:`opacity var(--transition-medium)`},children:F===`folder`?(0,b.jsx)(se,{}):(0,b.jsxs)(b.Fragment,{children:[R&&(0,b.jsx)(he,{selectedCount:z.size,onSelectAll:Ne,onArchive:Ee,onDelete:De,onCancel:U}),n&&(0,b.jsx)(`div`,{style:{padding:`16px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`},children:`Loading…`}),c&&(0,b.jsx)(`div`,{style:{padding:`16px`,fontSize:`13px`,color:`var(--tool-error-border)`},children:c}),!n&&!c&&(xe||O)&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(me,{label:O?`Archived`:`Recents`,onSelect:ve,selectionMode:R}),E&&(0,b.jsx)(`div`,{style:{padding:`8px 16px`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`Loading…`}),!E&&$.map(e=>(0,b.jsx)(v,{session:e,isActive:N===e.id,onClick:()=>ke(e),runnerStatus:Me.get(e.id),onToggleSelect:Pe},e.id)),!E&&$.length===0&&(0,b.jsx)(`div`,{style:{padding:`24px 16px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`,lineHeight:1.6},children:O?`No archived sessions.`:`No sessions found.`})]}),!n&&!c&&!xe&&!O&&(0,b.jsxs)(b.Fragment,{children:[je.map(e=>(0,b.jsx)(ae,{project:e,displayName:Ae(e),isExpanded:S.has(e.id),onToggle:()=>Fe(e.id),archivedIds:k.ids},e.id)),je.length===0&&(0,b.jsxs)(`div`,{style:{padding:`24px 16px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`,lineHeight:1.6},children:[`No projects found.`,(0,b.jsx)(`br`,{}),`Add a path in Settings.`]})]})]})}),P&&(0,b.jsx)(`div`,{style:{flex:1}}),(0,b.jsx)(ge,{collapsed:Z}),ye&&(0,b.jsx)(g,{title:`Delete ${z.size} session${z.size===1?``:`s`}?`,body:`This permanently deletes the session transcript files from disk and cannot be undone.`,confirmLabel:`Delete`,onConfirm:Oe,onCancel:()=>K(!1)})]})}export{H as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/Sidebar-mcMKZmEW.js b/src/agent_decoder/static/assets/Sidebar-mcMKZmEW.js deleted file mode 100644 index 19313722..00000000 --- a/src/agent_decoder/static/assets/Sidebar-mcMKZmEW.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";import{a as r,c as i,d as a,f as o,g as s,i as c,m as l,o as u,p as d,v as f,x as p}from"./index-Egnd1H3-.js";import{a as m,t as h}from"./ScrollContainer-CA7-aYqv.js";import{a as g,n as _}from"./ui-BVMZ0uWi.js";import{t as v}from"./SessionItem-CYxoPLdi.js";var y=e(t(),1),b=n();async function x(){try{let e,t,n=d.getState().selectedSessionId;if(n)try{let r=await i.getSession(n);e=r.cwd??void 0,t=r.provider??void 0}catch{}let r={};e&&(r.cwd=e),t&&t!==`claude`&&(r.provider=t);let a=await i.newSession(Object.keys(r).length?r:void 0);return p(`/chat/${a.session_id}`),a.session_id}catch{return null}}function S(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`line`,{x1:`12`,y1:`5`,x2:`12`,y2:`19`}),(0,b.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`})]})}function C(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,style:{animation:`ntb-spin 0.7s linear infinite`},children:[(0,b.jsx)(`style`,{children:`@keyframes ntb-spin { to { transform: rotate(360deg); } }`}),(0,b.jsx)(`path`,{d:`M12 3 a 9 9 0 0 1 9 9`})]})}var w={background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,padding:`6px`,borderRadius:`var(--radius-sm)`,display:`flex`,alignItems:`center`,justifyContent:`center`,flexShrink:0,transition:`color var(--transition-fast), background var(--transition-fast)`};function T(){let[e,t]=y.useState(!1),n=y.useCallback(async()=>{if(!e){t(!0);try{await x()}finally{t(!1)}}},[e]);return y.useEffect(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&(c()||e.shiftKey&&e.key.toLowerCase()===`o`&&(e.preventDefault(),n()))};return document.addEventListener(`keydown`,e,{capture:!0}),()=>document.removeEventListener(`keydown`,e,{capture:!0})},[n]),(0,b.jsx)(`button`,{onClick:()=>void n(),disabled:e,"aria-label":`New task (Cmd+Shift+O)`,"aria-busy":e,title:`New task — Cmd+Shift+O`,style:{...w,cursor:e?`wait`:`pointer`,opacity:e?.7:1},onMouseEnter:t=>{e||(t.currentTarget.style.background=`var(--bg-sidebar-hover)`,t.currentTarget.style.color=`var(--text-primary)`)},onMouseLeave:e=>{e.currentTarget.style.background=`none`,e.currentTarget.style.color=`var(--text-tertiary)`},children:e?(0,b.jsx)(C,{}):(0,b.jsx)(S,{})})}function E(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`}),(0,b.jsx)(`path`,{d:`M9 3v18`})]})}function ee(){return(0,b.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z`})})}function D(){return(0,b.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z`})})}var te={background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,padding:`6px`,borderRadius:`var(--radius-sm)`,display:`flex`,alignItems:`center`,justifyContent:`center`,flexShrink:0,transition:`color var(--transition-fast), background var(--transition-fast)`};function O({children:e,label:t,onClick:n,active:r,collapsedStyle:i}){return(0,b.jsx)(`button`,{onClick:n,"aria-label":t,title:t,style:{...te,...i?{width:`calc(100% - 12px)`,margin:`1px 6px`,padding:`7px 12px`}:{},color:r?`var(--text-primary)`:`var(--text-tertiary)`},onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:e})}function ne({collapsed:e}){let t=d(e=>e.toggleSidebar),n=d(e=>e.sidebarMode),r=d(e=>e.setSidebarMode);return(0,b.jsxs)(`div`,{style:{flexShrink:0,height:`var(--header-height)`,display:`flex`,alignItems:`center`,padding:`0 12px`,overflow:`hidden`},children:[(0,b.jsx)(`button`,{onClick:()=>{p(`/`)},style:{flex:1,minWidth:0,overflow:`hidden`,fontFamily:`var(--font-ui)`,fontSize:`18px`,fontWeight:600,color:`var(--text-primary)`,letterSpacing:`-0.02em`,userSelect:`none`,whiteSpace:`nowrap`,opacity:+!e,transition:`opacity var(--transition-medium)`,background:`none`,border:`none`,cursor:`pointer`,padding:0,textAlign:`left`},children:`Agent Decoder`}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,flexShrink:0,overflow:`hidden`,maxWidth:e?0:80,opacity:+!e,transition:`opacity var(--transition-medium), max-width var(--transition-medium)`,pointerEvents:e?`none`:`auto`},children:[(0,b.jsx)(T,{}),(0,b.jsx)(O,{label:n===`chat`?`File explorer`:`Session list`,onClick:()=>{r(n===`chat`?`folder`:`chat`)},active:n===`folder`,children:n===`chat`?(0,b.jsx)(ee,{}):(0,b.jsx)(D,{})})]}),(0,b.jsx)(O,{label:e?`Expand sidebar`:`Collapse sidebar`,onClick:t,active:e,children:(0,b.jsx)(E,{})})]})}var re=4e3;function ie(e,t={}){let{intervalMs:n=re,fetcher:r=i.getRunnerStatuses}=t,[a,o]=(0,y.useState)(()=>new Map),s=e.join(`␟`),c=(0,y.useRef)(e);c.current=e;let l=(0,y.useRef)(r);return l.current=r,(0,y.useEffect)(()=>{o(t=>{let n=new Map;for(let r of e){let e=t.get(r);e&&n.set(r,e)}return t.size===n.size&&[...t.keys()].every(e=>n.has(e))?t:n})},[s]),(0,y.useEffect)(()=>{if(e.length===0)return;let t=!1,r=async()=>{if(typeof document<`u`&&document.visibilityState===`hidden`)return;let e=c.current;if(e.length===0)return;let n;try{n=await l.current([...e])}catch{return}t||o(e=>{let t=new Map(e),r=!1;for(let[e,i]of Object.entries(n)){if(!c.current.includes(e))continue;let n=t.get(e);(!n||n.busy!==i.busy||n.last_error!==i.last_error||n.permission_mode!==i.permission_mode)&&(t.set(e,i),r=!0)}return r?t:e})};r();let i=setInterval(r,n),a=()=>{document.visibilityState===`visible`&&r()};return typeof document<`u`&&document.addEventListener(`visibilitychange`,a),()=>{t=!0,clearInterval(i),typeof document<`u`&&document.removeEventListener(`visibilitychange`,a)}},[s,n]),a}function ae({project:e,displayName:t,isExpanded:n,onToggle:r,archivedIds:a}){let[s,c]=(0,y.useState)([]),[l,u]=(0,y.useState)(!1),[f,p]=(0,y.useState)(null),m=d(e=>e.selectedSessionId),h=d(e=>e.selectSession),g=d(e=>e.selectProject),_=d(e=>e.sessionSortOrder),x=(0,y.useMemo)(()=>{let e=s.filter(e=>!a.has(e.id));return _===`recent`?e.sort((e,t)=>(t.updated_at??``).localeCompare(e.updated_at??``)):_===`oldest`?e.sort((e,t)=>(e.updated_at??``).localeCompare(t.updated_at??``)):e.sort((e,t)=>(e.title??`Untitled`).localeCompare(t.title??`Untitled`)),e},[s,_,a]);(0,y.useEffect)(()=>{if(!n)return;let t=!1;return u(!0),p(null),i.getProjectSessions(e.id).then(e=>{t||c(e)}).catch(e=>{t||p(e instanceof Error?e.message:`Failed to load sessions`)}).finally(()=>{t||u(!1)}),()=>{t=!0}},[n,e.id]),(0,y.useEffect)(()=>o(`sessions-removed`,e=>{let t=new Set(e);c(e=>e.filter(e=>!t.has(e.id)))}),[]);let S=ie((0,y.useMemo)(()=>n?x.map(e=>e.id):[],[n,x])),C=t=>{g(e.id),h(t)};return(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`button`,{onClick:r,"aria-expanded":n,style:{display:`flex`,alignItems:`center`,gap:`4px`,width:`100%`,padding:`6px 12px 4px 16px`,background:`none`,border:`none`,cursor:`pointer`,textAlign:`left`,color:`var(--text-tertiary)`,fontSize:`11px`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`,fontFamily:`var(--font-ui)`,transition:`color var(--transition-fast)`,marginTop:`10px`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-secondary)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`},children:[(0,b.jsx)(`span`,{style:{flex:1,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:t}),(0,b.jsx)(`span`,{style:{fontSize:`9px`,fontWeight:400,textTransform:`none`,letterSpacing:0,transition:`transform var(--transition-fast)`,transform:n?`rotate(0deg)`:`rotate(-90deg)`,display:`inline-block`},children:`▾`})]}),n&&(0,b.jsxs)(`div`,{children:[l&&(0,b.jsx)(`div`,{style:{padding:`6px 16px 6px 32px`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`Loading…`}),f&&(0,b.jsx)(`div`,{style:{padding:`6px 16px 6px 32px`,fontSize:`12px`,color:`var(--tool-error-border)`},children:f}),!l&&!f&&x.map(e=>(0,b.jsx)(v,{session:e,isActive:m===e.id,onClick:()=>C(e.id),runnerStatus:S.get(e.id)},e.id)),!l&&!f&&s.length===0&&(0,b.jsx)(`div`,{style:{padding:`6px 16px 6px 32px`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`No sessions`})]})]})}var k=new Map,A=50;function j(e){let t=k.get(e);return t!==void 0&&(k.delete(e),k.set(e,t)),t}function M(e,t){k.delete(e),k.set(e,t),k.size>A&&k.delete(k.keys().next().value)}function N(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`path`,{d:`M5 19a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h4l2 2h4a2 2 0 0 1 2 2v1`}),(0,b.jsx)(`path`,{d:`M20.5 12H3.5a1 1 0 0 0-1 1.1l1 8a1 1 0 0 0 1 .9h15a1 1 0 0 0 1-.9l1-8a1 1 0 0 0-1-1.1z`})]})}function oe(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,b.jsx)(`polyline`,{points:`14 2 14 8 20 8`})]})}function P(){return(0,b.jsx)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`polyline`,{points:`9 18 15 12 9 6`})})}function F(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function se(){let e=d(e=>e.fileExplorerRoot),t=d(e=>e.setViewingFilePath),[n,r]=(0,y.useState)(e),[a,o]=(0,y.useState)(()=>e?j(e)??[]:[]),[s,c]=(0,y.useState)(!1),[l,u]=(0,y.useState)(null),f=(0,y.useRef)(null),p=(0,y.useRef)(null);(0,y.useEffect)(()=>{let e=f.current?.osInstance();e&&(p.current=e.elements().viewport)}),(0,y.useEffect)(()=>{e&&r(e)},[e]),(0,y.useEffect)(()=>{if(!n)return;let e=!1,t=j(n);return t?(o(t),c(!1)):(o([]),c(!0)),u(null),i.listDir(n).then(t=>{e||(M(n,t.entries),o(t.entries))}).catch(t=>{if(e)return;let i=t instanceof Error?t.message:String(t);if(i.includes(`404`)||i.includes(`Not a directory`)){let e=n.split(`/`).slice(0,-1).join(`/`)||`/`;if(e!==n){r(e);return}}u(i)}).finally(()=>{e||c(!1)}),()=>{e=!0}},[n]),(0,y.useEffect)(()=>{p.current&&(p.current.scrollTop=0)},[n]);let g=e=>r(e),_=n?n.split(`/`).filter(Boolean):[],v=_.map((e,t)=>({label:e,path:`/`+_.slice(0,t+1).join(`/`),isLast:t===_.length-1})),x=v.length>3,S=v[0],C=S&&S.label.length>4?S.label.slice(0,4)+`…`:S?.label;return n?(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,b.jsx)(`div`,{style:{padding:`6px 12px 8px`,flexShrink:0,background:`linear-gradient(to bottom, var(--bg-sidebar) 60%, transparent)`},children:(0,b.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,flexWrap:`nowrap`,columnGap:`2px`,fontSize:`12px`,fontFamily:`var(--font-ui)`,color:`var(--text-tertiary)`,overflow:`hidden`,whiteSpace:`nowrap`},children:x&&S&&C?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(I,{label:C,path:S.path,onClick:g,title:C===S.label?void 0:S.label}),(0,b.jsx)(`span`,{style:{opacity:.4,padding:`0 2px`},children:`/`}),(0,b.jsx)(`span`,{title:v.slice(1,-2).map(e=>e.label).join(` / `),style:{opacity:.5,cursor:`help`},children:`…`}),(0,b.jsx)(`span`,{style:{opacity:.4,padding:`0 2px`},children:`/`}),v.slice(-2).map((e,t)=>(0,b.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`},children:[t>0&&(0,b.jsx)(`span`,{style:{opacity:.4,padding:`0 2px`},children:`/`}),(0,b.jsx)(L,{bc:e,onClick:g})]},e.path))]}):v.map((e,t)=>(0,b.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`},children:[t>0&&(0,b.jsx)(`span`,{style:{opacity:.4,padding:`0 2px`},children:`/`}),(0,b.jsx)(L,{bc:e,onClick:g})]},e.path))})}),(0,b.jsxs)(m,{ref:f,options:h,style:{flex:1,padding:`4px 0`},children:[s&&(0,b.jsx)(`div`,{style:{padding:`20px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`},children:`Loading…`}),l&&(0,b.jsx)(`div`,{style:{padding:`20px`,fontSize:`13px`,color:`var(--tool-error-border)`,textAlign:`center`},children:l}),!s&&!l&&a.map(e=>(0,b.jsx)(ce,{entry:e,currentPath:n,onNavigate:g,onViewFile:t},e.name)),!s&&!l&&a.length===0&&(0,b.jsx)(`div`,{style:{padding:`24px 20px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`},children:`Empty directory.`})]})]}):(0,b.jsx)(`div`,{style:{padding:`32px 20px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`,lineHeight:1.6},children:`Select a session first, then switch to folder view to browse its directory.`})}function I({label:e,path:t,onClick:n,title:r}){return(0,b.jsx)(`button`,{onClick:()=>n(t),title:r??t,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--text-tertiary)`,fontSize:`12px`,fontFamily:`var(--font-ui)`,padding:`1px 3px`,borderRadius:`3px`,transition:`color var(--transition-fast), background var(--transition-fast)`},onMouseEnter:e=>{e.currentTarget.style.color=`var(--text-primary)`,e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.color=`var(--text-tertiary)`,e.currentTarget.style.background=`none`},children:e})}function L({bc:e,onClick:t}){return e.isLast?(0,b.jsx)(`span`,{style:{color:`var(--text-secondary)`,fontWeight:500},children:e.label}):(0,b.jsx)(I,{label:e.label,path:e.path,onClick:t})}function ce({entry:e,currentPath:t,onNavigate:n,onViewFile:r}){let[i,a]=(0,y.useState)(!1);return(0,b.jsxs)(`div`,{role:`button`,tabIndex:0,onClick:()=>{e.type===`dir`?n(`${t}/${e.name}`):r(`${t}/${e.name}`)},onKeyDown:i=>{(i.key===`Enter`||i.key===` `)&&(e.type===`dir`?n(`${t}/${e.name}`):r(`${t}/${e.name}`))},onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),style:{display:`flex`,alignItems:`center`,gap:`10px`,padding:`7px 12px`,cursor:`pointer`,background:i?`var(--bg-sidebar-hover)`:`transparent`,borderRadius:`var(--radius-sm)`,margin:`1px 6px`,transition:`background var(--transition-fast)`,userSelect:`none`,outline:`none`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`,color:`var(--text-tertiary)`},children:e.type===`dir`?(0,b.jsx)(N,{}):(0,b.jsx)(oe,{})}),(0,b.jsx)(`span`,{style:{flex:1,fontSize:`15px`,color:`var(--text-primary)`,fontFamily:`var(--font-ui)`,fontWeight:e.type===`dir`?500:400,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:e.name}),e.type===`dir`&&(0,b.jsx)(`span`,{style:{flexShrink:0,color:`var(--text-tertiary)`,display:`flex`,marginLeft:`4px`},children:(0,b.jsx)(P,{})}),e.type===`file`&&e.size!==null&&(0,b.jsx)(`span`,{style:{flexShrink:0,fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`,marginLeft:`6px`},children:F(e.size)})]})}function le(){if(typeof window>`u`)return _.DEFAULT_WIDTH;let e=s(l.SIDEBAR_WIDTH),t=e?Number(e):NaN;return Number.isFinite(t)?Math.max(_.MIN_WIDTH,t):_.DEFAULT_WIDTH}function ue(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]})}function de(){return(0,b.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z`})})}function fe(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`}),(0,b.jsx)(`path`,{d:`M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z`})]})}function R(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`}),(0,b.jsx)(`line`,{x1:`12`,y1:`17`,x2:`12.01`,y2:`17`})]})}function z(){return(0,b.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`}),(0,b.jsx)(`line`,{x1:`6`,y1:`8`,x2:`6.01`,y2:`8`}),(0,b.jsx)(`line`,{x1:`10`,y1:`8`,x2:`10.01`,y2:`8`}),(0,b.jsx)(`line`,{x1:`14`,y1:`8`,x2:`14.01`,y2:`8`}),(0,b.jsx)(`line`,{x1:`18`,y1:`8`,x2:`18.01`,y2:`8`}),(0,b.jsx)(`line`,{x1:`8`,y1:`12`,x2:`8.01`,y2:`12`}),(0,b.jsx)(`line`,{x1:`12`,y1:`12`,x2:`12.01`,y2:`12`}),(0,b.jsx)(`line`,{x1:`16`,y1:`12`,x2:`16.01`,y2:`12`}),(0,b.jsx)(`line`,{x1:`7`,y1:`16`,x2:`17`,y2:`16`})]})}function pe({label:e,onSelect:t,selectionMode:n}){let[r,i]=(0,y.useState)(!1);return(0,b.jsxs)(`div`,{onMouseEnter:()=>i(!0),onMouseLeave:()=>i(!1),style:{display:`flex`,alignItems:`center`,width:`100%`,padding:`6px 18px 4px`,fontSize:`11px`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`,color:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`,gap:`4px`,minHeight:`22px`},children:[(0,b.jsx)(`span`,{style:{flex:1,textAlign:`left`},children:e}),!n&&(0,b.jsxs)(`button`,{type:`button`,onClick:t,"aria-label":`Select sessions`,style:{display:`flex`,alignItems:`center`,gap:`4px`,background:`none`,border:`none`,cursor:`pointer`,padding:`2px 4px`,margin:`-2px -4px -2px 0`,borderRadius:`var(--radius-sm)`,color:r?`var(--accent-orange)`:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`,fontSize:`10px`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`,opacity:+!!r,pointerEvents:r?`auto`:`none`,transition:`opacity var(--transition-fast), color var(--transition-fast)`},children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`rect`,{x:`3`,y:`5`,width:`4`,height:`4`,rx:`1`}),(0,b.jsx)(`line`,{x1:`10`,y1:`7`,x2:`21`,y2:`7`}),(0,b.jsx)(`rect`,{x:`3`,y:`13`,width:`4`,height:`4`,rx:`1`}),(0,b.jsx)(`line`,{x1:`10`,y1:`15`,x2:`21`,y2:`15`})]}),`Select`]})]})}function me({selectedCount:e,onSelectAll:t,onArchive:n,onDelete:r,onCancel:i}){let a=e===0;return(0,b.jsxs)(`div`,{style:{padding:`8px 10px`,background:`var(--bg-sidebar-active)`,borderBottom:`1px solid var(--border-subtle)`,borderRadius:`var(--radius-sm)`,margin:`0 6px 4px`,display:`flex`,flexDirection:`column`,gap:`6px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,fontSize:`12px`,color:`var(--text-secondary)`,fontFamily:`var(--font-ui)`},children:[(0,b.jsxs)(`span`,{style:{fontWeight:500},children:[e,` selected`]}),(0,b.jsx)(`button`,{onClick:t,style:{background:`none`,border:`none`,cursor:`pointer`,fontSize:`12px`,color:`var(--accent-orange)`,fontFamily:`var(--font-ui)`,padding:`0`},children:`Select all`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`6px`},children:[(0,b.jsx)(B,{label:`Archive`,disabled:a,onClick:n}),(0,b.jsx)(B,{label:`Delete`,disabled:a,danger:!0,onClick:r}),(0,b.jsx)(B,{label:`Cancel`,disabled:!1,onClick:i})]})]})}function B({label:e,disabled:t,danger:n,onClick:r}){let[i,a]=(0,y.useState)(!1);return(0,b.jsx)(`button`,{onClick:r,disabled:t,onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),style:{flex:1,padding:`4px 6px`,fontSize:`12px`,fontFamily:`var(--font-ui)`,background:t?`none`:n?i?`#b85c5c`:`#c47a7a`:i?`var(--bg-sidebar-hover)`:`var(--bg-tool-block)`,color:t?`var(--text-tertiary)`:n?`#fff`:`var(--text-primary)`,border:t?`1px solid var(--border-subtle)`:`1px solid var(--border-default)`,borderRadius:`var(--radius-sm)`,cursor:t?`default`:`pointer`,transition:`background var(--transition-fast), color var(--transition-fast)`,opacity:t?.5:1},children:e})}function he({icon:e,label:t,shortcut:n,active:r,onClick:i,collapsed:a,fade:o}){let[s,c]=(0,y.useState)(!1);return(0,b.jsxs)(`button`,{onClick:i,onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),title:a?t:void 0,style:{display:`flex`,alignItems:`center`,gap:`10px`,width:`calc(100% - 12px)`,padding:`7px 12px`,background:r?`var(--bg-sidebar-active)`:s?`var(--bg-sidebar-hover)`:`none`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,color:`var(--text-primary)`,fontSize:`15px`,fontFamily:`var(--font-ui)`,fontWeight:r?500:400,textAlign:`left`,transition:`background var(--transition-fast), color var(--transition-fast), opacity var(--transition-medium)`,margin:`1px 6px`,opacity:o?0:void 0,overflow:`hidden`,whiteSpace:`nowrap`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`},children:e}),(0,b.jsx)(`span`,{style:{flex:1,overflow:`hidden`,whiteSpace:`nowrap`,opacity:+!a,transition:`opacity var(--transition-medium)`},children:t}),n&&(0,b.jsx)(`kbd`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`,opacity:+!a,transition:`opacity var(--transition-medium)`},children:n})]})}function ge({collapsed:e}){let t=d(e=>e.openSettings),n=d(e=>e.openHelp),r=d(e=>e.openShortcuts),a=d(e=>e.profiles),o=d(e=>e.activeProfileId),s=d(e=>e.setActiveProfileId),[c,l]=(0,y.useState)(!1),u=(0,y.useRef)(null);(0,y.useEffect)(()=>{if(!c)return;let e=e=>{u.current&&!u.current.contains(e.target)&&l(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[c]),(0,y.useEffect)(()=>{if(!c)return;let e=e=>{e.key===`Escape`&&l(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[c]),(0,y.useEffect)(()=>{e&&l(!1)},[e]);let f=async e=>{try{await i.setActiveProfile(e),s(e),l(!1)}catch{}},p=a.find(e=>e.id===o),m=p?p.name:a.length>0?`All Profiles`:`Agent Decoder`,h=p?p.color:`var(--accent-orange)`,g=p?(p.name?.[0]??`?`).toUpperCase():`C`,_=e=>({display:`flex`,alignItems:`center`,gap:`10px`,width:`100%`,padding:`7px 12px`,background:e?`var(--bg-sidebar-hover)`:`none`,border:`none`,cursor:`pointer`,fontFamily:`var(--font-ui)`,fontSize:`15px`,textAlign:`left`,color:`var(--text-primary)`,transition:`background var(--transition-fast)`});return(0,b.jsxs)(`div`,{style:{borderTop:`1px solid var(--border-subtle)`,padding:`8px 4px`,flexShrink:0,position:`relative`},ref:u,children:[(0,b.jsxs)(`button`,{onClick:e?()=>{t()}:()=>l(!c),"aria-label":`Open menu`,title:e?`Settings`:void 0,style:{display:`flex`,alignItems:`center`,gap:`10px`,width:`100%`,padding:`8px 8px`,background:`none`,border:`none`,borderRadius:`var(--radius-sm)`,cursor:`pointer`,outline:`none`,fontFamily:`var(--font-ui)`,overflow:`hidden`},children:[(0,b.jsx)(`span`,{style:{width:`28px`,height:`28px`,borderRadius:`50%`,background:h,display:`flex`,alignItems:`center`,justifyContent:`center`,flexShrink:0,color:`var(--text-on-accent)`,fontSize:`12px`,fontWeight:700},children:g}),(0,b.jsxs)(`div`,{style:{flex:1,textAlign:`left`,overflow:`hidden`,opacity:+!e,transition:`opacity var(--transition-medium)`,whiteSpace:`nowrap`},children:[(0,b.jsx)(`div`,{style:{fontSize:`13px`,fontWeight:500,color:`var(--text-primary)`},children:m}),(0,b.jsx)(`div`,{style:{fontSize:`11px`,color:`var(--text-tertiary)`},children:`Menu`})]})]}),c&&(0,b.jsxs)(`div`,{style:{position:`absolute`,bottom:`100%`,left:`4px`,right:`4px`,background:`var(--bg-modal)`,borderRadius:`12px`,boxShadow:`0 -2px 12px rgba(0,0,0,0.08)`,marginBottom:`-1px`,overflow:`hidden`},children:[(0,b.jsxs)(`button`,{onClick:()=>{t(),l(!1)},style:_(),onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`,color:`var(--text-tertiary)`},children:(0,b.jsx)(fe,{})}),(0,b.jsx)(`div`,{style:{flex:1},children:(0,b.jsx)(`div`,{style:{fontWeight:500},children:`Settings`})})]}),(0,b.jsxs)(`button`,{onClick:()=>{n(),l(!1)},style:_(),onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`,color:`var(--text-tertiary)`},children:(0,b.jsx)(R,{})}),(0,b.jsx)(`div`,{style:{flex:1},children:(0,b.jsx)(`div`,{style:{fontWeight:500},children:`Get Help`})})]}),(0,b.jsxs)(`button`,{onClick:()=>{r(),l(!1)},style:_(),onMouseEnter:e=>{e.currentTarget.style.background=`var(--bg-sidebar-hover)`},onMouseLeave:e=>{e.currentTarget.style.background=`none`},children:[(0,b.jsx)(`span`,{style:{flexShrink:0,display:`flex`,color:`var(--text-tertiary)`},children:(0,b.jsx)(z,{})}),(0,b.jsx)(`div`,{style:{flex:1},children:(0,b.jsx)(`div`,{style:{fontWeight:500},children:`Keyboard Shortcuts`})})]}),a.length>0&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`div`,{style:{borderTop:`1px solid var(--border-subtle)`,margin:`4px 0`}}),(0,b.jsxs)(`button`,{onClick:()=>{f(null)},style:_(!o),children:[(0,b.jsx)(`span`,{style:{width:22,height:22,borderRadius:`50%`,background:`var(--accent-orange)`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`var(--text-on-accent)`,fontSize:`10px`,fontWeight:700,flexShrink:0},children:`C`}),(0,b.jsx)(`span`,{style:{fontWeight:o?400:500},children:`All Profiles`})]}),a.map(e=>(0,b.jsxs)(`button`,{onClick:()=>{f(e.id)},style:_(o===e.id),children:[(0,b.jsx)(`span`,{style:{width:22,height:22,borderRadius:`50%`,background:e.color,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`var(--text-on-accent)`,fontSize:`10px`,fontWeight:700,flexShrink:0},children:(e.name?.[0]??`?`).toUpperCase()}),(0,b.jsx)(`span`,{style:{fontWeight:o===e.id?500:400},children:e.name})]},e.id))]})]})]})}function V(){let[e,t]=(0,y.useState)([]),[n,s]=(0,y.useState)(!0),[c,x]=(0,y.useState)(null),[S,C]=(0,y.useState)(new Set),[w,T]=(0,y.useState)([]),[E,ee]=(0,y.useState)(!1),D=(0,y.useRef)(!1),te=(0,y.useRef)(null),[O,re]=(0,y.useState)(!1),k=r(),A=u(),j=d(e=>e.openSearch),M=d(e=>e.sessionSortOrder),N=d(e=>e.selectedSessionId),oe=d(e=>e.selectProject),P=d(e=>e.sidebarCollapsed),F=d(e=>e.sidebarMode),I=d(e=>e.setFileExplorerRoot),L=d(e=>e.activeProfileId),ce=d(e=>e.setProfiles),fe=d(e=>e.setActiveProfileId),R=d(e=>e.selectionMode),z=d(e=>e.selectedSessionIds),B=d(e=>e.selectionAnchorId),V=d(e=>e.setSelectionAnchorId),_e=d(e=>e.toggleSessionSelected),ve=d(e=>e.enterSelectionMode),H=d(e=>e.exitSelectionMode),U=d(e=>e.clearSelection),W=d(e=>e.setSelectedSessionIds),[ye,be]=(0,y.useState)(!1),xe=d(e=>e.showParentFolder),Se=M!==`alpha`,[G,K]=(0,y.useState)(le),Ce=(0,y.useRef)(G);Ce.current=G;let[q,J]=(0,y.useState)(!1),Y=(0,y.useRef)(!1);q&&G<_.FADE_TEXT_MIN_PX&&(Y.current=!0),q&&G>_.FADE_TEXT_MAX_PX&&(Y.current=!1),q||(Y.current=!1);let we=Y.current,X=P||we;(0,y.useEffect)(()=>{let e=()=>{let e=window.innerWidth;if(e<_.COLLAPSED_WIDTH+_.MIN_MAIN_PANE){d.getState().setSidebarCollapsed(!0);return}let t=Math.max(_.MIN_WIDTH,e-_.MIN_MAIN_PANE);K(e=>Math.max(_.MIN_WIDTH,Math.min(e,t)))};return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),(0,y.useEffect)(()=>{q||G<_.SNAP_THRESHOLD||f(l.SIDEBAR_WIDTH,String(G))},[G,q]);let Te=(0,y.useCallback)(e=>{e.preventDefault();let t=e.clientX,n=P,r=n?_.COLLAPSED_WIDTH:Ce.current,i=le();J(!0),n&&K(_.COLLAPSED_WIDTH),document.body.style.userSelect=`none`;let a=e=>{let i=e.clientX-t,a=Math.max(_.MIN_WIDTH,window.innerWidth-_.MIN_MAIN_PANE),o=n?_.COLLAPSED_WIDTH:r,s=Math.max(_.COLLAPSED_WIDTH,Math.min(o+i,a));K(s),n&&s>=_.SNAP_THRESHOLD&&d.getState().setSidebarCollapsed(!1)},o=()=>{let e=Ce.current;e<_.SNAP_THRESHOLD?(d.getState().setSidebarCollapsed(!0),J(!1),K(i)):(d.getState().setSidebarCollapsed(!1),K(e),J(!1)),document.body.style.userSelect=``,document.removeEventListener(`mousemove`,a),document.removeEventListener(`mouseup`,o)};document.addEventListener(`mousemove`,a),document.addEventListener(`mouseup`,o)},[P]),Ee=(0,y.useCallback)(()=>{for(let e of z)k.add(e);U(),H()},[z,k,U,H]),De=(0,y.useCallback)(()=>{be(!0)},[]),Oe=(0,y.useCallback)(()=>{let e=[...z];be(!1),U(),H(),a(`sessions-removed`,e),i.deleteSessions(e).then(e=>{e.failed.length>0&&(console.error(`[bulk-delete] Some sessions failed to delete:`,e.failed),a(`toast`,{message:`Couldn't delete ${e.failed.length} session${e.failed.length===1?``:`s`}.`,kind:`error`})),a(`refresh`,void 0)}).catch(e=>{console.error(`[bulk-delete] deleteSessions error:`,e),a(`toast`,{message:`Couldn't delete sessions — see console for details.`,kind:`error`}),a(`refresh`,void 0)})},[z,U,H]),ke=e=>{oe(e.project_id),I(e.cwd),p(`/chat/${e.id}`)};(0,y.useEffect)(()=>{if(F!==`folder`||d.getState().fileExplorerRoot)return;let e=N;if(!e)return;let t=w.find(t=>t.id===e);t?.cwd&&I(t.cwd)},[F]);let Z=e=>{if(xe)return e.display_name;let t=e.display_name.lastIndexOf(`/`);return t>=0?e.display_name.slice(t+1):e.display_name},Ae=(0,y.useMemo)(()=>M===`alpha`?[...e].sort((e,t)=>Z(e).localeCompare(Z(t))):e,[e,M,xe]);(0,y.useEffect)(()=>{i.getProfiles().then(e=>{ce(e.profiles),fe(e.active_profile_id)}).catch(()=>{})},[]),(0,y.useEffect)(()=>{if(L===void 0)return;let e=!1;return s(!0),i.getProjects().then(n=>{e||(t(n),n.length>0&&C(new Set([n[0].id])))}).catch(()=>{}).finally(()=>{e||s(!1)}),i.getAllSessions().then(t=>{e||T(t)}).catch(()=>{}),()=>{e=!0}},[L]),(0,y.useEffect)(()=>{let e=!1;return i.getProjects().then(n=>{e||(t(n),n.length>0&&C(new Set([n[0].id])))}).catch(t=>{e||x(t instanceof Error?t.message:`Failed to load projects`)}).finally(()=>{e||s(!1)}),()=>{e=!0}},[]),(0,y.useEffect)(()=>{if(e.length===0)return;let t=!1;return D.current||ee(!0),i.getAllSessions().then(e=>{t||(D.current=!0,T(e))}).catch(()=>{}).finally(()=>{t||ee(!1)}),()=>{t=!0}},[e]),(0,y.useEffect)(()=>o(`refresh`,()=>{i.getProjects().then(t).catch(()=>{}),i.getAllSessions().then(T).catch(()=>{})}),[]),(0,y.useEffect)(()=>o(`sessions-removed`,e=>{let t=new Set(e);T(e=>e.filter(e=>!t.has(e.id)))}),[]);let Q=(0,y.useMemo)(()=>w.filter(e=>A.has(e.id)&&!k.has(e.id)),[w,A,k]),$=(0,y.useMemo)(()=>{let e=w.filter(e=>O?k.has(e.id):!k.has(e.id));return M===`recent`?e.sort((e,t)=>(t.updated_at??t.started_at??``).localeCompare(e.updated_at??e.started_at??``)):M===`oldest`&&e.sort((e,t)=>(e.updated_at??e.started_at??``).localeCompare(t.updated_at??t.started_at??``)),e},[w,M,O,k]),je=ie((0,y.useMemo)(()=>{let e=new Set;for(let t of $)e.add(t.id);for(let t of Q)e.add(t.id);return[...e]},[$,Q])),Me=(0,y.useCallback)(()=>{W($.map(e=>e.id))},[$,W]),Ne=(0,y.useCallback)((e,t)=>{if(t&&B){let t=$.map(e=>e.id),n=t.indexOf(B),r=t.indexOf(e);if(n!==-1&&r!==-1){let[e,i]=n{C(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};return(0,b.jsxs)(`aside`,{"aria-label":`Navigation`,style:{width:P&&!q?`${_.COLLAPSED_WIDTH}px`:`${Math.max(_.COLLAPSED_WIDTH,G)}px`,height:`100vh`,display:`flex`,flexDirection:`column`,background:`var(--bg-sidebar)`,borderRight:`1px solid var(--border-subtle)`,flexShrink:0,overflow:`hidden`,position:`relative`,transition:q?`none`:`width var(--transition-medium)`},children:[(0,b.jsx)(`div`,{onMouseDown:Te,title:`Drag to resize`,"aria-label":`Resize sidebar`,role:`separator`,"aria-orientation":`vertical`,style:{position:`absolute`,top:0,bottom:0,right:0,width:`4px`,cursor:`col-resize`,zIndex:10,background:q?`var(--border-default)`:`transparent`,transition:`background 0.12s`},onMouseEnter:e=>{q||(e.currentTarget.style.background=`var(--border-default)`)},onMouseLeave:e=>{q||(e.currentTarget.style.background=`transparent`)}}),(0,b.jsx)(ne,{collapsed:X}),(0,b.jsxs)(`div`,{style:{padding:`6px 0 4px`,flexShrink:0},children:[(0,b.jsx)(he,{collapsed:X,icon:(0,b.jsx)(ue,{}),label:`Search`,shortcut:`⌘K`,onClick:j}),!P&&Q.length>0&&(0,b.jsxs)(`div`,{style:{margin:`4px 0`},children:[(0,b.jsx)(`div`,{style:{padding:`4px 18px 2px`,fontSize:`11px`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.06em`,color:`var(--text-tertiary)`,fontFamily:`var(--font-ui)`},children:`Starred`}),Q.map(e=>(0,b.jsx)(v,{session:e,isActive:N===e.id,onClick:()=>ke(e),runnerStatus:je.get(e.id)},e.id))]}),(0,b.jsx)(he,{collapsed:X,icon:(0,b.jsx)(de,{}),label:`Archive`,active:O,onClick:()=>re(e=>!e),fade:X})]}),!P&&(0,b.jsx)(`div`,{style:{marginTop:`2px`}}),(0,b.jsx)(m,{ref:te,options:h,role:F===`chat`?`list`:void 0,"aria-label":F===`chat`?`Sessions`:void 0,style:{flex:1,padding:F===`folder`?`0`:`8px 0`,display:P?`none`:void 0,opacity:+!X,transition:`opacity var(--transition-medium)`},children:F===`folder`?(0,b.jsx)(se,{}):(0,b.jsxs)(b.Fragment,{children:[R&&(0,b.jsx)(me,{selectedCount:z.size,onSelectAll:Me,onArchive:Ee,onDelete:De,onCancel:H}),n&&(0,b.jsx)(`div`,{style:{padding:`16px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`},children:`Loading…`}),c&&(0,b.jsx)(`div`,{style:{padding:`16px`,fontSize:`13px`,color:`var(--tool-error-border)`},children:c}),!n&&!c&&(Se||O)&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(pe,{label:O?`Archived`:`Recents`,onSelect:ve,selectionMode:R}),E&&(0,b.jsx)(`div`,{style:{padding:`8px 16px`,fontSize:`12px`,color:`var(--text-tertiary)`},children:`Loading…`}),!E&&$.map(e=>(0,b.jsx)(v,{session:e,isActive:N===e.id,onClick:()=>ke(e),runnerStatus:je.get(e.id),onToggleSelect:Ne},e.id)),!E&&$.length===0&&(0,b.jsx)(`div`,{style:{padding:`24px 16px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`,lineHeight:1.6},children:O?`No archived sessions.`:`No sessions found.`})]}),!n&&!c&&!Se&&!O&&(0,b.jsxs)(b.Fragment,{children:[Ae.map(e=>(0,b.jsx)(ae,{project:e,displayName:Z(e),isExpanded:S.has(e.id),onToggle:()=>Pe(e.id),archivedIds:k.ids},e.id)),Ae.length===0&&(0,b.jsxs)(`div`,{style:{padding:`24px 16px`,fontSize:`13px`,color:`var(--text-tertiary)`,textAlign:`center`,lineHeight:1.6},children:[`No projects found.`,(0,b.jsx)(`br`,{}),`Add a path in Settings.`]})]})]})}),P&&(0,b.jsx)(`div`,{style:{flex:1}}),(0,b.jsx)(ge,{collapsed:X}),ye&&(0,b.jsx)(g,{title:`Delete ${z.size} session${z.size===1?``:`s`}?`,body:`This permanently deletes the session transcript files from disk and cannot be undone.`,confirmLabel:`Delete`,onConfirm:Oe,onCancel:()=>be(!1)})]})}export{V as default}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/index-Egnd1H3-.js b/src/agent_decoder/static/assets/index-Egnd1H3-.js deleted file mode 100644 index 8ba7962a..00000000 --- a/src/agent_decoder/static/assets/index-Egnd1H3-.js +++ /dev/null @@ -1,5 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ChatView-D7j0LMdO.js","assets/rolldown-runtime-QTnfLwEv.js","assets/hljs-CvdnYs1C.js","assets/ScrollContainer-CA7-aYqv.js","assets/react-CCIEwYL0.js","assets/sessionCache-Cj3FsbQ4.js","assets/ui-BVMZ0uWi.js","assets/useSessionDetail-BayJI-iv.js","assets/nativePtyFonts-BxhRYj2G.js","assets/formatRelative-CavTjOcy.js","assets/ChatView-BrP-ENHg.css","assets/SearchOverlay-DUxwGmGf.js","assets/SessionItem-CYxoPLdi.js","assets/shared-CAVcrZag.js","assets/renderSnippet-B37VxZaL.js","assets/SettingsModal-EAS0zTjU.js","assets/Sidebar-mcMKZmEW.js","assets/Dashboard-CNB-enER.js","assets/HelpPopup-sd9kGRO6.js","assets/ShortcutsPopup-B7lbUh3m.js","assets/FileViewer-Cl35TR1y.js","assets/fileType-BHvAriyJ.js","assets/ArtifactsPanel-CIwhZsnY.js"])))=>i.map(i=>d[i]); -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,n,t as r}from"./react-CCIEwYL0.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var i=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},a=(e=>e?i(e):i),o=e(t(),1),s=e=>e;function c(e,t=s){let n=o.useSyncExternalStore(e.subscribe,o.useCallback(()=>t(e.getState()),[e,t]),o.useCallback(()=>t(e.getInitialState()),[e,t]));return o.useDebugValue(n),n}var l=e=>{let t=a(e),n=e=>c(t,e);return Object.assign(n,t),n},ee=(e=>e?l(e):l),te=e(n(),1);function ne(){let e=window.location.hash.replace(/^#/,``)||`/`;if(e.startsWith(`/chat/`)){let t=e.slice(6);if(t)return`/chat/${t}`}return`/`}function u(e){return e.startsWith(`/chat/`)?e.slice(6):null}function d(e){window.location.hash.replace(/^#/,``)!==e&&(window.location.hash=e)}function re(){let[e,t]=(0,o.useState)(ne);return(0,o.useEffect)(()=>{let e=()=>t(ne());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}var f={STARRED:`clau-decode:starred`,RENAMED:`clau-decode:renamed`,ARCHIVED:`clau-decode:archived`,VIEWED_AT:`clau-decode:viewed-at`,FILE_VIEWER_WIDTH:`clau-decode:file-viewer-width`,ARTIFACTS_OPEN:`clau-decode:artifacts-open`,SIDEBAR_WIDTH:`clau-decode:sidebar-width`,READ_SESSIONS_LEGACY:`clau-decode:read-sessions`,LAST_SUBMIT_AT:`clau-decode:last-submit-at`};function p(e){try{return JSON.parse(localStorage.getItem(e)??`{}`)}catch{return{}}}function m(e,t){localStorage.setItem(e,JSON.stringify(t))}function h(e){return localStorage.getItem(e)}function g(e,t){localStorage.setItem(e,t)}function ie(e){let t=p(f.LAST_SUBMIT_AT);t[e]=String(Date.now()),m(f.LAST_SUBMIT_AT,t)}function ae(e){let t=p(f.LAST_SUBMIT_AT)[e];if(!t)return null;let n=Number(t);return Number.isFinite(n)?n:null}function oe(){if(typeof window>`u`)return;let e=localStorage.getItem(f.READ_SESSIONS_LEGACY);if(e&&!localStorage.getItem(f.VIEWED_AT))try{let t=JSON.parse(e),n={};for(let e of t){let t=e.lastIndexOf(`:`);if(t<0)continue;let r=e.slice(0,t),i=e.slice(t+1);(!n[r]||i>n[r])&&(n[r]=i)}localStorage.setItem(f.VIEWED_AT,JSON.stringify(n))}catch{}}function se(){if(typeof window>`u`)return null;let e=window.location.hash.replace(/^#/,``)||`/`;return u(e.startsWith(`/chat/`)?e:`/`)}var _=ee(e=>({selectedSessionId:se(),selectedProjectId:null,pendingScrollMessageId:null,searchQuery:``,isSearchOpen:!1,isSettingsOpen:!1,isHelpOpen:!1,isShortcutsOpen:!1,sidebarCollapsed:!1,sidebarMode:`chat`,fileExplorerRoot:null,viewingFilePath:null,artifactsOpen:typeof window<`u`&&h(f.ARTIFACTS_OPEN)===`1`,sessionSortOrder:`recent`,showParentFolder:!1,blocksExpanded:!1,resultsExpanded:!1,profiles:[],activeProfileId:null,hostInfo:null,providers:null,activeProvider:`claude`,selectionMode:!1,selectedSessionIds:new Set,selectionAnchorId:null,setActiveProvider:t=>e({activeProvider:t}),setProviders:t=>e({providers:Object.fromEntries(t.map(e=>[e.name,e]))}),showProviderTag:!1,setShowProviderTag:t=>e({showProviderTag:t}),selectSession:t=>e({selectedSessionId:t}),setPendingScrollMessageId:t=>e({pendingScrollMessageId:t}),selectProject:t=>e({selectedProjectId:t}),setSearchQuery:t=>e({searchQuery:t}),openSearch:()=>e({isSearchOpen:!0}),closeSearch:()=>e({isSearchOpen:!1,searchQuery:``}),openSettings:()=>e({isSettingsOpen:!0}),closeSettings:()=>e({isSettingsOpen:!1}),openHelp:()=>e({isHelpOpen:!0}),closeHelp:()=>e({isHelpOpen:!1}),openShortcuts:()=>e({isShortcutsOpen:!0}),closeShortcuts:()=>e({isShortcutsOpen:!1}),toggleSidebar:()=>e(e=>({sidebarCollapsed:!e.sidebarCollapsed})),toggleExplorer:()=>e(e=>!e.sidebarCollapsed&&e.sidebarMode===`folder`?{sidebarMode:`chat`}:{sidebarCollapsed:!1,sidebarMode:`folder`}),setSidebarCollapsed:t=>e({sidebarCollapsed:t}),setSidebarMode:t=>e({sidebarMode:t}),setFileExplorerRoot:t=>e({fileExplorerRoot:t}),setViewingFilePath:t=>e({viewingFilePath:t}),toggleArtifacts:()=>e(e=>(g(f.ARTIFACTS_OPEN,e.artifactsOpen?`0`:`1`),{artifactsOpen:!e.artifactsOpen})),setSessionSortOrder:t=>e({sessionSortOrder:t}),setShowParentFolder:t=>e({showParentFolder:t}),toggleBlocksExpanded:()=>e(e=>({blocksExpanded:!e.blocksExpanded})),toggleResultsExpanded:()=>e(e=>({resultsExpanded:!e.resultsExpanded})),setProfiles:t=>e({profiles:t}),setActiveProfileId:t=>e({activeProfileId:t}),setHostInfo:t=>e({hostInfo:t}),enterSelectionMode:()=>e({selectionMode:!0,selectedSessionIds:new Set,selectionAnchorId:null}),exitSelectionMode:()=>e({selectionMode:!1,selectedSessionIds:new Set,selectionAnchorId:null}),toggleSessionSelected:t=>e(e=>{let n=new Set(e.selectedSessionIds);return n.has(t)?n.delete(t):n.add(t),{selectedSessionIds:n}}),clearSelection:()=>e({selectedSessionIds:new Set,selectionAnchorId:null}),setSelectedSessionIds:t=>e({selectedSessionIds:new Set(t)}),setSelectionAnchorId:t=>e({selectionAnchorId:t})})),v=`agent-decoder:`;function y(e,t){window.dispatchEvent(new CustomEvent(`${v}${e}`,{detail:t}))}function b(e,t){let n=e=>t(e.detail);return window.addEventListener(`${v}${e}`,n),()=>window.removeEventListener(`${v}${e}`,n)}var x=null,S=null;function ce(){return x}function C(){return S||(S=fetch(`/api/config`).then(e=>{if(!e.ok)throw Error(`GET /api/config → ${e.status}`);return e.json()}).then(e=>(x=e,e)).finally(()=>{S=null}),S)}async function w(e){let t=await fetch(e);if(!t.ok)throw Error(`GET ${e} → ${t.status}`);return t.json()}async function T(e,t){let n=await fetch(e,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error(`PUT ${e} → ${n.status}`);return n.json()}async function le(e,t){try{let t=await e.json();if(t&&typeof t.detail==`string`)return t.detail}catch{}return t}async function E(e,t){let n={method:`POST`};t!==void 0&&(n.headers={"Content-Type":`application/json`},n.body=JSON.stringify(t));let r=await fetch(e,n);if(!r.ok)throw Error(await le(r,`POST ${e} → ${r.status}`));return r.json()}function ue(e,t){let n=JSON.stringify(t);return typeof navigator<`u`&&typeof navigator.sendBeacon==`function`?navigator.sendBeacon(e,new Blob([n],{type:`application/json`})):(fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:n,keepalive:!0}).catch(()=>{}),!0)}function D(e){return fetch(e,{method:`DELETE`}).then(e=>{if(!e.ok)throw Error(`${e.status} ${e.statusText}`);return e.json()})}function de(e,t){return fetch(e,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}).then(e=>{if(!e.ok)throw Error(`${e.status} ${e.statusText}`);return e.json()})}var O={getProjects:()=>w(`/api/projects`),getProjectSessions:e=>w(`/api/projects/${encodeURIComponent(e)}/sessions`),getAllSessions:()=>w(`/api/sessions`),getSession:e=>w(`/api/sessions/${encodeURIComponent(e)}`),search:(e,t,n=50,r=0)=>{let i=new URLSearchParams({q:e,limit:String(n),offset:String(r)});return t&&i.set(`project`,t),w(`/api/search?${i}`)},getDashboard:()=>w(`/api/dashboard`),getHostInfo:()=>w(`/api/host-info`),getUpdateCheck:()=>w(`/api/update-check`),getProviders:()=>w(`/api/providers`),getConfig:()=>w(`/api/config`),updateConfig:e=>(x=e,y(`config-updated`,e),T(`/api/config`,e)),refresh:()=>E(`/api/refresh`),revealSession:e=>E(`/api/sessions/${encodeURIComponent(e)}/reveal`),openTerminal:e=>E(`/api/sessions/${encodeURIComponent(e)}/open-terminal`),getDailyAnalytics:()=>w(`/api/analytics/daily`),getPricingTable:()=>w(`/api/pricing`),getToolUsage:()=>w(`/api/analytics/tools`),getFileTouches:()=>w(`/api/analytics/files`),deleteMessage:e=>D(`/api/messages/${e}`),patchMessage:(e,t)=>de(`/api/messages/${e}`,{content_blocks:t}),getProfiles:()=>w(`/api/profiles`),createProfile:(e,t,n)=>(x=null,E(`/api/profiles`,{name:e,data_paths:t||[`~/.claude`],color:n||`#b8956a`})),updateProfile:(e,t)=>(x=null,T(`/api/profiles/${encodeURIComponent(e)}`,t)),deleteProfile:e=>(x=null,D(`/api/profiles/${encodeURIComponent(e)}`)),setActiveProfile:e=>(x=null,T(`/api/profiles/active`,{active_profile_id:e})),listDir:(e,t=!1)=>{let n=new URLSearchParams({path:e});return t&&n.set(`show_hidden`,`true`),w(`/api/fs/list?${n}`)},readFile:e=>w(`/api/fs/read?${new URLSearchParams({path:e})}`),writeFile:(e,t)=>T(`/api/fs/write`,{path:e,content:t}),exportSession:(e,t)=>fetch(`/api/sessions/${encodeURIComponent(e)}/export?format=${t}`).then(e=>{if(!e.ok)throw Error(`Export failed: ${e.status}`);let n=(e.headers.get(`content-disposition`)||``).match(/filename="([^"]+)"/),r=n?n[1]:`session.${t}`;return e.blob().then(e=>({blob:e,filename:r}))}),getRunnerStatuses:e=>w(`/api/runner-status?ids=${e.map(encodeURIComponent).join(`,`)}`),generateRecap:e=>E(`/api/sessions/${encodeURIComponent(e)}/recap`),listRecaps:(e,t)=>{let n=new URLSearchParams;t?.includeDismissed&&n.set(`include_dismissed`,`true`);let r=n.toString();return w(`/api/sessions/${encodeURIComponent(e)}/recaps${r?`?${r}`:``}`)},dismissRecap:(e,t)=>E(`/api/sessions/${encodeURIComponent(e)}/recaps/${t}/dismiss`),setSessionTitle:(e,t)=>T(`/api/sessions/${encodeURIComponent(e)}/title`,{title:t}),setArchived:(e,t)=>T(`/api/sessions/${encodeURIComponent(e)}/archived`,{archived:t}),setStarred:(e,t)=>T(`/api/sessions/${encodeURIComponent(e)}/starred`,{starred:t}),setViewedAt:(e,t)=>T(`/api/sessions/${encodeURIComponent(e)}/viewed`,{viewed_at:t}),migrateLocalStorage:e=>E(`/api/sessions/migrate-localstorage`,e),deleteSessions:e=>E(`/api/sessions/delete`,{session_ids:e}),newSession:e=>E(`/api/sessions/new`,e??{}),ptyFocus:(e,t,n)=>E(`/api/pty/focus`,{session_id:e,...t?{model:t}:{},...n?{rows:n}:{}}),ptyBlur:e=>E(`/api/pty/blur`,{session_id:e}),ptySubmit:(e,t,n)=>E(`/api/pty/submit`,{session_id:e,content:t,...n?{model:n}:{}}),ptyKill:e=>E(`/api/pty/kill`,{session_id:e}),ptyKillKeepalive:e=>ue(`/api/pty/kill`,{session_id:e}),ptyStatus:e=>w(`/api/pty/status?${new URLSearchParams({session_id:e})}`),ptyNativeSnapshot:e=>w(`/api/pty/native-snapshot?${new URLSearchParams({session_id:e})}`),ptyInput:(e,t)=>E(`/api/pty/input`,{session_id:e,data:t}),ptyResize:(e,t,n)=>E(`/api/pty/resize`,{session_id:e,rows:t,cols:n}),ptyOwnership:e=>w(`/api/pty/ownership/${encodeURIComponent(e)}`),ptyTakeover:e=>E(`/api/pty/takeover/${encodeURIComponent(e)}`,{}),ptyEphemerals:e=>w(`/api/sessions/${encodeURIComponent(e)}/ephemerals`)};function fe(e){let t=typeof e==`function`?{onRefresh:e}:e,n=new EventSource(`/api/events`);n.addEventListener(`message`,e=>{try{let n=JSON.parse(e.data);if(n.type===`refresh`)t.onRefresh();else if(n.type===`session_adopted`){let e=n;t.onSessionAdopted?t.onSessionAdopted({old:e.old,new:e.new}):console.debug(`[SSE] session_adopted (no handler)`,e)}else if(n.type===`session-meta`){let e=n;t.onSessionMeta?.({id:e.id,...`title`in e?{title:e.title}:{},...`archived_at`in e?{archived_at:e.archived_at}:{},...`starred_at`in e?{starred_at:e.starred_at}:{},...`viewed_at`in e?{viewed_at:e.viewed_at}:{}})}else if(n.type===`session-meta-bulk-migration`){let e=n;t.onSessionMetaBulkMigration?.({applied:e.applied})}else if(n.type===`pty_idle_warn`){let e=n;t.onPtyIdleWarn?t.onPtyIdleWarn({session_id:e.session_id,kill_in_seconds:e.kill_in_seconds}):console.debug(`[SSE] pty_idle_warn (no handler)`,e)}else if(n.type===`auth_required`){let e=n;t.onAuthRequired?t.onAuthRequired({session_id:e.session_id}):console.debug(`[SSE] auth_required (no handler)`,e)}else if(n.type===`trust_required`){let e=n;t.onTrustRequired?t.onTrustRequired({session_id:e.session_id,cwd:e.cwd}):console.debug(`[SSE] trust_required (no handler)`,e)}else if(n.type===`stuck_session`){let e=n;t.onStuckSession?t.onStuckSession({session_id:e.session_id}):console.debug(`[SSE] stuck_session (no handler)`,e)}else if(n.type===`pty_input_acknowledged`){let e=n;t.onPtyInputAcknowledged?t.onPtyInputAcknowledged({session_id:e.session_id}):console.debug(`[SSE] pty_input_acknowledged (no handler)`,e)}else if(n.type===`pty_input_stalled`){let e=n;t.onPtyInputStalled?t.onPtyInputStalled({session_id:e.session_id,elapsed_ms:e.elapsed_ms}):console.debug(`[SSE] pty_input_stalled (no handler)`,e)}else if(n.type===`pty_submit_completed`){let e=n;t.onPtySubmitCompleted?t.onPtySubmitCompleted({session_id:e.session_id,kind:e.kind,status:e.status,input_id:e.input_id,response_id:e.response_id}):console.debug(`[SSE] pty_submit_completed (no handler)`,e)}else if(n.type===`pty_output_chunk`){let e=n;t.onPtyOutputChunk?t.onPtyOutputChunk({session_id:e.session_id,data_b64:e.data_b64}):console.debug(`[SSE] pty_output_chunk (no handler)`,e)}else if(n.type===`pty_native_state`){let e=n;t.onPtyNativeState?t.onPtyNativeState({session_id:e.session_id,state:e.state,decoded_input_safe:e.decoded_input_safe}):console.debug(`[SSE] pty_native_state (no handler)`,e)}else if(n.type===`ephemeral_input_persisted`){let e=n;t.onEphemeralInputPersisted?t.onEphemeralInputPersisted({session_id:e.session_id,input_id:e.input_id,kind:e.kind}):console.debug(`[SSE] ephemeral_input_persisted (no handler)`,e)}else if(n.type===`ephemeral_pair_persisted`){let e=n;t.onEphemeralPairPersisted?t.onEphemeralPairPersisted({session_id:e.session_id,input_id:e.input_id,response_id:e.response_id,kind:e.kind}):console.debug(`[SSE] ephemeral_pair_persisted (no handler)`,e)}}catch{}});let r=!1;return n.addEventListener(`open`,()=>{r&&t.onReconnect?.(),r=!0}),n}var k=new Set,A=new Set,j=new Map,M=`idle`,N=new Set;function P(){for(let e of N)e()}async function F(){if(M===`idle`){M=`in-flight`;try{let e=await O.getAllSessions(),t=new Set,n=new Set,r=new Map;for(let i of e)i.archived_at&&t.add(i.id),i.starred_at&&n.add(i.id),i.viewed_at&&r.set(i.id,i.viewed_at);k=t,A=n,j=r,M=`ready`,P()}catch(e){M=`idle`,console.warn(`sessionMeta bootstrap failed`,e)}}}function I(e){return N.add(e),M===`idle`&&F(),()=>{N.delete(e)}}function pe(e){let t=!1;if(`archived_at`in e){let n=k.has(e.id);e.archived_at==null&&n?(k=new Set(k),k.delete(e.id),t=!0):e.archived_at!=null&&!n&&(k=new Set(k),k.add(e.id),t=!0)}if(`starred_at`in e){let n=A.has(e.id);e.starred_at==null&&n?(A=new Set(A),A.delete(e.id),t=!0):e.starred_at!=null&&!n&&(A=new Set(A),A.add(e.id),t=!0)}`viewed_at`in e&&(j.get(e.id)??null)!==e.viewed_at&&(j=new Map(j),e.viewed_at==null?j.delete(e.id):j.set(e.id,e.viewed_at),t=!0),t&&P()}async function L(){M=`idle`,await F()}function R(e,t,n){let r=(0,o.useSyncExternalStore)(I,e,e),i=(n,r)=>{let i=new Set(e());r?i.add(n):i.delete(n),t(i),P()},a=(n,r)=>{let i=new Set(e());r?i.add(n):i.delete(n),t(i),P()};return{ids:r,has:e=>r.has(e),toggle:t=>{let r=e().has(t),o=!r;i(t,o),n(t,o).catch(e=>{console.warn(`sessionMeta toggle failed; rolling back`,e),a(t,r)})},add:t=>{e().has(t)||(i(t,!0),n(t,!0).catch(e=>{console.warn(`sessionMeta add failed; rolling back`,e),a(t,!1)}))},remove:t=>{e().has(t)&&(i(t,!1),n(t,!1).catch(e=>{console.warn(`sessionMeta remove failed; rolling back`,e),a(t,!0)}))}}}function me(){return R(()=>k,e=>{k=e},(e,t)=>O.setArchived(e,t))}function he(){return R(()=>A,e=>{A=e},(e,t)=>O.setStarred(e,t))}function ge(){let e=(0,o.useSyncExternalStore)(I,()=>j,()=>j);return{map:e,get:t=>e.get(t)??null,set:(e,t)=>{let n=j.get(e)??null,r=new Map(j);r.set(e,t),j=r,P(),O.setViewedAt(e,t).catch(t=>{console.warn(`sessionMeta setViewed failed; rolling back`,t);let r=new Map(j);n==null?r.delete(e):r.set(e,n),j=r,P()})},clear:e=>{if(!j.has(e))return;let t=j.get(e)??null,n=new Map(j);n.delete(e),j=n,P(),O.setViewedAt(e,null).catch(n=>{console.warn(`sessionMeta clearViewed failed; rolling back`,n);let r=new Map(j);t!=null&&r.set(e,t),j=r,P()})}}}var z=r(),B=class extends o.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`[ErrorBoundary]`,e,t.componentStack)}render(){return this.state.hasError?this.props.fallback?this.props.fallback:(0,z.jsxs)(`div`,{style:{padding:`24px`,color:`#ef4444`,fontFamily:`monospace`,fontSize:`13px`,whiteSpace:`pre-wrap`},children:[(0,z.jsx)(`strong`,{children:`Render error`}),` -`,this.state.error?.message,` - -`,(0,z.jsx)(`button`,{style:{padding:`6px 12px`,cursor:`pointer`,border:`1px solid #ef4444`,background:`none`,color:`#ef4444`,borderRadius:`4px`},onClick:()=>this.setState({hasError:!1,error:null}),children:`Retry`})]}):this.props.children}};function _e(e){if(!(e instanceof Error))return!1;if(e.name===`ChunkLoadError`)return!0;let t=e.message||``;return/Failed to fetch dynamically imported module/i.test(t)||/Loading chunk \S+ failed/i.test(t)||/Failed to load module script/i.test(t)||/Importing a module script failed/i.test(t)}function ve(){return(0,z.jsxs)(`div`,{role:`alert`,style:{padding:`24px`,fontFamily:`var(--font-ui)`,fontSize:`13px`,color:`var(--text-primary)`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,maxWidth:`420px`,margin:`40px auto`,boxShadow:`var(--shadow-lg)`},children:[(0,z.jsx)(`strong`,{style:{display:`block`,marginBottom:`8px`},children:`Update required`}),(0,z.jsx)(`p`,{style:{margin:`0 0 16px`,color:`var(--text-secondary)`},children:`This part of the app couldn't load — usually because a newer build is on the server and your browser is holding a stale reference. Reload to pick up the latest version.`}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>window.location.reload(),style:{padding:`6px 14px`,cursor:`pointer`,border:`1px solid var(--border-subtle)`,background:`var(--bg-button)`,color:`var(--text-primary)`,borderRadius:`var(--radius-sm)`,fontSize:`13px`},children:`Reload`})]})}function V(e){return o.lazy(()=>e().catch(e=>{if(_e(e))return{default:ve};throw e}))}function H(){return typeof document>`u`?!1:!!document.activeElement?.closest?.(`[data-testid="native-terminal-host"]`)}var U=!1,W=new Set;function ye(){return U}function be(){U=!U,W.forEach(e=>e(U))}function xe(e){return W.add(e),()=>W.delete(e)}function G({width:e=`120px`,color:t=`var(--accent-orange)`,label:n}){return(0,z.jsxs)(`svg`,{role:n?`img`:`presentation`,"aria-label":n,"aria-hidden":n?void 0:!0,fill:`none`,viewBox:`737 455 450 130`,xmlns:`http://www.w3.org/2000/svg`,style:{width:e,height:`auto`,color:t,display:`block`},children:[(0,z.jsxs)(`g`,{opacity:`0.25`,children:[(0,z.jsx)(`animate`,{repeatCount:`indefinite`,attributeName:`opacity`,dur:`1.35s`,begin:`0s`,fill:`freeze`,values:`0.25; 1; 0.25; 0.25`,keyTimes:`0; 0.17284; 0.37037; 1`,keySplines:`0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,calcMode:`spline`}),(0,z.jsxs)(`g`,{transform:`translate(782,540)`,children:[(0,z.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`translate`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`782 540; 782 500; 782 540; 782 540`,keyTimes:`0; 0.17284; 0.37037; 1`,keySplines:`0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,z.jsxs)(`g`,{transform:`scale(0.5,0.5)`,children:[(0,z.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`scale`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`0.5 0.5; 0.75 0.75; 0.5 0.5; 0.5 0.5`,keyTimes:`0; 0.17284; 0.37037; 1`,keySplines:`0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,z.jsx)(`ellipse`,{ry:`60`,rx:`60`,cy:`0`,cx:`0`,fill:`currentColor`})]})]})]}),(0,z.jsxs)(`g`,{opacity:`0.25`,children:[(0,z.jsx)(`animate`,{repeatCount:`indefinite`,attributeName:`opacity`,dur:`1.35s`,begin:`0s`,fill:`freeze`,values:`0.25; 0.25; 1; 0.25; 0.25`,keyTimes:`0; 0.111111; 0.283951; 0.481481; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,calcMode:`spline`}),(0,z.jsxs)(`g`,{transform:`translate(902,540)`,children:[(0,z.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`translate`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`902 540; 902 540; 902 500; 902 540; 902 540`,keyTimes:`0; 0.111111; 0.283951; 0.481481; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,z.jsxs)(`g`,{transform:`scale(0.5,0.5)`,children:[(0,z.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`scale`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`0.5 0.5; 0.5 0.5; 0.75 0.75; 0.5 0.5; 0.5 0.5`,keyTimes:`0; 0.111111; 0.283951; 0.481481; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,z.jsx)(`ellipse`,{ry:`60`,rx:`60`,cy:`0`,cx:`0`,fill:`currentColor`})]})]})]}),(0,z.jsxs)(`g`,{opacity:`0.25`,children:[(0,z.jsx)(`animate`,{repeatCount:`indefinite`,attributeName:`opacity`,dur:`1.35s`,begin:`0s`,fill:`freeze`,values:`0.25; 0.25; 1; 0.25; 0.25`,keyTimes:`0; 0.209877; 0.382716; 0.580247; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,calcMode:`spline`}),(0,z.jsxs)(`g`,{transform:`translate(1022,540)`,children:[(0,z.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`translate`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`1022 540; 1022 540; 1022 500; 1022 540; 1022 540`,keyTimes:`0; 0.209876; 0.382716; 0.580247; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,z.jsxs)(`g`,{transform:`scale(0.5,0.5)`,children:[(0,z.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`scale`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`0.5 0.5; 0.5 0.5; 0.75 0.75; 0.5 0.5; 0.5 0.5`,keyTimes:`0; 0.209876; 0.382716; 0.580247; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,z.jsx)(`ellipse`,{ry:`60`,rx:`60`,cy:`0`,cx:`0`,fill:`currentColor`})]})]})]}),(0,z.jsxs)(`g`,{opacity:`0.25`,children:[(0,z.jsx)(`animate`,{repeatCount:`indefinite`,attributeName:`opacity`,dur:`1.35s`,begin:`0s`,fill:`freeze`,values:`0.25; 0.25; 1; 0.25; 0.25`,keyTimes:`0; 0.308642; 0.481482; 0.679012; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,calcMode:`spline`}),(0,z.jsxs)(`g`,{transform:`translate(1142,540)`,children:[(0,z.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`translate`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`1142 540; 1142 540; 1142 500; 1142 540; 1142 540`,keyTimes:`0; 0.308642; 0.481482; 0.679013; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,z.jsxs)(`g`,{transform:`scale(0.5,0.5)`,children:[(0,z.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`scale`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`0.5 0.5; 0.5 0.5; 0.75 0.75; 0.5 0.5; 0.5 0.5`,keyTimes:`0; 0.308642; 0.481482; 0.679013; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,z.jsx)(`ellipse`,{ry:`60`,rx:`60`,cy:`0`,cx:`0`,fill:`currentColor`})]})]})]})]})}function K({delay:e=200}){let[t,n]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{let t=window.setTimeout(()=>n(!0),e);return()=>window.clearTimeout(t)},[e]),t?(0,z.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`16px`},children:(0,z.jsx)(G,{width:`20px`,label:`Loading`})}):null}var Se=5e3,Ce=0;function we(){let[e,t]=(0,o.useState)([]);return(0,o.useEffect)(()=>b(`toast`,({message:e,kind:n})=>{let r=Ce++;t(t=>[...t,{id:r,message:e,kind:n??`info`}]),setTimeout(()=>{t(e=>e.filter(e=>e.id!==r))},Se)}),[]),e.length===0?null:(0,z.jsx)(`div`,{style:{position:`fixed`,bottom:20,left:`50%`,transform:`translateX(-50%)`,display:`flex`,flexDirection:`column`,gap:8,zIndex:9999,pointerEvents:`none`,maxWidth:`min(90vw, 480px)`},children:e.map(e=>(0,z.jsx)(`div`,{role:`status`,onClick:()=>t(t=>t.filter(t=>t.id!==e.id)),style:{pointerEvents:`auto`,cursor:`pointer`,minWidth:260,padding:`11px 15px`,borderRadius:`var(--radius-md)`,fontSize:13,lineHeight:1.45,color:e.kind===`error`?`var(--tool-error-text)`:`var(--text-primary)`,background:`var(--bg-modal)`,border:`1px solid ${e.kind===`error`?`var(--tool-error-border)`:`var(--border-default)`}`,boxShadow:`var(--shadow-lg)`},children:e.message},e.id))})}var Te=`modulepreload`,Ee=function(e){return`/`+e},q={},J=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=Ee(t,n),t in q)return;q[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Te,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function Y(e){e===`dark`?document.documentElement.setAttribute(`data-theme`,`dark`):e===`light`?document.documentElement.setAttribute(`data-theme`,`light`):(document.documentElement.removeAttribute(`data-theme`),window.matchMedia(`(prefers-color-scheme: dark)`).matches&&document.documentElement.setAttribute(`data-theme`,`dark`))}window.__agentDecoderApplyTheme=Y;var X=()=>J(()=>import(`./ChatView-D7j0LMdO.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])),Z=()=>J(()=>import(`./SearchOverlay-DUxwGmGf.js`),__vite__mapDeps([11,1,3,4,5,12,6,13,9,14])),Q=()=>J(()=>import(`./SettingsModal-EAS0zTjU.js`),__vite__mapDeps([15,1,3,4,13,8])),De=V(()=>J(()=>import(`./Sidebar-mcMKZmEW.js`),__vite__mapDeps([16,1,3,4,6,12,5,13,9]))),Oe=V(X),ke=V(()=>J(()=>import(`./Dashboard-CNB-enER.js`),__vite__mapDeps([17,1,3,4,5,9,14]))),Ae=V(Q),je=V(Z),Me=V(()=>J(()=>import(`./HelpPopup-sd9kGRO6.js`),__vite__mapDeps([18,3,1,4]))),Ne=V(()=>J(()=>import(`./ShortcutsPopup-B7lbUh3m.js`),__vite__mapDeps([19,4,1]))),Pe=V(()=>J(()=>import(`./FileViewer-Cl35TR1y.js`),__vite__mapDeps([20,1,2,3,4,21]))),Fe=V(()=>J(()=>import(`./ArtifactsPanel-CIwhZsnY.js`),__vite__mapDeps([22,1,3,4,7,5,21])));function Ie(){let e=_(e=>e.isSettingsOpen),t=_(e=>e.isSearchOpen),n=_(e=>e.isHelpOpen),r=_(e=>e.isShortcutsOpen),i=_(e=>e.viewingFilePath),a=_(e=>e.activeProvider);(0,o.useEffect)(()=>{document.documentElement.setAttribute(`data-provider`,a)},[a]);let s=u(re());(0,o.useEffect)(()=>{s||_.getState().setActiveProvider(`claude`)},[s]),(0,o.useEffect)(()=>{s!==_.getState().selectedSessionId&&_.getState().selectSession(s)},[s]),(0,o.useEffect)(()=>{C().then(e=>{Y(e.theme),_.getState().setShowProviderTag(e.show_provider_tag??!1)}).catch(()=>{}),O.getHostInfo().then(e=>_.getState().setHostInfo(e)).catch(()=>{}),O.getProviders().then(e=>_.getState().setProviders(e)).catch(()=>{})},[]),(0,o.useEffect)(()=>{X(),Z(),Q()},[]),(0,o.useEffect)(()=>{let e=`clau-decode:session-meta-migrated-v1`;if(h(e)===`1`)return;let t=[],n=[],r={};try{t=JSON.parse(localStorage.getItem(f.ARCHIVED)??`[]`)}catch{}try{n=JSON.parse(localStorage.getItem(f.STARRED)??`[]`)}catch{}if(r=p(f.VIEWED_AT),!(t.length>0||n.length>0||Object.keys(r).length>0)){localStorage.setItem(e,`1`);return}O.migrateLocalStorage({archived:t,starred:n,viewed_at:r}).then(()=>{localStorage.removeItem(f.ARCHIVED),localStorage.removeItem(f.STARRED),localStorage.removeItem(f.VIEWED_AT),localStorage.setItem(e,`1`),L()}).catch(e=>{console.warn(`session-meta migration failed; will retry on next load`,e)})},[]),(0,o.useEffect)(()=>{let e=fe({onRefresh:()=>y(`refresh`,void 0),onSessionAdopted:({old:e,new:t})=>{y(`refresh`,void 0),_.getState().selectedSessionId===e&&d(`/chat/${t}`)},onReconnect:()=>{y(`refresh`,void 0),L()},onSessionMeta:e=>{`title`in e&&y(`rename`,{id:e.id,title:e.title??``}),pe(e)},onSessionMetaBulkMigration:()=>{L()},onPtyInputAcknowledged:({session_id:e})=>y(`pty-input-acknowledged`,{session_id:e}),onPtyInputStalled:({session_id:e,elapsed_ms:t})=>y(`pty-input-stalled`,{session_id:e,elapsed_ms:t}),onPtySubmitCompleted:({session_id:e,kind:t,status:n,input_id:r,response_id:i})=>y(`pty-submit-completed`,{session_id:e,kind:t,status:n,input_id:r,response_id:i}),onPtyOutputChunk:({session_id:e,data_b64:t})=>y(`pty-output-chunk`,{session_id:e,data_b64:t}),onPtyNativeState:({session_id:e,state:t,decoded_input_safe:n})=>y(`pty-native-state`,{session_id:e,state:t,decoded_input_safe:n}),onEphemeralInputPersisted:({session_id:e,input_id:t,kind:n})=>y(`ephemeral-input-persisted`,{session_id:e,input_id:t,kind:n}),onEphemeralPairPersisted:({session_id:e,input_id:t,response_id:n,kind:r})=>y(`ephemeral-pair-persisted`,{session_id:e,input_id:t,response_id:n,kind:r})});return()=>e.close()},[]);let c=(0,o.useRef)(null);return(0,o.useEffect)(()=>{i?c.current===null&&(c.current=_.getState().sidebarCollapsed,_.getState().setSidebarCollapsed(!0)):c.current!==null&&(_.getState().setSidebarCollapsed(c.current),c.current=null)},[i]),(0,o.useEffect)(()=>{let e=e=>{if(e.key===`Escape`){let t=_.getState();(t.isSearchOpen||t.isSettingsOpen||t.isHelpOpen||t.isShortcutsOpen||t.viewingFilePath)&&(e.preventDefault(),t.closeSearch(),t.closeSettings(),t.closeHelp(),t.closeShortcuts(),t.setViewingFilePath(null));return}if(!(e.metaKey||e.ctrlKey)||e.repeat||H())return;let t=e.target?.tagName,n=e.ctrlKey&&!e.metaKey&&(t===`TEXTAREA`||t===`INPUT`);if(e.key===`k`){if(n)return;e.preventDefault(),_.getState().openSearch()}else if(e.key.toLowerCase()===`e`&&e.metaKey&&e.shiftKey)e.preventDefault(),_.getState().toggleExplorer();else if(e.key.toLowerCase()===`e`&&e.metaKey)e.preventDefault(),_.getState().toggleResultsExpanded();else if(e.key.toLowerCase()===`a`&&e.metaKey&&e.shiftKey)e.preventDefault(),_.getState().toggleArtifacts();else if(e.key.toLowerCase()===`b`&&e.metaKey)e.preventDefault(),_.getState().toggleSidebar();else if(e.key.toLowerCase()===`o`)e.preventDefault(),be();else if(e.code===`Comma`)e.preventDefault(),_.getState().openSettings();else if(e.code===`Slash`){if(n)return;e.preventDefault();let t=_.getState();t.isShortcutsOpen?t.closeShortcuts():t.openShortcuts()}};return document.addEventListener(`keydown`,e,{capture:!0}),()=>document.removeEventListener(`keydown`,e,{capture:!0})},[]),(0,z.jsxs)(`div`,{"data-provider":a,style:{display:`flex`,height:`100vh`,overflow:`hidden`,background:`var(--bg-base)`},children:[(0,z.jsxs)(o.Suspense,{fallback:(0,z.jsx)(K,{}),children:[(0,z.jsx)(De,{}),(0,z.jsx)(`div`,{style:{flex:1,display:`flex`,minWidth:200,overflow:`hidden`},children:(0,z.jsx)(B,{children:s?(0,z.jsx)(Oe,{}):(0,z.jsx)(ke,{})})}),s&&(0,z.jsx)(B,{children:(0,z.jsx)(o.Suspense,{fallback:null,children:(0,z.jsx)(Fe,{})})}),i&&(0,z.jsx)(B,{children:(0,z.jsx)(o.Suspense,{fallback:(0,z.jsx)(K,{}),children:(0,z.jsx)(Pe,{})})})]}),e&&(0,z.jsx)(B,{children:(0,z.jsx)(o.Suspense,{fallback:null,children:(0,z.jsx)(Ae,{})})}),t&&(0,z.jsx)(B,{children:(0,z.jsx)(o.Suspense,{fallback:null,children:(0,z.jsx)(je,{})})}),n&&(0,z.jsx)(B,{children:(0,z.jsx)(o.Suspense,{fallback:null,children:(0,z.jsx)(Me,{})})}),r&&(0,z.jsx)(B,{children:(0,z.jsx)(o.Suspense,{fallback:null,children:(0,z.jsx)(Ne,{})})}),(0,z.jsx)(we,{})]})}oe();var $=document.createElement(`style`);$.textContent=`@keyframes spin { to { transform: rotate(360deg) } }`,document.head.appendChild($),window.addEventListener(`keydown`,e=>{(e.metaKey||e.ctrlKey)&&(H()||(e.code===`KeyR`||e.code===`KeyJ`||e.key===`r`||e.key===`R`)&&(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),y(`refresh`,void 0)))},{capture:!0}),te.createRoot(document.getElementById(`root`)).render((0,z.jsx)(o.StrictMode,{children:(0,z.jsx)(B,{children:(0,z.jsx)(Ie,{})})}));export{m as _,me as a,ae as b,O as c,y as d,b as f,h as g,p as h,H as i,ce as l,f as m,ye as n,he as o,_ as p,xe as r,ge as s,G as t,C as u,g as v,d as x,ie as y}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/index-XPrlVfCr.js b/src/agent_decoder/static/assets/index-XPrlVfCr.js new file mode 100644 index 00000000..5677c21b --- /dev/null +++ b/src/agent_decoder/static/assets/index-XPrlVfCr.js @@ -0,0 +1,5 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ChatView-CFunVM15.js","assets/rolldown-runtime-QTnfLwEv.js","assets/hljs-CvdnYs1C.js","assets/ScrollContainer-CA7-aYqv.js","assets/react-CCIEwYL0.js","assets/sessionCache-Cj3FsbQ4.js","assets/ui-BVMZ0uWi.js","assets/useSessionDetail-D4HneaxZ.js","assets/nativePtyFonts-BxhRYj2G.js","assets/formatRelative-CavTjOcy.js","assets/ChatView-BrP-ENHg.css","assets/SearchOverlay-CF4dXG6x.js","assets/SessionItem-BUejVuL5.js","assets/shared-CAVcrZag.js","assets/renderSnippet-CcNMfZRd.js","assets/useDebounce-CRtjXm0i.js","assets/SettingsModal-DWSMRQmn.js","assets/Sidebar-CJcwJziw.js","assets/Runs-DvLUpR9O.js","assets/Runs-Y8oF-gxW.css","assets/Dashboard-CBe8ZXJ-.js","assets/HelpPopup-BYhBIvA6.js","assets/ShortcutsPopup-Df9bhfs6.js","assets/FileViewer-CVtveC8R.js","assets/fileType-BHvAriyJ.js","assets/ArtifactsPanel-D-CqWycU.js"])))=>i.map(i=>d[i]); +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,n,t as r}from"./react-CCIEwYL0.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var i=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},a=(e=>e?i(e):i),o=e(t(),1),s=e=>e;function c(e,t=s){let n=o.useSyncExternalStore(e.subscribe,o.useCallback(()=>t(e.getState()),[e,t]),o.useCallback(()=>t(e.getInitialState()),[e,t]));return o.useDebugValue(n),n}var l=e=>{let t=a(e),n=e=>c(t,e);return Object.assign(n,t),n},ee=(e=>e?l(e):l),te=e(n(),1);function u(){let e=window.location.hash.replace(/^#/,``)||`/`;if(e===`/runs`||e.startsWith(`/runs/`))return e;if(e.startsWith(`/chat/`)){let t=e.slice(6);if(t)return`/chat/${t}`}return`/`}function d(e){return e.startsWith(`/chat/`)?e.slice(6):null}function f(e){window.location.hash.replace(/^#/,``)!==e&&(window.location.hash=e)}function p(){let[e,t]=(0,o.useState)(u);return(0,o.useEffect)(()=>{let e=()=>t(u());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e}var m={STARRED:`clau-decode:starred`,RENAMED:`clau-decode:renamed`,ARCHIVED:`clau-decode:archived`,VIEWED_AT:`clau-decode:viewed-at`,FILE_VIEWER_WIDTH:`clau-decode:file-viewer-width`,ARTIFACTS_OPEN:`clau-decode:artifacts-open`,SIDEBAR_WIDTH:`clau-decode:sidebar-width`,READ_SESSIONS_LEGACY:`clau-decode:read-sessions`,LAST_SUBMIT_AT:`clau-decode:last-submit-at`};function h(e){try{return JSON.parse(localStorage.getItem(e)??`{}`)}catch{return{}}}function g(e,t){localStorage.setItem(e,JSON.stringify(t))}function _(e){return localStorage.getItem(e)}function v(e,t){localStorage.setItem(e,t)}function ne(e){let t=h(m.LAST_SUBMIT_AT);t[e]=String(Date.now()),g(m.LAST_SUBMIT_AT,t)}function re(e){let t=h(m.LAST_SUBMIT_AT)[e];if(!t)return null;let n=Number(t);return Number.isFinite(n)?n:null}function ie(){if(typeof window>`u`)return;let e=localStorage.getItem(m.READ_SESSIONS_LEGACY);if(e&&!localStorage.getItem(m.VIEWED_AT))try{let t=JSON.parse(e),n={};for(let e of t){let t=e.lastIndexOf(`:`);if(t<0)continue;let r=e.slice(0,t),i=e.slice(t+1);(!n[r]||i>n[r])&&(n[r]=i)}localStorage.setItem(m.VIEWED_AT,JSON.stringify(n))}catch{}}function ae(){if(typeof window>`u`)return null;let e=window.location.hash.replace(/^#/,``)||`/`;return d(e.startsWith(`/chat/`)?e:`/`)}var y=ee(e=>({selectedSessionId:ae(),selectedProjectId:null,pendingScrollMessageId:null,searchQuery:``,isSearchOpen:!1,isSettingsOpen:!1,isHelpOpen:!1,isShortcutsOpen:!1,sidebarCollapsed:!1,sidebarMode:`chat`,fileExplorerRoot:null,viewingFilePath:null,artifactsOpen:typeof window<`u`&&_(m.ARTIFACTS_OPEN)===`1`,sessionSortOrder:`recent`,showParentFolder:!1,blocksExpanded:!1,resultsExpanded:!1,profiles:[],activeProfileId:null,hostInfo:null,providers:null,activeProvider:`claude`,selectionMode:!1,selectedSessionIds:new Set,selectionAnchorId:null,setActiveProvider:t=>e({activeProvider:t}),setProviders:t=>e({providers:Object.fromEntries(t.map(e=>[e.name,e]))}),showProviderTag:!1,setShowProviderTag:t=>e({showProviderTag:t}),selectSession:t=>e({selectedSessionId:t}),setPendingScrollMessageId:t=>e({pendingScrollMessageId:t}),selectProject:t=>e({selectedProjectId:t}),setSearchQuery:t=>e({searchQuery:t}),openSearch:()=>e({isSearchOpen:!0}),closeSearch:()=>e({isSearchOpen:!1,searchQuery:``}),openSettings:()=>e({isSettingsOpen:!0}),closeSettings:()=>e({isSettingsOpen:!1}),openHelp:()=>e({isHelpOpen:!0}),closeHelp:()=>e({isHelpOpen:!1}),openShortcuts:()=>e({isShortcutsOpen:!0}),closeShortcuts:()=>e({isShortcutsOpen:!1}),toggleSidebar:()=>e(e=>({sidebarCollapsed:!e.sidebarCollapsed})),toggleExplorer:()=>e(e=>!e.sidebarCollapsed&&e.sidebarMode===`folder`?{sidebarMode:`chat`}:{sidebarCollapsed:!1,sidebarMode:`folder`}),setSidebarCollapsed:t=>e({sidebarCollapsed:t}),setSidebarMode:t=>e({sidebarMode:t}),setFileExplorerRoot:t=>e({fileExplorerRoot:t}),setViewingFilePath:t=>e({viewingFilePath:t}),toggleArtifacts:()=>e(e=>(v(m.ARTIFACTS_OPEN,e.artifactsOpen?`0`:`1`),{artifactsOpen:!e.artifactsOpen})),setSessionSortOrder:t=>e({sessionSortOrder:t}),setShowParentFolder:t=>e({showParentFolder:t}),toggleBlocksExpanded:()=>e(e=>({blocksExpanded:!e.blocksExpanded})),toggleResultsExpanded:()=>e(e=>({resultsExpanded:!e.resultsExpanded})),setProfiles:t=>e({profiles:t}),setActiveProfileId:t=>e({activeProfileId:t}),setHostInfo:t=>e({hostInfo:t}),enterSelectionMode:()=>e({selectionMode:!0,selectedSessionIds:new Set,selectionAnchorId:null}),exitSelectionMode:()=>e({selectionMode:!1,selectedSessionIds:new Set,selectionAnchorId:null}),toggleSessionSelected:t=>e(e=>{let n=new Set(e.selectedSessionIds);return n.has(t)?n.delete(t):n.add(t),{selectedSessionIds:n}}),clearSelection:()=>e({selectedSessionIds:new Set,selectionAnchorId:null}),setSelectedSessionIds:t=>e({selectedSessionIds:new Set(t)}),setSelectionAnchorId:t=>e({selectionAnchorId:t})})),b=`agent-decoder:`;function x(e,t){window.dispatchEvent(new CustomEvent(`${b}${e}`,{detail:t}))}function S(e,t){let n=e=>t(e.detail);return window.addEventListener(`${b}${e}`,n),()=>window.removeEventListener(`${b}${e}`,n)}var C=null,w=null;function oe(){return C}function T(){return w||(w=fetch(`/api/config`).then(e=>{if(!e.ok)throw Error(`GET /api/config → ${e.status}`);return e.json()}).then(e=>(C=e,e)).finally(()=>{w=null}),w)}async function E(e){let t=await fetch(e);if(!t.ok)throw Error(`GET ${e} → ${t.status}`);return t.json()}async function D(e,t){let n=await fetch(e,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error(`PUT ${e} → ${n.status}`);return n.json()}async function se(e,t){try{let t=await e.json();if(t&&typeof t.detail==`string`)return t.detail}catch{}return t}async function O(e,t){let n={method:`POST`};t!==void 0&&(n.headers={"Content-Type":`application/json`},n.body=JSON.stringify(t));let r=await fetch(e,n);if(!r.ok)throw Error(await se(r,`POST ${e} → ${r.status}`));return r.json()}function ce(e,t){let n=JSON.stringify(t);return typeof navigator<`u`&&typeof navigator.sendBeacon==`function`?navigator.sendBeacon(e,new Blob([n],{type:`application/json`})):(fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:n,keepalive:!0}).catch(()=>{}),!0)}function k(e){return fetch(e,{method:`DELETE`}).then(e=>{if(!e.ok)throw Error(`${e.status} ${e.statusText}`);return e.json()})}function le(e,t){return fetch(e,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}).then(e=>{if(!e.ok)throw Error(`${e.status} ${e.statusText}`);return e.json()})}var A={getRuns:(e=``)=>E(`/api/runs${e}`),getRun:e=>E(`/api/runs/${encodeURIComponent(e)}`),getProjects:()=>E(`/api/projects`),getProjectSessions:e=>E(`/api/projects/${encodeURIComponent(e)}/sessions`),getAllSessions:()=>E(`/api/sessions`),getSession:e=>E(`/api/sessions/${encodeURIComponent(e)}`),search:(e,t,n=50,r=0)=>{let i=new URLSearchParams({q:e,limit:String(n),offset:String(r)});return t&&i.set(`project`,t),E(`/api/search?${i}`)},getDashboard:()=>E(`/api/dashboard`),getHostInfo:()=>E(`/api/host-info`),getUpdateCheck:()=>E(`/api/update-check`),getProviders:()=>E(`/api/providers`),getConfig:()=>E(`/api/config`),updateConfig:e=>(C=e,x(`config-updated`,e),D(`/api/config`,e)),refresh:()=>O(`/api/refresh`),revealSession:e=>O(`/api/sessions/${encodeURIComponent(e)}/reveal`),openTerminal:e=>O(`/api/sessions/${encodeURIComponent(e)}/open-terminal`),getDailyAnalytics:()=>E(`/api/analytics/daily`),getPricingTable:()=>E(`/api/pricing`),getToolUsage:()=>E(`/api/analytics/tools`),getFileTouches:()=>E(`/api/analytics/files`),deleteMessage:e=>k(`/api/messages/${e}`),patchMessage:(e,t)=>le(`/api/messages/${e}`,{content_blocks:t}),getProfiles:()=>E(`/api/profiles`),createProfile:(e,t,n)=>(C=null,O(`/api/profiles`,{name:e,data_paths:t||[`~/.claude`],color:n||`#b8956a`})),updateProfile:(e,t)=>(C=null,D(`/api/profiles/${encodeURIComponent(e)}`,t)),deleteProfile:e=>(C=null,k(`/api/profiles/${encodeURIComponent(e)}`)),setActiveProfile:e=>(C=null,D(`/api/profiles/active`,{active_profile_id:e})),listDir:(e,t=!1)=>{let n=new URLSearchParams({path:e});return t&&n.set(`show_hidden`,`true`),E(`/api/fs/list?${n}`)},readFile:e=>E(`/api/fs/read?${new URLSearchParams({path:e})}`),writeFile:(e,t)=>D(`/api/fs/write`,{path:e,content:t}),exportSession:(e,t)=>fetch(`/api/sessions/${encodeURIComponent(e)}/export?format=${t}`).then(e=>{if(!e.ok)throw Error(`Export failed: ${e.status}`);let n=(e.headers.get(`content-disposition`)||``).match(/filename="([^"]+)"/),r=n?n[1]:`session.${t}`;return e.blob().then(e=>({blob:e,filename:r}))}),getRunnerStatuses:e=>E(`/api/runner-status?ids=${e.map(encodeURIComponent).join(`,`)}`),generateRecap:e=>O(`/api/sessions/${encodeURIComponent(e)}/recap`),listRecaps:(e,t)=>{let n=new URLSearchParams;t?.includeDismissed&&n.set(`include_dismissed`,`true`);let r=n.toString();return E(`/api/sessions/${encodeURIComponent(e)}/recaps${r?`?${r}`:``}`)},dismissRecap:(e,t)=>O(`/api/sessions/${encodeURIComponent(e)}/recaps/${t}/dismiss`),setSessionTitle:(e,t)=>D(`/api/sessions/${encodeURIComponent(e)}/title`,{title:t}),setArchived:(e,t)=>D(`/api/sessions/${encodeURIComponent(e)}/archived`,{archived:t}),setStarred:(e,t)=>D(`/api/sessions/${encodeURIComponent(e)}/starred`,{starred:t}),setViewedAt:(e,t)=>D(`/api/sessions/${encodeURIComponent(e)}/viewed`,{viewed_at:t}),migrateLocalStorage:e=>O(`/api/sessions/migrate-localstorage`,e),deleteSessions:e=>O(`/api/sessions/delete`,{session_ids:e}),newSession:e=>O(`/api/sessions/new`,e??{}),ptyFocus:(e,t,n)=>O(`/api/pty/focus`,{session_id:e,...t?{model:t}:{},...n?{rows:n}:{}}),ptyBlur:e=>O(`/api/pty/blur`,{session_id:e}),ptySubmit:(e,t,n)=>O(`/api/pty/submit`,{session_id:e,content:t,...n?{model:n}:{}}),ptyKill:e=>O(`/api/pty/kill`,{session_id:e}),ptyKillKeepalive:e=>ce(`/api/pty/kill`,{session_id:e}),ptyStatus:e=>E(`/api/pty/status?${new URLSearchParams({session_id:e})}`),ptyNativeSnapshot:e=>E(`/api/pty/native-snapshot?${new URLSearchParams({session_id:e})}`),ptyInput:(e,t)=>O(`/api/pty/input`,{session_id:e,data:t}),ptyResize:(e,t,n)=>O(`/api/pty/resize`,{session_id:e,rows:t,cols:n}),ptyOwnership:e=>E(`/api/pty/ownership/${encodeURIComponent(e)}`),ptyTakeover:e=>O(`/api/pty/takeover/${encodeURIComponent(e)}`,{}),ptyEphemerals:e=>E(`/api/sessions/${encodeURIComponent(e)}/ephemerals`)};function ue(e){let t=typeof e==`function`?{onRefresh:e}:e,n=new EventSource(`/api/events`);n.addEventListener(`message`,e=>{try{let n=JSON.parse(e.data);if(n.type===`refresh`)t.onRefresh();else if(n.type===`session_adopted`){let e=n;t.onSessionAdopted?t.onSessionAdopted({old:e.old,new:e.new}):console.debug(`[SSE] session_adopted (no handler)`,e)}else if(n.type===`session-meta`){let e=n;t.onSessionMeta?.({id:e.id,...`title`in e?{title:e.title}:{},...`archived_at`in e?{archived_at:e.archived_at}:{},...`starred_at`in e?{starred_at:e.starred_at}:{},...`viewed_at`in e?{viewed_at:e.viewed_at}:{}})}else if(n.type===`session-meta-bulk-migration`){let e=n;t.onSessionMetaBulkMigration?.({applied:e.applied})}else if(n.type===`pty_idle_warn`){let e=n;t.onPtyIdleWarn?t.onPtyIdleWarn({session_id:e.session_id,kill_in_seconds:e.kill_in_seconds}):console.debug(`[SSE] pty_idle_warn (no handler)`,e)}else if(n.type===`auth_required`){let e=n;t.onAuthRequired?t.onAuthRequired({session_id:e.session_id}):console.debug(`[SSE] auth_required (no handler)`,e)}else if(n.type===`trust_required`){let e=n;t.onTrustRequired?t.onTrustRequired({session_id:e.session_id,cwd:e.cwd}):console.debug(`[SSE] trust_required (no handler)`,e)}else if(n.type===`stuck_session`){let e=n;t.onStuckSession?t.onStuckSession({session_id:e.session_id}):console.debug(`[SSE] stuck_session (no handler)`,e)}else if(n.type===`pty_input_acknowledged`){let e=n;t.onPtyInputAcknowledged?t.onPtyInputAcknowledged({session_id:e.session_id}):console.debug(`[SSE] pty_input_acknowledged (no handler)`,e)}else if(n.type===`pty_input_stalled`){let e=n;t.onPtyInputStalled?t.onPtyInputStalled({session_id:e.session_id,elapsed_ms:e.elapsed_ms}):console.debug(`[SSE] pty_input_stalled (no handler)`,e)}else if(n.type===`pty_submit_completed`){let e=n;t.onPtySubmitCompleted?t.onPtySubmitCompleted({session_id:e.session_id,kind:e.kind,status:e.status,input_id:e.input_id,response_id:e.response_id}):console.debug(`[SSE] pty_submit_completed (no handler)`,e)}else if(n.type===`pty_output_chunk`){let e=n;t.onPtyOutputChunk?t.onPtyOutputChunk({session_id:e.session_id,data_b64:e.data_b64}):console.debug(`[SSE] pty_output_chunk (no handler)`,e)}else if(n.type===`pty_native_state`){let e=n;t.onPtyNativeState?t.onPtyNativeState({session_id:e.session_id,state:e.state,decoded_input_safe:e.decoded_input_safe}):console.debug(`[SSE] pty_native_state (no handler)`,e)}else if(n.type===`ephemeral_input_persisted`){let e=n;t.onEphemeralInputPersisted?t.onEphemeralInputPersisted({session_id:e.session_id,input_id:e.input_id,kind:e.kind}):console.debug(`[SSE] ephemeral_input_persisted (no handler)`,e)}else if(n.type===`ephemeral_pair_persisted`){let e=n;t.onEphemeralPairPersisted?t.onEphemeralPairPersisted({session_id:e.session_id,input_id:e.input_id,response_id:e.response_id,kind:e.kind}):console.debug(`[SSE] ephemeral_pair_persisted (no handler)`,e)}}catch{}});let r=!1;return n.addEventListener(`open`,()=>{r&&t.onReconnect?.(),r=!0}),n}var j=new Set,M=new Set,N=new Map,P=`idle`,F=new Set;function I(){for(let e of F)e()}async function L(){if(P===`idle`){P=`in-flight`;try{let e=await A.getAllSessions(),t=new Set,n=new Set,r=new Map;for(let i of e)i.archived_at&&t.add(i.id),i.starred_at&&n.add(i.id),i.viewed_at&&r.set(i.id,i.viewed_at);j=t,M=n,N=r,P=`ready`,I()}catch(e){P=`idle`,console.warn(`sessionMeta bootstrap failed`,e)}}}function R(e){return F.add(e),P===`idle`&&L(),()=>{F.delete(e)}}function de(e){let t=!1;if(`archived_at`in e){let n=j.has(e.id);e.archived_at==null&&n?(j=new Set(j),j.delete(e.id),t=!0):e.archived_at!=null&&!n&&(j=new Set(j),j.add(e.id),t=!0)}if(`starred_at`in e){let n=M.has(e.id);e.starred_at==null&&n?(M=new Set(M),M.delete(e.id),t=!0):e.starred_at!=null&&!n&&(M=new Set(M),M.add(e.id),t=!0)}`viewed_at`in e&&(N.get(e.id)??null)!==e.viewed_at&&(N=new Map(N),e.viewed_at==null?N.delete(e.id):N.set(e.id,e.viewed_at),t=!0),t&&I()}async function z(){P=`idle`,await L()}function B(e,t,n){let r=(0,o.useSyncExternalStore)(R,e,e),i=(n,r)=>{let i=new Set(e());r?i.add(n):i.delete(n),t(i),I()},a=(n,r)=>{let i=new Set(e());r?i.add(n):i.delete(n),t(i),I()};return{ids:r,has:e=>r.has(e),toggle:t=>{let r=e().has(t),o=!r;i(t,o),n(t,o).catch(e=>{console.warn(`sessionMeta toggle failed; rolling back`,e),a(t,r)})},add:t=>{e().has(t)||(i(t,!0),n(t,!0).catch(e=>{console.warn(`sessionMeta add failed; rolling back`,e),a(t,!1)}))},remove:t=>{e().has(t)&&(i(t,!1),n(t,!1).catch(e=>{console.warn(`sessionMeta remove failed; rolling back`,e),a(t,!0)}))}}}function fe(){return B(()=>j,e=>{j=e},(e,t)=>A.setArchived(e,t))}function pe(){return B(()=>M,e=>{M=e},(e,t)=>A.setStarred(e,t))}function me(){let e=(0,o.useSyncExternalStore)(R,()=>N,()=>N);return{map:e,get:t=>e.get(t)??null,set:(e,t)=>{let n=N.get(e)??null,r=new Map(N);r.set(e,t),N=r,I(),A.setViewedAt(e,t).catch(t=>{console.warn(`sessionMeta setViewed failed; rolling back`,t);let r=new Map(N);n==null?r.delete(e):r.set(e,n),N=r,I()})},clear:e=>{if(!N.has(e))return;let t=N.get(e)??null,n=new Map(N);n.delete(e),N=n,I(),A.setViewedAt(e,null).catch(n=>{console.warn(`sessionMeta clearViewed failed; rolling back`,n);let r=new Map(N);t!=null&&r.set(e,t),N=r,I()})}}}var V=r(),H=class extends o.Component{constructor(e){super(e),this.state={hasError:!1,error:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`[ErrorBoundary]`,e,t.componentStack)}render(){return this.state.hasError?this.props.fallback?this.props.fallback:(0,V.jsxs)(`div`,{style:{padding:`24px`,color:`#ef4444`,fontFamily:`monospace`,fontSize:`13px`,whiteSpace:`pre-wrap`},children:[(0,V.jsx)(`strong`,{children:`Render error`}),` +`,this.state.error?.message,` + +`,(0,V.jsx)(`button`,{style:{padding:`6px 12px`,cursor:`pointer`,border:`1px solid #ef4444`,background:`none`,color:`#ef4444`,borderRadius:`4px`},onClick:()=>this.setState({hasError:!1,error:null}),children:`Retry`})]}):this.props.children}};function he(e){if(!(e instanceof Error))return!1;if(e.name===`ChunkLoadError`)return!0;let t=e.message||``;return/Failed to fetch dynamically imported module/i.test(t)||/Loading chunk \S+ failed/i.test(t)||/Failed to load module script/i.test(t)||/Importing a module script failed/i.test(t)}function ge(){return(0,V.jsxs)(`div`,{role:`alert`,style:{padding:`24px`,fontFamily:`var(--font-ui)`,fontSize:`13px`,color:`var(--text-primary)`,background:`var(--bg-modal)`,borderRadius:`var(--radius-lg)`,maxWidth:`420px`,margin:`40px auto`,boxShadow:`var(--shadow-lg)`},children:[(0,V.jsx)(`strong`,{style:{display:`block`,marginBottom:`8px`},children:`Update required`}),(0,V.jsx)(`p`,{style:{margin:`0 0 16px`,color:`var(--text-secondary)`},children:`This part of the app couldn't load — usually because a newer build is on the server and your browser is holding a stale reference. Reload to pick up the latest version.`}),(0,V.jsx)(`button`,{type:`button`,onClick:()=>window.location.reload(),style:{padding:`6px 14px`,cursor:`pointer`,border:`1px solid var(--border-subtle)`,background:`var(--bg-button)`,color:`var(--text-primary)`,borderRadius:`var(--radius-sm)`,fontSize:`13px`},children:`Reload`})]})}function U(e){return o.lazy(()=>e().catch(e=>{if(he(e))return{default:ge};throw e}))}function W(){return typeof document>`u`?!1:!!document.activeElement?.closest?.(`[data-testid="native-terminal-host"]`)}var G=!1,K=new Set;function _e(){return G}function ve(){G=!G,K.forEach(e=>e(G))}function ye(e){return K.add(e),()=>K.delete(e)}function q({width:e=`120px`,color:t=`var(--accent-orange)`,label:n}){return(0,V.jsxs)(`svg`,{role:n?`img`:`presentation`,"aria-label":n,"aria-hidden":n?void 0:!0,fill:`none`,viewBox:`737 455 450 130`,xmlns:`http://www.w3.org/2000/svg`,style:{width:e,height:`auto`,color:t,display:`block`},children:[(0,V.jsxs)(`g`,{opacity:`0.25`,children:[(0,V.jsx)(`animate`,{repeatCount:`indefinite`,attributeName:`opacity`,dur:`1.35s`,begin:`0s`,fill:`freeze`,values:`0.25; 1; 0.25; 0.25`,keyTimes:`0; 0.17284; 0.37037; 1`,keySplines:`0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,calcMode:`spline`}),(0,V.jsxs)(`g`,{transform:`translate(782,540)`,children:[(0,V.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`translate`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`782 540; 782 500; 782 540; 782 540`,keyTimes:`0; 0.17284; 0.37037; 1`,keySplines:`0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,V.jsxs)(`g`,{transform:`scale(0.5,0.5)`,children:[(0,V.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`scale`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`0.5 0.5; 0.75 0.75; 0.5 0.5; 0.5 0.5`,keyTimes:`0; 0.17284; 0.37037; 1`,keySplines:`0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,V.jsx)(`ellipse`,{ry:`60`,rx:`60`,cy:`0`,cx:`0`,fill:`currentColor`})]})]})]}),(0,V.jsxs)(`g`,{opacity:`0.25`,children:[(0,V.jsx)(`animate`,{repeatCount:`indefinite`,attributeName:`opacity`,dur:`1.35s`,begin:`0s`,fill:`freeze`,values:`0.25; 0.25; 1; 0.25; 0.25`,keyTimes:`0; 0.111111; 0.283951; 0.481481; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,calcMode:`spline`}),(0,V.jsxs)(`g`,{transform:`translate(902,540)`,children:[(0,V.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`translate`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`902 540; 902 540; 902 500; 902 540; 902 540`,keyTimes:`0; 0.111111; 0.283951; 0.481481; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,V.jsxs)(`g`,{transform:`scale(0.5,0.5)`,children:[(0,V.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`scale`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`0.5 0.5; 0.5 0.5; 0.75 0.75; 0.5 0.5; 0.5 0.5`,keyTimes:`0; 0.111111; 0.283951; 0.481481; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,V.jsx)(`ellipse`,{ry:`60`,rx:`60`,cy:`0`,cx:`0`,fill:`currentColor`})]})]})]}),(0,V.jsxs)(`g`,{opacity:`0.25`,children:[(0,V.jsx)(`animate`,{repeatCount:`indefinite`,attributeName:`opacity`,dur:`1.35s`,begin:`0s`,fill:`freeze`,values:`0.25; 0.25; 1; 0.25; 0.25`,keyTimes:`0; 0.209877; 0.382716; 0.580247; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,calcMode:`spline`}),(0,V.jsxs)(`g`,{transform:`translate(1022,540)`,children:[(0,V.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`translate`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`1022 540; 1022 540; 1022 500; 1022 540; 1022 540`,keyTimes:`0; 0.209876; 0.382716; 0.580247; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,V.jsxs)(`g`,{transform:`scale(0.5,0.5)`,children:[(0,V.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`scale`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`0.5 0.5; 0.5 0.5; 0.75 0.75; 0.5 0.5; 0.5 0.5`,keyTimes:`0; 0.209876; 0.382716; 0.580247; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,V.jsx)(`ellipse`,{ry:`60`,rx:`60`,cy:`0`,cx:`0`,fill:`currentColor`})]})]})]}),(0,V.jsxs)(`g`,{opacity:`0.25`,children:[(0,V.jsx)(`animate`,{repeatCount:`indefinite`,attributeName:`opacity`,dur:`1.35s`,begin:`0s`,fill:`freeze`,values:`0.25; 0.25; 1; 0.25; 0.25`,keyTimes:`0; 0.308642; 0.481482; 0.679012; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,calcMode:`spline`}),(0,V.jsxs)(`g`,{transform:`translate(1142,540)`,children:[(0,V.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`translate`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`1142 540; 1142 540; 1142 500; 1142 540; 1142 540`,keyTimes:`0; 0.308642; 0.481482; 0.679013; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,V.jsxs)(`g`,{transform:`scale(0.5,0.5)`,children:[(0,V.jsx)(`animateTransform`,{repeatCount:`indefinite`,type:`scale`,attributeName:`transform`,dur:`1.35s`,begin:`0s`,calcMode:`spline`,values:`0.5 0.5; 0.5 0.5; 0.75 0.75; 0.5 0.5; 0.5 0.5`,keyTimes:`0; 0.308642; 0.481482; 0.679013; 1`,keySplines:`0 0 1 1; 0.333 0 0.667 1; 0.333 0 0.667 1; 0 0 1 1`,fill:`freeze`}),(0,V.jsx)(`ellipse`,{ry:`60`,rx:`60`,cy:`0`,cx:`0`,fill:`currentColor`})]})]})]})]})}function J({delay:e=200}){let[t,n]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{let t=window.setTimeout(()=>n(!0),e);return()=>window.clearTimeout(t)},[e]),t?(0,V.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`16px`},children:(0,V.jsx)(q,{width:`20px`,label:`Loading`})}):null}var be=5e3,xe=0;function Se(){let[e,t]=(0,o.useState)([]);return(0,o.useEffect)(()=>S(`toast`,({message:e,kind:n})=>{let r=xe++;t(t=>[...t,{id:r,message:e,kind:n??`info`}]),setTimeout(()=>{t(e=>e.filter(e=>e.id!==r))},be)}),[]),e.length===0?null:(0,V.jsx)(`div`,{style:{position:`fixed`,bottom:20,left:`50%`,transform:`translateX(-50%)`,display:`flex`,flexDirection:`column`,gap:8,zIndex:9999,pointerEvents:`none`,maxWidth:`min(90vw, 480px)`},children:e.map(e=>(0,V.jsx)(`div`,{role:`status`,onClick:()=>t(t=>t.filter(t=>t.id!==e.id)),style:{pointerEvents:`auto`,cursor:`pointer`,minWidth:260,padding:`11px 15px`,borderRadius:`var(--radius-md)`,fontSize:13,lineHeight:1.45,color:e.kind===`error`?`var(--tool-error-text)`:`var(--text-primary)`,background:`var(--bg-modal)`,border:`1px solid ${e.kind===`error`?`var(--tool-error-border)`:`var(--border-default)`}`,boxShadow:`var(--shadow-lg)`},children:e.message},e.id))})}var Ce=`modulepreload`,we=function(e){return`/`+e},Y={},X=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=we(t,n),t in Y)return;Y[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Ce,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function Z(e){e===`dark`?document.documentElement.setAttribute(`data-theme`,`dark`):e===`light`?document.documentElement.setAttribute(`data-theme`,`light`):(document.documentElement.removeAttribute(`data-theme`),window.matchMedia(`(prefers-color-scheme: dark)`).matches&&document.documentElement.setAttribute(`data-theme`,`dark`))}window.__agentDecoderApplyTheme=Z;var Q=()=>X(()=>import(`./ChatView-CFunVM15.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])),$=()=>X(()=>import(`./SearchOverlay-CF4dXG6x.js`),__vite__mapDeps([11,1,3,4,5,12,6,13,9,14,15])),Te=()=>X(()=>import(`./SettingsModal-DWSMRQmn.js`),__vite__mapDeps([16,1,3,4,13,8])),Ee=U(()=>X(()=>import(`./Sidebar-CJcwJziw.js`),__vite__mapDeps([17,1,3,4,6,12,5,13,9]))),De=U(Q),Oe=U(()=>X(()=>import(`./Runs-DvLUpR9O.js`),__vite__mapDeps([18,1,4,15,19]))),ke=U(()=>X(()=>import(`./Dashboard-CBe8ZXJ-.js`),__vite__mapDeps([20,1,3,4,5,9,14,15]))),Ae=U(Te),je=U($),Me=U(()=>X(()=>import(`./HelpPopup-BYhBIvA6.js`),__vite__mapDeps([21,3,1,4]))),Ne=U(()=>X(()=>import(`./ShortcutsPopup-Df9bhfs6.js`),__vite__mapDeps([22,4,1]))),Pe=U(()=>X(()=>import(`./FileViewer-CVtveC8R.js`),__vite__mapDeps([23,1,2,3,4,24]))),Fe=U(()=>X(()=>import(`./ArtifactsPanel-D-CqWycU.js`),__vite__mapDeps([25,1,3,4,7,5,24])));function Ie(){let e=y(e=>e.isSettingsOpen),t=y(e=>e.isSearchOpen),n=y(e=>e.isHelpOpen),r=y(e=>e.isShortcutsOpen),i=y(e=>e.viewingFilePath),a=y(e=>e.activeProvider);(0,o.useEffect)(()=>{document.documentElement.setAttribute(`data-provider`,a)},[a]);let s=p(),c=d(s);(0,o.useEffect)(()=>{c||y.getState().setActiveProvider(`claude`)},[c]),(0,o.useEffect)(()=>{c!==y.getState().selectedSessionId&&y.getState().selectSession(c)},[c]),(0,o.useEffect)(()=>{T().then(e=>{Z(e.theme),y.getState().setShowProviderTag(e.show_provider_tag??!1)}).catch(()=>{}),A.getHostInfo().then(e=>y.getState().setHostInfo(e)).catch(()=>{}),A.getProviders().then(e=>y.getState().setProviders(e)).catch(()=>{})},[]),(0,o.useEffect)(()=>{Q(),$(),Te()},[]),(0,o.useEffect)(()=>{let e=`clau-decode:session-meta-migrated-v1`;if(_(e)===`1`)return;let t=[],n=[],r={};try{t=JSON.parse(localStorage.getItem(m.ARCHIVED)??`[]`)}catch{}try{n=JSON.parse(localStorage.getItem(m.STARRED)??`[]`)}catch{}if(r=h(m.VIEWED_AT),!(t.length>0||n.length>0||Object.keys(r).length>0)){localStorage.setItem(e,`1`);return}A.migrateLocalStorage({archived:t,starred:n,viewed_at:r}).then(()=>{localStorage.removeItem(m.ARCHIVED),localStorage.removeItem(m.STARRED),localStorage.removeItem(m.VIEWED_AT),localStorage.setItem(e,`1`),z()}).catch(e=>{console.warn(`session-meta migration failed; will retry on next load`,e)})},[]),(0,o.useEffect)(()=>{let e=ue({onRefresh:()=>x(`refresh`,void 0),onSessionAdopted:({old:e,new:t})=>{x(`refresh`,void 0),y.getState().selectedSessionId===e&&f(`/chat/${t}`)},onReconnect:()=>{x(`refresh`,void 0),z()},onSessionMeta:e=>{`title`in e&&x(`rename`,{id:e.id,title:e.title??``}),de(e)},onSessionMetaBulkMigration:()=>{z()},onPtyInputAcknowledged:({session_id:e})=>x(`pty-input-acknowledged`,{session_id:e}),onPtyInputStalled:({session_id:e,elapsed_ms:t})=>x(`pty-input-stalled`,{session_id:e,elapsed_ms:t}),onPtySubmitCompleted:({session_id:e,kind:t,status:n,input_id:r,response_id:i})=>x(`pty-submit-completed`,{session_id:e,kind:t,status:n,input_id:r,response_id:i}),onPtyOutputChunk:({session_id:e,data_b64:t})=>x(`pty-output-chunk`,{session_id:e,data_b64:t}),onPtyNativeState:({session_id:e,state:t,decoded_input_safe:n})=>x(`pty-native-state`,{session_id:e,state:t,decoded_input_safe:n}),onEphemeralInputPersisted:({session_id:e,input_id:t,kind:n})=>x(`ephemeral-input-persisted`,{session_id:e,input_id:t,kind:n}),onEphemeralPairPersisted:({session_id:e,input_id:t,response_id:n,kind:r})=>x(`ephemeral-pair-persisted`,{session_id:e,input_id:t,response_id:n,kind:r})});return()=>e.close()},[]);let l=(0,o.useRef)(null);return(0,o.useEffect)(()=>{i?l.current===null&&(l.current=y.getState().sidebarCollapsed,y.getState().setSidebarCollapsed(!0)):l.current!==null&&(y.getState().setSidebarCollapsed(l.current),l.current=null)},[i]),(0,o.useEffect)(()=>{let e=e=>{if(e.key===`Escape`){let t=y.getState();(t.isSearchOpen||t.isSettingsOpen||t.isHelpOpen||t.isShortcutsOpen||t.viewingFilePath)&&(e.preventDefault(),t.closeSearch(),t.closeSettings(),t.closeHelp(),t.closeShortcuts(),t.setViewingFilePath(null));return}if(!(e.metaKey||e.ctrlKey)||e.repeat||W())return;let t=e.target?.tagName,n=e.ctrlKey&&!e.metaKey&&(t===`TEXTAREA`||t===`INPUT`);if(e.key===`k`){if(n)return;e.preventDefault(),y.getState().openSearch()}else if(e.key.toLowerCase()===`e`&&e.metaKey&&e.shiftKey)e.preventDefault(),y.getState().toggleExplorer();else if(e.key.toLowerCase()===`e`&&e.metaKey)e.preventDefault(),y.getState().toggleResultsExpanded();else if(e.key.toLowerCase()===`a`&&e.metaKey&&e.shiftKey)e.preventDefault(),y.getState().toggleArtifacts();else if(e.key.toLowerCase()===`b`&&e.metaKey)e.preventDefault(),y.getState().toggleSidebar();else if(e.key.toLowerCase()===`o`)e.preventDefault(),ve();else if(e.code===`Comma`)e.preventDefault(),y.getState().openSettings();else if(e.code===`Slash`){if(n)return;e.preventDefault();let t=y.getState();t.isShortcutsOpen?t.closeShortcuts():t.openShortcuts()}};return document.addEventListener(`keydown`,e,{capture:!0}),()=>document.removeEventListener(`keydown`,e,{capture:!0})},[]),(0,V.jsxs)(`div`,{"data-provider":a,style:{display:`flex`,height:`100vh`,overflow:`hidden`,background:`var(--bg-base)`},children:[(0,V.jsxs)(o.Suspense,{fallback:(0,V.jsx)(J,{}),children:[(0,V.jsx)(Ee,{}),(0,V.jsx)(`div`,{style:{flex:1,display:`flex`,minWidth:200,overflow:`hidden`},children:(0,V.jsx)(H,{children:s.startsWith(`/runs`)?(0,V.jsx)(Oe,{}):c?(0,V.jsx)(De,{}):(0,V.jsx)(ke,{})})}),c&&(0,V.jsx)(H,{children:(0,V.jsx)(o.Suspense,{fallback:null,children:(0,V.jsx)(Fe,{})})}),i&&(0,V.jsx)(H,{children:(0,V.jsx)(o.Suspense,{fallback:(0,V.jsx)(J,{}),children:(0,V.jsx)(Pe,{})})})]}),e&&(0,V.jsx)(H,{children:(0,V.jsx)(o.Suspense,{fallback:null,children:(0,V.jsx)(Ae,{})})}),t&&(0,V.jsx)(H,{children:(0,V.jsx)(o.Suspense,{fallback:null,children:(0,V.jsx)(je,{})})}),n&&(0,V.jsx)(H,{children:(0,V.jsx)(o.Suspense,{fallback:null,children:(0,V.jsx)(Me,{})})}),r&&(0,V.jsx)(H,{children:(0,V.jsx)(o.Suspense,{fallback:null,children:(0,V.jsx)(Ne,{})})}),(0,V.jsx)(Se,{})]})}ie();var Le=document.createElement(`style`);Le.textContent=`@keyframes spin { to { transform: rotate(360deg) } }`,document.head.appendChild(Le),window.addEventListener(`keydown`,e=>{(e.metaKey||e.ctrlKey)&&(W()||(e.code===`KeyR`||e.code===`KeyJ`||e.key===`r`||e.key===`R`)&&(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),x(`refresh`,void 0)))},{capture:!0}),te.createRoot(document.getElementById(`root`)).render((0,V.jsx)(o.StrictMode,{children:(0,V.jsx)(H,{children:(0,V.jsx)(Ie,{})})}));export{p as S,g as _,fe as a,re as b,A as c,x as d,S as f,_ as g,h,W as i,oe as l,m,_e as n,pe as o,y as p,ye as r,me as s,q as t,T as u,v,f as x,ne as y}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/renderSnippet-B37VxZaL.js b/src/agent_decoder/static/assets/renderSnippet-B37VxZaL.js deleted file mode 100644 index 1f4dc4e1..00000000 --- a/src/agent_decoder/static/assets/renderSnippet-B37VxZaL.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";var r=e(t(),1);function i(e,t){let[n,i]=(0,r.useState)(e);return(0,r.useEffect)(()=>{let n=setTimeout(()=>i(e),t);return()=>clearTimeout(n)},[e,t]),n}var a=n();function o(e){return e.split(/|<\/b>/).map((e,t)=>t%2==1?(0,a.jsx)(`strong`,{children:e},t):(0,a.jsx)(r.Fragment,{children:e},t))}export{i as n,o as t}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/renderSnippet-CcNMfZRd.js b/src/agent_decoder/static/assets/renderSnippet-CcNMfZRd.js new file mode 100644 index 00000000..f0466947 --- /dev/null +++ b/src/agent_decoder/static/assets/renderSnippet-CcNMfZRd.js @@ -0,0 +1 @@ +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t,t as n}from"./react-CCIEwYL0.js";var r=e(t(),1),i=n();function a(e){return e.split(/|<\/b>/).map((e,t)=>t%2==1?(0,i.jsx)(`strong`,{children:e},t):(0,i.jsx)(r.Fragment,{children:e},t))}export{a as t}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/useDebounce-CRtjXm0i.js b/src/agent_decoder/static/assets/useDebounce-CRtjXm0i.js new file mode 100644 index 00000000..7d6f8894 --- /dev/null +++ b/src/agent_decoder/static/assets/useDebounce-CRtjXm0i.js @@ -0,0 +1 @@ +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t}from"./react-CCIEwYL0.js";var n=e(t(),1);function r(e,t){let[r,i]=(0,n.useState)(e);return(0,n.useEffect)(()=>{let n=setTimeout(()=>i(e),t);return()=>clearTimeout(n)},[e,t]),r}export{r as t}; \ No newline at end of file diff --git a/src/agent_decoder/static/assets/useSessionDetail-BayJI-iv.js b/src/agent_decoder/static/assets/useSessionDetail-D4HneaxZ.js similarity index 92% rename from src/agent_decoder/static/assets/useSessionDetail-BayJI-iv.js rename to src/agent_decoder/static/assets/useSessionDetail-D4HneaxZ.js index a4137367..6831c626 100644 --- a/src/agent_decoder/static/assets/useSessionDetail-BayJI-iv.js +++ b/src/agent_decoder/static/assets/useSessionDetail-D4HneaxZ.js @@ -1 +1 @@ -import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t}from"./react-CCIEwYL0.js";import{c as n,f as r}from"./index-Egnd1H3-.js";import{a as i,n as a,r as o,t as s}from"./sessionCache-Cj3FsbQ4.js";var c=e(t(),1),l=/<[a-z][a-z0-9-]*>[\s\S]*?<\/[a-z][a-z0-9-]*>/g;function u(e){let t=e instanceof Error?e.message:String(e);/→\s*404\b/.test(t)||console.error(e)}function d(e){return e.some(e=>e.type===`text`?e.text.replace(l,``).trim().length>0:!1)}function f(e){if(e.length===0)return!1;let t=e[e.length-1];return t.kind===`command`?!1:t.kind===`user`?d(t.message.content_blocks):!t.messages[t.messages.length-1].content_blocks.some(e=>e.type===`text`)}function p(e){let t=a(e),[l,d]=(0,c.useState)(t??null),[f,p]=(0,c.useState)(!t),[m,h]=(0,c.useState)([]),g=(0,c.useCallback)((t=!1)=>{n.ptyEphemerals(e).then(h).catch(()=>{t&&h([])})},[e]);(0,c.useEffect)(()=>{let t=a(e);t?(d(t),p(!1)):(p(!0),d(null)),s(e,n.getSession).then(e=>{d(e),p(!1)}).catch(u)},[e]),(0,c.useEffect)(()=>{g(!0)},[g]);let _=(0,c.useRef)(0);return(0,c.useEffect)(()=>r(`refresh`,()=>{o(e);let t=++_.current;n.getSession(e).then(n=>{t===_.current&&(i(e,n),d(n))}).catch(u)}),[e]),(0,c.useEffect)(()=>r(`session-mutated`,t=>{t===e&&(o(e),n.getSession(e).then(t=>{i(e,t),d(t)}).catch(u))}),[e]),(0,c.useEffect)(()=>r(`ephemeral-input-persisted`,({session_id:t})=>{t===e&&g()}),[e,g]),(0,c.useEffect)(()=>r(`ephemeral-pair-persisted`,({session_id:t})=>{t===e&&g()}),[e,g]),(0,c.useEffect)(()=>r(`pty-submit-completed`,({session_id:t,kind:n})=>{t!==e||n!==`btw`||g()}),[e,g]),{detail:l,loading:f,ephemerals:m}}export{p as n,f as t}; \ No newline at end of file +import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{i as t}from"./react-CCIEwYL0.js";import{c as n,f as r}from"./index-XPrlVfCr.js";import{a as i,n as a,r as o,t as s}from"./sessionCache-Cj3FsbQ4.js";var c=e(t(),1),l=/<[a-z][a-z0-9-]*>[\s\S]*?<\/[a-z][a-z0-9-]*>/g;function u(e){let t=e instanceof Error?e.message:String(e);/→\s*404\b/.test(t)||console.error(e)}function d(e){return e.some(e=>e.type===`text`?e.text.replace(l,``).trim().length>0:!1)}function f(e){if(e.length===0)return!1;let t=e[e.length-1];return t.kind===`command`?!1:t.kind===`user`?d(t.message.content_blocks):!t.messages[t.messages.length-1].content_blocks.some(e=>e.type===`text`)}function p(e){let t=a(e),[l,d]=(0,c.useState)(t??null),[f,p]=(0,c.useState)(!t),[m,h]=(0,c.useState)([]),g=(0,c.useCallback)((t=!1)=>{n.ptyEphemerals(e).then(h).catch(()=>{t&&h([])})},[e]);(0,c.useEffect)(()=>{let t=a(e);t?(d(t),p(!1)):(p(!0),d(null)),s(e,n.getSession).then(e=>{d(e),p(!1)}).catch(u)},[e]),(0,c.useEffect)(()=>{g(!0)},[g]);let _=(0,c.useRef)(0);return(0,c.useEffect)(()=>r(`refresh`,()=>{o(e);let t=++_.current;n.getSession(e).then(n=>{t===_.current&&(i(e,n),d(n))}).catch(u)}),[e]),(0,c.useEffect)(()=>r(`session-mutated`,t=>{t===e&&(o(e),n.getSession(e).then(t=>{i(e,t),d(t)}).catch(u))}),[e]),(0,c.useEffect)(()=>r(`ephemeral-input-persisted`,({session_id:t})=>{t===e&&g()}),[e,g]),(0,c.useEffect)(()=>r(`ephemeral-pair-persisted`,({session_id:t})=>{t===e&&g()}),[e,g]),(0,c.useEffect)(()=>r(`pty-submit-completed`,({session_id:t,kind:n})=>{t!==e||n!==`btw`||g()}),[e,g]),{detail:l,loading:f,ephemerals:m}}export{p as n,f as t}; \ No newline at end of file diff --git a/src/agent_decoder/static/index.html b/src/agent_decoder/static/index.html index 20c70939..22c5e6de 100644 --- a/src/agent_decoder/static/index.html +++ b/src/agent_decoder/static/index.html @@ -12,7 +12,7 @@ Agent Decoder - + diff --git a/tests/test_agent_runs.py b/tests/test_agent_runs.py new file mode 100644 index 00000000..df6c71d1 --- /dev/null +++ b/tests/test_agent_runs.py @@ -0,0 +1,272 @@ +"""Run history must survive index churn and never infer task success.""" + +from __future__ import annotations + +import asyncio +from unittest.mock import AsyncMock + +import pytest + +from agent_decoder.agent_runs import RunStore +from agent_decoder.db import Database +from agent_decoder.events_bus import EventBroadcaster +from agent_decoder.execution_manager import ExecutionManager + + +@pytest.fixture +async def database(tmp_path): + async with Database(tmp_path / "runs.db") as db: + await db.init_schema() + yield db + + +async def test_concurrent_begin_reuses_identity_and_terminal_attempt_is_not_resurrected( + database, +): + store = RunStore(database._db_path) + await store.initialize() + first, second = await asyncio.gather( + store.begin("session", "claude"), store.begin("session", "claude") + ) + assert first.id == second.id + await store.update("session", "canceled", "user stop", "explicit_kill") + await store.update("session", "running", "late callback", "native_input") + rows = await store.list() + assert rows[0].state == "canceled" + assert rows[0].ended_at + assert (await store.begin("session", "claude")).id != first.id + assert len(await store.list()) == 2 + + +async def test_restart_and_rekey_preserve_history_without_source(database): + store = RunStore(database._db_path) + await store.initialize() + run = await store.begin("placeholder", "codex", cwd="/tmp/project", model="test") + await store.update( + "placeholder", "running", "submitted", "decoded_submit", observed=True + ) + await store.rekey("placeholder", "native-id") + await store.initialize() + recovered = (await store.list())[0] + assert recovered.id == run.id + assert recovered.native_session_id == "native-id" + assert recovered.state == "blocked" + assert recovered.provenance == "server_restart" + assert not recovered.source_available + assert recovered.last_observed_at + assert recovered.task_id is None and recovered.parent_run_id is None + + +async def test_manager_commits_submit_native_and_explicit_kill(database, monkeypatch): + manager = ExecutionManager(database, EventBroadcaster()) + await manager.initialize_runs() + monkeypatch.setattr(manager, "_focus_execution", AsyncMock()) + monkeypatch.setattr(manager, "_driver_submit", AsyncMock()) + monkeypatch.setattr(manager, "_driver_write_raw_input", AsyncMock()) + monkeypatch.setattr(manager, "_kill_execution", AsyncMock()) + try: + await manager.focus("s", provider="codex", cwd="/tmp") + manager._drivers["s"] = object() + await manager.submit("s", "hello") + assert (await manager.runs.active("s")).provenance == "decoded_submit" + await manager.write_raw_input("s", b"\r") + assert (await manager.runs.active("s")).provenance == "native_input" + manager._drivers.clear() + await manager.kill("s") + assert (await manager.runs.list())[0].state == "canceled" + finally: + await manager.shutdown() + + +async def test_launch_rejection_is_terminal_failure(database, monkeypatch): + manager = ExecutionManager(database, EventBroadcaster()) + await manager.initialize_runs() + monkeypatch.setattr( + manager, "_focus_execution", AsyncMock(side_effect=RuntimeError("rejected")) + ) + try: + with pytest.raises(RuntimeError, match="rejected"): + await manager.focus("s", cwd="/tmp") + run = (await manager.runs.list())[0] + assert run.state == "failed" and run.ended_at + finally: + await manager.shutdown() + + +async def test_shutdown_records_uncertainty_and_never_completed(database, monkeypatch): + manager = ExecutionManager(database, EventBroadcaster()) + await manager.initialize_runs() + monkeypatch.setattr(manager, "_focus_execution", AsyncMock()) + await manager.focus("s", cwd="/tmp") + await manager.shutdown() + run = (await manager.runs.list())[0] + assert run.state == "blocked" + assert run.ended_at is None + assert run.provenance == "server_shutdown" + + +async def test_cross_store_begin_is_atomic_and_provider_scoped(database): + stores = [RunStore(database._db_path), RunStore(database._db_path)] + await stores[0].initialize() + a, b = await asyncio.gather(*(store.begin("same", "codex") for store in stores)) + assert a.id == b.id + other = await stores[1].begin("same", "claude") + assert other.provider == "claude" and other.id != a.id + + +async def test_filters_before_pagination_and_detail_outside_page(database): + store = RunStore(database._db_path) + await store.initialize() + first = await store.begin("old-codex", "codex", cwd="/project/wanted") + for i in range(4): + await store.begin(f"new-claude-{i}", "claude") + assert (await store.list(provider="codex", q="wanted", limit=1))[0].id == first.id + assert (await store.list(run_id=first.id, limit=1))[0].id == first.id + assert len(await store.list(limit=2, offset=2)) == 2 + + +async def test_advisory_screen_and_disconnect_never_complete(database, monkeypatch): + manager = ExecutionManager(database, EventBroadcaster()) + await manager.initialize_runs() + monkeypatch.setattr(manager, "_focus_execution", AsyncMock()) + monkeypatch.setattr(manager, "has", lambda sid: True) + monkeypatch.setattr(manager, "is_alive", lambda sid: True) + try: + await manager.focus("s", cwd="/tmp") + await manager.runs.update("s", "running", "input", "decoded_submit") + manager._record_run_observation("s", "idle_chat_input") + await manager._flush_run_observations() + run = await manager.runs.active("s") + assert run.state == "awaiting_input" + assert run.provenance == "screen_classifier" + observed = run.last_observed_at + await manager._flush_run_observations() + assert (await manager.runs.active("s")).last_observed_at == observed + manager._record_run_observation("s", "permission_prompt") + await manager._flush_run_observations() + assert (await manager.runs.active("s")).state == "blocked" + monkeypatch.setattr(manager, "is_alive", lambda sid: False) + await manager._flush_run_observations() + assert (await manager.runs.active("s")).provenance == "transport_unobserved" + finally: + await manager.shutdown() + + +async def test_index_enrichment_survives_session_deletion(database): + from agent_decoder.models import Project, Session + + store = RunStore(database._db_path) + await store.initialize() + await store.begin("native", "codex") + await database.upsert_project( + Project(id="p", display_name="Project", raw_path="/project", data_source="test") + ) + await database.upsert_session( + Session( + id="native", + project_id="p", + file_path="/tmp/rollout.jsonl", + provider="codex", + cwd="/project/worktree", + git_branch="feature", + is_worktree=True, + model="test-model", + ) + ) + run = (await store.list())[0] + assert run.project_id == "p" and run.git_branch == "feature" and run.is_worktree + assert run.source_available + await database.delete_session("native") + run = (await store.list())[0] + assert not run.source_available + assert run.model == "test-model" and run.git_branch == "feature" + + +async def test_execution_model_is_not_overwritten_by_session_model(database): + from agent_decoder.models import Project, Session + + store = RunStore(database._db_path) + await store.initialize() + await store.begin("s", "claude", model="requested-new") + await database.upsert_project( + Project(id="p", display_name="Project", raw_path="/p", data_source="test") + ) + await database.upsert_session( + Session( + id="s", project_id="p", file_path="/tmp/session.jsonl", model="logged-old" + ) + ) + assert (await store.list())[0].model == "requested-new" + await store.update("s", "canceled", "stop", "explicit_kill") + await database.upsert_session( + Session( + id="s", + project_id="p", + file_path="/tmp/session.jsonl", + model="another-model", + ) + ) + assert (await store.list())[0].model == "requested-new" + + +async def test_runs_api_filters_and_missing_detail(database): + from httpx import ASGITransport, AsyncClient + from agent_decoder.models import AppConfig + from agent_decoder.server import create_app + + store = RunStore(database._db_path) + await store.initialize() + run = await store.begin("s", "codex", cwd="/wanted") + await store.begin("newer", "claude") + app = create_app(AppConfig(), database._db_path) + async with AsyncClient( + transport=ASGITransport(app=app), base_url="http://test" + ) as client: + response = await client.get( + "/api/runs", params={"provider": "codex", "limit": 1, "q": "wanted"} + ) + assert response.status_code == 200 + assert response.json()[0]["id"] == run.id + assert (await client.get(f"/api/runs/{run.id}")).json()[ + "native_session_id" + ] == "s" + assert (await client.get("/api/runs/missing")).status_code == 404 + assert (await client.get("/api/runs?limit=0")).status_code == 422 + + +async def test_rekey_enriches_already_indexed_source_before_deletion(database): + from agent_decoder.models import Project, Session + + store = RunStore(database._db_path) + await store.initialize() + await database.upsert_project( + Project( + id="adopted-project", + display_name="Adopted", + raw_path="/adopt", + data_source="test", + ) + ) + await database.upsert_session( + Session( + id="real-id", + project_id="adopted-project", + file_path="/tmp/rollout.jsonl", + provider="codex", + model="observed-model", + cwd="/adopt", + git_branch="adopted-branch", + is_worktree=True, + ) + ) + pending = await store.begin("placeholder", "codex") + await store.rekey("placeholder", "real-id") + assert (await store.list(project="adopted-project", q="adopted-branch"))[ + 0 + ].id == pending.id + await database.delete_session("real-id") + run = (await store.list(project="adopted-project", q="adopted-branch"))[0] + assert ( + run.id == pending.id and run.model == "observed-model" and run.cwd == "/adopt" + ) + assert run.is_worktree and not run.source_available diff --git a/tests/test_execution_manager.py b/tests/test_execution_manager.py index 247debd3..bf6c8693 100644 --- a/tests/test_execution_manager.py +++ b/tests/test_execution_manager.py @@ -289,3 +289,120 @@ async def test_old_capture_detach_cannot_disable_replacement_capture(terminal_se if replacement: await replacement.stop_capture() await manager.shutdown() + + +@requires_tmux +async def test_durable_run_survives_synthetic_tmux_restart_and_kill( + terminal_setup, tmp_path +): + from agent_decoder.db import Database + + _, params = terminal_setup + sid = str(uuid.uuid4()) + async with Database(tmp_path / "history.db") as db: + await db.init_schema() + first = ExecutionManager(db, EventBroadcaster()) + second = ExecutionManager(db, EventBroadcaster()) + await first.initialize_runs() + try: + await first.focus(sid, **params) + run_id = (await first.runs.active(sid)).id + await first.submit(sid, "synthetic prompt") + assert (await first.runs.active(sid)).state == "running" + await first.shutdown() + assert (await first.runs.active(sid)).provenance == "server_shutdown" + await second.initialize_runs() + assert (await second.runs.active(sid)).provenance == "server_restart" + await second.focus(sid, **{**params, "new_chat": False}) + assert (await second.runs.active(sid)).id == run_id + await second.kill(sid) + run = (await second.runs.list())[0] + assert run.id == run_id and run.state == "canceled" and run.ended_at + finally: + await first.shutdown() + await second.kill(sid) + await second.shutdown() + + +@requires_tmux +async def test_durable_attempt_changes_on_permission_respawn(terminal_setup, tmp_path): + from agent_decoder.db import Database + + _, params = terminal_setup + sid = str(uuid.uuid4()) + async with Database(tmp_path / "history.db") as db: + await db.init_schema() + manager = ExecutionManager(db, EventBroadcaster()) + await manager.initialize_runs() + try: + await manager.focus(sid, **params) + first = await manager.runs.active(sid) + await manager.focus(sid, **{**params, "permission_mode": "default"}) + second = await manager.runs.active(sid) + assert second.id != first.id + rows = await manager.runs.list() + old = next(r for r in rows if r.id == first.id) + assert old.state == "blocked" and old.ended_at + assert old.provenance == "process_replaced" + finally: + await manager.kill(sid) + await manager.shutdown() + + +@requires_tmux +async def test_durable_capture_failure_preserves_surviving_attempt( + terminal_setup, tmp_path, monkeypatch +): + from agent_decoder.db import Database + + _, params = terminal_setup + sid = str(uuid.uuid4()) + async with Database(tmp_path / "history.db") as db: + await db.init_schema() + manager = ExecutionManager(db, EventBroadcaster()) + await manager.initialize_runs() + original = TmuxTerminal.start_capture + + async def broken(self, *args): + raise RuntimeError("synthetic capture failure") + + try: + monkeypatch.setattr(TmuxTerminal, "start_capture", broken) + with pytest.raises(RuntimeError, match="synthetic capture failure"): + await manager.focus(sid, **params) + run = await manager.runs.active(sid) + assert run is not None and run.state == "blocked" and not run.ended_at + monkeypatch.setattr(TmuxTerminal, "start_capture", original) + await manager.focus(sid, **params) + assert (await manager.runs.active(sid)).id == run.id + finally: + await manager.kill(sid) + await manager.shutdown() + + +@requires_tmux +async def test_restart_with_changed_configuration_creates_new_attempt( + terminal_setup, tmp_path +): + from agent_decoder.db import Database + + _, params = terminal_setup + sid = str(uuid.uuid4()) + async with Database(tmp_path / "history.db") as db: + await db.init_schema() + first = ExecutionManager(db, EventBroadcaster()) + second = ExecutionManager(db, EventBroadcaster()) + await first.initialize_runs() + try: + await first.focus(sid, **params) + original = await first.runs.active(sid) + await first.shutdown() + await second.initialize_runs() + await second.focus(sid, **{**params, "permission_mode": "default"}) + assert (await second.runs.active(sid)).id != original.id + old = next(r for r in await second.runs.list() if r.id == original.id) + assert old.ended_at and old.provenance == "process_replaced" + finally: + await first.shutdown() + await second.kill(sid) + await second.shutdown() diff --git a/tests/test_server_capabilities.py b/tests/test_server_capabilities.py index 7180bb88..7bc434d9 100644 --- a/tests/test_server_capabilities.py +++ b/tests/test_server_capabilities.py @@ -164,8 +164,8 @@ async def test_pty_focus_codex_409_when_not_drivable(env, monkeypatch): async def test_pty_submit_codex_gate_opens_when_drivable(env, monkeypatch): # When drivable, the capability gate PASSES (no 409 capability_unsupported) - # and routes to the DriverManager. Without a lifespan the manager is None, - # so we expect 503 "driver manager not ready" — proof the gate opened. + # and routes to the shared ExecutionManager. Without a lifespan the manager is None, + # so we expect 503 "execution manager not ready" — proof the gate opened. _force_drivable(monkeypatch, True) app = _make_app(env["db_path"], AppConfig()) async with AsyncClient( @@ -175,7 +175,7 @@ async def test_pty_submit_codex_gate_opens_when_drivable(env, monkeypatch): "/api/pty/submit", json={"session_id": "codex-sess-1", "content": "hi"} ) assert r.status_code == 503 - assert "driver manager" in r.json()["detail"] + assert "execution manager" in r.json()["detail"] # Claude is never capability-gated (it owns its direct-PTY path). That