thurview 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/ui/dom.ts", "../../src/ui/api.ts", "../../src/ui/app.ts", "../../src/ui/state.ts", "../../src/ui/code.ts", "../../src/ui/threads.ts", "../../src/ui/views/review.ts", "../../src/ui/diagrams.ts", "../../src/ui/views/files.ts", "../../src/ui/views/commits.ts", "../../src/ui/views/map.ts"],
4
- "sourcesContent": ["type Child = Node | string | number | null | undefined | false | Child[];\n\nexport function h<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: Record<string, unknown> | null = null,\n ...children: Child[]\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) {\n if (v === null || v === undefined || v === false) continue;\n if (k === \"class\") el.className = String(v);\n else if (k === \"html\") el.innerHTML = String(v);\n else if (k.startsWith(\"on\") && typeof v === \"function\")\n el.addEventListener(k.slice(2).toLowerCase(), v as EventListener);\n else if (k === \"style\" && typeof v === \"object\") Object.assign(el.style, v);\n else if (k in el && typeof v !== \"string\" && k !== \"title\")\n (el as unknown as Record<string, unknown>)[k] = v;\n else el.setAttribute(k, String(v));\n }\n }\n append(el, children);\n return el;\n}\n\nexport function append(el: Node, children: Child[]): void {\n for (const c of children) {\n if (c === null || c === undefined || c === false) continue;\n if (Array.isArray(c)) append(el, c);\n else\n el.appendChild(\n typeof c === \"string\" || typeof c === \"number\" ? document.createTextNode(String(c)) : c,\n );\n }\n}\n\nexport function svg<K extends keyof SVGElementTagNameMap>(\n tag: K,\n attrs: Record<string, unknown> = {},\n ...children: (Node | string)[]\n): SVGElementTagNameMap[K] {\n const el = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (const [k, v] of Object.entries(attrs)) {\n if (k.startsWith(\"on\") && typeof v === \"function\")\n el.addEventListener(k.slice(2).toLowerCase(), v as EventListener);\n else el.setAttribute(k, String(v));\n }\n for (const c of children) el.appendChild(typeof c === \"string\" ? document.createTextNode(c) : c);\n return el;\n}\n\nexport function clear(el: Element): void {\n while (el.firstChild) el.removeChild(el.firstChild);\n}\n\nexport function escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport function timeAgo(iso: string): string {\n const d = (Date.now() - new Date(iso).getTime()) / 1000;\n if (d < 60) return \"just now\";\n if (d < 3600) return `${Math.floor(d / 60)} min ago`;\n if (d < 86400) return `${Math.floor(d / 3600)} h ago`;\n return `${Math.floor(d / 86400)} d ago`;\n}\n\n/** One popover at a time; closes on outside click or Escape. */\nlet openPopover: HTMLElement | null = null;\nexport function popover(el: HTMLElement, at: { x: number; y: number }): HTMLElement {\n closePopover();\n el.style.position = \"absolute\";\n document.body.appendChild(el);\n const w = el.offsetWidth;\n const hgt = el.offsetHeight;\n const x = Math.min(at.x, window.innerWidth - w - 12);\n const y = at.y + hgt > window.scrollY + window.innerHeight - 12 ? at.y - hgt - 8 : at.y;\n el.style.left = `${Math.max(8, x)}px`;\n el.style.top = `${Math.max(8, y)}px`;\n openPopover = el;\n setTimeout(() => {\n document.addEventListener(\"mousedown\", onDoc);\n document.addEventListener(\"keydown\", onKey);\n });\n return el;\n}\nfunction onDoc(e: MouseEvent) {\n if (openPopover && !openPopover.contains(e.target as Node)) closePopover();\n}\nfunction onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") closePopover();\n}\nexport function closePopover(): void {\n if (openPopover) openPopover.remove();\n openPopover = null;\n document.removeEventListener(\"mousedown\", onDoc);\n document.removeEventListener(\"keydown\", onKey);\n}\n\nexport function dialog(content: HTMLElement): { close: () => void } {\n const overlay = h(\"div\", { class: \"overlay\" }, h(\"div\", { class: \"dialog\" }, content));\n overlay.addEventListener(\"mousedown\", (e) => {\n if (e.target === overlay) overlay.remove();\n });\n document.body.appendChild(overlay);\n return { close: () => overlay.remove() };\n}\n", "import type { ReviewState, Thread, Decision, ThreadTarget } from \"../store.js\";\nimport type { CompiledDocument, CompiledMap } from \"../document/compile.js\";\nimport type { FileDiff } from \"../diff.js\";\nimport type { ChangedFile, Commit } from \"../git.js\";\nimport type { SymbolDef } from \"../symbols.js\";\n\nexport interface Payload {\n review: ReviewState;\n revision: number;\n document: CompiledDocument | null;\n map: CompiledMap | null;\n changes: ChangedFile[];\n meta: { revision: number; at: string; title: string; hasMap: boolean; theme?: string } | null;\n theme: { name: string; source?: string; css: string } | null;\n threads: Thread[];\n decisions: Decision[];\n}\n\nexport interface FileLines {\n path: string;\n graph: \"head\" | \"base\";\n lang: string;\n total: number;\n from: number;\n to: number;\n lines: string[];\n}\n\nasync function j<T>(url: string, init?: RequestInit): Promise<T> {\n const r = await fetch(url, init);\n const body = (await r.json()) as T & { error?: string };\n if (!r.ok) throw new Error(body.error ?? r.statusText);\n return body;\n}\n\nfunction post<T>(url: string, body: unknown): Promise<T> {\n return j<T>(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n}\n\nexport const api = {\n reviews: () => j<(ReviewState & { openThreads: number })[]>(\"/api/reviews\"),\n review: (id: string, revision?: number) =>\n j<Payload>(`/api/reviews/${id}${revision ? `?revision=${revision}` : \"\"}`),\n revisions: (id: string) =>\n j<{ revision: number; at: string; title: string }[]>(`/api/reviews/${id}/revisions`),\n commits: (id: string) => j<Commit[]>(`/api/reviews/${id}/commits`),\n diff: (id: string, path: string) =>\n j<FileDiff>(`/api/reviews/${id}/diff?path=${encodeURIComponent(path)}`),\n file: (id: string, path: string, graph: \"head\" | \"base\", from?: number, to?: number) =>\n j<FileLines>(\n `/api/reviews/${id}/file?path=${encodeURIComponent(path)}&graph=${graph}${from ? `&from=${from}` : \"\"}${to ? `&to=${to}` : \"\"}`,\n ),\n symbols: (id: string, name: string, graph: \"head\" | \"base\") =>\n j<SymbolDef[]>(`/api/reviews/${id}/symbols?name=${encodeURIComponent(name)}&graph=${graph}`),\n createThread: (\n id: string,\n input: {\n kind: \"question\" | \"comment\";\n mode: \"ask\" | \"review\";\n target: ThreadTarget;\n body: string;\n },\n ) => post<Thread>(`/api/reviews/${id}/threads`, input),\n reply: (id: string, tid: string, body: string) =>\n post<Thread>(`/api/reviews/${id}/threads/${tid}/reply`, { body, role: \"reviewer\" }),\n resolve: (id: string, tid: string) =>\n post<Thread>(`/api/reviews/${id}/threads/${tid}/resolve`, {}),\n reopen: (id: string, tid: string) => post<Thread>(`/api/reviews/${id}/threads/${tid}/reopen`, {}),\n deleteThread: (id: string, tid: string) =>\n post<{ ok: true }>(`/api/reviews/${id}/threads/${tid}/delete`, {}),\n submit: (id: string, decision: \"approve\" | \"request-changes\", body: string) =>\n post<{ review: ReviewState }>(`/api/reviews/${id}/submit`, { decision, body }),\n dismiss: (id: string, dismissed: boolean) =>\n post<ReviewState>(`/api/reviews/${id}/dismiss`, { dismissed }),\n remove: (id: string) => j<{ ok: true }>(`/api/reviews/${id}`, { method: \"DELETE\" }),\n};\n", "import { api } from \"./api.js\";\nimport { h, append, clear, dialog, timeAgo } from \"./dom.js\";\nimport { state, on, emit, readHash, navigate, isTerminal, NARROW, type View } from \"./state.js\";\nimport { renderPeek } from \"./code.js\";\nimport { renderThreadsPanel, submitDialog, reload } from \"./threads.js\";\nimport { renderReview } from \"./views/review.js\";\nimport { renderFiles } from \"./views/files.js\";\nimport { renderCommits } from \"./views/commits.js\";\nimport { renderMap } from \"./views/map.js\";\n\nconst app = document.getElementById(\"app\")!;\n\nasync function home(): Promise<void> {\n clear(app);\n const reviews = await api.reviews();\n const el = h(\"div\", { class: \"home\" }, h(\"h2\", null, \"Reviews\"));\n const active = reviews.filter((r) => !r.dismissed);\n const dismissed = reviews.filter((r) => r.dismissed);\n const item = (r: (typeof reviews)[number]) =>\n h(\n \"div\",\n { class: \"item\", onclick: () => (location.href = `/review/${r.id}`) },\n h(\"span\", { class: \"t\" }, r.title),\n h(\"span\", { class: `badge ${statusClass(r.status)}` }, r.status),\n r.openThreads ? h(\"span\", { class: \"badge accent\" }, `${r.openThreads} open`) : null,\n h(\n \"span\",\n { class: \"muted mono\", style: { fontSize: \"12px\" } },\n r.binding.kind === \"pr\" ? `PR #${r.binding.name}` : r.binding.name,\n ),\n h(\"span\", { class: \"muted\", style: { fontSize: \"12px\" } }, timeAgo(r.updatedAt)),\n );\n if (!active.length)\n el.appendChild(\n h(\"div\", { class: \"empty-state\" }, \"No reviews. Ask your agent to scaffold and publish one.\"),\n );\n active.forEach((r) => el.appendChild(item(r)));\n if (dismissed.length) {\n el.appendChild(h(\"h3\", { class: \"muted\" }, \"Dismissed\"));\n dismissed.forEach((r) => el.appendChild(item(r)));\n }\n app.appendChild(el);\n}\n\nfunction statusClass(s: string): string {\n return s === \"accepted\"\n ? \"ok\"\n : s === \"awaiting-agent-updates\"\n ? \"warn\"\n : s === \"rejected\"\n ? \"del\"\n : s === \"awaiting-review\"\n ? \"accent\"\n : \"\";\n}\n\nlet center: HTMLElement;\nlet side: HTMLElement;\nlet topbar: HTMLElement;\nlet banner: HTMLElement;\n\nfunction shell(): void {\n clear(app);\n topbar = h(\"div\", { class: \"topbar\" });\n banner = h(\"div\", { class: \"banner\", hidden: true });\n center = h(\"div\", { class: \"center\" });\n side = h(\"div\", { class: \"side hidden\" });\n const resizer = h(\"div\", { class: \"resizer\" });\n let drag = false;\n resizer.addEventListener(\"mousedown\", () => (drag = true));\n window.addEventListener(\"mouseup\", () => (drag = false));\n window.addEventListener(\"mousemove\", (e) => {\n if (!drag) return;\n const w = Math.max(320, window.innerWidth - e.clientX);\n document.documentElement.style.setProperty(\"--side-w\", `${w}px`);\n });\n app.append(topbar, banner, h(\"div\", { class: \"main\" }, center, resizer, side));\n}\n\nfunction applyTheme(): void {\n let style = document.getElementById(\"review-theme\") as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"review-theme\";\n document.head.appendChild(style);\n }\n style.textContent = state.data?.theme?.css ?? \"\";\n}\n\nfunction renderTopbar(): void {\n clear(topbar);\n const d = state.data!;\n const r = d.review;\n const pending = d.threads.filter((t) => !t.submitted).length;\n const open = d.threads.filter((t) => t.status === \"open\").length;\n const tabs: [View, string][] = [\n [\"review\", \"Review\"],\n [\"commits\", \"Commits\"],\n [\"files\", `Files${d.changes.length ? ` (${d.changes.length})` : \"\"}`],\n [\"map\", \"Map\"],\n ];\n const revSel = h(\"select\", {\n class: \"small\",\n style: { font: \"inherit\", fontSize: \"12px\" },\n onchange: async (e: Event) => {\n const n = Number((e.target as HTMLSelectElement).value);\n state.viewingRevision = n === r.revision ? null : n;\n state.data = await api.review(state.id, n);\n emit(\"data\");\n },\n });\n for (let n = r.revision; n >= 1; n--)\n revSel.appendChild(\n h(\n \"option\",\n { value: n, selected: (state.viewingRevision ?? r.revision) === n },\n `rev ${n}${n === r.revision ? \" (current)\" : \"\"}`,\n ),\n );\n // Two rows, so a long title can never push the tabs or the decision button\n // off the bar: the identity row truncates, the actions row does not.\n const identity = h(\"div\", { class: \"bar-row bar-identity\" }, [\n h(\"a\", { href: \"/\", class: \"brand\", title: \"All reviews\" }, \"thurview\"),\n h(\"span\", { class: \"title\", title: r.title }, r.title),\n h(\"span\", { class: `badge ${statusClass(r.status)}` }, r.status),\n r.revision > 1 ? revSel : h(\"span\", { class: \"badge bar-rev\" }, `rev ${r.revision}`),\n h(\n \"span\",\n {\n class: \"muted mono bar-binding\",\n style: { fontSize: \"12px\" },\n title: `${r.pins.base} \u2192 ${r.pins.head}`,\n },\n r.binding.kind === \"pr\" ? `PR #${r.binding.name}` : r.binding.name,\n ),\n ]);\n const actions = h(\"div\", { class: \"bar-row bar-actions\" }, [\n h(\n \"div\",\n { class: \"tabs\" },\n tabs.map(([v, label]) =>\n h(\"button\", { class: v === state.view ? \"active\" : \"\", onclick: () => navigate(v) }, label),\n ),\n ),\n h(\"span\", { class: \"spacer\" }),\n h(\n \"button\",\n {\n class: state.side.kind === \"threads\" ? \"primary\" : \"\",\n onclick: () => {\n state.side = state.side.kind === \"threads\" ? { kind: \"none\" } : { kind: \"threads\" };\n emit(\"side\");\n },\n },\n `Threads${open ? ` \u00B7 ${open}` : \"\"}`,\n ),\n isTerminal() || state.viewingRevision !== null\n ? null\n : h(\n \"button\",\n { class: pending ? \"primary\" : \"ok\", onclick: () => submitDialog() },\n pending ? `Submit${pending ? ` (${pending})` : \"\"}` : \"Decide\",\n ),\n h(\n \"button\",\n { class: \"ghost bar-more\", title: \"More\", onclick: (e: MouseEvent) => moreMenu(e) },\n \"\u22EF\",\n ),\n ]);\n append(topbar, [identity, actions]);\n}\n\nfunction moreMenu(e: MouseEvent): void {\n const r = state.data!.review;\n const box = h(\n \"div\",\n { class: \"def-popover\" },\n h(\n \"div\",\n {\n class: \"item\",\n onclick: async () => {\n await api.dismiss(state.id, !r.dismissed);\n await reload();\n emit(\"data\");\n },\n },\n r.dismissed ? \"Restore review\" : \"Dismiss review\",\n ),\n h(\n \"div\",\n {\n class: \"item\",\n onclick: () => {\n const d = dialog(\n h(\n \"div\",\n null,\n h(\"h3\", null, \"Delete this review?\"),\n h(\n \"p\",\n { class: \"muted\" },\n \"Removes the document, revisions and threads. The code is untouched.\",\n ),\n h(\n \"div\",\n { class: \"row\" },\n h(\"button\", { class: \"ghost\", onclick: () => d.close() }, \"Cancel\"),\n h(\n \"button\",\n {\n style: { background: \"var(--del)\", color: \"#fff\" },\n onclick: async () => {\n await api.remove(state.id);\n location.href = \"/\";\n },\n },\n \"Delete\",\n ),\n ),\n ),\n );\n },\n },\n \"Delete review\",\n ),\n h(\n \"div\",\n { class: \"item muted\" },\n `base ${r.pins.base.slice(0, 12)} \u00B7 head ${r.pins.head.slice(0, 12)}`,\n ),\n h(\n \"div\",\n { class: \"item muted\" },\n `theme: ${state.data!.theme?.name ?? \"default\"}${state.data!.theme?.source ? ` (${state.data!.theme.source})` : \"\"}`,\n ),\n );\n import(\"./dom.js\").then(({ popover }) => popover(box, { x: e.pageX - 200, y: e.pageY + 10 }));\n}\n\nfunction renderCenter(): void {\n const scroll = center.scrollTop;\n clear(center);\n switch (state.view) {\n case \"review\":\n renderReview(center);\n break;\n case \"files\":\n renderFiles(center);\n break;\n case \"commits\":\n void renderCommits(center);\n break;\n case \"map\":\n renderMap(center);\n break;\n }\n center.scrollTop = scroll;\n}\n\nfunction renderSide(): void {\n clear(side);\n side.classList.toggle(\"hidden\", state.side.kind === \"none\");\n if (state.side.kind === \"peek\") renderPeek(side);\n else if (state.side.kind === \"threads\") renderThreadsPanel(side);\n}\n\nfunction renderBanner(): void {\n banner.hidden = true;\n clear(banner);\n const d = state.data!;\n if (state.viewingRevision !== null) {\n banner.hidden = false;\n banner.append(\n `Viewing revision ${state.viewingRevision} of ${d.review.revision}. Read only.`,\n h(\"span\", { style: { flex: \"1\" } }),\n h(\n \"button\",\n {\n class: \"small\",\n onclick: async () => {\n state.viewingRevision = null;\n state.data = await api.review(state.id);\n emit(\"data\");\n },\n },\n \"Back to current\",\n ),\n );\n } else if (state.latestRevision !== null && state.latestRevision > d.review.revision) {\n banner.hidden = false;\n banner.append(\n `Revision ${state.latestRevision} was published.`,\n h(\"span\", { style: { flex: \"1\" } }),\n h(\n \"button\",\n {\n class: \"small primary\",\n onclick: async () => {\n state.latestRevision = null;\n state.data = await api.review(state.id);\n emit(\"data\");\n },\n },\n \"Load it\",\n ),\n );\n } else if (d.review.status === \"awaiting-agent-updates\") {\n banner.hidden = false;\n banner.append(\n \"Changes requested. The agent is working on your comments; a new revision will appear here.\",\n );\n } else if (d.review.status === \"accepted\") {\n banner.hidden = false;\n banner.append(\"Approved. This review is complete.\");\n }\n}\n\nfunction connectEvents(): void {\n const es = new EventSource(`/api/reviews/${state.id}/events`);\n es.onmessage = async (ev) => {\n const msg = JSON.parse(ev.data as string) as { type: string };\n if (msg.type !== \"change\") return;\n const fresh = await api.review(state.id, state.viewingRevision ?? undefined);\n const cur = state.data!;\n if (fresh.review.revision > cur.review.revision && state.viewingRevision === null) {\n state.latestRevision = fresh.review.revision;\n // keep the presented document until the reader loads it, but take threads and status\n state.data = {\n ...cur,\n threads: fresh.threads,\n decisions: fresh.decisions,\n review: { ...fresh.review, revision: cur.review.revision },\n };\n } else {\n state.data = fresh;\n }\n emit(\"threads\");\n };\n}\n\nasync function reviewPage(id: string): Promise<void> {\n state.id = id;\n shell();\n readHash();\n try {\n state.data = await api.review(id);\n } catch (e) {\n clear(app);\n app.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n (e as Error).message,\n \" \",\n h(\"a\", { href: \"/\" }, \"All reviews\"),\n ),\n );\n return;\n }\n document.title = `${state.data.review.title} \u00B7 thurview`;\n if (state.params.get(\"side\") === \"threads\") state.side = { kind: \"threads\" };\n on(\"data\", () => {\n applyTheme();\n renderTopbar();\n renderBanner();\n renderCenter();\n renderSide();\n });\n on(\"threads\", () => {\n renderTopbar();\n renderBanner();\n renderCenter();\n renderSide();\n });\n on(\"view\", () => {\n renderTopbar();\n renderCenter();\n });\n on(\"side\", () => {\n renderTopbar();\n renderSide();\n });\n window.addEventListener(\"hashchange\", () => {\n readHash();\n emit(\"view\");\n });\n window.matchMedia(NARROW).addEventListener(\"change\", () => emit(\"view\"));\n emit(\"data\");\n connectEvents();\n}\n\nconst m = /^\\/review\\/([^/]+)/.exec(location.pathname);\nif (m) void reviewPage(m[1]!);\nelse void home();\n", "import type { Payload } from \"./api.js\";\nimport type { Thread, ThreadTarget } from \"../store.js\";\n\nexport type View = \"review\" | \"commits\" | \"files\" | \"map\";\n\nexport interface SideState {\n kind: \"none\" | \"peek\" | \"threads\";\n anchor?: string;\n activeThread?: string;\n}\n\nexport interface State {\n id: string;\n data: Payload | null;\n view: View;\n params: URLSearchParams;\n side: SideState;\n /** revision being viewed when older than the presented one */\n viewingRevision: number | null;\n latestRevision: number | null;\n splitDiff: boolean;\n}\n\n/** Below this the UI is one column: no TOC rail, no split diff, side as overlay. */\nexport const NARROW = \"(max-width: 900px)\";\nexport function isNarrow(): boolean {\n return window.matchMedia(NARROW).matches;\n}\n\nexport const state: State = {\n id: \"\",\n data: null,\n view: \"review\",\n params: new URLSearchParams(),\n side: { kind: \"none\" },\n viewingRevision: null,\n latestRevision: null,\n splitDiff: localStorage.getItem(\"thurview.split\") !== \"0\",\n};\n\ntype Listener = () => void;\nconst listeners: Record<string, Listener[]> = {};\nexport function on(event: \"data\" | \"threads\" | \"view\" | \"side\", fn: Listener): void {\n (listeners[event] ??= []).push(fn);\n}\nexport function emit(event: \"data\" | \"threads\" | \"view\" | \"side\"): void {\n for (const fn of listeners[event] ?? []) fn();\n}\n\nexport function threadsFor(target: (t: ThreadTarget) => boolean): Thread[] {\n return (state.data?.threads ?? []).filter((t) => target(t.target));\n}\n\nexport function describeTarget(t: ThreadTarget): string {\n if (t.type === \"document\") return \"document\";\n if (t.type === \"file\") {\n if (!t.line) return `${t.path} (file)`;\n const range = t.endLine && t.endLine > t.line ? `${t.line}-${t.endLine}` : String(t.line);\n return `${t.path}:${range}${t.side === \"base\" ? \" (base)\" : \"\"}`;\n }\n if (t.type === \"map\") return `map \u00B7 ${t.node}`;\n return \"review\";\n}\n\nexport function navigate(\n view: View,\n params: Record<string, string | number | undefined> = {},\n): void {\n const p = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) if (v !== undefined && v !== \"\") p.set(k, String(v));\n const q = p.toString();\n location.hash = `#/${view}${q ? `?${q}` : \"\"}`;\n}\n\nexport function readHash(): void {\n const m = /^#\\/(\\w+)(?:\\?(.*))?$/.exec(location.hash);\n const view = (m?.[1] ?? \"review\") as View;\n state.view = [\"review\", \"commits\", \"files\", \"map\"].includes(view) ? view : \"review\";\n state.params = new URLSearchParams(m?.[2] ?? \"\");\n}\n\nexport function isTerminal(): boolean {\n const s = state.data?.review.status;\n return s === \"accepted\" || s === \"rejected\";\n}\n\nexport function readOnly(): boolean {\n return isTerminal() || state.viewingRevision !== null;\n}\n", "import { api } from \"./api.js\";\nimport { h, popover, closePopover } from \"./dom.js\";\nimport { state, emit, threadsFor, navigate } from \"./state.js\";\nimport type { Thread, ThreadTarget } from \"../store.js\";\nimport type { CompiledAnchor } from \"../document/compile.js\";\nimport { commentPopover, threadPinRow } from \"./threads.js\";\n\nexport interface CodeOpts {\n path: string;\n graph: \"head\" | \"base\";\n startLine: number;\n lines: string[];\n highlight?: [number, number];\n /** line numbers that carry threads are decorated; clicking a number starts a comment */\n commentable?: boolean;\n onExpand?: (dir: \"up\" | \"down\") => void;\n}\n\n/** Renders highlighted lines as a table. */\nexport function codeTable(o: CodeOpts): HTMLTableElement {\n const table = h(\"table\");\n const threads = o.commentable\n ? threadsFor((t) => t.type === \"file\" && t.path === o.path && t.side === o.graph)\n : [];\n const endOf = (t: Thread) => (t.target.type === \"file\" ? (t.target.endLine ?? t.target.line) : 0);\n o.lines.forEach((html, i) => {\n const n = o.startLine + i;\n const hl = o.highlight && n >= o.highlight[0] && n <= o.highlight[1];\n const lineThreads = threads.filter((t) => endOf(t) === n);\n const tr = h(\n \"tr\",\n { class: `${hl ? \"hl\" : \"\"} ${lineThreads.length ? \"commented\" : \"\"}`, \"data-line\": n },\n h(\n \"td\",\n {\n class: \"ln\",\n title: o.commentable ? \"Comment on this line (shift-click for a range)\" : \"\",\n onclick: (e: MouseEvent) => o.commentable && lineClick(e, o.path, o.graph, n, table),\n },\n String(n),\n ),\n h(\"td\", { class: \"src\", html: html || \" \" }),\n );\n table.appendChild(tr);\n for (const t of lineThreads)\n table.appendChild(h(\"tr\", { class: \"thread-row\" }, h(\"td\", { colspan: 2 }, threadPinRow(t))));\n });\n attachDefinitions(table, o.graph);\n return table;\n}\n\nfunction textOf(html: string): string {\n const d = document.createElement(\"div\");\n d.innerHTML = html;\n return d.textContent ?? \"\";\n}\n\nexport function startLineComment(e: MouseEvent, target: ThreadTarget, quote?: string): void {\n if (state.viewingRevision !== null) return;\n const el = commentPopover(target, quote?.trim() ? quote.trim() : undefined);\n popover(el, { x: e.pageX + 8, y: e.pageY + 8 });\n}\n\n/** First click marks a line; shift-click on the same table extends it to a range. */\nlet rangeStart: {\n path: string;\n side: \"head\" | \"base\";\n line: number;\n table: HTMLTableElement;\n} | null = null;\n\nexport function lineClick(\n e: MouseEvent,\n path: string,\n side: \"head\" | \"base\",\n line: number,\n table: HTMLTableElement,\n): void {\n if (state.viewingRevision !== null) return;\n if (e.shiftKey && rangeStart && rangeStart.path === path && rangeStart.side === side) {\n const from = Math.min(rangeStart.line, line);\n const to = Math.max(rangeStart.line, line);\n const quote = rowsText(table, side, from, to);\n clearRangeMarks(table);\n for (let n = from; n <= to; n++)\n table.querySelector(`tr[data-${side}=\"${n}\"]`)?.classList.add(\"range-sel\");\n rangeStart = null;\n startLineComment(e, { type: \"file\", path, side, line: from, endLine: to }, quote);\n return;\n }\n rangeStart = { path, side, line, table };\n clearRangeMarks(table);\n table.querySelector(`tr[data-${side}=\"${line}\"]`)?.classList.add(\"range-sel\");\n startLineComment(e, { type: \"file\", path, side, line }, rowsText(table, side, line, line));\n}\n\nfunction clearRangeMarks(table: HTMLTableElement): void {\n table.querySelectorAll(\"tr.range-sel\").forEach((tr) => tr.classList.remove(\"range-sel\"));\n}\n\nexport function rowsText(\n table: HTMLElement,\n side: \"head\" | \"base\",\n from: number,\n to: number,\n): string {\n const parts: string[] = [];\n for (let n = from; n <= to; n++) {\n const td = table.querySelector(`tr[data-${side}=\"${n}\"] td.src`);\n if (td) parts.push((td.textContent ?? \"\").replace(/^[+\\- ]/, \"\"));\n }\n return parts.join(\"\\n\").slice(0, 400);\n}\n\n/** Selecting code text inside `root` offers a comment on the spanned lines. */\nexport function codeSelectionHandler(root: HTMLElement): void {\n let btn: HTMLElement | null = null;\n const remove = () => {\n btn?.remove();\n btn = null;\n };\n const onChange = () => {\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || !sel.rangeCount || !root.isConnected) return remove();\n const range = sel.getRangeAt(0);\n const rowOf = (node: Node) =>\n (node instanceof Element ? node : node.parentElement)?.closest(\n \"tr[data-head], tr[data-base]\",\n ) as HTMLElement | null;\n const a = rowOf(range.startContainer);\n const b = rowOf(range.endContainer);\n if (!a || !b || !root.contains(a) || !root.contains(b) || state.viewingRevision !== null)\n return remove();\n const table = a.closest(\"table\");\n if (!table || table !== b.closest(\"table\")) return remove();\n const path = (root.closest(\"[data-path]\") as HTMLElement | null)?.dataset[\"path\"] ?? \"\";\n const side: \"head\" | \"base\" = a.dataset[\"head\"] && b.dataset[\"head\"] ? \"head\" : \"base\";\n const la = Number(a.dataset[side]);\n const lb = Number(b.dataset[side]);\n if (!la || !lb) return remove();\n const from = Math.min(la, lb);\n const to = Math.max(la, lb);\n const quote = sel.toString().trim().slice(0, 400);\n remove();\n const rect = range.getBoundingClientRect();\n btn = h(\n \"button\",\n {\n class: \"small primary selection-btn\",\n onmousedown: (e: MouseEvent) => e.preventDefault(),\n onclick: (e: MouseEvent) => {\n remove();\n window.getSelection()?.removeAllRanges();\n startLineComment(\n e,\n { type: \"file\", path, side, line: from, ...(to > from ? { endLine: to } : {}) },\n quote,\n );\n },\n },\n to > from ? `Comment on lines ${from}-${to}` : `Comment on line ${from}`,\n );\n btn.style.left = `${rect.left + window.scrollX}px`;\n btn.style.top = `${rect.bottom + window.scrollY + 6}px`;\n document.body.appendChild(btn);\n };\n document.addEventListener(\"selectionchange\", onChange);\n}\n\n/** Click on an identifier: look up definitions at the pinned commit. Ctrl/Cmd+click jumps to the first one. */\nexport function attachDefinitions(root: HTMLElement, graph: \"head\" | \"base\"): void {\n root.addEventListener(\"click\", async (e) => {\n const td = (e.target as HTMLElement).closest(\"td.src\");\n if (!td) return;\n const sel = window.getSelection();\n if (sel && !sel.isCollapsed) return;\n const word = wordAt(e);\n if (!word) return;\n const defs = await api.symbols(state.id, word, graph);\n if (e.ctrlKey || e.metaKey) {\n const d = defs[0];\n if (d) openPeekAt(d.path, graph, d.line, `${d.kind} ${d.name}`);\n return;\n }\n const box = h(\"div\", { class: \"def-popover\" });\n if (!defs.length)\n box.appendChild(\n h(\n \"div\",\n { class: \"empty\" },\n `No definition of `,\n h(\"code\", null, word),\n ` found at ${graph}`,\n ),\n );\n for (const d of defs) {\n box.appendChild(\n h(\n \"div\",\n {\n class: \"item\",\n onclick: () => {\n closePopover();\n openPeekAt(d.path, graph, d.line, `${d.kind} ${d.name}`);\n },\n },\n h(\"span\", { class: \"kind\" }, d.kind),\n h(\"span\", { class: \"mono\" }, `${d.path}:${d.line}`),\n ),\n );\n }\n popover(box, { x: e.pageX + 6, y: e.pageY + 10 });\n });\n}\n\nfunction wordAt(e: MouseEvent): string | null {\n const doc = document as Document & {\n caretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null;\n };\n let node: Node | null = null;\n let offset = 0;\n if (doc.caretPositionFromPoint) {\n const p = doc.caretPositionFromPoint(e.clientX, e.clientY);\n if (p) {\n node = p.offsetNode;\n offset = p.offset;\n }\n } else if (document.caretRangeFromPoint) {\n const r = document.caretRangeFromPoint(e.clientX, e.clientY);\n if (r) {\n node = r.startContainer;\n offset = r.startOffset;\n }\n }\n if (!node || node.nodeType !== Node.TEXT_NODE) return null;\n const text = node.textContent ?? \"\";\n const re = /[A-Za-z_$][\\w$]*/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) if (m.index <= offset && offset <= m.index + m[0].length) return m[0];\n return null;\n}\n\n/** Side peek: an anchor from the document, or an arbitrary location. */\nexport interface PeekSpec {\n title: string;\n detail?: string;\n path: string;\n graph: \"head\" | \"base\";\n from: number;\n to: number;\n lines: string[];\n total: number;\n anchorId?: string;\n}\n\nlet current: PeekSpec | null = null;\nexport function currentPeek(): PeekSpec | null {\n return current;\n}\n\nexport function openAnchorPeek(a: CompiledAnchor): void {\n if (!a.peek) return;\n current = {\n title: a.title,\n detail: a.detail,\n path: a.peek.file,\n graph: a.peek.graph,\n from: a.peek.from,\n to: a.peek.to,\n lines: a.peek.lines,\n total: a.peek.total,\n anchorId: a.id,\n };\n state.side = { kind: \"peek\", anchor: a.id };\n emit(\"side\");\n location.hash = location.hash.replace(/&?anchor=[^&]*/, \"\");\n}\n\nexport async function openPeekAt(\n path: string,\n graph: \"head\" | \"base\",\n line: number,\n title?: string,\n): Promise<void> {\n const from = Math.max(1, line - 5);\n const f = await api.file(state.id, path, graph, from, line + 12);\n current = {\n title: title ?? path,\n path,\n graph,\n from: f.from,\n to: f.to,\n lines: f.lines,\n total: f.total,\n };\n current.highlightLine = line;\n state.side = { kind: \"peek\" };\n emit(\"side\");\n}\n\nexport interface PeekSpec {\n highlightLine?: number;\n}\n\nexport function renderPeek(container: HTMLElement): void {\n const p = current;\n if (!p) return;\n const inChanges = !!state.data?.changes.some((c) => c.path === p.path);\n const head = h(\n \"div\",\n { class: \"side-head\" },\n h(\n \"div\",\n { style: { flex: \"1\", minWidth: \"0\" } },\n h(\"div\", { style: { fontWeight: \"600\" } }, p.title),\n h(\n \"div\",\n {\n class: \"path\",\n title: p.path,\n onclick: () =>\n navigate(\"files\", { path: p.path, line: p.highlightLine ?? p.from, side: p.graph }),\n },\n `${p.path}:${p.from}-${p.to}`,\n \" \",\n h(\"span\", { class: `badge ${p.graph === \"base\" ? \"del\" : \"\"}` }, p.graph),\n ),\n ),\n h(\n \"button\",\n {\n class: \"small\",\n onclick: () =>\n navigate(\"files\", { path: p.path, line: p.highlightLine ?? p.from, side: p.graph }),\n },\n inChanges ? \"Open in Files\" : \"Open file\",\n ),\n h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: () => {\n state.side = { kind: \"none\" };\n emit(\"side\");\n },\n },\n \"\u2715\",\n ),\n );\n const body = h(\"div\", { class: \"side-body\" });\n if (p.detail)\n body.appendChild(\n h(\"div\", { class: \"muted\", style: { padding: \"8px 12px\", fontSize: \"13px\" } }, p.detail),\n );\n const frame = h(\"div\", { class: \"code\" });\n const draw = () => {\n frame.innerHTML = \"\";\n const bar = (dir: \"up\" | \"down\") => {\n const can = dir === \"up\" ? p.from > 1 : p.to < p.total;\n return h(\n \"div\",\n { class: \"expand-bar\" },\n can\n ? h(\n \"button\",\n { class: \"small ghost\", onclick: () => expand(dir) },\n dir === \"up\" ? \"\u2191 20 more lines\" : \"\u2193 20 more lines\",\n )\n : h(\"span\", { class: \"muted\" }, dir === \"up\" ? \"start of file\" : \"end of file\"),\n );\n };\n frame.appendChild(bar(\"up\"));\n frame.appendChild(\n codeTable({\n path: p.path,\n graph: p.graph,\n startLine: p.from,\n lines: p.lines,\n highlight: p.highlightLine\n ? [p.highlightLine, p.highlightLine]\n : p.anchorId\n ? [p.from, p.to]\n : undefined,\n commentable: true,\n }),\n );\n frame.appendChild(bar(\"down\"));\n };\n const expand = async (dir: \"up\" | \"down\") => {\n if (dir === \"up\") {\n const from = Math.max(1, p.from - 20);\n const f = await api.file(state.id, p.path, p.graph, from, p.from - 1);\n p.lines = [...f.lines, ...p.lines];\n p.from = from;\n } else {\n const to = Math.min(p.total, p.to + 20);\n const f = await api.file(state.id, p.path, p.graph, p.to + 1, to);\n p.lines = [...p.lines, ...f.lines];\n p.to = to;\n }\n if (p.anchorId) {\n // keep the original range highlighted\n const a = state.data?.document?.anchors[p.anchorId];\n if (a?.peek) p.highlightRange = [a.peek.from, a.peek.to];\n }\n draw();\n };\n draw();\n body.appendChild(frame);\n container.appendChild(head);\n container.appendChild(body);\n}\n\nexport interface PeekSpec {\n highlightRange?: [number, number];\n}\n\nexport function threadsForFile(path: string, side: \"head\" | \"base\", line: number): Thread[] {\n return threadsFor(\n (t) => t.type === \"file\" && t.path === path && t.side === side && t.line === line,\n );\n}\n", "import { api } from \"./api.js\";\nimport { h, closePopover, dialog, timeAgo } from \"./dom.js\";\nimport { state, emit, describeTarget, navigate, readOnly } from \"./state.js\";\nimport type { Thread, ThreadTarget } from \"../store.js\";\n\nexport async function reload(): Promise<void> {\n state.data = await api.review(state.id, state.viewingRevision ?? undefined);\n emit(\"threads\");\n}\n\n/** Popover to start a thread on a target. */\nexport function commentPopover(target: ThreadTarget, quote?: string): HTMLElement {\n const ta = h(\"textarea\", { placeholder: \"Comment, or a question for the agent\u2026\" });\n let mode: \"review\" | \"ask\" = \"review\";\n const modeBtns = h(\"div\", { class: \"row\" });\n const b1 = h(\"button\", { class: \"small primary\", onclick: () => set(\"review\") }, \"Add to review\");\n const b2 = h(\"button\", { class: \"small\", onclick: () => set(\"ask\") }, \"Ask now\");\n const set = (m: \"review\" | \"ask\") => {\n mode = m;\n b1.className = `small ${m === \"review\" ? \"primary\" : \"\"}`;\n b2.className = `small ${m === \"ask\" ? \"primary\" : \"\"}`;\n hint.textContent =\n m === \"review\"\n ? \"Held until you submit the review.\"\n : \"Sent to the agent at once; it answers in this thread.\";\n };\n const hint = h(\n \"span\",\n { class: \"muted\", style: { fontSize: \"12px\" } },\n \"Held until you submit the review.\",\n );\n modeBtns.append(b1, b2, hint);\n const submit = async () => {\n const body = ta.value.trim();\n if (!body) return;\n await api.createThread(state.id, {\n kind: mode === \"ask\" ? \"question\" : \"comment\",\n mode,\n target: quote ? ({ ...target, quote } as ThreadTarget) : target,\n body,\n });\n closePopover();\n await reload();\n };\n ta.addEventListener(\"keydown\", (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") void submit();\n });\n const el = h(\n \"div\",\n { class: \"comment-popover\" },\n quote ? h(\"div\", { class: \"quote\" }, quote) : null,\n h(\n \"div\",\n { class: \"muted\", style: { fontSize: \"12px\", marginBottom: \"4px\" } },\n describeTarget(target),\n ),\n ta,\n modeBtns,\n h(\n \"div\",\n { class: \"row\", style: { justifyContent: \"flex-end\" } },\n h(\"button\", { class: \"small ghost\", onclick: () => closePopover() }, \"Cancel\"),\n h(\"button\", { class: \"small ok\", onclick: submit }, \"Save \", h(\"kbd\", null, \"\u2318\u21B5\")),\n ),\n );\n setTimeout(() => ta.focus());\n return el;\n}\n\n/** Compact pin shown next to a document block or diff line. */\nexport function threadPinRow(t: Thread): HTMLElement {\n const first = t.messages[0];\n const last = t.messages[t.messages.length - 1];\n return h(\n \"div\",\n {\n class: `thread-pin ${t.status === \"resolved\" ? \"resolved\" : \"\"}`,\n onclick: () => focusThread(t.id),\n },\n h(\n \"span\",\n { class: `badge ${t.kind === \"question\" ? \"accent\" : \"\"}` },\n t.kind === \"question\" ? \"Q\" : t.submitted ? \"C\" : \"draft\",\n ),\n h(\"span\", { class: \"who\" }, first?.role === \"agent\" ? \"agent\" : \"you\"),\n h(\n \"span\",\n {\n style: {\n flex: \"1\",\n minWidth: \"0\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n },\n first?.body ?? \"\",\n ),\n t.messages.length > 1\n ? h(\n \"span\",\n { class: \"muted\" },\n `${t.messages.length - 1} repl${t.messages.length > 2 ? \"ies\" : \"y\"} \u00B7 ${last?.role}`,\n )\n : null,\n t.status === \"resolved\" ? h(\"span\", { class: \"badge ok\" }, \"resolved\") : null,\n );\n}\n\nexport function focusThread(id: string): void {\n state.side = { kind: \"threads\", activeThread: id };\n emit(\"side\");\n}\n\nfunction goToTarget(t: Thread): void {\n const tg = t.target;\n if (tg.type === \"document\") {\n navigate(\"review\", { block: tg.blockId });\n } else if (tg.type === \"file\") {\n navigate(\"files\", { path: tg.path, line: tg.line, side: tg.side });\n } else if (tg.type === \"map\") {\n navigate(\"map\", { node: tg.node });\n }\n}\n\nexport function renderThreadsPanel(container: HTMLElement): void {\n const threads = state.data?.threads ?? [];\n const pending = threads.filter((t) => !t.submitted);\n let showResolved = false;\n const head = h(\n \"div\",\n { class: \"side-head\" },\n h(\n \"div\",\n { style: { flex: \"1\" } },\n h(\"b\", null, \"Threads\"),\n \" \",\n h(\"span\", { class: \"muted\" }, `${threads.filter((t) => t.status === \"open\").length} open`),\n ),\n h(\n \"label\",\n { style: { fontSize: \"12px\" } },\n h(\"input\", {\n type: \"checkbox\",\n onchange: (e: Event) => {\n showResolved = (e.target as HTMLInputElement).checked;\n draw();\n },\n }),\n \" resolved\",\n ),\n h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: () => {\n state.side = { kind: \"none\" };\n emit(\"side\");\n },\n },\n \"\u2715\",\n ),\n );\n const body = h(\"div\", { class: \"side-body\" });\n const draw = () => {\n body.innerHTML = \"\";\n if (pending.length && !readOnly()) {\n body.appendChild(\n h(\n \"div\",\n { class: \"banner\" },\n `${pending.length} comment${pending.length > 1 ? \"s\" : \"\"} pending`,\n h(\"span\", { style: { flex: \"1\" } }),\n h(\"button\", { class: \"small primary\", onclick: () => submitDialog() }, \"Submit review\"),\n ),\n );\n }\n const list = h(\"div\", { class: \"threads\" });\n const shown = threads.filter(\n (t) => showResolved || t.status === \"open\" || t.id === state.side.activeThread,\n );\n if (!shown.length)\n list.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n \"No threads yet. Select text, click a line number, or use the + next to a paragraph.\",\n ),\n );\n for (const t of shown.slice().sort((a, b) => (a.updatedAt < b.updatedAt ? 1 : -1)))\n list.appendChild(threadCard(t));\n body.appendChild(list);\n };\n draw();\n container.append(head, body);\n if (state.side.activeThread)\n setTimeout(() => body.querySelector(\".thread.active\")?.scrollIntoView({ block: \"center\" }));\n}\n\nfunction threadCard(t: Thread): HTMLElement {\n const ta = h(\"textarea\", { placeholder: \"Reply\u2026\", rows: 2 });\n const send = async () => {\n const v = ta.value.trim();\n if (!v) return;\n await api.reply(state.id, t.id, v);\n await reload();\n };\n ta.addEventListener(\"keydown\", (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") void send();\n });\n const quote =\n t.target.type === \"document\" || t.target.type === \"file\" ? t.target.quote : undefined;\n return h(\n \"div\",\n { class: `thread ${state.side.activeThread === t.id ? \"active\" : \"\"}` },\n h(\n \"div\",\n { class: \"thead\" },\n h(\n \"span\",\n { class: `badge ${t.kind === \"question\" ? \"accent\" : \"\"}` },\n t.kind === \"question\" ? \"question\" : t.submitted ? \"comment\" : \"pending\",\n ),\n h(\"span\", { class: \"target\", onclick: () => goToTarget(t) }, describeTarget(t.target)),\n h(\"span\", { class: `badge ${t.status === \"resolved\" ? \"ok\" : \"\"}` }, t.status),\n ),\n quote\n ? h(\"div\", { class: \"quote\" }, `\u201C${quote.length > 160 ? quote.slice(0, 160) + \"\u2026\" : quote}\u201D`)\n : null,\n t.messages.map((m) =>\n h(\n \"div\",\n { class: `msg ${m.role}` },\n h(\"span\", { class: \"who\" }, m.role === \"agent\" ? \"Agent\" : \"You\"),\n h(\"span\", { class: \"muted\", style: { fontSize: \"11px\" } }, timeAgo(m.at)),\n h(\"div\", null, m.body),\n ),\n ),\n readOnly()\n ? null\n : h(\n \"div\",\n { class: \"reply\" },\n ta,\n h(\n \"div\",\n { class: \"row\" },\n !t.submitted\n ? h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: async () => {\n await api.deleteThread(state.id, t.id);\n await reload();\n },\n },\n \"Delete\",\n )\n : null,\n t.status === \"open\"\n ? h(\n \"button\",\n {\n class: \"small\",\n onclick: async () => {\n await api.resolve(state.id, t.id);\n await reload();\n },\n },\n \"Resolve\",\n )\n : h(\n \"button\",\n {\n class: \"small\",\n onclick: async () => {\n await api.reopen(state.id, t.id);\n await reload();\n },\n },\n \"Reopen\",\n ),\n h(\"button\", { class: \"small primary\", onclick: send }, \"Reply\"),\n ),\n ),\n );\n}\n\nexport function submitDialog(): void {\n const pending = (state.data?.threads ?? []).filter((t) => !t.submitted).length;\n const ta = h(\"textarea\", { rows: 4, placeholder: \"Summary for the agent (optional)\" });\n const d = dialog(\n h(\n \"div\",\n null,\n h(\"h3\", null, \"Submit review\"),\n h(\n \"p\",\n { class: \"muted\" },\n pending\n ? `${pending} pending comment${pending > 1 ? \"s\" : \"\"} will be sent to the agent.`\n : \"No pending comments.\",\n ),\n ta,\n h(\n \"div\",\n { class: \"row\" },\n h(\"button\", { class: \"ghost\", onclick: () => d.close() }, \"Cancel\"),\n h(\"button\", { onclick: () => decide(\"request-changes\") }, \"Request changes\"),\n h(\"button\", { class: \"ok\", onclick: () => decide(\"approve\") }, \"Approve\"),\n ),\n ),\n );\n const decide = async (decision: \"approve\" | \"request-changes\") => {\n await api.submit(state.id, decision, ta.value.trim());\n d.close();\n await reload();\n emit(\"data\");\n };\n}\n", "import { h, popover } from \"../dom.js\";\nimport { state, threadsFor, navigate } from \"../state.js\";\nimport { codeTable, openAnchorPeek } from \"../code.js\";\nimport { commentPopover, threadPinRow } from \"../threads.js\";\nimport { sequenceDiagram, callstackDiff, databaseLens } from \"../diagrams.js\";\nimport type { Block } from \"../../document/compile.js\";\n\nexport function renderReview(root: HTMLElement): void {\n const doc = state.data?.document;\n if (!doc) {\n root.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n \"Nothing published yet. The agent publishes a revision with \",\n h(\"code\", null, \"thurview publish\"),\n \".\",\n ),\n );\n return;\n }\n const layout = h(\"div\", { class: \"doc-layout\" });\n const toc = h(\n \"nav\",\n { class: \"toc\" },\n doc.toc.map((t) =>\n h(\n \"a\",\n {\n href: `#/review?block=${t.id}`,\n class: `l${t.level}`,\n \"data-block\": t.id,\n onclick: (e: Event) => {\n e.preventDefault();\n scrollToBlock(t.id);\n },\n },\n t.text,\n ),\n ),\n );\n const docEl = h(\"article\", { class: \"doc\" });\n let section: HTMLElement | null = null;\n const sectionLevel = 2;\n for (const b of doc.blocks) {\n const el = renderBlock(b);\n if (b.type === \"heading\" && b.level === sectionLevel) {\n section = h(\"div\", { class: `section ${b.collapsed ? \"section-collapsed\" : \"\"}` });\n docEl.appendChild(section);\n const toggle = h(\"span\", { class: \"heading-toggle\" }, b.collapsed ? \"show\" : \"hide\");\n toggle.addEventListener(\"click\", () => {\n const s = toggle.closest(\".section\")!;\n s.classList.toggle(\"section-collapsed\");\n toggle.textContent = s.classList.contains(\"section-collapsed\") ? \"show\" : \"hide\";\n });\n el.querySelector(\"h2,h1,h3\")?.appendChild(toggle);\n el.classList.add(\"heading\");\n section.appendChild(el);\n } else (section ?? docEl).appendChild(el);\n }\n layout.append(toc, docEl);\n root.appendChild(layout);\n selectionHandler(docEl);\n docEl.addEventListener(\"click\", (e) => {\n const a = (e.target as HTMLElement).closest(\"a.anchor-link\") as HTMLElement | null;\n if (!a) return;\n e.preventDefault();\n const id = a.dataset[\"anchor\"]!;\n const anchor = doc.anchors[id];\n if (anchor) {\n docEl.querySelectorAll(\"a.anchor-link.active\").forEach((x) => x.classList.remove(\"active\"));\n a.classList.add(\"active\");\n openAnchorPeek(anchor);\n }\n });\n const target = state.params.get(\"block\");\n if (target) setTimeout(() => scrollToBlock(target), 50);\n const anchorParam = state.params.get(\"anchor\");\n if (anchorParam && doc.anchors[anchorParam] && state.side.kind !== \"peek\")\n openAnchorPeek(doc.anchors[anchorParam]!);\n const io = new IntersectionObserver(\n (entries) => {\n for (const en of entries) {\n if (!en.isIntersecting) continue;\n const id = (en.target as HTMLElement).dataset[\"block\"];\n toc\n .querySelectorAll(\"a\")\n .forEach((a) => a.classList.toggle(\"active\", a.dataset[\"block\"] === id));\n }\n },\n { rootMargin: \"-10% 0px -80% 0px\" },\n );\n docEl.querySelectorAll(\".block.heading\").forEach((el) => io.observe(el));\n}\n\nfunction scrollToBlock(id: string): void {\n const el = document.querySelector(`[data-block=\"${id}\"]`) as HTMLElement | null;\n if (!el) return;\n el.closest(\".section\")?.classList.remove(\"section-collapsed\");\n el.scrollIntoView({ block: \"start\", behavior: \"smooth\" });\n el.style.transition = \"background .8s\";\n el.style.background = \"var(--sel)\";\n setTimeout(() => (el.style.background = \"\"), 1200);\n}\n\nfunction renderBlock(b: Block): HTMLElement {\n const doc = state.data!.document!;\n const wrap = h(\"div\", { class: \"block\", \"data-block\": b.id });\n const threads = threadsFor((t) => t.type === \"document\" && t.blockId === b.id);\n if (threads.length) wrap.classList.add(\"has-threads\");\n const actions = h(\n \"div\",\n { class: \"block-actions\" },\n h(\n \"button\",\n {\n class: threads.length ? \"count\" : \"\",\n title: \"Comment on this block\",\n onclick: (e: MouseEvent) => {\n if (state.viewingRevision !== null) return;\n popover(commentPopover({ type: \"document\", blockId: b.id }), {\n x: e.pageX + 10,\n y: e.pageY,\n });\n },\n },\n threads.length ? String(threads.length) : \"+\",\n ),\n );\n wrap.appendChild(actions);\n switch (b.type) {\n case \"html\":\n case \"heading\":\n wrap.appendChild(h(\"div\", { html: b.html }));\n break;\n case \"peek\": {\n const a = doc.anchors[b.anchor];\n if (a?.peek) {\n wrap.appendChild(\n h(\n \"div\",\n { class: \"code-frame\" },\n h(\n \"div\",\n { class: \"frame-head\" },\n h(\"span\", { class: \"title\" }, a.title),\n h(\n \"span\",\n {\n class: \"path\",\n title: \"Open in Files\",\n onclick: () =>\n navigate(\"files\", {\n path: a.peek!.file,\n line: a.peek!.from,\n side: a.peek!.graph,\n }),\n },\n `${a.peek.file}:${a.peek.from}-${a.peek.to}`,\n ),\n h(\"span\", { class: `badge ${a.peek.graph === \"base\" ? \"del\" : \"\"}` }, a.peek.graph),\n h(\"button\", { class: \"small ghost\", onclick: () => openAnchorPeek(a) }, \"peek \u25B8\"),\n ),\n a.detail\n ? h(\n \"div\",\n { class: \"muted\", style: { padding: \"4px 10px\", fontSize: \"12.5px\" } },\n a.detail,\n )\n : null,\n h(\n \"div\",\n { class: \"code\" },\n codeTable({\n path: a.peek.file,\n graph: a.peek.graph,\n startLine: a.peek.from,\n lines: a.peek.lines,\n commentable: true,\n }),\n ),\n ),\n );\n }\n break;\n }\n case \"sequence\":\n wrap.appendChild(sequenceDiagram(b));\n break;\n case \"callstack\":\n wrap.appendChild(callstackDiff(b, doc));\n break;\n case \"database\":\n wrap.appendChild(databaseLens(b, doc));\n break;\n }\n if (threads.length)\n wrap.appendChild(h(\"div\", { class: \"thread-pins\" }, threads.map(threadPinRow)));\n return wrap;\n}\n\n/** Selecting text inside a block offers a comment on that block with the quote. */\nfunction selectionHandler(docEl: HTMLElement): void {\n let btn: HTMLElement | null = null;\n const remove = () => {\n btn?.remove();\n btn = null;\n };\n document.addEventListener(\"selectionchange\", () => {\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || !sel.rangeCount) return remove();\n const range = sel.getRangeAt(0);\n const block = (\n range.commonAncestorContainer instanceof Element\n ? range.commonAncestorContainer\n : range.commonAncestorContainer.parentElement\n )?.closest(\".block\") as HTMLElement | null;\n if (!block || !docEl.contains(block) || state.viewingRevision !== null) return remove();\n const quote = sel.toString().trim();\n if (!quote) return remove();\n const rect = range.getBoundingClientRect();\n remove();\n btn = h(\n \"button\",\n {\n class: \"small primary selection-btn\",\n onmousedown: (e: MouseEvent) => e.preventDefault(),\n onclick: (e: MouseEvent) => {\n const id = block.dataset[\"block\"]!;\n remove();\n popover(commentPopover({ type: \"document\", blockId: id }, quote), {\n x: e.pageX,\n y: e.pageY + 8,\n });\n window.getSelection()?.removeAllRanges();\n },\n },\n \"Comment / Ask\",\n );\n btn.style.left = `${rect.left + window.scrollX}px`;\n btn.style.top = `${rect.bottom + window.scrollY + 6}px`;\n document.body.appendChild(btn);\n });\n}\n", "import { h, svg } from \"./dom.js\";\nimport { state } from \"./state.js\";\nimport type { Block, CompiledDocument } from \"../document/compile.js\";\nimport { openAnchorPeek } from \"./code.js\";\nimport { popover } from \"./dom.js\";\n\ntype Seq = Extract<Block, { type: \"sequence\" }>;\ntype Stack = Extract<Block, { type: \"callstack\" }>;\ntype Db = Extract<Block, { type: \"database\" }>;\n\nfunction openAnchor(id: string): void {\n const a = state.data?.document?.anchors[id];\n if (a) openAnchorPeek(a);\n}\n\nexport function sequenceDiagram(b: Seq): HTMLElement {\n const colW = 170;\n const top = 44;\n const rowH = 34;\n const n = b.actors.length;\n const width = Math.max(colW * n, 320);\n const height = top + rowH * (b.messages.length + 1) + 10;\n const el = svg(\"svg\", { viewBox: `0 0 ${width} ${height}`, class: \"seq\" });\n el.appendChild(\n svg(\n \"defs\",\n {},\n svg(\n \"marker\",\n {\n id: \"arr\",\n viewBox: \"0 0 10 10\",\n refX: \"9\",\n refY: \"5\",\n markerWidth: \"7\",\n markerHeight: \"7\",\n orient: \"auto\",\n },\n svg(\"path\", { d: \"M0,0 L10,5 L0,10 z\", fill: \"currentColor\" }),\n ),\n ),\n );\n const x = (id: string) => b.actors.findIndex((a) => a.id === id) * colW + colW / 2;\n b.actors.forEach((a, i) => {\n const cx = i * colW + colW / 2;\n const g = svg(\"g\", { class: \"actor\" });\n g.appendChild(svg(\"rect\", { x: cx - 70, y: 6, width: 140, height: 28, rx: 6 }));\n g.appendChild(svg(\"text\", { x: cx, y: 25, \"text-anchor\": \"middle\" }, a.label));\n g.appendChild(svg(\"line\", { class: \"life\", x1: cx, y1: 34, x2: cx, y2: height - 6 }));\n el.appendChild(g);\n });\n b.messages.forEach((m, i) => {\n const y = top + rowH * (i + 1);\n const x1 = x(m.from);\n const x2 = x(m.to);\n const g = svg(\"g\", { class: \"msg\" });\n const self = x1 === x2;\n if (self) {\n g.appendChild(\n svg(\"path\", {\n d: `M${x1},${y - 10} h30 v20 h-30`,\n fill: \"none\",\n stroke: \"currentColor\",\n \"marker-end\": \"url(#arr)\",\n }),\n );\n } else {\n g.appendChild(svg(\"line\", { x1, y1: y, x2: x2 + (x2 > x1 ? -4 : 4), y2: y }));\n }\n const label = svg(\n \"text\",\n { x: self ? x1 + 36 : (x1 + x2) / 2, y: y - 6, \"text-anchor\": self ? \"start\" : \"middle\" },\n `${i + 1}. ${m.label}`,\n );\n label.addEventListener(\"click\", (e) => {\n if (m.anchor) openAnchor(m.anchor);\n else if (m.code)\n popover(\n h(\n \"div\",\n { class: \"def-popover\" },\n h(\"pre\", { style: { margin: \"0\", border: \"none\" } }, m.code.text),\n ),\n { x: e.pageX, y: e.pageY + 8 },\n );\n });\n g.appendChild(label);\n el.appendChild(g);\n });\n return h(\"div\", { class: \"diagram\" }, h(\"div\", { class: \"dhead\" }, b.label), el);\n}\n\nexport function callstackDiff(b: Stack, doc: CompiledDocument): HTMLElement {\n const rows = b.rows.map((r, i) => {\n const a = doc.anchors[r.anchor];\n return h(\n \"div\",\n { class: `row ${r.kind}`, title: r.reason ?? \"\", onclick: () => openAnchor(r.anchor) },\n h(\"span\", { class: \"sign\" }, r.kind === \"add\" ? \"+\" : r.kind === \"del\" ? \"\u2212\" : \" \"),\n h(\"span\", { style: { width: `${i * 14}px`, display: \"inline-block\" } }),\n r.calls ? h(\"span\", { class: \"calls\" }, \"\u2248 \") : null,\n h(\"span\", null, a?.title ?? r.anchor),\n a?.peek\n ? h(\n \"span\",\n { class: \"muted\", style: { marginLeft: \"auto\" } },\n `${a.peek.file}:${a.peek.from}`,\n )\n : null,\n );\n });\n return h(\n \"div\",\n { class: \"diagram callstack\" },\n h(\"div\", { class: \"dhead\" }, b.title ?? \"Call stack\"),\n h(\"div\", { style: { padding: \"6px 0\" } }, rows),\n );\n}\n\nexport function databaseLens(b: Db, doc: CompiledDocument): HTMLElement {\n let active = 0;\n const tabs = h(\"div\", { class: \"uc-tabs\" });\n const body = h(\"div\", { class: \"body\" });\n const draw = () => {\n tabs.innerHTML = \"\";\n b.usecases.forEach((uc, i) =>\n tabs.appendChild(\n h(\n \"button\",\n {\n class: `small ${i === active ? \"active\" : \"\"}`,\n onclick: () => {\n active = i;\n draw();\n },\n },\n uc.label,\n ),\n ),\n );\n const uc = b.usecases[active]!;\n body.innerHTML = \"\";\n const touched = new Map<string, Set<string>>();\n for (const op of uc.ops) {\n const [s, c, f] = op.store.split(\".\");\n const key = `${s}.${c}`;\n if (!touched.has(key)) touched.set(key, new Set());\n if (f) touched.get(key)!.add(f);\n }\n const actorIds = [...new Set(uc.ops.map((o) => o.actor))];\n body.appendChild(\n h(\n \"div\",\n { class: \"actors\" },\n actorIds.map((id) => h(\"div\", { class: \"actor\" }, doc.actors[id]?.label ?? id)),\n ),\n );\n const stores = h(\"div\", null);\n for (const sid of b.stores) {\n const s = doc.stores[sid];\n if (!s) continue;\n const colls = s.tables ?? s.documents ?? {};\n stores.appendChild(\n h(\n \"div\",\n { class: \"store\" },\n h(\"div\", { class: \"sname\" }, s.label, \" \", h(\"span\", { class: \"badge\" }, s.kind)),\n Object.entries(colls).map(([cid, c]) => {\n const hit = touched.get(`${sid}.${cid}`);\n return h(\n \"div\",\n { class: `table ${hit ? \"hit\" : \"\"}` },\n h(\"div\", { class: \"tname\" }, c.label ?? cid),\n h(\n \"div\",\n { class: \"cols\" },\n Object.entries(c.schema).map(([f, def]) =>\n h(\n \"span\",\n { class: hit?.has(f) ? \"hit\" : \"\" },\n `${f}${def.pk ? \"*\" : \"\"}:${def.type} `,\n ),\n ),\n ),\n );\n }),\n ),\n );\n }\n body.appendChild(stores);\n };\n draw();\n const ops = h(\"div\", { class: \"ops\" });\n const drawOps = () => {\n ops.innerHTML = \"\";\n const uc = b.usecases[active]!;\n if (uc.summary) ops.appendChild(h(\"div\", { class: \"muted\" }, uc.summary));\n for (const op of uc.ops) {\n ops.appendChild(\n h(\n \"div\",\n { class: `op ${op.op}`, onclick: () => openAnchor(op.anchor) },\n h(\n \"span\",\n { class: \"dir\" },\n op.op === \"read\"\n ? `${op.store} \u2192 ${doc.actors[op.actor]?.label ?? op.actor}`\n : `${doc.actors[op.actor]?.label ?? op.actor} \u2192 ${op.store}`,\n ),\n h(\"span\", null, op.label),\n ),\n );\n }\n };\n drawOps();\n tabs.addEventListener(\"click\", drawOps);\n return h(\n \"div\",\n { class: \"diagram dblens\" },\n h(\"div\", { class: \"dhead\" }, b.title ?? \"Storage\"),\n tabs,\n body,\n ops,\n );\n}\n", "import { api } from \"../api.js\";\nimport { h } from \"../dom.js\";\nimport { state, navigate, isNarrow } from \"../state.js\";\nimport { attachDefinitions, startLineComment, lineClick, codeSelectionHandler } from \"../code.js\";\nimport { threadPinRow } from \"../threads.js\";\nimport type { FileDiff, DiffRow } from \"../../diff.js\";\nimport type { Thread } from \"../../store.js\";\n\nexport function renderFiles(root: HTMLElement): void {\n const changes = state.data?.changes ?? [];\n const path = state.params.get(\"path\") ?? changes[0]?.path ?? \"\";\n const list = h(\"div\", { class: \"file-list\" });\n for (const c of changes) {\n const n = (state.data?.threads ?? []).filter(\n (t) => t.target.type === \"file\" && t.target.path === c.path && t.status === \"open\",\n ).length;\n list.appendChild(\n h(\n \"div\",\n {\n class: `item ${c.path === path ? \"active\" : \"\"}`,\n onclick: () => navigate(\"files\", { path: c.path }),\n },\n h(\n \"span\",\n {\n class: `badge ${c.status === \"A\" ? \"ok\" : c.status === \"D\" ? \"del\" : \"\"}`,\n style: { minWidth: \"20px\", textAlign: \"center\" },\n },\n c.status,\n ),\n h(\"span\", { class: \"name\", title: c.path }, c.path),\n n ? h(\"span\", { class: \"badge accent\" }, String(n)) : null,\n h(\n \"span\",\n { class: \"stat\" },\n h(\"span\", { class: \"a\" }, `+${c.additions}`),\n \" \",\n h(\"span\", { class: \"d\" }, `\u2212${c.deletions}`),\n ),\n ),\n );\n }\n if (!changes.length)\n list.appendChild(\n h(\"div\", { class: \"empty-state\" }, \"No changed files: base and head are the same commit.\"),\n );\n const view = h(\"div\", { class: \"file-view\", \"data-path\": path });\n root.appendChild(h(\"div\", { class: \"files-layout\" }, list, view));\n if (path) void renderDiff(view, path);\n}\n\nasync function renderDiff(view: HTMLElement, path: string): Promise<void> {\n const inChanges = state.data?.changes.some((c) => c.path === path);\n const line = Number(state.params.get(\"line\") ?? 0);\n const side = state.params.get(\"side\") === \"base\" ? \"base\" : \"head\";\n view.appendChild(h(\"div\", { class: \"muted\", style: { padding: \"12px\" } }, \"Loading\u2026\"));\n let d: FileDiff;\n try {\n if (inChanges) d = await api.diff(state.id, path);\n else {\n const f = await api.file(state.id, path, side);\n d = {\n path,\n lang: f.lang,\n binary: false,\n oldTotal: 0,\n newTotal: f.total,\n hunks: [\n {\n oldStart: 1,\n oldLines: 0,\n newStart: 1,\n newLines: f.total,\n rows: f.lines.map((html, i) => ({\n type: \"context\",\n newLine: i + 1,\n oldLine: i + 1,\n html,\n })),\n },\n ],\n };\n }\n } catch (e) {\n view.innerHTML = \"\";\n view.appendChild(h(\"div\", { class: \"empty-state\" }, (e as Error).message));\n return;\n }\n view.innerHTML = \"\";\n // Split needs two code columns; below the breakpoint there is room for one.\n const split = state.splitDiff && inChanges && !isNarrow();\n const toggle = h(\n \"button\",\n {\n class: \"small\",\n onclick: () => {\n state.splitDiff = !state.splitDiff;\n localStorage.setItem(\"thurview.split\", state.splitDiff ? \"1\" : \"0\");\n view.innerHTML = \"\";\n void renderDiff(view, path);\n },\n },\n state.splitDiff ? \"Unified\" : \"Split\",\n );\n const fileThreads = (state.data?.threads ?? []).filter(\n (t) => t.target.type === \"file\" && t.target.path === path && t.target.line === 0,\n );\n view.appendChild(\n h(\n \"div\",\n { class: \"file-head\" },\n h(\"span\", { class: \"path\" }, d.oldPath ? `${d.oldPath} \u2192 ${path}` : path),\n h(\n \"span\",\n { class: \"muted\" },\n `${d.hunks.reduce((n, hk) => n + hk.rows.filter((r) => r.type === \"add\").length, 0)} added \u00B7 ${d.hunks.reduce((n, hk) => n + hk.rows.filter((r) => r.type === \"del\").length, 0)} deleted`,\n ),\n h(\n \"span\",\n { class: \"muted hint\" },\n \"click a line number to comment \u00B7 shift-click or select text for a range\",\n ),\n state.viewingRevision === null\n ? h(\n \"button\",\n {\n class: \"small\",\n onclick: (e: MouseEvent) =>\n startLineComment(e, { type: \"file\", path, side: \"head\", line: 0 }),\n },\n fileThreads.length ? `File comments (${fileThreads.length})` : \"Comment on file\",\n )\n : null,\n inChanges\n ? isNarrow()\n ? null\n : toggle\n : h(\"span\", { class: \"badge\" }, `full file at ${side}`),\n ),\n );\n if (fileThreads.length)\n view.appendChild(\n h(\n \"div\",\n { class: \"thread-pins\", style: { margin: \"8px 14px\" } },\n fileThreads.map(threadPinRow),\n ),\n );\n if (d.binary) {\n view.appendChild(h(\"div\", { class: \"empty-state\" }, \"Binary file\"));\n return;\n }\n const threads = (state.data?.threads ?? []).filter(\n (t): t is Thread & { target: { type: \"file\" } } =>\n t.target.type === \"file\" && t.target.path === path,\n );\n const el = split ? splitView(d, threads) : unifiedView(d, threads);\n view.appendChild(el);\n codeSelectionHandler(view);\n if (line) {\n const tr = el.querySelector(`tr[data-${side}=\"${line}\"]`) as HTMLElement | null;\n if (tr) {\n tr.classList.add(\"hl\");\n tr.scrollIntoView({ block: \"center\" });\n }\n }\n}\n\nfunction lineCell(\n path: string,\n side: \"head\" | \"base\",\n n: number | undefined,\n _text: string,\n): HTMLElement {\n return h(\n \"td\",\n {\n class: \"ln\",\n title: n ? \"Comment on this line (shift-click for a range)\" : \"\",\n onclick: (e: MouseEvent) => {\n const table = (e.currentTarget as HTMLElement).closest(\"table\") as HTMLTableElement | null;\n if (n && table) lineClick(e, path, side, n, table);\n },\n },\n n ? String(n) : \"\",\n );\n}\n\nfunction threadRows(\n threads: (Thread & { target: { type: \"file\" } })[],\n side: \"head\" | \"base\",\n n: number | undefined,\n colspan: number,\n): HTMLElement[] {\n if (!n) return [];\n return threads\n .filter((t) => t.target.side === side && (t.target.endLine ?? t.target.line) === n)\n .map((t) => h(\"tr\", { class: \"thread-row\" }, h(\"td\", { colspan }, threadPinRow(t))));\n}\n\nfunction gapRow(\n d: FileDiff,\n from: number,\n to: number,\n colspan: number,\n onExpand: (rows: DiffRow[]) => void,\n): HTMLElement | null {\n if (to < from) return null;\n const count = to - from + 1;\n return h(\n \"tr\",\n { class: \"gap\" },\n h(\n \"td\",\n {\n colspan,\n onclick: async () => {\n const f = await api.file(state.id, d.path, \"head\", from, to);\n // map head line -> old line by offset within this gap (context lines only)\n onExpand(\n f.lines.map((html, i) => ({\n type: \"context\",\n newLine: from + i,\n oldLine: from + i - (gapOffset(d, from) ?? 0),\n html,\n })),\n );\n },\n },\n `\u22EF ${count} unchanged line${count > 1 ? \"s\" : \"\"}`,\n ),\n );\n}\n\nfunction gapOffset(d: FileDiff, newLine: number): number | undefined {\n // offset between new and old numbering before this gap\n let off = 0;\n for (const hk of d.hunks) {\n if (hk.newStart > newLine) break;\n off = hk.newStart + hk.newLines - (hk.oldStart + hk.oldLines);\n }\n return off;\n}\n\nfunction unifiedView(d: FileDiff, threads: (Thread & { target: { type: \"file\" } })[]): HTMLElement {\n const table = h(\"table\");\n const text = (html: string) => {\n const x = document.createElement(\"div\");\n x.innerHTML = html;\n return x.textContent ?? \"\";\n };\n const rowEl = (r: DiffRow) => {\n const tr = h(\n \"tr\",\n { class: r.type, \"data-head\": r.newLine ?? \"\", \"data-base\": r.oldLine ?? \"\" },\n lineCell(d.path, \"base\", r.oldLine, text(r.html)),\n lineCell(d.path, \"head\", r.newLine, text(r.html)),\n h(\"td\", {\n class: \"src\",\n html: (r.type === \"add\" ? \"+\" : r.type === \"del\" ? \"-\" : \" \") + (r.html || \" \"),\n }),\n );\n return [\n tr,\n ...threadRows(\n threads,\n r.type === \"del\" ? \"base\" : \"head\",\n r.type === \"del\" ? r.oldLine : r.newLine,\n 3,\n ),\n ];\n };\n let prevEnd = 0;\n d.hunks.forEach((hk, i) => {\n const gap = gapRow(d, prevEnd + 1, hk.newStart - 1, 3, (rows) => {\n const g = table.querySelector(`tr.gap[data-i=\"${i}\"]`);\n if (!g) return;\n rows.flatMap(rowEl).forEach((r) => table.insertBefore(r, g));\n g.remove();\n });\n if (gap) {\n gap.dataset[\"i\"] = String(i);\n table.appendChild(gap);\n }\n for (const r of hk.rows) rowEl(r).forEach((x) => table.appendChild(x));\n prevEnd = hk.newStart + hk.newLines - 1;\n });\n if (d.newTotal > prevEnd) {\n const gap = gapRow(d, prevEnd + 1, d.newTotal, 3, (rows) => {\n const g = table.querySelector(\"tr.gap.tail\");\n if (!g) return;\n rows.flatMap(rowEl).forEach((r) => table.insertBefore(r, g));\n g.remove();\n });\n if (gap) {\n gap.classList.add(\"tail\");\n table.appendChild(gap);\n }\n }\n const wrap = h(\"div\", { class: \"code\" }, table);\n attachDefinitions(wrap, \"head\");\n return wrap;\n}\n\nfunction splitView(d: FileDiff, threads: (Thread & { target: { type: \"file\" } })[]): HTMLElement {\n const left = h(\"table\");\n const right = h(\"table\");\n const text = (html: string) => {\n const x = document.createElement(\"div\");\n x.innerHTML = html;\n return x.textContent ?? \"\";\n };\n const pair = (l: DiffRow | null, r: DiffRow | null) => {\n const ltr = l\n ? h(\n \"tr\",\n { class: l.type === \"del\" ? \"del\" : \"\", \"data-base\": l.oldLine ?? \"\" },\n lineCell(d.path, \"base\", l.oldLine, text(l.html)),\n h(\"td\", { class: \"src\", html: l.html || \" \" }),\n )\n : h(\"tr\", null, h(\"td\", { class: \"ln empty\" }), h(\"td\", { class: \"src empty\" }, \" \"));\n const rtr = r\n ? h(\n \"tr\",\n { class: r.type === \"add\" ? \"add\" : \"\", \"data-head\": r.newLine ?? \"\" },\n lineCell(d.path, \"head\", r.newLine, text(r.html)),\n h(\"td\", { class: \"src\", html: r.html || \" \" }),\n )\n : h(\"tr\", null, h(\"td\", { class: \"ln empty\" }), h(\"td\", { class: \"src empty\" }, \" \"));\n left.appendChild(ltr);\n right.appendChild(rtr);\n const lt = threadRows(threads, \"base\", l?.oldLine, 2);\n const rt = threadRows(threads, \"head\", r?.newLine, 2);\n // keep both sides aligned: pad the shorter side\n const n = Math.max(lt.length, rt.length);\n for (let i = 0; i < n; i++) {\n left.appendChild(lt[i] ?? h(\"tr\", { class: \"thread-row\" }, h(\"td\", { colspan: 2 }, \" \")));\n right.appendChild(rt[i] ?? h(\"tr\", { class: \"thread-row\" }, h(\"td\", { colspan: 2 }, \" \")));\n }\n };\n const emitRows = (rows: DiffRow[]) => {\n let i = 0;\n while (i < rows.length) {\n const r = rows[i]!;\n if (r.type === \"context\") {\n pair(r, r);\n i++;\n continue;\n }\n const dels: DiffRow[] = [];\n const adds: DiffRow[] = [];\n while (i < rows.length && rows[i]!.type === \"del\") dels.push(rows[i++]!);\n while (i < rows.length && rows[i]!.type === \"add\") adds.push(rows[i++]!);\n const n = Math.max(dels.length, adds.length);\n for (let k = 0; k < n; k++) pair(dels[k] ?? null, adds[k] ?? null);\n }\n };\n let prevEnd = 0;\n const gapBoth = (from: number, to: number) => {\n if (to < from) return;\n const count = to - from + 1;\n const lg = h(\"tr\", { class: \"gap\" }, h(\"td\", { colspan: 2 }, `\u22EF ${count} unchanged`));\n const rg = h(\"tr\", { class: \"gap\" }, h(\"td\", { colspan: 2 }, `\u22EF ${count} unchanged`));\n const expand = async () => {\n const f = await api.file(state.id, d.path, \"head\", from, to);\n const off = gapOffset(d, from) ?? 0;\n const rows: DiffRow[] = f.lines.map((html, k) => ({\n type: \"context\",\n newLine: from + k,\n oldLine: from + k - off,\n html,\n }));\n const lAnchor = lg.nextSibling;\n const rAnchor = rg.nextSibling;\n lg.remove();\n rg.remove();\n const tmpL = left;\n const tmpR = right;\n const fragL = document.createDocumentFragment();\n const fragR = document.createDocumentFragment();\n for (const r of rows) {\n fragL.appendChild(\n h(\n \"tr\",\n { \"data-base\": r.oldLine ?? \"\" },\n lineCell(d.path, \"base\", r.oldLine, text(r.html)),\n h(\"td\", { class: \"src\", html: r.html || \" \" }),\n ),\n );\n fragR.appendChild(\n h(\n \"tr\",\n { \"data-head\": r.newLine ?? \"\" },\n lineCell(d.path, \"head\", r.newLine, text(r.html)),\n h(\"td\", { class: \"src\", html: r.html || \" \" }),\n ),\n );\n }\n tmpL.insertBefore(fragL, lAnchor);\n tmpR.insertBefore(fragR, rAnchor);\n };\n lg.addEventListener(\"click\", expand);\n rg.addEventListener(\"click\", expand);\n left.appendChild(lg);\n right.appendChild(rg);\n };\n for (const hk of d.hunks) {\n gapBoth(prevEnd + 1, hk.newStart - 1);\n emitRows(hk.rows);\n prevEnd = hk.newStart + hk.newLines - 1;\n }\n gapBoth(prevEnd + 1, d.newTotal);\n const l = h(\"div\", { class: \"code\" }, left);\n const r = h(\"div\", { class: \"code\" }, right);\n attachDefinitions(l, \"base\");\n attachDefinitions(r, \"head\");\n // synced horizontal scroll\n l.addEventListener(\"scroll\", () => (r.scrollLeft = l.scrollLeft));\n r.addEventListener(\"scroll\", () => (l.scrollLeft = r.scrollLeft));\n return h(\"div\", { class: \"split\" }, l, r);\n}\n", "import { api } from \"../api.js\";\nimport { h } from \"../dom.js\";\nimport { state, navigate } from \"../state.js\";\n\nexport async function renderCommits(root: HTMLElement): Promise<void> {\n const el = h(\"div\", { class: \"commits\" }, h(\"div\", { class: \"muted\" }, \"Loading\u2026\"));\n root.appendChild(el);\n const commits = await api.commits(state.id);\n el.innerHTML = \"\";\n const r = state.data!.review;\n el.appendChild(\n h(\n \"p\",\n { class: \"muted\" },\n `${commits.length} commit${commits.length === 1 ? \"\" : \"s\"} from `,\n h(\"code\", null, r.pins.base.slice(0, 12)),\n \" to \",\n h(\"code\", null, r.pins.head.slice(0, 12)),\n ),\n );\n if (!commits.length)\n el.appendChild(h(\"div\", { class: \"empty-state\" }, \"No commits between base and head.\"));\n for (const c of commits) {\n el.appendChild(\n h(\n \"div\",\n { class: \"commit\" },\n h(\n \"div\",\n null,\n h(\"span\", { class: \"subject\" }, c.subject),\n \" \",\n h(\"code\", null, c.shortSha),\n \" \",\n h(\"span\", { class: \"muted\" }, `${c.author} \u00B7 ${new Date(c.date).toLocaleString()}`),\n ),\n c.body ? h(\"pre\", null, c.body) : null,\n h(\n \"div\",\n { class: \"files\" },\n c.files.map((f) => h(\"span\", { onclick: () => navigate(\"files\", { path: f }) }, f)),\n ),\n ),\n );\n }\n}\n", "import { h, append, popover } from \"../dom.js\";\nimport { state, navigate, threadsFor } from \"../state.js\";\nimport { openAnchorPeek } from \"../code.js\";\nimport { commentPopover, threadPinRow } from \"../threads.js\";\nimport type { MapNode, MapEdge } from \"../../document/schema.js\";\n\nexport function renderMap(root: HTMLElement): void {\n const map = state.data?.map;\n if (!map) {\n root.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n \"No software map in this revision. The agent authors \",\n h(\"code\", null, \"map.yaml\"),\n \" and publishes again.\",\n ),\n );\n return;\n }\n const headNodes = new Map(map.head.nodes.map((n) => [n.id, n]));\n const baseNodes = new Map((map.base?.nodes ?? []).map((n) => [n.id, n]));\n const all = new Map<string, MapNode & { status: \"added\" | \"removed\" | \"changed\" | \"\" }>();\n for (const n of map.head.nodes)\n all.set(n.id, {\n ...n,\n status: map.diff.added.includes(n.id)\n ? \"added\"\n : map.diff.changed.includes(n.id)\n ? \"changed\"\n : \"\",\n });\n for (const id of map.diff.removed) {\n const n = baseNodes.get(id);\n if (n) all.set(id, { ...n, status: \"removed\" });\n }\n const edges: MapEdge[] = [...map.head.edges];\n for (const e of map.base?.edges ?? [])\n if (!edges.some((x) => x.from === e.from && x.to === e.to)) edges.push(e);\n\n const selected = state.params.get(\"node\") ?? \"\";\n const parentOf = (id: string) => (id.includes(\".\") ? id.slice(0, id.lastIndexOf(\".\")) : \"\");\n let level =\n selected && all.has(selected)\n ? childrenOf(selected).length\n ? selected\n : parentOf(selected)\n : \"\";\n\n function childrenOf(p: string) {\n return [...all.values()].filter((n) => parentOf(n.id) === p);\n }\n function descendantsChanged(id: string) {\n return [...all.values()].filter((n) => n.id.startsWith(id + \".\") && n.status).length;\n }\n const canvas = h(\"div\", { class: \"map-canvas\" });\n const side = h(\"div\", { class: \"map-side\" });\n root.appendChild(h(\"div\", { class: \"map-layout\" }, canvas, side));\n\n const draw = () => {\n canvas.innerHTML = \"\";\n const crumbs = h(\"div\", { class: \"crumbs\" });\n const parts = level ? level.split(\".\") : [];\n crumbs.appendChild(\n h(\n \"span\",\n {\n onclick: () => {\n level = \"\";\n draw();\n },\n },\n \"System\",\n ),\n );\n parts.forEach((_, i) => {\n const id = parts.slice(0, i + 1).join(\".\");\n crumbs.appendChild(document.createTextNode(\" \u203A \"));\n crumbs.appendChild(\n h(\n \"span\",\n {\n onclick: () => {\n level = id;\n draw();\n },\n },\n all.get(id)?.label ?? id,\n ),\n );\n });\n canvas.appendChild(crumbs);\n const kids = childrenOf(level);\n const legend = h(\n \"div\",\n { class: \"muted\", style: { fontSize: \"12px\", marginBottom: \"10px\" } },\n h(\"span\", { class: \"badge ok\" }, `${map.diff.added.length} added`),\n \" \",\n h(\"span\", { class: \"badge del\" }, `${map.diff.removed.length} removed`),\n \" \",\n h(\"span\", { class: \"badge warn\" }, `${map.diff.changed.length} changed`),\n map.base ? \"\" : \" (no base map: changed = touched by the diff)\",\n );\n canvas.appendChild(legend);\n const grid = h(\"div\", { class: \"map-grid\" });\n for (const n of kids) {\n const nk = childrenOf(n.id).length;\n const files = map.filesByNode[n.id]?.length ?? 0;\n grid.appendChild(\n h(\n \"div\",\n {\n class: `map-node ${n.status} ${n.id === selected ? \"selected\" : \"\"}`,\n onclick: () => {\n navigate(\"map\", { node: n.id });\n },\n ondblclick: () => {\n if (nk) {\n level = n.id;\n draw();\n }\n },\n },\n n.status\n ? h(\n \"span\",\n {\n class: `status badge ${n.status === \"added\" ? \"ok\" : n.status === \"removed\" ? \"del\" : \"warn\"}`,\n },\n n.status,\n )\n : null,\n h(\"div\", { class: \"kind\" }, n.kind),\n h(\"div\", { class: \"label\" }, n.label),\n n.description ? h(\"div\", { class: \"desc\" }, n.description) : null,\n h(\n \"div\",\n { class: \"children\" },\n nk ? `${nk} inside \u00B7 dbl-click to open` : \"\",\n nk && descendantsChanged(n.id) ? ` \u00B7 ${descendantsChanged(n.id)} changed` : \"\",\n files ? ` \u00B7 ${files} changed file${files > 1 ? \"s\" : \"\"}` : \"\",\n ),\n ),\n );\n }\n if (!kids.length)\n grid.appendChild(h(\"div\", { class: \"empty-state\" }, \"Nothing at this level.\"));\n canvas.appendChild(grid);\n const here = new Set(kids.map((k) => k.id));\n const top = (id: string) => {\n let x = id;\n while (x && !here.has(x)) x = parentOf(x);\n return x;\n };\n const shown = edges.filter((e) => here.has(top(e.from)) || here.has(top(e.to)));\n if (shown.length) {\n canvas.appendChild(\n h(\n \"div\",\n { class: \"map-edges\" },\n h(\"div\", { class: \"muted\", style: { marginBottom: \"4px\" } }, \"Relationships\"),\n shown.map((e) =>\n h(\n \"div\",\n { class: \"edge\" },\n h(\n \"b\",\n { onclick: () => navigate(\"map\", { node: e.from }) },\n all.get(e.from)?.label ?? e.from,\n ),\n \"\u2192\",\n h(\n \"b\",\n { onclick: () => navigate(\"map\", { node: e.to }) },\n all.get(e.to)?.label ?? e.to,\n ),\n h(\"span\", { class: \"muted\" }, e.label ?? \"\"),\n ),\n ),\n ),\n );\n }\n drawSide();\n };\n const drawSide = () => {\n side.innerHTML = \"\";\n const n = selected ? all.get(selected) : null;\n if (!n) {\n side.appendChild(\n h(\n \"div\",\n { class: \"muted\" },\n \"Select a node to see its files, code and relationships. Double-click to drill in.\",\n ),\n );\n return;\n }\n const anchor = n.anchor ? state.data?.document?.anchors[n.anchor] : null;\n const files = map.filesByNode[n.id] ?? [];\n const threads = threadsFor((t) => t.type === \"map\" && t.node === n.id);\n append(side, [\n h(\n \"div\",\n { class: \"kind muted\", style: { fontSize: \"11px\", textTransform: \"uppercase\" } },\n n.kind,\n \" \",\n n.status\n ? h(\n \"span\",\n {\n class: `badge ${n.status === \"added\" ? \"ok\" : n.status === \"removed\" ? \"del\" : \"warn\"}`,\n },\n n.status,\n )\n : \"\",\n ),\n h(\"h3\", { style: { margin: \"2px 0 6px\" } }, n.label),\n h(\"div\", { class: \"mono muted\", style: { fontSize: \"11px\" } }, n.id),\n n.description ? h(\"p\", null, n.description) : null,\n anchor?.peek\n ? h(\n \"p\",\n null,\n h(\"button\", { class: \"small\", onclick: () => openAnchorPeek(anchor) }, \"Peek code \u25B8\"),\n \" \",\n h(\"span\", { class: \"mono muted\" }, `${anchor.peek.file}:${anchor.peek.from}`),\n )\n : null,\n n.files?.length\n ? h(\n \"div\",\n { class: \"muted\", style: { marginTop: \"8px\" } },\n \"Owns: \",\n n.files.map((g) => h(\"code\", null, g + \" \")),\n )\n : null,\n files.length\n ? h(\n \"div\",\n { style: { marginTop: \"8px\" } },\n h(\"b\", null, \"Changed files\"),\n files.map((f) =>\n h(\"span\", { class: \"file\", onclick: () => navigate(\"files\", { path: f }) }, f),\n ),\n )\n : null,\n h(\n \"div\",\n { style: { marginTop: \"12px\" } },\n h(\n \"button\",\n {\n class: \"small\",\n onclick: (e: MouseEvent) =>\n popover(commentPopover({ type: \"map\", node: n.id }), { x: e.pageX, y: e.pageY + 8 }),\n },\n \"Comment on this node\",\n ),\n ),\n threads.length\n ? h(\n \"div\",\n { class: \"thread-pins\", style: { marginTop: \"10px\" } },\n threads.map(threadPinRow),\n )\n : null,\n ]);\n if (n.status === \"changed\" && baseNodes.has(n.id) && headNodes.has(n.id)) {\n const b = baseNodes.get(n.id)!;\n const hh = headNodes.get(n.id)!;\n const diffs: string[] = [];\n if (b.label !== hh.label) diffs.push(`label: ${b.label} \u2192 ${hh.label}`);\n if (b.description !== hh.description) diffs.push(`description changed`);\n if (JSON.stringify(b.files) !== JSON.stringify(hh.files))\n diffs.push(`files: ${(b.files ?? []).join(\", \")} \u2192 ${(hh.files ?? []).join(\", \")}`);\n if (diffs.length)\n side.appendChild(\n h(\n \"div\",\n { style: { marginTop: \"10px\" } },\n h(\"b\", null, \"Base \u2192 head\"),\n diffs.map((d) => h(\"div\", { class: \"muted\" }, d)),\n ),\n );\n }\n };\n draw();\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["type Child = Node | string | number | null | undefined | false | Child[];\n\nexport function h<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n attrs: Record<string, unknown> | null = null,\n ...children: Child[]\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) {\n if (v === null || v === undefined || v === false) continue;\n if (k === \"class\") el.className = String(v);\n else if (k === \"html\") el.innerHTML = String(v);\n else if (k.startsWith(\"on\") && typeof v === \"function\")\n el.addEventListener(k.slice(2).toLowerCase(), v as EventListener);\n else if (k === \"style\" && typeof v === \"object\") Object.assign(el.style, v);\n else if (k in el && typeof v !== \"string\" && k !== \"title\")\n (el as unknown as Record<string, unknown>)[k] = v;\n else el.setAttribute(k, String(v));\n }\n }\n append(el, children);\n return el;\n}\n\nexport function append(el: Node, children: Child[]): void {\n for (const c of children) {\n if (c === null || c === undefined || c === false) continue;\n if (Array.isArray(c)) append(el, c);\n else\n el.appendChild(\n typeof c === \"string\" || typeof c === \"number\" ? document.createTextNode(String(c)) : c,\n );\n }\n}\n\nexport function svg<K extends keyof SVGElementTagNameMap>(\n tag: K,\n attrs: Record<string, unknown> = {},\n ...children: (Node | string)[]\n): SVGElementTagNameMap[K] {\n const el = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (const [k, v] of Object.entries(attrs)) {\n if (k.startsWith(\"on\") && typeof v === \"function\")\n el.addEventListener(k.slice(2).toLowerCase(), v as EventListener);\n else el.setAttribute(k, String(v));\n }\n for (const c of children) el.appendChild(typeof c === \"string\" ? document.createTextNode(c) : c);\n return el;\n}\n\nexport function clear(el: Element): void {\n while (el.firstChild) el.removeChild(el.firstChild);\n}\n\nexport function escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport function timeAgo(iso: string): string {\n const d = (Date.now() - new Date(iso).getTime()) / 1000;\n if (d < 60) return \"just now\";\n if (d < 3600) return `${Math.floor(d / 60)} min ago`;\n if (d < 86400) return `${Math.floor(d / 3600)} h ago`;\n return `${Math.floor(d / 86400)} d ago`;\n}\n\n/** One popover at a time; closes on outside click or Escape. */\nlet openPopover: HTMLElement | null = null;\nexport function popover(el: HTMLElement, at: { x: number; y: number }): HTMLElement {\n closePopover();\n el.style.position = \"absolute\";\n document.body.appendChild(el);\n const w = el.offsetWidth;\n const hgt = el.offsetHeight;\n const x = Math.min(at.x, window.innerWidth - w - 12);\n const y = at.y + hgt > window.scrollY + window.innerHeight - 12 ? at.y - hgt - 8 : at.y;\n el.style.left = `${Math.max(8, x)}px`;\n el.style.top = `${Math.max(8, y)}px`;\n openPopover = el;\n setTimeout(() => {\n document.addEventListener(\"mousedown\", onDoc);\n document.addEventListener(\"keydown\", onKey);\n });\n return el;\n}\nfunction onDoc(e: MouseEvent) {\n if (openPopover && !openPopover.contains(e.target as Node)) closePopover();\n}\nfunction onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") closePopover();\n}\nexport function closePopover(): void {\n if (openPopover) openPopover.remove();\n openPopover = null;\n document.removeEventListener(\"mousedown\", onDoc);\n document.removeEventListener(\"keydown\", onKey);\n}\n\nexport function dialog(content: HTMLElement): { close: () => void } {\n const overlay = h(\"div\", { class: \"overlay\" }, h(\"div\", { class: \"dialog\" }, content));\n overlay.addEventListener(\"mousedown\", (e) => {\n if (e.target === overlay) overlay.remove();\n });\n document.body.appendChild(overlay);\n return { close: () => overlay.remove() };\n}\n", "import type { ReviewState, Thread, Decision, ThreadTarget } from \"../store.js\";\nimport type { CompiledDocument, CompiledMap } from \"../document/compile.js\";\nimport type { FileDiff } from \"../diff.js\";\nimport type { ChangedFile, Commit } from \"../git.js\";\nimport type { SymbolDef } from \"../symbols.js\";\n\nexport interface Payload {\n review: ReviewState;\n revision: number;\n document: CompiledDocument | null;\n map: CompiledMap | null;\n changes: ChangedFile[];\n meta: { revision: number; at: string; title: string; hasMap: boolean; theme?: string } | null;\n theme: { name: string; source?: string; css: string } | null;\n threads: Thread[];\n decisions: Decision[];\n}\n\nexport interface FileLines {\n path: string;\n graph: \"head\" | \"base\";\n lang: string;\n total: number;\n from: number;\n to: number;\n lines: string[];\n}\n\nasync function j<T>(url: string, init?: RequestInit): Promise<T> {\n const r = await fetch(url, init);\n const body = (await r.json()) as T & { error?: string };\n if (!r.ok) throw new Error(body.error ?? r.statusText);\n return body;\n}\n\nfunction post<T>(url: string, body: unknown): Promise<T> {\n return j<T>(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n}\n\nexport const api = {\n reviews: () => j<(ReviewState & { openThreads: number })[]>(\"/api/reviews\"),\n review: (id: string, revision?: number) =>\n j<Payload>(`/api/reviews/${id}${revision ? `?revision=${revision}` : \"\"}`),\n revisions: (id: string) =>\n j<{ revision: number; at: string; title: string }[]>(`/api/reviews/${id}/revisions`),\n commits: (id: string) => j<Commit[]>(`/api/reviews/${id}/commits`),\n diff: (id: string, path: string) =>\n j<FileDiff>(`/api/reviews/${id}/diff?path=${encodeURIComponent(path)}`),\n file: (id: string, path: string, graph: \"head\" | \"base\", from?: number, to?: number) =>\n j<FileLines>(\n `/api/reviews/${id}/file?path=${encodeURIComponent(path)}&graph=${graph}${from ? `&from=${from}` : \"\"}${to ? `&to=${to}` : \"\"}`,\n ),\n symbols: (id: string, name: string, graph: \"head\" | \"base\") =>\n j<SymbolDef[]>(`/api/reviews/${id}/symbols?name=${encodeURIComponent(name)}&graph=${graph}`),\n createThread: (\n id: string,\n input: {\n kind: \"question\" | \"comment\";\n mode: \"ask\" | \"review\";\n target: ThreadTarget;\n body: string;\n },\n ) => post<Thread>(`/api/reviews/${id}/threads`, input),\n reply: (id: string, tid: string, body: string) =>\n post<Thread>(`/api/reviews/${id}/threads/${tid}/reply`, { body, role: \"reviewer\" }),\n resolve: (id: string, tid: string) =>\n post<Thread>(`/api/reviews/${id}/threads/${tid}/resolve`, {}),\n reopen: (id: string, tid: string) => post<Thread>(`/api/reviews/${id}/threads/${tid}/reopen`, {}),\n deleteThread: (id: string, tid: string) =>\n post<{ ok: true }>(`/api/reviews/${id}/threads/${tid}/delete`, {}),\n submit: (id: string, decision: \"approve\" | \"request-changes\" | \"close\", body: string) =>\n post<{ review: ReviewState }>(`/api/reviews/${id}/submit`, { decision, body }),\n dismiss: (id: string, dismissed: boolean) =>\n post<ReviewState>(`/api/reviews/${id}/dismiss`, { dismissed }),\n remove: (id: string) => j<{ ok: true }>(`/api/reviews/${id}`, { method: \"DELETE\" }),\n};\n", "import { api } from \"./api.js\";\nimport { h, append, clear, dialog, timeAgo } from \"./dom.js\";\nimport { state, on, emit, readHash, navigate, isTerminal, NARROW, type View } from \"./state.js\";\nimport { renderPeek } from \"./code.js\";\nimport { renderThreadsPanel, submitDialog, reload } from \"./threads.js\";\nimport { renderReview } from \"./views/review.js\";\nimport { renderFiles } from \"./views/files.js\";\nimport { renderCommits } from \"./views/commits.js\";\nimport { renderMap } from \"./views/map.js\";\n\nconst app = document.getElementById(\"app\")!;\n\nasync function home(): Promise<void> {\n clear(app);\n const reviews = await api.reviews();\n const el = h(\"div\", { class: \"home\" }, h(\"h2\", null, \"Reviews\"));\n const active = reviews.filter((r) => !r.dismissed);\n const dismissed = reviews.filter((r) => r.dismissed);\n const item = (r: (typeof reviews)[number]) =>\n h(\n \"div\",\n { class: \"item\", onclick: () => (location.href = `/review/${r.id}`) },\n h(\"span\", { class: \"t\" }, r.title),\n h(\"span\", { class: `badge ${statusClass(r.status)}` }, r.status),\n r.openThreads ? h(\"span\", { class: \"badge accent\" }, `${r.openThreads} open`) : null,\n h(\n \"span\",\n { class: \"muted mono\", style: { fontSize: \"12px\" } },\n r.binding.kind === \"pr\" ? `PR #${r.binding.name}` : r.binding.name,\n ),\n h(\"span\", { class: \"muted\", style: { fontSize: \"12px\" } }, timeAgo(r.updatedAt)),\n );\n if (!active.length)\n el.appendChild(\n h(\"div\", { class: \"empty-state\" }, \"No reviews. Ask your agent to scaffold and publish one.\"),\n );\n active.forEach((r) => el.appendChild(item(r)));\n if (dismissed.length) {\n el.appendChild(h(\"h3\", { class: \"muted\" }, \"Dismissed\"));\n dismissed.forEach((r) => el.appendChild(item(r)));\n }\n app.appendChild(el);\n}\n\nfunction statusClass(s: string): string {\n return s === \"accepted\"\n ? \"ok\"\n : s === \"awaiting-agent-updates\"\n ? \"warn\"\n : s === \"closed\"\n ? \"del\"\n : s === \"awaiting-review\"\n ? \"accent\"\n : \"\";\n}\n\nlet center: HTMLElement;\nlet side: HTMLElement;\nlet topbar: HTMLElement;\nlet banner: HTMLElement;\n\nfunction shell(): void {\n clear(app);\n topbar = h(\"div\", { class: \"topbar\" });\n banner = h(\"div\", { class: \"banner\", hidden: true });\n center = h(\"div\", { class: \"center\" });\n side = h(\"div\", { class: \"side hidden\" });\n const resizer = h(\"div\", { class: \"resizer\" });\n let drag = false;\n resizer.addEventListener(\"mousedown\", () => (drag = true));\n window.addEventListener(\"mouseup\", () => (drag = false));\n window.addEventListener(\"mousemove\", (e) => {\n if (!drag) return;\n const w = Math.max(320, window.innerWidth - e.clientX);\n document.documentElement.style.setProperty(\"--side-w\", `${w}px`);\n });\n app.append(topbar, banner, h(\"div\", { class: \"main\" }, center, resizer, side));\n}\n\nfunction applyTheme(): void {\n let style = document.getElementById(\"review-theme\") as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"review-theme\";\n document.head.appendChild(style);\n }\n style.textContent = state.data?.theme?.css ?? \"\";\n}\n\nfunction renderTopbar(): void {\n clear(topbar);\n const d = state.data!;\n const r = d.review;\n const pending = d.threads.filter((t) => !t.submitted).length;\n const open = d.threads.filter((t) => t.status === \"open\").length;\n const tabs: [View, string][] = [\n [\"review\", \"Review\"],\n [\"commits\", \"Commits\"],\n [\"files\", `Files${d.changes.length ? ` (${d.changes.length})` : \"\"}`],\n [\"map\", \"Map\"],\n ];\n const revSel = h(\"select\", {\n class: \"small\",\n style: { font: \"inherit\", fontSize: \"12px\" },\n onchange: async (e: Event) => {\n const n = Number((e.target as HTMLSelectElement).value);\n state.viewingRevision = n === r.revision ? null : n;\n state.data = await api.review(state.id, n);\n emit(\"data\");\n },\n });\n for (let n = r.revision; n >= 1; n--)\n revSel.appendChild(\n h(\n \"option\",\n { value: n, selected: (state.viewingRevision ?? r.revision) === n },\n `rev ${n}${n === r.revision ? \" (current)\" : \"\"}`,\n ),\n );\n // Two rows, so a long title can never push the tabs or the decision button\n // off the bar: the identity row truncates, the actions row does not.\n const identity = h(\"div\", { class: \"bar-row bar-identity\" }, [\n h(\"a\", { href: \"/\", class: \"brand\", title: \"All reviews\" }, \"thurview\"),\n h(\"span\", { class: \"title\", title: r.title }, r.title),\n h(\"span\", { class: `badge ${statusClass(r.status)}` }, r.status),\n r.revision > 1 ? revSel : h(\"span\", { class: \"badge bar-rev\" }, `rev ${r.revision}`),\n h(\n \"span\",\n {\n class: \"muted mono bar-binding\",\n style: { fontSize: \"12px\" },\n title: `${r.pins.base} \u2192 ${r.pins.head}`,\n },\n r.binding.kind === \"pr\" ? `PR #${r.binding.name}` : r.binding.name,\n ),\n ]);\n const actions = h(\"div\", { class: \"bar-row bar-actions\" }, [\n h(\n \"div\",\n { class: \"tabs\" },\n tabs.map(([v, label]) =>\n h(\"button\", { class: v === state.view ? \"active\" : \"\", onclick: () => navigate(v) }, label),\n ),\n ),\n h(\"span\", { class: \"spacer\" }),\n h(\n \"button\",\n {\n class: state.side.kind === \"threads\" ? \"primary\" : \"\",\n onclick: () => {\n state.side = state.side.kind === \"threads\" ? { kind: \"none\" } : { kind: \"threads\" };\n emit(\"side\");\n },\n },\n `Threads${open ? ` \u00B7 ${open}` : \"\"}`,\n ),\n isTerminal() || state.viewingRevision !== null\n ? null\n : h(\n \"button\",\n { class: pending ? \"primary\" : \"ok\", onclick: () => submitDialog() },\n pending ? `Submit${pending ? ` (${pending})` : \"\"}` : \"Decide\",\n ),\n h(\n \"button\",\n { class: \"ghost bar-more\", title: \"More\", onclick: (e: MouseEvent) => moreMenu(e) },\n \"\u22EF\",\n ),\n ]);\n append(topbar, [identity, actions]);\n}\n\nfunction moreMenu(e: MouseEvent): void {\n const r = state.data!.review;\n const box = h(\n \"div\",\n { class: \"def-popover\" },\n h(\n \"div\",\n {\n class: \"item\",\n onclick: async () => {\n await api.dismiss(state.id, !r.dismissed);\n await reload();\n emit(\"data\");\n },\n },\n r.dismissed ? \"Restore review\" : \"Dismiss review\",\n ),\n h(\n \"div\",\n {\n class: \"item\",\n onclick: () => {\n const d = dialog(\n h(\n \"div\",\n null,\n h(\"h3\", null, \"Delete this review?\"),\n h(\n \"p\",\n { class: \"muted\" },\n \"Removes the document, revisions and threads. The code is untouched.\",\n ),\n h(\n \"div\",\n { class: \"row\" },\n h(\"button\", { class: \"ghost\", onclick: () => d.close() }, \"Cancel\"),\n h(\n \"button\",\n {\n style: { background: \"var(--del)\", color: \"#fff\" },\n onclick: async () => {\n await api.remove(state.id);\n location.href = \"/\";\n },\n },\n \"Delete\",\n ),\n ),\n ),\n );\n },\n },\n \"Delete review\",\n ),\n h(\n \"div\",\n { class: \"item muted\" },\n `base ${r.pins.base.slice(0, 12)} \u00B7 head ${r.pins.head.slice(0, 12)}`,\n ),\n h(\n \"div\",\n { class: \"item muted\" },\n `theme: ${state.data!.theme?.name ?? \"default\"}${state.data!.theme?.source ? ` (${state.data!.theme.source})` : \"\"}`,\n ),\n );\n import(\"./dom.js\").then(({ popover }) => popover(box, { x: e.pageX - 200, y: e.pageY + 10 }));\n}\n\nfunction renderCenter(): void {\n const scroll = center.scrollTop;\n clear(center);\n switch (state.view) {\n case \"review\":\n renderReview(center);\n break;\n case \"files\":\n renderFiles(center);\n break;\n case \"commits\":\n void renderCommits(center);\n break;\n case \"map\":\n renderMap(center);\n break;\n }\n center.scrollTop = scroll;\n}\n\nfunction renderSide(): void {\n clear(side);\n side.classList.toggle(\"hidden\", state.side.kind === \"none\");\n if (state.side.kind === \"peek\") renderPeek(side);\n else if (state.side.kind === \"threads\") renderThreadsPanel(side);\n}\n\nfunction renderBanner(): void {\n banner.hidden = true;\n clear(banner);\n const d = state.data!;\n if (state.viewingRevision !== null) {\n banner.hidden = false;\n banner.append(\n `Viewing revision ${state.viewingRevision} of ${d.review.revision}. Read only.`,\n h(\"span\", { style: { flex: \"1\" } }),\n h(\n \"button\",\n {\n class: \"small\",\n onclick: async () => {\n state.viewingRevision = null;\n state.data = await api.review(state.id);\n emit(\"data\");\n },\n },\n \"Back to current\",\n ),\n );\n } else if (state.latestRevision !== null && state.latestRevision > d.review.revision) {\n banner.hidden = false;\n banner.append(\n `Revision ${state.latestRevision} was published.`,\n h(\"span\", { style: { flex: \"1\" } }),\n h(\n \"button\",\n {\n class: \"small primary\",\n onclick: async () => {\n state.latestRevision = null;\n state.data = await api.review(state.id);\n emit(\"data\");\n },\n },\n \"Load it\",\n ),\n );\n } else if (d.review.status === \"awaiting-agent-updates\") {\n banner.hidden = false;\n banner.append(\n \"Changes requested. The agent is working on your comments; a new revision will appear here.\",\n );\n } else if (d.review.status === \"accepted\") {\n banner.hidden = false;\n banner.append(\"Approved. This review is complete.\");\n } else if (d.review.status === \"closed\") {\n banner.hidden = false;\n banner.append(\"Closed without approval. This review is complete.\");\n }\n}\n\nfunction connectEvents(): void {\n const es = new EventSource(`/api/reviews/${state.id}/events`);\n es.onmessage = async (ev) => {\n const msg = JSON.parse(ev.data as string) as { type: string };\n if (msg.type !== \"change\") return;\n const fresh = await api.review(state.id, state.viewingRevision ?? undefined);\n const cur = state.data!;\n if (fresh.review.revision > cur.review.revision && state.viewingRevision === null) {\n state.latestRevision = fresh.review.revision;\n // keep the presented document until the reader loads it, but take threads and status\n state.data = {\n ...cur,\n threads: fresh.threads,\n decisions: fresh.decisions,\n review: { ...fresh.review, revision: cur.review.revision },\n };\n } else {\n state.data = fresh;\n }\n emit(\"threads\");\n };\n}\n\nasync function reviewPage(id: string): Promise<void> {\n state.id = id;\n shell();\n readHash();\n try {\n state.data = await api.review(id);\n } catch (e) {\n clear(app);\n app.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n (e as Error).message,\n \" \",\n h(\"a\", { href: \"/\" }, \"All reviews\"),\n ),\n );\n return;\n }\n document.title = `${state.data.review.title} \u00B7 thurview`;\n if (state.params.get(\"side\") === \"threads\") state.side = { kind: \"threads\" };\n on(\"data\", () => {\n applyTheme();\n renderTopbar();\n renderBanner();\n renderCenter();\n renderSide();\n });\n on(\"threads\", () => {\n renderTopbar();\n renderBanner();\n renderCenter();\n renderSide();\n });\n on(\"view\", () => {\n renderTopbar();\n renderCenter();\n });\n on(\"side\", () => {\n renderTopbar();\n renderSide();\n });\n window.addEventListener(\"hashchange\", () => {\n readHash();\n emit(\"view\");\n });\n window.matchMedia(NARROW).addEventListener(\"change\", () => emit(\"view\"));\n emit(\"data\");\n connectEvents();\n}\n\nconst m = /^\\/review\\/([^/]+)/.exec(location.pathname);\nif (m) void reviewPage(m[1]!);\nelse void home();\n", "import type { Payload } from \"./api.js\";\nimport type { Thread, ThreadTarget } from \"../store.js\";\n\nexport type View = \"review\" | \"commits\" | \"files\" | \"map\";\n\nexport interface SideState {\n kind: \"none\" | \"peek\" | \"threads\";\n anchor?: string;\n activeThread?: string;\n}\n\nexport interface State {\n id: string;\n data: Payload | null;\n view: View;\n params: URLSearchParams;\n side: SideState;\n /** revision being viewed when older than the presented one */\n viewingRevision: number | null;\n latestRevision: number | null;\n splitDiff: boolean;\n}\n\n/** Below this the UI is one column: no TOC rail, no split diff, side as overlay. */\nexport const NARROW = \"(max-width: 900px)\";\nexport function isNarrow(): boolean {\n return window.matchMedia(NARROW).matches;\n}\n\nexport const state: State = {\n id: \"\",\n data: null,\n view: \"review\",\n params: new URLSearchParams(),\n side: { kind: \"none\" },\n viewingRevision: null,\n latestRevision: null,\n splitDiff: localStorage.getItem(\"thurview.split\") !== \"0\",\n};\n\ntype Listener = () => void;\nconst listeners: Record<string, Listener[]> = {};\nexport function on(event: \"data\" | \"threads\" | \"view\" | \"side\", fn: Listener): void {\n (listeners[event] ??= []).push(fn);\n}\nexport function emit(event: \"data\" | \"threads\" | \"view\" | \"side\"): void {\n for (const fn of listeners[event] ?? []) fn();\n}\n\nexport function threadsFor(target: (t: ThreadTarget) => boolean): Thread[] {\n return (state.data?.threads ?? []).filter((t) => target(t.target));\n}\n\nexport function describeTarget(t: ThreadTarget): string {\n if (t.type === \"document\") return \"document\";\n if (t.type === \"file\") {\n if (!t.line) return `${t.path} (file)`;\n const range = t.endLine && t.endLine > t.line ? `${t.line}-${t.endLine}` : String(t.line);\n return `${t.path}:${range}${t.side === \"base\" ? \" (base)\" : \"\"}`;\n }\n if (t.type === \"map\") return `map \u00B7 ${t.node}`;\n return \"review\";\n}\n\nexport function navigate(\n view: View,\n params: Record<string, string | number | undefined> = {},\n): void {\n const p = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) if (v !== undefined && v !== \"\") p.set(k, String(v));\n const q = p.toString();\n location.hash = `#/${view}${q ? `?${q}` : \"\"}`;\n}\n\nexport function readHash(): void {\n const m = /^#\\/(\\w+)(?:\\?(.*))?$/.exec(location.hash);\n const view = (m?.[1] ?? \"review\") as View;\n state.view = [\"review\", \"commits\", \"files\", \"map\"].includes(view) ? view : \"review\";\n state.params = new URLSearchParams(m?.[2] ?? \"\");\n}\n\nexport function isTerminal(): boolean {\n const s = state.data?.review.status;\n return s === \"accepted\" || s === \"closed\";\n}\n\nexport function readOnly(): boolean {\n return isTerminal() || state.viewingRevision !== null;\n}\n", "import { api } from \"./api.js\";\nimport { h, popover, closePopover } from \"./dom.js\";\nimport { state, emit, threadsFor, navigate } from \"./state.js\";\nimport type { Thread, ThreadTarget } from \"../store.js\";\nimport type { CompiledAnchor } from \"../document/compile.js\";\nimport { commentPopover, threadPinRow } from \"./threads.js\";\n\nexport interface CodeOpts {\n path: string;\n graph: \"head\" | \"base\";\n startLine: number;\n lines: string[];\n highlight?: [number, number];\n /** line numbers that carry threads are decorated; clicking a number starts a comment */\n commentable?: boolean;\n onExpand?: (dir: \"up\" | \"down\") => void;\n}\n\n/** Renders highlighted lines as a table. */\nexport function codeTable(o: CodeOpts): HTMLTableElement {\n const table = h(\"table\");\n const threads = o.commentable\n ? threadsFor((t) => t.type === \"file\" && t.path === o.path && t.side === o.graph)\n : [];\n const endOf = (t: Thread) => (t.target.type === \"file\" ? (t.target.endLine ?? t.target.line) : 0);\n o.lines.forEach((html, i) => {\n const n = o.startLine + i;\n const hl = o.highlight && n >= o.highlight[0] && n <= o.highlight[1];\n const lineThreads = threads.filter((t) => endOf(t) === n);\n const tr = h(\n \"tr\",\n { class: `${hl ? \"hl\" : \"\"} ${lineThreads.length ? \"commented\" : \"\"}`, \"data-line\": n },\n h(\n \"td\",\n {\n class: \"ln\",\n title: o.commentable ? \"Comment on this line (shift-click for a range)\" : \"\",\n onclick: (e: MouseEvent) => o.commentable && lineClick(e, o.path, o.graph, n, table),\n },\n String(n),\n ),\n h(\"td\", { class: \"src\", html: html || \" \" }),\n );\n table.appendChild(tr);\n for (const t of lineThreads)\n table.appendChild(h(\"tr\", { class: \"thread-row\" }, h(\"td\", { colspan: 2 }, threadPinRow(t))));\n });\n attachDefinitions(table, o.graph);\n return table;\n}\n\nfunction textOf(html: string): string {\n const d = document.createElement(\"div\");\n d.innerHTML = html;\n return d.textContent ?? \"\";\n}\n\nexport function startLineComment(e: MouseEvent, target: ThreadTarget, quote?: string): void {\n if (state.viewingRevision !== null) return;\n const el = commentPopover(target, quote?.trim() ? quote.trim() : undefined);\n popover(el, { x: e.pageX + 8, y: e.pageY + 8 });\n}\n\n/** First click marks a line; shift-click on the same table extends it to a range. */\nlet rangeStart: {\n path: string;\n side: \"head\" | \"base\";\n line: number;\n table: HTMLTableElement;\n} | null = null;\n\nexport function lineClick(\n e: MouseEvent,\n path: string,\n side: \"head\" | \"base\",\n line: number,\n table: HTMLTableElement,\n): void {\n if (state.viewingRevision !== null) return;\n if (e.shiftKey && rangeStart && rangeStart.path === path && rangeStart.side === side) {\n const from = Math.min(rangeStart.line, line);\n const to = Math.max(rangeStart.line, line);\n const quote = rowsText(table, side, from, to);\n clearRangeMarks(table);\n for (let n = from; n <= to; n++)\n table.querySelector(`tr[data-${side}=\"${n}\"]`)?.classList.add(\"range-sel\");\n rangeStart = null;\n startLineComment(e, { type: \"file\", path, side, line: from, endLine: to }, quote);\n return;\n }\n rangeStart = { path, side, line, table };\n clearRangeMarks(table);\n table.querySelector(`tr[data-${side}=\"${line}\"]`)?.classList.add(\"range-sel\");\n startLineComment(e, { type: \"file\", path, side, line }, rowsText(table, side, line, line));\n}\n\nfunction clearRangeMarks(table: HTMLTableElement): void {\n table.querySelectorAll(\"tr.range-sel\").forEach((tr) => tr.classList.remove(\"range-sel\"));\n}\n\nexport function rowsText(\n table: HTMLElement,\n side: \"head\" | \"base\",\n from: number,\n to: number,\n): string {\n const parts: string[] = [];\n for (let n = from; n <= to; n++) {\n const td = table.querySelector(`tr[data-${side}=\"${n}\"] td.src`);\n if (td) parts.push((td.textContent ?? \"\").replace(/^[+\\- ]/, \"\"));\n }\n return parts.join(\"\\n\").slice(0, 400);\n}\n\n/** Selecting code text inside `root` offers a comment on the spanned lines. */\nexport function codeSelectionHandler(root: HTMLElement): void {\n let btn: HTMLElement | null = null;\n const remove = () => {\n btn?.remove();\n btn = null;\n };\n const onChange = () => {\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || !sel.rangeCount || !root.isConnected) return remove();\n const range = sel.getRangeAt(0);\n const rowOf = (node: Node) =>\n (node instanceof Element ? node : node.parentElement)?.closest(\n \"tr[data-head], tr[data-base]\",\n ) as HTMLElement | null;\n const a = rowOf(range.startContainer);\n const b = rowOf(range.endContainer);\n if (!a || !b || !root.contains(a) || !root.contains(b) || state.viewingRevision !== null)\n return remove();\n const table = a.closest(\"table\");\n if (!table || table !== b.closest(\"table\")) return remove();\n const path = (root.closest(\"[data-path]\") as HTMLElement | null)?.dataset[\"path\"] ?? \"\";\n const side: \"head\" | \"base\" = a.dataset[\"head\"] && b.dataset[\"head\"] ? \"head\" : \"base\";\n const la = Number(a.dataset[side]);\n const lb = Number(b.dataset[side]);\n if (!la || !lb) return remove();\n const from = Math.min(la, lb);\n const to = Math.max(la, lb);\n const quote = sel.toString().trim().slice(0, 400);\n remove();\n const rect = range.getBoundingClientRect();\n btn = h(\n \"button\",\n {\n class: \"small primary selection-btn\",\n onmousedown: (e: MouseEvent) => e.preventDefault(),\n onclick: (e: MouseEvent) => {\n remove();\n window.getSelection()?.removeAllRanges();\n startLineComment(\n e,\n { type: \"file\", path, side, line: from, ...(to > from ? { endLine: to } : {}) },\n quote,\n );\n },\n },\n to > from ? `Comment on lines ${from}-${to}` : `Comment on line ${from}`,\n );\n btn.style.left = `${rect.left + window.scrollX}px`;\n btn.style.top = `${rect.bottom + window.scrollY + 6}px`;\n document.body.appendChild(btn);\n };\n document.addEventListener(\"selectionchange\", onChange);\n}\n\n/** Click on an identifier: look up definitions at the pinned commit. Ctrl/Cmd+click jumps to the first one. */\nexport function attachDefinitions(root: HTMLElement, graph: \"head\" | \"base\"): void {\n root.addEventListener(\"click\", async (e) => {\n const td = (e.target as HTMLElement).closest(\"td.src\");\n if (!td) return;\n const sel = window.getSelection();\n if (sel && !sel.isCollapsed) return;\n const word = wordAt(e);\n if (!word) return;\n const defs = await api.symbols(state.id, word, graph);\n if (e.ctrlKey || e.metaKey) {\n const d = defs[0];\n if (d) openPeekAt(d.path, graph, d.line, `${d.kind} ${d.name}`);\n return;\n }\n const box = h(\"div\", { class: \"def-popover\" });\n if (!defs.length)\n box.appendChild(\n h(\n \"div\",\n { class: \"empty\" },\n `No definition of `,\n h(\"code\", null, word),\n ` found at ${graph}`,\n ),\n );\n for (const d of defs) {\n box.appendChild(\n h(\n \"div\",\n {\n class: \"item\",\n onclick: () => {\n closePopover();\n openPeekAt(d.path, graph, d.line, `${d.kind} ${d.name}`);\n },\n },\n h(\"span\", { class: \"kind\" }, d.kind),\n h(\"span\", { class: \"mono\" }, `${d.path}:${d.line}`),\n ),\n );\n }\n popover(box, { x: e.pageX + 6, y: e.pageY + 10 });\n });\n}\n\nfunction wordAt(e: MouseEvent): string | null {\n const doc = document as Document & {\n caretPositionFromPoint?: (x: number, y: number) => { offsetNode: Node; offset: number } | null;\n };\n let node: Node | null = null;\n let offset = 0;\n if (doc.caretPositionFromPoint) {\n const p = doc.caretPositionFromPoint(e.clientX, e.clientY);\n if (p) {\n node = p.offsetNode;\n offset = p.offset;\n }\n } else if (document.caretRangeFromPoint) {\n const r = document.caretRangeFromPoint(e.clientX, e.clientY);\n if (r) {\n node = r.startContainer;\n offset = r.startOffset;\n }\n }\n if (!node || node.nodeType !== Node.TEXT_NODE) return null;\n const text = node.textContent ?? \"\";\n const re = /[A-Za-z_$][\\w$]*/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text))) if (m.index <= offset && offset <= m.index + m[0].length) return m[0];\n return null;\n}\n\n/** Side peek: an anchor from the document, or an arbitrary location. */\nexport interface PeekSpec {\n title: string;\n detail?: string;\n path: string;\n graph: \"head\" | \"base\";\n from: number;\n to: number;\n lines: string[];\n total: number;\n anchorId?: string;\n}\n\nlet current: PeekSpec | null = null;\nexport function currentPeek(): PeekSpec | null {\n return current;\n}\n\nexport function openAnchorPeek(a: CompiledAnchor): void {\n if (!a.peek) return;\n current = {\n title: a.title,\n detail: a.detail,\n path: a.peek.file,\n graph: a.peek.graph,\n from: a.peek.from,\n to: a.peek.to,\n lines: a.peek.lines,\n total: a.peek.total,\n anchorId: a.id,\n };\n state.side = { kind: \"peek\", anchor: a.id };\n emit(\"side\");\n location.hash = location.hash.replace(/&?anchor=[^&]*/, \"\");\n}\n\nexport async function openPeekAt(\n path: string,\n graph: \"head\" | \"base\",\n line: number,\n title?: string,\n): Promise<void> {\n const from = Math.max(1, line - 5);\n const f = await api.file(state.id, path, graph, from, line + 12);\n current = {\n title: title ?? path,\n path,\n graph,\n from: f.from,\n to: f.to,\n lines: f.lines,\n total: f.total,\n };\n current.highlightLine = line;\n state.side = { kind: \"peek\" };\n emit(\"side\");\n}\n\nexport interface PeekSpec {\n highlightLine?: number;\n}\n\nexport function renderPeek(container: HTMLElement): void {\n const p = current;\n if (!p) return;\n const inChanges = !!state.data?.changes.some((c) => c.path === p.path);\n const head = h(\n \"div\",\n { class: \"side-head\" },\n h(\n \"div\",\n { style: { flex: \"1\", minWidth: \"0\" } },\n h(\"div\", { style: { fontWeight: \"600\" } }, p.title),\n h(\n \"div\",\n {\n class: \"path\",\n title: p.path,\n onclick: () =>\n navigate(\"files\", { path: p.path, line: p.highlightLine ?? p.from, side: p.graph }),\n },\n `${p.path}:${p.from}-${p.to}`,\n \" \",\n h(\"span\", { class: `badge ${p.graph === \"base\" ? \"del\" : \"\"}` }, p.graph),\n ),\n ),\n h(\n \"button\",\n {\n class: \"small\",\n onclick: () =>\n navigate(\"files\", { path: p.path, line: p.highlightLine ?? p.from, side: p.graph }),\n },\n inChanges ? \"Open in Files\" : \"Open file\",\n ),\n h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: () => {\n state.side = { kind: \"none\" };\n emit(\"side\");\n },\n },\n \"\u2715\",\n ),\n );\n const body = h(\"div\", { class: \"side-body\" });\n if (p.detail)\n body.appendChild(\n h(\"div\", { class: \"muted\", style: { padding: \"8px 12px\", fontSize: \"13px\" } }, p.detail),\n );\n const frame = h(\"div\", { class: \"code\" });\n const draw = () => {\n frame.innerHTML = \"\";\n const bar = (dir: \"up\" | \"down\") => {\n const can = dir === \"up\" ? p.from > 1 : p.to < p.total;\n return h(\n \"div\",\n { class: \"expand-bar\" },\n can\n ? h(\n \"button\",\n { class: \"small ghost\", onclick: () => expand(dir) },\n dir === \"up\" ? \"\u2191 20 more lines\" : \"\u2193 20 more lines\",\n )\n : h(\"span\", { class: \"muted\" }, dir === \"up\" ? \"start of file\" : \"end of file\"),\n );\n };\n frame.appendChild(bar(\"up\"));\n frame.appendChild(\n codeTable({\n path: p.path,\n graph: p.graph,\n startLine: p.from,\n lines: p.lines,\n highlight: p.highlightLine\n ? [p.highlightLine, p.highlightLine]\n : p.anchorId\n ? [p.from, p.to]\n : undefined,\n commentable: true,\n }),\n );\n frame.appendChild(bar(\"down\"));\n };\n const expand = async (dir: \"up\" | \"down\") => {\n if (dir === \"up\") {\n const from = Math.max(1, p.from - 20);\n const f = await api.file(state.id, p.path, p.graph, from, p.from - 1);\n p.lines = [...f.lines, ...p.lines];\n p.from = from;\n } else {\n const to = Math.min(p.total, p.to + 20);\n const f = await api.file(state.id, p.path, p.graph, p.to + 1, to);\n p.lines = [...p.lines, ...f.lines];\n p.to = to;\n }\n if (p.anchorId) {\n // keep the original range highlighted\n const a = state.data?.document?.anchors[p.anchorId];\n if (a?.peek) p.highlightRange = [a.peek.from, a.peek.to];\n }\n draw();\n };\n draw();\n body.appendChild(frame);\n container.appendChild(head);\n container.appendChild(body);\n}\n\nexport interface PeekSpec {\n highlightRange?: [number, number];\n}\n\nexport function threadsForFile(path: string, side: \"head\" | \"base\", line: number): Thread[] {\n return threadsFor(\n (t) => t.type === \"file\" && t.path === path && t.side === side && t.line === line,\n );\n}\n", "import { api } from \"./api.js\";\nimport { h, closePopover, dialog, timeAgo } from \"./dom.js\";\nimport { state, emit, describeTarget, navigate, readOnly } from \"./state.js\";\nimport type { Thread, ThreadTarget } from \"../store.js\";\n\nexport async function reload(): Promise<void> {\n state.data = await api.review(state.id, state.viewingRevision ?? undefined);\n emit(\"threads\");\n}\n\n/** Popover to start a thread on a target. */\nexport function commentPopover(target: ThreadTarget, quote?: string): HTMLElement {\n const ta = h(\"textarea\", { placeholder: \"Comment, or a question for the agent\u2026\" });\n let mode: \"review\" | \"ask\" = \"review\";\n const modeBtns = h(\"div\", { class: \"row\" });\n const b1 = h(\"button\", { class: \"small primary\", onclick: () => set(\"review\") }, \"Add to review\");\n const b2 = h(\"button\", { class: \"small\", onclick: () => set(\"ask\") }, \"Ask now\");\n const set = (m: \"review\" | \"ask\") => {\n mode = m;\n b1.className = `small ${m === \"review\" ? \"primary\" : \"\"}`;\n b2.className = `small ${m === \"ask\" ? \"primary\" : \"\"}`;\n hint.textContent =\n m === \"review\"\n ? \"Held until you submit the review.\"\n : \"Sent to the agent at once; it answers in this thread.\";\n };\n const hint = h(\n \"span\",\n { class: \"muted\", style: { fontSize: \"12px\" } },\n \"Held until you submit the review.\",\n );\n modeBtns.append(b1, b2, hint);\n const submit = async () => {\n const body = ta.value.trim();\n if (!body) return;\n await api.createThread(state.id, {\n kind: mode === \"ask\" ? \"question\" : \"comment\",\n mode,\n target: quote ? ({ ...target, quote } as ThreadTarget) : target,\n body,\n });\n closePopover();\n await reload();\n };\n ta.addEventListener(\"keydown\", (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") void submit();\n });\n const el = h(\n \"div\",\n { class: \"comment-popover\" },\n quote ? h(\"div\", { class: \"quote\" }, quote) : null,\n h(\n \"div\",\n { class: \"muted\", style: { fontSize: \"12px\", marginBottom: \"4px\" } },\n describeTarget(target),\n ),\n ta,\n modeBtns,\n h(\n \"div\",\n { class: \"row\", style: { justifyContent: \"flex-end\" } },\n h(\"button\", { class: \"small ghost\", onclick: () => closePopover() }, \"Cancel\"),\n h(\"button\", { class: \"small ok\", onclick: submit }, \"Save \", h(\"kbd\", null, \"\u2318\u21B5\")),\n ),\n );\n setTimeout(() => ta.focus());\n return el;\n}\n\n/** Compact pin shown next to a document block or diff line. */\nexport function threadPinRow(t: Thread): HTMLElement {\n const first = t.messages[0];\n const last = t.messages[t.messages.length - 1];\n return h(\n \"div\",\n {\n class: `thread-pin ${t.status === \"resolved\" ? \"resolved\" : \"\"}`,\n onclick: () => focusThread(t.id),\n },\n h(\n \"span\",\n { class: `badge ${t.kind === \"question\" ? \"accent\" : \"\"}` },\n t.kind === \"question\" ? \"Q\" : t.submitted ? \"C\" : \"draft\",\n ),\n h(\"span\", { class: \"who\" }, first?.role === \"agent\" ? \"agent\" : \"you\"),\n h(\n \"span\",\n {\n style: {\n flex: \"1\",\n minWidth: \"0\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n },\n first?.body ?? \"\",\n ),\n t.messages.length > 1\n ? h(\n \"span\",\n { class: \"muted\" },\n `${t.messages.length - 1} repl${t.messages.length > 2 ? \"ies\" : \"y\"} \u00B7 ${last?.role}`,\n )\n : null,\n t.status === \"resolved\" ? h(\"span\", { class: \"badge ok\" }, \"resolved\") : null,\n );\n}\n\nexport function focusThread(id: string): void {\n state.side = { kind: \"threads\", activeThread: id };\n emit(\"side\");\n}\n\nfunction goToTarget(t: Thread): void {\n const tg = t.target;\n if (tg.type === \"document\") {\n navigate(\"review\", { block: tg.blockId });\n } else if (tg.type === \"file\") {\n navigate(\"files\", { path: tg.path, line: tg.line, side: tg.side });\n } else if (tg.type === \"map\") {\n navigate(\"map\", { node: tg.node });\n }\n}\n\nexport function renderThreadsPanel(container: HTMLElement): void {\n const threads = state.data?.threads ?? [];\n const pending = threads.filter((t) => !t.submitted);\n let showResolved = false;\n const head = h(\n \"div\",\n { class: \"side-head\" },\n h(\n \"div\",\n { style: { flex: \"1\" } },\n h(\"b\", null, \"Threads\"),\n \" \",\n h(\"span\", { class: \"muted\" }, `${threads.filter((t) => t.status === \"open\").length} open`),\n ),\n h(\n \"label\",\n { style: { fontSize: \"12px\" } },\n h(\"input\", {\n type: \"checkbox\",\n onchange: (e: Event) => {\n showResolved = (e.target as HTMLInputElement).checked;\n draw();\n },\n }),\n \" resolved\",\n ),\n h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: () => {\n state.side = { kind: \"none\" };\n emit(\"side\");\n },\n },\n \"\u2715\",\n ),\n );\n const body = h(\"div\", { class: \"side-body\" });\n const draw = () => {\n body.innerHTML = \"\";\n if (pending.length && !readOnly()) {\n body.appendChild(\n h(\n \"div\",\n { class: \"banner\" },\n `${pending.length} comment${pending.length > 1 ? \"s\" : \"\"} pending`,\n h(\"span\", { style: { flex: \"1\" } }),\n h(\"button\", { class: \"small primary\", onclick: () => submitDialog() }, \"Submit review\"),\n ),\n );\n }\n const list = h(\"div\", { class: \"threads\" });\n const shown = threads.filter(\n (t) => showResolved || t.status === \"open\" || t.id === state.side.activeThread,\n );\n if (!shown.length)\n list.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n \"No threads yet. Select text, click a line number, or use the + next to a paragraph.\",\n ),\n );\n for (const t of shown.slice().sort((a, b) => (a.updatedAt < b.updatedAt ? 1 : -1)))\n list.appendChild(threadCard(t));\n body.appendChild(list);\n };\n draw();\n container.append(head, body);\n if (state.side.activeThread)\n setTimeout(() => body.querySelector(\".thread.active\")?.scrollIntoView({ block: \"center\" }));\n}\n\nfunction threadCard(t: Thread): HTMLElement {\n const ta = h(\"textarea\", { placeholder: \"Reply\u2026\", rows: 2 });\n const send = async () => {\n const v = ta.value.trim();\n if (!v) return;\n await api.reply(state.id, t.id, v);\n await reload();\n };\n ta.addEventListener(\"keydown\", (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") void send();\n });\n const quote =\n t.target.type === \"document\" || t.target.type === \"file\" ? t.target.quote : undefined;\n return h(\n \"div\",\n { class: `thread ${state.side.activeThread === t.id ? \"active\" : \"\"}` },\n h(\n \"div\",\n { class: \"thead\" },\n h(\n \"span\",\n { class: `badge ${t.kind === \"question\" ? \"accent\" : \"\"}` },\n t.kind === \"question\" ? \"question\" : t.submitted ? \"comment\" : \"pending\",\n ),\n h(\"span\", { class: \"target\", onclick: () => goToTarget(t) }, describeTarget(t.target)),\n h(\"span\", { class: `badge ${t.status === \"resolved\" ? \"ok\" : \"\"}` }, t.status),\n ),\n quote\n ? h(\"div\", { class: \"quote\" }, `\u201C${quote.length > 160 ? quote.slice(0, 160) + \"\u2026\" : quote}\u201D`)\n : null,\n t.messages.map((m) =>\n h(\n \"div\",\n { class: `msg ${m.role}` },\n h(\"span\", { class: \"who\" }, m.role === \"agent\" ? \"Agent\" : \"You\"),\n h(\"span\", { class: \"muted\", style: { fontSize: \"11px\" } }, timeAgo(m.at)),\n h(\"div\", null, m.body),\n ),\n ),\n readOnly()\n ? null\n : h(\n \"div\",\n { class: \"reply\" },\n ta,\n h(\n \"div\",\n { class: \"row\" },\n !t.submitted\n ? h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: async () => {\n await api.deleteThread(state.id, t.id);\n await reload();\n },\n },\n \"Delete\",\n )\n : null,\n t.status === \"open\"\n ? h(\n \"button\",\n {\n class: \"small\",\n onclick: async () => {\n await api.resolve(state.id, t.id);\n await reload();\n },\n },\n \"Resolve\",\n )\n : h(\n \"button\",\n {\n class: \"small\",\n onclick: async () => {\n await api.reopen(state.id, t.id);\n await reload();\n },\n },\n \"Reopen\",\n ),\n h(\"button\", { class: \"small primary\", onclick: send }, \"Reply\"),\n ),\n ),\n );\n}\n\nexport function submitDialog(): void {\n const pending = (state.data?.threads ?? []).filter((t) => !t.submitted).length;\n const ta = h(\"textarea\", { rows: 4, placeholder: \"Summary for the agent (optional)\" });\n const d = dialog(\n h(\n \"div\",\n null,\n h(\"h3\", null, \"Submit review\"),\n h(\n \"p\",\n { class: \"muted\" },\n pending\n ? `${pending} pending comment${pending > 1 ? \"s\" : \"\"} will be sent to the agent.`\n : \"No pending comments.\",\n ),\n ta,\n h(\n \"div\",\n { class: \"row\" },\n h(\"button\", { class: \"ghost\", onclick: () => d.close() }, \"Cancel\"),\n h(\n \"button\",\n { title: \"End the review without approving it\", onclick: () => decide(\"close\") },\n \"Close\",\n ),\n h(\"button\", { onclick: () => decide(\"request-changes\") }, \"Request changes\"),\n h(\"button\", { class: \"ok\", onclick: () => decide(\"approve\") }, \"Approve\"),\n ),\n ),\n );\n const decide = async (decision: \"approve\" | \"request-changes\" | \"close\") => {\n await api.submit(state.id, decision, ta.value.trim());\n d.close();\n await reload();\n emit(\"data\");\n };\n}\n", "import { h, popover } from \"../dom.js\";\nimport { state, threadsFor, navigate } from \"../state.js\";\nimport { codeTable, openAnchorPeek } from \"../code.js\";\nimport { commentPopover, threadPinRow } from \"../threads.js\";\nimport { sequenceDiagram, callstackDiff, databaseLens } from \"../diagrams.js\";\nimport type { Block } from \"../../document/compile.js\";\n\nexport function renderReview(root: HTMLElement): void {\n const doc = state.data?.document;\n if (!doc) {\n root.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n \"Nothing published yet. The agent publishes a revision with \",\n h(\"code\", null, \"thurview publish\"),\n \".\",\n ),\n );\n return;\n }\n const layout = h(\"div\", { class: \"doc-layout\" });\n const toc = h(\n \"nav\",\n { class: \"toc\" },\n doc.toc.map((t) =>\n h(\n \"a\",\n {\n href: `#/review?block=${t.id}`,\n class: `l${t.level}`,\n \"data-block\": t.id,\n onclick: (e: Event) => {\n e.preventDefault();\n scrollToBlock(t.id);\n },\n },\n t.text,\n ),\n ),\n );\n const docEl = h(\"article\", { class: \"doc\" });\n let section: HTMLElement | null = null;\n const sectionLevel = 2;\n for (const b of doc.blocks) {\n const el = renderBlock(b);\n if (b.type === \"heading\" && b.level === sectionLevel) {\n section = h(\"div\", { class: `section ${b.collapsed ? \"section-collapsed\" : \"\"}` });\n docEl.appendChild(section);\n const toggle = h(\"span\", { class: \"heading-toggle\" }, b.collapsed ? \"show\" : \"hide\");\n toggle.addEventListener(\"click\", () => {\n const s = toggle.closest(\".section\")!;\n s.classList.toggle(\"section-collapsed\");\n toggle.textContent = s.classList.contains(\"section-collapsed\") ? \"show\" : \"hide\";\n });\n el.querySelector(\"h2,h1,h3\")?.appendChild(toggle);\n el.classList.add(\"heading\");\n section.appendChild(el);\n } else (section ?? docEl).appendChild(el);\n }\n layout.append(toc, docEl);\n root.appendChild(layout);\n selectionHandler(docEl);\n docEl.addEventListener(\"click\", (e) => {\n const a = (e.target as HTMLElement).closest(\"a.anchor-link\") as HTMLElement | null;\n if (!a) return;\n e.preventDefault();\n const id = a.dataset[\"anchor\"]!;\n const anchor = doc.anchors[id];\n if (anchor) {\n docEl.querySelectorAll(\"a.anchor-link.active\").forEach((x) => x.classList.remove(\"active\"));\n a.classList.add(\"active\");\n openAnchorPeek(anchor);\n }\n });\n const target = state.params.get(\"block\");\n if (target) setTimeout(() => scrollToBlock(target), 50);\n const anchorParam = state.params.get(\"anchor\");\n if (anchorParam && doc.anchors[anchorParam] && state.side.kind !== \"peek\")\n openAnchorPeek(doc.anchors[anchorParam]!);\n const io = new IntersectionObserver(\n (entries) => {\n for (const en of entries) {\n if (!en.isIntersecting) continue;\n const id = (en.target as HTMLElement).dataset[\"block\"];\n toc\n .querySelectorAll(\"a\")\n .forEach((a) => a.classList.toggle(\"active\", a.dataset[\"block\"] === id));\n }\n },\n { rootMargin: \"-10% 0px -80% 0px\" },\n );\n docEl.querySelectorAll(\".block.heading\").forEach((el) => io.observe(el));\n}\n\nfunction scrollToBlock(id: string): void {\n const el = document.querySelector(`[data-block=\"${id}\"]`) as HTMLElement | null;\n if (!el) return;\n el.closest(\".section\")?.classList.remove(\"section-collapsed\");\n el.scrollIntoView({ block: \"start\", behavior: \"smooth\" });\n el.style.transition = \"background .8s\";\n el.style.background = \"var(--sel)\";\n setTimeout(() => (el.style.background = \"\"), 1200);\n}\n\nfunction renderBlock(b: Block): HTMLElement {\n const doc = state.data!.document!;\n const wrap = h(\"div\", { class: \"block\", \"data-block\": b.id });\n const threads = threadsFor((t) => t.type === \"document\" && t.blockId === b.id);\n if (threads.length) wrap.classList.add(\"has-threads\");\n const actions = h(\n \"div\",\n { class: \"block-actions\" },\n h(\n \"button\",\n {\n class: threads.length ? \"count\" : \"\",\n title: \"Comment on this block\",\n onclick: (e: MouseEvent) => {\n if (state.viewingRevision !== null) return;\n popover(commentPopover({ type: \"document\", blockId: b.id }), {\n x: e.pageX + 10,\n y: e.pageY,\n });\n },\n },\n threads.length ? String(threads.length) : \"+\",\n ),\n );\n wrap.appendChild(actions);\n switch (b.type) {\n case \"html\":\n case \"heading\":\n wrap.appendChild(h(\"div\", { html: b.html }));\n break;\n case \"peek\": {\n const a = doc.anchors[b.anchor];\n if (a?.peek) {\n wrap.appendChild(\n h(\n \"div\",\n { class: \"code-frame\" },\n h(\n \"div\",\n { class: \"frame-head\" },\n h(\"span\", { class: \"title\" }, a.title),\n h(\n \"span\",\n {\n class: \"path\",\n title: \"Open in Files\",\n onclick: () =>\n navigate(\"files\", {\n path: a.peek!.file,\n line: a.peek!.from,\n side: a.peek!.graph,\n }),\n },\n `${a.peek.file}:${a.peek.from}-${a.peek.to}`,\n ),\n h(\"span\", { class: `badge ${a.peek.graph === \"base\" ? \"del\" : \"\"}` }, a.peek.graph),\n h(\"button\", { class: \"small ghost\", onclick: () => openAnchorPeek(a) }, \"peek \u25B8\"),\n ),\n a.detail\n ? h(\n \"div\",\n { class: \"muted\", style: { padding: \"4px 10px\", fontSize: \"12.5px\" } },\n a.detail,\n )\n : null,\n h(\n \"div\",\n { class: \"code\" },\n codeTable({\n path: a.peek.file,\n graph: a.peek.graph,\n startLine: a.peek.from,\n lines: a.peek.lines,\n commentable: true,\n }),\n ),\n ),\n );\n }\n break;\n }\n case \"sequence\":\n wrap.appendChild(sequenceDiagram(b));\n break;\n case \"callstack\":\n wrap.appendChild(callstackDiff(b, doc));\n break;\n case \"database\":\n wrap.appendChild(databaseLens(b, doc));\n break;\n }\n if (threads.length)\n wrap.appendChild(h(\"div\", { class: \"thread-pins\" }, threads.map(threadPinRow)));\n return wrap;\n}\n\n/** Selecting text inside a block offers a comment on that block with the quote. */\nfunction selectionHandler(docEl: HTMLElement): void {\n let btn: HTMLElement | null = null;\n const remove = () => {\n btn?.remove();\n btn = null;\n };\n document.addEventListener(\"selectionchange\", () => {\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || !sel.rangeCount) return remove();\n const range = sel.getRangeAt(0);\n const block = (\n range.commonAncestorContainer instanceof Element\n ? range.commonAncestorContainer\n : range.commonAncestorContainer.parentElement\n )?.closest(\".block\") as HTMLElement | null;\n if (!block || !docEl.contains(block) || state.viewingRevision !== null) return remove();\n const quote = sel.toString().trim();\n if (!quote) return remove();\n const rect = range.getBoundingClientRect();\n remove();\n btn = h(\n \"button\",\n {\n class: \"small primary selection-btn\",\n onmousedown: (e: MouseEvent) => e.preventDefault(),\n onclick: (e: MouseEvent) => {\n const id = block.dataset[\"block\"]!;\n remove();\n popover(commentPopover({ type: \"document\", blockId: id }, quote), {\n x: e.pageX,\n y: e.pageY + 8,\n });\n window.getSelection()?.removeAllRanges();\n },\n },\n \"Comment / Ask\",\n );\n btn.style.left = `${rect.left + window.scrollX}px`;\n btn.style.top = `${rect.bottom + window.scrollY + 6}px`;\n document.body.appendChild(btn);\n });\n}\n", "import { h, svg } from \"./dom.js\";\nimport { state } from \"./state.js\";\nimport type { Block, CompiledDocument } from \"../document/compile.js\";\nimport { openAnchorPeek } from \"./code.js\";\nimport { popover } from \"./dom.js\";\n\ntype Seq = Extract<Block, { type: \"sequence\" }>;\ntype Stack = Extract<Block, { type: \"callstack\" }>;\ntype Db = Extract<Block, { type: \"database\" }>;\n\nfunction openAnchor(id: string): void {\n const a = state.data?.document?.anchors[id];\n if (a) openAnchorPeek(a);\n}\n\nexport function sequenceDiagram(b: Seq): HTMLElement {\n const colW = 170;\n const top = 44;\n const rowH = 34;\n const n = b.actors.length;\n const width = Math.max(colW * n, 320);\n const height = top + rowH * (b.messages.length + 1) + 10;\n const el = svg(\"svg\", { viewBox: `0 0 ${width} ${height}`, class: \"seq\" });\n el.appendChild(\n svg(\n \"defs\",\n {},\n svg(\n \"marker\",\n {\n id: \"arr\",\n viewBox: \"0 0 10 10\",\n refX: \"9\",\n refY: \"5\",\n markerWidth: \"7\",\n markerHeight: \"7\",\n orient: \"auto\",\n },\n svg(\"path\", { d: \"M0,0 L10,5 L0,10 z\", fill: \"currentColor\" }),\n ),\n ),\n );\n const x = (id: string) => b.actors.findIndex((a) => a.id === id) * colW + colW / 2;\n b.actors.forEach((a, i) => {\n const cx = i * colW + colW / 2;\n const g = svg(\"g\", { class: \"actor\" });\n g.appendChild(svg(\"rect\", { x: cx - 70, y: 6, width: 140, height: 28, rx: 6 }));\n g.appendChild(svg(\"text\", { x: cx, y: 25, \"text-anchor\": \"middle\" }, a.label));\n g.appendChild(svg(\"line\", { class: \"life\", x1: cx, y1: 34, x2: cx, y2: height - 6 }));\n el.appendChild(g);\n });\n b.messages.forEach((m, i) => {\n const y = top + rowH * (i + 1);\n const x1 = x(m.from);\n const x2 = x(m.to);\n const g = svg(\"g\", { class: \"msg\" });\n const self = x1 === x2;\n if (self) {\n g.appendChild(\n svg(\"path\", {\n d: `M${x1},${y - 10} h30 v20 h-30`,\n fill: \"none\",\n stroke: \"currentColor\",\n \"marker-end\": \"url(#arr)\",\n }),\n );\n } else {\n g.appendChild(svg(\"line\", { x1, y1: y, x2: x2 + (x2 > x1 ? -4 : 4), y2: y }));\n }\n const label = svg(\n \"text\",\n { x: self ? x1 + 36 : (x1 + x2) / 2, y: y - 6, \"text-anchor\": self ? \"start\" : \"middle\" },\n `${i + 1}. ${m.label}`,\n );\n label.addEventListener(\"click\", (e) => {\n if (m.anchor) openAnchor(m.anchor);\n else if (m.code)\n popover(\n h(\n \"div\",\n { class: \"def-popover\" },\n h(\"pre\", { style: { margin: \"0\", border: \"none\" } }, m.code.text),\n ),\n { x: e.pageX, y: e.pageY + 8 },\n );\n });\n g.appendChild(label);\n el.appendChild(g);\n });\n return h(\"div\", { class: \"diagram\" }, h(\"div\", { class: \"dhead\" }, b.label), el);\n}\n\nexport function callstackDiff(b: Stack, doc: CompiledDocument): HTMLElement {\n const rows = b.rows.map((r, i) => {\n const a = doc.anchors[r.anchor];\n return h(\n \"div\",\n { class: `row ${r.kind}`, title: r.reason ?? \"\", onclick: () => openAnchor(r.anchor) },\n h(\"span\", { class: \"sign\" }, r.kind === \"add\" ? \"+\" : r.kind === \"del\" ? \"\u2212\" : \" \"),\n h(\"span\", { style: { width: `${i * 14}px`, display: \"inline-block\" } }),\n r.calls ? h(\"span\", { class: \"calls\" }, \"\u2248 \") : null,\n h(\"span\", null, a?.title ?? r.anchor),\n a?.peek\n ? h(\n \"span\",\n { class: \"muted\", style: { marginLeft: \"auto\" } },\n `${a.peek.file}:${a.peek.from}`,\n )\n : null,\n );\n });\n return h(\n \"div\",\n { class: \"diagram callstack\" },\n h(\"div\", { class: \"dhead\" }, b.title ?? \"Call stack\"),\n h(\"div\", { style: { padding: \"6px 0\" } }, rows),\n );\n}\n\nexport function databaseLens(b: Db, doc: CompiledDocument): HTMLElement {\n let active = 0;\n const tabs = h(\"div\", { class: \"uc-tabs\" });\n const body = h(\"div\", { class: \"body\" });\n const draw = () => {\n tabs.innerHTML = \"\";\n b.usecases.forEach((uc, i) =>\n tabs.appendChild(\n h(\n \"button\",\n {\n class: `small ${i === active ? \"active\" : \"\"}`,\n onclick: () => {\n active = i;\n draw();\n },\n },\n uc.label,\n ),\n ),\n );\n const uc = b.usecases[active]!;\n body.innerHTML = \"\";\n const touched = new Map<string, Set<string>>();\n for (const op of uc.ops) {\n const [s, c, f] = op.store.split(\".\");\n const key = `${s}.${c}`;\n if (!touched.has(key)) touched.set(key, new Set());\n if (f) touched.get(key)!.add(f);\n }\n const actorIds = [...new Set(uc.ops.map((o) => o.actor))];\n body.appendChild(\n h(\n \"div\",\n { class: \"actors\" },\n actorIds.map((id) => h(\"div\", { class: \"actor\" }, doc.actors[id]?.label ?? id)),\n ),\n );\n const stores = h(\"div\", null);\n for (const sid of b.stores) {\n const s = doc.stores[sid];\n if (!s) continue;\n const colls = s.tables ?? s.documents ?? {};\n stores.appendChild(\n h(\n \"div\",\n { class: \"store\" },\n h(\"div\", { class: \"sname\" }, s.label, \" \", h(\"span\", { class: \"badge\" }, s.kind)),\n Object.entries(colls).map(([cid, c]) => {\n const hit = touched.get(`${sid}.${cid}`);\n return h(\n \"div\",\n { class: `table ${hit ? \"hit\" : \"\"}` },\n h(\"div\", { class: \"tname\" }, c.label ?? cid),\n h(\n \"div\",\n { class: \"cols\" },\n Object.entries(c.schema).map(([f, def]) =>\n h(\n \"span\",\n { class: hit?.has(f) ? \"hit\" : \"\" },\n `${f}${def.pk ? \"*\" : \"\"}:${def.type} `,\n ),\n ),\n ),\n );\n }),\n ),\n );\n }\n body.appendChild(stores);\n };\n draw();\n const ops = h(\"div\", { class: \"ops\" });\n const drawOps = () => {\n ops.innerHTML = \"\";\n const uc = b.usecases[active]!;\n if (uc.summary) ops.appendChild(h(\"div\", { class: \"muted\" }, uc.summary));\n for (const op of uc.ops) {\n ops.appendChild(\n h(\n \"div\",\n { class: `op ${op.op}`, onclick: () => openAnchor(op.anchor) },\n h(\n \"span\",\n { class: \"dir\" },\n op.op === \"read\"\n ? `${op.store} \u2192 ${doc.actors[op.actor]?.label ?? op.actor}`\n : `${doc.actors[op.actor]?.label ?? op.actor} \u2192 ${op.store}`,\n ),\n h(\"span\", null, op.label),\n ),\n );\n }\n };\n drawOps();\n tabs.addEventListener(\"click\", drawOps);\n return h(\n \"div\",\n { class: \"diagram dblens\" },\n h(\"div\", { class: \"dhead\" }, b.title ?? \"Storage\"),\n tabs,\n body,\n ops,\n );\n}\n", "import { api } from \"../api.js\";\nimport { h } from \"../dom.js\";\nimport { state, navigate, isNarrow } from \"../state.js\";\nimport { attachDefinitions, startLineComment, lineClick, codeSelectionHandler } from \"../code.js\";\nimport { threadPinRow } from \"../threads.js\";\nimport type { FileDiff, DiffRow } from \"../../diff.js\";\nimport type { Thread } from \"../../store.js\";\n\nexport function renderFiles(root: HTMLElement): void {\n const changes = state.data?.changes ?? [];\n const path = state.params.get(\"path\") ?? changes[0]?.path ?? \"\";\n const list = h(\"div\", { class: \"file-list\" });\n for (const c of changes) {\n const n = (state.data?.threads ?? []).filter(\n (t) => t.target.type === \"file\" && t.target.path === c.path && t.status === \"open\",\n ).length;\n list.appendChild(\n h(\n \"div\",\n {\n class: `item ${c.path === path ? \"active\" : \"\"}`,\n onclick: () => navigate(\"files\", { path: c.path }),\n },\n h(\n \"span\",\n {\n class: `badge ${c.status === \"A\" ? \"ok\" : c.status === \"D\" ? \"del\" : \"\"}`,\n style: { minWidth: \"20px\", textAlign: \"center\" },\n },\n c.status,\n ),\n h(\"span\", { class: \"name\", title: c.path }, c.path),\n n ? h(\"span\", { class: \"badge accent\" }, String(n)) : null,\n h(\n \"span\",\n { class: \"stat\" },\n h(\"span\", { class: \"a\" }, `+${c.additions}`),\n \" \",\n h(\"span\", { class: \"d\" }, `\u2212${c.deletions}`),\n ),\n ),\n );\n }\n if (!changes.length)\n list.appendChild(\n h(\"div\", { class: \"empty-state\" }, \"No changed files: base and head are the same commit.\"),\n );\n const view = h(\"div\", { class: \"file-view\", \"data-path\": path });\n root.appendChild(h(\"div\", { class: \"files-layout\" }, list, view));\n if (path) void renderDiff(view, path);\n}\n\nasync function renderDiff(view: HTMLElement, path: string): Promise<void> {\n const inChanges = state.data?.changes.some((c) => c.path === path);\n const line = Number(state.params.get(\"line\") ?? 0);\n const side = state.params.get(\"side\") === \"base\" ? \"base\" : \"head\";\n view.appendChild(h(\"div\", { class: \"muted\", style: { padding: \"12px\" } }, \"Loading\u2026\"));\n let d: FileDiff;\n try {\n if (inChanges) d = await api.diff(state.id, path);\n else {\n const f = await api.file(state.id, path, side);\n d = {\n path,\n lang: f.lang,\n binary: false,\n oldTotal: 0,\n newTotal: f.total,\n hunks: [\n {\n oldStart: 1,\n oldLines: 0,\n newStart: 1,\n newLines: f.total,\n rows: f.lines.map((html, i) => ({\n type: \"context\",\n newLine: i + 1,\n oldLine: i + 1,\n html,\n })),\n },\n ],\n };\n }\n } catch (e) {\n view.innerHTML = \"\";\n view.appendChild(h(\"div\", { class: \"empty-state\" }, (e as Error).message));\n return;\n }\n view.innerHTML = \"\";\n // Split needs two code columns; below the breakpoint there is room for one.\n const split = state.splitDiff && inChanges && !isNarrow();\n const toggle = h(\n \"button\",\n {\n class: \"small\",\n onclick: () => {\n state.splitDiff = !state.splitDiff;\n localStorage.setItem(\"thurview.split\", state.splitDiff ? \"1\" : \"0\");\n view.innerHTML = \"\";\n void renderDiff(view, path);\n },\n },\n state.splitDiff ? \"Unified\" : \"Split\",\n );\n const fileThreads = (state.data?.threads ?? []).filter(\n (t) => t.target.type === \"file\" && t.target.path === path && t.target.line === 0,\n );\n view.appendChild(\n h(\n \"div\",\n { class: \"file-head\" },\n h(\"span\", { class: \"path\" }, d.oldPath ? `${d.oldPath} \u2192 ${path}` : path),\n h(\n \"span\",\n { class: \"muted\" },\n `${d.hunks.reduce((n, hk) => n + hk.rows.filter((r) => r.type === \"add\").length, 0)} added \u00B7 ${d.hunks.reduce((n, hk) => n + hk.rows.filter((r) => r.type === \"del\").length, 0)} deleted`,\n ),\n h(\n \"span\",\n { class: \"muted hint\" },\n \"click a line number to comment \u00B7 shift-click or select text for a range\",\n ),\n state.viewingRevision === null\n ? h(\n \"button\",\n {\n class: \"small\",\n onclick: (e: MouseEvent) =>\n startLineComment(e, { type: \"file\", path, side: \"head\", line: 0 }),\n },\n fileThreads.length ? `File comments (${fileThreads.length})` : \"Comment on file\",\n )\n : null,\n inChanges\n ? isNarrow()\n ? null\n : toggle\n : h(\"span\", { class: \"badge\" }, `full file at ${side}`),\n ),\n );\n if (fileThreads.length)\n view.appendChild(\n h(\n \"div\",\n { class: \"thread-pins\", style: { margin: \"8px 14px\" } },\n fileThreads.map(threadPinRow),\n ),\n );\n if (d.binary) {\n view.appendChild(h(\"div\", { class: \"empty-state\" }, \"Binary file\"));\n return;\n }\n const threads = (state.data?.threads ?? []).filter(\n (t): t is Thread & { target: { type: \"file\" } } =>\n t.target.type === \"file\" && t.target.path === path,\n );\n const el = split ? splitView(d, threads) : unifiedView(d, threads);\n view.appendChild(el);\n codeSelectionHandler(view);\n if (line) {\n const tr = el.querySelector(`tr[data-${side}=\"${line}\"]`) as HTMLElement | null;\n if (tr) {\n tr.classList.add(\"hl\");\n tr.scrollIntoView({ block: \"center\" });\n }\n }\n}\n\nfunction lineCell(\n path: string,\n side: \"head\" | \"base\",\n n: number | undefined,\n _text: string,\n): HTMLElement {\n return h(\n \"td\",\n {\n class: \"ln\",\n title: n ? \"Comment on this line (shift-click for a range)\" : \"\",\n onclick: (e: MouseEvent) => {\n const table = (e.currentTarget as HTMLElement).closest(\"table\") as HTMLTableElement | null;\n if (n && table) lineClick(e, path, side, n, table);\n },\n },\n n ? String(n) : \"\",\n );\n}\n\nfunction threadRows(\n threads: (Thread & { target: { type: \"file\" } })[],\n side: \"head\" | \"base\",\n n: number | undefined,\n colspan: number,\n): HTMLElement[] {\n if (!n) return [];\n return threads\n .filter((t) => t.target.side === side && (t.target.endLine ?? t.target.line) === n)\n .map((t) => h(\"tr\", { class: \"thread-row\" }, h(\"td\", { colspan }, threadPinRow(t))));\n}\n\nfunction gapRow(\n d: FileDiff,\n from: number,\n to: number,\n colspan: number,\n onExpand: (rows: DiffRow[]) => void,\n): HTMLElement | null {\n if (to < from) return null;\n const count = to - from + 1;\n return h(\n \"tr\",\n { class: \"gap\" },\n h(\n \"td\",\n {\n colspan,\n onclick: async () => {\n const f = await api.file(state.id, d.path, \"head\", from, to);\n // map head line -> old line by offset within this gap (context lines only)\n onExpand(\n f.lines.map((html, i) => ({\n type: \"context\",\n newLine: from + i,\n oldLine: from + i - (gapOffset(d, from) ?? 0),\n html,\n })),\n );\n },\n },\n `\u22EF ${count} unchanged line${count > 1 ? \"s\" : \"\"}`,\n ),\n );\n}\n\nfunction gapOffset(d: FileDiff, newLine: number): number | undefined {\n // offset between new and old numbering before this gap\n let off = 0;\n for (const hk of d.hunks) {\n if (hk.newStart > newLine) break;\n off = hk.newStart + hk.newLines - (hk.oldStart + hk.oldLines);\n }\n return off;\n}\n\nfunction unifiedView(d: FileDiff, threads: (Thread & { target: { type: \"file\" } })[]): HTMLElement {\n const table = h(\"table\");\n const text = (html: string) => {\n const x = document.createElement(\"div\");\n x.innerHTML = html;\n return x.textContent ?? \"\";\n };\n const rowEl = (r: DiffRow) => {\n const tr = h(\n \"tr\",\n { class: r.type, \"data-head\": r.newLine ?? \"\", \"data-base\": r.oldLine ?? \"\" },\n lineCell(d.path, \"base\", r.oldLine, text(r.html)),\n lineCell(d.path, \"head\", r.newLine, text(r.html)),\n h(\"td\", {\n class: \"src\",\n html: (r.type === \"add\" ? \"+\" : r.type === \"del\" ? \"-\" : \" \") + (r.html || \" \"),\n }),\n );\n return [\n tr,\n ...threadRows(\n threads,\n r.type === \"del\" ? \"base\" : \"head\",\n r.type === \"del\" ? r.oldLine : r.newLine,\n 3,\n ),\n ];\n };\n let prevEnd = 0;\n d.hunks.forEach((hk, i) => {\n const gap = gapRow(d, prevEnd + 1, hk.newStart - 1, 3, (rows) => {\n const g = table.querySelector(`tr.gap[data-i=\"${i}\"]`);\n if (!g) return;\n rows.flatMap(rowEl).forEach((r) => table.insertBefore(r, g));\n g.remove();\n });\n if (gap) {\n gap.dataset[\"i\"] = String(i);\n table.appendChild(gap);\n }\n for (const r of hk.rows) rowEl(r).forEach((x) => table.appendChild(x));\n prevEnd = hk.newStart + hk.newLines - 1;\n });\n if (d.newTotal > prevEnd) {\n const gap = gapRow(d, prevEnd + 1, d.newTotal, 3, (rows) => {\n const g = table.querySelector(\"tr.gap.tail\");\n if (!g) return;\n rows.flatMap(rowEl).forEach((r) => table.insertBefore(r, g));\n g.remove();\n });\n if (gap) {\n gap.classList.add(\"tail\");\n table.appendChild(gap);\n }\n }\n const wrap = h(\"div\", { class: \"code\" }, table);\n attachDefinitions(wrap, \"head\");\n return wrap;\n}\n\nfunction splitView(d: FileDiff, threads: (Thread & { target: { type: \"file\" } })[]): HTMLElement {\n const left = h(\"table\");\n const right = h(\"table\");\n const text = (html: string) => {\n const x = document.createElement(\"div\");\n x.innerHTML = html;\n return x.textContent ?? \"\";\n };\n const pair = (l: DiffRow | null, r: DiffRow | null) => {\n const ltr = l\n ? h(\n \"tr\",\n { class: l.type === \"del\" ? \"del\" : \"\", \"data-base\": l.oldLine ?? \"\" },\n lineCell(d.path, \"base\", l.oldLine, text(l.html)),\n h(\"td\", { class: \"src\", html: l.html || \" \" }),\n )\n : h(\"tr\", null, h(\"td\", { class: \"ln empty\" }), h(\"td\", { class: \"src empty\" }, \" \"));\n const rtr = r\n ? h(\n \"tr\",\n { class: r.type === \"add\" ? \"add\" : \"\", \"data-head\": r.newLine ?? \"\" },\n lineCell(d.path, \"head\", r.newLine, text(r.html)),\n h(\"td\", { class: \"src\", html: r.html || \" \" }),\n )\n : h(\"tr\", null, h(\"td\", { class: \"ln empty\" }), h(\"td\", { class: \"src empty\" }, \" \"));\n left.appendChild(ltr);\n right.appendChild(rtr);\n const lt = threadRows(threads, \"base\", l?.oldLine, 2);\n const rt = threadRows(threads, \"head\", r?.newLine, 2);\n // keep both sides aligned: pad the shorter side\n const n = Math.max(lt.length, rt.length);\n for (let i = 0; i < n; i++) {\n left.appendChild(lt[i] ?? h(\"tr\", { class: \"thread-row\" }, h(\"td\", { colspan: 2 }, \" \")));\n right.appendChild(rt[i] ?? h(\"tr\", { class: \"thread-row\" }, h(\"td\", { colspan: 2 }, \" \")));\n }\n };\n const emitRows = (rows: DiffRow[]) => {\n let i = 0;\n while (i < rows.length) {\n const r = rows[i]!;\n if (r.type === \"context\") {\n pair(r, r);\n i++;\n continue;\n }\n const dels: DiffRow[] = [];\n const adds: DiffRow[] = [];\n while (i < rows.length && rows[i]!.type === \"del\") dels.push(rows[i++]!);\n while (i < rows.length && rows[i]!.type === \"add\") adds.push(rows[i++]!);\n const n = Math.max(dels.length, adds.length);\n for (let k = 0; k < n; k++) pair(dels[k] ?? null, adds[k] ?? null);\n }\n };\n let prevEnd = 0;\n const gapBoth = (from: number, to: number) => {\n if (to < from) return;\n const count = to - from + 1;\n const lg = h(\"tr\", { class: \"gap\" }, h(\"td\", { colspan: 2 }, `\u22EF ${count} unchanged`));\n const rg = h(\"tr\", { class: \"gap\" }, h(\"td\", { colspan: 2 }, `\u22EF ${count} unchanged`));\n const expand = async () => {\n const f = await api.file(state.id, d.path, \"head\", from, to);\n const off = gapOffset(d, from) ?? 0;\n const rows: DiffRow[] = f.lines.map((html, k) => ({\n type: \"context\",\n newLine: from + k,\n oldLine: from + k - off,\n html,\n }));\n const lAnchor = lg.nextSibling;\n const rAnchor = rg.nextSibling;\n lg.remove();\n rg.remove();\n const tmpL = left;\n const tmpR = right;\n const fragL = document.createDocumentFragment();\n const fragR = document.createDocumentFragment();\n for (const r of rows) {\n fragL.appendChild(\n h(\n \"tr\",\n { \"data-base\": r.oldLine ?? \"\" },\n lineCell(d.path, \"base\", r.oldLine, text(r.html)),\n h(\"td\", { class: \"src\", html: r.html || \" \" }),\n ),\n );\n fragR.appendChild(\n h(\n \"tr\",\n { \"data-head\": r.newLine ?? \"\" },\n lineCell(d.path, \"head\", r.newLine, text(r.html)),\n h(\"td\", { class: \"src\", html: r.html || \" \" }),\n ),\n );\n }\n tmpL.insertBefore(fragL, lAnchor);\n tmpR.insertBefore(fragR, rAnchor);\n };\n lg.addEventListener(\"click\", expand);\n rg.addEventListener(\"click\", expand);\n left.appendChild(lg);\n right.appendChild(rg);\n };\n for (const hk of d.hunks) {\n gapBoth(prevEnd + 1, hk.newStart - 1);\n emitRows(hk.rows);\n prevEnd = hk.newStart + hk.newLines - 1;\n }\n gapBoth(prevEnd + 1, d.newTotal);\n const l = h(\"div\", { class: \"code\" }, left);\n const r = h(\"div\", { class: \"code\" }, right);\n attachDefinitions(l, \"base\");\n attachDefinitions(r, \"head\");\n // synced horizontal scroll\n l.addEventListener(\"scroll\", () => (r.scrollLeft = l.scrollLeft));\n r.addEventListener(\"scroll\", () => (l.scrollLeft = r.scrollLeft));\n return h(\"div\", { class: \"split\" }, l, r);\n}\n", "import { api } from \"../api.js\";\nimport { h } from \"../dom.js\";\nimport { state, navigate } from \"../state.js\";\n\nexport async function renderCommits(root: HTMLElement): Promise<void> {\n const el = h(\"div\", { class: \"commits\" }, h(\"div\", { class: \"muted\" }, \"Loading\u2026\"));\n root.appendChild(el);\n const commits = await api.commits(state.id);\n el.innerHTML = \"\";\n const r = state.data!.review;\n el.appendChild(\n h(\n \"p\",\n { class: \"muted\" },\n `${commits.length} commit${commits.length === 1 ? \"\" : \"s\"} from `,\n h(\"code\", null, r.pins.base.slice(0, 12)),\n \" to \",\n h(\"code\", null, r.pins.head.slice(0, 12)),\n ),\n );\n if (!commits.length)\n el.appendChild(h(\"div\", { class: \"empty-state\" }, \"No commits between base and head.\"));\n for (const c of commits) {\n el.appendChild(\n h(\n \"div\",\n { class: \"commit\" },\n h(\n \"div\",\n null,\n h(\"span\", { class: \"subject\" }, c.subject),\n \" \",\n h(\"code\", null, c.shortSha),\n \" \",\n h(\"span\", { class: \"muted\" }, `${c.author} \u00B7 ${new Date(c.date).toLocaleString()}`),\n ),\n c.body ? h(\"pre\", null, c.body) : null,\n h(\n \"div\",\n { class: \"files\" },\n c.files.map((f) => h(\"span\", { onclick: () => navigate(\"files\", { path: f }) }, f)),\n ),\n ),\n );\n }\n}\n", "import { h, append, popover } from \"../dom.js\";\nimport { state, navigate, threadsFor } from \"../state.js\";\nimport { openAnchorPeek } from \"../code.js\";\nimport { commentPopover, threadPinRow } from \"../threads.js\";\nimport type { MapNode, MapEdge } from \"../../document/schema.js\";\n\nexport function renderMap(root: HTMLElement): void {\n const map = state.data?.map;\n if (!map) {\n root.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n \"No software map in this revision. The agent authors \",\n h(\"code\", null, \"map.yaml\"),\n \" and publishes again.\",\n ),\n );\n return;\n }\n const headNodes = new Map(map.head.nodes.map((n) => [n.id, n]));\n const baseNodes = new Map((map.base?.nodes ?? []).map((n) => [n.id, n]));\n const all = new Map<string, MapNode & { status: \"added\" | \"removed\" | \"changed\" | \"\" }>();\n for (const n of map.head.nodes)\n all.set(n.id, {\n ...n,\n status: map.diff.added.includes(n.id)\n ? \"added\"\n : map.diff.changed.includes(n.id)\n ? \"changed\"\n : \"\",\n });\n for (const id of map.diff.removed) {\n const n = baseNodes.get(id);\n if (n) all.set(id, { ...n, status: \"removed\" });\n }\n const edges: MapEdge[] = [...map.head.edges];\n for (const e of map.base?.edges ?? [])\n if (!edges.some((x) => x.from === e.from && x.to === e.to)) edges.push(e);\n\n const selected = state.params.get(\"node\") ?? \"\";\n const parentOf = (id: string) => (id.includes(\".\") ? id.slice(0, id.lastIndexOf(\".\")) : \"\");\n let level =\n selected && all.has(selected)\n ? childrenOf(selected).length\n ? selected\n : parentOf(selected)\n : \"\";\n\n function childrenOf(p: string) {\n return [...all.values()].filter((n) => parentOf(n.id) === p);\n }\n function descendantsChanged(id: string) {\n return [...all.values()].filter((n) => n.id.startsWith(id + \".\") && n.status).length;\n }\n const canvas = h(\"div\", { class: \"map-canvas\" });\n const side = h(\"div\", { class: \"map-side\" });\n root.appendChild(h(\"div\", { class: \"map-layout\" }, canvas, side));\n\n const draw = () => {\n canvas.innerHTML = \"\";\n const crumbs = h(\"div\", { class: \"crumbs\" });\n const parts = level ? level.split(\".\") : [];\n crumbs.appendChild(\n h(\n \"span\",\n {\n onclick: () => {\n level = \"\";\n draw();\n },\n },\n \"System\",\n ),\n );\n parts.forEach((_, i) => {\n const id = parts.slice(0, i + 1).join(\".\");\n crumbs.appendChild(document.createTextNode(\" \u203A \"));\n crumbs.appendChild(\n h(\n \"span\",\n {\n onclick: () => {\n level = id;\n draw();\n },\n },\n all.get(id)?.label ?? id,\n ),\n );\n });\n canvas.appendChild(crumbs);\n const kids = childrenOf(level);\n const legend = h(\n \"div\",\n { class: \"muted\", style: { fontSize: \"12px\", marginBottom: \"10px\" } },\n h(\"span\", { class: \"badge ok\" }, `${map.diff.added.length} added`),\n \" \",\n h(\"span\", { class: \"badge del\" }, `${map.diff.removed.length} removed`),\n \" \",\n h(\"span\", { class: \"badge warn\" }, `${map.diff.changed.length} changed`),\n map.base ? \"\" : \" (no base map: changed = touched by the diff)\",\n );\n canvas.appendChild(legend);\n const grid = h(\"div\", { class: \"map-grid\" });\n for (const n of kids) {\n const nk = childrenOf(n.id).length;\n const files = map.filesByNode[n.id]?.length ?? 0;\n grid.appendChild(\n h(\n \"div\",\n {\n class: `map-node ${n.status} ${n.id === selected ? \"selected\" : \"\"}`,\n onclick: () => {\n navigate(\"map\", { node: n.id });\n },\n ondblclick: () => {\n if (nk) {\n level = n.id;\n draw();\n }\n },\n },\n n.status\n ? h(\n \"span\",\n {\n class: `status badge ${n.status === \"added\" ? \"ok\" : n.status === \"removed\" ? \"del\" : \"warn\"}`,\n },\n n.status,\n )\n : null,\n h(\"div\", { class: \"kind\" }, n.kind),\n h(\"div\", { class: \"label\" }, n.label),\n n.description ? h(\"div\", { class: \"desc\" }, n.description) : null,\n h(\n \"div\",\n { class: \"children\" },\n nk ? `${nk} inside \u00B7 dbl-click to open` : \"\",\n nk && descendantsChanged(n.id) ? ` \u00B7 ${descendantsChanged(n.id)} changed` : \"\",\n files ? ` \u00B7 ${files} changed file${files > 1 ? \"s\" : \"\"}` : \"\",\n ),\n ),\n );\n }\n if (!kids.length)\n grid.appendChild(h(\"div\", { class: \"empty-state\" }, \"Nothing at this level.\"));\n canvas.appendChild(grid);\n const here = new Set(kids.map((k) => k.id));\n const top = (id: string) => {\n let x = id;\n while (x && !here.has(x)) x = parentOf(x);\n return x;\n };\n const shown = edges.filter((e) => here.has(top(e.from)) || here.has(top(e.to)));\n if (shown.length) {\n canvas.appendChild(\n h(\n \"div\",\n { class: \"map-edges\" },\n h(\"div\", { class: \"muted\", style: { marginBottom: \"4px\" } }, \"Relationships\"),\n shown.map((e) =>\n h(\n \"div\",\n { class: \"edge\" },\n h(\n \"b\",\n { onclick: () => navigate(\"map\", { node: e.from }) },\n all.get(e.from)?.label ?? e.from,\n ),\n \"\u2192\",\n h(\n \"b\",\n { onclick: () => navigate(\"map\", { node: e.to }) },\n all.get(e.to)?.label ?? e.to,\n ),\n h(\"span\", { class: \"muted\" }, e.label ?? \"\"),\n ),\n ),\n ),\n );\n }\n drawSide();\n };\n const drawSide = () => {\n side.innerHTML = \"\";\n const n = selected ? all.get(selected) : null;\n if (!n) {\n side.appendChild(\n h(\n \"div\",\n { class: \"muted\" },\n \"Select a node to see its files, code and relationships. Double-click to drill in.\",\n ),\n );\n return;\n }\n const anchor = n.anchor ? state.data?.document?.anchors[n.anchor] : null;\n const files = map.filesByNode[n.id] ?? [];\n const threads = threadsFor((t) => t.type === \"map\" && t.node === n.id);\n append(side, [\n h(\n \"div\",\n { class: \"kind muted\", style: { fontSize: \"11px\", textTransform: \"uppercase\" } },\n n.kind,\n \" \",\n n.status\n ? h(\n \"span\",\n {\n class: `badge ${n.status === \"added\" ? \"ok\" : n.status === \"removed\" ? \"del\" : \"warn\"}`,\n },\n n.status,\n )\n : \"\",\n ),\n h(\"h3\", { style: { margin: \"2px 0 6px\" } }, n.label),\n h(\"div\", { class: \"mono muted\", style: { fontSize: \"11px\" } }, n.id),\n n.description ? h(\"p\", null, n.description) : null,\n anchor?.peek\n ? h(\n \"p\",\n null,\n h(\"button\", { class: \"small\", onclick: () => openAnchorPeek(anchor) }, \"Peek code \u25B8\"),\n \" \",\n h(\"span\", { class: \"mono muted\" }, `${anchor.peek.file}:${anchor.peek.from}`),\n )\n : null,\n n.files?.length\n ? h(\n \"div\",\n { class: \"muted\", style: { marginTop: \"8px\" } },\n \"Owns: \",\n n.files.map((g) => h(\"code\", null, g + \" \")),\n )\n : null,\n files.length\n ? h(\n \"div\",\n { style: { marginTop: \"8px\" } },\n h(\"b\", null, \"Changed files\"),\n files.map((f) =>\n h(\"span\", { class: \"file\", onclick: () => navigate(\"files\", { path: f }) }, f),\n ),\n )\n : null,\n h(\n \"div\",\n { style: { marginTop: \"12px\" } },\n h(\n \"button\",\n {\n class: \"small\",\n onclick: (e: MouseEvent) =>\n popover(commentPopover({ type: \"map\", node: n.id }), { x: e.pageX, y: e.pageY + 8 }),\n },\n \"Comment on this node\",\n ),\n ),\n threads.length\n ? h(\n \"div\",\n { class: \"thread-pins\", style: { marginTop: \"10px\" } },\n threads.map(threadPinRow),\n )\n : null,\n ]);\n if (n.status === \"changed\" && baseNodes.has(n.id) && headNodes.has(n.id)) {\n const b = baseNodes.get(n.id)!;\n const hh = headNodes.get(n.id)!;\n const diffs: string[] = [];\n if (b.label !== hh.label) diffs.push(`label: ${b.label} \u2192 ${hh.label}`);\n if (b.description !== hh.description) diffs.push(`description changed`);\n if (JSON.stringify(b.files) !== JSON.stringify(hh.files))\n diffs.push(`files: ${(b.files ?? []).join(\", \")} \u2192 ${(hh.files ?? []).join(\", \")}`);\n if (diffs.length)\n side.appendChild(\n h(\n \"div\",\n { style: { marginTop: \"10px\" } },\n h(\"b\", null, \"Base \u2192 head\"),\n diffs.map((d) => h(\"div\", { class: \"muted\" }, d)),\n ),\n );\n }\n };\n draw();\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["m", "m", "side", "m", "m", "uc", "side", "l", "r", "side", "popover"]
7
7
  }