thurview 0.7.0 → 0.8.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.
- package/README.md +34 -15
- package/dist/cli.js +270 -15
- package/dist/cli.js.map +1 -1
- package/dist/coverage.js +208 -0
- package/dist/coverage.js.map +1 -0
- package/dist/document/compile.js +25 -10
- package/dist/document/compile.js.map +1 -1
- package/dist/graph.js +25 -4
- package/dist/graph.js.map +1 -1
- package/dist/server/server.js +4 -2
- package/dist/server/server.js.map +1 -1
- package/dist/store.js +4 -0
- package/dist/store.js.map +1 -1
- package/dist/ui/app.css +184 -0
- package/dist/ui/app.js +455 -54
- package/dist/ui/app.js.map +4 -4
- package/package.json +1 -1
- package/skills/thurview/SKILL.md +31 -11
- package/skills/thurview/references/code-explainer.md +166 -0
package/dist/ui/app.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 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", "../../src/ui/views/map-model.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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\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\";\nimport type { InterfaceDelta, InterfaceEntry } from \"../../interfaces.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 root.appendChild(interfaceDelta(doc.interfaces));\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\n/** Ids the parser cannot produce, so the panel can hold threads like a document block. */\nconst DELTA_BLOCK = \"interface-delta\";\nconst DELTA_SHOWN = 12;\n\nconst CHANGE_CLASS: Record<InterfaceEntry[\"change\"], string> = {\n removed: \"del\",\n changed: \"warn\",\n added: \"ok\",\n};\n\n/**\n * What the change did to the surfaces other code can reach, above the document\n * because it is the reader's first question. Derived at publish from the code\n * graph, so a refactor that moved nothing says exactly that.\n */\nfunction interfaceDelta(delta: InterfaceDelta | null): HTMLElement {\n const wrap = h(\"div\", { class: \"block ifd\", \"data-block\": DELTA_BLOCK });\n const threads = threadsFor((t) => t.type === \"document\" && t.blockId === DELTA_BLOCK);\n if (threads.length) wrap.classList.add(\"has-threads\");\n // the panel has no gutter to hang the comment button in, so it lives in the head\n const actions = h(\n \"div\",\n { class: \"block-actions\" },\n h(\n \"button\",\n {\n class: threads.length ? \"count\" : \"\",\n title: \"Comment on the interface delta\",\n onclick: (e: MouseEvent) => {\n if (state.viewingRevision !== null) return;\n popover(commentPopover({ type: \"document\", blockId: DELTA_BLOCK }), {\n x: e.pageX + 10,\n y: e.pageY,\n });\n },\n },\n threads.length ? String(threads.length) : \"+\",\n ),\n );\n const body = h(\"div\", { class: \"ifd-body\" });\n const toggle = h(\"span\", { class: \"heading-toggle\" }, \"hide\");\n toggle.addEventListener(\"click\", () => {\n const hidden = body.hidden;\n body.hidden = !hidden;\n toggle.textContent = hidden ? \"hide\" : \"show\";\n });\n const counts = delta\n ? ([\"removed\", \"changed\", \"added\"] as const)\n .map((c) => [c, delta.entries.filter((e) => e.change === c).length] as const)\n .filter(([, n]) => n > 0)\n : [];\n wrap.appendChild(\n h(\n \"div\",\n { class: \"ifd-head\" },\n h(\"span\", { class: \"t\" }, \"Interface delta\"),\n counts.map(([c, n]) => h(\"span\", { class: `badge ${CHANGE_CLASS[c]}` }, `${n} ${c}`)),\n h(\"span\", { class: \"spacer\" }),\n toggle,\n actions,\n ),\n );\n body.appendChild(\n h(\n \"p\",\n { class: \"ifd-verdict\" },\n delta ? delta.verdict : \"Unavailable: the code graph could not be built for these commits.\",\n ),\n );\n const entries = delta?.entries ?? [];\n const rest = entries.slice(DELTA_SHOWN);\n for (const e of entries.slice(0, DELTA_SHOWN)) body.appendChild(interfaceRow(e));\n if (rest.length) {\n const more = h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: () => {\n more.replaceWith(...rest.map(interfaceRow));\n },\n },\n `show ${rest.length} more`,\n );\n body.appendChild(more);\n }\n wrap.appendChild(body);\n if (threads.length)\n wrap.appendChild(h(\"div\", { class: \"thread-pins\" }, threads.map(threadPinRow)));\n return wrap;\n}\n\nfunction interfaceRow(e: InterfaceEntry): HTMLElement {\n return h(\n \"div\",\n {\n class: `ifd-entry ifd-${e.change}`,\n title: \"Open in Files\",\n onclick: () => navigate(\"files\", { path: e.file, line: e.line, side: e.graph }),\n },\n h(\"span\", { class: `badge ${CHANGE_CLASS[e.change]}` }, e.change),\n h(\n \"div\",\n { class: \"ifd-what\" },\n e.was ? h(\"div\", { class: \"ifd-was\" }, h(\"code\", null, e.was)) : null,\n h(\"code\", { class: \"ifd-name\" }, e.name),\n e.capability ? h(\"div\", { class: \"ifd-cap\" }, e.capability) : null,\n ),\n h(\"span\", { class: \"ifd-where mono\" }, `${e.file}:${e.line}`),\n );\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 {\n allEdges,\n changedInside,\n childrenOf,\n collect,\n neighboursOf,\n parentOf,\n rankEdges,\n routeIn,\n touched,\n type MapItem,\n} from \"./map-model.js\";\nimport type { MapEdge } from \"../../document/schema.js\";\n\nconst statusClass = (s: string) => (s === \"added\" ? \"ok\" : s === \"removed\" ? \"del\" : \"warn\");\n\nexport function renderMap(root: HTMLElement): void {\n const map = state.data?.map;\n // A map with no nodes is the same to the reader as no map at all, and the\n // reason for both is worth saying: an absent map is a claim, not a gap.\n if (!map || !map.head.nodes.length) {\n append(root, [\n h(\n \"div\",\n { class: \"empty-state\" },\n h(\"p\", null, \"No map in this review.\"),\n h(\n \"p\",\n null,\n \"The map places a change inside the system and shows what sits next to it. \",\n \"A change that lands in one place, where the Files tab already answers that, ships without one.\",\n ),\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 = collect(map);\n const edges = allEdges(map);\n const route = routeIn(all, map.filesByNode);\n\n const selected = state.params.get(\"node\") ?? \"\";\n const hasChildren = (id: string) => [...all.keys()].some((k) => parentOf(k) === id);\n let level =\n selected && all.has(selected) ? (hasChildren(selected) ? selected : parentOf(selected)) : \"\";\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 openLevel = (id: string) => {\n level = id;\n draw();\n };\n\n // The lead-in. A reader who opens this tab cold has no idea why it is here,\n // so it says what the map answers that the diff cannot, and hands them one\n // place to start rather than a board of equal boxes.\n const intro = () => {\n const counts: [number, string, string][] = [\n [map.diff.added.length, \"ok\", \"added\"],\n [map.diff.changed.length, \"warn\", \"changed\"],\n [map.diff.removed.length, \"del\", \"removed\"],\n ];\n const marks = counts.filter(([n]) => n > 0);\n return h(\n \"div\",\n { class: \"map-intro\" },\n h(\"h2\", null, \"Where the change landed\"),\n h(\n \"p\",\n null,\n \"The Files tab has the lines. This has the parts of the system they landed in, and what\",\n \" those parts connect to \u2014 the neighbours a diff never names. Marked parts are the change;\",\n \" the rest is the context you need to judge it.\",\n ),\n h(\n \"div\",\n { class: \"map-route\" },\n marks.length\n ? marks.map(([n, cls, word]) => h(\"span\", { class: `badge ${cls}` }, `${n} ${word}`))\n : h(\"span\", { class: \"muted\" }, \"This change touched no part of the map.\"),\n route\n ? h(\n \"button\",\n {\n class: \"small\",\n onclick: () => navigate(\"map\", { node: route.id }),\n },\n `Start at ${route.label} \u203A`,\n )\n : null,\n map.base\n ? null\n : h(\n \"span\",\n { class: \"muted\" },\n \"No base map, so changed means touched by the diff and nothing reads as added or removed.\",\n ),\n ),\n );\n };\n\n const crumbs = () => {\n const el = h(\"div\", { class: \"crumbs\" });\n const parts = level ? level.split(\".\") : [];\n el.appendChild(h(\"span\", { onclick: () => openLevel(\"\") }, \"System\"));\n parts.forEach((_, i) => {\n const id = parts.slice(0, i + 1).join(\".\");\n el.appendChild(document.createTextNode(\" \u203A \"));\n el.appendChild(h(\"span\", { onclick: () => openLevel(id) }, all.get(id)?.label ?? id));\n });\n return el;\n };\n\n const card = (n: MapItem) => {\n const inside = [...all.keys()].filter((k) => parentOf(k) === n.id).length;\n const hidden = changedInside(all, n.id);\n const files = map.filesByNode[n.id]?.length ?? 0;\n return h(\n \"div\",\n {\n class: `map-node ${n.status} ${touched(all, n) ? \"\" : \"quiet\"} ${n.id === selected ? \"selected\" : \"\"}`,\n onclick: () => navigate(\"map\", { node: n.id }),\n ondblclick: () => inside && openLevel(n.id),\n },\n n.status ? h(\"span\", { class: `status badge ${statusClass(n.status)}` }, n.status) : 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: \"meta\" },\n files\n ? h(\"span\", { class: \"warn-text\" }, `${files} changed file${files > 1 ? \"s\" : \"\"}`)\n : null,\n hidden ? h(\"span\", { class: \"warn-text\" }, `${hidden} changed inside`) : null,\n inside\n ? h(\n \"button\",\n {\n class: \"small drill\",\n onclick: (e: MouseEvent) => {\n e.stopPropagation();\n openLevel(n.id);\n },\n },\n `Open ${inside} inside \u203A`,\n )\n : null,\n ),\n );\n };\n\n const board = () => {\n const kids = childrenOf(all, level, map.filesByNode);\n if (!kids.length) return h(\"div\", { class: \"empty-state\" }, \"Nothing at this level.\");\n const hot = kids.filter((n) => touched(all, n));\n const cold = kids.filter((n) => !touched(all, n));\n const group = (title: string | null, items: MapItem[]) =>\n items.length\n ? h(\n \"div\",\n { class: \"map-group\" },\n title ? h(\"h3\", null, title) : null,\n h(\"div\", { class: \"map-grid\" }, items.map(card)),\n )\n : null;\n if (!hot.length)\n return h(\n \"div\",\n null,\n h(\"div\", { class: \"map-note muted\" }, \"Nothing here was touched. The change is elsewhere.\"),\n group(null, cold),\n );\n return h(\n \"div\",\n null,\n group(cold.length ? \"What the change touched\" : null, hot),\n group(\"Context \u2014 unchanged here\", cold),\n );\n };\n\n // Links, folded up to the parts on screen. An edge between two boxes inside\n // the same card belongs to that card's level, not this one; what matters here\n // is which visible parts a change can travel between.\n const links = () => {\n const here = new Set(childrenOf(all, level, map.filesByNode).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 folded: MapEdge[] = [];\n for (const e of edges) {\n // An endpoint outside this subtree folds to nothing, and a link arriving\n // from elsewhere is exactly the one worth keeping: it stays under its own\n // name so the reader can see what reaches in.\n const from = top(e.from) || e.from;\n const to = top(e.to) || e.to;\n if (from === to) continue;\n if (!here.has(from) && !here.has(to)) continue;\n if (folded.some((x) => x.from === from && x.to === to)) continue;\n folded.push({ from, to, ...(e.label ? { label: e.label } : {}) });\n }\n if (!folded.length) return null;\n return h(\n \"div\",\n { class: \"map-edges\" },\n h(\"h3\", null, \"What connects to what here\"),\n h(\n \"div\",\n { class: \"muted map-note\" },\n \"A link touching a changed part is where the two sides can fall out of step.\",\n ),\n rankEdges(folded, all).map(({ edge, touchesChange }) =>\n h(\n \"div\",\n { class: `edge ${touchesChange ? \"hot\" : \"\"}` },\n h(\n \"b\",\n { onclick: () => navigate(\"map\", { node: edge.from }) },\n all.get(edge.from)?.label ?? edge.from,\n ),\n \"\u2192\",\n h(\n \"b\",\n { onclick: () => navigate(\"map\", { node: edge.to }) },\n all.get(edge.to)?.label ?? edge.to,\n ),\n h(\"span\", { class: \"muted\" }, edge.label ?? \"\"),\n ),\n ),\n );\n };\n\n const draw = () => {\n canvas.innerHTML = \"\";\n append(canvas, [intro(), crumbs(), board(), links()]);\n drawSide();\n };\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 \"Pick a part to see what changed in it, the code behind it, and what it connects to.\",\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 const neighbours = neighboursOf(map, 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 ? h(\"span\", { class: `badge ${statusClass(n.status)}` }, n.status) : \"\",\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 neighbours.length\n ? h(\n \"div\",\n { class: \"neighbours\", style: { marginTop: \"12px\" } },\n h(\"b\", null, \"Next to it\"),\n h(\n \"div\",\n { class: \"muted\", style: { fontSize: \"11px\" } },\n \"\u2192 this reaches \u00B7 \u2190 reaches this\",\n ),\n neighbours.map((x) => {\n const other = all.get(x.other);\n return h(\n \"div\",\n { class: \"neighbour\" },\n h(\"span\", { class: \"mono muted\" }, x.dir === \"out\" ? \"\u2192\" : \"\u2190\"),\n h(\n \"span\",\n { class: \"nb\", onclick: () => navigate(\"map\", { node: x.other }) },\n other?.label ?? x.other,\n ),\n other?.status\n ? h(\"span\", { class: `badge ${statusClass(other.status)}` }, other.status)\n : null,\n x.label ? h(\"span\", { class: \"muted\" }, x.label) : null,\n );\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", "// The reading order behind the Map tab. The Files tab already answers \"which\n// lines changed\"; the map answers \"which parts of the system did they land in,\n// and what sits next to those parts\". Everything here exists to put the parts\n// that need attention in front of the reader before the ones that do not, so\n// the view itself only has to draw the order it is given.\nimport type { CompiledMap } from \"../../document/compile.js\";\nimport type { MapEdge, MapNode } from \"../../document/schema.js\";\n\nexport type NodeStatus = \"added\" | \"removed\" | \"changed\" | \"\";\nexport type MapItem = MapNode & { status: NodeStatus };\nexport type FilesByNode = Record<string, string[]>;\n\nexport function parentOf(id: string): string {\n return id.includes(\".\") ? id.slice(0, id.lastIndexOf(\".\")) : \"\";\n}\n\n/** Every node the reader can meet: head, plus the ones the change removed. */\nexport function collect(map: CompiledMap): Map<string, MapItem> {\n const all = new Map<string, MapItem>();\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 = (map.base?.nodes ?? []).find((x) => x.id === id);\n if (n) all.set(id, { ...n, status: \"removed\" });\n }\n return all;\n}\n\n/** Nodes with a status somewhere below `id`: the change a closed node hides. */\nexport function changedInside(all: Map<string, MapItem>, id: string): number {\n let n = 0;\n for (const item of all.values()) if (item.id.startsWith(id + \".\") && item.status) n++;\n return n;\n}\n\n/** True when this node, or anything under it, is part of the change. */\nexport function touched(all: Map<string, MapItem>, item: MapItem): boolean {\n return !!item.status || changedInside(all, item.id) > 0;\n}\n\n/**\n * The children of `parent` in reading order: what the change touched first,\n * heaviest first, then the untouched context in the order the author wrote it.\n */\nexport function childrenOf(\n all: Map<string, MapItem>,\n parent: string,\n filesByNode: FilesByNode,\n): MapItem[] {\n const kids = [...all.values()].filter((n) => parentOf(n.id) === parent);\n const weight = (n: MapItem) => (filesByNode[n.id]?.length ?? 0) + changedInside(all, n.id);\n return kids\n .map((n, i) => ({ n, i }))\n .sort((a, b) => {\n const t = Number(touched(all, b.n)) - Number(touched(all, a.n));\n if (t) return t;\n const w = weight(b.n) - weight(a.n);\n return w || a.i - b.i;\n })\n .map((x) => x.n);\n}\n\n/**\n * Where to start reading. The most specific part the change landed in \u2014 a\n * parent only holds the diff of its children, so it is never the answer while\n * a leaf carries one. Null when the change touched no part of the map.\n */\nexport function routeIn(all: Map<string, MapItem>, filesByNode: FilesByNode): MapItem | null {\n const changed = [...all.values()].filter((n) => n.status);\n const hasChild = (id: string) => [...all.keys()].some((k) => parentOf(k) === id);\n const leaves = changed.filter((n) => !hasChild(n.id));\n const pool = leaves.length ? leaves : changed;\n let best: MapItem | null = null;\n let bestFiles = -1;\n for (const n of pool) {\n const files = filesByNode[n.id]?.length ?? 0;\n if (files > bestFiles) {\n best = n;\n bestFiles = files;\n }\n }\n return best;\n}\n\nexport interface Neighbour {\n dir: \"out\" | \"in\";\n other: string;\n label?: string;\n}\n\n/** What a change to `id` can reach, and what reaches it. */\nexport function neighboursOf(map: CompiledMap, id: string): Neighbour[] {\n const out: Neighbour[] = [];\n const into: Neighbour[] = [];\n for (const e of allEdges(map)) {\n if (e.from === id)\n out.push({ dir: \"out\", other: e.to, ...(e.label ? { label: e.label } : {}) });\n if (e.to === id)\n into.push({ dir: \"in\", other: e.from, ...(e.label ? { label: e.label } : {}) });\n }\n return [...out, ...into];\n}\n\n/** Head edges, plus the ones only the base had, so a removed link still shows. */\nexport function allEdges(map: CompiledMap): MapEdge[] {\n const edges = [...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 return edges;\n}\n\nexport interface RankedEdge {\n edge: MapEdge;\n touchesChange: boolean;\n}\n\n/**\n * Edges ordered by how much of the change they carry: both ends changed first,\n * then one end, then the rest. A link between two changed parts is where a\n * contract can have moved on only one side of it.\n */\nexport function rankEdges(edges: MapEdge[], all: Map<string, MapItem>): RankedEdge[] {\n const hot = (id: string) => {\n const item = all.get(id);\n return item && touched(all, item) ? 1 : 0;\n };\n return edges\n .map((edge, i) => ({ edge, i, ends: hot(edge.from) + hot(edge.to) }))\n .sort((a, b) => b.ends - a.ends || a.i - b.i)\n .map(({ edge, ends }) => ({ edge, touchesChange: ends > 0 }));\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["m", "m", "side", "m", "m", "uc", "touched", "side", "l", "r", "side", "statusClass", "popover"]
|
|
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", "../../src/ui/views/map-model.ts", "../../src/ui/views/coverage.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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\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 { Coverage } from \"../coverage.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 /** explainers only: what the document examined at the pinned commit, and what it did not */\n coverage: Coverage | null;\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 {\n state,\n on,\n emit,\n readHash,\n navigate,\n isTerminal,\n kind,\n view,\n VIEWS,\n NARROW,\n type View,\n} 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\";\nimport { renderCoverage } from \"./views/coverage.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 and explainers\"));\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(\"span\", { class: \"muted mono\", style: { fontSize: \"12px\" } }, bindingLabel(r)),\n h(\"span\", { class: \"muted\", style: { fontSize: \"12px\" } }, timeAgo(r.updatedAt)),\n );\n if (!active.length)\n el.appendChild(\n h(\n \"div\",\n { class: \"empty-state\" },\n \"Nothing published yet. Ask your agent for a review of a change, or an explainer of the codebase.\",\n ),\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 bindingLabel(r: { binding: { kind: string; name: string } }): string {\n if (r.binding.kind === \"pr\") return `PR #${r.binding.name}`;\n if (r.binding.kind === \"codebase\") return r.binding.name === \"**\" ? \"codebase\" : r.binding.name;\n return r.binding.name;\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 explainer = kind() === \"explainer\";\n const labels: Record<View, string> = {\n review: explainer ? \"Explainer\" : \"Review\",\n commits: \"Commits\",\n files: `Files${d.changes.length ? ` (${d.changes.length})` : \"\"}`,\n map: \"Map\",\n coverage: \"Coverage\",\n };\n const current = view();\n const tabs: [View, string][] = VIEWS[kind()].map((v) => [v, labels[v]]);\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 bindingLabel(r),\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 === current ? \"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 kind() === \"explainer\"\n ? `commit ${r.pins.head.slice(0, 12)}`\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 (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 case \"coverage\":\n renderCoverage(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 { DocumentKind, Thread, ThreadTarget } from \"../store.js\";\n\nexport type View = \"review\" | \"commits\" | \"files\" | \"map\" | \"coverage\";\n\n/**\n * The tabs a document kind has. A review is a CHANGE, so the diff, the commits\n * and the interface delta all mean something. An explainer is a CODEBASE at one\n * commit: those three would render an empty claim about a change that does not\n * exist, so they are absent, and Coverage - what the document reached and what\n * it did not - takes their place.\n */\nexport const VIEWS: Record<DocumentKind, View[]> = {\n review: [\"review\", \"commits\", \"files\", \"map\"],\n explainer: [\"review\", \"map\", \"coverage\"],\n};\n\nexport function kind(): DocumentKind {\n return state.data?.review.kind === \"explainer\" ? \"explainer\" : \"review\";\n}\n\n/** The current view, or the document's first tab when this kind has no such tab. */\nexport function view(): View {\n const allowed = VIEWS[kind()];\n return allowed.includes(state.view) ? state.view : allowed[0]!;\n}\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 v = (m?.[1] ?? \"review\") as View;\n state.view = ([\"review\", \"commits\", \"files\", \"map\", \"coverage\"] as View[]).includes(v)\n ? v\n : \"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, kind } 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 // Same state machine, different words. A reader decides whether a CHANGE should\n // land; a reader of an explainer decides whether the DOCUMENT is finished, and\n // \"Approve\" would read as a verdict on code the explainer never judged.\n const explainer = kind() === \"explainer\";\n const words = explainer\n ? { title: \"Send this back or finish\", accept: \"Done reading\", back: \"Send it back\" }\n : { title: \"Submit review\", accept: \"Approve\", back: \"Request changes\" };\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, words.title),\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 {\n title: explainer\n ? \"End it without reading it through\"\n : \"End the review without approving it\",\n onclick: () => decide(\"close\"),\n },\n \"Close\",\n ),\n h(\"button\", { onclick: () => decide(\"request-changes\") }, words.back),\n h(\"button\", { class: \"ok\", onclick: () => decide(\"approve\") }, words.accept),\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, kind } 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\";\nimport type { InterfaceDelta, InterfaceEntry } from \"../../interfaces.js\";\nimport type { Coverage } from \"../../coverage.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 root.appendChild(\n kind() === \"explainer\"\n ? coveragePanel(state.data?.coverage ?? null)\n : interfaceDelta(doc.interfaces),\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\n/** Ids the parser cannot produce, so the panel can hold threads like a document block. */\nconst DELTA_BLOCK = \"interface-delta\";\nconst COVERAGE_BLOCK = \"coverage\";\nconst DELTA_SHOWN = 12;\n\nconst CHANGE_CLASS: Record<InterfaceEntry[\"change\"], string> = {\n removed: \"del\",\n changed: \"warn\",\n added: \"ok\",\n};\n\n/**\n * What the change did to the surfaces other code can reach, above the document\n * because it is the reader's first question. Derived at publish from the code\n * graph, so a refactor that moved nothing says exactly that.\n */\nfunction interfaceDelta(delta: InterfaceDelta | null): HTMLElement {\n const wrap = h(\"div\", { class: \"block ifd\", \"data-block\": DELTA_BLOCK });\n const threads = threadsFor((t) => t.type === \"document\" && t.blockId === DELTA_BLOCK);\n if (threads.length) wrap.classList.add(\"has-threads\");\n // the panel has no gutter to hang the comment button in, so it lives in the head\n const actions = h(\n \"div\",\n { class: \"block-actions\" },\n h(\n \"button\",\n {\n class: threads.length ? \"count\" : \"\",\n title: \"Comment on the interface delta\",\n onclick: (e: MouseEvent) => {\n if (state.viewingRevision !== null) return;\n popover(commentPopover({ type: \"document\", blockId: DELTA_BLOCK }), {\n x: e.pageX + 10,\n y: e.pageY,\n });\n },\n },\n threads.length ? String(threads.length) : \"+\",\n ),\n );\n const body = h(\"div\", { class: \"ifd-body\" });\n const toggle = h(\"span\", { class: \"heading-toggle\" }, \"hide\");\n toggle.addEventListener(\"click\", () => {\n const hidden = body.hidden;\n body.hidden = !hidden;\n toggle.textContent = hidden ? \"hide\" : \"show\";\n });\n const counts = delta\n ? ([\"removed\", \"changed\", \"added\"] as const)\n .map((c) => [c, delta.entries.filter((e) => e.change === c).length] as const)\n .filter(([, n]) => n > 0)\n : [];\n wrap.appendChild(\n h(\n \"div\",\n { class: \"ifd-head\" },\n h(\"span\", { class: \"t\" }, \"Interface delta\"),\n counts.map(([c, n]) => h(\"span\", { class: `badge ${CHANGE_CLASS[c]}` }, `${n} ${c}`)),\n h(\"span\", { class: \"spacer\" }),\n toggle,\n actions,\n ),\n );\n body.appendChild(\n h(\n \"p\",\n { class: \"ifd-verdict\" },\n delta ? delta.verdict : \"Unavailable: the code graph could not be built for these commits.\",\n ),\n );\n const entries = delta?.entries ?? [];\n const rest = entries.slice(DELTA_SHOWN);\n for (const e of entries.slice(0, DELTA_SHOWN)) body.appendChild(interfaceRow(e));\n if (rest.length) {\n const more = h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: () => {\n more.replaceWith(...rest.map(interfaceRow));\n },\n },\n `show ${rest.length} more`,\n );\n body.appendChild(more);\n }\n wrap.appendChild(body);\n if (threads.length)\n wrap.appendChild(h(\"div\", { class: \"thread-pins\" }, threads.map(threadPinRow)));\n return wrap;\n}\n\n/**\n * What an explainer examined and what it did not, in the slot a review gives the\n * interface delta - because it is the same kind of thing: a fact derived at\n * publish from the pinned commit, above prose the agent wrote, so the reader\n * knows the bound of the document before reading a word of it.\n */\nfunction coveragePanel(cov: Coverage | null): HTMLElement {\n const wrap = h(\"div\", { class: \"block ifd\", \"data-block\": COVERAGE_BLOCK });\n const threads = threadsFor((t) => t.type === \"document\" && t.blockId === COVERAGE_BLOCK);\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 coverage\",\n onclick: (e: MouseEvent) => {\n if (state.viewingRevision !== null) return;\n popover(commentPopover({ type: \"document\", blockId: COVERAGE_BLOCK }), {\n x: e.pageX + 10,\n y: e.pageY,\n });\n },\n },\n threads.length ? String(threads.length) : \"+\",\n ),\n );\n const body = h(\"div\", { class: \"ifd-body\" });\n const toggle = h(\"span\", { class: \"heading-toggle\" }, \"hide\");\n toggle.addEventListener(\"click\", () => {\n const hidden = body.hidden;\n body.hidden = !hidden;\n toggle.textContent = hidden ? \"hide\" : \"show\";\n });\n wrap.appendChild(\n h(\n \"div\",\n { class: \"ifd-head\" },\n h(\"span\", { class: \"t\" }, \"Coverage\"),\n cov ? h(\"span\", { class: \"badge\" }, `${cov.states.uncovered} not examined`) : null,\n h(\"span\", { class: \"spacer\" }),\n toggle,\n actions,\n ),\n );\n body.appendChild(\n h(\n \"p\",\n { class: \"ifd-verdict\" },\n cov ? cov.verdict : \"Unavailable: coverage could not be derived for this revision.\",\n ),\n );\n body.appendChild(\n h(\n \"p\",\n { class: \"ifd-verdict\" },\n \"A codebase does not fit in one document, so this one selects. \",\n h(\n \"button\",\n { class: \"small\", onclick: () => navigate(\"coverage\") },\n \"See what it left out \u25B8\",\n ),\n ),\n );\n wrap.appendChild(body);\n if (threads.length)\n wrap.appendChild(h(\"div\", { class: \"thread-pins\" }, threads.map(threadPinRow)));\n return wrap;\n}\n\nfunction interfaceRow(e: InterfaceEntry): HTMLElement {\n return h(\n \"div\",\n {\n class: `ifd-entry ifd-${e.change}`,\n title: \"Open in Files\",\n onclick: () => navigate(\"files\", { path: e.file, line: e.line, side: e.graph }),\n },\n h(\"span\", { class: `badge ${CHANGE_CLASS[e.change]}` }, e.change),\n h(\n \"div\",\n { class: \"ifd-what\" },\n e.was ? h(\"div\", { class: \"ifd-was\" }, h(\"code\", null, e.was)) : null,\n h(\"code\", { class: \"ifd-name\" }, e.name),\n e.capability ? h(\"div\", { class: \"ifd-cap\" }, e.capability) : null,\n ),\n h(\"span\", { class: \"ifd-where mono\" }, `${e.file}:${e.line}`),\n );\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, kind } from \"../state.js\";\nimport { openAnchorPeek } from \"../code.js\";\nimport { commentPopover, threadPinRow } from \"../threads.js\";\nimport {\n allEdges,\n changedInside,\n childrenOf,\n collect,\n neighboursOf,\n parentOf,\n rankEdges,\n routeIn,\n touched,\n type MapItem,\n} from \"./map-model.js\";\nimport type { MapEdge } from \"../../document/schema.js\";\n\nconst statusClass = (s: string) => (s === \"added\" ? \"ok\" : s === \"removed\" ? \"del\" : \"warn\");\n\nexport function renderMap(root: HTMLElement): void {\n const map = state.data?.map;\n // A map with no nodes is the same to the reader as no map at all, and the\n // reason for both is worth saying: an absent map is a claim, not a gap.\n const explainer = kind() === \"explainer\";\n if (!map || !map.head.nodes.length) {\n append(root, [\n explainer\n ? h(\n \"div\",\n { class: \"empty-state\" },\n h(\"p\", null, \"No map in this explainer.\"),\n h(\n \"p\",\n null,\n \"The map is where an explainer carries breadth: it places the parts the prose \",\n \"had no room for. Without one, every file the document does not anchor counts \",\n \"as not examined on the Coverage tab.\",\n ),\n )\n : h(\n \"div\",\n { class: \"empty-state\" },\n h(\"p\", null, \"No map in this review.\"),\n h(\n \"p\",\n null,\n \"The map places a change inside the system and shows what sits next to it. \",\n \"A change that lands in one place, where the Files tab already answers that, ships without one.\",\n ),\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 = collect(map);\n const edges = allEdges(map);\n const route = routeIn(all, map.filesByNode);\n\n const selected = state.params.get(\"node\") ?? \"\";\n const hasChildren = (id: string) => [...all.keys()].some((k) => parentOf(k) === id);\n let level =\n selected && all.has(selected) ? (hasChildren(selected) ? selected : parentOf(selected)) : \"\";\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 openLevel = (id: string) => {\n level = id;\n draw();\n };\n\n // The lead-in. A reader who opens this tab cold has no idea why it is here,\n // so it says what the map answers that the diff cannot, and hands them one\n // place to start rather than a board of equal boxes.\n const intro = () => {\n if (explainer)\n return h(\n \"div\",\n { class: \"map-intro\" },\n h(\"h2\", null, \"The parts of the system\"),\n h(\n \"p\",\n null,\n \"The document carries depth on the parts it selected; this carries breadth over the\",\n \" rest \u2014 what the parts are, what they own, and what they connect to at the pinned\",\n \" commit. Open a part to see its files, its code and its neighbours.\",\n ),\n h(\n \"div\",\n { class: \"map-route\" },\n h(\n \"button\",\n { class: \"small\", onclick: () => navigate(\"coverage\") },\n \"What this explainer left out \u25B8\",\n ),\n ),\n );\n const counts: [number, string, string][] = [\n [map.diff.added.length, \"ok\", \"added\"],\n [map.diff.changed.length, \"warn\", \"changed\"],\n [map.diff.removed.length, \"del\", \"removed\"],\n ];\n const marks = counts.filter(([n]) => n > 0);\n return h(\n \"div\",\n { class: \"map-intro\" },\n h(\"h2\", null, \"Where the change landed\"),\n h(\n \"p\",\n null,\n \"The Files tab has the lines. This has the parts of the system they landed in, and what\",\n \" those parts connect to \u2014 the neighbours a diff never names. Marked parts are the change;\",\n \" the rest is the context you need to judge it.\",\n ),\n h(\n \"div\",\n { class: \"map-route\" },\n marks.length\n ? marks.map(([n, cls, word]) => h(\"span\", { class: `badge ${cls}` }, `${n} ${word}`))\n : h(\"span\", { class: \"muted\" }, \"This change touched no part of the map.\"),\n route\n ? h(\n \"button\",\n {\n class: \"small\",\n onclick: () => navigate(\"map\", { node: route.id }),\n },\n `Start at ${route.label} \u203A`,\n )\n : null,\n map.base\n ? null\n : h(\n \"span\",\n { class: \"muted\" },\n \"No base map, so changed means touched by the diff and nothing reads as added or removed.\",\n ),\n ),\n );\n };\n\n const crumbs = () => {\n const el = h(\"div\", { class: \"crumbs\" });\n const parts = level ? level.split(\".\") : [];\n el.appendChild(h(\"span\", { onclick: () => openLevel(\"\") }, \"System\"));\n parts.forEach((_, i) => {\n const id = parts.slice(0, i + 1).join(\".\");\n el.appendChild(document.createTextNode(\" \u203A \"));\n el.appendChild(h(\"span\", { onclick: () => openLevel(id) }, all.get(id)?.label ?? id));\n });\n return el;\n };\n\n const card = (n: MapItem) => {\n const inside = [...all.keys()].filter((k) => parentOf(k) === n.id).length;\n const hidden = changedInside(all, n.id);\n const files = map.filesByNode[n.id]?.length ?? 0;\n return h(\n \"div\",\n {\n class: `map-node ${n.status} ${explainer || touched(all, n) ? \"\" : \"quiet\"} ${n.id === selected ? \"selected\" : \"\"}`,\n onclick: () => navigate(\"map\", { node: n.id }),\n ondblclick: () => inside && openLevel(n.id),\n },\n n.status ? h(\"span\", { class: `status badge ${statusClass(n.status)}` }, n.status) : 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: \"meta\" },\n files\n ? h(\"span\", { class: \"warn-text\" }, `${files} changed file${files > 1 ? \"s\" : \"\"}`)\n : null,\n hidden ? h(\"span\", { class: \"warn-text\" }, `${hidden} changed inside`) : null,\n inside\n ? h(\n \"button\",\n {\n class: \"small drill\",\n onclick: (e: MouseEvent) => {\n e.stopPropagation();\n openLevel(n.id);\n },\n },\n `Open ${inside} inside \u203A`,\n )\n : null,\n ),\n );\n };\n\n const board = () => {\n const kids = childrenOf(all, level, map.filesByNode);\n if (!kids.length) return h(\"div\", { class: \"empty-state\" }, \"Nothing at this level.\");\n const hot = kids.filter((n) => touched(all, n));\n const cold = kids.filter((n) => !touched(all, n));\n const group = (title: string | null, items: MapItem[]) =>\n items.length\n ? h(\n \"div\",\n { class: \"map-group\" },\n title ? h(\"h3\", null, title) : null,\n h(\"div\", { class: \"map-grid\" }, items.map(card)),\n )\n : null;\n // An explainer has no change, so there is no reading order to impose: the\n // parts are drawn as the author grouped them, and none of them is \"context\".\n if (explainer) return group(null, kids) ?? h(\"div\", null);\n if (!hot.length)\n return h(\n \"div\",\n null,\n h(\"div\", { class: \"map-note muted\" }, \"Nothing here was touched. The change is elsewhere.\"),\n group(null, cold),\n );\n return h(\n \"div\",\n null,\n group(cold.length ? \"What the change touched\" : null, hot),\n group(\"Context \u2014 unchanged here\", cold),\n );\n };\n\n // Links, folded up to the parts on screen. An edge between two boxes inside\n // the same card belongs to that card's level, not this one; what matters here\n // is which visible parts a change can travel between.\n const links = () => {\n const here = new Set(childrenOf(all, level, map.filesByNode).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 folded: MapEdge[] = [];\n for (const e of edges) {\n // An endpoint outside this subtree folds to nothing, and a link arriving\n // from elsewhere is exactly the one worth keeping: it stays under its own\n // name so the reader can see what reaches in.\n const from = top(e.from) || e.from;\n const to = top(e.to) || e.to;\n if (from === to) continue;\n if (!here.has(from) && !here.has(to)) continue;\n if (folded.some((x) => x.from === from && x.to === to)) continue;\n folded.push({ from, to, ...(e.label ? { label: e.label } : {}) });\n }\n if (!folded.length) return null;\n return h(\n \"div\",\n { class: \"map-edges\" },\n h(\"h3\", null, \"What connects to what here\"),\n h(\n \"div\",\n { class: \"muted map-note\" },\n explainer\n ? \"A link is a dependency the parts have on each other, drawn as the author declared it.\"\n : \"A link touching a changed part is where the two sides can fall out of step.\",\n ),\n rankEdges(folded, all).map(({ edge, touchesChange }) =>\n h(\n \"div\",\n { class: `edge ${touchesChange ? \"hot\" : \"\"}` },\n h(\n \"b\",\n { onclick: () => navigate(\"map\", { node: edge.from }) },\n all.get(edge.from)?.label ?? edge.from,\n ),\n \"\u2192\",\n h(\n \"b\",\n { onclick: () => navigate(\"map\", { node: edge.to }) },\n all.get(edge.to)?.label ?? edge.to,\n ),\n h(\"span\", { class: \"muted\" }, edge.label ?? \"\"),\n ),\n ),\n );\n };\n\n const draw = () => {\n canvas.innerHTML = \"\";\n append(canvas, [intro(), crumbs(), board(), links()]);\n drawSide();\n };\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 explainer\n ? \"Pick a part to see what it owns, the code behind it, and what it connects to.\"\n : \"Pick a part to see what changed in it, the code behind it, and what it connects to.\",\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 const neighbours = neighboursOf(map, 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 ? h(\"span\", { class: `badge ${statusClass(n.status)}` }, n.status) : \"\",\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 neighbours.length\n ? h(\n \"div\",\n { class: \"neighbours\", style: { marginTop: \"12px\" } },\n h(\"b\", null, \"Next to it\"),\n h(\n \"div\",\n { class: \"muted\", style: { fontSize: \"11px\" } },\n \"\u2192 this reaches \u00B7 \u2190 reaches this\",\n ),\n neighbours.map((x) => {\n const other = all.get(x.other);\n return h(\n \"div\",\n { class: \"neighbour\" },\n h(\"span\", { class: \"mono muted\" }, x.dir === \"out\" ? \"\u2192\" : \"\u2190\"),\n h(\n \"span\",\n { class: \"nb\", onclick: () => navigate(\"map\", { node: x.other }) },\n other?.label ?? x.other,\n ),\n other?.status\n ? h(\"span\", { class: `badge ${statusClass(other.status)}` }, other.status)\n : null,\n x.label ? h(\"span\", { class: \"muted\" }, x.label) : null,\n );\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", "// The reading order behind the Map tab. The Files tab already answers \"which\n// lines changed\"; the map answers \"which parts of the system did they land in,\n// and what sits next to those parts\". Everything here exists to put the parts\n// that need attention in front of the reader before the ones that do not, so\n// the view itself only has to draw the order it is given.\nimport type { CompiledMap } from \"../../document/compile.js\";\nimport type { MapEdge, MapNode } from \"../../document/schema.js\";\n\nexport type NodeStatus = \"added\" | \"removed\" | \"changed\" | \"\";\nexport type MapItem = MapNode & { status: NodeStatus };\nexport type FilesByNode = Record<string, string[]>;\n\nexport function parentOf(id: string): string {\n return id.includes(\".\") ? id.slice(0, id.lastIndexOf(\".\")) : \"\";\n}\n\n/** Every node the reader can meet: head, plus the ones the change removed. */\nexport function collect(map: CompiledMap): Map<string, MapItem> {\n const all = new Map<string, MapItem>();\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 = (map.base?.nodes ?? []).find((x) => x.id === id);\n if (n) all.set(id, { ...n, status: \"removed\" });\n }\n return all;\n}\n\n/** Nodes with a status somewhere below `id`: the change a closed node hides. */\nexport function changedInside(all: Map<string, MapItem>, id: string): number {\n let n = 0;\n for (const item of all.values()) if (item.id.startsWith(id + \".\") && item.status) n++;\n return n;\n}\n\n/** True when this node, or anything under it, is part of the change. */\nexport function touched(all: Map<string, MapItem>, item: MapItem): boolean {\n return !!item.status || changedInside(all, item.id) > 0;\n}\n\n/**\n * The children of `parent` in reading order: what the change touched first,\n * heaviest first, then the untouched context in the order the author wrote it.\n */\nexport function childrenOf(\n all: Map<string, MapItem>,\n parent: string,\n filesByNode: FilesByNode,\n): MapItem[] {\n const kids = [...all.values()].filter((n) => parentOf(n.id) === parent);\n const weight = (n: MapItem) => (filesByNode[n.id]?.length ?? 0) + changedInside(all, n.id);\n return kids\n .map((n, i) => ({ n, i }))\n .sort((a, b) => {\n const t = Number(touched(all, b.n)) - Number(touched(all, a.n));\n if (t) return t;\n const w = weight(b.n) - weight(a.n);\n return w || a.i - b.i;\n })\n .map((x) => x.n);\n}\n\n/**\n * Where to start reading. The most specific part the change landed in \u2014 a\n * parent only holds the diff of its children, so it is never the answer while\n * a leaf carries one. Null when the change touched no part of the map.\n */\nexport function routeIn(all: Map<string, MapItem>, filesByNode: FilesByNode): MapItem | null {\n const changed = [...all.values()].filter((n) => n.status);\n const hasChild = (id: string) => [...all.keys()].some((k) => parentOf(k) === id);\n const leaves = changed.filter((n) => !hasChild(n.id));\n const pool = leaves.length ? leaves : changed;\n let best: MapItem | null = null;\n let bestFiles = -1;\n for (const n of pool) {\n const files = filesByNode[n.id]?.length ?? 0;\n if (files > bestFiles) {\n best = n;\n bestFiles = files;\n }\n }\n return best;\n}\n\nexport interface Neighbour {\n dir: \"out\" | \"in\";\n other: string;\n label?: string;\n}\n\n/** What a change to `id` can reach, and what reaches it. */\nexport function neighboursOf(map: CompiledMap, id: string): Neighbour[] {\n const out: Neighbour[] = [];\n const into: Neighbour[] = [];\n for (const e of allEdges(map)) {\n if (e.from === id)\n out.push({ dir: \"out\", other: e.to, ...(e.label ? { label: e.label } : {}) });\n if (e.to === id)\n into.push({ dir: \"in\", other: e.from, ...(e.label ? { label: e.label } : {}) });\n }\n return [...out, ...into];\n}\n\n/** Head edges, plus the ones only the base had, so a removed link still shows. */\nexport function allEdges(map: CompiledMap): MapEdge[] {\n const edges = [...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 return edges;\n}\n\nexport interface RankedEdge {\n edge: MapEdge;\n touchesChange: boolean;\n}\n\n/**\n * Edges ordered by how much of the change they carry: both ends changed first,\n * then one end, then the rest. A link between two changed parts is where a\n * contract can have moved on only one side of it.\n */\nexport function rankEdges(edges: MapEdge[], all: Map<string, MapItem>): RankedEdge[] {\n const hot = (id: string) => {\n const item = all.get(id);\n return item && touched(all, item) ? 1 : 0;\n };\n return edges\n .map((edge, i) => ({ edge, i, ends: hot(edge.from) + hot(edge.to) }))\n .sort((a, b) => b.ends - a.ends || a.i - b.i)\n .map(({ edge, ends }) => ({ edge, touchesChange: ends > 0 }));\n}\n", "/**\n * What the explainer examined, and what it did not.\n *\n * A review is bounded by its diff; a codebase is not. So this tab exists to\n * make the bound of an explainer a stated fact rather than something the reader\n * has to infer from what the prose happens to mention. Everything here is\n * derived at publish from the code graph at the pinned commit: counts and lists\n * of named things, nothing graded. Where a number invites a conclusion - a part\n * everything reaches, a name defined in four places, a link that runs both ways\n * - drawing it is the reader's job, and this page deliberately stops short.\n */\nimport { h, append } from \"../dom.js\";\nimport { state, navigate } from \"../state.js\";\nimport { openAnchorPeek } from \"../code.js\";\nimport type { Coverage, ClusterCoverage } from \"../../coverage.js\";\n\nconst SHOWN = 8;\n\nexport function renderCoverage(root: HTMLElement): void {\n const cov = state.data?.coverage;\n if (!cov) {\n append(root, [\n h(\n \"div\",\n { class: \"empty-state\" },\n h(\"p\", null, \"No coverage recorded for this revision.\"),\n h(\"p\", null, \"Coverage is derived when an explainer is published.\"),\n ),\n ]);\n return;\n }\n append(root, [intro(cov), clusters(cov), links(cov), sharedNames(cov), unread(cov)]);\n}\n\nfunction bar(cov: Coverage): HTMLElement {\n const total = Math.max(cov.files.total, 1);\n const seg = (n: number, cls: string, label: string) =>\n n\n ? h(\"span\", {\n class: `cov-seg ${cls}`,\n style: { width: `${(n / total) * 100}%` },\n title: `${n} ${label}`,\n })\n : null;\n return h(\n \"div\",\n { class: \"cov-bar\" },\n seg(cov.states.explained, \"explained\", \"anchored in the document\"),\n seg(cov.states.placed, \"placed\", \"placed on the map only\"),\n seg(cov.states.uncovered, \"uncovered\", \"not examined\"),\n );\n}\n\nfunction intro(cov: Coverage): HTMLElement {\n const key: [number, string, string][] = [\n [cov.states.explained, \"explained\", \"anchored in the document\"],\n [cov.states.placed, \"placed\", \"placed on the map only\"],\n [cov.states.uncovered, \"uncovered\", \"not examined\"],\n ];\n return h(\n \"div\",\n { class: \"cov-intro\" },\n h(\"h2\", null, \"What this explainer covers\"),\n h(\n \"p\",\n null,\n \"A codebase does not fit in a short document, so this one selects. Here is the\",\n \" selection, counted rather than claimed: every file in scope at the pinned commit,\",\n \" and which of the three states it is in.\",\n ),\n bar(cov),\n h(\n \"div\",\n { class: \"cov-key\" },\n key.map(([n, cls, label]) =>\n h(\"span\", { class: \"cov-key-item\" }, h(\"i\", { class: `cov-dot ${cls}` }), `${n} ${label}`),\n ),\n ),\n h(\n \"div\",\n { class: \"cov-facts\" },\n fact(\"scope\", cov.scope === \"**\" ? \"the whole repository\" : cov.scope),\n fact(\"commit\", cov.commit.slice(0, 12)),\n fact(\"files in scope\", String(cov.files.total)),\n fact(\"read by the code graph\", `${cov.files.inGraph} of ${cov.files.total}`),\n cov.unresolved ? fact(\"references the graph could not place\", String(cov.unresolved)) : null,\n cov.truncated\n ? fact(\"file list capped\", \"the graph is partial; treat every count as a floor\")\n : null,\n ),\n );\n}\n\nfunction fact(label: string, value: string): HTMLElement {\n return h(\"div\", { class: \"cov-fact\" }, h(\"b\", null, value), h(\"span\", { class: \"muted\" }, label));\n}\n\nfunction fileList(files: string[], cls: string): HTMLElement | null {\n if (!files.length) return null;\n const wrap = h(\"div\", { class: `cov-files ${cls}` });\n const chip = (f: string) =>\n h(\"code\", { class: \"cov-file\", title: f }, f.split(\"/\").slice(-2).join(\"/\"));\n files.slice(0, SHOWN).forEach((f) => wrap.appendChild(chip(f)));\n const rest = files.slice(SHOWN);\n if (rest.length) {\n const more = h(\n \"button\",\n {\n class: \"small ghost\",\n onclick: () => more.replaceWith(...rest.map(chip)),\n },\n `show ${rest.length} more`,\n );\n wrap.appendChild(more);\n }\n return wrap;\n}\n\nfunction clusterRow(c: ClusterCoverage): HTMLElement {\n const anchors = state.data?.document?.anchors ?? {};\n const firstAnchor = c.explained.length\n ? Object.values(anchors).find((a) => a.peek && c.explained.includes(a.peek.file))\n : undefined;\n return h(\n \"div\",\n { class: \"cov-cluster\" },\n h(\n \"div\",\n { class: \"cov-cluster-head\" },\n h(\"code\", { class: \"cov-label\" }, c.label),\n h(\"span\", { class: \"muted\" }, `${c.files} files \u00B7 ${c.symbols} symbols`),\n h(\"span\", { class: \"spacer\" }),\n c.explained.length\n ? h(\"span\", { class: \"badge cov-b-explained\" }, `${c.explained.length} anchored`)\n : null,\n c.placed.length\n ? h(\"span\", { class: \"badge cov-b-placed\" }, `${c.placed.length} placed`)\n : null,\n c.uncovered.length\n ? h(\"span\", { class: \"badge cov-b-uncovered\" }, `${c.uncovered.length} not examined`)\n : null,\n firstAnchor\n ? h(\"button\", { class: \"small\", onclick: () => openAnchorPeek(firstAnchor) }, \"Peek code \u25B8\")\n : null,\n ),\n c.hubs.length\n ? h(\n \"div\",\n { class: \"muted cov-hubs\" },\n \"most referenced here: \",\n c.hubs.map((n) => h(\"code\", null, n)),\n )\n : null,\n fileList(c.uncovered, \"uncovered\"),\n );\n}\n\nfunction clusters(cov: Coverage): HTMLElement {\n return h(\n \"div\",\n { class: \"cov-section\" },\n h(\"h3\", null, \"By part of the system\"),\n h(\n \"p\",\n { class: \"muted\" },\n \"Files clustered by how they reference each other at the pinned commit, largest first.\",\n \" The files listed under a part are the ones this explainer never examined.\",\n ),\n cov.clusters.map(clusterRow),\n );\n}\n\nfunction links(cov: Coverage): HTMLElement | null {\n if (!cov.links.length) return null;\n return h(\n \"div\",\n { class: \"cov-section\" },\n h(\"h3\", null, \"What reaches what\"),\n h(\n \"p\",\n { class: \"muted\" },\n \"References that cross from one part to another, with how many there are.\",\n \" A pair marked both ways references each other in both directions.\",\n ),\n h(\n \"div\",\n { class: \"cov-links\" },\n cov.links\n .slice(0, 24)\n .map((l) =>\n h(\n \"div\",\n { class: \"cov-link\" },\n h(\"code\", null, label(cov, l.from)),\n h(\"span\", { class: \"muted\" }, \"\u2192\"),\n h(\"code\", null, label(cov, l.to)),\n h(\"span\", { class: \"muted mono\" }, `${l.references} refs`),\n l.bothWays ? h(\"span\", { class: \"badge\" }, \"both ways\") : null,\n ),\n ),\n ),\n );\n}\n\nfunction label(cov: Coverage, id: string): string {\n return cov.clusters.find((c) => c.id === id)?.label ?? id;\n}\n\nfunction sharedNames(cov: Coverage): HTMLElement | null {\n if (!cov.sharedNames.length) return null;\n return h(\n \"div\",\n { class: \"cov-section\" },\n h(\"h3\", null, \"Names defined in more than one part\"),\n h(\n \"p\",\n { class: \"muted\" },\n `${cov.sharedNamesTotal} name${cov.sharedNamesTotal === 1 ? \" at this commit is\" : \"s at this commit are\"}`,\n \" defined in two or more parts. What that means here - the same idea in two places,\",\n \" two different ideas sharing a word, or a name too common to mean anything - is\",\n \" what the code says and this page does not.\",\n ),\n h(\n \"div\",\n { class: \"cov-shared\" },\n cov.sharedNames.map((n) =>\n h(\n \"div\",\n { class: \"cov-link\" },\n h(\"code\", null, n.name),\n h(\"span\", { class: \"muted mono\" }, `${n.clusters.length} parts`),\n h(\"span\", { class: \"muted\" }, n.files.join(\" \u00B7 \")),\n ),\n ),\n ),\n );\n}\n\nfunction unread(cov: Coverage): HTMLElement | null {\n if (!cov.outsideGraph.length && !cov.files.capped && !cov.owners.length) return null;\n return h(\n \"div\",\n { class: \"cov-section\" },\n h(\"h3\", null, \"Outside the code graph\"),\n cov.outsideGraph.length\n ? h(\n \"div\",\n null,\n h(\n \"p\",\n { class: \"muted\" },\n `${cov.files.outsideGraph} files in scope are not in a language the graph reads,`,\n \" so they are in no part above. They are absent from the structure, not empty.\",\n ),\n h(\n \"div\",\n { class: \"cov-links\" },\n cov.outsideGraph\n .slice(0, 16)\n .map((e) =>\n h(\n \"div\",\n { class: \"cov-link\" },\n h(\"code\", null, `.${e.extension}`),\n h(\"span\", { class: \"muted mono\" }, `${e.files} files`),\n ),\n ),\n ),\n fileList(\n cov.unclustered\n .filter((u) => u.state === \"uncovered\" && u.reason === \"outsideGraph\")\n .map((u) => u.file),\n \"uncovered\",\n ),\n )\n : null,\n cov.files.capped\n ? h(\n \"div\",\n null,\n h(\n \"p\",\n { class: \"muted\" },\n `${cov.files.capped} files in scope are in a language the graph reads, but the`,\n \" repo-wide file cap was hit before this scope was read, so they were never parsed.\",\n ),\n fileList(\n cov.unclustered\n .filter((u) => u.state === \"uncovered\" && u.reason === \"capped\")\n .map((u) => u.file),\n \"uncovered\",\n ),\n )\n : null,\n cov.owners.length\n ? h(\n \"div\",\n null,\n h(\"h4\", null, \"What each map node owns\"),\n h(\n \"p\",\n { class: \"muted\" },\n \"A file counts as placed because a map node's globs match it. The globs are here\",\n \" so a broad one is visible rather than silently inflating the count.\",\n ),\n h(\n \"div\",\n { class: \"cov-links\" },\n cov.owners.map((o) =>\n h(\n \"div\",\n {\n class: \"cov-link\",\n onclick: () => navigate(\"map\", { node: o.node }),\n style: { cursor: \"pointer\" },\n },\n h(\"code\", null, o.node),\n h(\"span\", { class: \"muted\" }, o.globs.join(\" \")),\n h(\"span\", { class: \"muted mono\" }, `${o.files} files`),\n ),\n ),\n ),\n )\n : null,\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["view", "m", "m", "side", "m", "bar", "m", "label", "uc", "touched", "view", "side", "l", "r", "side", "intro", "links", "label", "statusClass", "current", "label", "popover"]
|
|
7
7
|
}
|