thurview 0.17.1 → 0.17.2
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/dist/ui/app.css +18 -1
- package/dist/ui/app.js +72 -26
- package/dist/ui/app.js.map +3 -3
- package/package.json +1 -1
package/dist/ui/app.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/ui/dom.ts", "../../src/ui/api.ts", "../../src/ui/app.ts", "../../src/ui/state.ts", "../../src/ui/code.ts", "../../src/ui/threads.ts", "../../src/thread-state.ts", "../../src/ui/views/review.ts", "../../src/ui/diagrams.ts", "../../src/ui/flow-layout.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\";\nimport type { Presence } from \"../presence.js\";\nimport type { QueueRow } from \"../queue.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 /** whether an agent is listening to this document right now */\n agent: Presence;\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; queue: QueueRow })[]>(\"/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 presence: (id: string) => j<Presence>(`/api/reviews/${id}/presence`),\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\ntype Row = Awaited<ReturnType<typeof api.reviews>>[number];\n\n/**\n * The maintainer's queue. The server sends the rows already in triage order,\n * so a repository is listed where its most urgent row falls, and each row\n * carries only what the forge's own list cannot say.\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, \"Queue\"));\n const active = reviews.filter((r) => !r.dismissed);\n const dismissed = reviews.filter((r) => r.dismissed);\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, an explainer of the codebase, or a design of what to build next.\",\n ),\n );\n const groups = new Map<string, Row[]>();\n for (const r of active) groups.set(r.queue.repo, [...(groups.get(r.queue.repo) ?? []), r]);\n for (const [repo, rows] of groups) {\n const yours = rows.filter((r) => r.queue.turn === \"you\").length;\n el.appendChild(\n h(\n \"h3\",\n { class: \"repo\" },\n repo,\n yours ? h(\"span\", { class: \"badge accent\" }, `${yours} your turn`) : null,\n ),\n );\n rows.forEach((r) => el.appendChild(queueItem(r)));\n }\n if (dismissed.length) {\n el.appendChild(h(\"h3\", { class: \"muted\" }, \"Dismissed\"));\n dismissed.forEach((r) => el.appendChild(queueItem(r)));\n }\n app.appendChild(el);\n}\n\nconst TURN = { you: \"your turn\", agent: \"agent\", nobody: \"nobody\" } as const;\nconst DECISION = { approve: \"approved\", \"request-changes\": \"changes requested\", close: \"closed\" };\n\nfunction queueItem(r: Row) {\n const q = r.queue;\n const cr = q.change;\n const age = q.factsAt ? `forge read ${timeAgo(q.factsAt)}` : cr ? \"forge not read yet\" : \"\";\n return h(\n \"div\",\n { class: \"item\", onclick: () => (location.href = `/review/${r.id}`) },\n h(\"span\", { class: `badge turn ${q.turn === \"you\" ? \"accent\" : \"\"}` }, TURN[q.turn]),\n h(\n \"span\",\n { class: \"t\" },\n r.title,\n h(\"span\", { class: \"why\" }, [r.kind ?? \"review\", q.why, age].filter(Boolean).join(\" \u00B7 \")),\n ),\n cr\n ? h(\n \"a\",\n {\n class: \"mono muted cr\",\n href: cr.url ?? undefined,\n target: \"_blank\",\n rel: \"noopener\",\n onclick: (e: Event) => e.stopPropagation(),\n },\n `#${cr.number}${cr.state && cr.state !== \"open\" ? ` ${cr.state}` : \"\"}`,\n )\n : h(\"span\", { class: \"mono muted\" }, bindingLabel(r)),\n r.openThreads ? h(\"span\", { class: \"badge accent\" }, `${r.openThreads} open`) : null,\n q.pin\n ? h(\n \"span\",\n { class: `badge ${q.pin === \"behind\" ? \"warn\" : \"ok\"}` },\n q.pin === \"behind\" ? \"pin behind head\" : \"at head\",\n )\n : null,\n q.decision\n ? h(\n \"span\",\n {\n class: `badge ${q.decision.posted === false ? \"warn\" : \"\"}`,\n title:\n q.decision.posted === null\n ? null\n : q.decision.posted\n ? \"posted to the change request\"\n : \"not posted to the change request yet\",\n },\n DECISION[q.decision.decision] +\n (q.decision.posted === null ? \"\" : q.decision.posted ? \" \u00B7 posted\" : \" \u00B7 not posted\"),\n )\n : null,\n q.ci\n ? h(\n \"span\",\n { class: `badge ${q.ci.trustworthy ? \"ok\" : \"warn\"}`, title: q.ci.verdict },\n q.ci.trustworthy ? \"CI gates\" : \"CI not a gate\",\n )\n : null,\n h(\"span\", { class: \"muted\", style: { fontSize: \"12px\" } }, timeAgo(r.updatedAt)),\n );\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 k = kind();\n const labels: Record<View, string> = {\n review: k === \"explainer\" ? \"Explainer\" : k === \"design\" ? \"Design\" : \"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() === \"review\"\n ? `base ${r.pins.base.slice(0, 12)} \u00B7 head ${r.pins.head.slice(0, 12)}`\n : `commit ${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 pollPresence(): void {\n setInterval(async () => {\n const cur = state.data;\n if (!cur) return;\n const agent = await api.presence(state.id).catch(() => cur.agent);\n if (agent.attached !== cur.agent.attached) {\n state.data = { ...cur, agent };\n emit(\"threads\");\n }\n }, 5000);\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 pollPresence();\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. A design is a change that is NOT WRITTEN YET:\n * there is no diff to show and no coverage to state, so it keeps the document\n * and the map, where its proposed structure sits beside today's.\n */\nexport const VIEWS: Record<DocumentKind, View[]> = {\n review: [\"review\", \"commits\", \"files\", \"map\"],\n explainer: [\"review\", \"map\", \"coverage\"],\n design: [\"review\", \"map\"],\n};\n\nexport function kind(): DocumentKind {\n const k = state.data?.review.kind;\n return k === \"explainer\" || k === \"design\" ? k : \"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, kind, VIEWS } 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 // Only a review has a Files tab. On the other kinds `navigate(\"files\", \u2026)`\n // lands on a tab that does not exist and the reader is bounced to the\n // document, so the control that promises it is not drawn at all.\n const hasFiles = VIEWS[kind()].includes(\"files\");\n const openFile = () =>\n navigate(\"files\", { path: p.path, line: p.highlightLine ?? p.from, side: p.graph });\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${hasFiles ? \"\" : \" inert\"}`,\n title: p.path,\n ...(hasFiles ? { onclick: openFile } : {}),\n },\n `${p.path}:${p.from}-${p.to}`,\n \" \",\n h(\"span\", { class: `badge ${p.graph === \"base\" ? \"del\" : \"\"}` }, p.graph),\n ),\n ),\n hasFiles\n ? h(\n \"button\",\n { class: \"small\", onclick: openFile },\n inChanges ? \"Open in Files\" : \"Open file\",\n )\n : null,\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\";\nimport type { Presence } from \"../presence.js\";\nimport { deliveryOf, type Delivery } from \"../thread-state.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// Spelled out rather than imported from presence.js, which reads the store and\n// belongs to the server side of the bundle.\nconst NOBODY: Presence = { attached: false, lastSeen: null };\n\nfunction agent(): Presence {\n return state.data?.agent ?? NOBODY;\n}\n\n/**\n * What each thread state means to the reader, in the reader's terms. Silence is\n * the failure this wording exists to prevent: a question nobody is listening to\n * says so, before it is asked and after it is sent.\n */\nconst RECEIPT: Record<Delivery, string> = {\n held: \"Held. It reaches the agent when you submit.\",\n queued:\n \"Queued. Nobody is listening right now \u2014 it is delivered the next time an agent checks this document.\",\n listening: \"Delivered. An agent is listening and answers here.\",\n answered: \"The agent answered. Reply, or resolve it.\",\n closed: \"Resolved. Writing here reopens it.\",\n};\n\n/** The one line that says whether asking now would reach anybody. */\nfunction listeningLine(): string {\n return agent().attached\n ? \"An agent is listening to this document now.\"\n : \"No agent is listening right now. Anything you send is queued until one checks in.\";\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 const k = kind();\n const held =\n k === \"explainer\"\n ? \"Add to my notes\"\n : k === \"design\"\n ? \"Add to my decision\"\n : \"Add to the review\";\n // One click, one consequence. The old control asked the reader to set a mode\n // and then press \"Save\", and a question saved in the wrong mode reached\n // nobody; each button here both chooses and commits, and says which it is.\n const submit = async (mode: \"ask\" | \"review\") => {\n const body = ta.value.trim();\n if (!body) return;\n const th = 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 // The receipt: the thread panel opens on what was just written, and its\n // card carries the delivery line for the state the server actually recorded.\n focusThread(th.id);\n };\n ta.addEventListener(\"keydown\", (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") void submit(\"ask\");\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 h(\n \"div\",\n { class: \"row\" },\n h(\n \"button\",\n { class: \"small ok\", onclick: () => void submit(\"ask\") },\n \"Send to the agent \",\n h(\"kbd\", null, \"\u2318\u21B5\"),\n ),\n h(\"button\", { class: \"small\", onclick: () => void submit(\"review\") }, held),\n h(\"span\", { style: { flex: \"1\" } }),\n h(\"button\", { class: \"small ghost\", onclick: () => closePopover() }, \"Cancel\"),\n ),\n h(\n \"div\",\n { class: \"muted\", style: { fontSize: \"12px\", marginTop: \"6px\" } },\n h(\"div\", null, `Send to the agent \u2014 ${listeningLine()}`),\n h(\n \"div\",\n null,\n `${held} \u2014 held until you ${\n k === \"explainer\"\n ? \"send the document back or finish\"\n : k === \"design\"\n ? \"approve the design or send it back\"\n : \"submit the review\"\n }.`,\n ),\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 // Who, if anyone, is on the other end. Stated once here so the reader knows\n // before they write, not only after they have waited. A finished review or\n // an older revision takes no new writing, so it says nothing.\n if (!readOnly())\n body.appendChild(\n h(\n \"div\",\n { class: `receipt ${agent().attached ? \"listening\" : \"queued\"}` },\n listeningLine(),\n ),\n );\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 delivery = deliveryOf(t, agent());\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 h(\"div\", { class: `receipt ${delivery}` }, RECEIPT[delivery]),\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 // An unanswered question is not resolved, it is abandoned.\n // Saying so is what stops a reader closing their own\n // question and then waiting for an answer to it.\n title:\n delivery === \"answered\"\n ? \"Nothing more is owed here\"\n : \"Stop waiting for an answer; no agent will pick this up\",\n onclick: async () => {\n await api.resolve(state.id, t.id);\n await reload();\n },\n },\n delivery === \"answered\" || delivery === \"held\" ? \"Resolve\" : \"Withdraw\",\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. A\n // reader of a design decides whether it should be BUILT, which is a verdict,\n // but on a plan rather than on code - so it says which.\n const k = kind();\n const explainer = k === \"explainer\";\n const words =\n k === \"explainer\"\n ? { title: \"Send this back or finish\", accept: \"Done reading\", back: \"Send it back\" }\n : k === \"design\"\n ? { title: \"Decide on this design\", accept: \"Approve the design\", 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 : k === \"design\"\n ? \"Drop this design without deciding on it\"\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 type { Thread, ThreadTarget } from \"./store.js\";\nimport type { Presence } from \"./presence.js\";\n\n/** Threads the agent must act on: open, submitted, and the last message is from the reviewer. */\nexport function needsAgent(th: Thread): boolean {\n if (th.status !== \"open\" || !th.submitted) return false;\n const last = th.messages[th.messages.length - 1];\n return !!last && last.role === \"reviewer\";\n}\n\n/**\n * Where the reader's last message in a thread stands. This is the one rule the\n * CLI and the browser both answer from, so the receipt the reader reads and the\n * queue the agent drains cannot disagree.\n *\n * - `held`: written but not submitted; no agent can see it yet.\n * - `queued`: submitted, unanswered, nobody listening. It waits for an agent.\n * - `listening`: submitted, unanswered, an agent is in `thurview wait` now.\n * - `answered`: the agent spoke last.\n * - `closed`: resolved; nobody owes anything.\n */\nexport type Delivery = \"held\" | \"queued\" | \"listening\" | \"answered\" | \"closed\";\n\nexport function deliveryOf(th: Thread, agent: Presence): Delivery {\n if (th.status === \"resolved\") return \"closed\";\n if (!th.submitted) return \"held\";\n if (!needsAgent(th)) return \"answered\";\n return agent.attached ? \"listening\" : \"queued\";\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length > max\n ? `${text.slice(0, max)}... (truncated, ${text.length} chars total)`\n : text;\n}\n\n/**\n * How a thread's target reads to a human. The CLI's listings and the summary\n * note a forge pass carries both name a target from here, so the reader cannot\n * be shown two different words for the same comment.\n */\nexport function targetLabel(t: ThreadTarget): string {\n if (t.type === \"document\") return `document${t.quote ? ` \"${truncate(t.quote, 40)}\"` : \"\"}`;\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 ${t.node}`;\n return \"review\";\n}\n", "import { h, popover } from \"../dom.js\";\nimport { state, threadsFor, navigate, kind, VIEWS } from \"../state.js\";\nimport { codeTable, openAnchorPeek } from \"../code.js\";\nimport { commentPopover, threadPinRow } from \"../threads.js\";\nimport { sequenceDiagram, callstackDiff, databaseLens, flowDiagram } from \"../diagrams.js\";\nimport type { Block, CompiledSecurity } 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 // Only a change crosses a trust boundary, so only a review carries the panel.\n if (kind() === \"review\") root.appendChild(securityPanel(doc.security));\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 SECURITY_BLOCK = \"security\";\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 *\n * On a design the same panel, in the same slot, states what the document\n * PROPOSES to do to those surfaces - declared by the author, not derived, since\n * the code is not written. The words differ everywhere they must, so a proposal\n * can never be misread as something that already happened.\n */\nfunction interfaceDelta(delta: InterfaceDelta | null): HTMLElement {\n const design = kind() === \"design\";\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: design ? \"Comment on what this design proposes\" : \"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\" }, design ? \"What this design proposes\" : \"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\n ? delta.verdict\n : design\n ? \"Unavailable: this revision declared no proposal.\"\n : \"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\n/**\n * Where the change lets input cross a trust boundary, under the interface delta\n * because it is the same kind of fact: what this change did to something the\n * reader cares about, in one sentence, before the prose. A review that crossed\n * none says so here, and one that has not looked says that instead - the panel\n * is never absent, so silence cannot pass for an answer.\n */\nfunction securityPanel(sec: CompiledSecurity | null | undefined): HTMLElement {\n const wrap = h(\"div\", { class: \"block ifd\", \"data-block\": SECURITY_BLOCK });\n const threads = threadsFor((t) => t.type === \"document\" && t.blockId === SECURITY_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 the trust boundaries\",\n onclick: (e: MouseEvent) => {\n if (state.viewingRevision !== null) return;\n popover(commentPopover({ type: \"document\", blockId: SECURITY_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 badge = !sec\n ? null\n : sec.state === \"none\"\n ? h(\"span\", { class: \"badge ok\" }, \"none\")\n : sec.state === \"pending\"\n ? h(\"span\", { class: \"badge warn\" }, \"not assessed\")\n : h(\"span\", { class: \"badge warn\" }, `${sec.crossings.length} crossed`);\n wrap.appendChild(\n h(\n \"div\",\n { class: \"ifd-head\" },\n h(\"span\", { class: \"t\" }, \"Trust boundaries\"),\n badge,\n h(\"span\", { class: \"spacer\" }),\n toggle,\n actions,\n ),\n );\n body.appendChild(\n h(\n \"p\",\n { class: \"ifd-verdict\" },\n sec ? sec.verdict : \"Unavailable: this revision carries no security dimension.\",\n ),\n );\n for (const c of sec?.crossings ?? []) {\n const anchor = state.data?.document?.anchors[c.anchor];\n if (!anchor) continue;\n body.appendChild(\n h(\n \"div\",\n {\n class: \"ifd-entry\",\n title: `Open ${anchor.title}`,\n onclick: () => openAnchorPeek(anchor),\n },\n h(\"div\", { class: \"ifd-what\" }, h(\"div\", { class: \"ifd-cap\" }, c.boundary)),\n h(\n \"span\",\n { class: \"ifd-where mono\" },\n anchor.peek ? `${anchor.peek.file}:${anchor.peek.from}` : anchor.title,\n ),\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 // A design has no Files tab: its entry is a proposal, and what the reader can\n // actually open is the site it names - real code at the pinned commit.\n const anchor = kind() === \"design\" && e.anchor ? state.data?.document?.anchors[e.anchor] : null;\n return h(\n \"div\",\n {\n class: `ifd-entry ifd-${e.change}`,\n title: anchor ? `Open ${anchor.title}` : \"Open in Files\",\n onclick: () =>\n anchor\n ? openAnchorPeek(anchor)\n : 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(\n \"span\",\n { class: \"ifd-where mono\", title: anchor ? \"Where it lands in the code today\" : null },\n `${anchor ? \"at \" : \"\"}${e.file}:${e.line}`,\n ),\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 // Only a review has a Files tab; on the other kinds this would\n // navigate to a tab that does not exist and bounce the reader to\n // the document, so it offers nothing rather than offering that.\n h(\n \"span\",\n VIEWS[kind()].includes(\"files\")\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 : { class: \"path inert\" },\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 case \"flow\":\n wrap.appendChild(flowDiagram(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\";\nimport { boxH, boxW, layoutFlow, type Flow } from \"./flow-layout.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\n/**\n * A user flow, laid out top to bottom in layers by `layoutFlow`. The geometry\n * is computed in the browser rather than at compile time for the same reason\n * `sequence`'s is: the compiler's job is refusing a flow it cannot draw, not\n * deciding where the boxes go.\n */\nexport function flowDiagram(b: Flow, doc: CompiledDocument): HTMLElement {\n // The labels are mono at a known size, so a character budget is enough to\n // keep one inside its box; the whole text stays in the tooltip.\n const fit = (text: string, room: number, px: number) => {\n const max = Math.floor(room / (px * 0.605));\n return text.length > max ? `${text.slice(0, max - 1)}\\u2026` : text;\n };\n const { width, height, at, edges } = layoutFlow(b);\n\n const el = svg(\"svg\", { viewBox: `0 0 ${width} ${height}`, class: \"flow\" });\n el.appendChild(\n svg(\n \"defs\",\n {},\n svg(\n \"marker\",\n {\n id: \"flow-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\n for (const { edge, d, back, label } of edges) {\n const g = svg(\"g\", { class: back ? \"edge back\" : \"edge\" });\n g.appendChild(svg(\"path\", { d, fill: \"none\", \"marker-end\": \"url(#flow-arr)\" }));\n if (edge.case)\n g.appendChild(svg(\"text\", { x: label.x, y: label.y, \"text-anchor\": label.at }, edge.case));\n el.appendChild(g);\n }\n\n for (const s of b.steps) {\n const { x, y, cx } = at(s.id);\n const g = svg(\"g\", {\n class: `step${s.decision ? \" decision\" : \"\"}${s.anchor ? \"\" : \" plain\"}`,\n });\n // A decision is cut at the sides so it reads as one at a glance while still\n // holding a sentence; a diamond wide enough for the text would dwarf the row.\n g.appendChild(\n s.decision\n ? svg(\"path\", {\n d: `M${x + 16},${y} H${x + boxW - 16} L${x + boxW},${y + boxH / 2} L${x + boxW - 16},${y + boxH} H${x + 16} L${x},${y + boxH / 2} Z`,\n })\n : svg(\"rect\", { x, y, width: boxW, height: boxH, rx: 6 }),\n );\n // A decision is cut in at both ends, so it has less room for text than a step.\n const room = boxW - (s.decision ? 44 : 20);\n const actor = s.actor ? (doc.actors[s.actor]?.label ?? s.actor) : null;\n if (actor)\n g.appendChild(\n svg(\n \"text\",\n { class: \"who\", x: cx, y: y + 17, \"text-anchor\": \"middle\" },\n fit(actor, room, 10.5),\n ),\n );\n g.appendChild(\n svg(\n \"text\",\n { x: cx, y: actor ? y + 33 : y + boxH / 2 + 4, \"text-anchor\": \"middle\" },\n fit(s.label, room, 12),\n ),\n );\n g.appendChild(svg(\"title\", {}, s.anchor ? `${s.label} \u2014 ${s.anchor}` : s.label));\n if (s.anchor) {\n // The only way to open code from a flow, so it answers the keyboard as\n // well as the mouse rather than announcing a button nothing can reach.\n const open = () => openAnchor(s.anchor!);\n g.setAttribute(\"role\", \"button\");\n g.setAttribute(\"tabindex\", \"0\");\n g.addEventListener(\"click\", open);\n g.addEventListener(\"keydown\", (e) => {\n const k = (e as KeyboardEvent).key;\n if (k === \"Enter\" || k === \" \") {\n e.preventDefault();\n open();\n }\n });\n }\n el.appendChild(g);\n }\n return h(\"div\", { class: \"diagram\" }, h(\"div\", { class: \"dhead\" }, b.label), el);\n}\n", "// Where a user flow's boxes and arrows go, apart from drawing them, so the\n// geometry can be checked without a browser.\nimport type { Block } from \"../document/compile.js\";\n\nexport type Flow = Extract<Block, { type: \"flow\" }>;\n\nexport interface FlowBox {\n x: number;\n y: number;\n cx: number;\n li: number;\n}\n\nexport interface FlowEdge {\n edge: Flow[\"edges\"][number];\n d: string;\n /** an edge that climbs to an earlier row: a loop, drawn dashed */\n back: boolean;\n label: { x: number; y: number; at: string };\n}\n\nexport const boxW = 210;\nexport const boxH = 46;\nconst gapX = 40;\nconst gapY = 58;\nconst pad = 14;\n// `.diagram svg` stretches to the column, so a narrow viewBox magnifies the\n// type: a two-wide flow would draw its 12px labels at nearer 17. A floor on\n// the viewBox keeps a small flow close to 1:1 and centres it in the frame.\nconst minW = 700;\n\n/**\n * Layers come from a walk forward from the first step, so an edge that points\n * back to a layer already placed - a retry loop, which is what a real journey\n * does - is routed down a lane on the right instead of crossing the boxes.\n */\nexport function layoutFlow(b: Flow): {\n width: number;\n height: number;\n at: (id: string) => FlowBox;\n edges: FlowEdge[];\n} {\n const layer = new Map<string, number>([[b.steps[0]!.id, 0]]);\n const queue = [b.steps[0]!.id];\n while (queue.length) {\n const cur = queue.shift()!;\n for (const e of b.edges)\n if (e.from === cur && !layer.has(e.to)) {\n layer.set(e.to, layer.get(cur)! + 1);\n queue.push(e.to);\n }\n }\n const rows: string[][] = [];\n for (const s of b.steps) {\n const li = layer.get(s.id)!;\n (rows[li] ??= []).push(s.id);\n }\n // One lane per loop, so two retries never share a vertical run. The shorter\n // a loop, the nearer the boxes its lane, so a loop nested in another stays inside it.\n const span = (e: Flow[\"edges\"][number]) => layer.get(e.from)! - layer.get(e.to)!;\n const loops = b.edges.filter((e) => span(e) >= 0).sort((p, q) => span(p) - span(q));\n const lanes = loops.length > 0;\n const widest = Math.max(...rows.map((r) => r.length));\n const laneGap = 18;\n const lane = lanes ? 34 + (loops.length - 1) * laneGap : 0;\n // A lane edge turns in the empty bands above and below a row, so the first\n // and last rows need a band of their own once one exists.\n const band = lanes ? gapY / 2 : 0;\n const width = Math.max(minW, pad * 2 + widest * boxW + (widest - 1) * gapX + lane);\n const height = pad * 2 + band * 2 + rows.length * boxH + (rows.length - 1) * gapY;\n const at = (id: string): FlowBox => {\n const li = layer.get(id)!;\n const row = rows[li]!;\n const spanW = row.length * boxW + (row.length - 1) * gapX;\n const x = pad + (width - lane - pad * 2 - spanW) / 2 + row.indexOf(id) * (boxW + gapX);\n return { x, y: pad + band + li * (boxH + gapY), cx: x + boxW / 2, li };\n };\n\n const edges = b.edges.map((edge): FlowEdge => {\n const from = at(edge.from);\n const to = at(edge.to);\n // Only an edge that climbs is a loop. One inside a row is still forward,\n // and dashing it would tell the reader the journey goes back when it does not.\n const back = to.li < from.li;\n if (to.li > from.li) {\n const mid = from.y + boxH + (to.y - from.y - boxH) / 2;\n return {\n edge,\n back,\n d: `M${from.cx},${from.y + boxH} V${mid} H${to.cx} V${to.y - 4}`,\n label: { x: (from.cx + to.cx) / 2 + 6, y: mid - 5, at: \"middle\" },\n };\n }\n // Out through the band below this row, up the lane, and back in through\n // the band above the target. Every horizontal run is then in empty space,\n // so the edge never crosses a box standing beside either of its ends.\n const laneX = width - lane + 17 + loops.indexOf(edge) * laneGap;\n const out = from.y + boxH + gapY / 2;\n const into = to.y - gapY / 2;\n return {\n edge,\n back,\n d: `M${from.cx},${from.y + boxH} V${out} H${laneX} V${into} H${to.cx} V${to.y - 4}`,\n label: { x: laneX - 6, y: (out + into) / 2, at: \"end\" },\n };\n });\n return { width, height, at, edges };\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 // A design's map is the structure it PROPOSES, with the structure as it stands\n // under `base`, so every mark on it is future tense. The review words - \"where\n // the change landed\", \"what the change touched\" - would state it as done.\n const design = kind() === \"design\";\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, design ? \"No map in this design.\" : \"No map in this review.\"),\n h(\n \"p\",\n null,\n design\n ? \"The map is where a design shows the shape it proposes: the parts it would add, change or remove, beside the structure as it stands. A design that changes one part in place ships without one.\"\n : \"The map places a change inside the system and shows what sits next to it. A change that lands in one place, where the Files tab already answers that, ships without one.\",\n ),\n ),\n ]);\n return;\n }\n // A design without a `base` map states the proposed structure and nothing to\n // compare it against, so no node carries a status. Marking every part as\n // untouched then reads as \"this design changes nothing\", which is the\n // opposite of what the document says - the same reason an explainer imposes\n // no reading order on its parts.\n const unmarked = design && !map.base;\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, design ? \"The shape this design proposes\" : \"Where the change landed\"),\n h(\n \"p\",\n null,\n unmarked\n ? \"These are the parts the design proposes. Nothing is marked added, changed or removed: the document declares no structure as it stands to compare them against.\"\n : design\n ? \"Marked parts are what the design would add, change or remove; the rest is the structure as it stands, which is what it has to fit.\"\n : \"The Files tab has the lines. This has the parts of the system they landed in, and what those parts connect to \u2014 the neighbours a diff never names. Marked parts are the change; 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 : unmarked\n ? null\n : h(\n \"span\",\n { class: \"muted\" },\n design\n ? \"This design changes no part of the map.\"\n : \"This change touched no part of the map.\",\n ),\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 // On a design the paragraph above already says this, so saying it again\n // two lines down is the same sentence twice.\n map.base || unmarked\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 || unmarked || 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 // A design with nothing to compare against is in the same position.\n if (explainer || unmarked) return group(null, kids) ?? h(\"div\", null);\n if (!hot.length)\n return h(\n \"div\",\n null,\n h(\n \"div\",\n { class: \"map-note muted\" },\n design\n ? \"Nothing here changes. The design is elsewhere.\"\n : \"Nothing here was touched. The change is elsewhere.\",\n ),\n group(null, cold),\n );\n return h(\n \"div\",\n null,\n group(\n cold.length ? (design ? \"What the design changes\" : \"What the change touched\") : null,\n hot,\n ),\n group(design ? \"Context \u2014 untouched by the design\" : \"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 : unmarked\n ? \"A link is a dependency the design says the parts would have on each other.\"\n : design\n ? \"A link touching a part the design changes is where the two sides can fall out of step.\"\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 || unmarked\n ? \"Pick a part to see what it owns, the code behind it, and what it connects to.\"\n : design\n ? \"Pick a part to see what the design changes in it, 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", "agent", "m", "side", "m", "bar", "m", "label", "uc", "touched", "view", "side", "l", "r", "side", "intro", "links", "label", "statusClass", "current", "label", "popover", "agent"]
|
|
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\";\nimport type { Presence } from \"../presence.js\";\nimport type { QueueRow } from \"../queue.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 /** whether an agent is listening to this document right now */\n agent: Presence;\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; queue: QueueRow })[]>(\"/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 presence: (id: string) => j<Presence>(`/api/reviews/${id}/presence`),\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\ntype Row = Awaited<ReturnType<typeof api.reviews>>[number];\n\n/**\n * The maintainer's queue. The server sends the rows already in triage order,\n * so a repository is listed where its most urgent row falls, and each row\n * carries only what the forge's own list cannot say.\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, \"Queue\"));\n const active = reviews.filter((r) => !r.dismissed);\n const dismissed = reviews.filter((r) => r.dismissed);\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, an explainer of the codebase, or a design of what to build next.\",\n ),\n );\n const groups = new Map<string, Row[]>();\n for (const r of active) groups.set(r.queue.repo, [...(groups.get(r.queue.repo) ?? []), r]);\n for (const [repo, rows] of groups) {\n const yours = rows.filter((r) => r.queue.turn === \"you\").length;\n el.appendChild(\n h(\n \"h3\",\n { class: \"repo\" },\n repo,\n yours ? h(\"span\", { class: \"badge accent\" }, `${yours} your turn`) : null,\n ),\n );\n rows.forEach((r) => el.appendChild(queueItem(r)));\n }\n if (dismissed.length) {\n el.appendChild(h(\"h3\", { class: \"muted\" }, \"Dismissed\"));\n dismissed.forEach((r) => el.appendChild(queueItem(r)));\n }\n app.appendChild(el);\n}\n\nconst TURN = { you: \"your turn\", agent: \"agent\", nobody: \"nobody\" } as const;\nconst DECISION = { approve: \"approved\", \"request-changes\": \"changes requested\", close: \"closed\" };\n\nfunction queueItem(r: Row) {\n const q = r.queue;\n const cr = q.change;\n const age = q.factsAt ? `forge read ${timeAgo(q.factsAt)}` : cr ? \"forge not read yet\" : \"\";\n return h(\n \"div\",\n { class: \"item\", onclick: () => (location.href = `/review/${r.id}`) },\n h(\"span\", { class: `badge turn ${q.turn === \"you\" ? \"accent\" : \"\"}` }, TURN[q.turn]),\n h(\n \"span\",\n { class: \"t\" },\n r.title,\n h(\"span\", { class: \"why\" }, [r.kind ?? \"review\", q.why, age].filter(Boolean).join(\" \u00B7 \")),\n ),\n cr\n ? h(\n \"a\",\n {\n class: \"mono muted cr\",\n href: cr.url ?? undefined,\n target: \"_blank\",\n rel: \"noopener\",\n onclick: (e: Event) => e.stopPropagation(),\n },\n `#${cr.number}${cr.state && cr.state !== \"open\" ? ` ${cr.state}` : \"\"}`,\n )\n : h(\"span\", { class: \"mono muted\" }, bindingLabel(r)),\n r.openThreads ? h(\"span\", { class: \"badge accent\" }, `${r.openThreads} open`) : null,\n q.pin\n ? h(\n \"span\",\n { class: `badge ${q.pin === \"behind\" ? \"warn\" : \"ok\"}` },\n q.pin === \"behind\" ? \"pin behind head\" : \"at head\",\n )\n : null,\n q.decision\n ? h(\n \"span\",\n {\n class: `badge ${q.decision.posted === false ? \"warn\" : \"\"}`,\n title:\n q.decision.posted === null\n ? null\n : q.decision.posted\n ? \"posted to the change request\"\n : \"not posted to the change request yet\",\n },\n DECISION[q.decision.decision] +\n (q.decision.posted === null ? \"\" : q.decision.posted ? \" \u00B7 posted\" : \" \u00B7 not posted\"),\n )\n : null,\n q.ci\n ? h(\n \"span\",\n { class: `badge ${q.ci.trustworthy ? \"ok\" : \"warn\"}`, title: q.ci.verdict },\n q.ci.trustworthy ? \"CI gates\" : \"CI not a gate\",\n )\n : null,\n h(\"span\", { class: \"muted\", style: { fontSize: \"12px\" } }, timeAgo(r.updatedAt)),\n );\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 k = kind();\n const labels: Record<View, string> = {\n review: k === \"explainer\" ? \"Explainer\" : k === \"design\" ? \"Design\" : \"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() === \"review\"\n ? `base ${r.pins.base.slice(0, 12)} \u00B7 head ${r.pins.head.slice(0, 12)}`\n : `commit ${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 pollPresence(): void {\n setInterval(async () => {\n const cur = state.data;\n if (!cur) return;\n const agent = await api.presence(state.id).catch(() => cur.agent);\n if (agent.attached !== cur.agent.attached) {\n state.data = { ...cur, agent };\n emit(\"threads\");\n }\n }, 5000);\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 pollPresence();\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. A design is a change that is NOT WRITTEN YET:\n * there is no diff to show and no coverage to state, so it keeps the document\n * and the map, where its proposed structure sits beside today's.\n */\nexport const VIEWS: Record<DocumentKind, View[]> = {\n review: [\"review\", \"commits\", \"files\", \"map\"],\n explainer: [\"review\", \"map\", \"coverage\"],\n design: [\"review\", \"map\"],\n};\n\nexport function kind(): DocumentKind {\n const k = state.data?.review.kind;\n return k === \"explainer\" || k === \"design\" ? k : \"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, kind, VIEWS } 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 // Only a review has a Files tab. On the other kinds `navigate(\"files\", \u2026)`\n // lands on a tab that does not exist and the reader is bounced to the\n // document, so the control that promises it is not drawn at all.\n const hasFiles = VIEWS[kind()].includes(\"files\");\n const openFile = () =>\n navigate(\"files\", { path: p.path, line: p.highlightLine ?? p.from, side: p.graph });\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${hasFiles ? \"\" : \" inert\"}`,\n title: p.path,\n ...(hasFiles ? { onclick: openFile } : {}),\n },\n `${p.path}:${p.from}-${p.to}`,\n \" \",\n h(\"span\", { class: `badge ${p.graph === \"base\" ? \"del\" : \"\"}` }, p.graph),\n ),\n ),\n hasFiles\n ? h(\n \"button\",\n { class: \"small\", onclick: openFile },\n inChanges ? \"Open in Files\" : \"Open file\",\n )\n : null,\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\";\nimport type { Presence } from \"../presence.js\";\nimport { deliveryOf, type Delivery } from \"../thread-state.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// Spelled out rather than imported from presence.js, which reads the store and\n// belongs to the server side of the bundle.\nconst NOBODY: Presence = { attached: false, lastSeen: null };\n\nfunction agent(): Presence {\n return state.data?.agent ?? NOBODY;\n}\n\n/**\n * What each thread state means to the reader, in the reader's terms. Silence is\n * the failure this wording exists to prevent: a question nobody is listening to\n * says so, before it is asked and after it is sent.\n */\nconst RECEIPT: Record<Delivery, string> = {\n held: \"Held. It reaches the agent when you submit.\",\n queued:\n \"Queued. Nobody is listening right now \u2014 it is delivered the next time an agent checks this document.\",\n listening: \"Delivered. An agent is listening and answers here.\",\n answered: \"The agent answered. Reply, or resolve it.\",\n closed: \"Resolved. Writing here reopens it.\",\n};\n\n/** The one line that says whether asking now would reach anybody. */\nfunction listeningLine(): string {\n return agent().attached\n ? \"An agent is listening to this document now.\"\n : \"No agent is listening right now. Anything you send is queued until one checks in.\";\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 const k = kind();\n const held =\n k === \"explainer\"\n ? \"Add to my notes\"\n : k === \"design\"\n ? \"Add to my decision\"\n : \"Add to the review\";\n // One click, one consequence. The old control asked the reader to set a mode\n // and then press \"Save\", and a question saved in the wrong mode reached\n // nobody; each button here both chooses and commits, and says which it is.\n const submit = async (mode: \"ask\" | \"review\") => {\n const body = ta.value.trim();\n if (!body) return;\n const th = 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 // The receipt: the thread panel opens on what was just written, and its\n // card carries the delivery line for the state the server actually recorded.\n focusThread(th.id);\n };\n ta.addEventListener(\"keydown\", (e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") void submit(\"ask\");\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 h(\n \"div\",\n { class: \"row\" },\n h(\n \"button\",\n { class: \"small ok\", onclick: () => void submit(\"ask\") },\n \"Send to the agent \",\n h(\"kbd\", null, \"\u2318\u21B5\"),\n ),\n h(\"button\", { class: \"small\", onclick: () => void submit(\"review\") }, held),\n h(\"span\", { style: { flex: \"1\" } }),\n h(\"button\", { class: \"small ghost\", onclick: () => closePopover() }, \"Cancel\"),\n ),\n h(\n \"div\",\n { class: \"muted\", style: { fontSize: \"12px\", marginTop: \"6px\" } },\n h(\"div\", null, `Send to the agent \u2014 ${listeningLine()}`),\n h(\n \"div\",\n null,\n `${held} \u2014 held until you ${\n k === \"explainer\"\n ? \"send the document back or finish\"\n : k === \"design\"\n ? \"approve the design or send it back\"\n : \"submit the review\"\n }.`,\n ),\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 // Who, if anyone, is on the other end. Stated once here so the reader knows\n // before they write, not only after they have waited. A finished review or\n // an older revision takes no new writing, so it says nothing.\n if (!readOnly())\n body.appendChild(\n h(\n \"div\",\n { class: `receipt ${agent().attached ? \"listening\" : \"queued\"}` },\n listeningLine(),\n ),\n );\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 delivery = deliveryOf(t, agent());\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 h(\"div\", { class: `receipt ${delivery}` }, RECEIPT[delivery]),\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 // An unanswered question is not resolved, it is abandoned.\n // Saying so is what stops a reader closing their own\n // question and then waiting for an answer to it.\n title:\n delivery === \"answered\"\n ? \"Nothing more is owed here\"\n : \"Stop waiting for an answer; no agent will pick this up\",\n onclick: async () => {\n await api.resolve(state.id, t.id);\n await reload();\n },\n },\n delivery === \"answered\" || delivery === \"held\" ? \"Resolve\" : \"Withdraw\",\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. A\n // reader of a design decides whether it should be BUILT, which is a verdict,\n // but on a plan rather than on code - so it says which.\n const k = kind();\n const explainer = k === \"explainer\";\n const words =\n k === \"explainer\"\n ? { title: \"Send this back or finish\", accept: \"Done reading\", back: \"Send it back\" }\n : k === \"design\"\n ? { title: \"Decide on this design\", accept: \"Approve the design\", 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 : k === \"design\"\n ? \"Drop this design without deciding on it\"\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 type { Thread, ThreadTarget } from \"./store.js\";\nimport type { Presence } from \"./presence.js\";\n\n/** Threads the agent must act on: open, submitted, and the last message is from the reviewer. */\nexport function needsAgent(th: Thread): boolean {\n if (th.status !== \"open\" || !th.submitted) return false;\n const last = th.messages[th.messages.length - 1];\n return !!last && last.role === \"reviewer\";\n}\n\n/**\n * Where the reader's last message in a thread stands. This is the one rule the\n * CLI and the browser both answer from, so the receipt the reader reads and the\n * queue the agent drains cannot disagree.\n *\n * - `held`: written but not submitted; no agent can see it yet.\n * - `queued`: submitted, unanswered, nobody listening. It waits for an agent.\n * - `listening`: submitted, unanswered, an agent is in `thurview wait` now.\n * - `answered`: the agent spoke last.\n * - `closed`: resolved; nobody owes anything.\n */\nexport type Delivery = \"held\" | \"queued\" | \"listening\" | \"answered\" | \"closed\";\n\nexport function deliveryOf(th: Thread, agent: Presence): Delivery {\n if (th.status === \"resolved\") return \"closed\";\n if (!th.submitted) return \"held\";\n if (!needsAgent(th)) return \"answered\";\n return agent.attached ? \"listening\" : \"queued\";\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length > max\n ? `${text.slice(0, max)}... (truncated, ${text.length} chars total)`\n : text;\n}\n\n/**\n * How a thread's target reads to a human. The CLI's listings and the summary\n * note a forge pass carries both name a target from here, so the reader cannot\n * be shown two different words for the same comment.\n */\nexport function targetLabel(t: ThreadTarget): string {\n if (t.type === \"document\") return `document${t.quote ? ` \"${truncate(t.quote, 40)}\"` : \"\"}`;\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 ${t.node}`;\n return \"review\";\n}\n", "import { h, popover } from \"../dom.js\";\nimport { state, threadsFor, navigate, kind, VIEWS } from \"../state.js\";\nimport { codeTable, openAnchorPeek } from \"../code.js\";\nimport { commentPopover, threadPinRow } from \"../threads.js\";\nimport { sequenceDiagram, callstackDiff, databaseLens, flowDiagram } from \"../diagrams.js\";\nimport type { Block, CompiledSecurity } 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 // Only a change crosses a trust boundary, so only a review carries the panel.\n if (kind() === \"review\") root.appendChild(securityPanel(doc.security));\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 SECURITY_BLOCK = \"security\";\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 *\n * On a design the same panel, in the same slot, states what the document\n * PROPOSES to do to those surfaces - declared by the author, not derived, since\n * the code is not written. The words differ everywhere they must, so a proposal\n * can never be misread as something that already happened.\n */\nfunction interfaceDelta(delta: InterfaceDelta | null): HTMLElement {\n const design = kind() === \"design\";\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: design ? \"Comment on what this design proposes\" : \"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\" }, design ? \"What this design proposes\" : \"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\n ? delta.verdict\n : design\n ? \"Unavailable: this revision declared no proposal.\"\n : \"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\n/**\n * Where the change lets input cross a trust boundary, under the interface delta\n * because it is the same kind of fact: what this change did to something the\n * reader cares about, in one sentence, before the prose. A review that crossed\n * none says so here, and one that has not looked says that instead - the panel\n * is never absent, so silence cannot pass for an answer.\n */\nfunction securityPanel(sec: CompiledSecurity | null | undefined): HTMLElement {\n const wrap = h(\"div\", { class: \"block ifd\", \"data-block\": SECURITY_BLOCK });\n const threads = threadsFor((t) => t.type === \"document\" && t.blockId === SECURITY_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 the trust boundaries\",\n onclick: (e: MouseEvent) => {\n if (state.viewingRevision !== null) return;\n popover(commentPopover({ type: \"document\", blockId: SECURITY_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 badge = !sec\n ? null\n : sec.state === \"none\"\n ? h(\"span\", { class: \"badge ok\" }, \"none\")\n : sec.state === \"pending\"\n ? h(\"span\", { class: \"badge warn\" }, \"not assessed\")\n : h(\"span\", { class: \"badge warn\" }, `${sec.crossings.length} crossed`);\n wrap.appendChild(\n h(\n \"div\",\n { class: \"ifd-head\" },\n h(\"span\", { class: \"t\" }, \"Trust boundaries\"),\n badge,\n h(\"span\", { class: \"spacer\" }),\n toggle,\n actions,\n ),\n );\n body.appendChild(\n h(\n \"p\",\n { class: \"ifd-verdict\" },\n sec ? sec.verdict : \"Unavailable: this revision carries no security dimension.\",\n ),\n );\n for (const c of sec?.crossings ?? []) {\n const anchor = state.data?.document?.anchors[c.anchor];\n if (!anchor) continue;\n body.appendChild(\n h(\n \"div\",\n {\n class: \"ifd-entry\",\n title: `Open ${anchor.title}`,\n onclick: () => openAnchorPeek(anchor),\n },\n h(\"div\", { class: \"ifd-what\" }, h(\"div\", { class: \"ifd-cap\" }, c.boundary)),\n h(\n \"span\",\n { class: \"ifd-where mono\" },\n anchor.peek ? `${anchor.peek.file}:${anchor.peek.from}` : anchor.title,\n ),\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 // A design has no Files tab: its entry is a proposal, and what the reader can\n // actually open is the site it names - real code at the pinned commit.\n const anchor = kind() === \"design\" && e.anchor ? state.data?.document?.anchors[e.anchor] : null;\n return h(\n \"div\",\n {\n class: `ifd-entry ifd-${e.change}`,\n title: anchor ? `Open ${anchor.title}` : \"Open in Files\",\n onclick: () =>\n anchor\n ? openAnchorPeek(anchor)\n : 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(\n \"span\",\n { class: \"ifd-where mono\", title: anchor ? \"Where it lands in the code today\" : null },\n `${anchor ? \"at \" : \"\"}${e.file}:${e.line}`,\n ),\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 // Only a review has a Files tab; on the other kinds this would\n // navigate to a tab that does not exist and bounce the reader to\n // the document, so it offers nothing rather than offering that.\n h(\n \"span\",\n VIEWS[kind()].includes(\"files\")\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 : { class: \"path inert\" },\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 case \"flow\":\n wrap.appendChild(flowDiagram(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\";\nimport { boxH, boxW, layoutFlow, type Flow } from \"./flow-layout.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 // Labels are mono at a known size, so their width is a character count. A\n // long actor name or message wraps rather than widening the drawing past\n // the column; every box and column then grows to hold what it wraps to.\n const charW = 12 * 0.605;\n const lineH = 15;\n const wrap = (text: string, room: number) => {\n const max = Math.max(8, Math.floor(room / charW));\n const lines: string[] = [];\n for (const word of text.split(\" \")) {\n const last = lines.length - 1;\n if (last >= 0 && lines[last]!.length + 1 + word.length <= max) lines[last] += ` ${word}`;\n else lines.push(word);\n }\n return lines;\n };\n const widest = (lines: string[]) => Math.max(...lines.map((l) => l.length)) * charW;\n const names = b.actors.map((a) => wrap(a.label, 20 * charW));\n const nameLines = Math.max(...names.map((l) => l.length));\n const boxH = 13 + nameLines * lineH;\n const top = 6 + boxH + 10;\n const boxes = names.map((l) => Math.max(120, widest(l) + 20));\n const cols = boxes.map((w) => Math.max(150, w + 16));\n const centres = cols.map((w, i) => cols.slice(0, i).reduce((s, c) => s + c, 0) + w / 2);\n const x = (id: string) => centres[b.actors.findIndex((a) => a.id === id)]!;\n // A label starts just past the arrow's left end, wraps to the arrow's span,\n // and stacks upwards from it, so it never hangs off the lifeline it leaves.\n let y = top;\n const rows = b.messages.map((m, i) => {\n const x1 = x(m.from);\n const x2 = x(m.to);\n const self = x1 === x2;\n const start = self ? x1 + 36 : Math.min(x1, x2) + 8;\n const lines = wrap(`${i + 1}. ${m.label}`, Math.max(180, Math.abs(x2 - x1) - 16));\n y += 20 + lines.length * lineH;\n return { x1, x2, self, start, lines, y, end: start + widest(lines) };\n });\n const width = Math.ceil(\n Math.max(\n 320,\n cols.reduce((s, c) => s + c, 0),\n ...rows.map((r) => r.end + 12),\n ),\n );\n const height = y + 24;\n // Drawn at its own size, and shrunk only as far as keeps the text readable;\n // a narrower column scrolls the frame rather than the text going to specks.\n const el = svg(\"svg\", { viewBox: `0 0 ${width} ${height}`, class: \"seq\" });\n el.style.maxWidth = `${width}px`;\n el.style.minWidth = `${Math.ceil(width * 0.9)}px`;\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 // One tspan per wrapped line, the last on `baseline` and the rest above it.\n const tspans = (at: number, baseline: number, text: string[]) =>\n text.map((l, i) => svg(\"tspan\", { x: at, y: baseline - (text.length - 1 - i) * lineH }, l));\n b.actors.forEach((_, i) => {\n const cx = centres[i]!;\n const w = boxes[i]!;\n const name = names[i]!;\n const g = svg(\"g\", { class: \"actor\" });\n g.appendChild(svg(\"rect\", { x: cx - w / 2, y: 6, width: w, height: boxH, rx: 6 }));\n // Centred in the box however many lines this name wrapped to.\n const baseline = 6 + (boxH + name.length * lineH) / 2 - 4;\n g.appendChild(svg(\"text\", { \"text-anchor\": \"middle\" }, ...tspans(cx, baseline, name)));\n g.appendChild(svg(\"line\", { class: \"life\", x1: cx, y1: 6 + boxH, x2: cx, y2: height - 6 }));\n el.appendChild(g);\n });\n b.messages.forEach((m, i) => {\n const { x1, x2, self, start, y } = rows[i]!;\n const g = svg(\"g\", { class: \"msg\" });\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(\"text\", {}, ...tspans(start, y - 6, rows[i]!.lines));\n const open = (at: { x: number; y: number }) => {\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 at,\n );\n };\n label.addEventListener(\"click\", (e) => open({ x: e.pageX, y: e.pageY + 8 }));\n // Opening code is what a message is for, so it answers the keyboard too.\n label.setAttribute(\"role\", \"button\");\n label.setAttribute(\"tabindex\", \"0\");\n label.addEventListener(\"keydown\", (e) => {\n const k = (e as KeyboardEvent).key;\n if (k !== \"Enter\" && k !== \" \") return;\n e.preventDefault();\n const r = label.getBoundingClientRect();\n open({ x: r.left + window.scrollX, y: r.bottom + window.scrollY + 8 });\n });\n g.appendChild(label);\n el.appendChild(g);\n });\n return h(\n \"div\",\n { class: \"diagram\" },\n h(\"div\", { class: \"dhead\" }, b.label),\n h(\"div\", { class: \"seq-scroll\" }, el),\n );\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\n/**\n * A user flow, laid out top to bottom in layers by `layoutFlow`. The geometry\n * is computed in the browser rather than at compile time for the same reason\n * `sequence`'s is: the compiler's job is refusing a flow it cannot draw, not\n * deciding where the boxes go.\n */\nexport function flowDiagram(b: Flow, doc: CompiledDocument): HTMLElement {\n // The labels are mono at a known size, so a character budget is enough to\n // keep one inside its box; the whole text stays in the tooltip.\n const fit = (text: string, room: number, px: number) => {\n const max = Math.floor(room / (px * 0.605));\n return text.length > max ? `${text.slice(0, max - 1)}\\u2026` : text;\n };\n const { width, height, at, edges } = layoutFlow(b);\n\n const el = svg(\"svg\", { viewBox: `0 0 ${width} ${height}`, class: \"flow\" });\n el.appendChild(\n svg(\n \"defs\",\n {},\n svg(\n \"marker\",\n {\n id: \"flow-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\n for (const { edge, d, back, label } of edges) {\n const g = svg(\"g\", { class: back ? \"edge back\" : \"edge\" });\n g.appendChild(svg(\"path\", { d, fill: \"none\", \"marker-end\": \"url(#flow-arr)\" }));\n if (edge.case)\n g.appendChild(svg(\"text\", { x: label.x, y: label.y, \"text-anchor\": label.at }, edge.case));\n el.appendChild(g);\n }\n\n for (const s of b.steps) {\n const { x, y, cx } = at(s.id);\n const g = svg(\"g\", {\n class: `step${s.decision ? \" decision\" : \"\"}${s.anchor ? \"\" : \" plain\"}`,\n });\n // A decision is cut at the sides so it reads as one at a glance while still\n // holding a sentence; a diamond wide enough for the text would dwarf the row.\n g.appendChild(\n s.decision\n ? svg(\"path\", {\n d: `M${x + 16},${y} H${x + boxW - 16} L${x + boxW},${y + boxH / 2} L${x + boxW - 16},${y + boxH} H${x + 16} L${x},${y + boxH / 2} Z`,\n })\n : svg(\"rect\", { x, y, width: boxW, height: boxH, rx: 6 }),\n );\n // A decision is cut in at both ends, so it has less room for text than a step.\n const room = boxW - (s.decision ? 44 : 20);\n const actor = s.actor ? (doc.actors[s.actor]?.label ?? s.actor) : null;\n if (actor)\n g.appendChild(\n svg(\n \"text\",\n { class: \"who\", x: cx, y: y + 17, \"text-anchor\": \"middle\" },\n fit(actor, room, 10.5),\n ),\n );\n g.appendChild(\n svg(\n \"text\",\n { x: cx, y: actor ? y + 33 : y + boxH / 2 + 4, \"text-anchor\": \"middle\" },\n fit(s.label, room, 12),\n ),\n );\n g.appendChild(svg(\"title\", {}, s.anchor ? `${s.label} \u2014 ${s.anchor}` : s.label));\n if (s.anchor) {\n // The only way to open code from a flow, so it answers the keyboard as\n // well as the mouse rather than announcing a button nothing can reach.\n const open = () => openAnchor(s.anchor!);\n g.setAttribute(\"role\", \"button\");\n g.setAttribute(\"tabindex\", \"0\");\n g.addEventListener(\"click\", open);\n g.addEventListener(\"keydown\", (e) => {\n const k = (e as KeyboardEvent).key;\n if (k === \"Enter\" || k === \" \") {\n e.preventDefault();\n open();\n }\n });\n }\n el.appendChild(g);\n }\n return h(\"div\", { class: \"diagram\" }, h(\"div\", { class: \"dhead\" }, b.label), el);\n}\n", "// Where a user flow's boxes and arrows go, apart from drawing them, so the\n// geometry can be checked without a browser.\nimport type { Block } from \"../document/compile.js\";\n\nexport type Flow = Extract<Block, { type: \"flow\" }>;\n\nexport interface FlowBox {\n x: number;\n y: number;\n cx: number;\n li: number;\n}\n\nexport interface FlowEdge {\n edge: Flow[\"edges\"][number];\n d: string;\n /** an edge that climbs to an earlier row: a loop, drawn dashed */\n back: boolean;\n label: { x: number; y: number; at: string };\n}\n\nexport const boxW = 210;\nexport const boxH = 46;\nconst gapX = 40;\nconst gapY = 58;\nconst pad = 14;\n// `.diagram svg` stretches to the column, so a narrow viewBox magnifies the\n// type: a two-wide flow would draw its 12px labels at nearer 17. A floor on\n// the viewBox keeps a small flow close to 1:1 and centres it in the frame.\nconst minW = 700;\n\n/**\n * Layers come from a walk forward from the first step, so an edge that points\n * back to a layer already placed - a retry loop, which is what a real journey\n * does - is routed down a lane on the right instead of crossing the boxes.\n */\nexport function layoutFlow(b: Flow): {\n width: number;\n height: number;\n at: (id: string) => FlowBox;\n edges: FlowEdge[];\n} {\n const layer = new Map<string, number>([[b.steps[0]!.id, 0]]);\n const queue = [b.steps[0]!.id];\n while (queue.length) {\n const cur = queue.shift()!;\n for (const e of b.edges)\n if (e.from === cur && !layer.has(e.to)) {\n layer.set(e.to, layer.get(cur)! + 1);\n queue.push(e.to);\n }\n }\n const rows: string[][] = [];\n for (const s of b.steps) {\n const li = layer.get(s.id)!;\n (rows[li] ??= []).push(s.id);\n }\n // One lane per loop, so two retries never share a vertical run. The shorter\n // a loop, the nearer the boxes its lane, so a loop nested in another stays inside it.\n const span = (e: Flow[\"edges\"][number]) => layer.get(e.from)! - layer.get(e.to)!;\n const loops = b.edges.filter((e) => span(e) >= 0).sort((p, q) => span(p) - span(q));\n const lanes = loops.length > 0;\n const widest = Math.max(...rows.map((r) => r.length));\n const laneGap = 18;\n const lane = lanes ? 34 + (loops.length - 1) * laneGap : 0;\n // A lane edge turns in the empty bands above and below a row, so the first\n // and last rows need a band of their own once one exists.\n const band = lanes ? gapY / 2 : 0;\n const width = Math.max(minW, pad * 2 + widest * boxW + (widest - 1) * gapX + lane);\n const height = pad * 2 + band * 2 + rows.length * boxH + (rows.length - 1) * gapY;\n const at = (id: string): FlowBox => {\n const li = layer.get(id)!;\n const row = rows[li]!;\n const spanW = row.length * boxW + (row.length - 1) * gapX;\n const x = pad + (width - lane - pad * 2 - spanW) / 2 + row.indexOf(id) * (boxW + gapX);\n return { x, y: pad + band + li * (boxH + gapY), cx: x + boxW / 2, li };\n };\n\n const edges = b.edges.map((edge): FlowEdge => {\n const from = at(edge.from);\n const to = at(edge.to);\n // Only an edge that climbs is a loop. One inside a row is still forward,\n // and dashing it would tell the reader the journey goes back when it does not.\n const back = to.li < from.li;\n if (to.li > from.li) {\n const mid = from.y + boxH + (to.y - from.y - boxH) / 2;\n return {\n edge,\n back,\n d: `M${from.cx},${from.y + boxH} V${mid} H${to.cx} V${to.y - 4}`,\n label: { x: (from.cx + to.cx) / 2 + 6, y: mid - 5, at: \"middle\" },\n };\n }\n // Out through the band below this row, up the lane, and back in through\n // the band above the target. Every horizontal run is then in empty space,\n // so the edge never crosses a box standing beside either of its ends.\n const laneX = width - lane + 17 + loops.indexOf(edge) * laneGap;\n const out = from.y + boxH + gapY / 2;\n const into = to.y - gapY / 2;\n return {\n edge,\n back,\n d: `M${from.cx},${from.y + boxH} V${out} H${laneX} V${into} H${to.cx} V${to.y - 4}`,\n label: { x: laneX - 6, y: (out + into) / 2, at: \"end\" },\n };\n });\n return { width, height, at, edges };\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 // A design's map is the structure it PROPOSES, with the structure as it stands\n // under `base`, so every mark on it is future tense. The review words - \"where\n // the change landed\", \"what the change touched\" - would state it as done.\n const design = kind() === \"design\";\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, design ? \"No map in this design.\" : \"No map in this review.\"),\n h(\n \"p\",\n null,\n design\n ? \"The map is where a design shows the shape it proposes: the parts it would add, change or remove, beside the structure as it stands. A design that changes one part in place ships without one.\"\n : \"The map places a change inside the system and shows what sits next to it. A change that lands in one place, where the Files tab already answers that, ships without one.\",\n ),\n ),\n ]);\n return;\n }\n // A design without a `base` map states the proposed structure and nothing to\n // compare it against, so no node carries a status. Marking every part as\n // untouched then reads as \"this design changes nothing\", which is the\n // opposite of what the document says - the same reason an explainer imposes\n // no reading order on its parts.\n const unmarked = design && !map.base;\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, design ? \"The shape this design proposes\" : \"Where the change landed\"),\n h(\n \"p\",\n null,\n unmarked\n ? \"These are the parts the design proposes. Nothing is marked added, changed or removed: the document declares no structure as it stands to compare them against.\"\n : design\n ? \"Marked parts are what the design would add, change or remove; the rest is the structure as it stands, which is what it has to fit.\"\n : \"The Files tab has the lines. This has the parts of the system they landed in, and what those parts connect to \u2014 the neighbours a diff never names. Marked parts are the change; 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 : unmarked\n ? null\n : h(\n \"span\",\n { class: \"muted\" },\n design\n ? \"This design changes no part of the map.\"\n : \"This change touched no part of the map.\",\n ),\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 // On a design the paragraph above already says this, so saying it again\n // two lines down is the same sentence twice.\n map.base || unmarked\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 || unmarked || 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 // A design with nothing to compare against is in the same position.\n if (explainer || unmarked) return group(null, kids) ?? h(\"div\", null);\n if (!hot.length)\n return h(\n \"div\",\n null,\n h(\n \"div\",\n { class: \"map-note muted\" },\n design\n ? \"Nothing here changes. The design is elsewhere.\"\n : \"Nothing here was touched. The change is elsewhere.\",\n ),\n group(null, cold),\n );\n return h(\n \"div\",\n null,\n group(\n cold.length ? (design ? \"What the design changes\" : \"What the change touched\") : null,\n hot,\n ),\n group(design ? \"Context \u2014 untouched by the design\" : \"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 : unmarked\n ? \"A link is a dependency the design says the parts would have on each other.\"\n : design\n ? \"A link touching a part the design changes is where the two sides can fall out of step.\"\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 || unmarked\n ? \"Pick a part to see what it owns, the code behind it, and what it connects to.\"\n : design\n ? \"Pick a part to see what the design changes in it, 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", "agent", "m", "side", "m", "bar", "boxH", "m", "y", "label", "uc", "touched", "view", "side", "l", "r", "side", "intro", "links", "label", "statusClass", "current", "label", "popover", "agent"]
|
|
7
7
|
}
|